main
hcj 3 months ago
parent 51fae596c6
commit bb49e55e75
  1. 237
      components/onLineCourseItem/index.vue
  2. BIN
      components/onLineCourseItem/liveSteam.png
  3. 68
      components/poster/index.vue
  4. 15
      pages.json
  5. 285
      pages/index/index.vue
  6. 4
      pages/index/testcrowdsourc/companyInfo.vue
  7. 4
      pages/index/testcrowdsourc/userInfo.vue
  8. BIN
      pages/index/testtraining/arr.png
  9. BIN
      pages/index/testtraining/noCourse.png
  10. BIN
      pages/index/testtraining/noEvaluate.png
  11. BIN
      pages/index/testtraining/noUsePerson.png
  12. BIN
      pages/index/testtraining/noregister.png
  13. BIN
      pages/index/testtraining/olCourse.png
  14. 298
      pages/index/testtraining/onLineCourse.vue
  15. 176
      pages/index/testtraining/testtraining.vue
  16. 52
      pages/index/toolleasing/tooldetails.vue
  17. 2
      pages/personal/login.vue
  18. 109
      pages/personal/myCourse/allMyCourse.vue
  19. 90
      pages/personal/myCourse/myCourse.vue
  20. 19
      pages/personal/ordernumber/ordernumber.vue
  21. 6
      pages/personal/personal.vue
  22. 2
      pages/personal/phonelogin.vue
  23. 76
      pages/personal/privacy.vue
  24. 2
      pages/personal/setup/aboutus.vue
  25. 30
      pages/personal/setup/accountoverview.vue
  26. 2
      pages/personal/setup/index.vue
  27. 4
      pages/personal/setup/mycompanyinfo.vue
  28. 6
      pages/personal/setup/myreview.vue
  29. 4
      pages/personal/setup/myuserinfo.vue
  30. 2
      pages/personal/setup/pcweb.vue
  31. 53
      pages/personal/setup/peixunban.vue
  32. 2
      pages/personal/setup/usepeople.vue
  33. 4
      uni.scss
  34. 4
      utils/share.js
  35. 16
      utils/util.js

@ -0,0 +1,237 @@
<template>
<view class="onLineCourseItemWrap" @click="toLearn(onLineCourse)">
<view class="onLineTitle">
<view v-if="rejectStatus == '1'" class="backVersion">预告</view>
<view v-if="rejectStatus == '2'" class="starting">直播中<img src="./liveSteam.png" alt=""></view>
<view v-if="rejectStatus == '3'" class="preVersion">回放</view>
<view>{{ courseTime(onLineCourse.courseTime) }}</view>
<view class="onLineClassName">{{ onLineCourse.courseName }}</view>
</view>
<view class="onLineCourse">{{ onLineCourse.className }}</view>
<view class="onLineTeacher">
<img src="http://image.bjkeyware.com/static/index/teacher.png" alt="">
讲师: {{ onLineCourse.instructor }}
</view>
<!-- <view>{{ courseTime(onLineCourse.date_time) }}</view> -->
<view class="onLineBtnWrap">
<view v-if="toLearnShow" class="onLineBtn toPay">付费学习{{ onLineCourse.amount }}</view>
<view v-else class="onLineBtn toLearn">去学习</view>
</view>
</view>
</template>
<script>
import { dateFormat } from '../../utils/util';
export default {
computed: {
toLearnShow() {
if ((this.onLineCourse.isPay == '1') && (this.onLineCourse.remark.indexOf(this.onLineCourse.courseId) == -1)) {
return true
}
return false
},
rejectStatus() {
const endTime = new Date(this.onLineCourse.date_time).getTime()
const startTime = new Date(this.onLineCourse.courseTime).getTime()
const nowTime = new Date().getTime()
if (startTime > nowTime) {
return '1'
} else if (startTime < nowTime && endTime > nowTime) {
return '2'
} else {
return '3'
}
},
courseTime() {
return function (val) {
const tarTime = dateFormat(new Date(val))
const nowTime = dateFormat(new Date())
const day = tarTime.split(' ')[0];
const nday = nowTime.split(' ')[0];
let preDay = ''
if (nday === day) {
preDay = '今日'
} else if ((day.substr(0, 8) === nday.substr(0, 8)) && (day.substr(8, 10) * 1 - nday.substr(8, 10)) == 1) {
preDay = '明日'
} else {
preDay = day
}
const temp = tarTime.split(' ')[1]
const time = temp.slice(0, temp.lastIndexOf(':'));
console.log(time);
console.log(preDay + ' ' + time);
return preDay + ' ' + time
}
}
},
props: {
onLineCourse: Object
},
data() {
return {
}
},
methods: {
toggleShow() {
if ((this.onLineCourse.isPay == '1') && (this.onLineCourse.remark.indexOf(this.onLineCourse.courseId) == -1)) {
this.onLineCourse.show = false
return
}
this.onLineCourse.show = true
return
},
toLearn() {
this.toggleShow()
this.$emit('toLearn', this.onLineCourse)
},
}
}
</script>
<style lang="scss">
.onLineCourseItemWrap {
height: 270rpx;
width: 700rpx;
background: linear-gradient(135deg, #FCF5F0, #ECF3FD);
box-shadow: 0rpx 2rpx 14rpx 1rpx rgba(8, 67, 140, 0.12);
border-radius: 10rpx;
margin: 0 auto;
margin-bottom: 30rpx;
.onLineTitle {
font-size: 32rpx;
display: flex;
justify-content: flex-start;
font-family: PingFang SC;
font-weight: bold;
height: 88rpx;
padding: 30rpx 0 0 20rpx;
line-height: 54rpx;
.starting {
font-family: PingFang SC;
font-weight: 500;
color: #FFFFFF;
font-size: 28rpx;
line-height: 40rpx;
margin-top: 7rpx;
height: 40rpx;
margin-right: 10rpx;
min-width: 120rpx;
text-align: center;
background: linear-gradient(90deg, #09B885, #0BE8A5);
border-radius: 8rpx;
img {
margin-left: 5rpx;
width: 15rpx;
height: 15rpx;
}
}
.backVersion {
font-family: PingFang SC;
font-weight: 500;
color: #FFFFFF;
font-size: 28rpx;
line-height: 35rpx;
margin-top: 10rpx;
height: 35rpx;
padding: 0 20rpx;
background: linear-gradient(90deg, #FCA041, #FD6841);
margin-right: 10rpx;
border-radius: 8rpx;
min-width: 95rpx;
}
.preVersion {
font-family: PingFang SC;
font-weight: 500;
color: #FFFFFF;
font-size: 28rpx;
line-height: 35rpx;
margin-top: 10rpx;
height: 35rpx;
padding: 0 20rpx;
margin-right: 10rpx;
background: linear-gradient(90deg, #06466b, #1479b3af);
border-radius: 8rpx;
min-width: 95rpx;
}
}
}
.onLineClassName {
flex:1;width: 0;
margin-left: 25rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.onLineCourse {
display: inline;
padding: 5rpx 15rpx;
border-radius: 6rpx;
font-size: 30rpx;
// width: 320rpx;
color: #1A1A1A;
line-height: 46rpx;
background: #DEE9FD;
margin-left: 18rpx;
}
.onLineTeacher {
margin-top: 10rpx;
margin-left: 24rpx;
font-size: 28rpx;
font-weight: 500;
color: #666666;
line-height: 46rpx;
img {
width: 20rpx;
height: 20rpx;
margin-right: 10rpx;
}
}
.onLineBtnWrap {
display: flex;
justify-content: flex-end;
margin: 0 25rpx;
}
.onLineBtn {
min-width: 209rpx;
padding: 0 5rpx;
height: 56rpx;
line-height: 56rpx;
border-radius: 28rpx;
// width: 209rpx;
width: 167rpx;
font-family: PingFang SC;
font-weight: 500;
font-size: 24rpx;
color: #FFFFFF;
line-height: 56rpx;
text-align: center;
}
.toLearn {
background: linear-gradient(90deg, #FB8C16, #FEC36E);
}
.toPay {
background: linear-gradient(90deg, #5EA6FD, #1A81F9);
border: 1px solid #AAD1FE;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

@ -0,0 +1,68 @@
<template>
<view class="posterWrapper">
<view>haibao</view>
<button @click="drawPoster">生成海报</button>
<view class="my_canvas_box">
<!-- <canvas></canvas> -->
<view>长按分享</view>
</view>
</view>
</template>
<script>
import com from '../../utils/comstemutil'
export default {
data() {
return {
}
},
onload(query) {
// console.log('123');
// scene 使 decodeURIComponent scene
const scene = decodeURIComponent(query.scene)
console.log(scene);
},
methods: {
drawPoster() {
const currentPage = getCurrentPages()
const route = currentPage[currentPage.length - 1].route
const options = currentPage[currentPage.length - 1].options
let path = ''
if (Object.keys(options).length == 0) {
path = route
} else {
options.forEach((ele, index) => {
if (index == 0) {
path = route + '?' + ele + '=' + index
} else {
path = route + '&' + ele + '=' + index
}
});
}
this.draw(path)
},
async draw(path) {
// const tok = await com.refreshToken()
// return
let accessToken = uni.getStorageSync('accessToken')
const data = {
"path": path,
"width": 430
}
const res = await this.http.quickPost('https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=' + accessToken, data, true)
console.log(res);
}
}
}
</script>
<style lang="scss" scoped>
.posterWrapper {}
</style>

@ -206,13 +206,13 @@
}, {
"path": "pages/personal/login",
"style": {
"navigationBarTitleText": "登录关键测试宝",
"navigationBarTitleText": "登录小关软测宝",
"navigationBarBackgroundColor": "#284CD1"
}
}, {
"path": "pages/personal/phonelogin",
"style": {
"navigationBarTitleText": "关键测试宝",
"navigationBarTitleText": "小关软测宝",
"navigationBarBackgroundColor": "#284CD1"
}
},
@ -251,7 +251,7 @@
}, {
"path": "pages/personal/setup/pcweb",
"style": {
"navigationBarTitleText": "关键测试宝",
"navigationBarTitleText": "小关软测宝",
"navigationBarBackgroundColor": "#284CD1"
}
},
@ -397,6 +397,15 @@
"onReachBottomDistance": 50
}
},
{
"path" : "pages/personal/myCourse/allMyCourse",
"style" :
{
"navigationBarTitleText" : "线上培训班",
"navigationBarBackgroundColor": "#284CD1",
"onReachBottomDistance": 50
}
},
{
"path" : "pages/personal/courseSign/courseSign",
"style" :

@ -3,18 +3,40 @@
<view class="infoNav" :style="{ height: infoHeight + 4 + 'px' }"></view>
<view class="myNav" :style="{ height: navHeight + 'px', top: infoHeight + 3 + 'px' }">
<view>首页</view>
<image @click="scan" src="http://image.bjkeyware.com/static/index/renliwb/scan.png" class="cycontentitimg" mode=""></image>
<image @click="scan" src="http://image.bjkeyware.com/static/index/renliwb/scan.png" class="cycontentitimg"
mode=""></image>
</view>
<view :style="{ height: infoHeight + navHeight + 7 + 'px' }"></view>
<!-- <button type="primary" open-type="contact">在线咨询</button> -->
<!-- <button type="primary" @click="test">在线咨询</button> -->
<!-- class="contents" :actionStyle="customActionStyle"actionText="搜索" @custom='serchfot'-->
<view class="logobg">
<swiper class="homeSwiper" circular autoplay="true" indicator-dots="true" interval="3000" duration="500">
<swiper-item class="swiper-item" :key="key">
<img style="width: 100%;" src="http://image.bjkeyware.com/static/index/hhome_page2.png" alt="">
</swiper-item>
<swiper-item class="swiper-item" :key="key">
<img style="width: 100%;" src="http://image.bjkeyware.com/static/index/hhome_page1.png" alt="">
</swiper-item>
</swiper>
<!-- <view style="display: flex;justify-content: space-between;align-items: center;">
<u-search class="keyewar" v-model='keywares' placeholder='输入搜索内容' :clearabled='true' clear='cleardata' :show-action="false" :animation="false"></u-search>
<view class="customActionStyle" @click="serchfot">搜索</view>
</view> -->
</view>
<!-- <view class="uni-margin-wrap">
<swiper class="swiper" circular autoplay="true" interval="2500" :duration="duration">
<swiper-item v-for="item in 3">
<view class="swiper-item uni-bg-red">
<view>标题</view>
<view>内容</view>
<view>去学习</view>
</view>
</swiper-item>
</swiper>
</view> -->
<!-- <u-input class="keywar" />
<div style="display: flex;justify-content: space-between;">
<view style="display:flex;align-items: center;">
@ -24,6 +46,7 @@
</div> -->
<!-- <img src="src="http://image.bjkeyware.com/static/index/ss.png" alt=""> -->
<view class="fouassociation">
<view class="association" @click="gametype('tool')">
<img src="http://image.bjkeyware.com/static/index/hzuli.png" alt="">
@ -51,20 +74,32 @@
<text>人才服务</text>
</view>
</view>
<view class="uni-margin-wrap" v-if="onLineList.length">
<swiper class="swiper mySwiper" circular autoplay="true" interval="35500" duration="500">
<swiper-item v-for="(item, key) in onLineList" :key="key">
<onLineCourseItem style="margin-left: 20rpx;" :onLineCourse="item" @toLearn="toLearn">
</onLineCourseItem>
</swiper-item>
</swiper>
</view>
<!-- <poster></poster> -->
<view class='schedule'>
<!-- 测试工具 -->
<view style='display:flex;justify-content:space-between;margin:20px 0'>
<view style='display:flex;justify-content:space-between;margin:40rpx 0 40rpx 0'>
<view style='display:flex;align-items: center;'>
<img style="width:29rpx;height:40rpx" src="http://image.bjkeyware.com/static/index/hhot.png"></image>
<p style='font-size:20px;font-weight: bold;color: #333333;margin-left:10px'>测试工具</p>
<img style="width:29rpx;height:40rpx" src="http://image.bjkeyware.com/static/index/hhot.png">
<p style='font-size:34rpx;font-weight: bold;color: #333333;margin-left:10px'>国产自主研发测试工具推荐</p>
</view>
<view style='display:flex;align-items: center;' @click="gametype('tool')">
<!-- <view style='display:flex;align-items: center;' @click="gametype('tool')">
<text style='color: #999999;font-size:13px;'>更多</text>
<img style='width:15rpx;height:25rpx;margin-top:3px;margin-left:5px;' src="http://image.bjkeyware.com/static/index/xia.png" alt="">
</view>
<img style='width:15rpx;height:25rpx;margin-top:3px;margin-left:5px;'
src="http://image.bjkeyware.com/static/index/xia.png" alt="">
</view> -->
</view>
<view class='koeui'>
<view class="currekei" v-for="(item,key) of toollist" :key="key">
<scroll-view class="scroll-view_H" scroll-x="true">
<!-- <view class="scroll-view-item_H">A</view> -->
<view class="scroll-view-item_H" v-for="(item, key) of toollist" :key="key">
<view class="imgone" @click="details('tool', item.toolId)">
<view style="width: 120rpx;height: 120rpx;">
<img :src="item.img" alt="">
@ -81,13 +116,12 @@
<img v-if="item.name=='资产识别及漏洞管理工具'" :src="item.imgs" alt="">
<img v-if="item.name=='性能测试工具AutoLoad'" :src="item.imgs" alt=""> -->
</view>
</view>
<p class="leop leop1">{{ item.name }}</p>
<view style='display:flex;margin:30rpx 0'>
<view v-if='item.toolTypeName' class="tabone">{{ item.typel }}测试</view>
<view class="tabone" style="color: #FF8A00;border: 1px solid #FF8A00;margin-left: 10px;">{{item.deliverType}}</view>
<view class="tabone" style="color: #FF8A00;border: 1px solid #FF8A00;margin-left: 10px;">
{{ item.deliverType }}</view>
</view>
<view style='display:flex;justify-content:space-between;margin:15rpx 0;width:100%'>
<p style="font-size: 24rpx;" v-if="item.price == 0">限时免费</p>
@ -95,8 +129,46 @@
<!-- <img class="imgtwo" src="http://image.bjkeyware.com/static/index/add.png" alt="" @click="addcart(item.toolId)"> -->
</view>
</view>
<view class="scroll-view-item_M" @click="gametype('tool')">更多</view>
</scroll-view>
<!-- <view class='koeui'>
<view class="currekei" v-for="(item, key) of toollist" :key="key">
<view class="imgone" @click="details('tool', item.toolId)">
<view style="width: 120rpx;height: 120rpx;">
<img :src="item.img" alt="">
<img v-if="item.name=='代码静态分析工具'" :src="item.imgs" alt="">
<img v-if="item.name=='源代码安全检测工具'" :src="item.imgs" alt="">
<img v-if="item.name=='C/C++单元测试工具'" :src="item.imgs" alt="">
<img v-if="item.name=='接口测试工具'" :src="item.imgs" alt="">
<img v-if="item.name=='JAVA单元测试工具'" :src="item.imgs" alt="">
<img v-if="item.name=='功能测试工具AutoFun'" :src="item.imgs" alt="">
<img v-if="item.name=='代码组成分析平台'" :src="item.imgs" alt="">
<img v-if="item.name=='性能测试工具'" :src="item.imgs" alt="">
<img v-if="item.name=='自鉴-交互式应用安全测试系统IAST'" :src="item.imgs" alt="">
<img v-if="item.name=='Web应用安全测试工具'" :src="item.imgs" alt="">
<img v-if="item.name=='资产识别及漏洞管理工具'" :src="item.imgs" alt="">
<img v-if="item.name=='性能测试工具AutoLoad'" :src="item.imgs" alt="">
</view>
</view>
<p class="leop leop1">{{ item.name }}</p>
<view style='display:flex;margin:30rpx 0'>
<view v-if='item.toolTypeName' class="tabone">{{ item.typel }}测试</view>
<view class="tabone" style="color: #FF8A00;border: 1px solid #FF8A00;margin-left: 10px;">
{{ item.deliverType }}</view>
</view>
<view style='display:flex;justify-content:space-between;margin:15rpx 0;width:100%'>
<p style="font-size: 24rpx;" v-if="item.price == 0">限时免费</p>
<p style="font-size: 34rpx;" v-else>¥ {{ item.price }}</p>
<img class="imgtwo" src="http://image.bjkeyware.com/static/index/add.png" alt="" @click="addcart(item.toolId)">
</view>
</view>
</view> -->
<!-- 培训服务 -->
<!-- <view style='display:flex;justify-content:space-between;margin:20px 0'>
<view style='display:flex;align-items: center;'>
@ -138,9 +210,10 @@
</view> -->
<!-- 众包服务 -->
<view style='display:flex;justify-content:space-between;margin:20px 0'>
<view style='display:flex;justify-content:space-between;margin:40rpx 0'>
<view style='display:flex;align-items: center;'>
<p style='font-size:20px;font-weight: bold;color: #333333;margin-left:10px' @click='nearfuture'>众包服务
<p style='font-size:34rpx;font-weight: bold;color: #333333;margin-left:10px' @click='nearfuture'>
众包服务
</p>
</view>
<view style='display:flex;align-items: center;' @click="gametype('crowd')">
@ -171,8 +244,7 @@
<image v-else-if="item.testType.split(',')[0] == 'development'"
src="http://image.bjkeyware.com/static/index/renliwb/ycrw.png" mode=""
style='width:160rpx;height:160rpx;margin-right:39rpx;'></image>
<image v-else
src="http://image.bjkeyware.com/static/index/renliwb/qtcs.png" mode=""
<image v-else src="http://image.bjkeyware.com/static/index/renliwb/qtcs.png" mode=""
style='width:160rpx;height:160rpx;margin-right:39rpx;'></image>
</view>
<view style="width:58vw;">
@ -202,10 +274,14 @@
</view>
<!-- <view class="buttonyz">竞标报名</view> -->
<view v-if="item.processStatus == 0" class="buttonyz">报名中</view>
<view v-if="item.processStatus == 1" class="buttonyz" style="background: linear-gradient(90deg, #FAC024, #FD9B1D);">实施中</view>
<view v-if="item.processStatus == 2" class="buttonyz" style="background: linear-gradient(90deg, #1EE2F9, #14CADA);">待验收</view>
<view v-if="item.processStatus == 3" class="buttonyz" style="background: linear-gradient(90deg, #FB9A78, #FC612A);">待结算</view>
<view v-if="item.processStatus == 4" class="buttonyz" style="background: linear-gradient(90deg, #3BF199, #13CB6E);">已完成</view>
<view v-if="item.processStatus == 1" class="buttonyz"
style="background: linear-gradient(90deg, #FAC024, #FD9B1D);">实施中</view>
<view v-if="item.processStatus == 2" class="buttonyz"
style="background: linear-gradient(90deg, #1EE2F9, #14CADA);">待验收</view>
<view v-if="item.processStatus == 3" class="buttonyz"
style="background: linear-gradient(90deg, #FB9A78, #FC612A);">待结算</view>
<view v-if="item.processStatus == 4" class="buttonyz"
style="background: linear-gradient(90deg, #3BF199, #13CB6E);">已完成</view>
<!-- <view v-if="item.taskStatus == 0" class="buttonyz">竞标报名</view>
<view v-else class="buttonyz1">报名结束</view> -->
</view>
@ -272,8 +348,15 @@
<script>
import { findLabelValueByPropnew } from '@/utils/util.js'
import mixin from '@/utils/mixin/index.js'
import onLineCourseItem from '@/components/onLineCourseItem/index.vue'
import poster from '@/components/poster/index.vue'
import { dateFormat } from '../../utils/util';
export default {
mixins: [mixin],
components: {
onLineCourseItem,poster
},
data() {
return {
navHeight: 0,
@ -283,6 +366,7 @@ export default {
toollist: [], //
crowdlist: [], //
tokenshow: false,
onLineList: []
}
},
created() {
@ -328,12 +412,13 @@ export default {
}
item.typel = item.toolTypeName.slice(0, 2)
})
this.toollist = res.data.rows.splice(0, 6)
this.toollist = res.data.rows.splice(0, 4)
}),
this.http.quickGet('/crowdsource/listAnon?pageNum=1&pageSize=10').then((res) => {
this.crowdlist = res.data.rows
this.crowdlist = this.crowdlist.splice(0, 3)
})
this.getOnLineCourse()
},
filters: {
tiilnamechange(value) {
@ -352,6 +437,56 @@ export default {
// url: 'https://w102.ttkefu.com/k/linkurl/?t=6F5CCH6'
})
},
async toLearn(course) {
if (course.isPay == '0' && !course.signUp) {
const res = await this.http.quickPost(`/train/online/signUp/${course.courseId}`, {}, true)
if (res.data.code == 200) {
uni.navigateTo({
url: `/pages/index/testtraining/onLineCourse?courseId=${course.courseId}`
})
}
else {
return
}
} else {
uni.navigateTo({
url: `/pages/index/testtraining/onLineCourse?courseId=${course.courseId}&learnStatus=${course.show ? true : false}`
})
}
},
getOnLineCourse() {
function filterCourse(course) {
return course.filter(item => {
return item
// const todayZero = new Date(dateFormat(new Date()).split(' ')[0] + ' 00:00:00').getTime()
// const couTime = new Date(item.courseTime).getTime()
// const endTime = new Date(item.dateTime).getTime()
// const endSubTime = couTime - endTime
// const sub = new Date(item.courseTime).getTime() - new Date().getTime()
// const oneDay = 24 * 1000 * 60 * 60
// if ((sub >= 0) && ((couTime - todayZero) <= oneDay * 2)) {
// return item
// }
// else if ((sub < 0) && (Math.abs(sub) <= endSubTime)) {
// return item
// }
})
}
let accessToken = uni.getStorageSync('accessToken')
if (accessToken) {
const wxUserInfo = uni.getStorageSync('wxUserInfo')
const userId = wxUserInfo.userId
this.http.quickGet(`/course/online/courses?userId=${userId}&portal=1`).then((res) => {
// console.log(res);
this.onLineList = filterCourse(res.data.data)
})
} else {
this.http.quickGet(`/course/online/courses/?portal=1`, false).then((res) => {
// console.log(res);
this.onLineList = filterCourse(res.data.data)
})
}
},
// onShareAppMessage(res) {
// if (res.from === 'button') {//
// console.log(res.target)
@ -476,13 +611,38 @@ export default {
}
</script>
<style>
<style lang="scss">
.wx-swiper-dots.wx-swiper-dots-horizontal {
// bottom: 160rpx;
margin-bottom: 140rpx;
// float: right;
// text-align: right;
// right: 0;
// width: 100%;
// background-color: #ffffff;
// padding-right: 15px;
}
.wx-swiper-dot {
background: #FFFFFF !important;
}
.wx-swiper-dot.wx-swiper-dot-active {
background-color: #2387ee !important;
}
.homeSwiper {
height: 481.9rpx;
}
.infoNav {
position: fixed;
width: 100%;
background-color: #284cd1;
z-index: 99;
}
.myNav {
position: fixed;
width: 100%;
@ -496,9 +656,11 @@ export default {
z-index: 99;
/* position: relative; */
}
page {
background-color: #f7f7f7;
}
.myNav image {
position: absolute;
width: 50rpx;
@ -510,10 +672,10 @@ page {
.logobg {
width: 100vw;
height: 51vw;
background-size: 100% 55vw;
background-image: url('http://image.bjkeyware.com/static/index/hhome_page.png');
background-repeat: no-repeat;
padding: 20px 5vw 20px 5vw;
/* background-size: 100% 55vw; */
/* background-image: url('http://image.bjkeyware.com/static/index/hhome_page.png'); */
/* background-repeat: no-repeat; */
/* padding: 20px 5vw 20px 5vw; */
margin-top: -1px;
/* padding:30px 0vw 20px 5vw; */
@ -529,6 +691,7 @@ page {
justify-content: space-between; */
/* padding: 10px; */
}
.buttonyz1 {
width: 139rpx;
height: 49rpx;
@ -539,6 +702,7 @@ page {
text-align: center;
line-height: 49rpx;
}
.customActionStyle {
width: 115rpx;
height: 60rpx;
@ -562,10 +726,10 @@ page {
}
.fouassociation {
/* position: relative; */
position: relative;
/* z-index: 2; */
/* width:90vw; */
margin: -12vw 3vw 0 3vw;
margin: -5vw 3vw 0 3vw;
display: flex;
justify-content: space-around;
background: rgba(255, 255, 255, 1);
@ -583,6 +747,23 @@ page {
position: relative;
}
.uni-margin-wrap {
width: 100%;
// margin: 20rpx 20rpx;
}
.mySwiper {
// background: linear-gradient(135deg, #FCF5F0, #ECF3FD);
width: 100%;
// height: 100%
height: 315rpx;
// box-shadow: 0rpx 2rpx 14rpx 1rpx rgba(8, 67, 140, 0.12);
}
.swiper {
// height: 300rpx;
}
.association img {
width: 13vw;
height: 13vw;
@ -597,22 +778,24 @@ page {
.schedule {
width: 94vw;
margin: 30px 3vw 20px 3vw;
margin: 0px 3vw 20px 3vw;
}
.koeui {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
overflow: auto;
/* flex-wrap: wrap; */
/* justify-content: space-between; */
}
.currekei {
width: 48%;
/* width: 48%; */
/* width: 600rpx; */
/* height: 360rpx; */
background: #ffffff;
border-radius: 10px;
padding: 10px 10px;
margin-bottom: 20rpx;
margin: 0rpx 20rpx 20rpx 20rpx;
}
.leop {
@ -625,6 +808,7 @@ page {
align-items: center;
justify-content: center;
}
.leop1 {
overflow: hidden;
text-overflow: ellipsis;
@ -763,4 +947,39 @@ page {
font-size: 16rpx !important;
color: #ffffff;
}
.scroll-view_H {
white-space: nowrap;
width: 100%;
}
.scroll-view-item {
height: 300rpx;
line-height: 300rpx;
text-align: center;
font-size: 36rpx;
}
.scroll-view-item_H {
display: inline-block;
width: 45%;
background: #ffffff;
border-radius: 10px;
padding: 10px 10px;
margin: 0rpx 20rpx 20rpx 0rpx;
/* height: 300rpx; */
/* line-height: 300rpx; */
/* text-align: center; */
/* font-size: 36rpx; */
}
.scroll-view-item_M {
display: inline-block;
writing-mode: vertical-rl;
text-align: center;
margin: 0 auto;
height: 300rpx;
color: #2387ee;
font-weight: 500;
}
</style>

@ -225,8 +225,8 @@
<style lang="scss" scoped>
.noreview {
font-size: 23px;
font-weight: bold;
font-size: 33rpx;
// font-weight: bold;
color: #9D9D9D;
text-align: center;
margin-top: 40rpx;

@ -248,8 +248,8 @@
<style lang="scss" scoped>
.noreview {
font-size: 23px;
font-weight: bold;
font-size: 33rpx;
// font-weight: bold;
color: #9D9D9D;
text-align: center;
margin-top: 40rpx;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

@ -1,34 +1,33 @@
<template>
<view class="onLineCourseWrap">
<view class="onLineCourseWrap" v-show="courseItem.courseName">
<view class="onLineTitle">
<img src="./olCourse.png" alt="">
<view>{{ '如何使用性能测试工具' }}</view>
<img src="http://image.bjkeyware.com/static/index/olCourse.png" alt="">
<view style="max-width: calc(100% - 100rpx);word-break: break-all">{{ courseItem.courseName }}</view>
</view>
<view class="onLineTime">时间: {{ '今日:20:00' }}</view>
<view class="onLineTeacher">讲师:{{ '独孤求败' }}</view>
<view class="onLine">职称:{{ '气宗大师' }}</view>
<view class="onLineContent">授课内容: {{ '教导令狐冲' }}</view>
<view class="onLineTime">时间: {{ yyyDate(courseItem.courseTime) }}</view>
<view class="onLineTeacher">讲师{{ courseItem.instructor }}</view>
<view class="onLine" v-show="courseItem.title">职称{{ courseItem.title }}</view>
<view class="onLineContent">授课内容: {{ courseItem.courseContent }}</view>
<view class="onLineMask" v-show="maskShow">
<img src="./arr.png" alt="">
<!-- <img src="http://image.bjkeyware.com/static/index/arr.png" alt=""> -->
<img src="" alt="">
<view class="learnBtnWrap">
<view class="learnBtn" @click="startLearn('pay')">付费学习</view>
<view class="learnBtn" @click="startLearn('code')">输入口令学习</view>
<view v-if="courseItem.status == '1'" class="learnBtn" @click="startLearn('pay')">付费学习{{
courseItem.amount }}</view>
<view v-if="courseItem.status == '1'" class="passBtn" @click="startLearn('code')">输入口令学习</view>
</view>
</view>
<view v-show="!maskShow" class="startLeranBtn">开始学习</view>
<view v-show="!maskShow" class="startLeranBtn" @click="urlShow = true">开始学习</view>
<u-modal v-model="show" title="请输入口令" :show-confirm-button="false">
<view class="slot-content">
<view v-if="toggleFlag === 'tolearn'">
<label>www.baidu.com</label>
</view>
<view v-else class="input-list">
<view class="input-list">
<!-- input输入框 -->
<input class="input-item" v-if="focus" adjust-position="false" auto-blur="true"
@blur="inputCodeBlur" @input="inputCode" :focus="focus" v-model="code" @focus="inputFocus"
type="number" oneTimeCode maxlength="6" />
<!-- 验证码输入框 -->
<view class="code-list" @click="focusClick">
<view class="code-item" v-for="(item, index) in 4" :key="index"
<view class="code-item" v-for="(_, index) in 4" :key="index"
:style="(index == code.length && focus ? 'border-color:#3c9cff;' : '')">{{ code[index] || ''
}}
</view>
@ -36,34 +35,195 @@
</view>
<view class="codeBtnCoup">
<view class="codeBtn canle" @click="show = false">取消</view>
<view class="codeBtn sure" @click="show = false">确定</view>
<view class="codeBtn sure" @click="submitCode">确定</view>
</view>
</view>
</u-modal>
<u-modal v-model="urlShow" title="学习链接" :show-confirm-button="false">
<view class="slot-content">
<view class="courseContent" style="text-align: center;">
<view style="color: #2084F9;">请使用腾讯会议打开</view>
<view style="font-weight: 500;">{{ courseItem.url }}</view>
</view>
<view class="codeBtnCoup" style="justify-content: center;margin-top: 0;">
<view class="codeBtn sure" style="width: 80%;border-radius: 5rpx;" @click="copy">复制</view>
</view>
</view>
</u-modal>
<!-- <u-popup style="background:#66666;padding: 20px;" v-model="isPopupShow" @close="close" mode="bottom"
length="80%" height='60%' border-radius="15" :closeable='true' :mask-close-able="false">
<view style="background:#66666;padding:15px 20px 30px 20px; ">
<view style="background-color: #FFFFFF;">
<view class="horizontalline"></view>
<view>
<view class="commodity">
<p>课程名称</p>
<p style="color:#333333;">{{ courseItem.courseName }}</p>
</view>
<view class="commodity">
<p>商品价格</p>
<p style="color:#333333;">
<span>{{ '9.9' }}</span>
</p>
</view>
<view class="commodity">
<p>支付金额</p>
<p style="color:#FD461A;margin-top: -3px;" v-if="addPriceAll != 0">
<span>¥ </span>
<span style="font-size:40rpx;margin-left:10rpx;font-weight: 800;">{{ addPriceAll
}}</span>
</p>
<p style="color:#FD461A;margin-top: -3px;" v-else>
<span>限时免费</span>
</p>
</view>
<view class="commodity">
<p>支付方式</p>
<p style="color:#FD461A;margin-top: -3px;">
<u-radio-group v-model="payTypeBig" placement="row">
<u-radio name="0">微信支付</u-radio>
<u-radio name="1" :disabled="lingqianIS">{{ lingqianIS ? '零钱不足' : '零钱' }}</u-radio>
</u-radio-group>
</p>
</view>
</view>
</view>
</view>
<u-line></u-line>
<view class="codeBtnCoup" style="justify-content: center;">
<view class="codeBtn sure" style="width: 80%;" @click="payOrder">支付</view>
</view>
</u-popup> -->
</view>
</template>
<script>
import { dateFormat } from '../../../utils/util';
export default {
data() {
return {
maskShow: true,
toggleFlag: '',
show: false,
focus: false,
code: ''
code: '',
courseItem: {},
courseId: '',
urlShow: false,
url: '',
learnStatus: false,
// isPopupShow: false,
// payTypeBig: '0',
// lingqianIS: false
}
},
computed: {
yyyDate() {
return function (val) {
return dateFormat(new Date(val))
}
}
},
onLoad(course) {
const id = course.courseId
this.courseId = id
this.http.quickGet('/course/online/course/' + id).then(res => {
this.courseItem = res.data.data
if ((this.courseItem.status == 0) || course.learnStatus == 'true') {
this.maskShow = false
}
})
},
methods: {
startLearn() {
this.maskShow = !this.maskShow
payOrder() {
},
close() {
this.isPopupShow = false
// console.log('close');
},
startLearn(val) {
if (val == 'code') {
this.show = true
} else if (val == 'pay') {
// this.isPopupShow = true
this.toPay()
}
// this.toggleFlag = 'tolearn'
},
toPay() {
const userinform = uni.getStorageSync('wxUserInfo');
const id = userinform.userId
// const data = {
// courseId: this.tooldetilsdata.tool.toolId,
// amount: this.cartnumber,
// deliverType: this.tooldetilsdata.tool.deliverType,
// price: '',
// payType: 'W06',
// paytype: 'W06',
// toolType: this.tooldetilsdata.tool.toolType,
// userId: id
// }
const data = {
"price": this.courseItem.amount,
"payType": "W06",
"userId": id,
// "recordName": this.courseItem.courseName,
// "toolId":this.courseItem.courseId
}
// return
const _this = this
this.http.quickPost(`/play/course/pay`, data, true).then(res => {
// console.log(res);
if (res.data.data.retcode == 'SUCCESS') {
const info = JSON.parse(res.data.data.payinfo)
console.log(info);
// return
// 06
// 01
// return
uni.requestPayment({
timeStamp: info.timeStamp,
nonceStr: info.nonceStr,
package: info.package,
signType: info.signType,
paySign: info.paySign,
success(r) {
const sucData = {
"price": _this.courseItem.amount,
"payType": "W06",
"userId": id,
"recordName": _this.courseItem.courseName,
"toolId": _this.courseItem.courseId
}
_this.http.quickPost(`/play/course/pay/succes`, sucData, true).then(res => { })
uni.showToast({
icon: 'none',
title: '支付成功'
})
_this.maskShow = false
// that.isPopupShow = false
// setTimeout(() => {
// uni.navigateTo({
// url: '/pages/personal/ordernumber/ordernumber?current=0'
// })
// }, 1000)
},
fail(error) {
console.log(error);
uni.showToast({
icon: 'none',
title: '支付失败'
})
}
})
} else {
uni.showToast({
icon: 'none',
title: '支付错误,请联系管理员'
})
}
})
},
focusClick() {
this.focus = true
@ -75,6 +235,9 @@ export default {
this.show = true
},
inputCode(e) {
if (this.code.length > 4) {
return
}
let value = e.detail.value
this.code = value
},
@ -84,12 +247,52 @@ export default {
inputCodeBlur(e) {
let value = e.detail.value
this.focus = false
},
copy() {
uni.setClipboardData({
data: this.courseItem.url, // value
success: function () {
//
uni.showToast({
title: '已复制到剪切板',
icon: 'none'
})
}
})
this.urlShow = false
},
submitCode() {
this.http.quickPost('/train/course/enterPasswd/' + this.courseId, { password: this.code }, true).then(res => {
if (res.data.code != 200) {
uni.showToast({
title: res.data.msg,
icon: 'none',
duration: 2000,
})
} else {
// this.url = res.data.data
this.maskShow = false
}
})
this.code = ''
this.show = false
}
}
}
</script>
<style lang="scss" scoped>
.commodity {
display: flex;
color: #808080;
font-size: 32rpx;
margin: 20px 0;
}
.commodity input {
min-height: 40rpx !important;
}
.onLineCourseWrap {
margin: 25rpx;
height: calc(100% - 50rpx);
@ -98,17 +301,18 @@ export default {
padding: 24rpx;
font-family: PingFang SC;
font-weight: 500;
font-size: 24rpx;
font-size: 27rpx;
color: #404040;
.onLineTitle {
font-weight: bold;
font-size: 28rpx;
font-size: 30rpx;
color: #000000;
line-height: 46rpx;
margin: 30rpx 0;
display: flex;
align-items: center;
img {
width: 38rpx;
height: 38rpx;
@ -121,15 +325,17 @@ export default {
}
.onLineTeacher {
margin: 15rpx 0;
margin: 20rpx 0;
}
.onLine {
margin: 15rpx 0;
margin: 20rpx 0;
}
.onLineContent {
margin: 15rpx 0;
margin: 20rpx 0;
line-height: 46rpx;
// line-height: 1.5;
}
.onLineMask {
@ -138,8 +344,6 @@ export default {
left: 0;
width: 100%;
height: 100%;
background: #1B81F9;
background: linear-gradient(180deg, #ffffff07, #1B81F9);
img {
width: 46rpx;
@ -149,15 +353,16 @@ export default {
.learnBtnWrap {
width: 279rpx;
margin-top: 200rpx;
margin-top: 211rpx;
margin-left: 50%;
transform: translate(-50%);
.learnBtn {
margin-bottom: 50rpx;
width: 279rpx;
height: 67rpx;
background: linear-gradient(90deg, #5EA6FD, #1A81F9);
box-shadow: 0rpx 1rpx 20rpx 1rpx rgba(13, 92, 187, 0.53);
margin-bottom: 30rpx;
border-radius: 33rpx;
font-family: PingFang SC;
font-weight: 500;
@ -166,6 +371,17 @@ export default {
line-height: 65rpx;
text-align: center;
}
.passBtn {
margin-bottom: 90rpx;
height: 67rpx;
font-family: PingFang SC;
font-weight: 500;
font-size: 30rpx;
color: #1578ED;
line-height: 65rpx;
text-align: center;
}
}
}
@ -227,6 +443,7 @@ export default {
display: flex;
justify-content: space-between;
margin-top: 40rpx;
.codeBtn {
width: 250rpx;
line-height: 70rpx;
@ -235,18 +452,31 @@ export default {
font-size: 28rpx;
color: #FFFFFF;
}
.sure {
background: linear-gradient(90deg, #5EA6FD, #1A81F9);
}
.canle {
color: #666666;
border: 1px solid #E0E0E0;
}
}
// & >>>.u-model__title {
// font-weight: bold;
// }
.courseContent {
width: 372rpx;
text-overflow: ellipsis;
white-space: normal;
word-break: break-all;
margin: 30rpx auto 0 auto;
font-family: PingFang SC;
font-weight: bold;
font-size: 28rpx;
line-height: 49rpx;
// background-color: #000000;
text-align: center;
}
}
</style>

@ -5,19 +5,12 @@
<!-- <image src="http://image.bjkeyware.com/static/index/renliwb/newtrainbanner08.png" mode="" class="logobg"> -->
<!-- </image> -->
<!-- 模块1 -->
<view class="onlineTrain">
<view class="onLineTitle">
<view class="onLineClassName">软测课堂</view>
<view class="onLineCourseTime">时间{{ '今日 20:00' }}</view>
<view class="onLineTrainTitle" v-if="onLineList.length">
<view class="onLineTitleText">线上培训课程</view>
<view class="more" @click="getMore">更多> </view>
</view>
<view class="onLineCourse">如何使用性能测试工具</view>
<view class="onLineTeacher">讲师: 风清扬老师</view>
<view class="onLineBtnWrap">
<view class="onLineBtn toLearn" @click="toLearn">去学习</view>
<view class="onLineBtn toPay" @click="toLearn">付费学习: {{ '9.9' }}</view>
</view>
</view>
<onLineCourseItem v-for="(onLineCourse, onLineIndex) in onLineList" :key="onLineIndex"
:onLineCourse="onLineCourse" @toLearn="toLearn"></onLineCourseItem>
<view class="titlePeo">
<view class="titletopt">
<image src="../../../static/crowd/rihhj.png" alt="" />
@ -338,7 +331,6 @@
<view style="background-color: #FFFFFF;padding:13px;display">
<view v-if="currenttab == 1">
<view style="display: flex;justify-content: space-between;">
<image mode="aspectFill" class="innovate" :src="activeModel2.img">
</view>
<p style="color:#808080;font-size:25rpx;margin:15px 0; line-height: 22px;text-indent:25px;">
@ -587,11 +579,15 @@
</template>
<script>
import onLineCourseItem from '@/components/onLineCourseItem/index.vue'
const sexMap = {
'男': '0',
'女': '1'
}
export default {
components: {
onLineCourseItem
},
data() {
//
const validateId = (rule, value, callback) => {
@ -632,6 +628,8 @@ export default {
sexShow: false,
calltext: '',
timetext: '',
// 线
onLineList: [],
sexList: [
{
value: '0',
@ -739,7 +737,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -751,7 +749,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -763,7 +761,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -775,7 +773,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -787,7 +785,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -799,7 +797,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -811,7 +809,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -823,7 +821,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -835,7 +833,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -847,7 +845,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -870,7 +868,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
form: {},
@ -1093,7 +1091,6 @@ export default {
//
this.getClassList()
this.getOnlineCourse()
this.getTeacherList()
this.getSwiperImages()
uni.onKeyboardHeightChange(this.onKeyboardHeightChange)
@ -1101,6 +1098,9 @@ export default {
onUnload() {
uni.offKeyboardHeightChange(this.onKeyboardHeightChange)
},
onShow() {
this.getOnlineCourse()
},
onReady() {
//onReady uni-app
this.$refs.uForm.setRules(this.rules)
@ -1108,7 +1108,7 @@ export default {
},
onShareAppMessage() {
return {
title: '关键测试宝', //
title: '小关软测宝', //
path: 'pages/index/testtraining/testtraining', //
// imageUrl: '/static/index/logo.png' //
}
@ -1116,18 +1116,42 @@ export default {
//2.
onShareTimeline() {
return {
title: '关键测试宝', //
title: '小关软测宝', //
query: 'pages/index/testtraining/testtraining', //
// imageUrl: '/static/index/logo.png' //
}
},
methods: {
//
toLearn() {
async toLearn(course) {
if (!course.signUp && course.isPay == '0') {
console.log('报名');
const res = await this.http.quickPost(`/train/online/signUp/${course.courseId}`, {}, true)
if (res.data.code == 200) {
uni.navigateTo({
url: '/pages/index/testtraining/onLineCourse'
url: `/pages/index/testtraining/onLineCourse?courseId=${course.courseId}`
})
}
else {
return
}
} else {
console.log('不报名');
uni.navigateTo({
url: `/pages/index/testtraining/onLineCourse?courseId=${course.courseId}&learnStatus=${course.show ? true : false}`
})
}
},
getMore() {
let accessToken = uni.getStorageSync('accessToken')
if (accessToken) {
uni.navigateTo({ url: '/pages/personal/myCourse/allMyCourse' })
} else {
uni.navigateTo({ url: '/pages/personal/myCourse/allMyCourse' })
}
},
testtrainCallback(e) {
this.jjform.sex = e[0].label
@ -1136,7 +1160,8 @@ export default {
this.form.sex = e[0].label
},
getSwiperImages() {
this.http.quickGet(`/train/banners?type=app`).then((res) => {
this.http.quickGet(`/train/banners?type=app`)
.then((res) => {
this.swipelist = res.data.data.map((item) => {
console.log(item)
return {
@ -1212,17 +1237,18 @@ export default {
.exec()
},
getOnlineCourse() {
let accessToken = uni.getStorageSync('accessToken')
if (accessToken) {
const wxUserInfo = uni.getStorageSync('wxUserInfo')
const userId = wxUserInfo.userId
this.http.quickGet(`/course/online/course?${userId}`).then((res) => {
this.http.quickGet(`/course/online/courses?userId=${userId}`).then((res) => {
console.log(res);
this.onLineList = res.data.data.slice(0, 3)
})
} else {
this.http.quickGet(`/course/online/course`, false).then((res) => {
console.log(res);
this.http.quickGet(`/course/online/courses`, false).then((res) => {
// console.log(res);
this.onLineList = res.data.data.slice(0, 3)
})
}
},
@ -1500,8 +1526,8 @@ export default {
})
}
})
},
},
}
}
}
</script>
@ -1832,87 +1858,27 @@ export default {
box-sizing: border-box;
}
.onlineTrain {
margin: 30rpx 0rpx;
height: 270rpx;
background: #FFFFFF;
border-radius: 10rpx;
}
.onLineTitle {
.onLineTrainTitle {
margin: 10rpx 0;
line-height: 80rpx;
display: flex;
font-family: PingFang SC;
font-weight: 500;
height: 88rpx;
line-height: 54rpx;
align-items: center;
justify-content: space-between;
}
.onLineClassName {
height: 54rpx;
width: 183rpx;
text-align: center;
background: linear-gradient(90deg, #5EA6FD, #1A81F9);
border-radius: 9rpx 0rpx 46rpx 0rpx;
font-size: 24rpx;
color: #FFFFFF;
}
.onLineCourse {
font-size: 28rpx;
line-height: 46rpx;
font-family: PingFang SC;
.onLineTrainTitle .onLineTitleText {
font-weight: bold;
color: #1A1A1A;
margin-left: 24rpx;
}
.onLineCourseTime {
margin-left: 24rpx;
margin-right: 30rpx;
width: 174rpx;
line-height: 88rpx;
font-size: 22rpx;
color: #808080;
}
.onLineTeacher {
margin-top: 10rpx;
margin-left: 24rpx;
font-size: 24rpx;
font-weight: 500;
color: #666666;
line-height: 46rpx;
}
.onLineBtnWrap {
display: flex;
justify-content: flex-end;
font-size: 30rpx;
}
.onLineBtn {
width: 209rpx;
height: 50rpx;
border-radius: 25rpx;
width: 209rpx;
width: 167rpx;
font-family: PingFang SC;
.onLineTrainTitle .more {
font-weight: 500;
font-size: 24rpx;
color: #FFFFFF;
line-height: 49rpx;
text-align: center;
font-size: 28rpx;
color: #808080;
}
.toLearn {
background: linear-gradient(90deg, #FB8C16, #FEC36E);
}
.toPay {
background: linear-gradient(90deg, #5EA6FD, #1A81F9);
border: 1px solid #AAD1FE;
}
.logobg {
width: 100%;

@ -24,8 +24,8 @@
</p>
<p v-else style="color:#FD461A;">
<span>¥ </span>
<span
style="font-size:40rpx;margin-left:10rpx;font-weight: 800;">{{tooldetilsdata.tool.price}}</span>
<span style="font-size:40rpx;margin-left:10rpx;font-weight: 800;">{{ tooldetilsdata.tool.price
}}</span>
</p>
<!-- <p style="color:#999999;font-size:24rpx;">销量350个</p> -->
</view>
@ -37,7 +37,8 @@
</view>
<view style='display:flex;margin:30rpx 0'>
<view class="tabone">类型
{{findLabelValueByPropnew(tooltypelist, tooldetilsdata.tool.toolType+'', 'dictValue', 'dictLabel' ) }}
{{ findLabelValueByPropnew(tooltypelist, tooldetilsdata.tool.toolType + '', 'dictValue',
'dictLabel') }}
</view>
<view class="tabone" style="color: #FF8A00;border: 1px solid #FF8A00;margin-left: 10px;">
交付方式{{ tooldetilsdata.tool.deliverType }}</view>
@ -182,15 +183,17 @@
<p style="color:#333333;">
<span v-if="typeName == '测试服务(按次计)' && tooldetilsdata.tool.priceTime == 0">限时免费</span>
<span v-else-if="typeName == '使用时长(按月计)' && tooldetilsdata.tool.price == 0">限时免费</span>
<span
v-else>{{ typeName == '测试服务(按次计)' ? tooldetilsdata.tool.priceTime : tooldetilsdata.tool.price }}</span>
<span v-else-if="typeName == '线下测试服务(金额面议)'">金额面议</span>
<span v-else>{{ typeName == '测试服务(按次计)' ? tooldetilsdata.tool.priceTime :
tooldetilsdata.tool.price }}</span>
<!-- {{tooldetilsdata.tool.price}} -->
</p>
</view>
<view class="commodity">
<p>购买数量</p>
<span v-if="(typeName == '测试服务(按次计)' && tooldetilsdata.tool.priceTime == 0) || (typeName == '使用时长(按月计)' && tooldetilsdata.tool.price == 0) ">1</span>
<span
v-if="(typeName == '测试服务(按次计)' && tooldetilsdata.tool.priceTime == 0) || (typeName == '使用时长(按月计)' && tooldetilsdata.tool.price == 0)">1</span>
<u-number-box v-else v-model="cartnumber" @change="valChange"></u-number-box>
<!-- <p style="color:#333333 ;">Kinterface接口测试工具-软件版</p> -->
</view>
@ -198,10 +201,11 @@
<p>支付金额</p>
<p style="color:#FD461A;margin-top: -3px;" v-if="addPriceAll != 0">
<span>¥ </span>
<span style="font-size:40rpx;margin-left:10rpx;font-weight: 800;">{{addPriceAll}}</span>
<span style="font-size:40rpx;margin-left:10rpx;font-weight: 800;">
{{ typeName == '线下测试服务(金额面议)' ? '金额面议' : addPriceAll }}</span>
</p>
<p style="color:#FD461A;margin-top: -3px;" v-else>
<span>限时免费</span>
<span>{{ typeName == '线下测试服务(金额面议)' ? '金额面议' : '限时免费' }}</span>
</p>
</view>
<view class="commodity">
@ -267,10 +271,19 @@
}, {
value: '使用时长(按月计)',
label: '使用时长(按月计)'
}],
},
{
value: '线下测试服务(金额面议)',
label: '线下测试服务(金额面议)'
}
],
typeList1: [{
value: '使用时长(按月计)',
label: '使用时长(按月计)'
},
{
value: '线下测试服务(金额面议)',
label: '线下测试服务(金额面议)'
}],
tooldetilsdata: {},
logoimg: '',
@ -405,6 +418,27 @@
toolType: this.tooldetilsdata.tool.toolType,
userId: id
}
if (this.typeName == '线下测试服务(金额面议)') {
data.priceType = 'offLine'
data.price = '0'
this.http.quickPost(`/business/tool/nopay/one`, data, true).then(res => {
console.log(res);
if (res.data.code != 500) {
uni.showToast({
icon: 'none',
title: '购买成功'
})
} else {
uni.showToast({
icon: 'none',
title: res.data.msg
})
}
this.isPopupShow = false
})
return
}
if (this.addPriceAll == 0) {
//
this.http.quickPost(`/business/tool/nopay/one`, data, true).then(res => {

@ -3,7 +3,7 @@
<view class="bureau">
<view style="display: flex;justify-content:center;align-items: center;margin-bottom: 43px;">
<img src="/static/index/logo.png" alt="">
<p class="bureaup">关键测试</p>
<p class="bureaup">小关软测</p>
</view>
<button v-if="!isselect" class="button-g" type='primary' @click="logindl">一键快捷登录</button>
<button v-else class="button-g" type='primary' open-type="getPhoneNumber" withCredentials="true"

@ -0,0 +1,109 @@
<template>
<view class="allcourseWrapper">
<view v-if="onLineList.length">
<view v-for="course in onLineList" :key="course.courseId">
<onLineCourseItem :onLineCourse="course" @toLearn="toLearn"></onLineCourseItem>
</view>
</view>
</view>
</template>
<script>
import { dateFormat } from '@/utils/util';
import onLineCourseItem from '@/components/onLineCourseItem/index.vue'
export default {
components: {
onLineCourseItem
},
data() {
return {
onLineList: [],
total: 10,
classId: '',
className: '',
queryParams: {
pageSize: 10,
pageNum: 1,
},
}
},
onShow() {
// const classId = options.id
// const className = options.name
// this.className = className
// // console.log(options)
// this.classId = classId
// uni.setNavigationBarTitle({ title: className })
this.getCourseList()
},
methods: {
async toLearn(course) {
if (!course.signUp && course.isPay == '0') {
const res = await this.http.quickPost(`/train/online/signUp/${course.courseId}`, {}, true)
if (res.data.code == 200) {
uni.navigateTo({
url: `/pages/index/testtraining/onLineCourse?courseId=${course.courseId}`
})
}
else {
return
}
} else {
uni.navigateTo({
url: `/pages/index/testtraining/onLineCourse?courseId=${course.courseId}&learnStatus=${course.show ? true : false}`
})
}
},
pagionChange(e) {
console.log(e);
this.queryParams.pageNum = e.current
this.getCourseList()
},
async getCourseList() {
let accessToken = uni.getStorageSync('accessToken')
if (accessToken) {
const wxUserInfo = uni.getStorageSync('wxUserInfo')
const userId = wxUserInfo.userId
this.http.quickGet(`/course/online/courses?userId=${userId}`).then((res) => {
// console.log(res);
this.onLineList = res.data.data
console.log(this.onLineList);
})
} else {
this.http.quickGet(`/course/online/courses`, false).then((res) => {
// console.log(res);
this.onLineList = res.data.data
console.log(this.onLineList);
})
}
},
async onReachBottom() {
if (this.total <= this.queryParams.pageSize) {
return
}
this.queryParams.pageSize += 10
this.getCourseList()
console.log("onReachBottom");
},
async onReachBottom() {
// if (this.total <= this.queryParams.pageSize) {
// return
// }
// this.queryParams.pageSize += 10
// this.getCourseList()
console.log("onReachBottom");
},
},
}
</script>
<style lang="scss" scoped>
.allcourseWrapper {
// text-align: center;
margin: 20rpx;
}
</style>

@ -1,6 +1,6 @@
<template>
<view class="courseWrapper">
<view v-if="courseList.length">
<!-- <view v-if="courseList.length">
<view class="onlineTrain">
<view class="onLineTitle">
<view class="onLineClassName">软测课堂</view>
@ -13,9 +13,10 @@
<view class="onLineBtn toPay" @click="toLearn">付费学习: {{ '9.9' }}</view>
</view>
</view>
</view>
</view> -->
<view v-if="courseList.length">
<view class="courseItem" v-for="course in courseList" :key="course.courseId">
<view class="" v-for="course in courseList" :key="course.courseId">
<view class="courseItem" v-if="!course.isPay">
<view class="courseName">{{ course.courseName }}</view>
<view class="courseTime">{{ course.courseTime }}</view>
<view class="courseSource" @click="courseDialog">课程资料</view>
@ -23,39 +24,98 @@
course.status ? '已签到' : '未签到'
}}</view>
</view>
<view v-else class="onlineTrain" @click="toLearn(course)">
<view class="onLineTitle">
<view class="onLineClassName">{{ className }}</view>
<view class="onLineCourseTime">时间{{ courseTime(course.courseTime) }}</view>
</view>
<view class="onLineCourse">{{ course.courseName }}</view>
<view class="onLineTeacher">讲师: {{ course.instructor }}</view>
<view class="onLineBtnWrap">
<view v-if="toLearnShow(course)" class="onLineBtn toPay" @click="toLearn(course)">付费学习{{
course.amount }}</view>
<view v-else class="onLineBtn toLearn" @click="toLearn(course)">去学习
</view>
</view>
</view>
</view>
</view>
<view class="mycourseWrapper" v-else>
<img src="../../index/testtraining/noCourse.png" alt="">
<img src="http://image.bjkeyware.com/static/index/noCourse.png" alt="">
<view>暂未配置课程</view>
</view>
</view>
</template>
<script>
import { dateFormat } from '@/utils/util';
export default {
computed: {
toLearnShow() {
return function (course) {
if ((course.isPay == '1') && (course.remark.indexOf(course.courseId) == -1)) {
return true
}
return false
}
},
courseTime() {
return function (val) {
const tarTime = dateFormat(new Date(val))
const nowTime = dateFormat(new Date())
const day = tarTime.split(' ')[0];
const nday = nowTime.split(' ')[0];
let preDay = ''
if (nday === day) {
preDay = '今日'
} else if ((day.substr(0, 8) === nday.substr(0, 8)) && (day.substr(8, 10) * 1 - nday.substr(8, 10)) == 1) {
preDay = '明日'
} else {
preDay = day
}
const temp = tarTime.split(' ')[1]
const time = temp.slice(0, temp.lastIndexOf(':'));
return preDay + ' ' + time
}
}
},
data() {
return {
courseList: [],
total: 10,
classId: '',
className: '',
queryParams: {
pageSize: 10,
pageNum: 1,
},
}
},
onShow() {
this.getCourseList()
},
onLoad(options) {
const classId = options.id
const className = options.name
this.className = className
// console.log(options)
this.classId = classId
uni.setNavigationBarTitle({ title: className })
this.getCourseList()
},
methods: {
toLearn() {
toLearn(course) {
// console.log(course.isPay && course.remark && (course.remark.indexOf(course.courseId) != -1));
// remarkremarkcourseId
if ((course.isPay == '1') && (course.remark.indexOf(course.courseId) == -1)) {
course.show = false
} else {
course.show = true
}
// console.log(course.show);
uni.navigateTo({
url: '/pages/index/testtraining/onLineCourse'
url: `/pages/index/testtraining/onLineCourse?courseId=${course.courseId}&learnStatus=${course.show ? true : false}`
})
},
pagionChange(e) {
@ -69,6 +129,7 @@ export default {
this.total = res.data.total
this.courseList = res.data.rows
})
console.log(this.courseList);
},
async onReachBottom() {
if (this.total <= this.queryParams.pageSize) {
@ -184,7 +245,8 @@ export default {
.onLineClassName {
height: 54rpx;
width: 183rpx;
min-width: 183rpx;
padding: 0 10rpx;
text-align: center;
background: linear-gradient(90deg, #5EA6FD, #1A81F9);
border-radius: 9rpx 0rpx 46rpx 0rpx;
@ -199,13 +261,15 @@ export default {
font-weight: bold;
color: #1A1A1A;
margin-left: 24rpx;
height: 40rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space:nowrap
}
.onLineCourseTime {
margin-left: 24rpx;
margin-right: 30rpx;
width: 174rpx;
line-height: 88rpx;
font-size: 22rpx;
color: #808080;
@ -227,16 +291,14 @@ export default {
}
.onLineBtn {
width: 209rpx;
min-width: 209rpx;
height: 50rpx;
border-radius: 25rpx;
width: 209rpx;
width: 167rpx;
font-family: PingFang SC;
font-weight: 500;
font-size: 24rpx;
color: #FFFFFF;
line-height: 49rpx;
line-height: 50rpx;
text-align: center;
}

@ -31,27 +31,30 @@
style="font-weight: 500;font-size: 22rpx;color: #999999;margin-top: 20rpx;">
规格测试服务(按次计)</view>
<view style="font-weight: 500;font-size: 22rpx;color: #999999;">数量{{item.amount}} |
交付方式{{item.deliverType}}</view>
交付方式{{item.priceType == 'offLine' ? '线下服务' : item.deliverType}}</view>
</view>
</view>
<view style="margin-top: 30px; min-width: 150rpx; text-align: right;">
<!-- <p style="font-size: 13px;color: #4D4D4D;">实付金额</p> -->
<view v-if="item.status == 0" style="color: #f4a42f;margin-bottom: 10rpx;">
<view v-if="item.priceType == 'offLine'" style="color: #f4a42f;margin-bottom: 10rpx;">
已完成
</view>
<view v-if="item.status == 0 && item.priceType != 'offLine'" style="color: #f4a42f;margin-bottom: 10rpx;">
待支付
</view>
<view v-if="item.status == 1" style="color: #54be77;margin-bottom: 10rpx;">
<view v-if="item.status == 1 && item.priceType != 'offLine'" style="color: #54be77;margin-bottom: 10rpx;">
支付成功
</view>
<view v-if="item.status == 2" style="color: #ef6461;margin-bottom: 10rpx;">
<view v-if="item.status == 2 && item.priceType != 'offLine'" style="color: #ef6461;margin-bottom: 10rpx;">
已取消
</view>
<view v-if="item.status == 3" style="color: #8593a3;margin-bottom: 10rpx;">
<view v-if="item.status == 3 && item.priceType != 'offLine'" style="color: #8593a3;margin-bottom: 10rpx;">
已过期
</view>
<view style="display: flex;align-items: center;justify-content: flex-end;">
<p style="font-weight: bold;font-size: 12px;color: #FD461A;margin-right:3px;">¥</p>
<p style="font-size:18px;color: #FD461A;">{{item.fee}}</p>
<p style="font-weight: bold;font-size: 12px;color: #FD461A;margin-right:3px;" v-show="item.priceType !='offLine'">¥</p>
<p style="font-size:18px;color: #FD461A;">{{item.priceType =='offLine' ? '金额面议' : item.fee}}</p>
</view>
</view>
</view>
@ -190,8 +193,6 @@
this.currentoerderist = this.orderlist.filter(it => it.status == 2)
}
})
},
methods: {
dateFormat,

@ -108,14 +108,14 @@
</view>
</view>
<view class="cycontentit" @click="servier('bcrowd')">
<image src="http://image.bjkeyware.com/static/index/renliwb/newmy2.png" class="cycontentitimg"
<image style="width: 45rpx;height: 45rpx;" src="http://image.bjkeyware.com/static/index/renliwb/newmy2.png" class="cycontentitimg"
mode=""></image>
<view class="cycontentittext">
我的众包
</view>
</view>
<view class="cycontentit" @click="servier('peixunban')" v-if="signuplistLength != 0">
<image src="http://image.bjkeyware.com/static/index/renliwb/newmy6.png" class="cycontentitimg"
<image src="http://image.bjkeyware.com/static/index/renliwb/newmy66.png" class="cycontentitimg"
mode=""></image>
<view class="cycontentittext">
我的培训班
@ -155,7 +155,7 @@
</view>
</view> -->
<view class="cycontentit" @click="servier('myreview')">
<image src="http://image.bjkeyware.com/static/index/renliwb/newmy3.png" class="cycontentitimg"
<image src="http://image.bjkeyware.com/static/index/renliwb/newmy33.png" class="cycontentitimg"
mode=""></image>
<view class="cycontentittext">
我的评价

@ -3,7 +3,7 @@
<view class="bureau">
<view style="margin-bottom: 43px;">
<img src="/static/index/logo.png" alt="">
<p style="margin: 10px 0;">关键测试</p>
<p style="margin: 10px 0;">小关软测</p>
<p style="font-size:.8rem;font-weight: 400;letter-spacing: 0.7rem;">专业软件测试云平台</p>
</view>
<view class="inlog">

@ -1,9 +1,9 @@
<template>
<view class="navTab">
<p style="font-size: 18px;text-align: center;font-weight: bold;margin-bottom:15px;">关键测试宝用户隐私政策</p>
<p style="font-size: 18px;text-align: center;font-weight: bold;margin-bottom:15px;">小关软测宝用户隐私政策</p>
<p>更新日期2024年3月05日</p>
<p style="margin: 10px 0;">生效日期2024年3月05日</p>
<p style='text-indent:30px;'>北京京关键科技股份有限公司运营的关键测试宝在线服务平台小程序软件以下简称关键测试或我们尊重并保护所有关键测试宝用户
<p style='text-indent:30px;'>北京京关键科技股份有限公司运营的小关软测宝在线服务平台小程序软件以下简称小关软测或我们尊重并保护所有小关软测宝用户
以下也称的个人信息及隐私安全我们依据中华人民共和国网络安全法中华人民共和国个人信息保护法中华人民共和国民法典
信息安全技术个人信息安全规范以及其他相关法律法规和技术规范明确了我们收集/使用/对外提供个人信息的原则进一步阐述了关于您个人信息的相关权利</p>
<p style='text-indent:30px;'>
@ -15,18 +15,18 @@
体予以区别请您重点查阅
</span>
</p>
<p style='text-indent:30px;font-weight: bold;margin: 10px 0;'>关键测试宝特别提请未满18周岁的未成年特别是未满十四周岁的儿童及其监护人的注意
<p style='text-indent:30px;font-weight: bold;margin: 10px 0;'>小关软测宝特别提请未满18周岁的未成年特别是未满十四周岁的儿童及其监护人的注意
我们已明确未成年保护专门章节以粗体提示请您仔细阅读</p>
<p style='text-indent:30px;'>
请在使用/继续使用我们的各项产品与服务前仔细阅读并充分理解本政策并在需要时按照本政策的指引
做出适当的选择如果您不同意本政策的内容将可能导致我们的产品与/或服务无法正常运行
或者无法达到我们拟达到的服务效果您应立即停止访问/使用我们的产品与/或服务您使用或继续使用我们
提供的产品与/或服务的行为都表示您充分理解和同意本关键测试宝用户隐私政策包括更新版本的全部内容
提供的产品与/或服务的行为都表示您充分理解和同意本小关软测宝用户隐私政策包括更新版本的全部内容
</p>
<p style="font-weight: bold; margin:5px 0;">我们如何收集和使用您的个人信息</p>
<p style='text-indent:30px;'>关键测试宝是在线服务平台为用户提供包括培训服务众包服务工具服务人才服务搜索查看等功能/及服务我们将在本政策中依次向您说明每项功能可能收集的个人信息范围收集目的收集方式
<p style='text-indent:30px;'>小关软测宝是在线服务平台为用户提供包括培训服务众包服务工具服务人才服务搜索查看等功能/及服务我们将在本政策中依次向您说明每项功能可能收集的个人信息范围收集目的收集方式
以及拒绝提供个人信息可能导致的结果请您知悉您拒绝提供各项功能实现所必要的对应信息时
仍然可以使用关键测试宝平台的其他功能</p>
仍然可以使用小关软测宝平台的其他功能</p>
<p style='text-indent:30px;'>
我们会遵循正当合法必要的原则出于本政策所述的以下目的收集和使用您在使用我们服务过程中主动提供或因使用我们
产品和/或服务而产生的个人信息如果我们要将您的个人信息用于本政策未载明的其它用途
@ -45,15 +45,15 @@
但如您不提供此类信息不会影响您使用本产品和相关服务
</p>
<p style='text-indent:30px;'>
3. 在使用关键测试宝网站为您提供的服务时您在关键测试宝网站注册的账号可同时登录关键测试宝微信小程序并获得相关服务使用相关功能您使用该账号登录
使用关键测试宝小程序应同时受关键测试宝用户服务协议关键测试宝用户隐私政策及相关协议条款的约束
3. 在使用小关软测宝网站为您提供的服务时您在小关软测宝网站注册的账号可同时登录小关软测宝微信小程序并获得相关服务使用相关功能您使用该账号登录
使用小关软测宝小程序应同时受小关软测宝用户服务协议小关软测宝用户隐私政策及相关协议条款的约束
</p>
<p style="font-weight: bold; margin: 5px 0;">向您提供产品和/或服务</p>
<p style="font-weight: bold;">1. 用户体验改进计划</p>
<p style='text-indent:30px;'>关键测试宝将基于您对关键测试平台的使用数据结合您个人常用设备信息统计诊断系统问题优化产品体验我们会使用工具
含第三方工具统计您在使用关键测试宝平台过程中产生的数据信息其中包含
<p style='text-indent:30px;'>小关软测宝将基于您对小关软测平台的使用数据结合您个人常用设备信息统计诊断系统问题优化产品体验我们会使用工具
含第三方工具统计您在使用小关软测宝平台过程中产生的数据信息其中包含
<span style="font-weight: bold;">应用启动数页面访问数重点按钮点击数设置项的配置属性</span>
随着关键测试宝平台的升级迭代我们统计的范围会有所改变您使用关键测试宝平台新版本的行为将被视为您对届时相关改变的同意</p>
随着小关软测宝平台的升级迭代我们统计的范围会有所改变您使用小关软测宝平台新版本的行为将被视为您对届时相关改变的同意</p>
<p style="font-weight: bold;">2. 开展营销活动</p>
<p style='text-indent:30px;'>当您选择参加我们举办的有关营销活动时根据活动需要可能需要收集您提供的个人信息与第三方支付服务帐号这些信息包括
<span style="font-weight: bold;">个人电话号码支付宝账号微信帐号</span>
@ -66,7 +66,7 @@
您的联系方式以及您与我们的沟通记录包括线上沟通记录电话录音以便尽快为您解决问题和改进我们的产品与/或服务同时
我们可能会以电话短信站内信及相关方式主动联系您沟通您在使用我们产品及服务过程中产生的问题</p>
<p style='text-indent:30px;'>为了保证服务的体验处理服务纠纷您与客服间的通话信息可能会被录音有关上述信息的收集和使用规则如下</p>
<p style='text-indent:30px;'> A. 当您使用关键测试宝服务与平台或者其他用户发生纠纷时
<p style='text-indent:30px;'> A. 当您使用小关软测宝服务与平台或者其他用户发生纠纷时
我们可调取并使用录音信息作为解决纠纷的参考依据</p>
<p style='text-indent:30px;'>B. 为了向您提供客服和售后服务我们可能将您的通话录音存储在第三方客服系统中我们会通过协议约束等方式
确保第三方无法访问您的通话录音除以下情形外平台不会将录音提供给任何人包括通话主被叫方
@ -135,7 +135,7 @@
<p style="font-weight: bold; ">保护</p>
<p style='text-indent:30px;'>为了保护您的个人信息安全我们将努力采取各种符合行业标准的安全措施来保护您的个人信息以最大程度降低您的个人信息被毁损盗用泄露非授权访问使用披露和更改的风险我们将积极建立数据分类分级制度
数据安全管理规范数据安全开发规范来管理规范个人信息的存储和使用确保未收集与我们提供的服务无关的个人信息</p>
<p style='text-indent:30px;'>您的账户均有安全保护功能请妥善保管您的账户及密码信息关键测试宝将通过采取SSLSecure Socket Layer协议加密保护等相关安全措施确保您的信息不丢失不被滥用和变造尽管有前述安全措施但同时也请您注意在信息网络上不存在完善的安全措施为防止安全事故的发生我们已按照法律法规的规定制定了妥善的预警机制和应急预案如确发生安全事件我们将及时将相关情况选择以邮件信函电话推送通知及相关方式告知您难以逐一告知个人信息主体时我们会采取合理有效的方式发布公告
<p style='text-indent:30px;'>您的账户均有安全保护功能请妥善保管您的账户及密码信息小关软测宝将通过采取SSLSecure Socket Layer协议加密保护等相关安全措施确保您的信息不丢失不被滥用和变造尽管有前述安全措施但同时也请您注意在信息网络上不存在完善的安全措施为防止安全事故的发生我们已按照法律法规的规定制定了妥善的预警机制和应急预案如确发生安全事件我们将及时将相关情况选择以邮件信函电话推送通知及相关方式告知您难以逐一告知个人信息主体时我们会采取合理有效的方式发布公告
同时我们还将按照监管部门要求主动上报个人信息安全事件的处置情况紧密配合政府机关的工作</p>
<p style='text-indent:30px;'>当我们的产品或服务发生停止运营的情形时我们会及时停止继续收集个人信息的活动上述变更我们将以推送通知公告及相关形式通知你并在合理的期限内删除你的个人信息或进行匿名化处理所谓匿名化处理是指通过对个人信息的技术处理使得个人信息主体无法被识别
且处理后的信息不能被复原的过程个人信息经匿名化处理后所得的信息不属于个人信息</p>
@ -161,7 +161,7 @@
<p>(5) 如果我们不再为您提供产品或服务</p>
<p style='text-indent:30px;'>当您被从我们的服务中删除信息后我们可能不会立即从备份系统中删除相应的信息但会在备份更新时删除这些信息</p>
<p style="font-weight: bold; ">4. 撤回授权同意</p>
<p style='text-indent:30px;'>您可以通过关键测试宝平台公布的联系方式或电话联系客服向我们提出撤回收集使用个人信息的同意授权撤回同意后我们后续不会再处理您的个人信息同时我们会保障您拒绝接收基于您个人信息推送的权利在我们对外共享转让
<p style='text-indent:30px;'>您可以通过小关软测宝平台公布的联系方式或电话联系客服向我们提出撤回收集使用个人信息的同意授权撤回同意后我们后续不会再处理您的个人信息同时我们会保障您拒绝接收基于您个人信息推送的权利在我们对外共享转让
公开披露您的个人信息时我们会向您提供撤回同意的通知撤回同意不影响撤回前基于同意的您的个人信息处理</p>
<p style="font-weight: bold; ">5. 附条件的个人信息转移权</p>
<p style='text-indent:30px;'>
@ -174,16 +174,16 @@
<p>7. 在符合相关法律要求的情况下您的近亲属可以对您的相关个人信息行使上述查阅复制
更正删除等权利您另有安排的除外</p>
<p style="font-weight: bold; ">8. 联系我们进行管理</p>
<p style='text-indent:30px;'>出于安全性和身份识别的考虑您可能无法直接通过关键测试宝交互界面自行访问更正或删除某些信息实名认证后的信息您的部分使用记录及有关信息如您确有必要访问修改或依法要求删除该类信息请您按照本政策第十条中所提供的联系方式
<p style='text-indent:30px;'>出于安全性和身份识别的考虑您可能无法直接通过小关软测宝交互界面自行访问更正或删除某些信息实名认证后的信息您的部分使用记录及有关信息如您确有必要访问修改或依法要求删除该类信息请您按照本政策第十条中所提供的联系方式
对您的问题进行反馈我们将尽快审核所涉问题并在核验您的用户身份后及时予以回复</p>
<p style="font-weight: bold; margin:5px 0;">账号注销</p>
<p style='text-indent:30px;'>在您注销您的关键测试宝账号之前您已充分阅读理解并同意下列事项</p>
<p style='text-indent:30px;'>1您所申请注销的关键测试宝账号应当是您本人依照关键测试用户服务协议隐私政策约定注册的账号
<p style='text-indent:30px;'>在您注销您的小关软测宝账号之前您已充分阅读理解并同意下列事项</p>
<p style='text-indent:30px;'>1您所申请注销的小关软测宝账号应当是您本人依照小关软测用户服务协议隐私政策约定注册的账号
该账号处于安全状态及正常使用中不存在违规被封被盗等情形</p>
<p style='text-indent:30px;'>2您应当依照本公司规定的程序或网站提示进行账号注销操作</p>
<p style='text-indent:30px;'>3注销账号是不可恢复的操作您将无法使用该账号或找回您添加或绑定在账号上的任何内容信息及用户积分等相关权益即使使用相同的手机号码个人信息再次注册并使用关键测试
<p style='text-indent:30px;'>3注销账号是不可恢复的操作您将无法使用该账号或找回您添加或绑定在账号上的任何内容信息及用户积分等相关权益即使使用相同的手机号码个人信息再次注册并使用小关软测
您应自行备份该账号的相关信息和数据操作之前请确认与该账号相关的所有交易及服务均已妥善处理</p>
<p style='text-indent:30px;'>4关键测试宝账号注销将导致关键测试用户服务协议隐私政策及相关规则约定的权利义务终止依本协议其他条款另行约定不得终止的或依其性质不能终止的除外
<p style='text-indent:30px;'>4小关软测宝账号注销将导致小关软测用户服务协议隐私政策及相关规则约定的权利义务终止依本协议其他条款另行约定不得终止的或依其性质不能终止的除外
同时还可能对于该账号产生如下结果且均由您自行承担</p>
<p style='text-indent:30px;'>A.该账号的全部个人资料和历史信息都将无法找回</p>
<p style='text-indent:30px;'>B.该账号的联系人都将无法通过该账号联系您</p>
@ -191,17 +191,17 @@
<p style='text-indent:30px;'>D.任何您之前累计的用户权益都将作废且无法恢复</p>
<p style='text-indent:30px;'>E.任何兑换代码如金币等都将作废</p>
<p style='text-indent:30px;'>F.任何绑定的银行卡或支付提现服务都将不能适用该账号内的支付或提现服务</p>
<p style='text-indent:30px;'>G.您通过关键测试宝账号使用授权登录或绑定该账号后使用的任何第三方其他服务您将无法通过该账号再登录
<p style='text-indent:30px;'>G.您通过小关软测宝账号使用授权登录或绑定该账号后使用的任何第三方其他服务您将无法通过该账号再登录
使用或继续使用前述第三方服务所有记录将无法找回</p>
<p style='text-indent:30px;'>5注销关键测试宝账号前您需妥善处理关键测试宝账号下所有资金和交易问题
您申请注销关键测试宝账号应当不存在任何由于该账号被注销而导致的未了结的合同关系与其他基于该账号的存在而产生或维持的权利义务
及本公司认为注销该账号会由此产生未了结的权利义务而产生纠纷的情况关键测试宝账号注销期间如果您的关键测试宝账号被他人投诉
被国家机关调查或者正处于诉讼仲裁程序中我公司有权暂停关键测试宝账号注销</p>
<p style='text-indent:30px;'>6您同意如您申请注销关键测试宝账号时本公司尚在或需要对您有关交易或账号进行核查的
本公司有权继续冻结您的关键测试宝账号或账号内全部或部分资金以便继续核查
注销您的关键测试宝账号并不代表该账号注销前的账号行为和相关责任得到豁免或减轻</p>
<p style='text-indent:30px;'>5注销小关软测宝账号前您需妥善处理小关软测宝账号下所有资金和交易问题
您申请注销小关软测宝账号应当不存在任何由于该账号被注销而导致的未了结的合同关系与其他基于该账号的存在而产生或维持的权利义务
及本公司认为注销该账号会由此产生未了结的权利义务而产生纠纷的情况小关软测宝账号注销期间如果您的小关软测宝账号被他人投诉
被国家机关调查或者正处于诉讼仲裁程序中我公司有权暂停小关软测宝账号注销</p>
<p style='text-indent:30px;'>6您同意如您申请注销小关软测宝账号时本公司尚在或需要对您有关交易或账号进行核查的
本公司有权继续冻结您的小关软测宝账号或账号内全部或部分资金以便继续核查
注销您的小关软测宝账号并不代表该账号注销前的账号行为和相关责任得到豁免或减轻</p>
<p style="font-weight: bold; margin:5px 0;">有关第三方提供产品和/或服务的特别说明</p>
<p style='text-indent:30px;'>关键测试宝中可能包括第三方产品和/或服务或链接至第三方提供的信息和/或服务
<p style='text-indent:30px;'>小关软测宝中可能包括第三方产品和/或服务或链接至第三方提供的信息和/或服务
<span style="font-weight: bold; ">
该第三方产品和/或服务在使用前
您需要跳转到相应的小程序或第三方页面您使用该第三方服务包括您向该第三方提供的任何个人信息
@ -209,18 +209,18 @@
仅在必要的情况下向他人提供本政策仅适用于我们所收集保存使用共享披露信息并不适用于任何第三方提供的服务或第三方的信息使用规则
第三方使用您信息时的行为由其自行负责</p>
<p style="font-weight: bold; margin:5px 0;">我们如何使用Cookie和其他同类技术</p>
<p style='text-indent:30px;'>在您接受cookies的情况下关键测试宝会在您的计算机以及相关移动设备上设定或取用cookies
以便您能登录或使用依赖于cookies的关键测试宝平台服务或功能
<p style='text-indent:30px;'>在您接受cookies的情况下小关软测宝会在您的计算机以及相关移动设备上设定或取用cookies
以便您能登录或使用依赖于cookies的小关软测宝平台服务或功能
您有权选择接受或拒绝接受cookies您可以通过修改浏览器设置的方式或在移动设备中设置拒绝接受cookies
但如果您选择拒绝接受cookies则您可能无法登录或使用依赖于cookies的关键测试宝平台服务或功能</p>
<p>通过关键测试宝所设cookies所取得的有关信息将适用本政策</p>
但如果您选择拒绝接受cookies则您可能无法登录或使用依赖于cookies的小关软测宝平台服务或功能</p>
<p>通过小关软测宝所设cookies所取得的有关信息将适用本政策</p>
<p style="font-weight: bold; margin:5px 0;">未成年人保护</p>
<p style="font-weight: bold;text-indent:30px; ">以下条款请未成年用户特别是未满十四周岁的儿童用户在监护人的陪同下仔细阅读
并由监护人在充分理解后作出是否接受或拒绝本政策的决定</p>
<p style="font-weight: bold;text-indent:30px; ">1. 若用户是未满18周岁的未成年人特别是未满十四周岁的儿童用户
应在监护人监护指导并获得监护人同意情况下阅读本协议和使用关键测试宝相关服务</p>
应在监护人监护指导并获得监护人同意情况下阅读本协议和使用小关软测宝相关服务</p>
<p style="font-weight: bold;text-indent:30px; ">2. 我们重视对未成年人个人信息的保护未成年用户在填写个人信息时
请加强个人保护意识并谨慎对待请在监护人指导时正确使用关键测试宝相关服务</p>
请加强个人保护意识并谨慎对待请在监护人指导时正确使用小关软测宝相关服务</p>
<p style="font-weight: bold;text-indent:30px; ">3. 我们将根据国家相关法律法规及本政策的规定保护未成年人用户信息的保密性及安全性
如果我们发现自己在未事先获得可证实的父母或法定监护人同意的情况下收集了未成年人的个人信息则会设法尽快删除相关数据同时我们建立了严格
的未成年人信息收集使用规则以保护儿童和青少年个人信息安全若您是未成年人的监护人当您对您所监护的未成年人使用我们的服务或其向我们
@ -230,12 +230,12 @@
<p style="text-indent:30px; ">1. 为了给您提供更好的服务我们会根据产品的更新情况及法律法规的相关要求更新本政策的条款
这些更新将构成本政策的一部分
未经您明确同意我们不会削减您依据当前生效的本政策所应享受的权利</p>
<p style="text-indent:30px; ">2. 如遇本政策更新我们会通过关键测试宝官方网站www.keyitest.cn
关键测试宝小程序推送通知或其他合理方式通知您以便您能及时了解本政策的最新版本</p>
<p style="text-indent:30px; ">2. 如遇本政策更新我们会通过小关软测宝官方网站www.keyitest.cn
小关软测宝小程序推送通知或其他合理方式通知您以便您能及时了解本政策的最新版本</p>
<p style="font-weight: bold; margin:5px 0;">如何联系我们</p>
<p style="text-indent:30px; ">如您对个人信息保护问题有任何投诉建议疑问或您对本政策有任何疑问
1您可与关键测试宝产品功能页面的在线客服联系或者在线提交意见反馈
2您可以通过关键测试宝官方网站www.keyitest.cn进行反馈</p>
1您可与小关软测宝产品功能页面的在线客服联系或者在线提交意见反馈
2您可以通过小关软测宝官方网站www.keyitest.cn进行反馈</p>
<p>我们将尽快审核所涉问题并在验证您的用户身份后的十五个工作日内予以答复</p>
<p style="font-weight: bold; margin:5px 0;">十一其他</p>
<p style="text-indent:30px; ">因本政策以及我们处理您个人信息事宜引起的任何争议由双方协商解决协商不一致的可以向被告所在地人民法院提起诉讼</p>

@ -3,7 +3,7 @@
<view class="bureau">
<view style="margin-bottom: 43px;">
<img src="/static/index/logo.png" alt="">
<p style="margin: 10px 0;">关键测试</p>
<p style="margin: 10px 0;">小关软测</p>
<p style="font-size:.8rem;font-weight: 400;letter-spacing: 0.7rem;">专业软件测试云平台</p>
</view>
</view>

@ -14,7 +14,7 @@
<img style="width:19px;height:19px;margin-right:5px;" src="/static/crowd/PAYB.png" alt="">
<p class="selectadd">支付宝账号</p>
</view>
<view @click="accountReset('支付宝')" style="color: #2587FA;">重置账号</view>
<view v-if="allowRest" @click="accountReset('支付宝')" style="color: #2587FA;">重置账号</view>
</div>
<div v-if="accountform.paytype == '银行卡'"
style="display: flex;align-items: center;margin-bottom:10px;justify-content: space-between;">
@ -33,11 +33,11 @@
<u-form-item label="账 号:" prop="alipay" border-bottom='false' required='true'>
<u-input v-model="accountform.alipay"></u-input>
</u-form-item>
<view class="tishi">
<!-- <view class="tishi">
<image style="width: 21rpx;height: 21rpx;margin-right: 10rpx;"
src="../../../static/crowd/zhuyi.png" mode=""></image>
账号添加后暂不支持更改请仔细检查后再提交确定
</view>
</view> -->
<view class="addbtn">
<view class="addbtnff" v-if="accountform.paytype == '支付宝' && !accountdata.alipay"
@click="acsumbit('determine')"
@ -59,11 +59,11 @@
<u-form-item label="账 号:" prop="bankAccount" border-bottom='false' required='true'>
<u-input v-model="accountform.bankAccount"></u-input>
</u-form-item>
<view class="tishi">
<!-- <view class="tishi">
<image style="width: 21rpx;height: 21rpx;margin-right: 10rpx;"
src="../../../static/crowd/zhuyi.png" mode=""></image>
账号添加后暂不支持更改请仔细检查后再提交确定
</view>
</view> -->
<view class="addbtn">
<view class="addbtnff" v-if="accountform.paytype == '银行卡' && !accountdata.bankAccount"
@click="acsumbit('determine')"
@ -254,11 +254,11 @@ export default {
],
alipay: [
{ required: true, message: "账号不能为空", trigger: "blur" },
{ max: 25, message: '账号格式不对', trigger: 'change' },
{ max: 25, message: '账号格式不对', trigger: 'blur' },
{
message: '账号格式不对',
trigger: 'change',
pattern: /(^[\w.\-]+@(?:[a-z0-9]+(?:-[a-z0-9]+)*\.)+[a-z]{2,3}$)|(^1[3|4|5|8]\d{9}$)/,
trigger: 'blur',
pattern: /(^[\w.\-]+@(?:[a-z0-9]+(?:-[a-z0-9]+)*\.)+[a-z]{2,3}$)|(^1[3|4|5|6|7|9|8]\d{9}$)/,
},
],
bankAccount: [
@ -319,6 +319,18 @@ export default {
this.accountform.bankAccount = res.data.bankAccount
})
},
computed: {
allowRest() {
console.log(this.accountform.paytype);
console.log(this.accountform.bankAccount);
console.log(this.accountform.alipay);
if (this.accountform.paytype == '银行卡' && this.accountform.bankAccount) {
return true
} else if (this.accountform.paytype == '支付宝' && this.accountform.alipay) {
return true
} return
}
},
methods: {
paychange(e) {
this.accountform.paytype = e[0].label
@ -332,7 +344,7 @@ export default {
},
accountReset(val) {
uni.setNavigationBarTitle({
title: '充值账户'
title: '重置账户'
});
this.motify = true
this.accountform = { paytype: '', name: '', alipay: '', bankDeposit: '', bankAccount: '' }

@ -24,7 +24,7 @@
</view>
<view class="logoutbtn" @click="logout">退出登录</view>
</view>
<u-modal title='温馨提示' v-model="logshow" content="确定退出登录?" confirm-text='确定' cancel-text='取消' showCancelButton='true'
<u-modal title='温馨提示' v-model="logshow" content="确定退出登录?" confirm-text='确定' cancel-text='取消' :showCancelButton='true'
cancel-color='#1578ED' confirm-color='#1578ED' @confirm="logconfirm" cancel='logcancel'></u-modal>
</view>
</template>

@ -185,8 +185,8 @@
box-sizing: border-box;
.noreview {
font-size: 23px;
font-weight: bold;
font-size: 33rpx;
// font-weight: bold;
color: #9D9D9D;
text-align: center;
margin-top: 40rpx;

@ -26,7 +26,7 @@
</view>
</block>
<view v-else class="noreview">
<img style="width: 338rpx;height: 254rpx;" src="../../index/testtraining/noEvaluate.png" alt="">
<img style="width: 338rpx;height: 254rpx;" src="http://image.bjkeyware.com/static/index/noEvaluate.png" alt="">
<view>暂无评价</view>
</view>
</view>
@ -62,8 +62,8 @@
<style lang="scss" scoped>
.noreview {
font-size: 23px;
font-weight: bold;
font-size: 33rpx;
// font-weight: bold;
color: #9D9D9D;
text-align: center;
margin-top: 100px;

@ -258,8 +258,8 @@
<style lang="scss" scoped>
.noreview {
font-size: 23px;
font-weight: bold;
font-size: 33rpx;
// font-weight: bold;
color: #9D9D9D;
text-align: center;
margin-top: 40rpx;

@ -3,7 +3,7 @@
<view style="display:flex;" >
<img src="/static/index/logo.png" alt="">
<view>
<p style="margin:7px 0 3px 0;font-size:1.2rem;color:#333333;">关键测试</p>
<p style="margin:7px 0 3px 0;font-size:1.2rem;color:#333333;">小关软测</p>
<p style="letter-spacing: 0.2rem;color: #808080;">专业软件测试云平台</p>
</view>
</view>

@ -2,39 +2,7 @@
<view class="navTab">
<!-- <u-search v-model='keyware' placeholder='输入搜索内容' :actionStyle="customActionStyle"
showAction="true" actionText="搜索" :animation="false" @custom='seacrhko'></u-search> -->
<div class="sign_list" v-for="(item, key) of signuplist" :key="key">
<view style="display:flex;margin:0 12px 8px 0;justify-content: space-between;align-items: flex-end;">
<view class="rightb">
{{ item.trainClassName }}
</view>
</view>
<view class="fline"></view>
<view @click="catCourse(item)"
style="display: flex;justify-content: space-between;margin: 19px 15px 0 15px;align-items: center;">
<view style="color:#333333FF;font-size:13px;line-height:27px;">
<p>班级名称{{ item.trainClassName }}</p>
<!-- start_time -->
<p v-if="item.trainStartTime">
开课日期{{ item.trainStartTime.slice(0, 4) }}{{ item.trainStartTime.slice(5, 7) }}{{
item.trainStartTime.slice(8, 10) }}
</p>
<p v-if="item.trainEndTime">
结课时间{{ item.trainEndTime.slice(0, 4) }}{{ item.trainEndTime.slice(5, 7) }}{{
item.trainEndTime.slice(8, 10) }}
</p>
</view>
<div v-if="item.status == 1" class="sign_sataus"> 未开课 </div>
<div v-if="item.status == 2" class="sign_sataus"> 未开课 </div>
<div v-if="item.status == 3" class="sign_sataus" style="background: #FBA02A;"> 未开课 </div>
<div v-if="item.status == 4" class="sign_sataus" style="background: #28D17CFF;"> 开课中 </div>
<div v-if="item.status == 5" class="sign_sataus" style="background: #FE5555FF;"> 已结束 </div>
</view>
<view class="endClass">
<view class="reportUrl" @click="uploadReport('cat')">{{ item.reportName }}</view>
<view v-show="reportShow(item)" class="uploadBtn" @click="uploadReport">{{ item.reportName ?
'覆盖上传报告' : '上传结课报告' }}</view>
</view>
</div>
<view v-if="signuplist.length > 0">
<view v-for="(item, key) of signuplist" class="sign_list" :key="key">
<view style="display:flex;margin:0 12px 8px 0;justify-content: space-between;align-items: flex-end;">
@ -46,7 +14,7 @@
</view>
<view class="fline"></view>
<view @click="catCourse(item)"
style="display: flex;justify-content: space-between;margin: 19px 15px 0 15px;align-items: center;">
style="display: flex;justify-content: space-between;margin: 19px 15px 0 15px;align-items: center;padding-bottom: 30rpx;">
<view style="color:#333333FF;font-size:13px;line-height:27px;">
<p>班级名称{{ item.trainClassName }}</p>
<!-- start_time -->
@ -65,7 +33,7 @@
<div v-if="item.status == 4" class="sign_sataus" style="background: #28D17CFF;"> 开课中 </div>
<div v-if="item.status == 5" class="sign_sataus" style="background: #FE5555FF;"> 已结束 </div>
</view>
<view class="endClass">
<view v-show="item.classType != 4" class="endClass">
<view class="reportUrl" @click="uploadReport('cat')">{{ item.reportName }}</view>
<view v-show="reportShow(item)" class="uploadBtn" @click="uploadReport">{{ item.reportName ?
'覆盖上传报告' : '上传结课报告' }}</view>
@ -73,7 +41,7 @@
</view>
</view>
<view v-else style="font-size:46rpx;font-weight: bold;color: #9D9D9D; text-align:center;margin-top:100px">
<img style="width: 338rpx;height: 254rpx;" src="../../index/testtraining/noregister.png" alt="">
<img style="width: 338rpx;height: 254rpx;" src="http://image.bjkeyware.com/static/index/noregister.png" alt="">
<view>暂无报名信息</view>
</view>
<view style="height:10px;"></view>
@ -83,18 +51,12 @@
<script>
const endDay = 2
import { dateFormat } from '@/utils/util.js'
import { valiDateInOneDay } from '../../../utils/util';
export default {
computed: {
reportShow(v) {
return function (val) {
const nowTime = new Date().getTime()
const endTime = new Date(val.trainEndTime).getTime()
const sub = (endTime - nowTime) / (1000 * 60 * 60 * 24)
// console.log(sub);
if (sub < endDay) {
return true
}
return false
if (valiDateInOneDay(val.trainEndTime)) { return true } return false
}
},
},
@ -109,7 +71,7 @@ export default {
signuplist: [],
}
},
onLoad() {
onShow() {
let wxUserInfo = uni.getStorageSync('wxUserInfo');
// ${wxUserInfo.phonenumber}
if (wxUserInfo) {
@ -186,7 +148,6 @@ export default {
justify-content: flex-end;
font-size: 24rpx;
line-height: 49rpx;
margin: 30rpx 0;
padding: 25rpx;
border-top: 1px solid #99999936;
;

@ -1,7 +1,7 @@
<template>
<view class="peixunbanpage">
<view class="nodata" v-if="!useList.length">
<img src="../../index/testtraining/noUsePerson.png" alt="">
<img src="http://image.bjkeyware.com/static/index/noUsePerson.png" alt="">
<view>暂无数据</view>
</view>
<view class="boxuser" v-else>

@ -11,6 +11,10 @@
*
* 如果你的项目同样使用了scss预处理你也可以直接在你的 scss 代码中使用如下变量同时无需 import 这个文件
*/
.u-model__title {
font-weight: bold !important;
padding-top: 20rpx !important;
}
/* 颜色变量 */
@import 'uview-ui/theme.scss';

@ -5,7 +5,7 @@ export default {
//1.配置发送给朋友
onShareAppMessage() {
return {
title: '关键测试宝', //分享的标题
title: '小关软测宝', //分享的标题
path: 'pages/index/index', //点击分享链接之后进入的页面路径
// imageUrl: '/static/index/logo.png' //分享发送的链接图片地址
};
@ -13,7 +13,7 @@ export default {
//2.配置分享到朋友圈
onShareTimeline() {
return {
title: '关键测试宝', //分享的标题
title: '小关软测宝', //分享的标题
query: 'pages/index/index', //点击分享链接之后进入的页面路径
// imageUrl: '/static/index/logo.png' //分享发送的链接图片地址
}

@ -290,6 +290,22 @@ export function dateFormat(date, format) {
}
return ''
}
// 判断目标时间是否在当天或前两天之内
export function valiDateInOneDay(endTime) {
const tTime = dateFormat(new Date(endTime))
const tempTime = tTime.split(' ')[0] + ' ' + '00:00:00'
const nTime = new Date()
const sub = Math.abs(nTime.getTime() - (new Date(tempTime)).getTime())
const oneDay = 24 * 60 * 60 * 1000
const twoDay = 24 * 60 * 60 * 1000
if ((nTime.getTime() - (new Date(tempTime)).getTime()) > oneDay) {
return false
}
if (sub < twoDay) {
return true
}
return false
}
export function dillFeSiteStaticurl(url) {
if (typeof url !== 'string') {
return url;

Loading…
Cancel
Save