29 Commits

Author SHA1 Message Date
7b1db47383 提交 2023-11-07 20:50:15 +08:00
79236493e6 Merge branch 'master' of http://114.55.169.15:3000/huxiaofeng666/jwl-applet into dev-hxf 2023-10-30 20:29:32 +08:00
59c49bfdf2 提交 2023-10-30 20:29:18 +08:00
110e9d4adc Merge pull request '屏蔽Ios支付' (#32) from dev-qsh into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/32
2023-10-25 20:33:06 +08:00
qsh
b533581a5d 屏蔽Ios支付 2023-10-25 20:30:58 +08:00
ac8acdccda Merge pull request 'dev-hxf' (#31) from dev-hxf into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/31
2023-10-17 12:03:51 +08:00
f4b6f96649 Merge branch 'master' of http://114.55.169.15:3000/huxiaofeng666/jwl-applet into dev-hxf 2023-10-17 12:01:11 +08:00
9ba3f6ed48 提交 2023-10-17 12:00:58 +08:00
253ab2a80d Merge pull request 'dev-hxf' (#30) from dev-hxf into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/30
2023-10-10 18:07:01 +08:00
bfdbd3f7f3 Merge branch 'master' of http://114.55.169.15:3000/huxiaofeng666/jwl-applet into dev-hxf 2023-10-10 17:56:31 +08:00
e3544ee06e 提交 2023-10-10 17:56:20 +08:00
7e15974ea6 Merge pull request 'dev-hxf' (#29) from dev-hxf into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/29
2023-09-21 16:34:55 +08:00
46972d5bff Merge branch 'master' of http://114.55.169.15:3000/huxiaofeng666/jwl-applet into dev-hxf 2023-09-21 16:31:30 +08:00
851319e24c 提交 2023-09-21 16:30:36 +08:00
19616d56c5 Merge pull request 'dev-hxf' (#28) from dev-hxf into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/28
2023-09-20 22:32:22 +08:00
89c4b2148e 提交 2023-09-20 22:23:21 +08:00
e68a422cc8 Merge branch 'master' of http://114.55.169.15:3000/huxiaofeng666/jwl-applet into dev-hxf 2023-09-20 22:18:41 +08:00
2e93ad93e9 提交 2023-09-20 22:18:19 +08:00
c783ff969d Merge pull request 'dev-hxf' (#27) from dev-hxf into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/27
2023-09-18 21:44:49 +08:00
4526430a38 Merge branch 'master' of http://114.55.169.15:3000/huxiaofeng666/jwl-applet into dev-hxf 2023-09-18 21:43:29 +08:00
3a0545852f 提交 2023-09-18 21:42:50 +08:00
0410e5dda9 Merge pull request 'dev-hxf' (#26) from dev-hxf into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/26
2023-09-17 23:53:26 +08:00
0c230fa5f1 Merge branch 'master' of http://114.55.169.15:3000/huxiaofeng666/jwl-applet into dev-hxf 2023-09-17 23:49:59 +08:00
ded28b62fb 提交 2023-09-17 23:49:42 +08:00
6834b3f9fe Merge pull request 'dev-hxf' (#25) from dev-hxf into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/25
2023-09-17 13:23:02 +08:00
3379a9b18e Merge branch 'master' of http://114.55.169.15:3000/huxiaofeng666/jwl-applet into dev-hxf 2023-09-17 13:19:26 +08:00
9e871e4079 提交 2023-09-17 13:18:59 +08:00
728fefac03 Merge pull request 'dev-hxf' (#24) from dev-hxf into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/24
2023-09-07 09:55:25 +08:00
bf05f771f7 提交 2023-09-07 09:47:38 +08:00
42 changed files with 2725 additions and 1252 deletions

View File

@@ -5,7 +5,6 @@ VITE_APP_TITLE = 金武联驾校
VITE_APP_ENV = 'development' VITE_APP_ENV = 'development'
# 金武联驾校/开发环境 # 金武联驾校/开发环境
VITE_APP_BASE_API = 'https://jwl.ahduima.com/' VITE_APP_BASE_API = 'https://jwl.ahduima.com/'
# #
VITE_WEB_BASE_URL = 'https://jwl.ahduima.com' VITE_WEB_BASE_URL = 'https://jwl.ahduima.com'

View File

@@ -5,7 +5,7 @@ VITE_APP_TITLE = 金武联驾校
VITE_APP_ENV = 'production' VITE_APP_ENV = 'production'
# 金武联驾校/开发环境 # 金武联驾校/开发环境
VITE_APP_BASE_API = 'https://jwl.ahduima.com/' VITE_APP_BASE_API = 'https://jwl.ahduima.com/'
# #
VITE_WEB_BASE_URL = 'https://jwl.ahduima.com' VITE_WEB_BASE_URL = 'https://jwl.ahduima.com'

View File

@@ -1,16 +1,21 @@
<script> <script>
import useUserStore from '@/jtools/store/user' import useUserStore from '@/jtools/store/user'
import useQuestionStore from '@/jtools/store/question' //引入store import useQuestionStore from '@/jtools/store/question' //引入store
import storage from './jtools/storage'
export default { export default {
onLaunch: function () { onLaunch: function (options) {
// 如果是二维码扫描过来的需要保存公司id
if (options.query?.scene) {
storage.set('companyId', options.query?.scene)
}
useUserStore().queryVipList() useUserStore().queryVipList()
useQuestionStore().getAllQuestion() if (useUserStore().isLogin) {
if(useUserStore().isLogin) {
useUserStore().getUserInfo() useUserStore().getUserInfo()
useUserStore().searchUserVip() useUserStore().searchUserVip()
} }
}, },
onShow: function () { onShow: function () {
useQuestionStore().getAllQuestion()
console.log('App Show') console.log('App Show')
}, },
onHide: function () { onHide: function () {
@@ -23,5 +28,8 @@ export default {
/*每个页面公共css */ /*每个页面公共css */
@import "uni_modules/uview-plus/index.scss"; @import "uni_modules/uview-plus/index.scss";
@import "static/style/index.scss"; @import "static/style/index.scss";
button::after{ border: none;}
button::after {
border: none;
}
</style> </style>

View File

@@ -7,4 +7,21 @@ export function getAliCompanyInfo(data) {
data, data,
noToken: true noToken: true
}); });
}
export function getCarTypeList(data) {
return request({
url: 'driver-api/tdCar/list',
method: 'GET',
data,
noToken: true
});
}
export function addInfo(data) {
return request({
url: 'chaoyuan-api/driver/addInfo',
method: 'POST',
data
});
} }

View File

@@ -50,7 +50,14 @@ export function querySysConfigList(carTypeId, configKey) {
noToken: true noToken: true
}); });
} }
//获取配置
export function querySysConfig(carTypeId, configKey) {
return request({
url: 'driver-api/tdSysConfig/queryConfigByKey?configKey=' + configKey + '&carTypeId=' + carTypeId,
method: 'GET',
noToken: true
});
}
//获取项目列表 (考试项目和基础操作) //获取项目列表 (考试项目和基础操作)
export function queryProjectList(data) { export function queryProjectList(data) {
return request({ return request({

View File

@@ -64,7 +64,8 @@ export default class JtoolsPay {
"description": this.order.description, "description": this.order.description,
"money": this.order.money, "money": this.order.money,
"outTradeNo": this.order.outTradeNo, "outTradeNo": this.order.outTradeNo,
"userId": this.order.userId "userId": this.order.userId,
"tradeType":'1'
} }
if (uni.getStorageSync('openId')) { if (uni.getStorageSync('openId')) {
params.openId = uni.getStorageSync('openId'); params.openId = uni.getStorageSync('openId');

View File

@@ -29,7 +29,7 @@ function service(options = {}) {
title: res?.data?.message || '请重新登录', title: res?.data?.message || '请重新登录',
icon: 'none' icon: 'none'
}); });
useUserStore().logout() useUserStore().logoutWithoutToken()
//请求成功 //请求成功
resolved(res.data); resolved(res.data);
} else if(res.data.code != '0000'&&res.data.code !='4001') { } else if(res.data.code != '0000'&&res.data.code !='4001') {

View File

@@ -4,7 +4,8 @@ import {
import http from '@/jtools/request/index'; import http from '@/jtools/request/index';
import { import {
queryQuestion, queryQuestion,
getVersion getVersion,
querySysConfig
} from '@/jtools/api/question'; } from '@/jtools/api/question';
import storage from '@/jtools/storage'; import storage from '@/jtools/storage';
@@ -12,212 +13,224 @@ const question = defineStore({
id: 'question', id: 'question',
state: () => ({ state: () => ({
currentCartype: storage.get('carType') || '1001', currentCartype: storage.get('carType') || '1001',
orderQuestion_subject1:storage.get('question_subject1') || [], //科目一顺序做题 currentCarName: storage.get('carName') || '小车C1/C2/C3',
orderQuestion_subject4:storage.get('question_subject4') ||[],//科目顺序做题 orderQuestion_subject1: storage.get('question_subject1') || [], //科目顺序做题
currentIndex_subject1:0,//科目一索引 顺序做题 orderQuestion_subject4: storage.get('question_subject4') || [], //科目顺序做题
currentIndex_subject4:0,//科目索引 顺序做题 currentIndex_subject1: 0, //科目索引 顺序做题
curSubject:storage.get('curSubject') || '1', currentIndex_subject4: 0, //科目四索引 顺序做题
loading_subject1:false, curSubject: storage.get('curSubject') || '1',
loading_subject4:false, loading_subject1: false,
version:storage.get('version') || '' loading_subject4: false,
version: storage.get('version') || ''
}), }),
actions: { actions: {
getAllQuestion(){ resetStorage(){
getVersion(this.currentCartype).then(resp=>{ this.currentIndex_subject1=0
if(resp.code==='0000'){ this.currentIndex_subject4=0
if(this.version!=resp.data){ this.curSubject=0
this.version=resp.data storage.remove('curSubject')
storage.set('version',resp.data) storage.remove('wrongList_subject1')
this.getOrderQuestion_sub1(true) storage.remove('wrongList_subject4')
this.getOrderQuestion_sub4(true) storage.remove('rightList_subject1')
}else{ storage.remove('rightList_subject4')
this.getOrderQuestion_sub1() this.getAllQuestion()
this.getOrderQuestion_sub4()
}
}
})
},
divideArray(array, numChunks) {
var chunkSize = Math.ceil(array.length / numChunks);
var dividedArray = [];
for (var i = 0; i < array.length; i += chunkSize) {
dividedArray.push(array.slice(i, i + chunkSize));
}
return dividedArray;
}, },
getAllQuestion() {
this.currentCartype = storage.get('carType') || '1001'
getVersion(this.currentCartype).then(resp => {
if (resp.code === '0000') {
querySysConfig(this.currentCartype, 'QuestionBank').then(res => {
const urlList = JSON.parse(res.data.configJson)
const urlOne = urlList.find(item => item.subject == '1').url
const urlFour = urlList.find(item => item.subject == '4').url
if (this.version != resp.data) {
this.version = resp.data
storage.set('version', resp.data)
this.getOrderQuestion_sub1(true, urlOne)
this.getOrderQuestion_sub4(true, urlFour)
} else {
this.getOrderQuestion_sub1(false, urlOne)
this.getOrderQuestion_sub4(false, urlOne)
}
})
}
})
},
divideArray(array, numChunks) {
var chunkSize = Math.ceil(array.length / numChunks);
var dividedArray = [];
for (var i = 0; i < array.length; i += chunkSize) {
dividedArray.push(array.slice(i, i + chunkSize));
}
return dividedArray;
},
//改变当前科目 //改变当前科目
changeSubject(val){ changeSubject(val) {
this.curSubject=val this.curSubject = val
storage.set('curSubject',val) storage.set('curSubject', val)
}, },
// 获取顺序做题科目1 // 获取顺序做题科目1
getOrderQuestion_sub1(isUpdate) { getOrderQuestion_sub1(isUpdate, url) {
if(isUpdate){ if (isUpdate) {
this.loading_subject1=true this.loading_subject1 = true
queryQuestion({ const that = this
carTypeId: this.currentCartype, uni.request({
subject: '1', url: url,
// questionIdList:[10982,10983,10985,10986] success(resp) {
}).then(res => { if (resp.data) {
if (res.code == '0000') { that.orderQuestion_subject1 = resp.data.data
this.loading_subject1=false const diveList = that.divideArray(that.orderQuestion_subject1, 5)
uni.showToast({ that.loading_subject1 = false
title:'题库加载完成!'
})
this.orderQuestion_subject1 = res.data
const diveList=this.divideArray(this.orderQuestion_subject1,5)
uni.setStorageSync('questionOneSub1', diveList[0]) uni.setStorageSync('questionOneSub1', diveList[0])
uni.setStorageSync('questionOneSub2', diveList[1]) uni.setStorageSync('questionOneSub2', diveList[1])
uni.setStorageSync('questionOneSub3', diveList[2]) uni.setStorageSync('questionOneSub3', diveList[2])
uni.setStorageSync('questionOneSub4', diveList[3]) uni.setStorageSync('questionOneSub4', diveList[3])
uni.setStorageSync('questionOneSub5', diveList[4]) uni.setStorageSync('questionOneSub5', diveList[4])
const falseList =storage.get('wrongList_subject1') || [] const falseList = storage.get('wrongList_subject1') || []
const trueList =storage.get('rightList_subject1')|| [] const trueList = storage.get('rightList_subject1') || []
const falseArr=[] const falseArr = []
const rightArr=[] const rightArr = []
this.orderQuestion_subject1.forEach(item=>{ that.orderQuestion_subject1.forEach(item => {
if(falseList.includes(item.questionId)){ if (falseList.includes(item.questionId)) {
falseArr.push(item.questionId) falseArr.push(item.questionId)
} }
if(trueList.includes(item.questionId)){ if (trueList.includes(item.questionId)) {
rightArr.push(item.questionId) rightArr.push(item.questionId)
} }
}) })
storage.set('wrongList_subject1',falseArr) storage.set('wrongList_subject1', falseArr)
storage.set('rightList_subject1',rightArr) storage.set('rightList_subject1', rightArr)
} }
}) }
}else{ })
} else {
const list1 = uni.getStorageSync('questionOneSub1') || [] const list1 = uni.getStorageSync('questionOneSub1') || []
const list2 = uni.getStorageSync('questionOneSub2') || [] const list2 = uni.getStorageSync('questionOneSub2') || []
const list3 = uni.getStorageSync('questionOneSub3') || [] const list3 = uni.getStorageSync('questionOneSub3') || []
const list4 = uni.getStorageSync('questionOneSub4') || [] const list4 = uni.getStorageSync('questionOneSub4') || []
const list5 = uni.getStorageSync('questionOneSub5') || [] const list5 = uni.getStorageSync('questionOneSub5') || []
this.orderQuestion_subject1=[...list1,...list2,...list3,...list4,...list5] this.orderQuestion_subject1 = [...list1, ...list2, ...list3, ...list4, ...list5]
if(this.orderQuestion_subject1&&this.orderQuestion_subject1.length){ if (this.orderQuestion_subject1 && this.orderQuestion_subject1.length) {
}else{ } else {
this.loading_subject1=true this.loading_subject1 = true
queryQuestion({ const that = this
carTypeId: this.currentCartype, uni.request({
subject: '1', url: url,
// questionIdList:[10982,10983,10985,10986] success(resp) {
}).then(res => { if (resp.data) {
if (res.code == '0000') { that.orderQuestion_subject1 = resp.data.data
this.loading_subject1=false const diveList = that.divideArray(that.orderQuestion_subject1, 5)
uni.showToast({ that.loading_subject1 = false
title:'题库加载完成!'
})
this.orderQuestion_subject1 = res.data
const diveList=this.divideArray(this.orderQuestion_subject1,5)
uni.setStorageSync('questionOneSub1', diveList[0]) uni.setStorageSync('questionOneSub1', diveList[0])
uni.setStorageSync('questionOneSub2', diveList[1]) uni.setStorageSync('questionOneSub2', diveList[1])
uni.setStorageSync('questionOneSub3', diveList[2]) uni.setStorageSync('questionOneSub3', diveList[2])
uni.setStorageSync('questionOneSub4', diveList[3]) uni.setStorageSync('questionOneSub4', diveList[3])
uni.setStorageSync('questionOneSub5', diveList[4]) uni.setStorageSync('questionOneSub5', diveList[4])
const falseList =storage.get('wrongList_subject1') || [] const falseList = storage.get('wrongList_subject1') || []
const trueList =storage.get('rightList_subject1')|| [] const trueList = storage.get('rightList_subject1') || []
const falseArr=[] const falseArr = []
const rightArr=[] const rightArr = []
this.orderQuestion_subject1.forEach(item=>{ that.orderQuestion_subject1.forEach(item => {
if(falseList.includes(item.questionId)){ if (falseList.includes(item.questionId)) {
falseArr.push(item.questionId) falseArr.push(item.questionId)
} }
if(trueList.includes(item.questionId)){ if (trueList.includes(item.questionId)) {
rightArr.push(item.questionId) rightArr.push(item.questionId)
} }
}) })
storage.set('wrongList_subject1',falseArr) storage.set('wrongList_subject1', falseArr)
storage.set('rightList_subject1',rightArr) storage.set('rightList_subject1', rightArr)
} }
}) }
})
} }
} }
}, },
// 获取顺序做题科目4 // 获取顺序做题科目4
getOrderQuestion_sub4(isUpdate) { getOrderQuestion_sub4(isUpdate, url) {
if(isUpdate){ if (isUpdate) {
this.loading_subject4=true this.loading_subject4 = true
queryQuestion({ const that = this
carTypeId: this.currentCartype, uni.request({
subject: '4', url: url,
// questionIdList:[10982,10983,10985,10986] success(resp) {
}).then(res => { if (resp.data) {
if (res.code == '0000') { that.orderQuestion_subject4 = resp.data.data
this.loading_subject4=false const diveList = that.divideArray(that.orderQuestion_subject4, 5)
this.orderQuestion_subject4 = res.data that.loading_subject4 = false
const diveList=this.divideArray(this.orderQuestion_subject4,5)
uni.setStorageSync('questionFourSub1', diveList[0]) uni.setStorageSync('questionFourSub1', diveList[0])
uni.setStorageSync('questionFourSub2', diveList[1]) uni.setStorageSync('questionFourSub2', diveList[1])
uni.setStorageSync('questionFourSub3', diveList[2]) uni.setStorageSync('questionFourSub3', diveList[2])
uni.setStorageSync('questionFourSub4', diveList[3]) uni.setStorageSync('questionFourSub4', diveList[3])
uni.setStorageSync('questionFourSub5', diveList[4]) uni.setStorageSync('questionFourSub5', diveList[4])
const falseList =storage.get('wrongList_subject4') || [] const falseList = storage.get('wrongList_subject4') || []
const trueList =storage.get('rightList_subject4')|| [] const trueList = storage.get('rightList_subject4') || []
const falseArr=[] const falseArr = []
const rightArr=[] const rightArr = []
this.orderQuestion_subject4.forEach(item=>{ that.orderQuestion_subject4.forEach(item => {
if(falseList.includes(item.questionId)){ if (falseList.includes(item.questionId)) {
falseArr.push(item.questionId) falseArr.push(item.questionId)
} }
if(trueList.includes(item.questionId)){ if (trueList.includes(item.questionId)) {
rightArr.push(item.questionId) rightArr.push(item.questionId)
} }
}) })
storage.set('wrongList_subject4',falseArr) storage.set('wrongList_subject4', falseArr)
storage.set('rightList_subject4',rightArr) storage.set('rightList_subject4', rightArr)
} }
}) }
}else{ })
} else {
const list1 = uni.getStorageSync('questionFourSub1') || [] const list1 = uni.getStorageSync('questionFourSub1') || []
const list2 = uni.getStorageSync('questionFourSub2') || [] const list2 = uni.getStorageSync('questionFourSub2') || []
const list3 = uni.getStorageSync('questionFourSub3') || [] const list3 = uni.getStorageSync('questionFourSub3') || []
const list4 = uni.getStorageSync('questionFourSub4') || [] const list4 = uni.getStorageSync('questionFourSub4') || []
const list5 = uni.getStorageSync('questionFourSub5') || [] const list5 = uni.getStorageSync('questionFourSub5') || []
this.orderQuestion_subject4=[...list1,...list2,...list3,...list4,...list5] this.orderQuestion_subject4 = [...list1, ...list2, ...list3, ...list4, ...list5]
if(this.orderQuestion_subject4&&this.orderQuestion_subject4.length){ if (this.orderQuestion_subject4 && this.orderQuestion_subject4.length) {
}else{ } else {
this.loading_subject4=true this.loading_subject4 = true
queryQuestion({ const that = this
carTypeId: this.currentCartype, uni.request({
subject: '4', url: url,
// questionIdList:[10982,10983,10985,10986] success(resp) {
}).then(res => { if (resp.data) {
if (res.code == '0000') { that.orderQuestion_subject4 = resp.data.data
this.loading_subject4=false const diveList = that.divideArray(that.orderQuestion_subject4, 5)
this.orderQuestion_subject4 = res.data that.loading_subject4 = false
const diveList=this.divideArray(this.orderQuestion_subject4,5)
uni.setStorageSync('questionFourSub1', diveList[0]) uni.setStorageSync('questionFourSub1', diveList[0])
uni.setStorageSync('questionFourSub2', diveList[1]) uni.setStorageSync('questionFourSub2', diveList[1])
uni.setStorageSync('questionFourSub3', diveList[2]) uni.setStorageSync('questionFourSub3', diveList[2])
uni.setStorageSync('questionFourSub4', diveList[3]) uni.setStorageSync('questionFourSub4', diveList[3])
uni.setStorageSync('questionFourSub5', diveList[4]) uni.setStorageSync('questionFourSub5', diveList[4])
const falseList =storage.get('wrongList_subject4') || [] const falseList = storage.get('wrongList_subject4') || []
const trueList =storage.get('rightList_subject4')|| [] const trueList = storage.get('rightList_subject4') || []
const falseArr=[] const falseArr = []
const rightArr=[] const rightArr = []
this.orderQuestion_subject4.forEach(item=>{ that.orderQuestion_subject4.forEach(item => {
if(falseList.includes(item.questionId)){ if (falseList.includes(item.questionId)) {
falseArr.push(item.questionId) falseArr.push(item.questionId)
} }
if(trueList.includes(item.questionId)){ if (trueList.includes(item.questionId)) {
rightArr.push(item.questionId) rightArr.push(item.questionId)
} }
}) })
storage.set('wrongList_subject4',falseArr) storage.set('wrongList_subject4', falseArr)
storage.set('rightList_subject4',rightArr) storage.set('rightList_subject4', rightArr)
} }
}) }
})
} }
} }
}, },
//获取索引 //获取索引
getCurrentIndex(index,val){ getCurrentIndex(index, val) {
this[`currentIndex_subject${val}`]=index this[`currentIndex_subject${val}`] = index
console.log(`currentIndex_subject${val}`,this[`currentIndex_subject${val}`]);
} }
} }
}); });

View File

@@ -1,6 +1,6 @@
import { defineStore } from 'pinia'; import { defineStore } from 'pinia';
import { login,logout,getInfo } from '@/jtools/api/login'; import { login, logout, getInfo } from '@/jtools/api/login';
import { queryVip,getVipList } from '@/jtools/api/vip' import { queryVip, getVipList } from '@/jtools/api/vip';
import constants from '@/jtools/constants'; import constants from '@/jtools/constants';
import storage from '@/jtools/storage'; import storage from '@/jtools/storage';
@@ -16,67 +16,77 @@ const useUserStore = defineStore({
}), }),
actions: { actions: {
login(params) { login(params) {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
const resp = await login(params); const resp = await login(params);
if (resp.code === '0000') { if (resp.code === '0000') {
// 保存登录信息,用于重新登录 // 保存登录信息,用于重新登录
this.isLogin = true; this.isLogin = true;
this.token = resp.data.token; this.token = resp.data.token;
this.userInfo = resp.data this.userInfo = resp.data;
storage.set('isLogin', true) storage.set('isLogin', true);
storage.set('token', resp.data.token) storage.set('token', resp.data.token);
storage.set('userInfo', resp.data) storage.set('userInfo', resp.data);
resolve(resp.data); storage.remove('companyId');
} else { resolve(resp.data);
reject(); } else {
} reject();
}); }
}, });
},
// 登出 // 登出
logout(force = false) { logout(force = false) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.resetUserData(); this.resetUserData();
uni.redirectTo({ uni.redirectTo({
url: '/pages/login/login' url: '/pages/login/login'
}) });
resolve(); resolve();
}) });
},
//过期登出
logoutWithoutToken(force = false) {
return new Promise((resolve, reject) => {
this.resetUserData();
resolve();
});
}, },
// 获取用户信息 // 获取用户信息
getUserInfo() { getUserInfo() {
getInfo().then(resp => { getInfo().then(resp => {
if(resp.code == '0000') { if (resp.code == '0000') {
this.userInfo = resp.data this.userInfo = resp.data;
storage.set('userInfo', resp.data) storage.set('userInfo', resp.data);
} }
}) });
}, },
resetUserData() { resetUserData() {
this.isLogin = false; this.isLogin = false;
this.token = ''; this.token = '';
this.userInfo = {} this.userInfo = {};
this.vipOnList = [] this.vipOnList = [];
storage.remove('isLogin') storage.remove('isLogin');
storage.remove('token') storage.remove('token');
storage.remove('userInfo') storage.remove('userInfo');
}, },
// 查询当前用户的vip开通情况 // 查询当前用户的vip开通情况
async searchUserVip() { async searchUserVip() {
const resp=await queryVip({ carTypeId: this.currentCartype,memberId: null, subject:'' }) this.currentCartype = storage.get('carType') || '1001';
if(resp.code == '0000') { const resp = await queryVip({ carTypeId: this.currentCartype, memberId: null, subject: '' });
this.vipOnList = resp.data if (resp.code == '0000') {
} this.vipOnList = resp.data;
}
}, },
// 查询所有的vip // 查询所有的vip
queryVipList() { queryVipList() {
getVipList({ carTypeId: this.currentCartype,memberId: null, subject:'' }).then(resp => { this.currentCartype = storage.get('carType') || '1001';
if(resp.code == '0000') { getVipList({ carTypeId: this.currentCartype, memberId: null, subject: '' }).then(resp => {
this.vipAllList = resp.data if (resp.code == '0000') {
this.vipAllList = resp.data;
} }
}) });
} }
}, }
}); });
export default useUserStore; export default useUserStore;

View File

@@ -8,7 +8,8 @@
{ {
"path": "pages/index/index", "path": "pages/index/index",
"style": { "style": {
"navigationBarTitleText": "金武联驾考" "navigationStyle": "custom",
"enablePullDownRefresh": false
} }
}, },
{ {
@@ -104,6 +105,13 @@
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
}, },
{
"path": "pages/index/testTip",
"style": {
"navigationBarTitleText": "模拟考试",
"enablePullDownRefresh": false
}
},
{ {
"path": "pages/login/login", "path": "pages/login/login",
"style": { "style": {
@@ -158,6 +166,13 @@
"navigationBarTitleText": "考前密卷", "navigationBarTitleText": "考前密卷",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
},
{
"path": "pages/me/changeCarType",
"style": {
"navigationBarTitleText": "切换车型",
"enablePullDownRefresh": false
}
} }
], ],

View File

@@ -41,11 +41,11 @@
<view class="mt5">VIP课程</view> <view class="mt5">VIP课程</view>
</view> </view>
</view> </view>
<view class="wp33 flex ai-c jc-c" @tap="toAnswer('精简500题',true)"> <view class="wp33 flex ai-c jc-c" @tap="toAnswer(`精简${titleNum}题`,true)">
<view class="text-center wp100"> <view class="text-center wp100">
<image style="width: 72rpx;height: 72rpx;margin: 0 auto" src="../../static/image/index/500icon.png"> <image style="width: 72rpx;height: 72rpx;margin: 0 auto" src="../../static/image/index/500icon.png">
</image> </image>
<view class="mt5">精简500</view> <view class="mt5">精简{{titleNum}}</view>
</view> </view>
</view> </view>
<view class="wp33 flex ai-c jc-c" @tap="toExclusive"> <view class="wp33 flex ai-c jc-c" @tap="toExclusive">
@@ -78,11 +78,10 @@
</view> </view>
</view> </view>
</view> </view>
<view style="padding: 0 28rpx;margin-top: 30rpx;" @tap="toClass"> <!-- <view style="padding: 0 28rpx;margin-top: 30rpx;" @tap="toClass">
<view class="video-box"> <view class="video-box">
<view class="flex jc-sb ai-c wp100"> <view class="flex jc-sb ai-c wp100">
<text style="color: #05C341;font-size: 36rpx;">{{subject==1?'一':'四'}}精品视频课</text> <text style="color: #05C341;font-size: 36rpx;">{{subject==1?'一':'四'}}精品视频课</text>
<!-- <text class="cor-666 fs12">全部10节课 ></text> -->
</view> </view>
<view class="flex ai-c mt20"> <view class="flex ai-c mt20">
<view class="contain-box relative"> <view class="contain-box relative">
@@ -97,7 +96,7 @@
</view> </view>
</view> </view>
</view> </view>
</view> </view> -->
</view> </view>
</template> </template>
@@ -110,6 +109,7 @@
import storage from '@/jtools/storage'; import storage from '@/jtools/storage';
import useQuestionStore from '@/jtools/store/question' //引入store import useQuestionStore from '@/jtools/store/question' //引入store
import { import {
querySysConfig,
queryQuestionId, queryQuestionId,
getTestQuestionId getTestQuestionId
} from '@/jtools/api/question'; } from '@/jtools/api/question';
@@ -127,11 +127,12 @@
}, },
data() { data() {
return { return {
titleNum:500,
allQuestionNum: 0, allQuestionNum: 0,
} }
}, },
mounted() { mounted() {
this.getTitle()
}, },
computed: { computed: {
...mapState(useUserStore, ["vipOnList", "token"]), ...mapState(useUserStore, ["vipOnList", "token"]),
@@ -143,6 +144,15 @@
methods: { methods: {
...mapActions(useUserStore, ['searchUserVip']), ...mapActions(useUserStore, ['searchUserVip']),
...mapActions(useQuestionStore, ['getOrderQuestion_sub1', 'getOrderQuestion_sub4', 'getAllQuestion']), ...mapActions(useQuestionStore, ['getOrderQuestion_sub1', 'getOrderQuestion_sub4', 'getAllQuestion']),
getTitle(){
const carId=storage.get('carType') || '1001'
querySysConfig(carId,'SimplifyQuestionNum').then(resp=>{
if(resp.code==='0000'){
const list = JSON.parse(resp.data.configJson)
this.titleNum=list.find(item=>item.subject==this.subject).num
}
})
},
async toTestRoom() { async toTestRoom() {
// uni.navigateTo({ // uni.navigateTo({
// url:"/pages/index/trueTest" // url:"/pages/index/trueTest"
@@ -161,11 +171,18 @@
subject: this.subject, subject: this.subject,
}).then(async (resp) => { }).then(async (resp) => {
if (resp.code === '0000') { if (resp.code === '0000') {
const arr = resp.data if(resp.data&&resp.data.length){
const listJson = JSON.stringify(arr) const arr = resp.data
uni.navigateTo({ const listJson = JSON.stringify(arr)
url: "/pages/index/trueTest?subject="+ this.subject + "&questionIdList=" + listJson uni.navigateTo({
}) url: "/pages/index/trueTest?subject="+ this.subject + "&questionIdList=" + listJson
})
}else{
uni.showToast({
title: '暂无题目',
icon: 'none'
})
}
} else if (resp.code === '4001') { } else if (resp.code === '4001') {
uni.showToast({ uni.showToast({
title: '当前题库非最新版,请更新~', title: '当前题库非最新版,请更新~',
@@ -207,7 +224,7 @@
}) })
}, },
toAnswer(title, val) { toAnswer(title, val) {
if (title == '精简500题') { if (title == `精简${this.titleNum}`) {
queryQuestionId({ queryQuestionId({
versionId: this.version, versionId: this.version,
carTypeId: storage.get('carType') || '1001', carTypeId: storage.get('carType') || '1001',
@@ -218,23 +235,38 @@
if (this.token) { if (this.token) {
await this.searchUserVip() await this.searchUserVip()
const result = this.vipOnList.some(item => item.subjects.includes(this.subject)) const result = this.vipOnList.some(item => item.subjects.includes(this.subject))
let arr = []
if (result) { if (result) {
const listJson = JSON.stringify(resp.data) if(resp.data&&resp.data.length){
uni.navigateTo({ const listJson = JSON.stringify(resp.data)
url: "/pages/questionBank/questionBank?navTitle=" + title + "&subject=" + this.subject + uni.navigateTo({
"&needVip=" + result + "&questionIdList=" + listJson url: "/pages/questionBank/questionBank?navTitle=" + title + "&subject=" + this.subject +
}) "&needVip=" + !result + "&questionIdList=" + listJson
})
}else{
uni.showToast({
title: '暂无题目',
icon: 'none'
})
}
} else { } else {
if (resp.data && resp.data.length > 3) { if (resp.data && resp.data.length > 3) {
const arr = resp.data.slice(0, 3) arr = resp.data.slice(0, 3)
} else { } else {
const arr = resp.data arr = resp.data
}
if(arr&&arr.length){
const listJson = JSON.stringify(arr)
uni.navigateTo({
url: "/pages/questionBank/questionBank?navTitle=" + title + "&subject=" + this.subject +
"&needVip=" + !result + "&questionIdList=" + listJson
})
}else{
uni.showToast({
title: '暂无题目',
icon: 'none'
})
} }
const listJson = JSON.stringify(arr)
uni.navigateTo({
url: "/pages/questionBank/questionBank?navTitle=" + title + "&subject=" + this.subject +
"&needVip=" + result + "&questionIdList=" + listJson
})
} }
} else { } else {
uni.redirectTo({ uni.redirectTo({
@@ -268,7 +300,7 @@
const arr = resp.data const arr = resp.data
const listJson = JSON.stringify(arr) const listJson = JSON.stringify(arr)
uni.navigateTo({ uni.navigateTo({
url: "/pages/questionBank/practiceExams?title=" + title + "&subject=" + this.subject + "&questionIdList=" + listJson url: "/pages/index/testTip?subject=" + this.subject + "&questionIdList=" + listJson
}) })
} else if (resp.code === '4001') { } else if (resp.code === '4001') {
uni.showToast({ uni.showToast({
@@ -287,6 +319,7 @@
...param ...param
}).then(async (resp) => { }).then(async (resp) => {
if (resp.code === '0000') { if (resp.code === '0000') {
let arr = []
if (this.token) { if (this.token) {
await this.searchUserVip() await this.searchUserVip()
const result = this.vipOnList.some(item => item.subjects.includes(this.subject)) const result = this.vipOnList.some(item => item.subjects.includes(this.subject))
@@ -296,13 +329,13 @@
}) })
} else { } else {
if (resp.data && resp.data.length > 3) { if (resp.data && resp.data.length > 3) {
const arr = resp.data.slice(0, 3) arr = resp.data.slice(0, 3)
} else { } else {
const arr = resp.data arr = resp.data
} }
const listJson = JSON.stringify(arr) const listJson = JSON.stringify(arr)
uni.navigateTo({ uni.navigateTo({
url: "/pages/questionBank/practiceExams?title=" + title + "&subject=" + this.subject + "&questionIdList=" + listJson+"&needVip="+result url: "/pages/index/videoVip?subject=" + this.subject
}) })
} }
} else { } else {

View File

@@ -94,7 +94,7 @@
} }
}, },
async mounted() { async mounted() {
await this.getDiverType() // await this.getDiverType()
}, },
computed: { computed: {
...mapState(useUserStore, ["vipOnList", "token"]) ...mapState(useUserStore, ["vipOnList", "token"])
@@ -134,9 +134,9 @@
"subject": String(this.subject), "subject": String(this.subject),
"type": "2" "type": "2"
}).then(resp => { }).then(resp => {
if (resp.code === '0000') { if (resp.code === '0000' && resp.data &&resp.data.length) {
this.baseList = resp.data this.baseList = resp.data
this.videoList = resp.data[0] ? resp.data[0].videoList.slice(0, 5) : [] this.videoList = resp.data[0] && resp.data[0].videoList? resp.data[0].videoList.slice(0, 5) : []
} }
}) })
}, },
@@ -148,20 +148,35 @@
const formatSecond = second > 59 ? 59 : second const formatSecond = second > 59 ? 59 : second
return `${hours > 0 ? `${hours}:` : ''}${minute < 10 ? '0' + minute : minute}:${formatSecond < 10 ? '0' + formatSecond : formatSecond}` return `${hours > 0 ? `${hours}:` : ''}${minute < 10 ? '0' + minute : minute}:${formatSecond < 10 ? '0' + formatSecond : formatSecond}`
}, },
toVideo() { async toVideo() {
let arr = JSON.parse(JSON.stringify(this.operateList)) if (this.token) {
arr = arr.map(item => { await this.searchUserVip()
return { const res = this.vipOnList.some(item => item.subjects.includes(this.subject))
...item, if (!res) {
videoUrl: item.videoList[0]?.videoUrl, uni.navigateTo({
videoTime: this.formateTime(item.videoList[0]?.videoTime) url:"/pages/index/videoVip?subject="+this.subject
})
}else{
let arr = JSON.parse(JSON.stringify(this.operateList))
arr = arr.map(item => {
return {
...item,
videoUrl: item.videoList[0]?.videoUrl,
videoTime: this.formateTime(item.videoList[0]?.videoTime)
}
})
let jsonString = JSON.stringify(arr)
console.log('arr',jsonString);
uni.navigateTo({
url: "/pages/questionBank/videoDetail?videoList=" + jsonString + "&subject=" + this.subject +
"&projectId=" + this.projectId + "&type=1&driveType=2"
})
} }
}) } else {
let jsonString = JSON.stringify(arr) uni.redirectTo({
uni.navigateTo({ url: '/pages/login/login'
url: "/pages/questionBank/videoDetail?videoList=" + jsonString + "&subject=" + this.subject + });
"&projectId=" + this.projectId + "&type=1" }
})
}, },
toOperateDetail(val) { toOperateDetail(val) {
let arr = JSON.parse(JSON.stringify(this.baseList[0].videoList)) let arr = JSON.parse(JSON.stringify(this.baseList[0].videoList))
@@ -186,8 +201,10 @@
"subject": String(this.subject), "subject": String(this.subject),
"type": "1" "type": "1"
}).then(resp => { }).then(resp => {
this.operateList = resp.data if(resp.code==='0000'){
this.projectId = this.operateList[0]?.projectId this.operateList = resp.data
this.projectId = this.operateList[0]?.projectId
}
}) })
}, },
getDiverType() { getDiverType() {

View File

@@ -1,11 +1,17 @@
<template> <template>
<view> <view>
<u-loading-page :loading="getLoading" loading-text="题库更新中..."></u-loading-page> <view v-if="getLoading" class="wp100 relative" style="height: 100vh;">
<image class="wp100" mode="widthFix" src="https://oss-bq.ahduima.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%9B%BE%E7%89%87/%E8%80%83%E8%AF%95%E6%8F%90%E9%86%92_20230906135037.png"></image>
<view class="wp100 flex ai-c jc-c" style="position: absolute;bottom: 0;left: 0;padding-bottom: 124rpx;">
<image style="width: 452rpx;" src="https://oss-bq.ahduima.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%9B%BE%E7%89%87/%E9%87%91%E6%AD%A6%E8%81%94_20230831123333.png" mode="widthFix"></image>
</view>
</view>
<view v-if="!getLoading"> <view v-if="!getLoading">
<j-navbar :isBack="false">金武联驾考</j-navbar>
<u-sticky bgColor="#fff"> <u-sticky bgColor="#fff">
<u-tabs :list="categoryList" :current="curTab" :scrollable="false" @change="changeCategory"></u-tabs> <u-tabs :list="categoryList" :current="curTab" :scrollable="false" @change="changeCategory"></u-tabs>
</u-sticky> </u-sticky>
<view style="height: 100vh;background-color: rgb(245, 245, 245);"> <view style="background-color: rgb(245, 245, 245);">
<template v-if="subject=='1' || subject=='4'"> <template v-if="subject=='1' || subject=='4'">
<Subject1 :subject="subject" :rightList="rightList" :wrongList="wrongList" /> <Subject1 :subject="subject" :rightList="rightList" :wrongList="wrongList" />
</template> </template>
@@ -35,6 +41,7 @@
}, },
data() { data() {
return { return {
show:false,
subject: storage.get('curSubject') || '1', subject: storage.get('curSubject') || '1',
curTab: 0, curTab: 0,
searchValue: '', searchValue: '',
@@ -44,22 +51,39 @@
wrongList: storage.get(`wrongList_subject${this.subject}`) || [], wrongList: storage.get(`wrongList_subject${this.subject}`) || [],
}; };
}, },
onLoad() {
this.curTab=Number(this.curSubject)-1
this.getSubjectConfig()
},
onShow() { onShow() {
this.show=true
this.getSubjectConfig()
if (this.subject == '1' || this.subject == '4') { if (this.subject == '1' || this.subject == '4') {
this.rightList = storage.get(`rightList_subject${this.subject}`) || [] this.rightList = storage.get(`rightList_subject${this.subject}`) || []
this.wrongList = storage.get(`wrongList_subject${this.subject}`) || [] this.wrongList = storage.get(`wrongList_subject${this.subject}`) || []
} }
if(this.subject=='2'||this.subject=='3'){
this.$refs.subjectRef.getDiverType()
}
},
onHide(){
this.show=false
}, },
computed: { computed: {
...mapState(useQuestionStore, ["loading_subject4", "loading_subject1","curSubject"]), //映射函数取出tagslist ...mapState(useQuestionStore, ["loading_subject4", "loading_subject1","curSubject","orderQuestion_subject1","orderQuestion_subject4"]), //映射函数取出tagslist
getLoading() { getLoading() {
return this.loading_subject4 && this.loading_subject1 return this.loading_subject4 && this.loading_subject1
} }
}, },
watch:{
getLoading(newVal){
if(this.show){
if(newVal){
if(this.loading_subject4 && this.loading_subject1){
uni.hideTabBar();
}
}else{
uni.showTabBar()
}
}
}
},
methods: { methods: {
...mapActions(useQuestionStore, ['getOrderQuestion_sub4', 'getOrderQuestion_sub1', 'changeSubject']), ...mapActions(useQuestionStore, ['getOrderQuestion_sub4', 'getOrderQuestion_sub1', 'changeSubject']),
//获取科目配置 //获取科目配置
@@ -73,6 +97,8 @@
name: item.configItemName name: item.configItemName
} }
}) })
this.subject=storage.get('curSubject') || '1',
this.curTab=this.categoryList.findIndex(item=>item.configItemCode==this.subject)
} }
}) })
}, },

View File

@@ -0,0 +1,83 @@
<template>
<view class="bc-fff hp100">
<view class="wp100 p14 flex ai-c jc-c">
<view class="text-center">
<view style="width: 64px;height: 64px;border-radius: 50%;overflow: hidden;margin-bottom: 10px;">
<u-avatar class="br-p50 overflow-h" :size="64" mp-avatar shape="circle"></u-avatar>
</view>
<text class="fs18">{{user.userName}}{{ user.userId }}</text>
</view>
</view>
<view class="p14">
<view class="wp100 p14lr p20tb mb14" style="background-color: rgb(248, 248, 248);border-radius: 20rpx;">
<view class="flex ai-c jc-sb pb10">
<text style="color: rgb(175, 175, 175);">考试类型</text>
<text>{{carName}}</text>
</view>
<view class="flex ai-c jc-sb pb10">
<text style="color: rgb(175, 175, 175);">考试标准</text>
<text>{{subject=='1'?100:50}}/45分钟</text>
</view>
<view class="flex ai-c jc-sb pb10">
<text style="color: rgb(175, 175, 175);">合格标准</text>
<text>90分及格(满分100分)</text>
</view>
<view class="flex ai-c jc-sb">
<text style="color: rgb(175, 175, 175);">出题规则</text>
<text>根据公安部出题规则组卷</text>
</view>
</view>
<text>模拟考试不能修改答案每错1题扣{{subject=='1'?1:2}}错题累计超过{{subject=='1'?10:5}}考试不通过</text>
</view>
<view class="p14lr wp100" style="margin-top: 30px;">
<u-button :customStyle="{width: '100%',borderRadius:'40rpx',backgroundColor:'#05C341',color:'#fff'}" text="开始考试"
@click="submit" />
</view>
<view>
</view>
</view>
</template>
<script>
import {
mapState,
mapActions
} from 'pinia' //引入映射函数
import useUserStore from '@/jtools/store/user'
import storage from '@/jtools/storage';
import useQuestionStore from '@/jtools/store/question' //引入store
export default {
data() {
return {
carName:storage.get('carName') ||'小车C1/C2/C3',
questionList: '',
subject:'1',
}
},
onLoad(op) {
if (op.questionIdList) {
this.questionList = op.questionIdList
}
if(op.subject){
this.subject = op.subject
}
},
computed: {
...mapState(useQuestionStore, ["currentCarName"]), //映射函数取出tagslist
user() {
return useUserStore().userInfo
},
},
methods: {
submit(){
uni.navigateTo({
url: "/pages/questionBank/practiceExams?title=模拟考试&subject=" + this.subject + "&questionIdList=" + this.questionList
})
}
}
}
</script>
<style scoped>
</style>

View File

@@ -133,7 +133,7 @@
onLoad(option) { onLoad(option) {
this.subject = option.subject || 1 this.subject = option.subject || 1
if(option.questionIdList){ if(option.questionIdList){
const idList=JSON.parse(op.questionIdList) const idList=JSON.parse(option.questionIdList)
let arr = this[`orderQuestion_subject${this.subject}`].filter(qItem=>idList.includes(qItem.questionId)) let arr = this[`orderQuestion_subject${this.subject}`].filter(qItem=>idList.includes(qItem.questionId))
this.list = arr.map(it => ({ this.list = arr.map(it => ({
...it, ...it,

View File

@@ -1,38 +1,75 @@
<template> <template>
<view class="relative" style="height: 100vh;"> <view class="relative" style="height: 100vh;">
<image style="width: 100%;height: 600rpx;" src="https://oss-bq.ahduima.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%9B%BE%E7%89%87/vip%E9%A1%B5%E8%83%8C%E6%99%AF%E5%9B%BE_20230830214136.png"></image> <view style="height: 100%;overflow: scroll;background-color: #fff;">
<view class="p14"> <image style="width: 100%;height: 600rpx;" src="https://oss-bq.ahduima.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%9B%BE%E7%89%87/vip%E9%A2%98%E5%BA%93_20230911211532.png"></image>
<view class="flex jc-sb ai-c wp100"> <view style="margin-bottom: 100px;">
<view class="option_tem relative" :class="checkedId===item.memberId?'checked_item':''" v-for="(item,index) of priceList" :key="index" @click="checkPrice(item.memberId,item.price)"> <view class="flex jc-fa ai-c wp100 p14">
<text class="fw600 fs12 cor-333">{{item.memberName}}</text> <view style="width: 33.3%;" v-for="(item, index) of priceList" :key="index">
<view class="mt5"> <view class="option_tem relative" :class="checkedId === item.memberId ? 'checked_item' : ''" @click="checkPrice(item.memberId, item.price)">
<text class="fs14" style="color: #FF6E02;">¥</text> <text class="fw600 fs12 cor-333">{{ item.memberName }}</text>
<text class="fs30 fw600" style="color: #FF6E02;">{{item.price}}</text> <view class="mt5" v-if="!isIOS">
</view> <text class="fs14" style="color: #FF6E02;">¥</text>
<text class="fs12 cor-999">长期有效</text> <text class="fs30 fw600" style="color: #FF6E02;">{{ item.price }}</text>
<view class="bottom_box fs12 cor-333" :class="checkedId===item.memberId?'checked_bottom':''">赠送vip题库</view> </view>
<view class="tag" v-if="item.all"> <view v-else class="mt5">
<text style="transform:scale(0.83);">合买更优惠</text> <text class="fs14" style="color: #FF6E02;">iOS暂不支持</text>
</view>
<text class="fs12 cor-999">一年有效</text>
<!-- <view class="bottom_box fs12 cor-333" :class="checkedId===item.memberId?'checked_bottom':''">赠送vip题库</view> -->
<view class="tag" v-if="item.all">
<text style="transform:scale(0.83);">合买更优惠</text>
</view>
</view> </view>
</view>
</view>
<view class="mt15 intr_box">
<view class="fw600 fs16 cor-000">免费获赠<text style="color: #FF6E02;">价值68元</text>的VIP题库</view>
<view class="flex ai-c jc-sb mt15">
<view class="flex ai-c">
<image style="width: 63rpx;height: 63rpx;margin-right: 5px;" src="../../static/image/index/vip500.png"></image>
<view class="vip_item">含精简500题</view>
</view>
<view class="flex ai-c">
<image style="width: 63rpx;height: 63rpx;margin-right: 5px;" src="../../static/image/index/vipmijuan.png"></image>
<view class="vip_item">含考前密卷2套</view>
</view> </view>
</view> </view>
<view class="intr_box p14">
<view class="fw600 fs16 cor-000">尊享以下权益</view>
<view class="flex ai-c jc-sb mt15" v-if="subject == '1' || subject == '4'">
<view class="text-center" style="width: 33%">
<view class="wp100 flex ai-c jc-c mb5">
<image style="width: 63rpx;height: 63rpx;margin-right: 5px;" src="../../static/image/index/vip500.png"></image>
</view>
<text>精简{{ titleNum }}</text>
</view>
<view class="text-center" style="width: 33%;">
<view class="wp100 flex ai-c jc-c mb5">
<image style="width: 63rpx;height: 63rpx;margin-right: 5px;" src="../../static/image/index/vip_trueRoom.png"></image>
</view>
<text>真实考场模拟</text>
</view>
<view class="text-center" style="width: 33%;">
<view class="wp100 flex ai-c jc-c mb5">
<image style="width: 63rpx;height: 63rpx;margin-right: 5px;" src="../../static/image/index/vipmijuan.png"></image>
</view>
<text>考前密卷</text>
</view>
</view>
<view v-else>
<view class="flex ai-c jc-c mt15">
<view class="flex ai-c">
<image style="width: 63rpx;height: 63rpx;margin-right: 5px;" src="../../static/image/index/vip_ksxj.png"></image>
<view class="vip_item">考试项目详解</view>
</view>
</view>
<view class="flex ai-c mt20">
<view class="contain-box relative">
<image class="contain-box" src="https://oss-bq.ahduima.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%9B%BE%E7%89%87/%E5%B0%8F%E8%BD%A6_20230911211545.png"></image>
</view>
<view class="ml15" style="text-align: left;">
<view class="cor-333 fw600">考试项目详解</view>
<view class="fs15 mt10" style="color: #9F826C ;">考试实操技巧讲解事半功倍</view>
</view>
</view>
</view>
</view>
<view class="wp100 mt15" v-if="subject == '1' || subject == '4'">
<image class="wp100" mode="widthFix" :src="picUrl"></image>
</view>
</view> </view>
</view> </view>
<view class="wp100 p14" style="position: absolute;left: 0;bottom:20px" @tap="handlePay()"> <view v-if="!isIOS" class="wp100 p14" style="position: absolute;left: 0;bottom:20px" @tap="handlePay()">
<view class="sub_btn flex ai-c jc-sb"> <view class="sub_btn flex ai-c jc-sb">
<text class="cor-fff fs14">¥<text class="fs24 cor-fff">{{nowPrice}}</text></text> <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> <image style="width: 276rpx;height: 88rpx;margin-top: -5px;" src="../../static/image/index/buy.png"></image>
</view> </view>
</view> </view>
@@ -40,152 +77,197 @@
</template> </template>
<script> <script>
import { import {
mapState, mapState,
mapActions mapActions
} from 'pinia' //引入映射函数 } from 'pinia' //引入映射函数
import { getVipList } from '@/jtools/api/vip' import { getVipList } from '@/jtools/api/vip'
import storage from '@/jtools/storage'; import { querySysConfig } from '@/jtools/api/question';
import Pay from '@/jtools/pay/index.js'; import storage from '@/jtools/storage';
import useUserStore from '@/jtools/store/user' import Pay from '@/jtools/pay/index.js';
export default { import useUserStore from '@/jtools/store/user'
data(){ export default {
return{ data() {
subject:'1', return {
loading:true, picUrl: '',
nowPrice:168, titleNum: 500,
checkedId:0, subject: '1',
priceList:[], loading: true,
order:{ nowPrice: 168,
money:0, checkedId: 0,
description:'会员充值' priceList: [],
} order: {
} money: 0,
}, description: '会员充值'
onLoad(op){
if(op.subject){
this.subject=op.subject
}
this.loading=true
this.getVipList()
this.getWXOpenId()
this.$set(this.order, 'userId', this.userInfo.userId);
},
computed: {
...mapState(useUserStore, ["userInfo"])
},
methods:{
async handlePay(){
if(this.loading){
this.loading=false
await this.getWXOpenId()
new Pay('wechat', this.order);
this.loading=true
}
}, },
getWXOpenId() { isIOS: true
const that = this }
uni.login({ },
success(res) { onLoad(op) {
that.$set(that.order, 'code', res.code); this.isIOS = this.$platform.device().includes('ios')
} if (op.subject) {
}) this.subject = op.subject
}, }
getVipList(){ this.loading = true
getVipList({ this.getVipList()
currentCartype: storage.get('carType') || '1001', this.getWXOpenId()
subject:this.subject this.getTitle()
}).then(resp=>{ this.getPic()
this.priceList=resp.data this.$set(this.order, 'userId', this.userInfo.userId);
this.checkedId=this.priceList[0].memberId },
this.order.outTradeNo=this.priceList[0].memberId computed: {
this.order.money=this.priceList[0].price ...mapState(useUserStore, ["userInfo"])
this.nowPrice=this.priceList[0].price },
this.priceList.forEach(item=>{ methods: {
if(item.subjects.length>1){ getPic() {
item.all=true const currentCartype = storage.get('carType') || '1001'
querySysConfig(currentCartype, 'VipDescImageUrl').then(res => {
this.picUrl = JSON.parse(res.data.configJson).url
})
},
getTitle() {
const carId = storage.get('carType') || '1001'
querySysConfig(carId, 'SimplifyQuestionNum').then(resp => {
if (resp.code === '0000') {
const list = JSON.parse(resp.data.configJson)
this.titleNum = list.find(item => item.subject == this.subject).num
}
})
},
async handlePay() {
if (this.loading) {
this.loading = false
await this.getWXOpenId()
new Pay('wechat', this.order);
this.loading = true
}
},
getWXOpenId() {
const that = this
uni.login({
success(res) {
that.$set(that.order, 'code', res.code);
}
})
},
getVipList() {
getVipList({
carTypeId: storage.get('carType') || '1001',
subject: this.subject
}).then(resp => {
if (resp.code === '0000') {
this.priceList = resp.data
this.checkedId = this.priceList[0].memberId
this.order.outTradeNo = this.priceList[0].memberId
this.order.money = this.priceList[0].price
this.nowPrice = this.priceList[0].price
this.priceList.forEach(item => {
if (item.subjects.length > 1) {
item.all = true
} }
}) })
}) }
}, })
checkPrice(val,price){ },
this.checkedId=val checkPrice(val, price) {
this.order.outTradeNo=val this.checkedId = val
this.nowPrice=price this.order.outTradeNo = val
this.order.money=price this.nowPrice = price
} this.order.money = price
}
} }
}
}
</script> </script>
<style scoped> <style scoped>
.option_tem{ .option_tem {
width: 220rpx; width: 220rpx;
height: 241rpx; height: 241rpx;
text-align: center; text-align: center;
background: #FFFFFF; background: #FFFFFF;
border: 2px solid #D8D8D8; border: 2px solid #D8D8D8;
border-radius: 16rpx 46rpx 16rpx 16rpx; border-radius: 16rpx 46rpx 16rpx 16rpx;
padding: 14px; padding: 14px;
} }
.checked_item{
width: 228rpx; .checked_item {
background: #FFF0E5; background: #FFF0E5;
border: 4px solid #FF6E02; border: 4px solid #FF6E02;
} }
.bottom_box{
width: 214rpx; .bottom_box {
height: 40rpx; width: 214rpx;
line-height: 40rpx; height: 40rpx;
text-align: center; line-height: 40rpx;
background: rgb(239,239,239); text-align: center;
border-radius: 0 0 16rpx 16rpx; background: rgb(239, 239, 239);
position: absolute; border-radius: 0 0 16rpx 16rpx;
bottom: 0; position: absolute;
left: 0; bottom: 0;
} left: 0;
.checked_bottom{ }
width: 218rpx;
border-radius: 0 0 16rpx 5rpx; .checked_bottom {
background-color: #FF6E02; width: 218rpx;
color:#fff border-radius: 0 0 16rpx 5rpx;
} background-color: #FF6E02;
.tag{ color: #fff
padding:0 5px; }
height: 36rpx;
background: linear-gradient(90deg, #E66501 0%, #F8A42C 100%); .tag {
border-radius: 8rpx 20rpx 8rpx 8rpx; padding: 0 5px;
line-height: 36rpx; height: 36rpx;
text-align: center; background: linear-gradient(90deg, #E66501 0%, #F8A42C 100%);
font-size: 12px; border-radius: 8rpx 20rpx 8rpx 8rpx;
color: #FFFC27; line-height: 36rpx;
position: absolute; text-align: center;
left: 10rpx; font-size: 12px;
top:-18rpx color: #FFFC27;
} position: absolute;
.intr_box{ left: 10rpx;
width: 100%; top: -18rpx
text-align: center; }
padding: 40rpx;
background: #FFF0E5; .intr_box {
border-radius: 16rpx; width: 100%;
} text-align: center;
.vip_item{ padding: 40rpx;
width: 208rpx; background: #FFF0E5;
height: 54rpx; border-radius: 16rpx;
line-height: 54rpx; }
text-align: center;
font-size: 14px; .vip_item {
background: #F3D7C2; width: 208rpx;
border-radius: 0rpx 10rpx 10rpx 10rpx; height: 54rpx;
} line-height: 54rpx;
.sub_btn{ text-align: center;
width:100%; font-size: 14px;
height: 110rpx; background: #F3D7C2;
border: 4px solid #F59B26; border-radius: 0rpx 10rpx 10rpx 10rpx;
background: linear-gradient(0deg, #E66501 0%, #F8A42C 100%); }
box-shadow: 0rpx 16rpx 20rpx 1rpx rgba(245,155,38,0.78);
border-radius: 55rpx; .sub_btn {
padding: 14rpx; 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;
}
.contain-box {
width: 344rpx;
height: 196rpx;
background: #00B74F;
border-radius: 16rpx;
}
.play_btn_2 {
width: 65rpx;
height: 65rpx;
position: absolute;
left: 165.5rpx;
top: 78rpx
}
</style> </style>

View File

@@ -13,7 +13,7 @@
<view class="list-call"> <view class="list-call">
<u-input class="sl-input" v-model="login.code" type="text" maxlength="6" border="none" placeholder="输入验证码"> <u-input class="sl-input" v-model="login.code" type="text" maxlength="6" border="none" placeholder="输入验证码">
<template #suffix> <template #suffix>
<text class="fs14 mr10" style="color: #05C341;" @tap="getCode">{{countDown==0?'获取验证码':countDown}}</text> <text class="fs14 mr10" style="color: #05C341;" @tap="getCode">{{ countDown == 0 ? '获取验证码' : countDown }}</text>
</template> </template>
</u-input> </u-input>
</view> </view>
@@ -27,138 +27,142 @@
</template> </template>
<script> <script>
import { import {
isPhone isPhone
} from '@/jtools/utils/validate.js' } from '@/jtools/utils/validate.js'
import { import {
getCode, getCode,
login login
} from '@/jtools/api/login' } from '@/jtools/api/login'
import useUserStore from '@/jtools/store/user' import useUserStore from '@/jtools/store/user'
export default { import storage from '@/jtools/storage';
data() { export default {
return { data() {
login: { return {
phone: '', login: {
code: '' phone: '',
}, code: ''
countDown: 0, },
js: undefined countDown: 0,
}; js: undefined
}, };
onShow() { },
if(useUserStore().isLogin) { onShow() {
this.toHome() if (useUserStore().isLogin) {
} this.toHome()
}, }
methods: { },
getCode() { methods: {
if (isPhone(this.login.phone) && this.countDown == 0) { getCode() {
getCode({ if (isPhone(this.login.phone) && this.countDown == 0) {
phone: this.login.phone getCode({
}).then(resp => { phone: this.login.phone
// if (resp.code == '0000') { }).then(resp => {
uni.showToast({ // if (resp.code == '0000') {
title: '发送成功!', uni.showToast({
icon: 'none' title: '发送成功!',
}) icon: 'none'
this.countDown = 60
this.js = setInterval(() => {
this.countDown--;
if (this.countDown == 0) {
this.clear()
}
}, 1000)
// }
}) })
} this.countDown = 60
}, this.js = setInterval(() => {
clear() { this.countDown--;
clearInterval(js) if (this.countDown == 0) {
this.js = null this.clear()
this.countDown = 0
},
bindLogin() {
if(isPhone(this.login.phone) && this.login.code) {
useUserStore().login(this.login).then(resp => {
if(resp.userId) {
useUserStore().getUserInfo()
useUserStore().searchUserVip()
this.toHome()
} }
}) }, 1000)
} // }
},
toHome() {
uni.switchTab({
url: '/pages/index/index'
}) })
} }
},
clear() {
clearInterval(js)
this.js = null
this.countDown = 0
},
bindLogin() {
if (isPhone(this.login.phone) && this.login.code) {
let params = { ...this.login }
if (storage.get('companyId')) {
params.id = storage.get('companyId')
}
useUserStore().login(params).then(resp => {
if (resp.userId) {
useUserStore().getUserInfo()
useUserStore().searchUserVip()
this.toHome()
}
})
}
},
toHome() {
uni.switchTab({
url: '/pages/index/index'
})
} }
} }
}
</script> </script>
<style> <style>
page { page {
background-color: #fff; background-color: #fff;
} }
.content { .content {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
} }
.header { .header {
margin-top: 166rpx; margin-top: 166rpx;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
letter-spacing: 10rpx; letter-spacing: 10rpx;
} }
.header image { .header image {
width: 383rpx; width: 383rpx;
} }
.list { .list {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding-top: 120rpx; padding-top: 120rpx;
padding-left: 90rpx; padding-left: 90rpx;
padding-right: 90rpx; padding-right: 90rpx;
} }
.list-call { .list-call {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
height: 100rpx; height: 100rpx;
color: #333333; color: #333333;
border-bottom: 0.5px solid #e2e2e2; border-bottom: 0.5px solid #e2e2e2;
} }
.list-call .sl-input { .list-call .sl-input {
flex: 1; flex: 1;
text-align: left; text-align: left;
font-size: 32rpx; font-size: 32rpx;
margin-left: 16rpx; margin-left: 16rpx;
} }
.button-login {
color: #FFFFFF;
font-size: 34rpx;
width: 560rpx;
height: 100rpx;
background: linear-gradient(90deg, #11DF20 0%, #00B74F 100%);
border-radius: 50rpx;
line-height: 100rpx;
text-align: center;
margin-top: 100rpx;
margin-left: auto;
margin-right: auto;
}
.button-login {
color: #FFFFFF;
font-size: 34rpx;
width: 560rpx;
height: 100rpx;
background: linear-gradient(90deg, #11DF20 0%, #00B74F 100%);
border-radius: 50rpx;
line-height: 100rpx;
text-align: center;
margin-top: 100rpx;
margin-left: auto;
margin-right: auto;
}
</style> </style>

View File

@@ -0,0 +1,99 @@
<template>
<view>
<view class="p14">
<view class="wp100 p14lr p20tb bc-fff br8 mb10 relative" style="box-sizing: border-box;" :class="checkedCar==item.carTypeId?'checked':''" v-for="(item,index) of carTypeList" :key="index" @click="changeType(item)">{{item.carName}}{{item.remark}}
<view class="p5 cor-fff fs12 br4" style="background-color:#05C341;position: absolute;right: -1rpx;top:-1rpx" v-if="checkedCar==item.carTypeId">已选</view>
</view>
<view class="wp100" style="margin-top: 40px;">
<u-button :customStyle="{width: '100%',borderRadius:'40rpx',backgroundColor:'#05C341',color:'#fff'}" text="确定"
@click="submit" />
</view>
<u-modal :show="show" title="提示" content="切换题库后上一个题库练习记录将会全部清空,确定要切换吗" showCancelButton @confirm="confirmSubmit" @cancel="cancel"></u-modal>
</view>
</view>
</template>
<script>
import {
mapState,
mapActions
} from 'pinia' //引入映射函数
import {
getCarTypeList,
} from '@/jtools/api/index';
import storage from '@/jtools/storage';
import useQuestionStore from '@/jtools/store/question' //引入store
export default{
data() {
return{
show:false,
carTypeList:[],
checkedCar: storage.get('carType') ||'1001',
checkedCarName:storage.get('carName') || '小车C1/C2/C3'
}
},
mounted() {
this.getCarTypeList()
},
computed:{
...mapState(useQuestionStore, ["loading_subject4", "loading_subject1","curSubject"]), //映射函数取出tagslist
getLoading() {
return this.loading_subject4 && this.loading_subject1
}
},
watch:{
getLoading(newVal){
console.log(newVal);
if(newVal){
uni.hideLoading()
uni.showToast({
title:'切换成功!'
})
this.cancel()
}
}
},
methods:{
getCarTypeList(){
getCarTypeList().then(resp=>{
if(resp.code==='0000'){
this.carTypeList=resp.data
}
})
},
changeType(item){
this.checkedCar=item.carTypeId
this.checkedCarName=item.carName+item.remark
},
submit(){
const id=storage.get('carType') ||'1001'
if(this.checkedCar==id){
uni.showToast({
title:'当前已是该车型题库!',
icon:'error'
})
}else{
this.show=true
}
},
cancel(){
this.show=false
},
confirmSubmit(){
storage.set('carType',this.checkedCar)
storage.set('carName',this.checkedCarName)
uni.showLoading({
title: '加载中'
});
useQuestionStore().resetStorage()
useQuestionStore().getAllQuestion()
}
}
}
</script>
<style scoped>
.checked{
border: 6rpx solid #05C341;
}
</style>

View File

@@ -40,7 +40,7 @@
<view v-if="!isLogin || !vipOn.length" class="text-center"> <view v-if="!isLogin || !vipOn.length" class="text-center">
<view class="fs18 fwb" style="color: #7E4012FF;">开通VIP尊享以下权益</view> <view class="fs18 fwb" style="color: #7E4012FF;">开通VIP尊享以下权益</view>
<view class="fs15" style="color: #7E4012FF;">精选500题 / 真是模考 / 考前密卷</view> <view class="fs15" style="color: #7E4012FF;">精选500题 / 真是模考 / 考前密卷</view>
<view class="study fs16 text-center" style="margin: 25px auto 0;color: #F6E99FFF;">立即开通</view> <view class="study fs16 text-center" style="margin: 25px auto 0;color: #F6E99FFF;">{{ isIOS ? 'iOS暂不可用' : '立即开通' }}</view>
</view> </view>
<view v-else-if="vipOn.length" class="text-center"> <view v-else-if="vipOn.length" class="text-center">
<view class="fs18 fwb" style="color: #7E4012FF;">{{ vipText }}</view> <view class="fs18 fwb" style="color: #7E4012FF;">{{ vipText }}</view>
@@ -81,11 +81,16 @@
<img src="/static/image/mine/wdtj.png" style="width: 24px;height: 24px;"> <img src="/static/image/mine/wdtj.png" style="width: 24px;height: 24px;">
</template> </template>
</u-cell> </u-cell>
<u-cell size="large" title="我的题库" value="小车"> <u-cell size="large" title="我的题库" :value="carName" @tap="toChangeCarType">
<template #icon> <template #icon>
<img src="/static/image/mine/wdtk.png" style="width: 24px;height: 24px;"> <img src="/static/image/mine/wdtk.png" style="width: 24px;height: 24px;">
</template> </template>
</u-cell> </u-cell>
<u-cell size="large" title="联系我们" @tap="callPhoneNumber">
<template #icon>
<img src="/static/image/mine/callme.png" style="width: 24px;height: 24px;">
</template>
</u-cell>
</u-cell-group> </u-cell-group>
</view> </view>
<view v-if="isLogin" 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">
@@ -96,6 +101,7 @@
</template> </template>
<script> <script>
import useUserStore from '@/jtools/store/user' import useUserStore from '@/jtools/store/user'
import storage from '@/jtools/storage';
export default { export default {
components: {}, components: {},
computed: { computed: {
@@ -136,17 +142,35 @@ export default {
}, },
data() { data() {
return { return {
}; carName: storage.get('carName') || '小车C1/C2/C3',
isIOS: true
}
}, },
onShow() { onShow() {
this.isIOS = this.$platform.device().includes('ios')
this.carName = storage.get('carName') || '小车C1/C2/C3'
}, },
methods: { methods: {
// 拨打电话
callPhoneNumber() {
uni.makePhoneCall({
phoneNumber: '15105693067'
});
},
toChangeCarType() {
uni.navigateTo({
url: "/pages/me/changeCarType"
})
},
handleVip() { handleVip() {
if (this.isIOS) {
return
}
if (this.isLogin) { if (this.isLogin) {
// if (this.vipOn.length) { // if (this.vipOn.length) {
uni.navigateTo({ uni.navigateTo({
url: '/pages/me/vip' url: '/pages/me/vip'
}) })
// } else { // } else {
// uni.navigateTo({ // uni.navigateTo({
// url: '/pages/index/videoVip' // url: '/pages/index/videoVip'
@@ -181,8 +205,12 @@ export default {
}, },
handleTJ() { handleTJ() {
if (this.isLogin) { if (this.isLogin) {
uni.navigateTo({ // uni.navigateTo({
url: '/pages/me/tijian' // url: '/pages/me/tijian'
// })
uni.showToast({
title: '敬请期待',
icon: 'none'
}) })
} else { } else {
this.toLogin() this.toLogin()

View File

@@ -1,28 +1,50 @@
<template> <template>
<view class="p15 bc-f5"> <view class="p15 bc-f5">
<view class="br8 bc-fff p15lr"> <view class="br8 bc-fff p15lr">
<view class="flex ai-c bb1" style="height: 110rpx;"> <view class="flex jc-sb ai-c bb1" style="height: 110rpx;">
<view class="title">联系电话</view> <view class="title">联系电话</view>
<view class="m30lr fs14 cor-333 fl1">15122305568</view> <view class="flex">
<u-icon name="arrow-right" color="#999" /> <view class="m30lr fs14 cor-333">15122305568</view>
<u-icon name="arrow-right" color="#999" />
</view>
</view> </view>
<view class="flex ai-c" style="height: 110rpx;"> <view class="flex jc-sb ai-c bb1" style="height: 110rpx;">
<view class="title">地址</view> <view class="title">地址</view>
<view class="m30lr fs14 cor-333 fl1">安徽省合肥市包河区</view> <view class="flex">
<u-icon name="arrow-right" color="#999" /> <view class="m30lr fs14 cor-333">安徽省合肥市包河区</view>
<u-icon name="arrow-right" color="#999" />
</view>
</view> </view>
<!-- <view class="flex jc-sb ai-c bb1" style="height: 110rpx;">
<view class="title">身份证号</view>
<view class="m30lr fs14 cor-333">{{sfzNum}}</view>
</view>
<view class="flex ai-c" style="height: 110rpx;" @tap="toUploadPic">
<view class="title">证件照</view>
<view class="m30lr fs14 cor-333 fl1"></view>
<u-icon name="arrow-right" color="#999" />
</view> -->
</view> </view>
</view> </view>
</template> </template>
<script> <script>
import storage from '@/jtools/storage';
export default { export default {
data() { data() {
return { return {
sfzNum:storage.get('sfzNum') || ''
} }
}, },
onShow(){
this.sfzNum=storage.get('sfzNum') || ''
},
methods: { methods: {
toUploadPic(){
uni.navigateTo({
url: '/pages/me/uploadPic'
})
}
} }
} }
</script> </script>

View File

@@ -24,11 +24,11 @@
<view class="mt20"> <view class="mt20">
<view class="title fontColor">第二步 核实后再提交</view> <view class="title fontColor">第二步 核实后再提交</view>
<u--form labelPosition="left" labelWidth="80" :model="form" :rules="rules" ref="form1"> <u--form labelPosition="left" labelWidth="80" :model="form" :rules="rules" ref="form1">
<u-form-item label="姓名" :required="true" prop="name" borderBottom ref="item1"> <u-form-item label="姓名" :required="true" prop="idCardName" borderBottom ref="item1">
<u--input v-model="form.name" border="none"></u--input> <u--input v-model="form.idCardName" border="none"></u--input>
</u-form-item> </u-form-item>
<u-form-item label="身份证号" :required="true" prop="idNum" borderBottom ref="item2"> <u-form-item label="身份证号" :required="true" prop="sfzmhm" borderBottom ref="item2">
<u--input v-model="form.idNum" border="none"></u--input> <u--input v-model="form.sfzmhm" border="none"></u--input>
</u-form-item> </u-form-item>
</u--form> </u--form>
</view> </view>
@@ -42,6 +42,9 @@
<script> <script>
import storage from '@/jtools/storage'; import storage from '@/jtools/storage';
import {
addInfo,
} from '@/jtools/api/index';
export default { export default {
data() { data() {
const shenfenzhen = (rule, value, callback) => { const shenfenzhen = (rule, value, callback) => {
@@ -50,20 +53,21 @@
} }
return { return {
form: { form: {
name: '', idCardName: '',
idNum: '' sfzmhm: ''
}, },
driverLicenseImg:'',
fileList:[], fileList:[],
fileList1: [], fileList1: [],
uploadList: [], uploadList: [],
saving: false, saving: false,
rules: { rules: {
name: [{ idCardName: [{
required: true, required: true,
message: '请输入姓名', message: '请输入姓名',
trigger: ['blur', 'change'] trigger: ['blur', 'change']
}], }],
idNum: [{ sfzmhm: [{
required: true, required: true,
message: '请输入身份证号', message: '请输入身份证号',
trigger: ['blur', 'change'] trigger: ['blur', 'change']
@@ -78,13 +82,6 @@
}; };
}, },
onReady() { onReady() {
if(storage.get('photoForm')){
this.fileList=storage.get('photoForm').file
this.form={
name: storage.get('photoForm').name,
idNum: storage.get('photoForm').idNum
}
}
this.$refs.form1.setRules(this.rules); this.$refs.form1.setRules(this.rules);
}, },
methods: { methods: {
@@ -95,7 +92,17 @@
}, },
// 新增图片 // 新增图片
async afterRead(event) { async afterRead(event) {
// this.compressImage(event.file); let imageInfoObj = await uni.getImageInfo({src: event.file[0].url})
console.log(imageInfoObj);
if(imageInfoObj.width!=720&&imageInfoObj.height!=720){
uni.showToast({
icon:'error',
title:'证件照尺寸有误'
})
this.fileList=[]
return false
}
this.driverLicenseImg = this.urlTobase64(event.file[0].url)
// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式 // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
const lists = [].concat(event.file); const lists = [].concat(event.file);
this.fileList=lists this.fileList=lists
@@ -129,62 +136,47 @@
this.$refs.form1.validate().then((valid) => { this.$refs.form1.validate().then((valid) => {
if (valid) { if (valid) {
const param={ const param={
file:this.fileList, driverLicenseImg:this.driverLicenseImg,
...this.form ...this.form,
schoolOrgCode:'340103000700',
operater:'1d08daf852cf4ee28f67cb583f538cbf'
} }
storage.set('photoForm',param) addInfo(param).then(resp=>{
uni.showToast({ uni.showToast({
title:"提交成功!", title:"提交成功!",
duration:2000, duration:2000,
})
setTimeout(()=>{
uni.navigateBack()
},1000)
}) })
setTimeout(()=>{
uni.navigateBack()
},1000)
} else { } else {
console.log('验证失败'); console.log('验证失败');
} }
}); });
}, },
async compressImage(image) { urlTobase64(url){
const img = new Image(); let base64=''
img.src = image.url; console.log(url);
return new Promise((resolve, reject) => {
img.onload = async () => { uni.getFileSystemManager().readFile({
const canvas = document.createElement('canvas'); // 创建Canvas对象(画布) filePath: url, //选择图片返回的相对路径
const context = canvas.getContext('2d'); encoding: 'base64', //编码格式
// 默认按比例压缩 success: res => { //成功的回调
const cw = img.width; console.log(res);
const ch = img.height; base64 = 'data:image/jpeg;base64,' + res.data //不加上这串字符,在页面无法显示的哦
let w = img.width; resolve(base64);
let h = img.height; },fail: (e) => {
canvas.width = w; console.log("图片转换失败");
canvas.height = h; reject(e)
if (cw > 400 && cw > ch) { }
w = 400; })
h = (400 * ch) / cw; });
canvas.width = w;
canvas.height = h;
}
if (ch > 400 && ch > cw) {
h = 400;
w = (400 * cw) / ch;
canvas.width = w;
canvas.height = h;
}
// 生成canvas
let base64;
// 创建属性节点
context.clearRect(0, 0, 0, w, h);
context.drawImage(img, 0, 0, w, h);
if (image.size > 2000000) {
// 如果图片超过2m,则进行压缩
base64 = canvas.toDataURL(image['type'], 0.5);
}
const result = await this.uploadFilePromise(base64 || image.url);
this.uploadList.push(result);
};
} }
} }
}; };
</script> </script>

View File

@@ -5,36 +5,36 @@
<view class="mt15"> <view class="mt15">
<!-- <u-upload width="165" height="165" :file-list=" fileList1" multiple :max-count="1" @afterRead="afterRead" @delete="deletePic" /> --> <!-- <u-upload width="165" height="165" :file-list=" fileList1" multiple :max-count="1" @afterRead="afterRead" @delete="deletePic" /> -->
<!-- <u-upload ref="uUpload" class="mt25" :size-type="['compressed']" :file-list="fileList1" deletable :multiple="false" :max-count="1" width="165rpx" height="165rpx" @afterRead="afterRead" @delete="deletePic" /> --> <!-- <u-upload ref="uUpload" class="mt25" :size-type="['compressed']" :file-list="fileList1" deletable :multiple="false" :max-count="1" width="165rpx" height="165rpx" @afterRead="afterRead" @delete="deletePic" /> -->
<view style="width: 320rpx;height:300rpx;background-color: rgb(247, 255, 255);border-radius: 20rpx;"> <view style="width: 320rpx;height:300rpx;background-color: rgb(247, 255, 255);border-radius: 20rpx;">
<view style="width: 320rpx;height:240rpx;" class="flex jc-c ai-c"> <view style="width: 320rpx;height:240rpx;" class="flex jc-c ai-c">
<image v-if="fileList1&&fileList1.length" style="width: 240rpx;height: 240rpx;" :src="fileList1[0].url"> <image v-if="fileList&&fileList.length" style="width: 240rpx;height: 240rpx;" :src="fileList[0].url">
</image> </image>
<u-avatar v-else class="br-p50 overflow-h" :size="64" mp-avatar shape="circle"></u-avatar> <u-avatar v-else class="br-p50 overflow-h" :size="64" mp-avatar shape="circle"></u-avatar>
</view> </view>
<u-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" multiple :maxCount="1" width="150" <u-upload :fileList="fileList1" :maxSize="500 * 1024" @oversize="oversize" @afterRead="afterRead"
height="150"> @delete="deletePic" multiple :maxCount="1" width="150" height="150">
<view <view
style="width: 320rpx;height:60rpx;line-height:60rpx;background-color: #3C9CFF;border-radius: 0 0 20rpx 20rpx;" style="width: 320rpx;height:60rpx;line-height:60rpx;background-color: #05C341;border-radius: 0 0 20rpx 20rpx;"
class="text-center cor-fff"> class="text-center cor-fff">
点击 点击
</view> </view>
</u-upload> </u-upload>
</view> </view>
</view> </view>
<view class="mt20"> <view class="mt20">
<view class="title fontColor">第二步 核实后再提交</view> <view class="title fontColor">第二步 核实后再提交</view>
<u--form labelPosition="left" labelWidth="80" :model="form" :rules="rules" ref="form1"> <u--form labelPosition="left" labelWidth="80" :model="form" :rules="rules" ref="form1">
<u-form-item label="姓名" :required="true" prop="name" borderBottom ref="item1"> <u-form-item label="姓名" :required="true" prop="idCardName" borderBottom ref="item1">
<u--input v-model="form.name" border="none"></u--input> <u--input v-model="form.idCardName" border="none"></u--input>
</u-form-item> </u-form-item>
<u-form-item label="身份证号" :required="true" prop="idNum" borderBottom ref="item2"> <u-form-item label="身份证号" :required="true" prop="sfzmhm" borderBottom ref="item2">
<u--input v-model="form.idNum" border="none"></u--input> <u--input v-model="form.sfzmhm" border="none"></u--input>
</u-form-item> </u-form-item>
</u--form> </u--form>
</view> </view>
<view style="margin-top: 20px;"> <view style="margin-top: 20px;">
<u-button type="primary" :style="{width: '100%',borderRadius:'40rpx'}" :disabled="saving" text="提交" <u-button type="primary" :style="{width: '100%',borderRadius:'40rpx',backgroundColor:'#05C341'}"
@click="submit" /> :disabled="saving" text="提交" @click="submit" />
</view> </view>
</view> </view>
</view> </view>
@@ -42,6 +42,9 @@
<script> <script>
import storage from '@/jtools/storage'; import storage from '@/jtools/storage';
import {
addInfo,
} from '@/jtools/api/index';
export default { export default {
data() { data() {
const shenfenzhen = (rule, value, callback) => { const shenfenzhen = (rule, value, callback) => {
@@ -50,23 +53,25 @@
} }
return { return {
form: { form: {
name: '', idCardName: '',
idNum: '' sfzmhm: storage.get('sfzNum') || ''
}, },
driverLicenseImg: '',
fileList: [],
fileList1: [], fileList1: [],
uploadList: [], uploadList: [],
saving: false, saving: false,
rules: { rules: {
name: [{ idCardName: [{
required: true, required: true,
message: '请输入姓名', message: '请输入姓名',
trigger: ['blur', 'change'] trigger: ['blur', 'change']
}], }],
idNum: [{ sfzmhm: [{
required: true, required: true,
message: '请输入身份证号', message: '请输入身份证号',
trigger: ['blur', 'change'] trigger: ['blur', 'change']
},{ }, {
// 自定义验证函数,见上说明 // 自定义验证函数,见上说明
validator: shenfenzhen, validator: shenfenzhen,
message: '身份证号码不正确', message: '身份证号码不正确',
@@ -77,17 +82,17 @@
}; };
}, },
onReady() { onReady() {
console.log(storage.get('photoForm'));
if(storage.get('photoForm')){
this.fileList1=storage.get('photoForm').file
this.form={
name: storage.get('photoForm').name,
idNum: storage.get('photoForm').idNum
}
}
this.$refs.form1.setRules(this.rules); this.$refs.form1.setRules(this.rules);
}, },
methods: { methods: {
// 文件超出大小限制
oversize() {
uni.showToast({
title: "图片最大不能超过500k",
icon: 'none'
})
},
// 删除图片 // 删除图片
deletePic(event) { deletePic(event) {
this.fileList1.splice(event.index, 1); this.fileList1.splice(event.index, 1);
@@ -95,95 +100,94 @@
}, },
// 新增图片 // 新增图片
async afterRead(event) { async afterRead(event) {
// this.compressImage(event.file); let imageInfoObj = await uni.getImageInfo({
src: event.file[0].url
})
console.log(imageInfoObj);
if (imageInfoObj.width != 260 && imageInfoObj.height != 378) {
uni.showToast({
icon: 'error',
title: '证件照尺寸有误'
})
this.fileList = []
return false
}
this.driverLicenseImg = await this.urlTobase64(event.file[0].url)
// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式 // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
const lists = [].concat(event.file); const lists = [].concat(event.file);
this.fileList1 = lists; this.fileList = lists
this.fileList1 = [];
uni.showToast({ uni.showToast({
title:'上传成功!' title: '上传成功!'
}) })
}, },
uploadFilePromise(url) {
this.saving = true;
return new Promise((resolve, reject) => {
uni.uploadFile({
url: process.env.VUE_APP_BASE_API + 'mongodb/uploadFile', // 仅为示例,非真实的接口地址
filePath: url,
name: 'file',
success: (res) => {
// setTimeout(() => {
resolve(JSON.parse(res.data).data);
// }, 100);
this.saving = false;
},
fail: () => {
resolve(null);
this.saving = false;
}
});
});
},
// 提交 // 提交
submit() { submit() {
this.$refs.form1.validate().then((valid) => { this.$refs.form1.validate().then((valid) => {
if (valid) { if (valid) {
const param={ const param = {
file:this.fileList1, driverLicenseImg: this.driverLicenseImg,
...this.form ...this.form,
schoolOrgCode: '340103000700',
operater: '1d08daf852cf4ee28f67cb583f538cbf'
} }
storage.set('photoForm',param) storage.set('sfzNum', this.form.sfzmhm)
uni.showToast({ uni.request({
title:"提交成功!", url: 'https://www.hfcgs.cn:20223/driver/addInfo',
duration:2000, method: 'POST',
}) data: param,
setTimeout(()=>{ success: res => {
uni.navigateBack() console.log(res);
},1000) uni.showToast({
title: "提交成功!",
duration: 2000,
})
setTimeout(() => {
uni.navigateBack()
}, 1000)
},
fail: () => {},
});
// addInfo(param).then(resp=>{
// if(resp.code==='0000'){
// uni.showToast({
// title:"提交成功!",
// duration:2000,
// })
// setTimeout(()=>{
// uni.navigateBack()
// },1000)
// }
// })
} else { } else {
console.log('验证失败'); console.log('验证失败');
} }
}); });
}, },
async compressImage(image) { urlTobase64(url) {
const img = new Image(); let base64 = ''
img.src = image.url; console.log(url);
return new Promise((resolve, reject) => {
img.onload = async () => { uni.getFileSystemManager().readFile({
const canvas = document.createElement('canvas'); // 创建Canvas对象(画布) filePath: url, //选择图片返回的相对路径
const context = canvas.getContext('2d'); encoding: 'base64', //编码格式
// 默认按比例压缩 success: res => { //成功的回调
const cw = img.width; console.log(res);
const ch = img.height; base64 = 'data:image/jpeg;base64,' + res.data //不加上这串字符,在页面无法显示的哦
let w = img.width; resolve(base64);
let h = img.height; },
canvas.width = w; fail: (e) => {
canvas.height = h; console.log("图片转换失败");
if (cw > 400 && cw > ch) { reject(e)
w = 400; }
h = (400 * ch) / cw; })
canvas.width = w; });
canvas.height = h;
}
if (ch > 400 && ch > cw) {
h = 400;
w = (400 * cw) / ch;
canvas.width = w;
canvas.height = h;
}
// 生成canvas
let base64;
// 创建属性节点
context.clearRect(0, 0, 0, w, h);
context.drawImage(img, 0, 0, w, h);
if (image.size > 2000000) {
// 如果图片超过2m,则进行压缩
base64 = canvas.toDataURL(image['type'], 0.5);
}
const result = await this.uploadFilePromise(base64 || image.url);
this.uploadList.push(result);
};
} }
} }
}; };
</script> </script>
@@ -214,4 +218,9 @@
::v-deep .u-button--square { ::v-deep .u-button--square {
border-radius: 40rpx !important; border-radius: 40rpx !important;
} }
::v-deep .u-button--primary {
background-color: #05C341 !important;
border-color: #05C341 !important;
}
</style> </style>

View File

@@ -1,345 +1,393 @@
<template> <template>
<view class="flex fld-c p15"> <view>
<u-sticky> <u-loading-page :loading="getLoading" loading-text="题库更新中..."></u-loading-page>
<view class="flex ai-c"> <view class="flex fld-c p15" v-if="!getLoading">
<view v-for="(item, index) in vipAllList" :key="index" class="km-item" :class="{ actived: index == current }" <u-sticky>
@click="current = index"> <view class="flex ai-c">
{{ getKmTitle(item.subjects) }} <view v-for="(item, index) in vipAllList" :key="index" class="km-item" :class="{ actived: index == current }"
</view> @click="current = index">
</view> {{ getKmTitle(item.subjects) }}
</u-sticky> </view>
<view class="mt15"> </view>
<swiper class="swiper" :current="current" style="height: 120px;" :autoplay="false" :display-multiple-items="1.45" </u-sticky>
:disable-programmatic-animation="true" @change="onChange"> <view class="mt15">
<swiper-item v-for="(item, index) in vipAllList" :key="index"> <swiper class="swiper" :current="current" style="height: 120px;" :autoplay="false"
<view class="relative" style="background-image: url(https://oss-bq.ahduima.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%9B%BE%E7%89%87/vip%E8%83%8C%E6%99%AF_20230831010348.png);width: 95%;height: 204rpx;background-size: 100% 100%;"> :display-multiple-items="1.45" :disable-programmatic-animation="true" @change="onChange">
<!-- <image src="" mode="widthFix" style="width:95%;"></image> --> <swiper-item v-for="(item, index) in vipAllList" :key="index">
<view class="vip-info"> <view class="relative"
<u-avatar class="br-p50 overflow-h" style="border: 3px solid #873E1D;" :size="35" mp-avatar></u-avatar> style="background-image: url(https://oss-bq.ahduima.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%9B%BE%E7%89%87/vip%E8%83%8C%E6%99%AF_20230831010348.png);width: 95%;height: 204rpx;background-size: 100% 100%;">
<view class="ml10"> <!-- <image src="" mode="widthFix" style="width:95%;"></image> -->
<view class="fs16 fwb" style="color: #7E4012;line-height: 16px;"> <view class="vip-info">
{{ item.memberName }} <u-avatar class="br-p50 overflow-h" style="border: 3px solid #873E1D;" :size="35" mp-avatar></u-avatar>
</view> <view class="ml10">
<view class="mt5 fs12" style="color: #7E4012;line-height: 12px;"> <view class="fs16 fwb" style="color: #7E4012;line-height: 16px;">
{{ getExpireText(item) }} {{ item.memberName }}
</view> </view>
</view> <view class="mt5 fs12" style="color: #7E4012;line-height: 12px;">
</view> {{ getExpireText(item) }}
<view v-if="vipHasOpened(item)" class="corner"> </view>
VIP已开通 </view>
</view> </view>
<view v-if="vipHasOpened(item)" @tap="chargeVip(item)" class="renew"> <view v-if="vipHasOpened(item)" class="corner">
{{ item.price }}元立即续费 VIP已开通
</view> </view>
<view v-else class="buy" @tap="chargeVip(item)"> <view v-if="vipHasOpened(item)" @tap="chargeVip(item)" class="renew">
立即充值 {{ item.price }}元立即续费
</view> </view>
</view> <view v-else class="buy" @tap="chargeVip(item)">
</swiper-item> 立即充值
<swiper-item> </view>
</swiper-item> </view>
</swiper> </swiper-item>
</view> <swiper-item>
<view class="mt20"> </swiper-item>
<swiper class="swiper" :current="current" style="height: 300px;" :autoplay="false" </swiper>
:disable-programmatic-animation="true" @change="onChange"> </view>
<swiper-item v-for="(item, index) in vipAllList" :key="index"> <view class="mt20">
<view v-if="index == 0 || index == 3" class="p15 br8 cor-fff bc-fff"> <swiper class="swiper" :current="current" style="height: 300px;" :autoplay="false"
<view class="fs18 cor-000 fwb"> :disable-programmatic-animation="true" @change="onChange">
3步轻松学{{ getKmTitle(item.subjects) }} <swiper-item v-for="(item, index) in vipAllList" :key="index">
</view> <view v-if="index == 0 || index == 3" class="p15 br8 cor-fff bc-fff">
<view class="mt25 flex ai-c jc-sb"> <view class="fs18 cor-000 fwb">
<view class="flex ai-c"> 3步轻松学{{ getKmTitle(item.subjects) }}
<image src="../../static/image/mine/1.png" mode="widthFix" style="width:25px;"></image> </view>
<view class="ml7"> <view class="mt25 flex ai-c jc-sb">
<view class="fs16 cor-000 fwb" style="line-height: 16px;"> <view class="flex ai-c">
精简500题 <image src="../../static/image/mine/1.png" mode="widthFix" style="width:25px;"></image>
</view> <view class="ml7">
<view class="mt7 fs12 cor-666" style="line-height: 12px;"> <view class="fs16 cor-000 fwb" style="line-height: 16px;">
题目全部做对视为完成 精简500题
</view> </view>
</view> <view class="mt7 fs12 cor-666" style="line-height: 12px;">
</view> 题目全部做对视为完成
<view class="study" @tap="to500(item)"> </view>
去学习 </view>
</view> </view>
</view> <view class="study" @tap="to500(item)">
<view class="mt45 flex ai-c jc-sb"> 去学习
<view class="flex ai-c"> </view>
<image src="../../static/image/mine/2.png" mode="widthFix" style="width:25px;"></image> </view>
<view class="ml7"> <view class="mt45 flex ai-c jc-sb">
<view class="fs16 cor-000 fwb" style="line-height: 16px;"> <view class="flex ai-c">
真实考场模拟 <image src="../../static/image/mine/2.png" mode="widthFix" style="width:25px;"></image>
</view> <view class="ml7">
<view class="mt7 fs12 cor-666" style="line-height: 12px;"> <view class="fs16 cor-000 fwb" style="line-height: 16px;">
10次95分以上视为完成 真实考场模拟
</view> </view>
</view> <view class="mt7 fs12 cor-666" style="line-height: 12px;">
</view> 10次95分以上视为完成
<view class="study" @tap="toRealExam(item)"> </view>
去学习 </view>
</view> </view>
</view> <view class="study" @tap="toRealExam(item)">
<view class="mt45 flex ai-c jc-sb"> 去学习
<view class="flex ai-c"> </view>
<image src="../../static/image/mine/3.png" mode="widthFix" style="width:25px;"></image> </view>
<view class="ml7"> <view class="mt45 flex ai-c jc-sb">
<view class="fs16 cor-000 fwb" style="line-height: 16px;"> <view class="flex ai-c">
考前密卷 <image src="../../static/image/mine/3.png" mode="widthFix" style="width:25px;"></image>
</view> <view class="ml7">
<view class="mt7 fs12 cor-666" style="line-height: 12px;"> <view class="fs16 cor-000 fwb" style="line-height: 16px;">
2套试卷95分以上视为完成 考前密卷
</view> </view>
</view> <view class="mt7 fs12 cor-666" style="line-height: 12px;">
</view> 2套试卷95分以上视为完成
<view class="study" @tap="toSpecExam(item)"> </view>
去学习 </view>
</view> </view>
</view> <view class="study" @tap="toSpecExam(item)">
</view> 去学习
<view v-else style="margin-top: 30rpx;"> </view>
<view class="video-box"> </view>
<view class="flex jc-sb ai-c wp100"> </view>
<text style="color: #873E1D;font-size: 36rpx;">考场实况</text> <view v-else style="margin-top: 30rpx;">
<text class="cor-666 fs12">全部 ></text> <view class="video-box">
</view> <view class="flex jc-sb ai-c wp100">
<view class="flex ai-c mt20"> <text style="color: #873E1D;font-size: 36rpx;">考场实况</text>
<view class="contain-box relative"> <text class="cor-666 fs12">全部 ></text>
<image class="contain-box" src="../../../static/image/index/jpsp.png"></image> </view>
<image class="play_btn_2" src="../../static/image/index/play.png" /> <view class="flex ai-c mt20">
</view> <view class="contain-box relative">
<view class="ml15 text-center"> <image class="contain-box" src="../../../static/image/index/jpsp.png"></image>
<u-button :customStyle="{width:'200rpx',height:'66rpx',borderRadius: '33rpx'}" iconColor="#fff" <image class="play_btn_2" src="../../static/image/index/play.png" />
text="去看视频" color="linear-gradient(90deg, #E66501 0%, #F8A42C 100%)" icon="play-circle" @click="toPlaceLive(item)"> </view>
</u-button> <view class="ml15 text-center">
<view class="cor-333 fs15 fw600 mt10">真实考场模拟</view> <u-button :customStyle="{width:'200rpx',height:'66rpx',borderRadius: '33rpx'}" iconColor="#fff"
</view> text="去看视频" color="linear-gradient(90deg, #E66501 0%, #F8A42C 100%)" icon="play-circle"
</view> @click="toPlaceLive(item)">
</view> </u-button>
</view> <view class="cor-333 fs15 fw600 mt10">真实考场模拟</view>
</swiper-item> </view>
</swiper> </view>
</view> </view>
</view> </view>
</swiper-item>
</swiper>
</view>
</view>
</view>
</template> </template>
<script> <script>
import useUserStore from '@/jtools/store/user' import {
export default { mapState,
computed: { mapActions
vipAllList() { } from 'pinia' //引入映射函数
return useUserStore().vipAllList.filter(it => [1, 2, 3, 4].includes(Number(it.subjects))) import useQuestionStore from '@/jtools/store/question' //引入store
}, import useUserStore from '@/jtools/store/user'
vipOnList() { import {
return useUserStore().vipOnList queryQuestionId,
}, getTestQuestionId
} from '@/jtools/api/question';
import storage from '@/jtools/storage';
export default {
computed: {
...mapState(useQuestionStore, ["loading_subject4", "loading_subject1", "version"]), //映射函数取出tagslist
getLoading() {
return this.loading_subject4 && this.loading_subject1
},
vipAllList() {
return useUserStore().vipAllList.filter(it => [1, 2, 3, 4].includes(Number(it.subjects)))
},
vipOnList() {
return useUserStore().vipOnList
},
},
data() {
return {
current: 0
}
},
methods: {
chargeVip(item){
uni.navigateTo({
url:"/pages/index/videoVip?subject="+item.subjects
})
}, },
onChange(e) { data() {
this.current = e.detail.current return {
}, current: 0
getKmTitle(km) { }
return { },
'1': '科一', methods: {
'2': '科二', ...mapActions(useQuestionStore, ['getOrderQuestion_sub1', 'getOrderQuestion_sub4', 'getAllQuestion']),
'3': '科三', chargeVip(item) {
'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.some(it => it.subjects.includes(item.subjects) )
},
// 去精选500题 item=> 当前科目vip信息
to500(item) {
// 当前vip是否已开通
if (this.vipHasOpened(item)) {
// 跳转
uni.navigateTo({ uni.navigateTo({
url:"/pages/questionBank/questionBank?navTitle=精简500题&subject="+item.subjects+"&needVip=true&isVip=1" url: "/pages/index/videoVip?subject=" + item.subjects
}) })
} else { },
uni.showToast({ onChange(e) {
title: `请先充值${this.getKmTitle(item.subjects)}vip`, this.current = e.detail.current
icon: 'none' },
}) getKmTitle(km) {
} return {
}, '1': '科一',
// 去真实考场 item=> 当前科目vip信息 '2': '科二',
toRealExam(item) { '3': '科三',
// 当前vip是否已开通 '4': '科四',
if (this.vipHasOpened(item)) { } [km]
// 跳转 },
uni.navigateTo({ getExpireText(item) {
url: "/pages/index/trueTest?subject="+item.subjects const vipOn = this.vipOnList.find(it => it.memberId == item.memberId)
}) if (vipOn) {
} else { return `${vipOn.endDate.split(' ')[0]}到期`
uni.showToast({ } else {
title: `请先充值${this.getKmTitle(item.subjects)}vip`, return '开通vip助您快速拿证'
icon: 'none' }
}) },
} vipHasOpened(item) {
}, ;
// 去秘卷 item=> 当前科目vip信息 return !!this.vipOnList.some(it => it.subjects.includes(item.subjects))
toSpecExam(item) { },
// 当前vip是否已开通 // 去精选500题 item=> 当前科目vip信息
if (this.vipHasOpened(item)) { to500(item) {
// 跳转 // 当前vip是否已开通
uni.navigateTo({ if (this.vipHasOpened(item)) {
url:"/pages/questionBank/practiceExams?subject="+item.subjects+'&title=考前密卷&isExam1=1' // 跳转
}) queryQuestionId({
} else { versionId: this.version,
uni.showToast({ carTypeId: storage.get('carType') || '1001',
title: `请先充值${this.getKmTitle(item.subjects)}vip`, subject: item.subjects,
icon: 'none' isVip: '1'
}) }).then(async (resp) => {
} if (resp.code === '0000') {
}, const arr = resp.data
// 去考场实况 item=> 当前科目vip信息 if (arr && arr.length) {
toPlaceLive(item) { const listJson = JSON.stringify(arr)
// 当前vip是否已开通 uni.navigateTo({
if (this.vipHasOpened(item)) { url: "/pages/questionBank/questionBank?navTitle=精简500题&subject=" + item.subjects +
// 跳转 "&questionIdList=" + listJson
uni.showToast({ })
title:'敬请期待', } else {
icon:'none' uni.showToast({
}) title: '暂无题目',
} else { icon: 'none'
uni.showToast({ })
title: `请先充值${this.getKmTitle(item.subjects)}vip`, }
icon: 'none' } else if (resp.code === '4001') {
}) uni.showToast({
} title: '当前题库非最新版,请更新~',
} icon: 'none'
} })
} this.getAllQuestion()
}
})
} else {
uni.showToast({
title: `请先充值${this.getKmTitle(item.subjects)}vip`,
icon: 'none'
})
}
},
// 去真实考场 item=> 当前科目vip信息
toRealExam(item) {
// 当前vip是否已开通
if (this.vipHasOpened(item)) {
// 跳转
uni.navigateTo({
url: "/pages/index/trueTest?subject=" + item.subjects
})
} else {
uni.showToast({
title: `请先充值${this.getKmTitle(item.subjects)}vip`,
icon: 'none'
})
}
},
// 去秘卷 item=> 当前科目vip信息
toSpecExam(item) {
// 当前vip是否已开通
if (this.vipHasOpened(item)) {
// 跳转
uni.navigateTo({
url: "/pages/index/secretPapers?subject=" + item.subjects
})
} else {
uni.showToast({
title: `请先充值${this.getKmTitle(item.subjects)}vip`,
icon: 'none'
})
}
},
// 去考场实况 item=> 当前科目vip信息
toPlaceLive(item) {
// 当前vip是否已开通
if (this.vipHasOpened(item)) {
// 跳转
uni.showToast({
title: '敬请期待',
icon: 'none'
})
} else {
uni.showToast({
title: `请先充值${this.getKmTitle(item.subjects)}vip`,
icon: 'none'
})
}
}
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.km-item { .km-item {
margin-right: 8px; margin-right: 8px;
width: 72px; width: 72px;
height: 30px; height: 30px;
line-height: 30px; line-height: 30px;
font-size: 12px; font-size: 12px;
color: #333; color: #333;
text-align: center; text-align: center;
border-radius: 15px; border-radius: 15px;
border: 1px solid #CCCCCC; border: 1px solid #CCCCCC;
} }
.actived { .actived {
background: linear-gradient(90deg, #E66501 0%, #F8A42C 100%); background: linear-gradient(90deg, #E66501 0%, #F8A42C 100%);
color: #fff; color: #fff;
} }
.km-item:last-of-type { .km-item:last-of-type {
margin-right: 0; margin-right: 0;
} }
.vip-info { .vip-info {
position: absolute; position: absolute;
top: 15px; top: 15px;
left: 10px; left: 10px;
display: flex; display: flex;
align-items: center; align-items: center;
z-index: 1; z-index: 1;
} }
.corner { .corner {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
left: 0; left: 0;
width: 77px; width: 77px;
height: 23px; height: 23px;
background: linear-gradient(0deg, #E66501 0%, #F8A42C 100%); background: linear-gradient(0deg, #E66501 0%, #F8A42C 100%);
opacity: 0.86; opacity: 0.86;
border-radius: 0px 8px 0px 8px; border-radius: 0px 8px 0px 8px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
font-size: 12px; font-size: 12px;
color: #fff; color: #fff;
z-index: 1; z-index: 1;
} }
.renew { .renew {
position: absolute; position: absolute;
right: 10%; right: 10%;
bottom: 15px; bottom: 15px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
width: 185rpx; width: 185rpx;
height: 52rpx; height: 52rpx;
background: #873E1D; background: #873E1D;
border-radius: 26rpx; border-radius: 26rpx;
font-size: 12px; font-size: 12px;
color: #F6E99F; color: #F6E99F;
z-index: 1; z-index: 1;
} }
.buy { .buy {
position: absolute; position: absolute;
left: 45%; left: 45%;
transform: translateX(-50%); transform: translateX(-50%);
bottom: 15px; bottom: 15px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
width: 200rpx; width: 200rpx;
height: 60rpx; height: 60rpx;
background: #873E1D; background: #873E1D;
border-radius: 30rpx; border-radius: 30rpx;
font-size: 14px; font-size: 14px;
color: #F6E99F; color: #F6E99F;
z-index: 1; z-index: 1;
} }
.study { .study {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
width: 161rpx; width: 161rpx;
height: 67rpx; height: 67rpx;
background: #F6E99F; background: #F6E99F;
border-radius: 34rpx; border-radius: 34rpx;
font-size: 12px; font-size: 12px;
color: #873E1D; color: #873E1D;
} }
.video-box {
padding: 20rpx;
width: 694rpx;
height: 369rpx;
background: #F9F3E7;
border: 2rpx solid #CF8B6D;
border-radius: 16rpx;
}
.video-box {
padding: 20rpx;
width: 694rpx;
height: 369rpx;
background: #F9F3E7;
border: 2rpx solid #CF8B6D;
border-radius: 16rpx;
}
.contain-box { .contain-box {
width: 406rpx; width: 406rpx;
height: 228rpx; height: 228rpx;
background: #00B74F; background: #00B74F;
border-radius: 16rpx; border-radius: 16rpx;
} }
.play_btn_2 { .play_btn_2 {
width: 65rpx; width: 65rpx;
height: 65rpx; height: 65rpx;

View File

@@ -49,11 +49,18 @@
...param, ...param,
}).then(async (resp) => { }).then(async (resp) => {
if (resp.code === '0000') { if (resp.code === '0000') {
const arr = resp.data if(resp.data&&resp.data.length){
const listJson = JSON.stringify(arr) const arr = resp.data
uni.navigateTo({ const listJson = JSON.stringify(arr)
url: "/pages/questionBank/questionBank?navTitle=" + title + "&subject=" + this.subject + "&questionIdList=" + listJson uni.navigateTo({
}) url: "/pages/questionBank/questionBank?navTitle=" + title + "&subject=" + this.subject + "&questionIdList=" + listJson
})
}else{
uni.showToast({
title: '暂无题目',
icon: 'none'
})
}
}else if (resp.code === '4001') { }else if (resp.code === '4001') {
uni.showToast({ uni.showToast({
title: '当前题库非最新版,请更新~', title: '当前题库非最新版,请更新~',

View File

@@ -7,18 +7,19 @@
:class="tCurrent==item.value?'checked':'unchecked'" @tap="sectionChange(item.value)">{{item.label}}</view> :class="tCurrent==item.value?'checked':'unchecked'" @tap="sectionChange(item.value)">{{item.label}}</view>
</view> </view>
</view> </view>
<swiper class="swiper mt20" :current="swiperIndex" :duration="duration" :autoplay="false" <swiper class="swiper mt20" :current="swiperIndex" :duration="duration" :autoplay="false" @change="onChange"
:disable-programmatic-animation="true" @change="onChange" @animationfinish="onAnimationfinish" @animationfinish="onAnimationfinish" @touchend="touchEnd">
@touchend="touchEnd"> <swiper-item v-for="(quesItem,quesIndex) in swiperList" :key="quesIndex.questionId">
<swiper-item v-for="(quesItem,quesIndex) in swiperList" :key="quesIndex">
<scroll-view scroll-y="true" class="swiper-scroll"> <scroll-view scroll-y="true" class="swiper-scroll">
<view> <view>
<view class="m14lr"> <view class="m14lr">
<text class="tag_box">{{getQuestType(quesItem.type)}}</text> <text class="tag_box">{{getQuestType(quesItem.type)}}</text>
<text class="fs18" style="line-height: 42rpx;vertical-align: middle;">{{quesItem.question}}</text> <text class="fs18" style="line-height: 42rpx;vertical-align: middle;">{{quesItem.question}}</text>
</view> </view>
<view class="p14" v-if="quesItem.imageUrl"> <view class="p14 flex jc-c ai-c" v-if="quesItem.imageUrl">
<image style="width: 100%;" mode="widthFix" :src="quesItem.imageUrl"></image> <image v-show="quesItem.imageUrl" style="width: auto;max-height:40vh;" mode="heightFix"
:lazy-load="true" @load="onoff='1'" :src="quesItem.imageUrl" @click="preview(quesItem.imageUrl)">
</image>
</view> </view>
<template v-if="quesItem.type!='3'"> <template v-if="quesItem.type!='3'">
<view class="flex m14lr ai-c mt20" v-for="(item,index) in quesItem.optionList" :key="item.op" <view class="flex m14lr ai-c mt20" v-for="(item,index) in quesItem.optionList" :key="item.op"
@@ -41,7 +42,21 @@
v-if="quesItem.clickAnswer&&!quesItem.trueAnswer.includes(quesItem.clickAnswer) || showBestAnswer"> v-if="quesItem.clickAnswer&&!quesItem.trueAnswer.includes(quesItem.clickAnswer) || showBestAnswer">
<view class="answer_box"> <view class="answer_box">
<text class="fs18 fw600 cor-000">答案:{{getRightOp(quesItem.trueAnswer)}}</text> <text class="fs18 fw600 cor-000">答案:{{getRightOp(quesItem.trueAnswer)}}</text>
<view class="fs18 cor-000" style="text-indent:2em;"> {{quesItem.bestAnswer}}</view> <view v-if="showSkillInfo==='show'&&quesItem.skillInfo" class="fs18 cor-000 mt5">
答题技巧{{quesItem.skillInfo}}</view>
</view>
<view class="flex ai-c jc-c mt10">
<view style="height: 6rpx;width: 120rpx;background-color: rgb(232, 232, 232);"></view>
<view class="fs18 fw600 cor-000 p15lr">试题详解</view>
<view style="height: 6rpx;width: 120rpx;background-color: rgb(232, 232, 232);"></view>
</view>
<view class="mt10">
<view class="fw600 cor-000 mb10 flex ai-c">
<view
style="background: linear-gradient(90deg, #11DF20 0%, #00B74F 100%);height: 36rpx;width: 8rpx;"
class="mr5"></view>题目解析
</view>
<view style="text-indent:2em;">{{quesItem.bestAnswer}}</view>
</view> </view>
</view> </view>
</template> </template>
@@ -82,7 +97,21 @@
<view class="m14lr mt30" v-if="isShowAnswer"> <view class="m14lr mt30" v-if="isShowAnswer">
<view class="answer_box"> <view class="answer_box">
<text class="fs18 fw600 cor-000">答案:{{getRightOp(quesItem.trueAnswer)}}</text> <text class="fs18 fw600 cor-000">答案:{{getRightOp(quesItem.trueAnswer)}}</text>
<view class="fs18 cor-000" style="text-indent:2em;"> {{quesItem.bestAnswer}}</view> <view v-if="showSkillInfo==='show'&&quesItem.skillInfo" class="fs18 cor-000">
答题技巧{{quesItem.skillInfo}}</view>
</view>
<view class="flex ai-c jc-c mt10">
<view style="height: 6rpx;width: 120rpx;background-color: rgb(232, 232, 232);"></view>
<view class="fs18 fw600 cor-000 p15lr">试题详解</view>
<view style="height: 6rpx;width: 120rpx;background-color: rgb(232, 232, 232);"></view>
</view>
<view class="mt10">
<view class="fw600 cor-000 mb10 flex ai-c">
<view
style="background: linear-gradient(90deg, #11DF20 0%, #00B74F 100%);height: 36rpx;width: 8rpx;"
class="mr5"></view>题目解析
</view>
<view style="text-indent:2em;">{{quesItem.bestAnswer}}</view>
</view> </view>
</view> </view>
</template> </template>
@@ -90,6 +119,7 @@
</scroll-view> </scroll-view>
</swiper-item> </swiper-item>
</swiper> </swiper>
<q-previewImage ref="previewRef" :urls="imgs" @open="open"></q-previewImage>
<view class="wp100 flex jc-sb ai-c p14 bc-fff" v-if="isShowAll" 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;"> <view style="width: 220rpx;">
<view v-if="type==='practice'" style="width: 220rpx;height: 80rpx;"></view> <view v-if="type==='practice'" style="width: 220rpx;height: 80rpx;"></view>
@@ -99,17 +129,17 @@
</view> </view>
</view> </view>
<view class="text-center flex jc-c ai-c" style="flex-direction: column;" @tap="toCollect"> <view class="text-center flex jc-c ai-c" style="flex-direction: column;" @tap="toCollect">
<u-icon name="star-fill" v-if="questionList[topicIndex].isCollect" color="rgb(249,236,141)" <u-icon name="star-fill" v-if="collectList.includes(questionList[topicIndex].questionId)"
size="24"></u-icon> color="rgb(249,236,141)" size="20"></u-icon>
<u-icon name="star" v-else size="24"></u-icon> <u-icon name="star" v-else size="20"></u-icon>
<text class="cor-666">{{questionList[topicIndex].isCollect?'已收藏':'收藏'}}</text> <text class="cor-666">{{collectList.includes(questionList[topicIndex].questionId)?'已收藏':'收藏'}}</text>
</view> </view>
<view class="text-center"> <view class="text-center">
<view style="color: #00B74F;">{{rightList.length}}</view> <view style="color: #00B74F;">{{navTitle !== '顺序答题'?rightList.length:storageRightList.length}}</view>
<text class="cor-666">答对</text> <text class="cor-666">答对</text>
</view> </view>
<view class="text-center"> <view class="text-center">
<view style="color: #FF6E02;">{{wrongList.length}}</view> <view style="color: #FF6E02;">{{navTitle !== '顺序答题'?wrongList.length:storageWrongList.length}}</view>
<text class="cor-666">答错</text> <text class="cor-666">答错</text>
</view> </view>
<view class="text-center" @tap="popupShow=!popupShow"> <view class="text-center" @tap="popupShow=!popupShow">
@@ -191,17 +221,17 @@
</view> </view>
</view> </view>
<view class="text-center flex jc-c ai-c" style="flex-direction: column;" @tap="toCollect"> <view class="text-center flex jc-c ai-c" style="flex-direction: column;" @tap="toCollect">
<u-icon name="star-fill" v-if="questionList[topicIndex].isCollect" color="rgb(249,236,141)" <u-icon name="star-fill" v-if="collectList.includes(questionList[topicIndex].questionId)"
size="24"></u-icon> color="rgb(249,236,141)" size="20"></u-icon>
<u-icon name="star" v-else size="24"></u-icon> <u-icon name="star" v-else size="20"></u-icon>
<text class="cor-666">{{questionList[topicIndex].isCollect?'已收藏':'收藏'}}</text> <text class="cor-666">{{collectList.includes(questionList[topicIndex].questionId)?'已收藏':'收藏'}}</text>
</view> </view>
<view class="text-center"> <view class="text-center">
<view style="color: #00B74F;">{{rightList.length}}</view> <view style="color: #00B74F;">{{navTitle !== '顺序答题'?rightList.length:storageRightList.length}}</view>
<text class="cor-666">答对</text> <text class="cor-666">答对</text>
</view> </view>
<view class="text-center"> <view class="text-center">
<view style="color: #FF6E02;">{{wrongList.length}}</view> <view style="color: #FF6E02;">{{navTitle !== '顺序答题'?wrongList.length:storageWrongList.length}}</view>
<text class="cor-666">答错</text> <text class="cor-666">答错</text>
</view> </view>
<view class="text-center" @tap="popupShow=!popupShow"> <view class="text-center" @tap="popupShow=!popupShow">
@@ -212,15 +242,17 @@
</view> </view>
</view> </view>
<view class="flex ai-c jc-fs p14" style="flex-wrap: wrap;max-height: 400px;overflow-y: scroll;"> <view class="flex ai-c jc-fs p14" style="flex-wrap: wrap;max-height: 400px;overflow-y: scroll;">
<view v-for="(item,index) of questionList" :key="index" style="width:20%;" class="flex ai-c jc-c" <view v-for="(item,index) of questionList" :key="item.questionId" style="width:20%;position: relative;"
@tap="chooseQueston(index)"> class="flex ai-c jc-c" @tap="chooseQueston(index)">
<view class="tCircle mb10" :class="{ <view class="tCircle mb10" :class="{
'active':index == topicIndex, 'active':index == topicIndex,
'success':rightList.includes(item.questionId), 'success':type=='exam'?rightList.includes(item.questionId):storageRightList.includes(item.questionId),
'error':wrongList.includes(item.questionId) 'error':type=='exam'?wrongList.includes(item.questionId):storageWrongList.includes(item.questionId)
}"> }">
{{index+1}} {{index+1}}
</view> </view>
<u-icon name="star-fill" v-if="collectList.includes(item.questionId)"
style="position: absolute;right: 5px;top:-3px" color="rgb(249,236,141)" size="24"></u-icon>
</view> </view>
</view> </view>
</view> </view>
@@ -272,6 +304,7 @@
import storage from '@/jtools/storage'; import storage from '@/jtools/storage';
import useQuestionStore from '@/jtools/store/question' //引入store import useQuestionStore from '@/jtools/store/question' //引入store
import { import {
querySysConfig,
submitTest submitTest
} from '@/jtools/api/question'; } from '@/jtools/api/question';
export default { export default {
@@ -290,14 +323,15 @@
isShowAll: { isShowAll: {
type: Boolean, type: Boolean,
default: true default: true
}, }
subject: {
type: [String, Number],
default: 1,
},
}, },
data() { data() {
return { return {
imgs: [],
subject: '1',
showSkillInfo: 'hidden',
currentType: storage.get('carType') || '1001',
onoff: '0',
navTitle: '', navTitle: '',
originArray: '', originArray: '',
showBestAnswer: false, showBestAnswer: false,
@@ -310,6 +344,8 @@
tCurrent: 0, tCurrent: 0,
index: 0, index: 0,
qIndex: 0, qIndex: 0,
storageRightList: storage.get(`rightList_subject${this.subject}`) || [],
storageWrongList: storage.get(`wrongList_subject${this.subject}`) || [],
rightList: [], rightList: [],
wrongList: [], wrongList: [],
collectList: storage.get(`collectList_subject${this.subject}`) || [], collectList: storage.get(`collectList_subject${this.subject}`) || [],
@@ -322,7 +358,14 @@
time: 0, time: 0,
} }
}, },
created() {
const carType = storage.get('carType') || '1001'
querySysConfig(carType, 'NeedSkillInfo').then(resp => {
if (resp.code === '0000') {
this.showSkillInfo = resp.data.configValue
}
})
},
computed: { computed: {
...mapState(useQuestionStore, ["currentIndex_subject1", "currentIndex_subject4"]), //映射函数取出tagslist ...mapState(useQuestionStore, ["currentIndex_subject1", "currentIndex_subject4"]), //映射函数取出tagslist
isShowAnswer() { isShowAnswer() {
@@ -345,23 +388,33 @@
}, },
timeCount() { timeCount() {
const time = this.subject == '1' ? 60 * 60 * 1000 : 45 * 60 * 1000 const time = 45 * 60 * 1000
return time return time
} }
}, },
methods: { methods: {
...mapActions(useQuestionStore, ['getCurrentIndex']), ...mapActions(useQuestionStore, ['getCurrentIndex']),
open() {
},
preview(url) {
this.imgs = [url] //设置图片数组
// #ifdef MP-WEIXIN
this.$nextTick(() => {
this.imgs = [url]
setTimeout(()=>{
this.$refs.previewRef.open(url);
},500)
})
// #endif
},
getOriginArr(val) { getOriginArr(val) {
const arr = JSON.parse(val) const arr = JSON.parse(val)
let arr1 = [] let arr1 = []
arr.forEach(item => { arr.forEach(item => {
let isCollect = false
if (this.collectList.includes(item.questionId)) {
isCollect = true
}
arr1.push({ arr1.push({
isChoose: false, isChoose: false,
isCollect: isCollect,
...item ...item
}) })
}) })
@@ -381,8 +434,8 @@
if (this.tCurrent != 1) { if (this.tCurrent != 1) {
this.originArray = JSON.stringify(this.questionList) this.originArray = JSON.stringify(this.questionList)
} }
const falseList = storage.get(`wrongList_subject${this.subject}`) || [] // const falseList = storage.get(`wrongList_subject${this.subject}`) || []
const trueList = storage.get(`rightList_subject${this.subject}`) || [] // const trueList = storage.get(`rightList_subject${this.subject}`) || []
if (this.tCurrent !== 1) { if (this.tCurrent !== 1) {
const arr1 = this.questionList[this.topicIndex].clickAnswer.split('') const arr1 = this.questionList[this.topicIndex].clickAnswer.split('')
const arr2 = this.questionList[this.topicIndex].trueAnswer.split('') const arr2 = this.questionList[this.topicIndex].trueAnswer.split('')
@@ -392,18 +445,18 @@
if (!this.rightList.includes(this.questionList[this.topicIndex].questionId)) { if (!this.rightList.includes(this.questionList[this.topicIndex].questionId)) {
this.rightList.push(this.questionList[this.topicIndex].questionId) this.rightList.push(this.questionList[this.topicIndex].questionId)
} }
if (!trueList.includes(this.questionList[this.topicIndex].questionId)) { if (!this.storageRightList.includes(this.questionList[this.topicIndex].questionId)) {
trueList.push(this.questionList[this.topicIndex].questionId) this.storageRightList.push(this.questionList[this.topicIndex].questionId)
storage.set(`rightList_subject${this.subject}`, trueList) storage.set(`rightList_subject${this.subject}`, this.storageRightList)
} }
if (this.wrongList.includes(this.questionList[this.topicIndex].questionId)) { if (this.wrongList.includes(this.questionList[this.topicIndex].questionId)) {
const wIndex = this.wrongList.indexOf(this.questionList[this.topicIndex].questionId) const wIndex = this.wrongList.indexOf(this.questionList[this.topicIndex].questionId)
this.wrongList.splice(wIndex, 1) this.wrongList.splice(wIndex, 1)
} }
if (falseList.includes(this.questionList[this.topicIndex].questionId)) { if (this.storageWrongList.includes(this.questionList[this.topicIndex].questionId)) {
const wIndex = falseList.indexOf(this.questionList[this.topicIndex].questionId) const wIndex = this.storageWrongList.indexOf(this.questionList[this.topicIndex].questionId)
falseList.splice(wIndex, 1) this.storageWrongList.splice(wIndex, 1)
storage.set(`wrongList_subject${this.subject}`, falseList) storage.set(`wrongList_subject${this.subject}`, this.storageWrongList)
} }
//答对题目 如果不是最后一题,跳下一题 //答对题目 如果不是最后一题,跳下一题
if (this.topicIndex < this.questionList.length - 1) { if (this.topicIndex < this.questionList.length - 1) {
@@ -429,14 +482,14 @@
if (!this.wrongList.includes(this.questionList[this.topicIndex].questionId)) { if (!this.wrongList.includes(this.questionList[this.topicIndex].questionId)) {
this.wrongList.push(this.questionList[this.topicIndex].questionId) this.wrongList.push(this.questionList[this.topicIndex].questionId)
} }
if (!falseList.includes(this.questionList[this.topicIndex].questionId)) { if (!this.storageWrongList.includes(this.questionList[this.topicIndex].questionId)) {
falseList.push(this.questionList[this.topicIndex].questionId) this.storageWrongList.push(this.questionList[this.topicIndex].questionId)
storage.set(`wrongList_subject${this.subject}`, falseList) storage.set(`wrongList_subject${this.subject}`, this.storageWrongList)
} }
if (trueList.includes(this.questionList[this.topicIndex].questionId)) { if (this.storageRightList.includes(this.questionList[this.topicIndex].questionId)) {
const rIndex = trueList.indexOf(this.questionList[this.topicIndex].questionId) const rIndex = this.storageRightList.indexOf(this.questionList[this.topicIndex].questionId)
trueList.splice(rIndex, 1) this.storageRightList.splice(rIndex, 1)
storage.set(`rightList_subject${this.subject}`, trueList) storage.set(`rightList_subject${this.subject}`, this.storageRightList)
} }
} }
} }
@@ -490,6 +543,7 @@
this.$refs.countDown_1.pause(); this.$refs.countDown_1.pause();
this.$refs.countDown_2.pause(); this.$refs.countDown_2.pause();
} }
this.popupShow = false
this.$refs.countDown_3.pause(); this.$refs.countDown_3.pause();
this.$emit('update:isSubmit', true) this.$emit('update:isSubmit', true)
}, },
@@ -508,21 +562,27 @@
toSubmit() { toSubmit() {
const restTime = this.time.hours * 60 * 60 + this.time.minutes * 60 + this.time.seconds const restTime = this.time.hours * 60 * 60 + this.time.minutes * 60 + this.time.seconds
const score = (this.rightList.length / this.questionList.length * 100).toFixed(0) const score = (this.rightList.length / this.questionList.length * 100).toFixed(0)
submitTest({ if (this.rightList.length + this.wrongList.length == 0) {
"carTypeId": storage.get('carType') || '1001', uni.navigateBack({
"score": score, delta: 1
"testTime": 60 * 60 - restTime, })
subject: this.subject } else {
}).then(resp => { submitTest({
const doNotNum = this.questionList.length - this.rightList.length - this.wrongList.length "carTypeId": storage.get('carType') || '1001',
const list = JSON.stringify(this.wrongList) "score": score,
if (resp.code === '0000') { "testTime": 45 * 60 - restTime,
uni.navigateTo({ subject: this.subject
url: "/pages/questionBank/examResult?doNotNum=" + doNotNum + "&wrongList=" + list + "&score=" + }).then(resp => {
score + "&subject=" + this.subject + "&navTitle=" + this.navTitle const doNotNum = this.questionList.length - this.rightList.length - this.wrongList.length
}) const list = JSON.stringify(this.wrongList)
} if (resp.code === '0000') {
}) uni.navigateTo({
url: "/pages/questionBank/examResult?doNotNum=" + doNotNum + "&wrongList=" + list + "&score=" +
score + "&subject=" + this.subject + "&navTitle=" + this.navTitle
})
}
})
}
}, },
//查看考试结果 //查看考试结果
toResult() { toResult() {
@@ -534,12 +594,9 @@
}) })
}, },
toCollect() { toCollect() {
if (this.questionList[this.topicIndex].isCollect) { if (this.collectList.includes(this.questionList[this.topicIndex].questionId)) {
if (this.collectList.includes(this.questionList[this.topicIndex].questionId)) { const idx = this.collectList.indexOf(this.questionList[this.topicIndex].questionId)
const idx = this.collectList.indexOf(this.questionList[this.topicIndex].questionId) this.collectList.splice(idx, 1)
this.collectList.splice(idx, 1)
}
this.questionList[this.topicIndex].isCollect = false
uni.showToast({ uni.showToast({
title: "取消收藏", title: "取消收藏",
icon: 'none' icon: 'none'
@@ -593,6 +650,7 @@
// 轮播图切换 // 轮播图切换
onChange(e) { onChange(e) {
// this.onoff='0'
// 非触摸事件不做轮播图状态更新 // 非触摸事件不做轮播图状态更新
if (e.detail.source != "touch") return; if (e.detail.source != "touch") return;
@@ -644,8 +702,8 @@
}, },
//答题 //答题
answerQues(op, index) { answerQues(op, index) {
const falseList = storage.get(`wrongList_subject${this.subject}`) || [] // const falseList = storage.get(`wrongList_subject${this.subject}`) || []
const trueList = storage.get(`rightList_subject${this.subject}`) || [] // const trueList = storage.get(`rightList_subject${this.subject}`) || []
if (!this.questionList[this.topicIndex].clickAnswer) { if (!this.questionList[this.topicIndex].clickAnswer) {
this.questionList[this.topicIndex].optionList[index].chooseOption = this.questionList[this.topicIndex].optionList[index].chooseOption =
`${this.questionList[this.topicIndex].optionList[index].chooseOption?this.questionList[this.topicIndex].optionList[index].chooseOption:''}${op}` `${this.questionList[this.topicIndex].optionList[index].chooseOption?this.questionList[this.topicIndex].optionList[index].chooseOption:''}${op}`
@@ -678,18 +736,18 @@
if (!this.rightList.includes(this.questionList[this.topicIndex].questionId)) { if (!this.rightList.includes(this.questionList[this.topicIndex].questionId)) {
this.rightList.push(this.questionList[this.topicIndex].questionId) this.rightList.push(this.questionList[this.topicIndex].questionId)
} }
if (!trueList.includes(this.questionList[this.topicIndex].questionId)) { if (!this.storageRightList.includes(this.questionList[this.topicIndex].questionId)) {
trueList.push(this.questionList[this.topicIndex].questionId) this.storageRightList.push(this.questionList[this.topicIndex].questionId)
storage.set(`rightList_subject${this.subject}`, trueList) storage.set(`rightList_subject${this.subject}`, this.storageRightList)
} }
if (this.wrongList.includes(this.questionList[this.topicIndex].questionId)) { if (this.wrongList.includes(this.questionList[this.topicIndex].questionId)) {
const wIndex = this.wrongList.indexOf(this.questionList[this.topicIndex].questionId) const wIndex = this.wrongList.indexOf(this.questionList[this.topicIndex].questionId)
this.wrongList.splice(wIndex, 1) this.wrongList.splice(wIndex, 1)
} }
if (falseList.includes(this.questionList[this.topicIndex].questionId)) { if (this.storageWrongList.includes(this.questionList[this.topicIndex].questionId)) {
const wIndex = falseList.indexOf(this.questionList[this.topicIndex].questionId) const wIndex = this.storageWrongList.indexOf(this.questionList[this.topicIndex].questionId)
falseList.splice(wIndex, 1) this.storageWrongList.splice(wIndex, 1)
storage.set(`wrongList_subject${this.subject}`, falseList) storage.set(`wrongList_subject${this.subject}`, this.storageWrongList)
} }
//答对题目 如果不是最后一题,跳下一题 //答对题目 如果不是最后一题,跳下一题
if (this.topicIndex < this.questionList.length - 1) { if (this.topicIndex < this.questionList.length - 1) {
@@ -715,14 +773,14 @@
if (!this.wrongList.includes(this.questionList[this.topicIndex].questionId)) { if (!this.wrongList.includes(this.questionList[this.topicIndex].questionId)) {
this.wrongList.push(this.questionList[this.topicIndex].questionId) this.wrongList.push(this.questionList[this.topicIndex].questionId)
} }
if (!falseList.includes(this.questionList[this.topicIndex].questionId)) { if (!this.storageWrongList.includes(this.questionList[this.topicIndex].questionId)) {
falseList.push(this.questionList[this.topicIndex].questionId) this.storageWrongList.push(this.questionList[this.topicIndex].questionId)
storage.set(`wrongList_subject${this.subject}`, falseList) storage.set(`wrongList_subject${this.subject}`, this.storageWrongList)
} }
if (trueList.includes(this.questionList[this.topicIndex].questionId)) { if (this.storageRightList.includes(this.questionList[this.topicIndex].questionId)) {
const rIndex = trueList.indexOf(this.questionList[this.topicIndex].questionId) const rIndex = this.storageRightList.indexOf(this.questionList[this.topicIndex].questionId)
trueList.splice(rIndex, 1) this.storageRightList.splice(rIndex, 1)
storage.set(`rightList_subject${this.subject}`, trueList) storage.set(`rightList_subject${this.subject}`, this.storageRightList)
} }
} }
} }
@@ -733,17 +791,30 @@
// this.renderSwiper(0) // this.renderSwiper(0)
this.$emit('changeTab', index) this.$emit('changeTab', index)
}, },
getQuestionList(val, title) { getQuestionList(val, title, subject) {
if (title) { if (title) {
this.navTitle = title this.navTitle = title
} }
if (subject) {
this.subject = subject
console.log(this.subject);
this.storageRightList = storage.get(`rightList_subject${subject}`) || []
this.storageWrongList = storage.get(`wrongList_subject${subject}`) || []
this.collectList = storage.get(`collectList_subject${subject}`) || []
}
if (val && val.length) { if (val && val.length) {
this.questionList = JSON.parse(val) this.questionList = JSON.parse(val)
} else { } else {
this.questionList = JSON.parse(this.originArray) this.questionList = JSON.parse(this.originArray)
} }
console.log(this.questionList);
if (this.navTitle === '顺序答题') { if (this.navTitle === '顺序答题') {
this.pickerTopic(this[`currentIndex_subject${this.subject}`]) if (subject) {
this.pickerTopic(this[`currentIndex_subject${subject}`])
} else {
this.pickerTopic(this[`currentIndex_subject${this.subject}`])
}
} else { } else {
this.pickerTopic(this.topicIndex) this.pickerTopic(this.topicIndex)
} }

View File

@@ -15,7 +15,7 @@
<image style="width: 363rpx;height: 170rpx;" src="../../static/image/practice/chapter_bg.png"></image> <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="position: absolute;left: 0;top: 0;" class="p10">
<view style="color: #FF6E02;font-size: 18px;">章节练习</view> <view style="color: #FF6E02;font-size: 18px;">章节练习</view>
<text style="color: #FF6E02;font-size: 14px;">5</text> <text style="color: #FF6E02;font-size: 14px;">{{chapterNum}}</text>
</view> </view>
</view> </view>
</view> </view>
@@ -67,6 +67,7 @@
export default { export default {
data() { data() {
return { return {
chapterNum:0,
errorIcon, errorIcon,
newRulesIcon, newRulesIcon,
neverWriteIcon, neverWriteIcon,
@@ -111,6 +112,7 @@
} }
this.getExamPoint() this.getExamPoint()
this.getQuestionNum() this.getQuestionNum()
this.getChapterList()
}, },
computed: { computed: {
...mapState(useQuestionStore, ["loading_subject4", "loading_subject1", "version"]), //映射函数取出tagslist ...mapState(useQuestionStore, ["loading_subject4", "loading_subject1", "version"]), //映射函数取出tagslist
@@ -120,6 +122,15 @@
}, },
methods: { methods: {
...mapActions(useQuestionStore, ['getAllQuestion']), ...mapActions(useQuestionStore, ['getAllQuestion']),
getChapterList(){
const carTypeId=storage.get('carType') || '1001'
const key=this.subject=='1'?'ChapterOfSubjectOne':'ChapterOfSubjectFour'
querySysConfigList(carTypeId,'ChapterOfSubjectOne').then(resp=>{
if(resp.code==='0000'&&resp.data){
this.chapterNum=resp.data.length
}
})
},
getQuestionNum() { getQuestionNum() {
querySpecialNum({ querySpecialNum({
carTypeId: storage.get('carType') || '1001', carTypeId: storage.get('carType') || '1001',
@@ -218,11 +229,18 @@
...param, ...param,
}).then(async (resp) => { }).then(async (resp) => {
if (resp.code === '0000') { if (resp.code === '0000') {
const arr = resp.data if(resp.data&&resp.data.length){
const listJson = JSON.stringify(arr) const arr = resp.data
uni.navigateTo({ const listJson = JSON.stringify(arr)
url: "/pages/questionBank/questionBank?navTitle=" + title + "&subject=" + this.subject + "&questionIdList=" + listJson uni.navigateTo({
}) url: "/pages/questionBank/questionBank?navTitle=" + title + "&subject=" + this.subject + "&questionIdList=" + listJson
})
}else{
uni.showToast({
title: '暂无题目',
icon: 'none'
})
}
}else if (resp.code === '4001') { }else if (resp.code === '4001') {
uni.showToast({ uni.showToast({
title: '当前题库非最新版,请更新~', title: '当前题库非最新版,请更新~',

View File

@@ -3,8 +3,7 @@
<!-- <u-navbar title="模拟考试" @rightClick="rightClick" :autoBack="true"> <!-- <u-navbar title="模拟考试" @rightClick="rightClick" :autoBack="true">
</u-navbar> --> </u-navbar> -->
<j-navbar :isDefineBack="true" @toBack="toBack">{{title}}</j-navbar> <j-navbar :isDefineBack="true" @toBack="toBack">{{title}}</j-navbar>
<Question ref="question" :tabsList="tabsList" v-model:isSubmit="isSubmit" :type="type" :isShowAll="isShowAll" <Question ref="question" :tabsList="tabsList" v-model:isSubmit="isSubmit" :type="type" :isShowAll="isShowAll" @changeTab="changeTab" />
:subject="subject" @changeTab="changeTab" />
</view> </view>
</template> </template>
@@ -29,7 +28,7 @@
return { return {
type: '', type: '',
collectList: storage.get(`collectList_subject${this.subject}`) || [], collectList: storage.get(`collectList_subject${this.subject}`) || [],
questionArr:[], questionArr: [],
isShowAll: true, isShowAll: true,
title: "模拟考试", title: "模拟考试",
subject: 1, subject: 1,
@@ -53,31 +52,30 @@
if (op.isExam1) { if (op.isExam1) {
param.isExam1 = op.isExam1 param.isExam1 = op.isExam1
} }
if(op.needVip){ if (op.needVip) {
this.isShowAll = op.needVip this.isShowAll = op.needVip
}
let arr=[]
if(op.questionIdList){
const idList=JSON.parse(op.questionIdList)
arr = this[`orderQuestion_subject${this.subject}`].filter(qItem=>idList.includes(qItem.questionId))
} }
let arr = []
arr = [...this[`orderQuestion_subject${this.subject}`]]
let questionObj = {}
arr.forEach(item => { arr.forEach(item => {
let isCollect = false item.isChoose = false
if (this.collectList.includes(item.questionId)) { questionObj[item.questionId] = item
isCollect = true
}
this.questionArr.push({
isChoose: false,
isCollect: isCollect,
...item
})
}) })
if (op.questionIdList) {
const idList = JSON.parse(op.questionIdList)
if (idList && idList.length > 0) {
idList.forEach(item => {
this.questionArr.push(questionObj[item])
})
}
}
this.type = 'exam' this.type = 'exam'
this.$refs.question.getQuestionList(JSON.stringify(this.questionArr),this.title) this.$refs.question.getQuestionList(JSON.stringify(this.questionArr), this.title,this.subject)
} }
}, },
computed: { computed: {
...mapState(useUserStore, ["vipOnList","token"]), ...mapState(useUserStore, ["vipOnList", "token"]),
...mapState(useQuestionStore, ["orderQuestion_subject1", "orderQuestion_subject4", "version"]), //映射函数取出tagslist ...mapState(useQuestionStore, ["orderQuestion_subject1", "orderQuestion_subject4", "version"]), //映射函数取出tagslist
}, },
methods: { methods: {
@@ -85,48 +83,19 @@
toBack() { toBack() {
this.$refs.question.submitPaper() this.$refs.question.submitPaper()
}, },
changeTab(val) { async changeTab(val) {
if (val == 1) { if (val == 1) {
const param=this.subject=='1'?{isExam1: '1'}:{isExam2: '1'} await this.searchUserVip()
queryQuestionId({ const result = this.vipOnList.some(item => item.subjects.includes(this.subject))
versionId: this.version, if (result) {
carTypeId: storage.get('carType') || '1001', uni.navigateTo({
subject: this.subject, url: "/pages/index/secretPapers?subject=" + this.subject
...param })
}).then(async (resp) => { } else {
if (resp.code === '0000') { uni.navigateTo({
if (this.token) { url: "/pages/index/videoVip?subject=" + this.subject
await this.searchUserVip() })
const result = this.vipOnList.some(item => item.subjects.includes(this.subject)) }
if (result) {
const listJson = JSON.stringify(resp.data)
uni.navigateTo({
url: "/pages/questionBank/practiceExams?title=考前密卷" + "&subject=" + this.subject + "&questionIdList=" + listJson
})
} else {
if (resp.data && resp.data.length > 3) {
const arr = resp.data.slice(0, 3)
} else {
const arr = resp.data
}
const listJson = JSON.stringify(arr)
uni.navigateTo({
url: "/pages/questionBank/practiceExams?title=" + title + "&subject=" + this.subject + "&questionIdList=" + listJson+"&needVip="+result
})
}
} else {
uni.redirectTo({
url: '/pages/login/login'
});
}
} else if (resp.code === '4001') {
uni.showToast({
title: '当前题库非最新版,请更新~',
icon: 'none'
})
this.getAllQuestion()
}
})
} }
} }
} }

View File

@@ -6,7 +6,7 @@
<GradesChart :titleName="rightPencentDesc" :actualValue="Number(rightPencent)" /> <GradesChart :titleName="rightPencentDesc" :actualValue="Number(rightPencent)" />
<view class="top_box flex jc-c" style="flex-direction: column;"> <view class="top_box flex jc-c" style="flex-direction: column;">
<view class="wp100 text-center" style="margin-top: -80px;"> <view class="wp100 text-center" style="margin-top: -80px;">
<text v-if="Number(rightPencent)>=90">太棒了正确率很高了</text> <text v-if="Number(rightPencent * 100)>=90">太棒了正确率很高了</text>
<text v-else>继续努力吧正确率有点低~</text> <text v-else>继续努力吧正确率有点低~</text>
<view class="flex ai-c jc-c mt10"> <view class="flex ai-c jc-c mt10">
<view class="text-center wp50" @tap="toQuestionBank"> <view class="text-center wp50" @tap="toQuestionBank">

View File

@@ -28,9 +28,9 @@
}, },
data() { data() {
return { return {
loadTxt:'加载中...', loadTxt: '加载中...',
collectList: storage.get(`collectList_subject${this.subject}`) || [], collectList: storage.get(`collectList_subject${this.subject}`) || [],
loading:false, loading: false,
isShowAll: true, isShowAll: true,
needVip: false, needVip: false,
subject: 1, subject: 1,
@@ -46,7 +46,7 @@
} }
}, },
async onLoad(op) { async onLoad(op) {
this.loading=true this.loading = true
if (op.needVip) { if (op.needVip) {
this.needVip = op.needVip this.needVip = op.needVip
} }
@@ -55,63 +55,34 @@
} }
if (op && op.navTitle) { if (op && op.navTitle) {
this.navTitle = op.navTitle this.navTitle = op.navTitle
let arr=[] let arr = []
let param={} let param = {}
if(op.needVip){ if (op.needVip) {
this.isShowAll = !Boolean(op.needVip=='true') this.isShowAll = !Boolean(op.needVip == 'true')
}
if (this.navTitle === '顺序答题') {
if (this.subject == '1') {
arr = [...this.orderQuestion_subject1]
} else if (this.subject == '4') {
arr = [...this.orderQuestion_subject4]
}
} else if(op.questionIdList){
const idList=JSON.parse(op.questionIdList)
arr = this[`orderQuestion_subject${this.subject}`].filter(qItem=>idList.includes(qItem.questionId))
}else{
if(op.isVip){
param.isVip=op.isVip
}
const resp=await queryQuestionId({
subject:this.subject,
carTypeId:storage.get('carType') || '1001',
versionId:this.version,
...params
})
let list=[]
if(resp.code==='0000'){
await this.searchUserVip()
const res = this.vipOnList.some(item => item.subjects.includes(this.subject))
if (!res) {
list=resp.data.slice(0,3)
}else{
list=resp.data
}
}
if(op.needVip){
this.isShowAll = op.needVip
}
arr=this[`orderQuestion_subject${this.subject}`].filter(qItem=>list.includes(qItem.questionId))
} }
arr = [...this[`orderQuestion_subject${this.subject}`]]
let questionObj={}
arr.forEach(item => { arr.forEach(item => {
let isCollect = false item.isChoose=false
if (this.collectList.includes(item.questionId)) { questionObj[item.questionId]=item
isCollect = true
}
this.questionArr.push({
isChoose: false,
isCollect: isCollect,
...item
})
}) })
this.loading=false if(op.navTitle==='顺序答题'){
this.$refs.question.getQuestionList(JSON.stringify(this.questionArr),this.navTitle) this.questionArr=arr
}else if (op.questionIdList) {
const idList = JSON.parse(op.questionIdList)
if(idList&&idList.length>0){
idList.forEach(item=>{
this.questionArr.push(questionObj[item])
})
}
}
this.loading = false
this.$refs.question.getQuestionList(JSON.stringify(this.questionArr), this.navTitle , this.subject)
this.$refs.question.getOriginArr(JSON.stringify(this.questionArr)) this.$refs.question.getOriginArr(JSON.stringify(this.questionArr))
} }
}, },
computed: { computed: {
...mapState(useQuestionStore, ["orderQuestion_subject1", "orderQuestion_subject4","version"]), //映射函数取出tagslist ...mapState(useQuestionStore, ["orderQuestion_subject1", "orderQuestion_subject4", "version"]), //映射函数取出tagslist
...mapState(useUserStore, ["vipOnList", "token"]), ...mapState(useUserStore, ["vipOnList", "token"]),
}, },
methods: { methods: {
@@ -128,7 +99,7 @@
} }
}) })
this.$refs.question.isShowBest(true) this.$refs.question.isShowBest(true)
this.$refs.question.getQuestionList(JSON.stringify(list),this.navTitle) this.$refs.question.getQuestionList(JSON.stringify(list), this.navTitle)
} else { } else {
this.$refs.question.isShowBest(false) this.$refs.question.isShowBest(false)
this.$refs.question.getQuestionList() this.$refs.question.getQuestionList()

View File

@@ -96,6 +96,7 @@
label: "庐江考场", label: "庐江考场",
value: 6 value: 6
}], }],
driveType:'',
videoType: '', videoType: '',
popupShow: false, popupShow: false,
videoList: [{ videoList: [{
@@ -128,6 +129,10 @@
} }
}, },
onLoad(op) { onLoad(op) {
if(op.driveType){
this.driveType=op.driveType
this.param.driveType=op.driveType
}
if (op.type) { if (op.type) {
this.videoType = op.type this.videoType = op.type
} }
@@ -139,6 +144,7 @@
} }
if (op.type) { if (op.type) {
this.param.type = op.type this.param.type = op.type
this.getVideoList()
} }
if (op.type == '1') { if (op.type == '1') {
if (this.param.subject == '2') { if (this.param.subject == '2') {
@@ -149,10 +155,7 @@
} else { } else {
this.title = '基础操作讲解' this.title = '基础操作讲解'
} }
if (op.videoList) {
this.videoList = JSON.parse(op.videoList)
this.currentIndex = this.videoList.findIndex(item => item.projectId == this.projectId)
}
}, },
computed: { computed: {
getScrollLeft() { getScrollLeft() {
@@ -161,6 +164,46 @@
} }
}, },
methods: { methods: {
formateTime(time) {
const h = parseInt(time / 3600)
const minute = parseInt(time / 60 % 60)
const second = Math.ceil(time % 60)
const hours = h < 10 ? '0' + h : h
const formatSecond = second > 59 ? 59 : second
return `${hours > 0 ? `${hours}:` : ''}${minute < 10 ? '0' + minute : minute}:${formatSecond < 10 ? '0' + formatSecond : formatSecond}`
},
getVideoList() {
queryProjectList({
"carTypeId": storage.get('carType') || '1001',
...this.param,
}).then(resp => {
if(resp.code==='0000'){
let arr=[]
if(this.param.type=='1'){
arr = JSON.parse(JSON.stringify(resp.data))
arr = arr.map(item => {
return {
...item,
videoUrl: item.videoList[0]?.videoUrl,
videoTime: this.formateTime(item.videoList[0]?.videoTime)
}
})
}else{
arr = JSON.parse(JSON.stringify(resp.data[0].videoList))
arr = arr.map(item => {
return {
...item,
projectId: item.videoId,
subDesc: resp.data[0].description,
videoTime: this.formateTime(item.videoTime)
}
})
}
this.videoList = arr
this.currentIndex = this.videoList.findIndex(item => item.projectId == this.projectId)
}
})
},
checkTest(val) { checkTest(val) {
this.videoIndex = val this.videoIndex = val
}, },

View File

@@ -68,7 +68,9 @@
<view class="flex ai-c jc-sb mt10" style="flex-wrap: wrap;"> <view class="flex ai-c jc-sb mt10" style="flex-wrap: wrap;">
<!-- 这个点击效果没加 --> <!-- 这个点击效果没加 -->
<view v-for="(item,index) of typeList" :key="index" class="category_item p14 flex jc-sb ai-c mb10" @tap="toCategoryQuestion(item)"> <view v-for="(item,index) of typeList" :key="index" class="category_item p14 flex jc-sb ai-c mb10" @tap="toCategoryQuestion(item)">
<text class="cor-000">{{item.categoryName}}</text> <view class="topic_cont_text" style="max-width: 75%;">
<text class="cor-000">{{item.categoryName}}</text>
</view>
<text class="cor-666">{{item.num}}</text> <text class="cor-666">{{item.num}}</text>
</view> </view>
</view> </view>
@@ -139,8 +141,9 @@
}, },
toCategoryQuestion(item){ toCategoryQuestion(item){
const jsonString = JSON.stringify(item.errorQuestionIdList) const jsonString = JSON.stringify(item.errorQuestionIdList)
console.log(item);
uni.navigateTo({ uni.navigateTo({
url: "/pages/questionBank/questionBank?navTitle=" + item.categoryName + "&questionIdList=" + jsonString url: "/pages/questionBank/questionBank?navTitle=" + item.categoryName + "&questionIdList=" + jsonString+"&subject="+this.subject
}) })
}, },
toPractice() { toPractice() {
@@ -264,4 +267,18 @@
left: 165.5rpx; left: 165.5rpx;
top: 78rpx top: 78rpx
} }
.topic_cont_text {
overflow: hidden;
word-break: break-all;
/* break-all(允许在单词内换行。) */
text-overflow: ellipsis;
/* 超出部分省略号 */
display: -webkit-box;
/** 对象作为伸缩盒子模型显示 **/
-webkit-box-orient: vertical;
/** 设置或检索伸缩盒对象的子元素的排列方式 **/
-webkit-line-clamp: 1;
/** 显示的行数 **/
}
</style> </style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@@ -0,0 +1,11 @@
## 1.0.42022-12-07
修改判断在APP端不监听document的滚动
## 1.0.32022-12-05
新增:支持视频预览,视频图片混用
新增支持预览单张handlePreviewImg方法直接传入图片或视频地址即可单张预览
## 1.0.22022-12-05
## 1.0.12022-12-05
文档错误修改
## 1.0.02022-11-29
初始化插件

View File

@@ -0,0 +1,235 @@
<template>
<view class="pos">
<uni-transition :mode-class="modeClass" :show="show">
<!-- 多张图片预览 -->
<view class="content" @tap="closedPreview">
<swiper
class="swiper"
circular
:current="curDot"
@change="swiperChange"
:indicator-dots="false"
>
<swiper-item v-for="(item, idx) in selfImgList" :key="idx">
<movable-area scale-area>
<movable-view
:scale="!disabledScale"
direction="all"
scale="true"
scale-min="0.5"
scale-max="5"
:scale-value="1"
damping="150"
friction="15"
>
<image v-if="isImg(item)" :src="item" mode="widthFix"></image>
<view class="video-preview" v-else>
<video
:autoplay="true"
:src="item"
:enable-progress-gesture="false"
:show-fullscreen-btn="false"
></video>
</view>
</movable-view>
</movable-area>
</swiper-item>
</swiper>
</view>
<!-- 指示器 -->
<slot name="indicator" v-if="imgList.length > 1 && !indicatorDotsType">
<view class="current-dot">
<view class="change-buttom" @tap.stop="previousImg">
<uni-icons class="font-white" type="back" size="30"></uni-icons>
</view>
<view class="font-white cur">
{{ curDot + 1 }}/{{ imgList.length }}
</view>
<view class="change-buttom" @tap.stop="nextImg">
<uni-icons class="font-white" type="forward" size="30"></uni-icons>
</view>
</view>
</slot>
</uni-transition>
</view>
</template>
<script>
export default {
props: {
// 过渡效果
modeClass: {
type: Array,
default: ['fade', 'zoom-out'],
},
// 指示器类型 true 圆点 false 数字
indicatorDotsType: {
type: Boolean,
default: true,
},
// 图片列表
imgList: {
type: Array,
default: () => [],
},
// 是否禁止放大缩小 禁止后swiper可以滑动切换
disabledScale: {
type: Boolean,
default: false,
},
},
data() {
return {
show: false,
curDot: 0,
selfImgList: [],
};
},
computed: {
isImg() {
return (src) => {
return src.indexOf('.mp4') === -1 ? true : false;
};
},
},
watch: {
//监听打开时阻止下面元素的滚动事件
/* #ifdef APP-PLUS*/
show(val) {
if (val) {
document
.getElementsByClassName('pos')[0]
.addEventListener('touchmove', function (e) {
e.preventDefault();
});
}
},
/* #endif */
imgList: {
handler(val) {
if (val.length) {
this.selfImgList = val.concat();
}
},
},
},
methods: {
handlePreviewImg(param) {
this.show = !this.show;
if (typeof param === 'string') {
this.selfImgList = [param];
} else {
if (param) {
this.curDot = param;
}
}
this.$emit('preview', this.show);
},
closedPreview() {
this.show = !this.show;
this.curDot = 0;
this.$emit('preview', this.show);
},
swiperChange(e) {
this.curDot = e.detail.current;
this.$emit('changeImg', e.detail.current);
},
previousImg() {
let num = this.imgList.length - 1;
if (this.curDot <= 0) {
this.curDot = num;
} else {
this.curDot--;
}
},
nextImg() {
let num = this.imgList.length - 1;
if (this.curDot >= num) {
this.curDot = 0;
} else {
this.curDot++;
}
},
},
};
</script>
<style lang="scss" scoped>
movable-view {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
}
movable-area {
height: 100%;
width: 100%;
position: fixed;
overflow: hidden;
}
movable-view image {
width: 100%;
}
.content {
height: 100vh;
width: 100vw;
display: flex;
align-items: center;
background: #00000076;
}
.pos {
position: absolute;
top: 0;
left: 0;
z-index: 9999;
}
.swiper {
height: 100%;
width: 100%;
}
.current-dot {
position: absolute;
bottom: 10%;
left: 25%;
width: 50%;
display: flex;
align-items: center;
justify-content: space-around;
.change-buttom {
padding: 10rpx;
border-radius: 50%;
background: #3f3f3f;
}
.cur {
font-size: 20rpx;
}
}
.font-white {
color: #fff !important;
}
::v-deep {
.uni-swiper-dots-horizontal {
bottom: 12%;
}
.uni-swiper-dot {
width: 10rpx;
height: 10rpx;
}
uni-video {
width: 100vw;
height: 100vh;
}
}
.video-preview {
position: relative;
.video-close {
position: absolute;
right: 50rpx;
top: 50rpx;
}
}
</style>

View File

@@ -0,0 +1,84 @@
{
"id": "g-preview-img",
"displayName": "g-preview-img一款兼容vue2vue3的图片预览插件视频预览支持单张多张左右滑动放大缩小",
"version": "1.0.4",
"description": "g-preview-img一款兼容vue2vue3的图片预览插件视频预览支持单张多张左右滑动放大缩小",
"keywords": [
"vue2",
"vue3",
"图片预览",
"视频预览"
],
"repository": "",
"engines": {
"HBuilderX": "^3.1.0"
},
"dcloudext": {
"type": "component-vue",
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": ""
},
"uni_modules": {
"dependencies": [],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"Vue": {
"vue2": "y",
"vue3": "y"
},
"App": {
"app-vue": "y",
"app-nvue": "y"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "y",
"微信浏览器(Android)": "y",
"QQ浏览器(Android)": "y"
},
"H5-pc": {
"Chrome": "y",
"IE": "y",
"Edge": "y",
"Firefox": "y",
"Safari": "y"
},
"小程序": {
"微信": "u",
"阿里": "u",
"百度": "u",
"字节跳动": "u",
"QQ": "u",
"钉钉": "u",
"快手": "u",
"飞书": "u",
"京东": "u"
},
"快应用": {
"华为": "u",
"联盟": "u"
}
}
}
}
}

View File

@@ -0,0 +1,64 @@
![image](https://deaon-saasvideo.oss-cn-shanghai.aliyuncs.com/11111.gif)
### 一款兼容vue2vue3的图片预览插件视频预览支持图片视频混用支持单张多张左右滑动放大缩小
### 基础使用方法
```javascript
<template>
<image v-for="(item,idx) in imgList" :src="item" :key="idx" @tap="handleClick(idx)"></image>
<g-preview-img :imgList="imgList" ref="preview"><g-preview-img>
</template>
<script setup>
import { ref } from 'vue'
const preview = ref(null)
const imgList = ['图片路径1','图片路径2']
const handleClick = (idx)=>{
// idx为要打开的图片的索引也可以不传默认打开第一张
// handlePreviewImg的参数支持传入单张图片地址或单个视频地址
preview.value.handlePreviewImg(idx)
}
</script>
```
| 属性名/事件 | 类型 | 默认值 | 说明 |
| ----------------- | ------------ | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| modeClass | Array/String | \['fade', 'zoom-out'] | uni-transition组件过渡效果可选值见 <https://uniapp.dcloud.net.cn/component/uniui/uni-transition.html#mode-class-%E5%86%85%E7%BD%AE%E8%BF%87%E6%B8%A1%E5%8A%A8%E7%94%BB%E7%B1%BB%E5%9E%8B%E8%AF%B4%E6%98%8E> |
| indicatorDotsType | Boolean | false | 多张图片的指示器ture为圆点false数字当图片列表只有一张图片时默认不展示指示器 |
| imgList | Array | | 图片列表 |
| disabledScale | Boolean | false | 是否禁止双指放大缩小 |
| @preview | 打开关闭事件 | | 接受一个参数ture为开启false为关闭 |
| @changeImg | 图片切换的事件 | | 参数为当前的图片索引 |
#### 插槽,自定义翻页按钮
```js
<g-preview-img :imgList="imgList" ref="preview">
<template>
<!--你的翻页按钮-->
<view @tap.stop="previousImg">上一页</view>
<view @tap.stop="nextImg">下一页</view>
</template>
</g-preview-img>
<script>
const preview = ref(null)
//上一页的方法
const previousImg = ()=>{
preview.value.previousImg()
}
//下一页的方法
const previousImg = ()=>{
preview.value.nextImg()
}
</script>
```
#### 支持uniapp原生swiper的属性
插件内部swiper标签上绑定了$attrs,所以在使用时可以传入一些swiper的属性
注意不要传disable-touch这个属性会有意想不到的错误
**插件bug会及时修复**

View File

@@ -0,0 +1,24 @@
## 1.1.12023-08-01
优化文档
## 1.1.02023-08-01
优化文档
## 1.0.92023-07-10
优化文档
## 1.0.82023-06-25
优化文档
## 1.0.72023-06-25
优化文档
## 1.0.62023-05-26
优化文档
## 1.0.52023-05-22
优化文档
## 1.0.42023-04-30
新增图片放大功能解决原生组件和tabbar导航栏等无法覆盖的问题
## 1.0.32023-04-28
优化文档
## 1.0.22023-04-28
优化文档
## 1.0.12023-04-28
新增长按事件
## 1.0.02023-04-28
插件上线

View File

@@ -0,0 +1,121 @@
<template>
<view class="previewImage" v-if="show" @tap="close">
<view class="page" v-if="urls.length > 0">
<text class="text">{{ current + 1 }} / {{ urls.length }}</text>
</view>
<swiper class="swiper" :current="current" @change="swiperChange" @touchstart="handleTouchStart" @touchend="handleTouchEnd">
<swiper-item v-for="(item, index) in urls" :key="index">
<movable-area class="movable-area" scale-area>
<movable-view class="movable-view" direction="all" :inertia="true" damping="100" scale="true" scale-min="1" scale-max="4" :scale-value="scale">
<scroll-view scroll-y="true" class="uni-scroll-view">
<view class="scroll-view"><image :key="index" class="image" :src="item" mode="widthFix" @longpress="onLongpress(item)" /></view>
</scroll-view>
</movable-view>
</movable-area>
</swiper-item>
</swiper>
</view>
</template>
<script>
export default {
props: {
urls: {
type: Array,
required: true,
default: () => {
return [];
}
}
},
data() {
return {
show: false,
current: 0, //当前页
scale: 1,
isZooming: false // 是否处于缩放状态
};
},
methods: {
//打开
open(current) {
this.current = this.urls.findIndex(item => item === current);
this.show = true;
this.$emit('open');
},
//关闭
close() {
if (!this.isZooming) {
this.show = false;
this.current = 0;
this.$emit('close');
}
},
//图片改变
swiperChange(e) {
this.current = e.detail.current;
},
//监听长按
onLongpress(e) {
this.$emit('onLongpress', e);
},
handleTouchStart() {
this.isZooming = true;
},
handleTouchEnd() {
this.isZooming = false;
}
}
};
</script>
<style lang="scss" scoped>
.previewImage {
z-index: 9999;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #000000;
.swiper {
width: 100%;
height: 100vh;
swiper-item {
.movable-area {
height: 100%;
width: 100%;
.movable-view {
width: 100%;
min-height: 100%;
.scroll-view {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
.image {
width: 100%;
height: auto;
}
}
}
}
}
}
.page {
position: absolute;
z-index: 9999;
width: 100%;
top: 60rpx;
text-align: center;
.text {
color: #fff;
font-size: 32rpx;
background-color: rgba(0, 0, 0, 0.5);
padding: 3rpx 16rpx;
border-radius: 20rpx;
user-select: none;
}
}
}
</style>

View File

@@ -0,0 +1,81 @@
{
"id": "q-previewImage",
"displayName": "图片预览、多图左右滑动、图片放大、支持覆盖原生组件、原生导航栏、tabbar",
"version": "1.1.1",
"description": "最简洁的模拟图片预览,支持长按事件,多图左右滑动,大图上下滑动查看,支持图片放大,支持覆盖原生组件/原生导航栏/tabbar 支持vue2/vue3/app/小程序/h5",
"keywords": [
"图片预览"
],
"repository": "",
"engines": {
"HBuilderX": "^3.4.14"
},
"dcloudext": {
"type": "component-vue",
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": ""
},
"uni_modules": {
"dependencies": [],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"Vue": {
"vue2": "y",
"vue3": "y"
},
"App": {
"app-vue": "y",
"app-nvue": "n"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "u",
"微信浏览器(Android)": "u",
"QQ浏览器(Android)": "u"
},
"H5-pc": {
"Chrome": "u",
"IE": "u",
"Edge": "u",
"Firefox": "u",
"Safari": "u"
},
"小程序": {
"微信": "y",
"阿里": "u",
"百度": "u",
"字节跳动": "u",
"QQ": "u",
"钉钉": "u",
"快手": "u",
"飞书": "u",
"京东": "u"
},
"快应用": {
"华为": "u",
"联盟": "u"
}
}
}
}
}

View File

@@ -0,0 +1,244 @@
# 最简洁的模拟图片预览,支持长按事件,多图左右滑动,大图上下滑动查看,支持图片放大,支持覆盖原生组件/原生导航栏/tabbar 支持vue2/vue3/app/小程序/h5
- 为了解决项目中因一些特殊原因无法使用uni.previewImage例如App.onShow或者页面的oShow中写了方法。
- 如果用uni.previewImage每次预览图片都会进到onShow的方法里
- 可以基本实现官方的预览图片功能但是体验不如uni.previewImage()
- 如没有特殊原因还是推荐官方的uni.previewImage()
## 安装指引
##1. 在插件市场打开本插件页面,在右侧点击`使用 HBuilderX 导入插件`,选择要导入的项目点击确定
##2. 使用方法 vue2写法
```
<template>
<view>
<video v-if="videoShow" id="myVideo" src="https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/%E7%AC%AC1%E8%AE%B2%EF%BC%88uni-app%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D%EF%BC%89-%20DCloud%E5%AE%98%E6%96%B9%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B@20200317.mp4" controls></video>
<image v-for="(item, index) in imgs" :key="index" :src="item" @click="preview(item)"></image>
<q-previewImage ref="previewImage" :urls="imgs" @onLongpress="onLongpress" @open="open" @close="close"></q-previewImage>
</view>
</template>
<script>
export default {
data() {
return {
videoShow:true,//video组件是否显示
imgs: [],
};
},
methods: {
preview(url) {
this.imgs = ['https://web-assets.dcloud.net.cn/unidoc/zh/multiport-20210812.png', 'https://web-assets.dcloud.net.cn/unidoc/zh/uni-function-diagram.png'] //设置图片数组
// #ifdef MP-WEIXIN
this.$nextTick(()=>{
this.$refs.previewImage.open(url); // 传入当前选中的图片地址(小程序必须添加$nextTick解决组件首次加载无图)
})
// #endif
// #ifndef MP-WEIXIN
this.$refs.previewImage.open(url); // 传入当前选中的图片地址
// #endif
},
onLongpress(e){ //长按事件
console.log('当前长按的图片是' + e);
uni.showActionSheet({
itemList: ['转发给朋友', '保存到手机'],
success: function (res) {
console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
},
fail: function (res) {
console.log(res.errMsg);
}
});
},
/* open和close方法一般用不到但是在一些特殊场景会用到
* 比如预览图片时你需要覆盖 NavigationBar和 TabBar
* 或者在app中需要预览图片时覆盖住原生组件比如video或者map等
* 你可以根据open和close去做一些操作例如隐藏导航栏或者隐藏一些原生组件等
*/
open(){ //监听组件显示 隐藏TabBar和NavigationBar隐藏video原生组件
// uni.hideTabBar()
// uni.setNavigationBarColor({
// frontColor: '#000000', // 设置前景色为黑色
// backgroundColor: '#000000', // 设置背景色为黑色
// })
// this.videoShow = false
},
close(){ //监听组件隐藏 显示TabBar和NavigationBar显示video原生组件
// uni.showTabBar()
// uni.setNavigationBarColor({
// frontColor: '#ffffff', // 设置前景色为白色
// backgroundColor: '#000000', // 设置背景色为黑色
// })
// this.videoShow = true
}
}
};
</script>
```
##3. vue3 setup写法
```
<template>
<view>
<video v-if="videoShow" id="myVideo" src="https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/%E7%AC%AC1%E8%AE%B2%EF%BC%88uni-app%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D%EF%BC%89-%20DCloud%E5%AE%98%E6%96%B9%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B@20200317.mp4" controls></video>
<image v-for="(item, index) in imgs" :key="index" :src="item" @click="preview(item)"></image>
<q-previewImage ref="previewImage" :urls="imgs" @onLongpress="onLongpress" @open="open" @close="close"></q-previewImage>
</view>
</template>
<script setup>
import { reactive, ref, toRefs,nextTick } from 'vue';
const data = reactive({
videoShow:true,//video组件是否显示
imgs: [],
});
const previewImage = ref(null);
const { imgs,videoShow } = toRefs(data)// 解构
const preview = url => {
data.imgs = ['https://web-assets.dcloud.net.cn/unidoc/zh/multiport-20210812.png', 'https://web-assets.dcloud.net.cn/unidoc/zh/uni-function-diagram.png'] //设置图片数组
// #ifdef MP-WEIXIN
nextTick(()=>{
previewImage.value.open(url); // 传入当前选中的图片地址(小程序必须添加nextTick解决组件首次加载无图)
})
// #endif
// #ifndef MP-WEIXIN
previewImage.value.open(url); // 传入当前选中的图片地址
// #endif
};
const onLongpress = e =>{
console.log('当前长按的图片是' + e);
uni.showActionSheet({
itemList: ['转发给朋友', '保存到手机'],
success: function (res) {
console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
},
fail: function (res) {
console.log(res.errMsg);
}
});
}
/* open和close方法一般用不到但是在一些特殊场景会用到
* 比如预览图片时你需要覆盖 NavigationBar和 TabBar
* 或者在app中需要预览图片时覆盖住原生组件比如video或者map等
* 你可以根据open和close去做一些操作例如隐藏导航栏或者隐藏一些原生组件等
*/
const open = () => { //监听组件显示 隐藏TabBar和NavigationBar隐藏video原生组件
// uni.hideTabBar()
// uni.setNavigationBarColor({
// frontColor: '#000000', // 设置前景色为黑色
// backgroundColor: '#000000', // 设置背景色为黑色
// })
// data.videoShow = false
}
const close = () => { //监听组件隐藏 显示TabBar和NavigationBar显示video原生组件
// uni.showTabBar()
// uni.setNavigationBarColor({
// frontColor: '#ffffff', // 设置前景色为白色
// backgroundColor: '#000000', // 设置背景色为黑色
// })
// data.videoShow = true
}
</script>
```
##4. 项目示例 (一般返回的数据图片是以逗号或特殊字符分割的字符串点击时就需要传两个参数一个是图片数组一个是当前图片的index)
## 注意q-previewImage不要写在循环体中imgs其实就是用来存放当前图片的数组每次点击每次赋值就行
```
<template>
<view>
<video v-if="videoShow" id="myVideo" src="https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/%E7%AC%AC1%E8%AE%B2%EF%BC%88uni-app%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D%EF%BC%89-%20DCloud%E5%AE%98%E6%96%B9%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B@20200317.mp4" controls></video>
<view v-for="(item, index) in list" :key="index" class="list">
<image :src="i" mode="aspectFill" v-for="(i,imgindex) in item.urls.split(',')" @click.stop="preimg(item.urls.split(','),imgindex)"></image>
<view>
<q-previewImage ref="previewImage" :urls="imgs" @onLongpress="onLongpress" @open="open" @close="close"></q-previewImage>
</view>
</template>
<script>
export default {
data() {
return {
videoShow:true,//是否显示video组件
imgs: [],//imgs其实就是用来存放当前图片的数组每次点击每次赋值就行
};
},
methods: {
preimg(urls,index){
this.imgs = urls //imgs其实就是用来存放当前图片的数组每次点击每次赋值就行
// #ifdef MP-WEIXIN
this.$nextTick(()=>{
this.$refs.previewImage.open(this.imgs[index]); // 传入当前选中的图片地址(小程序必须添加$nextTick解决组件首次加载无图)
})
// #endif
// #ifndef MP-WEIXIN
this.$refs.previewImage.open(this.imgs[index]); // 传入当前选中的图片地址
// #endif
},
onLongpress(e){ //长按事件
console.log('当前长按的图片是' + e);
uni.showActionSheet({
itemList: ['转发给朋友', '保存到手机'],
success: function (res) {
console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
},
fail: function (res) {
console.log(res.errMsg);
}
});
},
/* open和close方法一般用不到但是在一些特殊场景会用到
* 比如预览图片时你需要覆盖 NavigationBar和 TabBar
* 或者在app中需要预览图片时覆盖住原生组件比如video或者map等
* 你可以根据open和close去做一些操作例如隐藏导航栏或者隐藏一些原生组件等
*/
open(){ //监听组件显示 隐藏TabBar和NavigationBar隐藏video原生组件
// uni.hideTabBar()
// uni.setNavigationBarColor({
// frontColor: '#000000', // 设置前景色为黑色
// backgroundColor: '#000000', // 设置背景色为黑色
// })
// this.videoShow = false
},
close(){ //监听组件隐藏 显示TabBar和NavigationBar显示video原生组件
// uni.showTabBar()
// uni.setNavigationBarColor({
// frontColor: '#ffffff', // 设置前景色为白色
// backgroundColor: '#000000', // 设置背景色为黑色
// })
// this.videoShow = true
}
}
};
</script>
```
## 如果插件对您有一点帮助,请给个五星好评,感谢支持
## 如有问题请加qq 965969604