23 Commits

Author SHA1 Message Date
qsh
a684d255d2 sc 2025-06-19 18:05:43 +08:00
qsh
70fe0f0c42 sc 2025-06-19 16:02:14 +08:00
qsh
62896b197d sc 2025-06-19 11:16:24 +08:00
qsh
9b677ade15 sc 2025-06-18 16:20:59 +08:00
qsh
4bd08bde70 sc 2025-06-18 16:01:08 +08:00
qsh
e889c92d35 sc 2025-06-11 17:16:41 +08:00
qsh
7442289a87 sc 2025-06-11 17:16:12 +08:00
qsh
d70a0141cc sc 2025-03-17 18:55:44 +08:00
qsh
459baca3f8 sc 2025-03-17 17:27:11 +08:00
f5c0df688c Merge pull request '样式调整' (#41) from dev-qsh into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/41
2024-02-02 17:13:02 +08:00
qsh
38cc93cba4 样式调整 2024-02-02 17:12:38 +08:00
zcx
ccef999bbe Merge pull request '失效' (#40) from dev-zcx into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/40
2024-02-02 16:27:06 +08:00
zcx
589eec1d80 失效 2024-02-02 16:26:21 +08:00
zcx
242744c0f9 Merge pull request 'dev-zcx' (#38) from dev-zcx into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/38
2024-02-02 16:24:24 +08:00
zcx
e67e1edf12 助力 2024-02-02 14:16:26 +08:00
zcx
8f50f42f8c 助力 2024-02-02 14:05:43 +08:00
zcx
65149c38cd 助力 2024-02-02 13:55:15 +08:00
zcx
c26e306b3a 助力 2024-02-02 13:51:36 +08:00
6141270437 Merge pull request '添加抖音小程序配置' (#35) from dev-qsh into master
Reviewed-on: http://114.55.169.15:3000/huxiaofeng666/jwl-applet/pulls/35
2024-01-30 15:05:23 +08:00
qsh
074b53f307 添加抖音小程序 2024-01-30 15:03:55 +08:00
qsh
ab05529015 活动 2024-01-27 21:21:24 +08:00
zcx
9e24edad28 活动接口 2024-01-26 20:50:31 +08:00
zcx
67b3e63de9 活动接口 2024-01-26 20:41:25 +08:00
25 changed files with 1258 additions and 986 deletions

View File

@@ -6,5 +6,8 @@ VITE_APP_ENV = 'development'
# 金武联驾校/开发环境 # 金武联驾校/开发环境
VITE_APP_BASE_API = 'https://jwl.ahduima.com/' VITE_APP_BASE_API = 'https://jwl.ahduima.com/'
# VITE_APP_BASE_API = 'http://tk-api.ahfkbg.com/'
# #
VITE_WEB_BASE_URL = 'https://jwl.ahduima.com' VITE_WEB_BASE_URL = 'https://jwl.ahduima.com'
# 资源地址
VITE_RESOURSE_URL = 'http://huodong.ahduima.com'

View File

@@ -9,3 +9,6 @@ VITE_APP_BASE_API = 'https://jwl.ahduima.com/'
# #
VITE_WEB_BASE_URL = 'https://jwl.ahduima.com' VITE_WEB_BASE_URL = 'https://jwl.ahduima.com'
# 资源地址
VITE_RESOURSE_URL = 'http://huodong.ahduima.com'

View File

@@ -4,8 +4,10 @@
"scripts": { "scripts": {
"dev:h5": "uni", "dev:h5": "uni",
"dev": "uni -p mp-weixin", "dev": "uni -p mp-weixin",
"dev:dy": "uni -p mp-toutiao",
"build:h5": "uni build", "build:h5": "uni build",
"build": "uni build -p mp-weixin", "build": "uni build -p mp-weixin",
"build:dy": "uni build -p mp-toutiao",
"build-test:mp-weixin": "uni --mode test -p mp-weixin" "build-test:mp-weixin": "uni --mode test -p mp-weixin"
}, },
"dependencies": { "dependencies": {
@@ -14,6 +16,7 @@
"@dcloudio/uni-components": "3.0.0-alpha-3060420220922001", "@dcloudio/uni-components": "3.0.0-alpha-3060420220922001",
"@dcloudio/uni-h5": "3.0.0-alpha-3060420220922001", "@dcloudio/uni-h5": "3.0.0-alpha-3060420220922001",
"@dcloudio/uni-mp-weixin": "3.0.0-alpha-3060420220922001", "@dcloudio/uni-mp-weixin": "3.0.0-alpha-3060420220922001",
"@dcloudio/uni-mp-toutiao": "3.0.0-alpha-3060420220922001",
"jsencrypt-plus": "^0.1.0", "jsencrypt-plus": "^0.1.0",
"pinia": "2.0.36", "pinia": "2.0.36",
"pinia-plugin-persist-uni": "^1.2.0", "pinia-plugin-persist-uni": "^1.2.0",

28
project.config.json Normal file
View File

@@ -0,0 +1,28 @@
{
"appid": "wx24c1b58020a5ce66",
"compileType": "miniprogram",
"libVersion": "3.3.3",
"packOptions": {
"ignore": [],
"include": []
},
"setting": {
"coverView": true,
"es6": true,
"postcss": true,
"minified": true,
"enhance": true,
"showShadowRootInWxmlPanel": true,
"packNpmRelationList": [],
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
}
},
"condition": {},
"editorSetting": {
"tabIndent": "insertSpaces",
"tabSize": 2
}
}

View File

@@ -0,0 +1,7 @@
{
"description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
"projectname": "jwl-applet",
"setting": {
"compileHotReLoad": true
}
}

118
src/jtools/api/activity.js Normal file
View File

@@ -0,0 +1,118 @@
import request from '../request/index.js';
//查询活动列表
export function queryActivityList(data) {
return request({
url: 'activity/applet/activity/list',
method: 'get',
data,
noToken: true
});
}
//查询活动详情
export function queryActivityDetail(data) {
return request({
url: 'activity/applet/activity/detail',
method: 'get',
data,
noToken: true
});
}
//查询抽奖次数
export function queryLuckyNum(data) {
return request({
url: 'activity/applet/activity/lucky/num',
method: 'get',
data,
noToken: true
});
}
//查询中奖结果
export function queryLuckyResult(data) {
return request({
url: 'activity/applet/activity/lucky/result',
method: 'get',
data,
noToken: true
});
}
//录入中奖结果
export function saveWinner(data) {
return request({
url: 'activity/applet/activity/winner/save',
method: 'POST',
data,
noToken: true
});
}
//核销
export function receiveWinner(data) {
return request({
url: 'activity/applet/activity/winner/receive',
method: 'POST',
data,
noToken: true
});
}
//查询中奖记录
export function getLuckyRecord(data) {
return request({
url: 'activity/applet/activity/lucky/record',
method: 'get',
data,
noToken: true
});
}
//查询中奖记录
export function canRecieveGift(data) {
return request({
url: 'activity/applet/activity/receive/user',
method: 'get',
data,
noToken: true
});
}
//查询中奖信息
export function queryWinnerInfo(data) {
return request({
url: 'activity/applet/activity/winner/info',
method: 'get',
data,
noToken: true
});
}
//查询助力信息
export function queryHelpInfo(data) {
return request({
url: 'activity/applet/activity/help/info',
method: 'get',
data,
noToken: true
});
}
//保存助力信息
export function saveHelpInfo(data) {
return request({
url: 'activity/applet/activity/help/save',
method: 'post',
data,
noToken: true
});
}
//微信登录获取手机号
export function wxLogin(data) {
return request({
url: 'activity/applet/activity/wx/login',
method: 'post',
data,
noToken: true
});
}

View File

@@ -32,7 +32,7 @@ function service(options = {}) {
useUserStore().logoutWithoutToken() 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'&&res.data.code != 200) {
uni.showToast({ uni.showToast({
title: res?.data?.message || '访问出错', title: res?.data?.message || '访问出错',
icon: 'none' icon: 'none'

View File

@@ -1,238 +1,157 @@
import { import { defineStore } from 'pinia';
defineStore
} from 'pinia';
import http from '@/jtools/request/index'; import http from '@/jtools/request/index';
import { import { queryQuestion, getVersion, querySysConfig } from '@/jtools/api/question';
queryQuestion,
getVersion,
querySysConfig
} from '@/jtools/api/question';
import storage from '@/jtools/storage'; import storage from '@/jtools/storage';
let JSON_SPLIT_LENGTH = 10;
const question = defineStore({ const question = defineStore({
id: 'question', id: 'question',
state: () => ({ state: () => ({
currentCartype: storage.get('carType') || '1001', currentCartype: storage.get('carType') || '1001',
currentCarName: storage.get('carName') || '小车C1/C2/C3', currentCarName: storage.get('carName') || '小车C1/C2/C3',
orderQuestion_subject1: storage.get('question_subject1') || [], //科目一顺序做题 orderQuestion_subject1: [], //科目一顺序做题
orderQuestion_subject4: storage.get('question_subject4') || [], //科目四顺序做题 orderQuestion_subject4: [], //科目四顺序做题
currentIndex_subject1: 0, //科目一索引 顺序做题 currentIndex_subject1: 0, //科目一索引 顺序做题
currentIndex_subject4: 0, //科目四索引 顺序做题 currentIndex_subject4: 0, //科目四索引 顺序做题
curSubject: storage.get('curSubject') || '1', curSubject: storage.get('curSubject') || '1',
loading_subject1: false, loading_subject1: false,
loading_subject4: false, loading_subject4: false,
version: storage.get('version') || '' version: storage.get('version') || ''
}), }),
actions: { actions: {
resetStorage(){ resetStorage() {
this.currentIndex_subject1=0 this.currentIndex_subject1 = 0;
this.currentIndex_subject4=0 this.currentIndex_subject4 = 0;
this.curSubject=0 this.curSubject = 0;
storage.remove('curSubject') storage.remove('curSubject');
storage.remove('wrongList_subject1') storage.remove('wrongList_subject1');
storage.remove('wrongList_subject4') storage.remove('wrongList_subject4');
storage.remove('rightList_subject1') storage.remove('rightList_subject1');
storage.remove('rightList_subject4') storage.remove('rightList_subject4');
this.getAllQuestion() // this.getAllQuestion()
}, },
getAllQuestion() { getAllQuestion() {
this.currentCartype = storage.get('carType') || '1001' this.currentCartype = storage.get('carType') || '1001';
getVersion(this.currentCartype).then(resp => { getVersion(this.currentCartype).then(resp => {
if (resp.code === '0000') { if (resp.code === '0000') {
querySysConfig(this.currentCartype, 'QuestionBank').then(res => { querySysConfig(this.currentCartype, 'QuestionBank').then(res => {
const urlList = JSON.parse(res.data.configJson) const urlList = JSON.parse(res.data.configJson);
const urlOne = urlList.find(item => item.subject == '1').url const urlOne = urlList.find(item => item.subject == '1').url;
const urlFour = urlList.find(item => item.subject == '4').url const urlFour = urlList.find(item => item.subject == '4').url;
if (this.version != resp.data) { if (this.version != resp.data) {
this.version = resp.data this.version = resp.data;
storage.set('version', resp.data) storage.set('version', resp.data);
this.getOrderQuestion_sub1(true, urlOne) this.getOrderQuestion_sub1(true, urlOne);
this.getOrderQuestion_sub4(true, urlFour) this.getOrderQuestion_sub4(true, urlFour);
} else { } else {
this.getOrderQuestion_sub1(false, urlOne) this.getOrderQuestion_sub1(false, urlOne);
this.getOrderQuestion_sub4(false, urlOne) this.getOrderQuestion_sub4(false, urlFour);
} }
}) });
}
});
},
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) {
}, this.curSubject = val;
divideArray(array, numChunks) { storage.set('curSubject', val);
var chunkSize = Math.ceil(array.length / numChunks); },
var dividedArray = []; // 获取顺序做题科目1
for (var i = 0; i < array.length; i += chunkSize) { getOrderQuestion_sub1(isUpdate, url) {
dividedArray.push(array.slice(i, i + chunkSize)); if (isUpdate) {
} this.loading_subject1 = true;
return dividedArray; this.loadAllQuestion(url, 1);
}, } else {
this.orderQuestion_subject1 = [];
//改变当前科目 for (let i = 0; i < JSON_SPLIT_LENGTH; i++) {
changeSubject(val) { const arr = uni.getStorageSync(`question1Sub${i + 1}`) || [];
this.curSubject = val this.orderQuestion_subject1 = [...this.orderQuestion_subject1, ...arr];
storage.set('curSubject', val) }
}, if (this.orderQuestion_subject1.length == 0) {
// 获取顺序做题科目1 this.loading_subject1 = true;
getOrderQuestion_sub1(isUpdate, url) { this.loadAllQuestion(url, 1);
if (isUpdate) { }
this.loading_subject1 = true }
const that = this },
uni.request({ // 获取顺序做题科目4
url: url, getOrderQuestion_sub4(isUpdate, url) {
success(resp) { if (isUpdate) {
if (resp.data) { this.loading_subject4 = true;
that.orderQuestion_subject1 = resp.data.data this.loadAllQuestion(url, 4);
const diveList = that.divideArray(that.orderQuestion_subject1, 5) } else {
that.loading_subject1 = false this.orderQuestion_subject4 = [];
uni.setStorageSync('questionOneSub1', diveList[0]) for (let i = 0; i < JSON_SPLIT_LENGTH; i++) {
uni.setStorageSync('questionOneSub2', diveList[1]) const arr = uni.getStorageSync(`question4Sub${i + 1}`) || [];
uni.setStorageSync('questionOneSub3', diveList[2]) this.orderQuestion_subject4 = [...this.orderQuestion_subject4, ...arr];
uni.setStorageSync('questionOneSub4', diveList[3]) }
uni.setStorageSync('questionOneSub5', diveList[4]) if (this.orderQuestion_subject4.length == 0) {
const falseList = storage.get('wrongList_subject1') || [] this.loading_subject4 = true;
const trueList = storage.get('rightList_subject1') || [] this.loadAllQuestion(url, 4);
const falseArr = [] }
const rightArr = [] }
that.orderQuestion_subject1.forEach(item => { },
if (falseList.includes(item.questionId)) { // 加载线上题目
falseArr.push(item.questionId) loadAllQuestion(url, course) {
} const that = this;
if (trueList.includes(item.questionId)) { uni.request({
rightArr.push(item.questionId) url: url,
} success(resp) {
}) if (resp?.data) {
storage.set('wrongList_subject1', falseArr) try {
storage.set('rightList_subject1', rightArr) for (let i = 0; i < JSON_SPLIT_LENGTH; i++) {
} storage.remove(`question${course}Sub${i + 1}`);
} }
}) that[`orderQuestion_subject${course}`] = resp.data?.data || [];
} else { const diveList = that.divideArray(that[`orderQuestion_subject${course}`], JSON_SPLIT_LENGTH);
const list1 = uni.getStorageSync('questionOneSub1') || [] that[`loading_subject${course}`] = false;
const list2 = uni.getStorageSync('questionOneSub2') || [] for (let i = 0; i < JSON_SPLIT_LENGTH; i++) {
const list3 = uni.getStorageSync('questionOneSub3') || [] uni.setStorageSync(`question${course}Sub${i + 1}`, diveList[i]);
const list4 = uni.getStorageSync('questionOneSub4') || [] }
const list5 = uni.getStorageSync('questionOneSub5') || [] const falseList = storage.get(`wrongList_subject${course}`) || [];
this.orderQuestion_subject1 = [...list1, ...list2, ...list3, ...list4, ...list5] const trueList = storage.get(`rightList_subject${course}`) || [];
if (this.orderQuestion_subject1 && this.orderQuestion_subject1.length) { const falseArr = [];
const rightArr = [];
} else { that[`orderQuestion_subject${course}`].forEach(item => {
this.loading_subject1 = true if (falseList.includes(item.questionId)) {
const that = this falseArr.push(item.questionId);
uni.request({ }
url: url, if (trueList.includes(item.questionId)) {
success(resp) { rightArr.push(item.questionId);
if (resp.data) { }
that.orderQuestion_subject1 = resp.data.data });
const diveList = that.divideArray(that.orderQuestion_subject1, 5) storage.set(`wrongList_subject${course}`, falseArr);
that.loading_subject1 = false storage.set(`rightList_subject${course}`, rightArr);
uni.setStorageSync('questionOneSub1', diveList[0]) } catch (err) {
uni.setStorageSync('questionOneSub2', diveList[1]) console.log(err);
uni.setStorageSync('questionOneSub3', diveList[2]) uni.showToast({
uni.setStorageSync('questionOneSub4', diveList[3]) title: '题库下载异常,请稍后再试',
uni.setStorageSync('questionOneSub5', diveList[4]) icon: 'none'
const falseList = storage.get('wrongList_subject1') || [] });
const trueList = storage.get('rightList_subject1') || [] }
const falseArr = [] } else {
const rightArr = [] uni.showToast({
that.orderQuestion_subject1.forEach(item => { title: '加载题目失败,请稍后再试',
if (falseList.includes(item.questionId)) { icon: 'none'
falseArr.push(item.questionId) });
} }
if (trueList.includes(item.questionId)) { }
rightArr.push(item.questionId) });
} },
}) //获取索引
storage.set('wrongList_subject1', falseArr) getCurrentIndex(index, val) {
storage.set('rightList_subject1', rightArr) this[`currentIndex_subject${val}`] = index;
} }
} }
})
}
}
},
// 获取顺序做题科目4
getOrderQuestion_sub4(isUpdate, url) {
if (isUpdate) {
this.loading_subject4 = true
const that = this
uni.request({
url: url,
success(resp) {
if (resp.data) {
that.orderQuestion_subject4 = resp.data.data
const diveList = that.divideArray(that.orderQuestion_subject4, 5)
that.loading_subject4 = false
uni.setStorageSync('questionFourSub1', diveList[0])
uni.setStorageSync('questionFourSub2', diveList[1])
uni.setStorageSync('questionFourSub3', diveList[2])
uni.setStorageSync('questionFourSub4', diveList[3])
uni.setStorageSync('questionFourSub5', diveList[4])
const falseList = storage.get('wrongList_subject4') || []
const trueList = storage.get('rightList_subject4') || []
const falseArr = []
const rightArr = []
that.orderQuestion_subject4.forEach(item => {
if (falseList.includes(item.questionId)) {
falseArr.push(item.questionId)
}
if (trueList.includes(item.questionId)) {
rightArr.push(item.questionId)
}
})
storage.set('wrongList_subject4', falseArr)
storage.set('rightList_subject4', rightArr)
}
}
})
} else {
const list1 = uni.getStorageSync('questionFourSub1') || []
const list2 = uni.getStorageSync('questionFourSub2') || []
const list3 = uni.getStorageSync('questionFourSub3') || []
const list4 = uni.getStorageSync('questionFourSub4') || []
const list5 = uni.getStorageSync('questionFourSub5') || []
this.orderQuestion_subject4 = [...list1, ...list2, ...list3, ...list4, ...list5]
if (this.orderQuestion_subject4 && this.orderQuestion_subject4.length) {
} else {
this.loading_subject4 = true
const that = this
uni.request({
url: url,
success(resp) {
if (resp.data) {
that.orderQuestion_subject4 = resp.data.data
const diveList = that.divideArray(that.orderQuestion_subject4, 5)
that.loading_subject4 = false
uni.setStorageSync('questionFourSub1', diveList[0])
uni.setStorageSync('questionFourSub2', diveList[1])
uni.setStorageSync('questionFourSub3', diveList[2])
uni.setStorageSync('questionFourSub4', diveList[3])
uni.setStorageSync('questionFourSub5', diveList[4])
const falseList = storage.get('wrongList_subject4') || []
const trueList = storage.get('rightList_subject4') || []
const falseArr = []
const rightArr = []
that.orderQuestion_subject4.forEach(item => {
if (falseList.includes(item.questionId)) {
falseArr.push(item.questionId)
}
if (trueList.includes(item.questionId)) {
rightArr.push(item.questionId)
}
})
storage.set('wrongList_subject4', falseArr)
storage.set('rightList_subject4', rightArr)
}
}
})
}
}
},
//获取索引
getCurrentIndex(index, val) {
this[`currentIndex_subject${val}`] = index
}
}
}); });
export default question; export default question;

View File

@@ -66,7 +66,13 @@
"usingComponents" : true "usingComponents" : true
}, },
"mp-toutiao" : { "mp-toutiao" : {
"usingComponents" : true "usingComponents" : true,
"appid" : "ttbbd1cd6c24e1c00801",
"setting" : {
"es6" : true,
"postcss" : true,
"minified" : true
}
}, },
"uniStatistics" : { "uniStatistics" : {
"enable" : false "enable" : false

View File

@@ -8,7 +8,7 @@
{ {
"path": "pages/index/index", "path": "pages/index/index",
"style": { "style": {
"navigationStyle": "custom", "navigationBarTitleText": "金武联驾考",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
}, },
@@ -84,13 +84,6 @@
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
}, },
{
"path": "pages/me/tijian",
"style": {
"navigationBarTitleText": "上传证件照",
"enablePullDownRefresh": false
}
},
{ {
"path": "pages/me/school", "path": "pages/me/school",
"style": { "style": {
@@ -105,13 +98,13 @@
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
}, },
{ {
"path": "pages/index/testTip", "path": "pages/index/testTip",
"style": { "style": {
"navigationBarTitleText": "模拟考试", "navigationBarTitleText": "模拟考试",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
}, },
{ {
"path": "pages/login/login", "path": "pages/login/login",
"style": { "style": {
@@ -146,58 +139,56 @@
"navigationBarTitleText": "支付结果", "navigationBarTitleText": "支付结果",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
}, { },
{
"path": "pages/index/trueTest", "path": "pages/index/trueTest",
"style": { "style": {
"navigationBarTitleText": "真实考场模拟", "navigationBarTitleText": "真实考场模拟",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
}, },
{ {
"path": "pages/me/uploadPic", "path": "pages/index/secretPapers",
"style": { "style": {
"navigationBarTitleText": "上传证件照", "navigationBarTitleText": "考前密卷",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
}, },
{ {
"path": "pages/index/secretPapers", "path": "pages/me/changeCarType",
"style": { "style": {
"navigationBarTitleText": "考前密卷", "navigationBarTitleText": "切换车型",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
}, },
{ {
"path": "pages/me/changeCarType", "path": "pages/index/activity",
"style": { "style": {
"navigationBarTitleText": "切换车型", "navigationBarTitleText": "活动",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
}, },
{ {
"path" : "pages/index/activity", "path": "pages/me/myGift",
"style" : "style": {
{ "navigationBarTitleText": "我的奖品",
"navigationBarTitleText" : "活动", "enablePullDownRefresh": false
"enablePullDownRefresh" : false }
} },
}, {
{ "path": "pages/me/qrCode",
"path" : "pages/me/myGift", "style": {
"style" : "navigationBarTitleText": "核销二维码",
{ "enablePullDownRefresh": false
"navigationBarTitleText" : "我的奖品", }
"enablePullDownRefresh" : false },
} {
}, "path": "pages/me/help",
{ "style": {
"path" : "pages/me/qrCode", "navigationBarTitleText": "好友助力",
"style" : "enablePullDownRefresh": true
{ }
"navigationBarTitleText" : "核销二维码", }
"enablePullDownRefresh" : false
}
}
], ],
"globalStyle": { "globalStyle": {
@@ -211,7 +202,8 @@
"selectedColor": "#05C341", "selectedColor": "#05C341",
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"color": "#999999", "color": "#999999",
"list": [{ "list": [
{
"pagePath": "pages/index/index", "pagePath": "pages/index/index",
"iconPath": "static/image/tabbar/tab-home.png", "iconPath": "static/image/tabbar/tab-home.png",
"selectedIconPath": "static/image/tabbar/tab-home-selected.png", "selectedIconPath": "static/image/tabbar/tab-home-selected.png",
@@ -226,4 +218,4 @@
} }
] ]
} }
} }

View File

@@ -134,6 +134,9 @@
mounted() { mounted() {
this.getTitle() this.getTitle()
}, },
onShow() {
this.getTitle()
},
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

View File

@@ -1,22 +1,23 @@
<template> <template>
<view style="padding-bottom: 50px;background-color: #9e0f00;"> <view style="padding-bottom: 50px;background-color: #9e0f00;">
<image class="wp100" mode="widthFix" src="https://jwl-jiakao-bq.oss-cn-hangzhou.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%9B%BE%E7%89%87/ggl_header.png"></image> <image class="wp100" mode="widthFix" src="https://jwl-jiakao-bq.oss-cn-hangzhou.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%9B%BE%E7%89%87/ggl_header.png"></image>
<view class="tip">您今日还剩1次刮奖机会共有999人参加活动</view> <view class="tip">您今日还剩{{actiNum}}次刮奖机会共有{{total}}人参加活动</view>
<view class="scraping"> <view class="scraping">
<scraping-card :result="result" watermark="刮一刮" title="刮一刮赢取大奖" ref="reset" ></scraping-card> <scraping-card style="z-index: 20;" :result="result" watermark="刮一刮" title="刮一刮赢取大奖" ref="reset" @complete="handleComplete" >
<view v-if="showBtn" class="gj"> <cover-view v-if="showBtn" class="gj">
<view class="btn" @tap="handleScrap"> <cover-view class="btn" @tap="handleScrap">
点我刮奖 {{btnText}}
</view> </cover-view>
</view> </cover-view>
</scraping-card>
</view> </view>
<view class="relative mt30 m20lr"> <view class="relative mt30 m20lr">
<image class="wp100" mode="widthFix" src="/static/image/index/tip.png"></image> <image class="wp100" mode="widthFix" src="/static/image/index/tip.png"></image>
<view class="title">中奖名单</view> <view class="title">中奖名单</view>
<view class="card"> <view class="card">
<view v-for="(item, index) in winningList" :key="index" class="card-item"> <view v-for="(item, index) in winningList" :key="index" class="card-item">
<text class="item-text">188****8888</text> <text class="item-text">{{ hidePhoneNumber(item.phone) }}</text>
<text class="item-text">一等奖</text> <text class="item-text">{{ item.awards }}</text>
</view> </view>
</view> </view>
</view> </view>
@@ -24,39 +25,120 @@
<image class="wp100" mode="widthFix" src="/static/image/index/tip.png"></image> <image class="wp100" mode="widthFix" src="/static/image/index/tip.png"></image>
<view class="title">活动说明</view> <view class="title">活动说明</view>
<view class="card"> <view class="card">
<view class="item-text">1. 中奖率100%</view> <u-parse :content="activityRule"></u-parse>
<view class="item-text">2. 报名后可获得一次抽奖机会</view>
<view class="item-text">3. 中奖用户请于"我的-我的奖品"中查看并核销</view>
</view> </view>
</view> </view>
</view> </view>
</template> </template>
<script> <script>
import useUserStore from '@/jtools/store/user'
import ScrapingCard from './scraping.vue' import ScrapingCard from './scraping.vue'
import { queryActivityDetail,queryLuckyNum,queryLuckyResult,saveWinner,getLuckyRecord } from '@/jtools/api/activity'
export default { export default {
components: { components: {
ScrapingCard ScrapingCard
}, },
data() { data() {
return { return {
result: '特等奖', detailId: undefined,
result: '',
btnText: '点我刮奖',
showBtn: true, showBtn: true,
winningList: [1,2,3,4,5,6,7,8] actiNum: 0,
total: 0,
winningList: [],
activityRule: undefined
} }
}, },
onLoad(op) {
this.detailId = op.detailId
this.getActivityDetail()
this.getActivityNum()
this.searchWinningList()
},
methods: { methods: {
handleScrap() { handleScrap() {
this.showBtn = !this.showBtn if(!this.actiNum) {
uni.showToast({
icon: 'none',
title: '暂无抽奖机会'
})
return
}
queryLuckyResult({
detailId: this.detailId
}).then(resp => {
if(resp.code == 200) {
this.result = resp.msg
this.showBtn = !this.showBtn
this.$refs.reset.init()
}
})
},
getActivityDetail() {
queryActivityDetail({detailId: this.detailId}).then(resp => {
if(resp.code == 200) {
this.activityRule = resp.data.activity.activityRule
}
})
},
hidePhoneNumber(phoneNumber) {
// 验证电话号码格式
if (!/^\d{11}$/.test(phoneNumber)) {
return "无效的电话号码";
}
// 替换中间四位数字为星号
return phoneNumber.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
},
getActivityNum() {
queryLuckyNum({
detailId: this.detailId,
phone: useUserStore().userInfo?.phone || ''
}).then(resp => {
if(resp.code == 200) {
this.actiNum = resp.data.drawNum
this.total = resp.data.totalPeople
}
})
},
searchWinningList() {
getLuckyRecord({
detailId: this.detailId,
pageSize: 8
}).then(resp => {
if(resp.code == 200) {
this.winningList = resp.rows
}
})
},
handleComplete() {
saveWinner({
phone: useUserStore().userInfo?.phone || '',
detailId: this.detailId,
awards: this.result
}).then(resp => {
this.btnText = '再刮一次!'
if(resp.code == 200) {
this.getActivityNum()
let help = ",完成助力即可领取奖品!"
uni.showToast({
icon: 'none',
title: `恭喜获得${this.result}` + help
})
this.showBtn = true
}
})
} }
}, },
mounted() {
}
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.tip { .tip {
position: relative; position: relative;
margin-top: -80px; margin-top: -80px;

View File

@@ -1,266 +1,280 @@
<template> <template>
<view class="scraping-happy" id="container"> <view class="scraping-happy" id="container">
<canvas <canvas canvas-id="scraping-happy" class="scraping__canvas" :disable-scroll="true" @touchstart="touchstart"
canvas-id="scraping-happy" @touchmove="touchmove" @touchend="touchend" />
class="scraping__canvas"
:disable-scroll="true"
@touchstart="touchstart"
@touchmove="touchmove"
@touchend="touchend"
/>
<cover-view class="scraping__view"> <cover-view class="scraping__view">
{{ showText }} {{ showText }}
</cover-view> </cover-view>
<slot></slot>
</view> </view>
</template> </template>
<script> <script>
/** @name 水印配置默认值 **/ /** @name 水印配置默认值 **/
const WATERMARK = { const WATERMARK = {
text: '刮一刮', text: '刮一刮',
fontSize: 14, fontSize: 14,
color: '#C5C5C5', color: '#C5C5C5',
}
/** @name 标题配置默认值 **/
const TITLE = {
text: '刮一刮',
fontSize: 16,
color: '#333',
}
/**
* @name 涂层配置默认值
* @property { string } color 涂层颜色
* @property { number } drawSize 清除涂层的画笔大小
*/
const MASK = {
color: '#DDDDDD',
drawSize: 20,
}
/** @name 容错值解决部分机型涂层没有覆盖满的情况主要原因是由于像素尺寸不同导致的应尽可能让width与height保持整数 **/
const TOLERANT = 3;
let ctx = null;
export default {
props: {
/** @name 涂层设置 **/
mask: {
type: [String, Object],
},
/** @name 水印设置 **/
watermark: {
type: [String, Object],
},
/** @name 提示文字 **/
title: {
type: [String, Object],
},
/** @name 刮开百分之多少直接消除图层为0的时候不消除 **/
percentage: {
type: Number,
default: 60,
},
result: {
type: String,
default: ''
}
},
data() {
return {
width: 0,
height: 0,
touchX: 0,
touchY: 0,
showText: ''
}
},
computed: {
maskSetting() {
return {
...MASK,
...(typeof this.mask === 'object' ? this.mask : { text: this.mask }),
}
},
watermarkSetting() {
return {
...WATERMARK,
...(typeof this.watermark === 'object' ? this.watermark : { text: this.watermark }),
};
},
titleSetting() {
return {
...TITLE,
...(typeof this.title === 'object' ? this.title : { text: this.title }),
};
}
},
mounted() {
// 获取画布实例
ctx = uni.createCanvasContext('scraping-happy', this);
this.init();
},
methods: {
/** @name 初始化 **/
init() {
const query = uni.createSelectorQuery().in(this);
query
.select('#container')
.boundingClientRect(({ width, height }) => {
this.width = width;
this.height = height;
setTimeout(() => {
this.initCanvas();
this.showText = this.result
}, 20)
})
.exec();
},
/** @name 初始化canvas状态 **/
initCanvas() {
const { width, height } = this;
// 清空矩形内容
ctx.clearRect(0, 0, width, height);
// 设置画笔颜色
ctx.setFillStyle(this.maskSetting.color);
// 绘制矩形
ctx.fillRect(0, 0, width, height + TOLERANT);
// 绘制水印
this.drawWatermark();
// 绘制提示文字
this.drawTitle();
// 绘制到canvas身上
ctx.draw();
},
/** @name 绘制水印 **/
drawWatermark() {
if (!this.watermarkSetting.text) return;
// 保存当前的绘图上下文
ctx.save();
// 旋转
ctx.rotate((-10 * Math.PI) / 180);
// 水印具体绘制过程
const { width, height } = this;
const watermarkWidth = this.watermarkSetting.text.length * this.watermarkSetting.fontSize;
let x = 0;
let y = 0;
let i = 0;
while ((x <= width * 5 || y <= height * 5) && i < 300) {
ctx.setFillStyle(this.watermarkSetting.color);
ctx.setFontSize(this.watermarkSetting.fontSize);
ctx.fillText(this.watermarkSetting.text, x, y);
x += watermarkWidth + watermarkWidth * 1.6;
if (x > width && y <= height) {
x = -Math.random() * 100;
y += this.watermarkSetting.fontSize * 3;
}
i++;
}
ctx.restore();
},
/** @name 绘制提示文字 **/
drawTitle() {
if (!this.titleSetting.text) return;
ctx.setTextAlign('center');
ctx.setTextBaseline('middle');
ctx.setFillStyle(this.titleSetting.color);
ctx.setFontSize(this.titleSetting.fontSize);
ctx.fillText(this.titleSetting.text, this.width / 2, this.height / 3);
},
/** @name 触摸事件 **/
touchstart(e) {
this.touchX = e.touches[0].x;
this.touchY = e.touches[0].y;
},
async touchmove(e) {
// 把画笔到画布中的指定点
ctx.moveTo(this.touchX, this.touchY);
// 清除涂层
ctx.clearRect(this.touchX, this.touchY, this.maskSetting.drawSize, this.maskSetting.drawSize);
ctx.draw(true);
// 记录移动点位
this.touchX = e.touches[0].x;
this.touchY = e.touches[0].y;
// if (this.percentage > 0) {
// const clearPercent = await this.getClearMaskPercent();
// }
},
async touchend() {
if (this.percentage > 0) {
const clearPercent = await this.getClearMaskPercent();
if (clearPercent >= this.percentage) {
ctx.moveTo(0, 0);
ctx.clearRect(0, 0, this.width, this.height);
ctx.stroke();
ctx.draw(true);
}
}
},
/** @name 计算被清除的涂层百分比 **/
getClearMaskPercent() {
return new Promise(resolve => {
uni.canvasGetImageData({
canvasId: 'scraping-happy',
x: 0,
y: 0,
width: this.width,
height: this.height,
success: res => {
// 区域内所有点的像素信息,它是一个数组,数组中每 "4" 项表示一个点的 rgba 值
const allPointPixels = res.data;
// 储存被清除的点-点的透明度
const clearPoint = [];
// 取透明度来判断,如果透明度值小于一半,则判断为该点已经被清除
for (let i = 0; i < allPointPixels.length; i += 4) {
if (allPointPixels[i + 3] < 128) {
clearPoint.push(allPointPixels[i + 3]);
}
}
// 已被清除的百分比 = 清除的点 / 全部的点
const percent = (
(clearPoint.length / (allPointPixels.length / 4)) *
100
).toFixed(2);
resolve(percent);
},
fail: e => {
console.log('canvasGetImageData', e);
},
}, this);
});
},
/** @name 重置 **/
reset() {
this.initCanvas();
this.touchX = 0;
this.touchY = 0;
}
} }
}; /** @name 标题配置默认值 **/
const TITLE = {
text: '刮一刮',
fontSize: 16,
color: '#333',
}
/**
* @name 涂层配置默认值
* @property { string } color 涂层颜色
* @property { number } drawSize 清除涂层的画笔大小
*/
const MASK = {
color: '#DDDDDD',
drawSize: 20,
}
/** @name 容错值解决部分机型涂层没有覆盖满的情况主要原因是由于像素尺寸不同导致的应尽可能让width与height保持整数 **/
const TOLERANT = 3;
let ctx = null;
export default {
props: {
/** @name 涂层设置 **/
mask: {
type: [String, Object],
},
/** @name 水印设置 **/
watermark: {
type: [String, Object],
},
/** @name 提示文字 **/
title: {
type: [String, Object],
},
/** @name 刮开百分之多少直接消除图层为0的时候不消除 **/
percentage: {
type: Number,
default: 40,
},
result: {
type: String,
default: ''
}
},
data() {
return {
width: 0,
height: 0,
touchX: 0,
touchY: 0,
showText: ''
}
},
computed: {
maskSetting() {
return {
...MASK,
...(typeof this.mask === 'object' ? this.mask : {
text: this.mask
}),
}
},
watermarkSetting() {
return {
...WATERMARK,
...(typeof this.watermark === 'object' ? this.watermark : {
text: this.watermark
}),
};
},
titleSetting() {
return {
...TITLE,
...(typeof this.title === 'object' ? this.title : {
text: this.title
}),
};
}
},
mounted() {
// 获取画布实例
ctx = uni.createCanvasContext('scraping-happy', this);
this.init();
},
methods: {
/** @name 初始化 **/
init() {
const query = uni.createSelectorQuery().in(this);
query
.select('#container')
.boundingClientRect(({
width,
height
}) => {
this.width = width;
this.height = height;
setTimeout(() => {
this.initCanvas();
this.showText = this.result
}, 20)
})
.exec();
},
/** @name 初始化canvas状态 **/
initCanvas() {
const {
width,
height
} = this;
// 清空矩形内容
ctx.clearRect(0, 0, width, height);
// 设置画笔颜色
ctx.setFillStyle(this.maskSetting.color);
// 绘制矩形
ctx.fillRect(0, 0, width, height + TOLERANT);
// 绘制水印
this.drawWatermark();
// 绘制提示文字
this.drawTitle();
// 绘制到canvas身上
ctx.draw();
},
/** @name 绘制水印 **/
drawWatermark() {
if (!this.watermarkSetting.text) return;
// 保存当前的绘图上下文
ctx.save();
// 旋转
ctx.rotate((-10 * Math.PI) / 180);
// 水印具体绘制过程
const {
width,
height
} = this;
const watermarkWidth = this.watermarkSetting.text.length * this.watermarkSetting.fontSize;
let x = 0;
let y = 0;
let i = 0;
while ((x <= width * 5 || y <= height * 5) && i < 300) {
ctx.setFillStyle(this.watermarkSetting.color);
ctx.setFontSize(this.watermarkSetting.fontSize);
ctx.fillText(this.watermarkSetting.text, x, y);
x += watermarkWidth + watermarkWidth * 1.6;
if (x > width && y <= height) {
x = -Math.random() * 100;
y += this.watermarkSetting.fontSize * 3;
}
i++;
}
ctx.restore();
},
/** @name 绘制提示文字 **/
drawTitle() {
if (!this.titleSetting.text) return;
ctx.setTextAlign('center');
ctx.setTextBaseline('middle');
ctx.setFillStyle(this.titleSetting.color);
ctx.setFontSize(this.titleSetting.fontSize);
ctx.fillText(this.titleSetting.text, this.width / 2, this.height / 3);
},
/** @name 触摸事件 **/
touchstart(e) {
this.touchX = e.touches[0].x;
this.touchY = e.touches[0].y;
},
async touchmove(e) {
// 把画笔到画布中的指定点
ctx.moveTo(this.touchX, this.touchY);
// 清除涂层
ctx.clearRect(this.touchX, this.touchY, this.maskSetting.drawSize, this.maskSetting.drawSize);
ctx.draw(true);
// 记录移动点位
this.touchX = e.touches[0].x;
this.touchY = e.touches[0].y;
// if (this.percentage > 0) {
// const clearPercent = await this.getClearMaskPercent();
// }
},
async touchend() {
if (this.percentage > 0) {
const clearPercent = await this.getClearMaskPercent();
if (clearPercent >= this.percentage) {
ctx.moveTo(0, 0);
ctx.clearRect(0, 0, this.width, this.height);
ctx.stroke();
ctx.draw(true);
this.$emit('complete')
}
}
},
/** @name 计算被清除的涂层百分比 **/
getClearMaskPercent() {
return new Promise(resolve => {
uni.canvasGetImageData({
canvasId: 'scraping-happy',
x: 0,
y: 0,
width: this.width,
height: this.height,
success: res => {
// 区域内所有点的像素信息,它是一个数组,数组中每 "4" 项表示一个点的 rgba 值
const allPointPixels = res.data;
// 储存被清除的点-点的透明度
const clearPoint = [];
// 取透明度来判断,如果透明度值小于一半,则判断为该点已经被清除
for (let i = 0; i < allPointPixels.length; i += 4) {
if (allPointPixels[i + 3] < 128) {
clearPoint.push(allPointPixels[i + 3]);
}
}
// 已被清除的百分比 = 清除的点 / 全部的点
const percent = (
(clearPoint.length / (allPointPixels.length / 4)) *
100
).toFixed(2);
resolve(percent);
},
fail: e => {
console.log('canvasGetImageData', e);
},
}, this);
});
},
/** @name 重置 **/
reset() {
this.initCanvas();
this.touchX = 0;
this.touchY = 0;
}
}
};
</script> </script>
<style> <style>
.scraping-happy { .scraping-happy {
width: 100%; width: 100%;
height: 200rpx; height: 200rpx;
position: relative; position: relative;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.scraping__canvas {
width: 100%; .scraping__canvas {
height: 100%; width: 100%;
position: absolute; height: 100%;
z-index: 10; position: absolute;
/* background-color: red; */ z-index: 10;
display: inline-block; /* background-color: red; */
} display: inline-block;
.scraping__view { }
position: absolute;
z-index: 1; .scraping__view {
color: #f29100; position: absolute;
font-size: 20px; z-index: 1;
font-weight: bold; color: #f29100;
} font-size: 20px;
</style> font-weight: bold;
letter-spacing: 8px;
}
</style>

View File

@@ -1,137 +1,153 @@
<template> <template>
<view> <view>
<view v-if="getLoading" class="wp100 relative" style="height: 100vh;"> <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> <image class="wp100" mode="widthFix"
<view class="wp100 flex ai-c jc-c" style="position: absolute;bottom: 0;left: 0;padding-bottom: 124rpx;"> 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 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> </image>
</view> <view class="wp100 flex ai-c jc-c" style="position: absolute;bottom: 0;left: 0;padding-bottom: 124rpx;">
</view> <image style="width: 452rpx;"
<view v-if="!getLoading"> 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"
<j-navbar :isBack="false">金武联驾考</j-navbar> mode="widthFix"></image>
<u-sticky bgColor="#fff">
<u-tabs :list="categoryList" :current="curTab" :scrollable="false" @change="changeCategory"></u-tabs>
</u-sticky>
<view class="m10tb">
<u-swiper :list="activityList" @click="handleToActivity"></u-swiper>
</view> </view>
<view style="background-color: rgb(245, 245, 245);"> </view>
<template v-if="subject=='1' || subject=='4'"> <view v-if="!getLoading">
<Subject1 :subject="subject" :rightList="rightList" :wrongList="wrongList" /> <!-- <j-navbar :isBack="false">金武联驾考</j-navbar> -->
</template> <u-sticky bgColor="#fff">
<template v-else> <u-tabs :list="categoryList" :current="curTab" :scrollable="false" @change="changeCategory"></u-tabs>
<Subject2 :subject="subject" ref="subjectRef" /> </u-sticky>
</template> <view class="m10tb" v-if="activityList&&activityList.length">
</view> <u-swiper class="acticity" keyName="image" :list="activityList" @click="handleToActivity"></u-swiper>
</view> </view>
</view> <view style="background-color: rgb(245, 245, 245);">
<template v-if="subject=='1' || subject=='4'">
<Subject1 :subject="subject" :rightList="rightList" :wrongList="wrongList" />
</template>
<template v-else>
<Subject2 :subject="subject" ref="subjectRef" />
</template>
</view>
</view>
</view>
</template> </template>
<script> <script>
import { import {
mapState, mapState,
mapActions mapActions
} from 'pinia' //引入映射函数 } from 'pinia' //引入映射函数
import useQuestionStore from '@/jtools/store/question' //引入store import useQuestionStore from '@/jtools/store/question' //引入store
import storage from '@/jtools/storage'; import useUserStore from '@/jtools/store/user'
import { import storage from '@/jtools/storage';
querySysConfigList, import {
} from '@/jtools/api/question'; querySysConfigList,
import Subject1 from "./components/Subject1"; } from '@/jtools/api/question';
import Subject2 from "./components/Subject2"; import Subject1 from "./components/Subject1";
export default { import Subject2 from "./components/Subject2";
components: { // import {
Subject1, // queryActivityList
Subject2 // } from '@/jtools/api/activity';
}, export default {
data() { components: {
return { Subject1,
show:false, Subject2
subject: storage.get('curSubject') || '1', },
curTab: 0, data() {
searchValue: '', return {
cityName: '', getLoading: true,
categoryList: [], show: false,
rightList: storage.get(`rightList_subject${this.subject}`) || [], subject: storage.get('curSubject') || '1',
wrongList: storage.get(`wrongList_subject${this.subject}`) || [], curTab: 0,
activityList: ['https://cdn.uviewui.com/uview/swiper/swiper1.png'] searchValue: '',
}; cityName: '',
}, categoryList: [],
onShow() { rightList: storage.get(`rightList_subject${this.subject}`) || [],
this.show=true wrongList: storage.get(`wrongList_subject${this.subject}`) || [],
this.getSubjectConfig() activityList: []
if (this.subject == '1' || this.subject == '4') { };
this.rightList = storage.get(`rightList_subject${this.subject}`) || [] },
this.wrongList = storage.get(`wrongList_subject${this.subject}`) || [] onShow() {
} setTimeout(() => {
if(this.subject=='2'||this.subject=='3'){ this.getLoading = false
this.$refs.subjectRef.getDiverType() this.show = true
} }, 100);
}, this.getSubjectConfig()
onHide(){ if (this.subject == '1' || this.subject == '4') {
this.show=false this.rightList = storage.get(`rightList_subject${this.subject}`) || []
}, this.wrongList = storage.get(`wrongList_subject${this.subject}`) || []
computed: { }
...mapState(useQuestionStore, ["loading_subject4", "loading_subject1","curSubject","orderQuestion_subject1","orderQuestion_subject4"]), //映射函数取出tagslist if (this.subject == '2' || this.subject == '3') {
getLoading() { this.$refs.subjectRef.getDiverType()
return this.loading_subject4 && this.loading_subject1 }
} // this.queryActivityList()
}, },
watch:{ onHide() {
getLoading(newVal){ this.show = false
if(this.show){ },
if(newVal){ computed: {
if(this.loading_subject4 && this.loading_subject1){ ...mapState(useQuestionStore, ["loading_subject4", "loading_subject1", "curSubject", "orderQuestion_subject1",
uni.hideTabBar(); "orderQuestion_subject4"
} ]), //映射函数取出tagslist
}else{ },
uni.showTabBar() methods: {
} ...mapActions(useQuestionStore, ['getOrderQuestion_sub4', 'getOrderQuestion_sub1', 'changeSubject']),
} //获取科目配置
} getSubjectConfig() {
}, const carTypeId = storage.get('carType') || '1001'
methods: { querySysConfigList(carTypeId, 'Subject').then(resp => {
...mapActions(useQuestionStore, ['getOrderQuestion_sub4', 'getOrderQuestion_sub1', 'changeSubject']), if (resp.code === '0000') {
//获取科目配置 this.categoryList = resp.data.map(item => {
getSubjectConfig() { return {
const carTypeId = storage.get('carType') || '1001' ...item,
querySysConfigList(carTypeId, 'Subject').then(resp => { name: item.configItemName
if (resp.code === '0000') { }
this.categoryList = resp.data.map(item => { })
return { this.subject = storage.get('curSubject') || '1',
...item, this.curTab = this.categoryList.findIndex(item => item.configItemCode == this.subject) || 0
name: item.configItemName }
} })
}) },
this.subject=storage.get('curSubject') || '1', //切换科目
this.curTab=this.categoryList.findIndex(item=>item.configItemCode==this.subject) async changeCategory(val) {
} this.subject = val.configItemCode
}) this.changeSubject(this.subject)
}, if (this.subject == '1' || this.subject == '4') {
//切换科目 this.rightList = storage.get(`rightList_subject${this.subject}`) || []
async changeCategory(val) { this.wrongList = storage.get(`wrongList_subject${this.subject}`) || []
this.subject = val.configItemCode } else {
this.changeSubject(this.subject) setTimeout(() => {
if (this.subject == '1' || this.subject == '4') { this.$refs.subjectRef.getDiverType()
this.rightList = storage.get(`rightList_subject${this.subject}`) || [] }, 100)
this.wrongList = storage.get(`wrongList_subject${this.subject}`) || [] }
} else { },
setTimeout(() => { //查询活动列表
this.$refs.subjectRef.getDiverType() queryActivityList() {
}, 100) queryActivityList({
} schoolId: useUserStore().userInfo?.schoolId || ''
}, }).then(resp => {
this.activityList = resp.data.map(item => ({
...item,
image: 'https://jwl.ahduima.com' + item.image
}));
})
},
// 去活动 // 去活动
handleToActivity(index) { handleToActivity(index) {
let detailId;
this.activityList.find((item, index1) => {
if (index === index1) {
detailId = item.detailId;
}
})
uni.navigateTo({ uni.navigateTo({
url: '/pages/index/activity' url: '/pages/index/activity?detailId=' + detailId,
}) })
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
::v-deep .u-tabs__wrapper__nav__line { ::v-deep .u-tabs__wrapper__nav__line {
background: linear-gradient(90deg, #11DF20 0%, #00B74F 100%) !important; background: linear-gradient(90deg, #11DF20 0%, #00B74F 100%) !important;
bottom: 14rpx !important; bottom: 14rpx !important;
} }
</style> </style>

View File

@@ -216,14 +216,12 @@
}, },
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.list.reduce((pre, cur) => { const trueCount = this.list.reduce((pre, cur) => {
const isTrue = cur.trueAnswer == cur.yourAnswer.replace(/,-g/, '') const ya = cur.trueAnswer.replace('A', '1').replace('B', '2').replace('C', '3').replace('D', '4').replace('E', '5').replace('F', '6').replace('G', '7')
let s = 0 const isTrue = ya == cur.yourAnswer.replace(/,/g, '')
if (isTrue) { return pre + 1 * (isTrue ? 1 : 0)
s = this.subject == 1 ? 1 : 2
}
return pre + s
}, 0) }, 0)
const score = (trueCount / this.list.length * 100).toFixed(0)
submitTest({ submitTest({
"carTypeId": storage.get('carType') || '1001', "carTypeId": storage.get('carType') || '1001',
"score": score, "score": score,

View File

@@ -7,16 +7,16 @@
<view class="list"> <view class="list">
<view class="list-call"> <view class="list-call">
<u-input class="sl-input" border="none" v-model="login.phone" type="number" maxlength="11" <u-input class="sl-input" border="none" v-model="loginForm.phone" type="number" maxlength="11"
placeholder="输入手机号" /> placeholder="输入手机号" />
</view> </view>
<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="loginForm.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> -->
</view> </view>
<view class="button-login" @tap="bindLogin()"> <view class="button-login" @tap="bindLogin()">
@@ -39,9 +39,9 @@ import storage from '@/jtools/storage';
export default { export default {
data() { data() {
return { return {
login: { loginForm: {
phone: '', phone: '',
code: '' code: '000000'
}, },
countDown: 0, countDown: 0,
js: undefined js: undefined
@@ -54,9 +54,9 @@ export default {
}, },
methods: { methods: {
getCode() { getCode() {
if (isPhone(this.login.phone) && this.countDown == 0) { if (isPhone(this.loginForm.phone) && this.countDown == 0) {
getCode({ getCode({
phone: this.login.phone phone: this.loginForm.phone
}).then(resp => { }).then(resp => {
// if (resp.code == '0000') { // if (resp.code == '0000') {
uni.showToast({ uni.showToast({
@@ -80,8 +80,8 @@ export default {
this.countDown = 0 this.countDown = 0
}, },
bindLogin() { bindLogin() {
if (isPhone(this.login.phone) && this.login.code) { if (isPhone(this.loginForm.phone) && this.loginForm.code) {
let params = { ...this.login } let params = { ...this.loginForm }
if (storage.get('companyId')) { if (storage.get('companyId')) {
params.id = storage.get('companyId') params.id = storage.get('companyId')
} }

254
src/pages/me/help.vue Normal file
View File

@@ -0,0 +1,254 @@
<template>
<view style="padding-bottom: 50px;background-color: #C5121B;">
<image class="wp100 img" mode="widthFix"
src="https://oss-bq.ahduima.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%9B%BE%E7%89%87/%E5%8A%A9%E5%8A%9B%E4%B8%BB%E5%9B%BE.jpg">
</image>
<view class="relative tip">邀请好友帮助你进行助力即可有机会领取奖品</view>
<view class="relative help_div">
<!-- -->
<view v-if="type == 1" class="relative help_card">
<view class="relative help_tip">
还差{{diffNum}}位好友助力即可领取奖品:
</view>
<view v-if="winnerInfo.awards != undefined" class="relative help_tip" style="font-size: 40rpx;">
{{winnerInfo.awards}}
</view>
<view class="p20">
<u-grid :border="false" col="3">
<u-grid-item v-for="(item, index) in helpUserList" :key="index">
<u-avatar v-if="item.id" class="p10tb border" size="120rpx" :src="item.avatarUrl"></u-avatar>
<view v-else class="p10tb">
<view class="avatar-text">
<u-avatar bg-color="#fff" color="#ccc" size="120rpx" text="邀"></u-avatar>
</view>
</view>
</u-grid-item>
</u-grid>
</view>
<view class="help_btn">
<button open-type="share" class="help_btn_font"> 邀请好友助力</button>
</view>
</view>
<view v-if="type == 2" class="relative help_card">
<view class="relative help_list" style="top: 200rpx;">
<view v-if="winnerInfo?.activityName" class="help_tip"
style="font-size: 40rpx; margin: 25rpx 0rpx;">
{{winnerInfo?.activityName}}
</view>
<view v-if="winnerInfo.schoolName != undefined" class="help_tip">
举办单位{{winnerInfo.schoolName}}
</view>
<view v-if="winnerInfo.awards != undefined" class="help_tip" style="font-size: 45rpx;margin: 25rpx 0rpx;">
奖品{{winnerInfo.awards}}
</view>
</view>
<view class="help_btn">
<button class="help_btn_font" open-type="chooseAvatar" @chooseavatar="handleHelp"
:disabled="disBtn">帮好友助力</button>
</view>
</view>
</view>
</view>
</template>
<script>
import useUserStore from '@/jtools/store/user'
import {
queryActivityDetail,
queryHelpInfo,
saveHelpInfo,
queryWinnerInfo
} from '@/jtools/api/activity'
export default {
data() {
return {
winnerId: undefined,
helpUserList: [],
drawNum: 0,
phone: undefined,
type: 2,
winnerInfo: undefined,
disBtn: false
}
},
onLoad(op) {
this.winnerId = op.id
// this.type = op.type ? Number(op.type) : 1
this.phone = useUserStore().userInfo?.phone || undefined
console.log(this.phone)
this.getWinnerInfo()
this.getHelpInfo()
this.disBtn = false
},
onShareAppMessage(res) {
if (res.from === 'button') { // 来自页面内分享按钮
console.log(res.target)
}
return {
title: '我正在参与领奖活动柜,请帮我助力',
path: '/pages/me/help?id=' + this.winnerId + '&type=2'
}
},
methods: {
//查询中奖信息
getWinnerInfo() {
queryWinnerInfo({
winnerId: this.winnerId
}).then(resp => {
if (resp.code == 200) {
console.log(resp)
this.winnerInfo = resp.data;
if (this.phone && this.winnerInfo.phone == this.phone) {
this.type = 1
} else {
this.type = 2
}
}
})
},
//查询助力信息
getHelpInfo() {
queryHelpInfo({
winnerId: this.winnerId
}).then(resp => {
if (resp.code == 200) {
this.drawNum = resp.data.helpNum;
const list = resp.data.helpUsers.map(item => ({
...item,
avatarUrl: 'https://jwl.ahduima.com' + item.avatarUrl
}));
this.diffNum = (this.drawNum - list.length) < 0 ? 0 : (this.drawNum - list.length);
const arr = new Array(this.diffNum).fill({})
this.helpUserList = [...list,...arr]
}
})
},
//点击助力
handleHelp(e) {
this.disBtn = false
uni.login({
provider: 'weixin', //使用微信登录
success: (loginRes) => {
console.log(loginRes);
uni.uploadFile({
url: 'https://jwl.ahduima.com/activity/applet/activity/help/save',
// url: 'http://192.168.1.6:8089/applet/activity/help/save',
filePath: e.detail.avatarUrl,
name: 'file',
formData: {
'code': loginRes.code,
'winnerId': this.winnerId,
},
success: (uploadFileRes) => {
console.log(uploadFileRes.data);
let resp = JSON.parse(uploadFileRes.data);
console.log(resp);
if (resp.code == 200) {
uni.showToast({
icon: 'none',
title: `助力成功`
})
this.disBtn = true
} else {
uni.showToast({
icon: 'error',
title: resp.msg
})
this.disBtn = true
}
}
});
}
});
},
},
}
</script>
<style scoped lang="scss">
.img {
top: -130rpx !important;
}
.tip {
height: 75px;
font-family: PingFang SC;
font-weight: 400;
color: #FEFEFE;
line-height: 48px;
top: -520rpx;
text-align: center;
font-size: 35rpx;
}
.avatar-text {
border-radius: 50%;
border: 1px dashed #ccc;
}
.help_div {
width: 710rpx;
height: 996rpx;
top: -560rpx;
margin-left: 20rpx;
margin-right: 20rpx;
background: linear-gradient(0deg, #F33D2F 100%, rgba(197, 18, 27, 0.01) 0%);
border-radius: 40rpx;
.help_card {
width: 630rpx;
height: 886rpx;
margin: 0rpx 39rpx;
top: 55rpx;
background: #FFFFFF;
border-radius: 24rpx;
.help_tip {
text-align: center;
font-size: 32rpx;
font-family: PingFang SC;
font-weight: 400;
color: #010101;
line-height: 55rpx;
top: 15rpx;
}
.help_list {
margin: 68rpx 25rpx 25rpx 20rpx;
height: 580rpx;
}
.help_btn {
text-align: center;
margin: 0 75rpx;
margin-bottom: 30rpx;
width: 500rpx;
height: 86rpx;
background: linear-gradient(0deg, #DE4224 0%, #B81706 100%);
border-radius: 43rpx;
.help_btn_font {
font-size: 32rpx;
font-family: PingFang SC;
font-weight: 400;
color: #FFFFFF;
line-height: 86rpx;
background: center;
}
}
}
}
</style>

View File

@@ -12,6 +12,9 @@
</view> </view>
<view class="mt5 fs14 cor-666">陪您学车 {{ user.days }}</view> <view class="mt5 fs14 cor-666">陪您学车 {{ user.days }}</view>
</view> </view>
<view v-if="canRecieve" class="ml20 p20" @tap="handleScan">
<u-icon name="scan" size="40"></u-icon>
</view>
</view> </view>
<view class="info flex ai-c" v-else @tap="toLogin"> <view class="info flex ai-c" v-else @tap="toLogin">
<u-avatar class="br-p50 overflow-h" :size="64" src="@/static/image/mine/default_avatar.png" shape="circle"></u-avatar> <u-avatar class="br-p50 overflow-h" :size="64" src="@/static/image/mine/default_avatar.png" shape="circle"></u-avatar>
@@ -39,7 +42,7 @@
<view class="absolute flex ai-c jc-c" style="left: 0;top: 40px;right: 0;bottom: 0;"> <view class="absolute flex ai-c jc-c" style="left: 0;top: 40px;right: 0;bottom: 0;">
<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;">{{ isIOS ? 'iOS暂不可用' : '立即开通' }}</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">
@@ -80,11 +83,6 @@
<template #icon> <template #icon>
<u-icon size="24" name="gift"></u-icon> <u-icon size="24" name="gift"></u-icon>
</template> </template>
</u-cell>
<u-cell size="large" title="我的体检" isLink @tap="handleTJ">
<template #icon>
<img src="/static/image/mine/wdtj.png" style="width: 24px;height: 24px;">
</template>
</u-cell> </u-cell>
<u-cell size="large" title="我的题库" :value="carName" @tap="toChangeCarType"> <u-cell size="large" title="我的题库" :value="carName" @tap="toChangeCarType">
<template #icon> <template #icon>
@@ -107,8 +105,8 @@
<script> <script>
import useUserStore from '@/jtools/store/user' import useUserStore from '@/jtools/store/user'
import storage from '@/jtools/storage'; import storage from '@/jtools/storage';
import { receiveWinner,canRecieveGift } from '@/jtools/api/activity'
export default { export default {
components: {},
computed: { computed: {
isLogin() { isLogin() {
return useUserStore().isLogin return useUserStore().isLogin
@@ -148,14 +146,25 @@ export default {
data() { data() {
return { return {
carName: storage.get('carName') || '小车C1/C2/C3', carName: storage.get('carName') || '小车C1/C2/C3',
isIOS: true isIOS: true,
canRecieve: false
} }
}, },
onShow() { onShow() {
this.isIOS = this.$platform.device().includes('ios') this.isIOS = this.$platform.device().includes('ios')
this.carName = storage.get('carName') || '小车C1/C2/C3' this.carName = storage.get('carName') || '小车C1/C2/C3'
this.searchActivityAuth()
}, },
methods: { methods: {
searchActivityAuth() {
canRecieveGift({
phone: useUserStore().userInfo?.phone || ''
}).then(resp => {
if(resp.code == 200) {
this.canRecieve = resp.data
}
})
},
// 拨打电话 // 拨打电话
callPhoneNumber() { callPhoneNumber() {
uni.makePhoneCall({ uni.makePhoneCall({
@@ -208,19 +217,6 @@ export default {
this.toLogin() this.toLogin()
} }
}, },
handleTJ() {
if (this.isLogin) {
// uni.navigateTo({
// url: '/pages/me/tijian'
// })
uni.showToast({
title: '敬请期待',
icon: 'none'
})
} else {
this.toLogin()
}
},
toLogin() { toLogin() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/login/login' url: '/pages/login/login'
@@ -233,6 +229,25 @@ export default {
uni.navigateTo({ uni.navigateTo({
url: '/pages/me/myGift' url: '/pages/me/myGift'
}) })
},
handleScan() {
uni.scanCode({
scanType: ['qrCode'],
success(res) {
console.log('条码内容:' + res.result);
receiveWinner({
id: res.result,
receiveUser: useUserStore().userInfo?.phone || []
}).then(resp => {
if(resp.code == 200) {
uni.showToast({
icon: 'none',
title: '核销成功!'
})
}
})
}
})
} }
} }
} }

View File

@@ -15,15 +15,6 @@
<u-icon name="arrow-right" color="#999" /> <u-icon name="arrow-right" color="#999" />
</view> </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>
@@ -40,11 +31,6 @@
this.sfzNum=storage.get('sfzNum') || '' this.sfzNum=storage.get('sfzNum') || ''
}, },
methods: { methods: {
toUploadPic(){
uni.navigateTo({
url: '/pages/me/uploadPic'
})
}
} }
} }
</script> </script>

View File

@@ -1,44 +1,73 @@
<template> <template>
<view class="p10lr p20tb"> <view class="p10lr p20tb">
<view v-for="(item, index) in list" :key="index" class="item"> <u-list @scrolltolower="loadmore">
<view class="relative"> <u-list-item v-for="(item, index) in list" :key="index" class="item">
<img src="/static/image/mine/giftitem.png" style="width: 100%;" mode="widthFix" alt="" /> <view class="relative">
<view class="ab_full df ai-c jcc">一等奖</view> <img src="/static/image/mine/giftitem.png" style="width: 100%;" mode="widthFix" alt="" />
</view> <view class="ab_full df ai-c jcc">{{item.awards}}</view>
<view class="df ai-c jcsb p20tb p10lr">
<view class="item-label">
<view>活动名称幸运刮刮乐开心赢大奖</view>
<view>参与时间2024-01-01 08:00</view>
<view>有效期至2024-03-01 08:00</view>
</view> </view>
<view class="ml20" style="width: 120rpx;"> <view class="df ai-c jcsb p20tb p10lr">
<img v-if="index%2==0" src="/static/image/mine/writeoff.png" style="width: 120rpx;height: 120rpx;" /> <view class="item-label">
<view v-else class="btn" @tap="handleWriteoff(item)">核销</view> <view>活动名称{{ item.activityName }}</view>
<view>参与时间{{ item.createTime }}</view>
<view>有效期至{{ item.endTime }}</view>
</view>
<view class="ml20" style="width: 120rpx;">
<view v-if="item.status == 0" class="btn" @tap="handleHelp(item)">助力</view>
<view v-else-if="item.status == 1" class="btn" @tap="handleWriteoff(item)">核销</view>
<img v-else-if="item.status == 2" src="/static/image/mine/writeoff.png" style="width: 120rpx;height: 120rpx;" />
<img v-else src="/static/image/mine/outtime.png" style="width: 120rpx;height: 120rpx;" />
</view>
</view> </view>
</view> </u-list-item>
</view> </u-list>
</view> </view>
</template> </template>
<script> <script>
import useUserStore from '@/jtools/store/user'
import { getLuckyRecord } from '@/jtools/api/activity'
export default { export default {
data() { data() {
return { return {
pageNum: 1,
list: [] list: []
} }
}, },
onShow() { onShow() {
this.pageNum = 1
this.list = []
this.handleSearch() this.handleSearch()
}, },
methods: { methods: {
handleSearch() { handleSearch() {
this.list = [1,2,3,4,5] getLuckyRecord({
phone: useUserStore().userInfo.phone,
pageSize: 10,
pageNum: this.pageNum
}).then(resp => {
if(resp.code == 200) {
if(resp.rows && resp.rows.length) {
this.list = [...this.list, ...resp.rows]
} else {
this.pageNum = this.pageNum > 1 ? this.pageNum-1 : 1
}
}
})
},
loadmore() {
this.handleSearch(this.pageNum++)
}, },
handleWriteoff(item) { handleWriteoff(item) {
uni.navigateTo({ uni.navigateTo({
url: `/pages/me/qrCode?item=${item}` url: `/pages/me/qrCode?id=${item.id}`
}) })
} },
handleHelp(item){
uni.navigateTo({
url: `/pages/me/help?id=${item.id}`
})
}
} }
} }
</script> </script>

View File

@@ -1,6 +1,6 @@
<template> <template>
<view class="df jcc" style="padding-top: 100px;"> <view class="df jcc" style="padding-top: 100px;">
<qrcode value="123" :size="200"/> <qrcode v-if="value" :value="value" :size="200"/>
</view> </view>
</template> </template>
@@ -16,11 +16,8 @@
} }
}, },
onLoad(option) { onLoad(option) {
this.value = option.item this.value = option.id
}, },
methods: {
}
} }
</script> </script>

View File

@@ -1,214 +0,0 @@
<template>
<view class="">
<view class="wp100 bc-fff p14">
<view class="title fontColor">第一步 上传学员图像</view>
<view class="mt15">
<!-- <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" /> -->
<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">
<image v-if="fileList&&fileList.length" style="width: 240rpx;height: 240rpx;" :src="fileList[0].url">
</image>
<u-avatar v-else class="br-p50 overflow-h" :size="64" mp-avatar shape="circle"></u-avatar>
</view>
<u-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" multiple :maxCount="1" width="150"
height="150">
<view
style="width: 320rpx;height:60rpx;line-height:60rpx;background-color: #05C341;border-radius: 0 0 20rpx 20rpx;"
class="text-center cor-fff">
点击
</view>
</u-upload>
</view>
</view>
<view class="mt20">
<view class="title fontColor">第二步 核实后再提交</view>
<u--form labelPosition="left" labelWidth="80" :model="form" :rules="rules" ref="form1">
<u-form-item label="姓名" :required="true" prop="idCardName" borderBottom ref="item1">
<u--input v-model="form.idCardName" border="none"></u--input>
</u-form-item>
<u-form-item label="身份证号" :required="true" prop="sfzmhm" borderBottom ref="item2">
<u--input v-model="form.sfzmhm" border="none"></u--input>
</u-form-item>
</u--form>
</view>
<view style="margin-top: 20px;">
<u-button type="primary" :style="{width: '100%',borderRadius:'40rpx',backgroundColor:'#05C341'}" :disabled="saving" text="提交"
@click="submit" />
</view>
</view>
</view>
</template>
<script>
import storage from '@/jtools/storage';
import {
addInfo,
} from '@/jtools/api/index';
export default {
data() {
const shenfenzhen = (rule, value, callback) => {
/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value) ? callback() : callback(
new Error('请输入正确的身份证号'))
}
return {
form: {
idCardName: '',
sfzmhm: ''
},
driverLicenseImg:'',
fileList:[],
fileList1: [],
uploadList: [],
saving: false,
rules: {
idCardName: [{
required: true,
message: '请输入姓名',
trigger: ['blur', 'change']
}],
sfzmhm: [{
required: true,
message: '请输入身份证号',
trigger: ['blur', 'change']
},{
// 自定义验证函数,见上说明
validator: shenfenzhen,
message: '身份证号码不正确',
// 触发器可以同时用blur和change
trigger: ['change', 'blur'],
}]
}
};
},
onReady() {
this.$refs.form1.setRules(this.rules);
},
methods: {
// 删除图片
deletePic(event) {
this.fileList1.splice(event.index, 1);
this.uploadList.splice(event.index, 1);
},
// 新增图片
async afterRead(event) {
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 为数组格式,否则为对象格式
const lists = [].concat(event.file);
this.fileList=lists
this.fileList1 = [];
uni.showToast({
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() {
this.$refs.form1.validate().then((valid) => {
if (valid) {
const param={
driverLicenseImg:this.driverLicenseImg,
...this.form,
schoolOrgCode:'340103000700',
operater:'1d08daf852cf4ee28f67cb583f538cbf'
}
addInfo(param).then(resp=>{
uni.showToast({
title:"提交成功!",
duration:2000,
})
setTimeout(()=>{
uni.navigateBack()
},1000)
})
} else {
console.log('验证失败');
}
});
},
urlTobase64(url){
let base64=''
console.log(url);
return new Promise((resolve, reject) => {
uni.getFileSystemManager().readFile({
filePath: url, //选择图片返回的相对路径
encoding: 'base64', //编码格式
success: res => { //成功的回调
console.log(res);
base64 = 'data:image/jpeg;base64,' + res.data //不加上这串字符,在页面无法显示的哦
resolve(base64);
},fail: (e) => {
console.log("图片转换失败");
reject(e)
}
})
});
}
}
};
</script>
<style lang="scss" scoped>
.upload-img {
width: 165rpx;
height: 165rpx;
border: 1px dashed #c4c4c4;
display: flex;
justify-content: center;
align-items: center;
}
.fontColor {
color: #383838;
font-weight: 400;
}
::v-deep .u-textarea__count {
background-color: #f9faf9 !important;
}
::v-deep .u-upload__button>.u-icon>.u-icon__icon {
font-size: 90rpx !important;
}
::v-deep .u-button--square {
border-radius: 40rpx !important;
}
::v-deep .u-button--primary{
background-color: #05C341 !important;
border-color: #05C341 !important;
}
</style>

View File

@@ -9,7 +9,7 @@
</view> </view>
<swiper class="swiper mt20" :current="swiperIndex" :duration="duration" :autoplay="false" @change="onChange" <swiper class="swiper mt20" :current="swiperIndex" :duration="duration" :autoplay="false" @change="onChange"
@animationfinish="onAnimationfinish" @touchend="touchEnd"> @animationfinish="onAnimationfinish" @touchend="touchEnd">
<swiper-item v-for="(quesItem,quesIndex) in swiperList" :key="quesIndex.questionId"> <swiper-item v-for="(quesItem,quesIndex) in swiperList" :key="quesItem.questionId">
<scroll-view scroll-y="true" class="swiper-scroll"> <scroll-view scroll-y="true" class="swiper-scroll">
<view> <view>
<view class="m14lr"> <view class="m14lr">

View File

@@ -56,7 +56,7 @@
import GradesChart from "./components/GradesChart.vue" import GradesChart from "./components/GradesChart.vue"
import storage from '@/jtools/storage'; import storage from '@/jtools/storage';
import { import {
testTotal testTotal,getTestQuestionId
} from '@/jtools/api/question'; } from '@/jtools/api/question';
export default { export default {
components: { components: {
@@ -182,15 +182,28 @@
}else{ }else{
const list =JSON.stringify(this.wrongList) const list =JSON.stringify(this.wrongList)
uni.navigateTo({ uni.navigateTo({
url:"/pages/questionBank/questionBank?navTitle=错题&subject="+this.subject+"&questionList="+list url:"/pages/questionBank/questionBank?navTitle=错题&subject="+this.subject+"&questionIdList="+list
}) })
} }
}, },
//重新考试 //重新考试
toExams(){ toExams(){
uni.navigateTo({ getTestQuestionId({
url:"/pages/questionBank/practiceExams?subject="+this.subject versionId: this.version,
carTypeId: storage.get('carType') || '1001',
subject: this.subject,
}).then(async (resp) => {
if (resp.code === '0000') {
const arr = resp.data
const listJson = JSON.stringify(arr)
uni.navigateTo({
url: "/pages/questionBank/practiceExams?title=模拟考试&subject=" + this.subject + "&questionIdList=" + listJson
})
}
}) })
// uni.navigateTo({
// url:"/pages/questionBank/practiceExams?subject="+this.subject
// })
}, },
}, },
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB