5 Commits

18 changed files with 318 additions and 57 deletions

View File

@@ -1,7 +1,12 @@
<script>
import useUserStore from '@/jtools/store/user'
export default {
onLaunch: function () {
console.log('App Launch')
useUserStore().queryVipList()
if(useUserStore().isLogin) {
useUserStore().getUserInfo()
useUserStore().searchUserVip()
}
},
onShow: function () {
console.log('App Show')

View File

@@ -23,4 +23,11 @@ export function logout() {
url: 'driver-api/tdSysUser/loginOut',
method: 'get',
});
}
export function getInfo() {
return request({
url: 'driver-api/tdSysUser/info',
method: 'get',
});
}

View File

@@ -6,4 +6,12 @@ export function queryVip(data) {
method: 'POST',
data,
});
}
export function getVipList(data) {
return request({
url: 'driver-api/tdMember/queryMember',
method: 'POST',
data,
});
}

View File

@@ -16,7 +16,7 @@ function service(options = {}) {
});
} else {
options.header = {
Authorization: `Bearer ${token}`
Authorization: `${token}`
};
}
}
@@ -34,7 +34,7 @@ function service(options = {}) {
resolved(res.data);
} else if(res.data.code != '0000') {
uni.showToast({
title: resp.message,
title: res.data.message,
icon: 'none'
})
resolved(res.data)

View File

@@ -1,5 +1,6 @@
import { defineStore } from 'pinia';
import { login,logout } from '@/jtools/api/login';
import { login,logout,getInfo } from '@/jtools/api/login';
import { queryVip,getVipList } from '@/jtools/api/vip'
import constants from '@/jtools/constants';
import storage from '@/jtools/storage';
@@ -9,11 +10,13 @@ const useUserStore = defineStore({
token: storage.get('token'),
isLogin: storage.get('isLogin'), // 是否登陆
userInfo: storage.get('userInfo'), // 用户信息
currentCartype: storage.get('carType') || '1001',
vipOnList: [],
vipAllList: []
}),
actions: {
login(params) {
// commit('isLogin', true);
return new Promise(async (resolve, reject) => {
const resp = await login(params);
if (resp.code === '0000') {
@@ -40,13 +43,39 @@ const useUserStore = defineStore({
resolve();
})
},
// 获取用户信息
getUserInfo() {
getInfo().then(resp => {
if(resp.code == '0000') {
this.userInfo = resp.data
storage.set('userInfo', resp.data)
}
})
},
resetUserData() {
this.isLogin = false;
this.token = '';
this.userInfo = {}
this.vipOnList = []
storage.remove('isLogin')
storage.remove('token')
storage.remove('userInfo')
},
// 查询当前用户的vip开通情况
searchUserVip() {
queryVip({ carTypeId: this.currentCartype,memberId: null, subject:'' }).then(resp => {
if(resp.code == '0000') {
this.vipOnList = resp.data
}
})
},
// 查询所有的vip
queryVipList() {
getVipList({ carTypeId: this.currentCartype,memberId: null, subject:'' }).then(resp => {
if(resp.code == '0000') {
this.vipAllList = resp.data
}
})
}
},
});

View File

@@ -110,7 +110,21 @@
"navigationBarTitleText": "登录",
"enablePullDownRefresh": false
}
}
},
{
"path": "pages/index/iconSkill",
"style": {
"navigationBarTitleText": "图标技巧",
"enablePullDownRefresh": false
}
},
{
"path": "pages/questionBank/chapterExercise",
"style": {
"navigationBarTitleText": "章节练习",
"enablePullDownRefresh": false
}
}
],
"globalStyle": {

View File

@@ -0,0 +1,18 @@
<template>
<view>
<web-view :src="webviewPath"></web-view>
</view>
</template>
<script>
export default {
data() {
return{
webviewPath:'https://jtbz.ahduima.com/index'
}
}
}
</script>
<style>
</style>

View File

@@ -104,6 +104,7 @@
width: 218rpx;
border-radius: 0 0 16rpx 12rpx;
background-color: #FF6E02;
color:#fff
}
.tag{
width: 122rpx;

View File

@@ -57,19 +57,19 @@
getCode({
phone: this.login.phone
}).then(resp => {
if (resp.code == '0000') {
// if (resp.code == '0000') {
uni.showToast({
title: '发送成功!',
icon: 'none'
})
this.countDown = 60
this.js = setInterval(() => {
this.countDown;
this.countDown--;
if (this.countDown == 0) {
this.clear()
}
}, 1000)
}
// }
})
}
},

View File

@@ -8,7 +8,7 @@
<view class="ml12">
<view class="flex ai-c fs18 cor-333 fwb">
<text class="mr10">{{ user.userName }}{{user.userId}}</text>
<image 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 class="mt5 fs14 cor-666">陪您学车 {{ user.count }}</view>
</view>
@@ -26,47 +26,52 @@
<view class="p15lr" style="transform: translateY(-90px);">
<view class="relative mb10" @tap="handleVip">
<image src="/static/image/mine/vip_bg.png" mode="widthFix" style="width: 100%;"></image>
<view class="absolute p15lr p10tb flex ai-c jc-sb" style="left: 0;top: 0;right: 0;height: 40px;">
<view class="absolute p15lr p10tb flex ai-c jc-sb" style="left: 0;top: 0;right: 0;height: 40px;">
<view class="flex ai-c">
<view class="p3 br-p50" style="background-color: #873E1D;">
<image src="/static/image/mine/vip.png" mode="widthFix" style="width: 18px;height: 15px;"></image>
</view>
<text class="ml5 fs16 fwb" style="color: #7E4012FF;">VIP会员</text>
</view>
<text class="fs12" style="color: #7E4012FF;">2024-12-12到期</text>
<text v-if="vipOn.length" class="fs12" style="color: #7E4012FF;">{{expireTime}}到期</text>
</view>
<view class="absolute flex ai-c jc-c" style="left: 0;top: 40px;right: 0;bottom: 0;">
<view class="text-center">
<view class="fs18 fwb" style="color: #7E4012FF;">尊享科目一二三四全部付费权益</view>
<view v-if="vipOn.length" class="fs18 fwb" style="color: #7E4012FF;">{{vipText}}</view>
<view class="study fs16 text-center" style="margin: 25px auto 0;color: #F6E99FFF;">
马上学习
{{ vipOn.length?'马上学习':'开通会员'}}
</view>
</view>
</view>
</view>
<view class="br8 bc-fff p15 z-index2">
<text class="fs16 cor-333">我的驾校</text>
<div class="mt12 flex ai-c jc-sb">
<text class="fs18 cor-000 fwb">合肥八一驾校</text>
<u-button text="切换驾校" shape="circle" @click="handleChangeSchool"></u-button>
</div>
<u-line margin="14px 0 18px 0"></u-line>
<view class="flex ai-c" @tap="handleCallPhone">
<view class="flex ai-c jc-c phone">
<img src="/static/image/mine/phone.png" style="width: 12px;height: 12px;">
<text class="ml2 fs12 cor-fff">客服热线</text>
<view v-if="user.schoolId">
<div class="mt12 flex ai-c jc-sb">
<text class="fs18 cor-000 fwb">{{user.schoolName}}</text>
<u-button text="切换驾校" shape="circle" @click="handleChangeSchool"></u-button>
</div>
<u-line margin="14px 0 18px 0"></u-line>
<view class="flex ai-c" @tap="handleCallPhone">
<view class="flex ai-c jc-c phone">
<img src="/static/image/mine/phone.png" style="width: 12px;height: 12px;">
<text class="ml2 fs12 cor-fff">客服热线</text>
</view>
<text class="ml5 fs26 cor-333 fwb" style="line-height: 26px;">{{user.schoolPhone}}</text>
</view>
<text class="ml5 fs26 cor-333 fwb" style="line-height: 26px;">0551-12345678</text>
</view>
<view v-else class="pt30 pb15">
<u-button text="绑定驾校" shape="circle" @click="handleChangeSchool"></u-button>
</view>
</view>
<view class="mt12 bc-fff br8">
<u-cell-group>
<u-cell size="large" title="我的资料" value="修改" isLink @tap="handleInfo">
<u-cell size="large" title="我的资料" isLink @tap="handleInfo">
<template #icon>
<img src="/static/image/mine/wdzl.png" style="width: 24px;height: 24px;">
</template>
</u-cell>
<u-cell size="large" title="我的体检" value="查看报告" isLink @tap="handleTJ">
<u-cell size="large" title="我的体检" isLink @tap="handleTJ">
<template #icon>
<img src="/static/image/mine/wdtj.png" style="width: 24px;height: 24px;">
</template>
@@ -78,7 +83,7 @@
</u-cell>
</u-cell-group>
</view>
<view class="flex ai-c jc-c mt12 br8 bc-fff" style="height: 50px;" @tap="handleLogout">
<view v-if="isLogin" class="flex ai-c jc-c mt12 br8 bc-fff" style="height: 50px;" @tap="handleLogout">
<text class="fs16" style="color: #A09F9F;">退出登录</text>
</view>
</view>
@@ -86,7 +91,6 @@
</template>
<script>
import useUserStore from '@/jtools/store/user'
import { queryVip } from '@/jtools/api/vip'
export default {
components: {},
computed: {
@@ -94,7 +98,36 @@ export default {
return useUserStore().isLogin
},
user() {
return useUserStore().userInfo
let userInfo = useUserStore().userInfo
return { ...userInfo, count: this.dateDiff(userInfo.createTime) }
},
vipOn() {
return useUserStore().vipOnList
},
expireTime() {
if(this.vipOn.length) {
const t = this.vipOn.reduce((pre, cur) => {
if(Date.parse(pre) > Date.parse(cur.endDate)) {
return cur.endDate
}
return pre
}, '2099-12-31')
return t.split(' ')[0]
}else {
return ''
}
},
vipText() {
if(this.vipOn.length) {
const t = this.vipOn.reduce((pre, cur) => {
return [...pre, ...cur.subjects.split(',').map(it =>['','一','二','三','四'][it])]
}, [])
let val = Array.from(new Set(t))
val = val.length == 4 ? val.join('')+'全部':val.join('')
return `尊享科目${val}付费权益`
}else {
return ''
}
}
},
data() {
@@ -102,30 +135,36 @@ export default {
};
},
onShow() {
this.searchVip()
},
methods: {
searchVip() {
queryVip().then(resp => {
if(resp.code == '0000') {
debugger
}
})
},
handleVip() {
uni.navigateTo({
url: '/pages/me/vip'
})
if(this.isLogin) {
if(this.vipOn.length) {
uni.navigateTo({
url: '/pages/me/vip'
})
} else {
uni.navigateTo({
url: '/pages/index/videoVip'
})
}
} else {
this.toLogin()
}
},
handleCallPhone() {
uni.makePhoneCall({
phoneNumber: '17318531354'
phoneNumber: this.user.schoolPhone
})
},
handleChangeSchool() {
uni.navigateTo({
url: '/pages/me/school'
})
if(this.isLogin) {
uni.navigateTo({
url: '/pages/me/school'
})
} else {
this.toLogin()
}
},
handleInfo() {
if(this.isLogin) {
@@ -152,7 +191,20 @@ export default {
},
handleLogout() {
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>

View File

@@ -0,0 +1,42 @@
<template>
<view>
<view class="chapter_item p14" v-for="(item,index) of chapterList" :key="index" @tap="toQuestion">
{{item.label}}
</view>
</view>
</template>
<script>
export default {
data() {
return {
chapterList:[
{label:'驾驶证申请相关'},
{label:'驾驶证申请相关'},
{label:'驾驶证登记处罚'},
{label:'机动车强制报废'},
{label:'其他考点'},
{label:'驾驶证登记处罚'},
{label:'机动车强制报废'},
{label:'其他考点'}]
}
},
methods:{
toQuestion(){
uni.navigateTo({
url:"/pages/questionBank/questionBank?navTitle="+章节技巧
})
}
}
}
</script>
<style scoped>
.chapter_item{
border-bottom: 1px solid rgb(210,209,214);
background-color: #fff;
}
.chapter_item:hover{
background-color: rgb(210,209,214);
}
</style>

View File

@@ -39,7 +39,7 @@
</scroll-view>
</swiper-item>
</swiper>
<view class="wp100 flex jc-sb ai-c p14 bc-fff" style="position: fixed;bottom: 0;left: 0;">
<view class="wp100 flex jc-sb ai-c p14 bc-fff" v-if="isShowAll" style="position: fixed;bottom: 0;left: 0;">
<view style="width: 220rpx;">
<button v-if="type==='practice'" class="btn">四步学科一</button>
<view v-else class="btn" style="text-align: center;" @tap="submitPaper">
@@ -65,6 +65,9 @@
<text class="cor-666">题板</text>
</view>
</view>
<view v-else class="wp100 p14" style="position: fixed;bottom: 30rpx;left: 0;">
<button class="vip_btn" @click="toVip">立即查看全部题目</button>
</view>
<u-modal :show="tipShow">
<view class="relative wp100">
<view class="text-center">
@@ -149,10 +152,41 @@
</view>
</view>
</u-popup>
</view>
<u-popup :show="showVip" mode="bottom" :closeOnClickOverlay="true" :round="16" @close="showVip=false">
<view class="p14" style="z-index: 9;">
<view class="wp100 flex ai-c jc-sb">
<text class="fs30 fw600 cor-000">VIP题库</text>
<u-icon name="close" color="#c2c2c2" size="20" @tap="showVip=false"></u-icon>
</view>
<text class="fs16 cor-666">精准刷题更高效</text>
<view style="width:100%;height: 110rpx;background-image: url(../../static/image/practice/vip_question.png);background-size: 100% 100%;" class="mt15 relative">
<view style="position: absolute;left:0,top:0;height: 110rpx;" class="wp100 flex jc-c ai-c">
<text class="fs16" style="color: #994800;">科一+科四精简500题</text>
</view>
<image style="width: 65rpx;height: 65rpx; position: absolute;right: 20px;top: -5px;" src="../../static/image/practice/vip_include.png"></image>
</view>
<view style="width:100%;height: 110rpx;background-image: url(../../static/image/practice/vip_test.png);background-size: 100% 100%;z-index: 9;" class="mt15 relative">
<view style="position: absolute;left:0,top:0;height: 110rpx;" class="wp100 flex jc-c ai-c">
<text class="fs16" style="color: #994800;">科一+科四考前密卷2套</text>
</view>
<image style="width: 65rpx;height: 65rpx; position: absolute;right: 20px;top: -5px;" src="../../static/image/practice/vip_include.png"></image>
</view>
</view>
<view style="height: 528rpx;width: 100%;background-image: url(../../static/image/practice/vip_bg.png);background-size: 100% 100%;margin-top: -65px;position: relative;">
<text style="position: absolute;top: 138px;left:100px;rotate: 16deg;" class="fs25 cor-fff">VIP题库</text>
</view>
<view class="wp100 p14" style="position: absolute;left: 0;bottom:20px">
<view class="sub_btn flex ai-c jc-sb">
<text class="cor-fff fs14">¥<text class="fs24 cor-fff">{{nowPrice}}</text></text>
<image style="width: 276rpx;height: 88rpx;margin-top: -5px;" src="../../static/image/index/buy.png"></image>
</view>
</view>
</u-popup>
</view>
</template>
<script>
import storage from '@/jtools/storage';
export default {
props:{
tabsList:{
@@ -165,10 +199,16 @@ export default {
isSubmit:{
type:Boolean,
default:false
},
isShowAll:{
type:Boolean,
default:true
}
},
data() {
return {
nowPrice:68,
showVip:false,
popupShow:false,
content:'太棒啦,已答完最后一题~',
tipShow:false,
@@ -178,6 +218,7 @@ export default {
qIndex:0,
rightList:[],
wrongList:[],
collectList:storage.get('collectList') || [],
questionList: [],//数据源
swiperList: [], // 轮播图数据列表
swiperIndex: 0, // 轮播图当前位置
@@ -191,6 +232,10 @@ export default {
this.renderSwiper(0)
},
methods: {
//开通VIP
toVip(){
this.showVip=true
},
submitPaper(){
this.$refs.countDown_1.pause();
this.$refs.countDown_2.pause();
@@ -222,18 +267,24 @@ export default {
},
toCollect(){
if(this.questionList[this.topicIndex].isCollect){
if(this.collectList.includes(this.questionList[this.topicIndex].questionId)){
const idx=this.collectList.indexOf(this.questionList[this.topicIndex].questionId)
this.collectList.splice(idx,1)
}
this.questionList[this.topicIndex].isCollect=false
uni.showToast({
title:"取消收藏",
icon:'none'
})
}else{
this.collectList.push(this.questionList[this.topicIndex].questionId)
this.questionList[this.topicIndex].isCollect=true
uni.showToast({
title:"已收藏",
icon:'none'
})
}
storage.set('collectList',this.collectList)
},
cancel(){
this.tipShow=false
@@ -292,8 +343,13 @@ export default {
// 轮播图动画结束
onAnimationfinish(e) {
if(this.index>=this.questionList.length){
this.tipShow=true
if(this.isShowAll){
this.tipShow=true
}else{
this.showVip=true
}
}else{
this.showVip=false
this.tipShow=false
}
if (!this.isChange) return;
@@ -321,7 +377,7 @@ export default {
}
console.log(this.rightList);
if(this.wrongList.includes(this.questionList[this.topicIndex].questionId)){
const wIndex=this.wrongList.findIndex(this.questionList[this.topicIndex].questionId)
const wIndex=this.wrongList.indexOf(this.questionList[this.topicIndex].questionId)
this.wrongList.splice(wIndex,1)
}
if(this.topicIndex<this.questionList.length-1){
@@ -766,4 +822,23 @@ export default {
.content{
padding-top: calc(var(--window-top) + 10px);
}
.vip_btn{
width:100%;
height: 100rpx;
line-height: 100rpx;
text-align: center;
font-size: 18px;
color:#fff;
background: linear-gradient(90deg, #FF9804 0%, #E95B0E 100%);
border-radius: 50rpx;
}
.sub_btn{
width:100%;
height: 110rpx;
border: 4px solid #F59B26;
background: linear-gradient(0deg, #E66501 0%, #F8A42C 100%);
box-shadow: 0rpx 16rpx 20rpx 1rpx rgba(245,155,38,0.78);
border-radius: 55rpx;
padding: 14rpx;
}
</style>

View File

@@ -1,15 +1,15 @@
<template>
<view class="p14">
<view class="flex jc-sb">
<view class="relative mr5">
<view class="relative mr5" @tap="toIconSkill">
<image style="width: 336rpx;height: 152rpx;" src="../../static/image/practice/errorprone_bg.png">
</image>
<view style="position: absolute;left: 0;top: 0;" class="p10">
<view style="color: #04B13B;font-size: 18px;">技巧</view>
<view style="color: #04B13B;font-size: 18px;">技巧</view>
<text style="color: #04B13B;font-size: 14px;">快速记忆</text>
</view>
</view>
<view class="relative ml5">
<view class="relative ml5" @tap="toChapterSkill">
<image style="width: 363rpx;height: 170rpx;" src="../../static/image/practice/chapter_bg.png"></image>
<view style="position: absolute;left: 0;top: 0;" class="p10">
<view style="color: #FF6E02;font-size: 18px;">章节练习</view>
@@ -92,6 +92,16 @@
url:"/pages/questionBank/questionBank?navTitle="+title
})
},
toIconSkill(){
uni.navigateTo({
url:"/pages/index/iconSkill"
})
},
toChapterSkill(){
uni.navigateTo({
url:"/pages/questionBank/chapterExercise"
})
}
}
}
</script>

View File

@@ -3,9 +3,9 @@
<!-- <u-navbar :title="navTitle" @rightClick="rightClick" :autoBack="true">
</u-navbar> -->
<j-navbar>{{navTitle}}</j-navbar>
<Question :tabsList="tabsList" />
</view>
</template>
<Question :tabsList="tabsList" :isShowAll="true" />
</view>
</template>
<script>
import {
@@ -41,11 +41,11 @@
methods: {
rightClick() {
console.log('返回');
}
},
}
}
</script>
<style>
<style scoped>
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB