Compare commits

..

5 Commits

  1. 42
      components/levelTag/index.vue
  2. 237
      components/onLineCourseItem/index.vue
  3. BIN
      components/onLineCourseItem/liveSteam.png
  4. 68
      components/poster/index.vue
  5. 53
      pages.json
  6. 288
      pages/index/index.vue
  7. 105
      pages/index/onlineTestCourse/onlineCourseInfo.vue
  8. 13
      pages/index/onlineTestCourse/verciInput.vue
  9. 4
      pages/index/testcrowdsourc/companyInfo.vue
  10. 46
      pages/index/testcrowdsourc/crowdsourcingdetails.vue
  11. 8
      pages/index/testcrowdsourc/testcrowdsourc.vue
  12. 4
      pages/index/testcrowdsourc/userInfo.vue
  13. 491
      pages/index/testtraining/onLineCourse.vue
  14. 56
      pages/index/testtraining/signup.vue
  15. 322
      pages/index/testtraining/testtraining.vue
  16. 52
      pages/index/toolleasing/tooldetails.vue
  17. 24
      pages/personal/courseSign/courseSign.vue
  18. BIN
      pages/personal/courseSign/error.1png
  19. BIN
      pages/personal/courseSign/error.png
  20. BIN
      pages/personal/courseSign/signSuc.1png
  21. BIN
      pages/personal/courseSign/signSuc.png
  22. 169
      pages/personal/grade/gradeRules.vue
  23. 145
      pages/personal/grade/gradeTask.vue
  24. 368
      pages/personal/grade/gradeValue.vue
  25. 77
      pages/personal/grade/growInfo.vue
  26. 2
      pages/personal/login.vue
  27. 109
      pages/personal/myCourse/allMyCourse.vue
  28. 222
      pages/personal/myCourse/myCourse.vue
  29. 19
      pages/personal/ordernumber/ordernumber.vue
  30. 75
      pages/personal/personal.vue
  31. 2
      pages/personal/phonelogin.vue
  32. 76
      pages/personal/privacy.vue
  33. 2
      pages/personal/setup/aboutus.vue
  34. 269
      pages/personal/setup/accountoverview.vue
  35. 2
      pages/personal/setup/index.vue
  36. 4
      pages/personal/setup/mycompanyinfo.vue
  37. 9
      pages/personal/setup/myreview.vue
  38. 4
      pages/personal/setup/myuserinfo.vue
  39. 2
      pages/personal/setup/pcweb.vue
  40. 107
      pages/personal/setup/peixunban.vue
  41. 19
      pages/personal/setup/usepeople.vue
  42. 4
      uni.scss
  43. 2
      utils/http.js
  44. 4
      utils/share.js
  45. 56
      utils/userlevel.js
  46. 16
      utils/util.js
  47. 2
      uview-ui/libs/css/style.mp.scss

@ -0,0 +1,42 @@
<template>
<span>
<!-- <span v-show="level ==>{{ level }}</span> -->
<span v-show="level == 1" class="levelTag v1">V{{ level }}</span>
<span v-show="level == 2" class="levelTag v2">V{{ level }}</span>
<span v-show="level == 3" class="levelTag v3">V{{ level }}</span>
</span>
</template>
<script>
export default {
props: {
level: Number
},
}
</script>
<style scoped>
.levelTag {
padding: 5rpx 6rpx;
border-radius: 50%;
color: #FFFFFF;
font-family: PingFang SC;
font-weight: 500;
font-size: 12px;
margin-left: 10rpx;
line-height: 23px;
}
.v1 {
background: linear-gradient(0deg, #29F19C, #02A1F9);
}
.v2 {
background: linear-gradient(0deg, #015EEA, #00C0FA);
}
.v3 {
background: linear-gradient(0deg, #FACC22, #F83600);
}
</style>

@ -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>

@ -99,6 +99,13 @@
"navigationBarBackgroundColor": "#284CD1"
}
},
{
"path": "pages/index/testtraining/onLineCourse",
"style": {
"navigationBarTitleText": "",
"navigationBarBackgroundColor": "#284CD1"
}
},
{
"path": "pages/index/testtraining/teacherSign",
"style": {
@ -199,13 +206,13 @@
}, {
"path": "pages/personal/login",
"style": {
"navigationBarTitleText": "登录关键测试宝",
"navigationBarTitleText": "登录小关软测宝",
"navigationBarBackgroundColor": "#284CD1"
}
}, {
"path": "pages/personal/phonelogin",
"style": {
"navigationBarTitleText": "关键测试宝",
"navigationBarTitleText": "小关软测宝",
"navigationBarBackgroundColor": "#284CD1"
}
},
@ -244,7 +251,7 @@
}, {
"path": "pages/personal/setup/pcweb",
"style": {
"navigationBarTitleText": "关键测试宝",
"navigationBarTitleText": "小关软测宝",
"navigationBarBackgroundColor": "#284CD1"
}
},
@ -325,6 +332,34 @@
"navigationBarBackgroundColor": "#284CD1"
}
},
{
"path": "pages/personal/grade/gradeValue",
"style": {
"navigationBarTitleText": "我的等级",
"navigationBarBackgroundColor": "#284CD1"
}
},
{
"path": "pages/personal/grade/growInfo",
"style": {
"navigationBarTitleText": "成长值明细",
"navigationBarBackgroundColor": "#284CD1"
}
},
{
"path": "pages/personal/grade/gradeRules",
"style": {
"navigationBarTitleText": "等级规则",
"navigationBarBackgroundColor": "#284CD1"
}
},
{
"path": "pages/personal/grade/gradeTask",
"style": {
"navigationBarTitleText": "任务列表",
"navigationBarBackgroundColor": "#284CD1"
}
},
{
"path": "pages/index/testcrowdsourc/companyInfo",
"style": {
@ -386,7 +421,17 @@
"style" :
{
"navigationBarTitleText" : "",
"navigationBarBackgroundColor": "#284CD1"
"navigationBarBackgroundColor": "#284CD1",
"onReachBottomDistance": 50
}
},
{
"path" : "pages/personal/myCourse/allMyCourse",
"style" :
{
"navigationBarTitleText" : "线上培训班",
"navigationBarBackgroundColor": "#284CD1",
"onReachBottomDistance": 50
}
},
{

@ -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,12 +244,11 @@
<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;">
<p class="leop" style="margin:0;justify-content: initial;">{{item.projectName}}</p>
<p class="leop" style="margin:0;justify-content: initial;">{{ item.projectName }} <levelTag :level="item.level"></levelTag> </p>
<!-- <p class="typej">类型静态测试</p> -->
<p class="typej">
类型{{ findLabelValueByPropnew(tasktypelist, item.testType, 'dictValue', 'dictLabel') }}</p>
@ -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,16 @@
<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 levelTag from '@/components/levelTag/index.vue'
// import { dateFormat } from '../../utils/util';
export default {
mixins: [mixin],
components: {
onLineCourseItem,poster,levelTag
},
data() {
return {
navHeight: 0,
@ -283,6 +367,7 @@ export default {
toollist: [], //
crowdlist: [], //
tokenshow: false,
onLineList: []
}
},
created() {
@ -328,12 +413,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 +438,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 +612,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 +657,11 @@ export default {
z-index: 99;
/* position: relative; */
}
page {
background-color: #f7f7f7;
}
.myNav image {
position: absolute;
width: 50rpx;
@ -510,10 +673,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 +692,7 @@ page {
justify-content: space-between; */
/* padding: 10px; */
}
.buttonyz1 {
width: 139rpx;
height: 49rpx;
@ -539,6 +703,7 @@ page {
text-align: center;
line-height: 49rpx;
}
.customActionStyle {
width: 115rpx;
height: 60rpx;
@ -562,10 +727,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 +748,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 +779,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 +809,7 @@ page {
align-items: center;
justify-content: center;
}
.leop1 {
overflow: hidden;
text-overflow: ellipsis;
@ -763,4 +948,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>

@ -0,0 +1,105 @@
<template>
<view class="courseInfo">
<view>xxxxx</view>
<view @click="startLearn">开始学习</view>
<view @click="openInputCode">输入口令</view>
<view @click="pay">付费学习</view>
<u-modal v-model="show">
<view class="slot-content">
<view v-if="toggleFlag === 'tolearn'">
<label>www.baidu.com</label>
</view>
<view v-else 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 6" :key="index"
:style="(index == code.length && focus ? 'border-color:#3c9cff;' : '')">{{ code[index] || ''
}}
</view>
</view>
</view>
</view>
</u-modal>
</view>
</template>
<script>
export default {
data() {
return {
toggleFlag:'',
show: false,
focus: false,
code: ''
}
},
methods: {
startLearn() {
this.show = true
this.toggleFlag = 'tolearn'
},
focusClick() {
this.focus = true
},
pay() {
console.log('pay for this');
},
openInputCode() {
this.show = true
},
inputCode(e) {
let value = e.detail.value
this.code = value
},
inputFocus(e) {
console.log(e);
},
inputCodeBlur(e) {
let value = e.detail.value
this.focus = false
}
}
}
</script>
<style lang="scss">
.courseInfo {
.slot-content {
font-size: 28rpx;
color: $u-content-color;
padding-left: 30rpx;
}
.input-list {
display: flex;
align-items: center;
.input-item {
width: 0rpx;
}
.code-list {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.code-item {
width: 80rpx;
height: 80rpx;
text-align: center;
line-height: 80rpx;
border: 1rpx solid #eee;
border-radius: 10rpx;
}
}
}
}
</style>

@ -0,0 +1,13 @@
<template>
</template>
<script>
export default {
}
</script>
<style>
</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;

@ -3,7 +3,10 @@
<view class="schedule" style="padding:25rpx 0">
<view style="margin:0 25rpx 36rpx 25rpx">
<view style="display:flex;font-size:35rpx;font-weight:bold;justify-content: space-between;">
<p style='color: #333333;'>{{crowddata.task.project_name}} </p>
<p style='color: #333333;'>{{ crowddata.task.project_name }} <levelTag
:level="crowddata.task.level">
</levelTag>
</p>
<p v-if="crowddata.task.price == 0" style="color:#FD461A;">面议</p>
<p v-else style="color:#FD461A;">¥{{ crowddata.task.price }}</p>
</view>
@ -81,7 +84,8 @@
<div style='display:flex;align-items: center;margin-bottom: 10px;'
v-for="(it, index) in crowddata.task.attachment.split(',')">
<img style="width:17px;height:20px;margin-right:5px;" src="/static/crowd/upload.png" alt="" />
<p @click="openurl(it)" style="color:#1578ED;font-size: 12px;cursor: pointer;">项目附件{{index+1}}
<p @click="openurl(it)" style="color:#1578ED;font-size: 12px;cursor: pointer;">项目附件{{ index + 1
}}
</p>
</div>
</template>
@ -269,8 +273,11 @@
findLabelValueByPropnew
} from '@/utils/util.js'
import mixin from '@/utils/mixin/index.js'
import levelTag from '@/components/levelTag/index.vue'
import { getLevel } from '@/utils/userlevel';
export default {
mixins: [mixin],
components: { levelTag },
data() {
return {
base: this.http.baseUrl,
@ -492,11 +499,38 @@
errorUpfile(data, index) {
},
application() {
async application() {
this.userinform = uni.getStorageSync('wxUserInfo');
let accessToken = uni.getStorageSync('accessToken');
console.log('open', this.userinform, this.crowddata.task);
if (!accessToken) {
await this.http.quickGet('/getInfo', true).then(res => {
const { growthValue } = res.data.user
const {level,_} = getLevel(growthValue)
if (this.crowddata.task.level && this.crowddata.task.level > level) {
uni.showModal({
title: `提示`,
content: '当前等级不满足竞标资格,去看看其他任务吧',
showCancel: false,
confirmText: '确定',
// success: function (res) {
// if (res.confirm) {
// uni.setClipboardData({
// data: url,
// success: function () {
// uni.showToast({
// title: '',
// })
// },
// fail: function () {
// uni.showToast({
// title: '',
// })
// },
// })
// console.log('')
// }
// },
})
} else if (!accessToken) {
this.tokenshow = true
} else {
this.http.quickGet(`/tester/cert/apply/${this.userinform.userId}`, true).then(res => {
@ -529,6 +563,8 @@
})
}
})
},
open() {
// console.log('open');

@ -106,11 +106,13 @@
<view style="width: 58vw;">
<p class="leop" style="margin:-10px 0;justify-content: initial;">
{{ item.projectName | ellipsis }}
<levelTag :level="item.level"></levelTag>
</p>
<!-- <p class="typej" v-if="item.testType=='static'">类型静态测试</p> -->
<p class="typej fiextypej">
<view class="lefttypej">
类型{{findLabelValueByPropnew(tasktypelist, item.testType, 'dictValue', 'dictLabel')}}
类型{{ findLabelValueByPropnew(tasktypelist, item.testType, 'dictValue',
'dictLabel')}}
</view>
</p>
<p class="typej">工期{{ item.period }} I
@ -160,11 +162,15 @@
findLabelValueByPropnew
} from '@/utils/util.js'
import mixin from '@/utils/mixin/index.js'
import levelTag from '@/components/levelTag/index.vue'
// import {
// plist,
// clist
// } from '@/static/cityjson.js'
export default {
components: {
levelTag
},
mixins: [mixin],
data() {
return {

@ -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;

@ -0,0 +1,491 @@
<template>
<view class="onLineCourseWrap" v-show="courseItem.courseName">
<view class="onLineTitle">
<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">时间: {{ 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="http://image.bjkeyware.com/static/index/arr.png" alt=""> -->
<img src="" alt="">
<view class="learnBtnWrap">
<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" @click="urlShow = true">开始学习</view>
<u-modal v-model="show" title="请输入口令" :show-confirm-button="false">
<view class="slot-content">
<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="(_, index) in 4" :key="index"
:style="(index == code.length && focus ? 'border-color:#3c9cff;' : '')">{{ code[index] || ''
}}
</view>
</view>
</view>
<view class="codeBtnCoup">
<view class="codeBtn canle" @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,
show: false,
focus: false,
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: {
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');
if (!userinform) {
uni.showToast({ title: '登录失效,请重新登录', icon: 'none', duration: 1000 });
setTimeout(() => {
uni.navigateTo({
url: '/pages/personal/login'
})
}, 1000)
return
}
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
},
pay() {
console.log('pay for this');
},
openInputCode() {
this.show = true
},
inputCode(e) {
if (this.code.length > 4) {
return
}
let value = e.detail.value
this.code = value
},
inputFocus(e) {
console.log(e);
},
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);
background: #FFFFFF;
border-radius: 10rpx;
padding: 24rpx;
font-family: PingFang SC;
font-weight: 500;
font-size: 27rpx;
color: #404040;
.onLineTitle {
font-weight: bold;
font-size: 30rpx;
color: #000000;
line-height: 46rpx;
margin: 30rpx 0;
display: flex;
align-items: center;
img {
width: 38rpx;
height: 38rpx;
margin-right: 20rpx;
}
}
.onLineTime {
margin: 15rpx 0;
}
.onLineTeacher {
margin: 20rpx 0;
}
.onLine {
margin: 20rpx 0;
}
.onLineContent {
margin: 20rpx 0;
line-height: 46rpx;
// line-height: 1.5;
}
.onLineMask {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
img {
width: 46rpx;
height: 111rpx;
margin: 619rpx 0 0 50%;
}
.learnBtnWrap {
width: 279rpx;
margin-top: 211rpx;
margin-left: 50%;
transform: translate(-50%);
.learnBtn {
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;
font-size: 30rpx;
color: #FFFFFF;
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;
}
}
}
.startLeranBtn {
position: fixed;
bottom: 69rpx;
width: 646rpx;
height: 70rpx;
background: linear-gradient(90deg, #5EA6FD, #1A81F9);
box-shadow: 0rpx 1rpx 20rpx 1rpx rgba(13, 92, 187, 0.4);
border-radius: 35rpx;
font-family: PingFang SC;
font-weight: 500;
font-size: 30rpx;
color: #FFFFFF;
line-height: 65rpx;
text-align: center;
}
.slot-content {
font-size: 28rpx;
color: $u-content-color;
padding-left: 30rpx;
}
.input-list {
padding-top: 20rpx;
display: flex;
align-items: center;
.input-item {
width: 0rpx;
}
.code-list {
width: 100%;
display: flex;
align-items: center;
justify-content: space-around;
.code-item {
width: 80rpx;
height: 80rpx;
text-align: center;
line-height: 80rpx;
border: 1rpx solid #eee;
border-radius: 10rpx;
background: #EAEEF3;
}
}
}
.codeBtnCoup {
padding: 20rpx;
display: flex;
justify-content: space-between;
margin-top: 40rpx;
.codeBtn {
width: 250rpx;
line-height: 70rpx;
border-radius: 35rpx;
text-align: center;
font-size: 28rpx;
color: #FFFFFF;
}
.sure {
background: linear-gradient(90deg, #5EA6FD, #1A81F9);
}
.canle {
color: #666666;
border: 1px solid #E0E0E0;
}
}
.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>

@ -170,34 +170,34 @@
this.register = uni.getStorageSync('register');
// console.log('register--',this.register)
// console.log('wxUserInfo---',this.wxUserInfo)
this.http.quickGet(`/train/course/list?pageNum=1&pageSize=100`).then(res=>{
// console.log('res---', res)
this.courselist = res.data.rows;
if(this.courselist.length>0){
this.courselist.sort((a,b)=>{
return a.orderNum-b.orderNum
})
this.courselist.forEach(item=>{
if(item.children.length>0){
item.children.sort((a,b)=>{
return a.orderNum-b.orderNum
})
if(item.orderNum==1){
item.index='一'
}else if(item.orderNum==2){
item.index='二'
}else if(item.orderNum==3){
item.index='三'
}else if(item.orderNum==4){
item.index='四'
}else if(item.orderNum==5){
item.index='五'
}
}
})
// console.log('--', this.courselist)
}
})
// this.http.quickGet(`/train/course/list?pageNum=1&pageSize=100`).then(res=>{
// // console.log('res---', res)
// this.courselist = res.data.rows;
// if(this.courselist.length>0){
// this.courselist.sort((a,b)=>{
// return a.orderNum-b.orderNum
// })
// this.courselist.forEach(item=>{
// if(item.children.length>0){
// item.children.sort((a,b)=>{
// return a.orderNum-b.orderNum
// })
// if(item.orderNum==1){
// item.index=''
// }else if(item.orderNum==2){
// item.index=''
// }else if(item.orderNum==3){
// item.index=''
// }else if(item.orderNum==4){
// item.index=''
// }else if(item.orderNum==5){
// item.index=''
// }
// }
// })
// // console.log('--', this.courselist)
// }
// })
this.http.quickGet(`/train/issue/detail/${this.issueId}`).then(res=>{
console.log('报名期号信息---',res)
this.issueinform=res.data

@ -5,6 +5,12 @@
<!-- <image src="http://image.bjkeyware.com/static/index/renliwb/newtrainbanner08.png" mode="" class="logobg"> -->
<!-- </image> -->
<!-- 模块1 -->
<view class="onLineTrainTitle" v-if="onLineList.length">
<view class="onLineTitleText">线上培训课程</view>
<view class="more" @click="getMore">更多> </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="" />
@ -42,21 +48,18 @@
针对企业用人需求进行课程培训
</view>
</view>
<view v-for="(item,key) of courselist" :key="key"
style='font-size:11px;line-height: 18px;border-left: 1px solid #F5F7FA;border-right: 1px solid #F5F7FA;'>
<view style='line-height: 20px;border-left: 1px solid #F5F7FA;border-right: 1px solid #F5F7FA;'>
<view class="headert">
<view class="table_heade">{{item.index}} {{item.courseName}}</view>
<view style="width:.5px;background-color:#CFDDDD;height:26px"></view>
<view class="table_heade">序号</view>
<view style="width:600rpx;text-align:center">课程名称</view>
<view class="table_kheade">课时</view>
</view>
<view v-if='item.children.length>0'>
<view class="bodyt" v-for="(itemd,key) of item.children"
:style="{'border-bottom':itemd.orderNum==item.children.length?'none':'1rpx solid #CFDDDD;'}">
<view class="table_obody">{{itemd.orderNum}}</view>
<view class="table_tbody">{{itemd.courseName}}</view>
<view v-if='itemd.period.slice(-1)==0' class="table_hbody">{{itemd.period.slice(0,1)}}
</view>
<view v-else class="table_hbody">{{itemd.period}}</view>
<view>
<view class="bodyt" v-for="(item, key) of courselist" :key="key"
:style="{ 'border-bottom': key == courselist.length ? 'none' : '1rpx solid #CFDDDD;' }">
<view class="table_obody">{{ key + 1 }}</view>
<view class="table_tbody">{{ item.con }}</view>
<view class="table_hbody">{{ item.num }}</view>
</view>
</view>
</view>
@ -328,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;">
@ -423,7 +425,7 @@
</view>
</u-form-item>
<view v-if='calltext' class="tiptext" style="color:#E9941AFF">
<!-- {{calltext}} -->
{{ calltext }}
</view>
<view v-if='timetext' class="tiptext" style="color:#000000">
{{ timetext }}
@ -455,6 +457,16 @@
<u-input v-model="form.studentName" placeholder="请输入您的姓名"></u-input>
</view>
</u-form-item>
<u-form-item prop="sex">
<view class="rowitem sexSelect">
<view class="rowitemxing">
*
</view>
<u-input v-model="form.sex" type="select" placeholder="请选择您的性别"
@click="sexShow = true" />
<u-select v-model="sexShow" :list="sexList" @confirm="fornCallBack"></u-select>
</view>
</u-form-item>
<u-form-item prop="studentCode">
<view class="rowitem">
<view class="rowitemxing">
@ -515,12 +527,23 @@
<u-input v-model="jjform.studentName" placeholder="请输入您的姓名"></u-input>
</view>
</u-form-item>
<u-form-item prop="sex">
<view class="rowitem sexSelect">
<view class="rowitemxing">
*
</view>
<u-input v-model="jjform.sex" type="select" placeholder="请选择您的性别"
@click="sexShow = true" />
<u-select v-model="sexShow" :list="sexList" @confirm="testtrainCallback"></u-select>
</view>
</u-form-item>
<u-form-item prop="mobile">
<view class="rowitem">
<view class="rowitemxing">
*
</view>
<u-input v-model="jjform.mobile" placeholder="请输入您的手机号"></u-input>
<u-input v-model="jjform.mobile" :disabled="inpDisabled"
placeholder="请输入您的手机号"></u-input>
</view>
</u-form-item>
<u-form-item prop="code" v-if="!accessToken">
@ -531,8 +554,8 @@
<u-input v-model="jjform.code" placeholder="请输入验证码"></u-input>
<u-verification-code seconds="60" ref="uCode"
@change="codeChange"></u-verification-code>
<u-button type="primary" size="mini" :disabled="codeBtn"
@click="getCode">{{tips}}</u-button>
<u-button type="primary" size="mini" :disabled="codeBtn" @click="getCode">{{ tips
}}</u-button>
</view>
</u-form-item>
</u-form>
@ -556,7 +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) => {
@ -566,9 +597,9 @@ export default {
let schooldata = res.data.rows[0]
this.calltext = schooldata.schoolName + '-' + schooldata.trainClassName
if (schooldata.trainStartTime && schooldata.trainEndTime) {
console.log(schooldata);
console.log(schooldata)
this.timetext =
schooldata.trainClassName + ' ' +
' ' +
'课程周期:' +
schooldata.trainStartTime.slice(0, 10) +
'至 ' +
@ -594,12 +625,26 @@ export default {
flag: true,
accessToken: null,
codeBtn: false,
sexShow: false,
calltext: '',
timetext: '',
// 线
onLineList: [],
sexList: [
{
value: '0',
label: '男'
},
{
value: '1',
label: '女'
}
],
isShowDia: false,
isShowDown: false,
tokenshow: false,
isPopupShow: false,
inpDisabled: false,
signobj: {
name: '',
qq: '',
@ -625,7 +670,29 @@ export default {
label: '硕士',
},
],
courselist: '', //
courselist: [
{ con: '静态分析的概念介绍。', num: '1课时' },
{ con: '静态分析工具介绍。', num: '1课时' },
{ con: '静态分析的基本流程。', num: '1课时' },
{ con: '单元测试的概念介绍。', num: '1课时' },
{ con: '单元测试依据的标准介绍。', num: '1课时' },
{ con: '介绍单元测试的测试类型。', num: '1课时' },
{ con: '单元测试的基本流程。', num: '1课时' },
{ con: '单元测试工具的安装和使用。', num: '2课时' },
{ con: '单元测试环境配置。', num: '2课时' },
{ con: '单元测试工具静态分析操作流程。', num: '2课时' },
{ con: '单元测试操作流程。', num: '2课时' },
{ con: '单元测试工具的测试报告导出。', num: '1课时' },
{ con: '静态测试工具的安装和使用。', num: '2课时' },
{
con: '通过项目进行代码行数、圈复杂度、扇入扇出、注释率进行测试。',
num: '4课时',
},
{
con: '通过项目进行文档审查、代码审查、静态分析、测试用例的设计、单元测试的执行、单元测试的记录填写、单元测试的测试用例的自动生成、单元测试的问题记录方法、单元测试文档编写。',
num: '4课时',
},
], //
wxUserInfo: null, //
register: null,
swipelist: [
@ -670,7 +737,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -682,7 +749,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -694,7 +761,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -706,7 +773,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -718,7 +785,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -730,7 +797,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -742,7 +809,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -754,7 +821,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -766,7 +833,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -778,7 +845,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
{
@ -801,7 +868,7 @@ export default {
pxnr: '单元测试、配置项测试、安全性测试、可编程逻辑器件测试课程学习。',
sh: '1.进入北京关键科技股份有限公司人才库且获得工业和信息化人才岗位能力评价证书。',
sh1: '2.考核成绩优秀者可推荐进入北京关键科技股份有限公司或者合作单位实习。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh2: '3.可以在北京关键科技股份有限公司的关测试宝平台承接测试任务。',
sh3: '4.可以去学校配合讲师当助教,进一步加强自身学习。',
},
form: {},
@ -839,6 +906,13 @@ export default {
trigger: ['blur'],
},
],
sex: [
{
required: true,
message: '请选择您的性别',
trigger: ['blur,change'],
},
],
counsellor: [
{
required: true,
@ -874,6 +948,13 @@ export default {
trigger: ['blur'],
},
],
sex: [
{
required: true,
message: '请选择您的性别',
trigger: ['blur,change'],
},
],
mobile: [
{
required: true,
@ -933,6 +1014,7 @@ export default {
studentName: '',
mobile: '',
uuid: '',
sex: '',
code: '',
},
//
@ -978,34 +1060,34 @@ export default {
this.register = uni.getStorageSync('register')
console.log('register--', this.register)
console.log('wxUserInfo---', this.wxUserInfo)
this.http.quickGet(`/train/course/list?pageNum=1&pageSize=100`).then((res) => {
console.log('res---', res)
this.courselist = res.data.rows
if (this.courselist.length > 0) {
this.courselist.sort((a, b) => {
return a.orderNum - b.orderNum
})
this.courselist.forEach((item) => {
if (item.children.length > 0) {
item.children.sort((a, b) => {
return a.orderNum - b.orderNum
})
if (item.orderNum == 1) {
item.index = '一'
} else if (item.orderNum == 2) {
item.index = '二'
} else if (item.orderNum == 3) {
item.index = '三'
} else if (item.orderNum == 4) {
item.index = '四'
} else if (item.orderNum == 5) {
item.index = '五'
}
}
})
console.log('课程培训列表--', this.courselist)
}
})
// this.http.quickGet(`/train/course/list?pageNum=1&pageSize=100`).then((res) => {
// console.log('res---', res)
// this.courselist = res.data.rows
// if (this.courselist.length > 0) {
// this.courselist.sort((a, b) => {
// return a.orderNum - b.orderNum
// })
// this.courselist.forEach((item) => {
// if (item.children.length > 0) {
// item.children.sort((a, b) => {
// return a.orderNum - b.orderNum
// })
// if (item.orderNum == 1) {
// item.index = ''
// } else if (item.orderNum == 2) {
// item.index = ''
// } else if (item.orderNum == 3) {
// item.index = ''
// } else if (item.orderNum == 4) {
// item.index = ''
// } else if (item.orderNum == 5) {
// item.index = ''
// }
// }
// })
// console.log('--', this.courselist)
// }
// })
//
this.getClassList()
@ -1016,6 +1098,9 @@ export default {
onUnload() {
uni.offKeyboardHeightChange(this.onKeyboardHeightChange)
},
onShow() {
this.getOnlineCourse()
},
onReady() {
//onReady uni-app
this.$refs.uForm.setRules(this.rules)
@ -1023,7 +1108,7 @@ export default {
},
onShareAppMessage() {
return {
title: '关键测试宝', //
title: '小关软测宝', //
path: 'pages/index/testtraining/testtraining', //
// imageUrl: '/static/index/logo.png' //
}
@ -1031,14 +1116,52 @@ export default {
//2.
onShareTimeline() {
return {
title: '关键测试宝', //
title: '小关软测宝', //
query: 'pages/index/testtraining/testtraining', //
// imageUrl: '/static/index/logo.png' //
}
},
methods: {
//
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?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
},
fornCallBack(e) {
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 {
@ -1113,6 +1236,22 @@ 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/courses?userId=${userId}`).then((res) => {
console.log(res);
this.onLineList = res.data.data.slice(0, 3)
})
} else {
this.http.quickGet(`/course/online/courses`, false).then((res) => {
// console.log(res);
this.onLineList = res.data.data.slice(0, 3)
})
}
},
//
getClassList() {
this.http.quickGet(`/train/portal`, false).then((res) => {
@ -1173,6 +1312,7 @@ export default {
},
// 1
model1CLick() {
console.log('click me')
this.isShowDown = true
},
closeShowDown() {
@ -1196,7 +1336,9 @@ export default {
this.isShowDia = false
this.$refs.uForm.resetFields()
this.form = {}
this.calltext = '培训班代号由校企合作老师统一发送,请联系培训老师'
// this.calltext = ''
this.calltext = ''
this.timetext = ''
},
codeChange(text) {
this.tips = text
@ -1239,6 +1381,7 @@ export default {
},
closeclosejj() {
this.isPCshow = false
this.inpDisabled = false
this.$refs.uFormjj.resetFields()
this.jjform = {
studentName: '',
@ -1248,6 +1391,10 @@ export default {
}
},
jjOpen(it) {
const accessToken = uni.getStorageSync('accessToken')
const wxUserInfo = uni.getStorageSync('wxUserInfo')
console.log(accessToken)
console.log(wxUserInfo)
// let accessToken = uni.getStorageSync('accessToken');
// if (!accessToken) {
// this.tokenshow = true
@ -1255,6 +1402,10 @@ export default {
// this.isPCshow = true
// this.classInfo = it
// }
if (accessToken && wxUserInfo.phonenumber) {
this.jjform.mobile = wxUserInfo.phonenumber
this.inpDisabled = true
}
if (it) {
this.classInfo = it
}
@ -1274,6 +1425,7 @@ export default {
trainClassId: this.classInfo.classId,
classType: this.classInfo.classType,
userId: wxUserInfo.userId,
sex: sexMap[this.jjform.sex]
}
this.http.quickPost(`/train/training/offApply`, data, false).then((res) => {
if (res.data.data.code == 200) {
@ -1342,6 +1494,7 @@ export default {
majorName: this.form.majorName,
studentName: this.form.studentName,
studentCode: this.form.studentCode,
sex: sexMap[this.form.sex],
trainClassId,
counsellor: this.form.counsellor,
counsellorTel: this.form.counsellorTel,
@ -1373,8 +1526,8 @@ export default {
})
}
})
},
},
}
}
}
</script>
@ -1444,6 +1597,10 @@ export default {
font-size: 22rpx;
}
.sexSelect .u-input__right-icon {
margin-right: 10px;
}
.contentboxCon>>>.u-form-item {
padding: 17rpx 0 !important;
}
@ -1467,7 +1624,6 @@ export default {
width: 489rpx;
height: 60rpx;
background: #2084f9;
box-shadow: 0rpx 1rpx 20rpx 1rpx rgba(13, 92, 187, 0.3);
border-radius: 6rpx;
font-weight: 500;
font-size: 28rpx;
@ -1702,6 +1858,28 @@ export default {
box-sizing: border-box;
}
.onLineTrainTitle {
margin: 10rpx 0;
line-height: 80rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.onLineTrainTitle .onLineTitleText {
font-weight: bold;
font-size: 30rpx;
}
.onLineTrainTitle .more {
font-weight: 500;
font-size: 28rpx;
color: #808080;
}
.logobg {
width: 100%;
height: 32vw;
@ -1983,13 +2161,14 @@ export default {
}
.table_heade {
width: 90%;
width: 100rpx;
text-align: center;
line-height: 20rpx;
/* margin:5px 0 */
}
.table_kheade {
width: 10%;
width: 140rpx;
text-align: center;
}
@ -2004,17 +2183,18 @@ export default {
background-color: #ffffff;
display: flex;
align-items: center;
line-height: 20px;
color: #1a1a1a;
/* height: 26px; */
}
.table_obody {
width: 10%;
width: 100rpx;
text-align: center;
}
.table_tbody {
width: 80%;
width: 600rpx;
text-align: left;
padding: 4px 8px;
border-left: 1px solid #cfdddd;
@ -2022,7 +2202,7 @@ export default {
}
.table_hbody {
width: 10%;
width: 140rpx;
text-align: center;
}

@ -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 => {

@ -12,12 +12,12 @@
<view>{{ nowTime }}</view>
</view>
<view class="signBtn" v-else>
<img src="./signSuc.png" alt="" />
<img src="http://image.bjkeyware.com/static/index/renliwb/signSuc.png" alt="" />
<view>已签到</view>
</view>
</view>
<view class="scanFail" v-else>
<img src="./error.png" alt="" />
<img src="http://image.bjkeyware.com/static/index/renliwb/error.png" alt="" />
<view>无法识别二维码</view>
</view>
</view>
@ -78,9 +78,8 @@ export default {
})
},
init() {
this.http.quickGet(`/course/singin/${this.courseId}`, true).then((response) => {
console.log(response);
console.log(response)
if (response.data.msg == '已签到') {
this.isSignin = true
}
@ -99,25 +98,31 @@ export default {
.scanSuc {
font-family: PingFang SC;
padding-top: 80rpx;
.className {
font-weight: bold;
font-size: 30rpx;
color: #000000;
line-height: 46rpx;
line-height: 35rpx;
margin: 30rpx;
}
.courseName {
font-weight: 500;
font-size: 30rpx;
color: #4d4d4d;
line-height: 46rpx;
// line-height: 46rpx;
margin-left: 30rpx;
}
.signBtn {
margin: 0 auto;
margin-top: 300rpx;
background-color: #4899f7;
margin-top: 350rpx;
// background-color: #4899f7;
background: linear-gradient(90deg, #5ea6fa, #1b7cf2);
color: #fff;
box-shadow: 0rpx 0rpx 20rpx 4rpx rgba(0, 0, 0, 0.219);
border-radius: 50%;
width: 250rpx;
height: 250rpx;
@ -127,6 +132,7 @@ export default {
flex-direction: column;
align-items: center;
justify-content: center;
img {
width: 50rpx;
height: 50rpx;
@ -134,6 +140,7 @@ export default {
}
}
}
.scanFail {
margin: 0 auto;
margin-top: 500rpx;
@ -141,6 +148,7 @@ export default {
text-align: center;
font-weight: bold;
font-size: 30rpx;
img {
width: 50rpx;
height: 50rpx;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,169 @@
<template>
<view class="rulesWrap">
<view class="rulesImage">
<img src="http://image.bjkeyware.com/static/index/rulesBanner.png" alt="">
</view>
<view class="rulesGroup">
<view class="rulesTitle">等级及对应成长值</view>
<u-table width="100%">
<u-tr style="font-size: 25rpx;">
<u-th style="width: 11%;">等级</u-th>
<u-th style="width: 30%;">对应成长值</u-th>
<u-th style="width: 59%;">权益等级</u-th>
</u-tr>
<u-tr v-for="(item, index) in scoreArray" :key="index" style="" v-show="index != scoreArray.length -1">
<u-td style="width: 11%;">{{ scoreComputed(item.minScore, index,
'myLevel') }}</u-td>
<u-td style=" width: 30%;">
<view>{{
scoreComputed(item.minScore, index,
'scoreRange') }}</view>
</u-td>
<u-td style="width: 59%;">
<view> 新增竞标 <span :style="{
text: 'left',
color: scoreComputed(item.minScore, index,
'myGradeEquity') != '无门槛' ? '#FF5A4D' : ''
}">{{ scoreComputed(item.minScore, index,
'myGradeEquity') }}</span> 的众包任务的资格</view>
</u-td>
</u-tr>
</u-table>
</view>
<view class="rulesGroup">
<view class="rulesTitle">成长值获取途径</view>
<view class="growWays">
<view v-for="(item, index) in staticWays" :key="index">
<view class="waysTitle">{{ index + 1 }}. {{ item.split(' ')[0] }}</view>
<view class="waysInfo">{{ item.split(' ')[1] }}</view>
</view>
</view>
</view>
<view class="moreWays">更多获取途径敬请期待</view>
</view>
</template>
<script>
const staticWays = [
'实名认证 通过在我的页面完成实名认证,可获取50成长值',
'云员工认证 通过去PC端https://bjkeyware.com/ability/user完成云员工认证可获得300成长值',
'竞标任务 竞标成功后,实施验收通过后,可自动获取到200成长值'
]
import { scoreStrategies, getLevel } from '@/utils/userlevel';
const scoreArray = JSON.parse(JSON.stringify(scoreStrategies)).reverse()
export default {
data() {
return {
scoreArray: scoreArray,
staticWays: staticWays
}
},
computed: {
scoreComputed() {
return (min, index, tag) => {
const { level, equity } = getLevel(min)
if (tag == 'myLevel') {
return 'L' + level
} else if (tag == 'myGradeEquity') {
return equity
} else {
if (index == this.scoreArray.length - 1) {
return `X ≥ ${this.scoreArray[index].minScore}`
}
const max = this.scoreArray[index + 1].minScore
return `${min} ≤X<${max} `
}
}
}
}
}
</script>
<style lang="scss">
.u-td view {
text-align: start;
font-size: 24rpx;
}
.u-th view {
text-align: start !important;
font-size: 23rpx;
padding-left: 15rpx;
background-color: #EAF1FD !important;
}
.u-td {
text-align: start !important;
flex: none !important;
}
.u-th {
font-size: 26rpx;
text-align: start !important;
padding-left: 15rpx;
background-color: #EAF1FD !important;
flex: none !important;
}
.rulesWrap {
padding: 35rpx 25rpx;
font-family: PingFang SC;
font-weight: 500;
.rulesImage {
img {
height: 200rpx;
width: 100%;
}
}
.rulesGroup {
margin: 30rpx auto;
background: #FFFFFF;
border-radius: 10rpx;
padding: 0 20rpx;
font-family: PingFang SC;
font-weight: 500;
padding: 30rpx 25rpx 30rpx 25rpx;
margin: 25rpx 0;
.rulesTitle {
font-size: 28rpx;
color: #000000;
font-weight: bold;
line-height: 50rpx;
margin-bottom: 10rpx;
}
.growWays {
line-height: 42rpx;
font-size: 24rpx;
.waysTitle {
color: #333333;
}
.waysInfo {
color: #666666;
}
}
}
.moreWays {
margin-top: 40rpx;
text-align: center;
font-size: 28rpx;
color: #5F6975;
line-height: 25rpx;
}
}
</style>

@ -0,0 +1,145 @@
<template>
<view class="taskWrap">
<view class="taskItem" v-for="(task, index) in taskArrays" :key="index">
<view>
<view class="taskItemTitle">{{ task.lable }}</view>
<view class="taskItemInfo"><span style="margin-right: 15rpx;color: #FC4A4A;">+{{ task.score }}
</span>成长值
</view>
</view>
<view v-if="!task.state" class="taskBtn missonSuccess" @click="dropTo(task.url)">
{{ '去完成' }}
</view>
<view v-else class="taskBtn missonFaild">
{{ '已完成' }}
</view>
</view>
</view>
</template>
<script>
const taskArrays = [
{ lable: '实名认证', score: '50', url: '/pages/personal/setup/certification', state: false },
{ lable: '云员工认证', score: '300', url: 'cloud', state: false },
{ lable: '去竞标任务', score: '200', url: '', state: false },
]
export default {
data() {
return {
taskArrays: taskArrays,
phoneuserinfo: null
}
},
onShow() {
this.phoneuserinfo = uni.getStorageSync('wxUserInfo');
this.http.quickGet('/getInfo', true).then(res => {
const { testerStatus } = res.data.user
console.log(testerStatus);
if (testerStatus == 1) {
this.taskArrays[0].state = true
} else if (testerStatus == 2) {
this.taskArrays[0].state = true
this.taskArrays[1].state = true
} else if (testerStatus == 0) {
this.taskArrays[0].state = false
}
})
},
methods: {
dropTo(url) {
if (url == 'cloud') {
uni.showModal({
title: `云员工认证请前往PC端`,
content: 'PC端网址:https://bjkeyware.com',
showCancel: false,
confirmText: '复制网址',
success: function (res) {
if (res.confirm) {
uni.setClipboardData({
data: url,
success: function () {
uni.showToast({
title: '复制成功',
})
},
fail: function () {
uni.showToast({
title: '复制失败',
})
},
})
}
},
})
return
}
if (url) {
uni.navigateTo({
url: `${url}`
})
return
}
uni.switchTab({
url: '/pages/index/testcrowdsourc/testcrowdsourc',
})
}
}
}
</script>
<style lang="scss" scoped>
.taskWrap {
padding: 35rpx 0;
.taskItem {
width: 700rpx;
height: 150rpx;
background: linear-gradient(90deg, #E2EDFD, #E5E4FE);
box-shadow: 0rpx 1rpx 10rpx 1rpx rgba(32, 37, 44, 0.2);
border-radius: 10rpx;
margin: 0 auto 30rpx auto;
display: flex;
justify-content: space-between;
align-items: center;
padding: 35rpx;
font-family: PingFang SC;
font-weight: 500;
.taskItemTitle {
font-family: PingFang SC;
font-weight: 500;
font-size: 30rpx;
color: #000;
line-height: 38rpx;
}
.taskItemInfo {
margin-top: 20rpx;
font-size: 26rpx;
color: #666666;
line-height: 38rpx;
}
.taskBtn {
width: 130rpx;
height: 46rpx;
border-radius: 23rpx;
text-align: center;
color: #fff;
line-height: 46rpx;
}
.missonSuccess {
background: linear-gradient(90deg, #39DA8C, #2B8EFE);
}
.missonFaild {
background: linear-gradient(90deg, #FAD126, #FF544F);
}
}
}
</style>

@ -0,0 +1,368 @@
<template>
<view>
<view class="gradeWrap">
<view style="margin: 0 50rpx;display: flex;align-items: center;">
<view @click="gouserHome">
<img style='width:55px;height:55px;border-radius: 50%' v-if='avatar'
:src="avatar && avatar.indexOf('http') == 0 ? avatar : base + avatar" alt="">
<img v-else style='width:55px;height:55px;border-radius: 50%'
src="../../../static/crowd/defaultAva.jpg" alt="">
</view>
<p v-if='phoneuserinfo.companyName' style='margin-bottom:5px;font-size:17px;font-weight:600;'>
{{ phoneuserinfo.companyName }}
</p>
<p v-else style='margin-bottom:5px;font-size:17px;font-weight:600;margin-left: 10rpx;'>{{ nickName }}
</p>
</view>
<view class="gradeSwiperWrap">
<swiper class="gradeSwiper" previous-margin="30rpx" :duration="swipeDuration" next-margin="30rpx"
:current="currentImgIndex" @change="changeswiper">
<swiper-item v-for="(index) in scoreArray.length - 1" :key="index">
<view class="swiper-item gradeSwiperItem">
<view class="bothSide">
<view>
<view class="currentState">{{ currentGrade(scoreArray[index].minScore, index, true)
}}</view>
<view class="currentLevel">Lv. {{ index }}</view>
</view>
<view @click="toToggle('gradeTask')"
v-show="currentGrade(scoreArray[index].minScore, index, true) == '当前等级'"
class="toGrow">去升级
</view>
</view>
<view class="grailLayout">
<view>Lv. {{ index }}</view>
<view style="font-size: 24rpx;color: #666666;">已获得{{ myScore }}成长值</view>
<view>Lv. {{ index + 1 }}</view>
</view>
<view class="splitLine">
<view class="progress" :style="{ width: progressWidth(index) }"></view>
</view>
<view class="grailLayout">
<view>{{ scoreArray[index].minScore }}</view>
<view
v-if="'currentGrow1' == stateMap[currentGrade(scoreArray[index].minScore, index, true)]"
class="currentGrow1">{{ currentGrade(scoreArray[index].minScore, index, false) }}
</view>
<view
v-if="'currentGrow2' == stateMap[currentGrade(scoreArray[index].minScore, index, true)]"
class="currentGrow2">{{ currentGrade(scoreArray[index].minScore, index, false) }}
</view>
<view
v-if="'currentGrow3' == stateMap[currentGrade(scoreArray[index].minScore, index, true)]"
class="currentGrow3">{{ currentGrade(scoreArray[index].minScore, index, false) }}
</view>
<view>{{ index == scoreArray.length - 1 ? scoreArray[scoreArray.length - 1].minScore :
scoreArray[index + 1]['minScore'] }}
</view>
</view>
</view>
</swiper-item>
</swiper>
</view>
<view class="newRight"><img src="http://image.bjkeyware.com/static/index/myRight.png" alt=""> 新增权益</view>
<view class="rightInfo">新增竞标 <span :style="{ color: levelColor[level] }">{{ level }}</span> 的众包任务的资格</view>
</view>
<view class="rulesGroup">
<view @click="toToggle('growInfo')">
<view>成长值明细</view><img src="http://image.bjkeyware.com/static/index/xia.png" alt="">
</view>
<view @click="toToggle('gradeRules')">
<view>等级规则</view><img src="http://image.bjkeyware.com/static/index/xia.png" alt="">
</view>
</view>
</view>
</template>
<script>
const levelColor = {
'V1': '#6740E5',
'V2': '#E86914',
'V3': '#9752FF',
}
import { scoreStrategies, getLevel } from '@/utils/userlevel';
const scoreArray = JSON.parse(JSON.stringify(scoreStrategies)).reverse()
export default {
data() {
return {
scoreArray: Object.freeze(scoreArray),
myScore: '0',
avatar: '',
phoneuserinfo: '',
nickName: '',
currentImgIndex: 0,
swipeDuration:0,
stateMap: Object.freeze({
'未达成': 'currentGrow3',
'已达成': 'currentGrow1',
'当前等级': 'currentGrow2'
}),
levelColor: Object.freeze(levelColor)
}
},
methods: {
toToggle(url) {
uni.navigateTo({
url: `./${url}`
})
},
changeswiper(e) {
this.currentImgIndex = e.detail.current
}
},
onShow() {
},
onLoad() {
this.http.quickGet('/getInfo', true).then(res => {
const { growthValue } = res.data.user
this.myScore = growthValue || 0
this.currentImgIndex = getLevel(this.myScore).level
this.swipeDuration = 500
})
this.phoneuserinfo = uni.getStorageSync('wxUserInfo');
this.avatar = uni.getStorageSync('avatar');
this.nickName = uni.getStorageSync('nickName');
},
computed: {
level() {
const { _, equity } = getLevel(this.myScore)
return equity
},
currentGrade() {
return (min, index, tag) => {
// if (index == this.scoreArray.length - 1) {
// return ''
// }
const max = this.scoreArray[index + 1]['minScore']
if (this.myScore >= max) {
return '已达成'
} else if (this.myScore <= max && this.myScore >= min) {
let result = ''
result = tag ? '当前等级' : `还差${max - this.myScore}可升级`
return result
} else {
return '未达成'
}
}
},
progressWidth() {
return (index) => {
const max = this.scoreArray[index + 1]['minScore']
if (this.myScore > max) {
return '100%'
} else if (this.myScore < this.scoreArray[index]['minScore']) {
return '0%'
} else {
return (((this.myScore - this.scoreArray[index]['minScore']) / (max - this.scoreArray[index]['minScore'])) * 100).toFixed(2) + "%"
}
}
}
}
}
</script>
<style lang="scss" scoped>
.gradeWrap {
background-color: #e3e6fe;
border-bottom-left-radius: 60rpx;
border-bottom-right-radius: 60rpx;
padding: 20rpx 0;
.gradeSwiperWrap {
.gradeSwiper {
height: 300rpx;
box-sizing: border-box;
.gradeSwiperItem {
padding: 22rpx 0rpx;
box-shadow: 0rpx 2rpx 18rpx 0rpx rgba(30, 66, 111, 0.15);
border-radius: 10rpx;
margin: 0 10rpx;
background: url('http://image.bjkeyware.com/static/index/gradeBg.png') no-repeat 0 0;
background-size: 100% 100%;
}
.bothSide {
display: flex;
justify-content: space-between;
font-family: PingFang SC;
position: relative;
.toGrow {
width: 130rpx;
height: 46rpx;
background: linear-gradient(90deg, #5EA6FD, #1A81F9);
border-radius: 23rpx;
text-align: center;
font-weight: 500;
font-size: 26rpx;
color: #FFFFFF;
line-height: 46rpx;
position: absolute;
bottom: 10rpx;
right: 30rpx;
}
.currentState {
width: 150rpx;
line-height: 46rpx;
font-weight: 500;
font-size: 26rpx;
color: #333333;
background: #EAF1FD;
text-align: center;
border-radius: 0rpx 23rpx 23rpx 0rpx;
}
.currentLevel {
margin: 30rpx 40rpx;
height: 28rpx;
font-weight: 800;
font-size: 36rpx;
color: #000000;
line-height: 38rpx;
}
}
.splitLine {
margin: 10rpx auto;
width: 572rpx;
height: 10rpx;
// background: #98C5FB;
background: #FFFFFF;
border-radius: 5rpx;
position: relative;
.progress {
position: absolute;
height: 10rpx;
width: 15%;
background: #98C5FB;
border-radius: 5rpx;
}
}
.grailLayout {
margin-top: 10rpx;
display: flex;
justify-content: space-between;
margin: 0 40rpx;
font-family: PingFang SC;
font-weight: 500;
font-size: 26rpx;
color: #333333;
line-height: 38rpx;
.currentGrow1 {
background: url('http://image.bjkeyware.com/static/index/currentState1.png') no-repeat 0 0;
min-width: 10rpx;
padding: 0 20rpx;
height: 50rpx;
line-height: 58rpx;
background-size: 100% 100%;
text-align: center;
font-family: PingFang SC;
font-weight: 500;
font-size: 24rpx;
color: #FFFFFF;
}
.currentGrow2 {
background: url('http://image.bjkeyware.com/static/index/currentState2.png') no-repeat 0 0;
min-width: 10rpx;
padding: 0 20rpx;
height: 50rpx;
line-height: 58rpx;
background-size: 100% 100%;
text-align: center;
font-family: PingFang SC;
font-weight: 500;
font-size: 24rpx;
color: #FFFFFF;
}
.currentGrow3 {
background: url('http://image.bjkeyware.com/static/index/currentState3.png') no-repeat 0 0;
min-width: 10rpx;
padding: 0 20rpx;
height: 50rpx;
line-height: 58rpx;
background-size: 100% 100%;
text-align: center;
font-family: PingFang SC;
font-weight: 500;
font-size: 24rpx;
color: #FFFFFF;
}
&:last-child {
border: none;
}
}
}
}
.newRight {
height: 29rpx;
font-family: PingFang SC;
font-weight: bold;
font-size: 30rpx;
color: #000000;
line-height: 38rpx;
margin: 30rpx 50rpx 20rpx 50rpx;
display: flex;
align-items: center;
img {
width: 41rpx;
height: 37rpx;
}
}
.rightInfo {
margin: 0rpx 50rpx;
padding-bottom: 20rpx;
font-family: PingFang SC;
font-weight: 500;
font-size: 24rpx;
color: #4D4D4D;
}
}
.rulesGroup {
width: 683rpx;
height: 180rpx;
margin: 30rpx auto;
background: #FFFFFF;
border-radius: 10rpx;
padding: 0 40rpx;
img {
width: 13rpx;
height: 21rpx;
}
>view {
height: 50%;
line-height: 90rpx;
border-bottom: 1px solid #EDEDED;
;
display: flex;
justify-content: space-between;
align-items: center;
&:last-child {
border: none;
}
}
}
</style>

@ -0,0 +1,77 @@
<template>
<view class="rulesGroupWrap">
<view class="rulesGroup">
<view v-for="(item, index) in growthDetail" :key="index">
<view class="rulesItem">
<view>{{ item.title }}</view>
<view><span style="color: #FC4A4A;margin-right: 15rpx;">+{{ item.growthValue }} </span> 成长值</view>
</view>
<view class="rulesTime">{{ item.date }}</view>
</view>
<view v-if="growthDetail.length == 0">暂无信息</view>
</view>
</view>
</template>
<script>
export default {
onShow() {
this.http.quickGet('/getInfo', true).then(res => {
console.log(res.data.user.growthDetail);
this.growthDetail = JSON.parse(res.data.user.growthDetail)
})
console.log(this.growthDetail);
},
data() {
return {
growthDetail: []
}
}
}
</script>
<style lang="scss" scoped>
.rulesGroupWrap {
padding: 30rpx 0;
.rulesGroup {
width: 683rpx;
margin: 0rpx auto;
background: #FFFFFF;
border-radius: 10rpx;
padding: 0 40rpx;
font-family: PingFang SC;
font-weight: 500;
padding: 5rpx 25rpx 55rpx 25rpx;
img {
width: 13rpx;
height: 21rpx;
}
>view {
border-bottom: 1px solid #EDEDED;
padding: 25rpx 0;
.rulesItem {
font-size: 30rpx;
color: #1A1A1A;
line-height: 38rpx;
line-height: 50rpx;
width: 100%;
display: flex;
justify-content: space-between;
}
.rulesTime {
margin-top: 10rpx;
font-size: 24rpx;
color: #808080;
line-height: 38rpx;
}
}
}
}
</style>

@ -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,7 +1,22 @@
<template>
<view class="courseWrapper">
<!-- <view v-if="courseList.length">
<view class="onlineTrain">
<view class="onLineTitle">
<view class="onLineClassName">软测课堂</view>
<view class="onLineCourseTime">时间{{ '今日 20:00' }}</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>
</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>
@ -9,32 +24,120 @@
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="http://image.bjkeyware.com/static/index/noCourse.png" alt="">
<view>暂未配置课程</view>
</view>
<view class="mycourseWrapper" v-else> 暂未配置课程 </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) {
console.log('进入course')
const classId = options.id
const className = options.name
console.log(options)
this.className = className
// console.log(options)
this.classId = classId
uni.setNavigationBarTitle({ title: className })
this.getCourseList(classId)
},
methods: {
async getCourseList(classId) {
this.http.quickGet(`/course/myCourse/class/${classId}`, true).then((res) => {
console.log(res)
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?courseId=${course.courseId}&learnStatus=${course.show ? true : false}`
})
},
pagionChange(e) {
console.log(e);
this.queryParams.pageNum = e.current
this.getCourseList()
},
async getCourseList() {
const params = this.queryParams
this.http.get(`/course/myCourse/class/${this.classId}`, params, true).then((res) => {
this.total = res.data.total
this.courseList = res.data.rows
})
console.log(this.courseList);
},
async onReachBottom() {
if (this.total <= this.queryParams.pageSize) {
return
}
this.queryParams.pageSize += 10
this.getCourseList()
console.log("onReachBottom");
},
courseDialog() {
const url = 'https://www.bjkeyware.com'
@ -67,13 +170,20 @@ export default {
}
</script>
<style scoped>
.courseWrapper {
}
<style lang="scss" scoped>
.mycourseWrapper {
font-size: 23px;
font-weight: bold;
color: #9D9D9D;
text-align: center;
line-height: 300rpx;
margin-top: 100px;
img {
width: 338rpx;
height: 254rpx;
}
}
.courseItem {
position: relative;
margin: 25rpx;
@ -88,6 +198,7 @@ export default {
font-size: 24rpx;
line-height: 50rpx;
}
.courseName {
/* width: 369rpx; */
/* height: 29rpx; */
@ -95,12 +206,15 @@ export default {
font-size: 30rpx;
color: #000000;
}
.courseTime {
color: #4d4d4d;
}
.courseSource {
color: #2853e4;
}
.signInfo {
width: 110rpx;
/* height: 40rpx; */
@ -112,4 +226,88 @@ export default {
top: 85rpx;
right: 25rpx;
}
.onlineTrain {
margin: 30rpx 30rpx;
height: 270rpx;
background: #FFFFFF;
border-radius: 10rpx;
}
.onLineTitle {
display: flex;
font-family: PingFang SC;
font-weight: 500;
height: 88rpx;
line-height: 54rpx;
justify-content: space-between;
}
.onLineClassName {
height: 54rpx;
min-width: 183rpx;
padding: 0 10rpx;
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;
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;
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 {
padding: 0 30rpx;
display: flex;
justify-content: flex-end;
}
.onLineBtn {
min-width: 209rpx;
height: 50rpx;
border-radius: 25rpx;
font-family: PingFang SC;
font-weight: 500;
font-size: 24rpx;
color: #FFFFFF;
line-height: 50rpx;
text-align: center;
}
.toLearn {
background: linear-gradient(90deg, #FB8C16, #FEC36E);
}
.toPay {
background: linear-gradient(90deg, #5EA6FD, #1A81F9);
border: 1px solid #AAD1FE;
}
</style>

@ -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,19 +108,21 @@
</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('myreview')">
<image src="http://image.bjkeyware.com/static/index/renliwb/newmy3.png" class="cycontentitimg"
<view class="cycontentit" @click="servier('peixunban')" v-if="signuplistLength != 0">
<image src="http://image.bjkeyware.com/static/index/renliwb/newmy66.png" class="cycontentitimg"
mode=""></image>
<view class="cycontentittext">
我的评价
我的培训班
</view>
</view>
<view class="cycontentit" @click="servier('message')">
<image src="http://image.bjkeyware.com/static/index/renliwb/newmy4.png" class="cycontentitimg"
mode=""></image>
@ -146,11 +148,18 @@
我的订单
</view>
</view>
<view class="cycontentit" @click="servier('peixunban')" v-if="signuplistLength != 0">
<!-- <view class="cycontentit" @click="servier('peixunban')" v-if="signuplistLength != 0">
<image src="http://image.bjkeyware.com/static/index/renliwb/newmy6.png" class="cycontentitimg"
mode=""></image>
<view class="cycontentittext">
报名管理
我的培训班
</view>
</view> -->
<view class="cycontentit" @click="servier('myreview')">
<image src="http://image.bjkeyware.com/static/index/renliwb/newmy33.png" class="cycontentitimg"
mode=""></image>
<view class="cycontentittext">
我的评价
</view>
</view>
<view v-if="applyInfo.companyApplyId && applyInfo.companyStatus == 1"
@ -188,6 +197,13 @@
</view>
</view>
</view>
<view class="changyong changyong1" style="min-height: 90rpx;line-height: 90rpx;">
<view class="myGradeWrap">
<view class="grade"><img src="http://image.bjkeyware.com/static/index/myGrade.png" alt=""> 我的等级</view>
<view class="getGrowVal" @click="myGradeValue">领取成长值<img
src="http://image.bjkeyware.com/static/index/xia.png" alt=""></view>
</view>
</view>
<view style="height:15px"> </view>
<u-toast ref="uToast" />
<u-modal title='温馨提示' v-model="tokenshow" content="您还没有登录" confirm-text='现在就去' cancel-text='稍等一下'
@ -446,6 +462,17 @@
} else {
this.tokenshow = true
}
},
//
myGradeValue() {
let accessToken = uni.getStorageSync('accessToken');
if (!accessToken) {
this.tokenshow = true
} else {
uni.navigateTo({
url: './grade/gradeValue'
})
}
}
}
}
@ -560,6 +587,42 @@
color: #4D4D4D;
}
.myGradeWrap {
display: flex;
justify-content: space-between;
align-items: center;
height: 100%;
font-family: PingFang SC;
font-weight: bold;
.grade {
font-size: 30rpx;
color: #000000;
display: flex;
align-items: center;
img {
margin: 0 10rpx;
width: 27rpx;
height: 34rpx;
}
}
.getGrowVal {
font-weight: 500;
font-size: 28rpx;
color: #1578ED;
display: flex;
align-items: center;
img {
margin: 0 10rpx;
width: 13rpx;
height: 20rpx;
}
}
}
.changyong {
width: 700rpx;
min-height: 230rpx;

@ -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>

@ -1,20 +1,31 @@
<template>
<view>
<view class="accounmt">
<view v-show="isadd">
<view v-show="isadd && !motify">
<p class="selectadd" style="margin-bottom: 20px;">选择添加类型</p>
<u-input style="width:100%;" v-model="accountform.paytype" type="select" @click="psytypeshow = true" placeholder='选择添加类型' />
<u-select v-model="psytypeshow" :list="payList" @confirm="paychange" mode="mutil-column-auto" ></u-select>
<u-input style="width:100%;" v-model="accountform.paytype" type="select" @click="psytypeshow = true"
placeholder='选择添加类型' />
<u-select v-model="psytypeshow" :list="payList" @confirm="paychange"
mode="mutil-column-auto"></u-select>
<div style="border: 1px dashed #EBEBEB;margin: 20px 0;"></div>
<div v-if="accountform.paytype=='支付宝'" style="display: flex;align-items: center;margin-bottom:10px;">
<div v-if="accountform.paytype == '支付宝'"
style="display: flex;align-items: center;margin-bottom:10px;justify-content: space-between;">
<view style="display: flex;align-items: center;">
<img style="width:19px;height:19px;margin-right:5px;" src="/static/crowd/PAYB.png" alt="">
<p class="selectadd">支付宝账号</p>
</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;">
<div v-if="accountform.paytype == '银行卡'"
style="display: flex;align-items: center;margin-bottom:10px;justify-content: space-between;">
<view style="display: flex;align-items: center;">
<img style="width:18px;height:15px;margin-right:5px;" src="/static/crowd/bankcad.png" alt="">
<p class="selectadd">银行卡账号</p>
</view>
<view @click="accountReset('银行卡')" style="color: #2587FA;">重置账号</view>
</div>
<u-form :model="accountform" ref="accountform" label-position='left' label-width='140' border-bottom='false'>
<u-form :model="accountform" ref="accountform" label-position='left' label-width='140'
border-bottom='false'>
<view v-if="accountform.paytype == '支付宝' && !accountdata.alipay">
<u-form-item label="姓 名:" prop="name" border-bottom='false' required='true'>
<u-input style="" v-model="accountform.name"></u-input>
@ -22,15 +33,19 @@
<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">
<image style="width: 21rpx;height: 21rpx;margin-right: 10rpx;" src="../../../static/crowd/zhuyi.png" mode=""></image>
<!-- <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')"
<view class="addbtnff" v-if="accountform.paytype == '支付宝' && !accountdata.alipay"
@click="acsumbit('determine')"
style='background: linear-gradient(90deg, #5EA6FD, #1A81F9);'>确定</view>
<view v-if="accountform.paytype=='支付宝' && !accountdata.alipay" class="addbtnff" @click="acsumbit('cancel')" style="border: 1px solid #E0E0E0;background: #FFFFFF;color: #666666;">取消</view>
<view v-if="accountform.paytype == '支付宝' && !accountdata.alipay" class="addbtnff"
@click="acsumbit('cancel')"
style="border: 1px solid #E0E0E0;background: #FFFFFF;color: #666666;">取消</view>
</view>
</view>
@ -44,14 +59,18 @@
<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">
<image style="width: 21rpx;height: 21rpx;margin-right: 10rpx;" src="../../../static/crowd/zhuyi.png" mode=""></image>
<!-- <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')"
<view class="addbtnff" v-if="accountform.paytype == '银行卡' && !accountdata.bankAccount"
@click="acsumbit('determine')"
style='background: linear-gradient(90deg, #5EA6FD, #1A81F9);'>确定</view>
<view v-if="accountform.paytype=='银行卡' && !accountdata.bankAccount" class="addbtnff" @click="acsumbit('cancel')" style="border: 1px solid #E0E0E0;background: #FFFFFF;color: #666666;">取消</view>
<view v-if="accountform.paytype == '银行卡' && !accountdata.bankAccount" class="addbtnff"
@click="acsumbit('cancel')"
style="border: 1px solid #E0E0E0;background: #FFFFFF;color: #666666;">取消</view>
</view>
</view>
</u-form>
@ -82,18 +101,22 @@
</view>
</view>
</view>
<view v-show="!isadd">
<view v-if="accountdata.alipay && accountdata.bankAccount" @click="accountdatadia('查看账户')" style="display:flex;align-items:center;font-size:15px;cursor: pointer;">
<view v-show="!isadd && !motify">
<view v-if="accountdata.alipay && accountdata.bankAccount" @click="accountdatadia('查看账户')"
style="display:flex;align-items:center;font-size:15px;cursor: pointer;">
<!-- <img style="width:20px;height:20px" src="/static/crowd/add.png" alt=""> -->
<p style="color:#2286FA;margin: 0 5px;">查看账户</p>
</view>
<view v-else @click="accountdatadia('添加账户')" style="display:flex;align-items:center;font-size:15px;cursor: pointer;">
<view v-else @click="accountdatadia('添加账户')"
style="display:flex;align-items:center;font-size:15px;cursor: pointer;">
<img style="width:20px;height:20px" src="/static/crowd/add.png" alt="">
<p style="color:#2286FA;margin: 0 5px;">添加账户</p>
<p v-if="!accountdata.alipay && !accountdata.bankAccount" style="color:#666666FF;font-size:13px;">(还未添加账户,无法提现)</p>
<p v-if="!accountdata.alipay && !accountdata.bankAccount" style="color:#666666FF;font-size:13px;">
(还未添加账户,无法提现)</p>
</view>
<div class="test_content">
<div style="padding:20px;background: #F2F4F7FF;border-radius: 6px 6px 0px 0px;border: 1px solid #E6E8EB;">
<div
style="padding:20px;background: #F2F4F7FF;border-radius: 6px 6px 0px 0px;border: 1px solid #E6E8EB;">
<p style="font-size:26px;color:#1A1A1AFF;font-weight: bold;">账户余额</p>
<p style="margin: 20px 0 0 0;">
<span style="font-size:30px;color:#F65B24FF;">{{ accountdata.balance }}</span>
@ -106,8 +129,10 @@
<!-- <u-divider use-solt='false'></u-divider> -->
<!-- <div class="linex"></div> -->
<div style="margin-top:35px;display: flex;">
<button class="applbtn" @click="chongzhi" style='background: linear-gradient(90deg, #5EA6FD, #1A81F9);'>充值</button>
<button class="applbtn" @click="openwitd" style='border: 1px solid #2468F6;color: #2468F6; background: #FFFFFF;'>提现</button>
<button class="applbtn" @click="chongzhi"
style='background: linear-gradient(90deg, #5EA6FD, #1A81F9);'>充值</button>
<button class="applbtn" @click="openwitd"
style='border: 1px solid #2468F6;color: #2468F6; background: #FFFFFF;'>提现</button>
<!-- <button @click="openwitd" class="addbtnff" style='border: 1px solid #2468F6;'>提现</button> -->
<!-- <view style="width:150px;height:50px;font-size: 18px;margin-right:20px;">充值</view>
<view style="width:150px;height:50px;font-size: 18px;margin-left:20px;">提现</view> -->
@ -115,6 +140,59 @@
</div>
</view>
<view v-if="motify">
<u-form :model="accountform" ref="accountform" label-position='left' label-width='140'
border-bottom='false'>
<view v-if="accountform.paytype == '支付宝' && accountdata.alipay">
<u-form-item labelWidth="0" prop="name" border-bottom='false' required='true'>
<u-input v-model="accountform.name" placeholder="请输入姓名"></u-input>
</u-form-item>
<u-form-item labelWidth="0" prop="alipay" border-bottom='false' required='true'>
<u-input v-model="accountform.alipay" placeholder="请输入支付宝账号"></u-input>
</u-form-item>
<u-form-item labelWidth="0" prop="mobile" border-bottom='false' required='true'>
<u-input v-model="accountform.mobile" placeholder="请输入手机号" disabled></u-input>
</u-form-item>
<u-form-item labelWidth="0" prop="code" border-bottom='false' required='true'>
<div style="display: flex;">
<u-input v-model="accountform.code" placeholder="请输入验证码" style="width: 70%;"></u-input>
<view :class="verifyCodeText.disabled ? 'btnDisable getVerifyCode' : 'getVerifyCode'"
@click="getVerifyCode">{{ verifyCodeText.text }}</view>
</div>
</u-form-item>
<view class="resetSubmit">
<view class="resetBtn" @click="acsumbit('determine')"
style='background: linear-gradient(90deg, #5EA6FD, #1A81F9);'>提交</view>
</view>
</view>
<view v-if="accountform.paytype == '银行卡' && accountdata.bankAccount">
<u-form-item labelWidth="0" prop="name" border-bottom='false' required='true'>
<u-input v-model="accountform.name" placeholder="请输入姓名"></u-input>
</u-form-item>
<u-form-item labelWidth="0" prop="bankDeposit" border-bottom='false' required='true'>
<u-input v-model="accountform.bankDeposit" placeholder="请输入开户行"></u-input>
</u-form-item>
<u-form-item labelWidth="0" prop="bankAccount" border-bottom='false' required='true'>
<u-input v-model="accountform.bankAccount" placeholder="请输入银行卡号"></u-input>
</u-form-item>
<u-form-item labelWidth="0" prop="mobile" border-bottom='false' required='true'>
<u-input v-model="accountform.mobile" placeholder="请输入手机号" disabled></u-input>
</u-form-item>
<u-form-item labelWidth="0" prop="code" border-bottom='false' required='true'>
<div style="display: flex;">
<u-input v-model="accountform.code" placeholder="请输入验证码" style="width: 70%;"></u-input>
<view :class="verifyCodeText.disabled ? 'btnDisable getVerifyCode' : 'getVerifyCode'"
@click="getVerifyCode">{{ verifyCodeText.text }}
</view>
</div>
</u-form-item>
<view class="resetSubmit">
<view class="resetBtn" @click="acsumbit('determine')"
style='background: linear-gradient(90deg, #5EA6FD, #1A81F9);'>提交</view>
</view>
</view>
</u-form>
</view>
</view>
<u-toast ref="uToast"></u-toast>
<!-- 充值弹层 -->
@ -142,6 +220,12 @@
accountdata: {},
wxUserInfo: null,
isadd: false,
verifyCodeText: {
text: '获取验证码',
timer: '',
disabled: false
},
motify: false,
psytypeshow: false,
payList: [{ value: '1', label: '支付宝' }, { value: '2', label: '银行卡' },],
accountform: { paytype: '支付宝', name: '', alipay: '', bankDeposit: '', bankAccount: '' },
@ -156,6 +240,9 @@
trigger: "blur",
},
],
code: [
{ required: true, message: "请输入验证码", trigger: "blur" },
],
bankDeposit: [
{ required: true, message: "开户行不能为空", trigger: "blur" },
{
@ -167,11 +254,11 @@
],
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: [
@ -232,6 +319,18 @@
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
@ -243,6 +342,62 @@
title: val
});
},
accountReset(val) {
uni.setNavigationBarTitle({
title: '重置账户'
});
this.motify = true
this.accountform = { paytype: '', name: '', alipay: '', bankDeposit: '', bankAccount: '' }
this.accountform.paytype = val
console.log(this.wxUserInfo);
this.accountform.mobile = this.wxUserInfo.phonenumber
},
//
getVerifyCode() {
if (this.verifyCodeText.disabled) {
return
}
const url = this.wxUserInfo.phonenumber
this.verifyCodeText.disabled = true
this.http.quickGet('/captchaUserLogin?phoneNumber=' + url)
.then((res) => {
if (res.data.code == 200) {
this.accountform.uuid = res.data.uuid
uni.showToast({
title: '发送成功',
icon: 'none',
duration: 1000,
})
const TIME_COUNT = 60 //
if (!this.verifyCodeText.timer) {
this.verifyCodeText.text = TIME_COUNT
this.verifyCodeText.disabled = true
this.verifyCodeText.timer = setInterval(() => {
if (this.verifyCodeText.text > 0 && this.verifyCodeText.text <= TIME_COUNT) {
this.verifyCodeText.text--
} else {
this.verifyCodeText.disabled = false
// this.verifyCodeText.show = true
clearInterval(this.verifyCodeText.timer) //
this.verifyCodeText.timer = null
this.verifyCodeText.text = '获取验证码'
}
}, 1000)
}
} else {
this.verifyCodeText.disabled = false
uni.showToast({
title: res.data.msg,
icon: 'none',
duration: 1000,
})
}
})
.catch((err) => {
this.verifyCodeText.disabled = false
console.log('err', err)
})
},
//
acsumbit(type) {
if (type == 'cancel') {
@ -252,6 +407,8 @@
});
} else {
this.$refs.accountform.validate((valid) => {
console.log('1');
if (valid) {
let data = {};
if (this.accountform.paytype == '支付宝') {
@ -272,13 +429,23 @@
}
console.log('添加账号data---', data)
// return;
this.http.quickPost(`/mpay/setting/account`,data,true).then(res=>{
let url = ''
if (this.motify) {
data.uuid = this.accountform.uuid
data.code = this.accountform.code
url = `/mpay/update/account`
} else {
url = `/mpay/setting/account`
}
this.http.quickPost(url, data, true).then(res => {
console.log('res---', res)
let toastTitle = '';
this.motify ? (toastTitle = '重置成功') : (toastTitle = '添加成功')
if (res.data.data.code == 200) {
this.$refs.uToast.show(
{
type: 'success',
title: "添加成功",
title: toastTitle,
duration: 2000,
}
)
@ -287,6 +454,7 @@
// } });
//
this.isadd = false
this.motify = false
this.wxUserInfo = uni.getStorageSync('wxUserInfo');
let userId = this.wxUserInfo.userId
this.http.quickGet(`/mpay/my/account/${userId}`, true).then(res => {
@ -403,6 +571,7 @@
font-size: 30rpx;
margin-left: 13px;
}
/* #F2F4F7 */
.accounmt {
background: #FFFFFF;
@ -412,17 +581,20 @@
border-radius: 10px;
padding: 10px 13px;
}
.test_content {
margin: 30px 0;
/* background: #F2F4F7FF; */
text-align: center;
}
.linex {
height: 1rpx;
width: 100%;
background: #EBEBEB
}
.applbtn {
border-radius: 50px;
width: 150px;
@ -434,6 +606,7 @@
line-height: 40px;
color: #FFFFFF;
}
.Withdrawable {
background: #DDE8F8;
border-radius: 0px 0px 6px 6px;
@ -443,18 +616,21 @@
font-size: 16px;
color: #666666FF;
}
.selectadd {
color: #000000;
font-size: 16px;
font-weight: bold;
}
.u-input {
padding: 0 10px !important;
height: 35px;
border-radius: 4rpx;
border: 1px solid #E6E6E6;
}
.addbtn {
display: flex;
justify-content: space-evenly;
@ -463,6 +639,39 @@
width: 100%;
margin-left: -40rpx;
}
.resetSubmit {
margin-top: 30px;
display: flex;
justify-content: center;
}
.resetBtn {
width: 85%;
height: 70rpx;
border-radius: 35rpx;
line-height: 70rpx;
font-weight: 500;
font-size: 28rpx;
color: #FFFFFF;
text-align: center;
}
.getVerifyCode {
width: 30%;
border-radius: 5rpx;
line-height: 60rpx;
font-weight: 500;
font-size: 28rpx;
color: #FFFFFF;
text-align: center;
background: linear-gradient(90deg, #5EA6FD, #1A81F9);
}
.btnDisable {
background: linear-gradient(90deg, #73a7e7, #4b8eda);
}
.addbtnff {
width: 40%;
height: 70rpx;
@ -473,6 +682,7 @@
color: #FFFFFF;
text-align: center;
}
.tishi {
font-weight: 500;
font-size: 22rpx;
@ -480,6 +690,7 @@
display: flex;
align-items: center;
}
.yitianjiaed {
width: 100%;
background: #F5F7FA;
@ -489,12 +700,14 @@
padding: 20rpx;
margin-top: 40rpx;
}
.yitianjiaedtext {
font-weight: 500;
font-size: 26rpx;
color: #333333;
margin-bottom: 25rpx;
}
.yitianjiaedtext text {
color: red;
margin-right: 10rpx;

@ -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,8 @@
</view>
</block>
<view v-else class="noreview">
暂无评价
<img style="width: 338rpx;height: 254rpx;" src="http://image.bjkeyware.com/static/index/noEvaluate.png" alt="">
<view>暂无评价</view>
</view>
</view>
</template>
@ -61,11 +62,11 @@
<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;
margin-top: 100px;
}
.peixunbanpage {

@ -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,23 +2,30 @@
<view class="navTab">
<!-- <u-search v-model='keyware' placeholder='输入搜索内容' :actionStyle="customActionStyle"
showAction="true" actionText="搜索" :animation="false" @custom='seacrhko'></u-search> -->
<view v-if="signuplist.length > 0">
<view v-for="(item,key) of signuplist" class="sign_list">
<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;">
<view class="rightb">
{{ item.trainClassName }}
</view>
<p v-if="item.registrationTime" style="font-size:24rpx;color: #808080;">报名时间{{ dateFormat(new Date(item.registrationTime))}} </p>
<p v-if="item.registrationTime" style="font-size:24rpx;color: #808080;">报名时间{{ dateFormat(new
Date(item.registrationTime)) }} </p>
</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 @click="catCourse(item)"
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 -->
<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>
<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>
@ -26,18 +33,33 @@
<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 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>
</view>
</view>
</view>
<view v-else style="font-size:46rpx;
font-weight: bold;
color: #9D9D9D; text-align:center;margin-top:100px">暂无报名信息</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="http://image.bjkeyware.com/static/index/noregister.png" alt="">
<view>暂无报名信息</view>
</view>
<view style="height:10px;"></view>
</view>
</template>
<script>
const endDay = 2
import { dateFormat } from '@/utils/util.js'
import { valiDateInOneDay } from '../../../utils/util';
export default {
computed: {
reportShow(v) {
return function (val) {
if (valiDateInOneDay(val.trainEndTime)) { return true } return false
}
},
},
data() {
return {
keyware: '',
@ -49,7 +71,7 @@
signuplist: [],
}
},
onLoad() {
onShow() {
let wxUserInfo = uni.getStorageSync('wxUserInfo');
// ${wxUserInfo.phonenumber}
if (wxUserInfo) {
@ -65,6 +87,11 @@
seacrhko() {
},
// onlineClass() {
// uni.navigateTo({
// url: `/pages/index/onlineTestCourse/onlineCourseInfo`
// })
// },
signupdetails(id) {
uni.navigateTo({
url: `/pages/index/testtraining/signup?issueId=${id}&type=1`
@ -77,22 +104,74 @@
url: `/pages/personal/myCourse/myCourse?id=${state.trainClassId}&name=${state.trainClassName}`
})
// }
},
uploadReport(val) {
console.log(val);
const url = 'https://www.bjkeyware.com'
uni.showModal({
title: `请登录PC端${(val === 'cat') ? '查看' : '上传'}`,
content: 'PC端网址:' + url,
showCancel: false,
confirmText: '复制网址',
success: function (res) {
if (res.confirm) {
uni.setClipboardData({
data: url,
success: function () {
uni.showToast({
title: '复制成功',
})
},
fail: function () {
uni.showToast({
title: '复制失败',
})
},
})
console.log('用户点击确定')
}
},
})
}
}
}
</script>
<style>
<style lang="scss">
.navTab {
padding: 2vh 13px;
}
.endClass {
color: #1F80F2;
display: flex;
justify-content: flex-end;
font-size: 24rpx;
line-height: 49rpx;
padding: 25rpx;
border-top: 1px solid #99999936;
;
align-content: center;
.reportUrl {}
.uploadBtn {
margin-left: 30rpx;
background: #EAF3FD;
border-radius: 20rpx;
border: 1px solid #AAD1FE;
padding: 0 20rpx;
}
}
.sign_list {
width: 100%;
background: #FFFFFF;
border-radius: 10px;
margin-bottom: 20px;
padding-bottom:15px;
// padding-bottom: 15px;
}
.rightb {
/* width: 183rpx; */
padding: 0 20rpx;
@ -105,12 +184,14 @@
text-align: center;
}
.fline {
width: 100%;
height: 1rpx;
border: 1px solid #999999;
opacity: 0.15;
}
.sign_sataus {
width: 75px;
height: 28px;

@ -1,7 +1,8 @@
<template>
<view class="peixunbanpage">
<view class="nodata" v-if="!useList.length">
暂无数据
<img src="http://image.bjkeyware.com/static/index/noUsePerson.png" alt="">
<view>暂无数据</view>
</view>
<view class="boxuser" v-else>
<view class="items" v-for="it in useList">
@ -116,14 +117,26 @@
}
.nodata {
display: flex;
/* display: flex;
justify-content: center;
align-items: center;
font-size: 46rpx;
font-weight: bold;
color: #9D9D9D;
text-align: center;
margin-top: 100px
margin-top: 100px */
font-size: 23px;
font-weight: bold;
color: #9D9D9D;
text-align: center;
margin-top: 100px;
}
.nodata img {
width: 338rpx;
height: 254rpx;
}
.beizhu {

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

@ -1,7 +1,7 @@
import comstemutil from "./comstemutil";
//es6
// const baseUrl = 'http://192.168.0.230:9999';
// const baseUrl = 'http://192.168.0.229:9999';
const baseUrl = 'https://www.bjkeyware.com/test-api';
// const baseUrl = 'https://www.bjkeyware.com/prod-api';

@ -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' //分享发送的链接图片地址
}

@ -0,0 +1,56 @@
/* 使if else
* 若等级规则增加给scoreStrategies数组添加对象即可 所有和等级相关的都会随之更改
* 食用方式
* const { level, equity} = getLevel(score)
* level:等级 equity:权益
*/
export const scoreStrategies = [
{ minScore: 5000, level: "4" },
{ minScore: 2000, level: "3" },
{ minScore: 500, level: "2" },
{ minScore: 100, level: "1" },
{ minScore: 0, level: "0" },
];
export const gradeEquity = function (level) {
return `${level * 1 === 0 ? "无门槛" : "V" + level}`;
};
export function getLevel(score) {
for (let i = 0; i < scoreStrategies.length; i++) {
if (score >= scoreStrategies[i].minScore) {
return {
level: scoreStrategies[i].level,
equity: gradeEquity(`${scoreStrategies[i].level}`),
};
}
}
console.error(`score=${score},无法确定等级`);
return "无法确定等级";
/*
strategyV1: function (score) {
return score >= 0 && score <= 600 ? "V1" : null;
},
strategyV2: function (score) {
return score >= 0 && score <= 600 ? "V1" : null;
},
strategyV3: function (score) {
return score >= 0 && score <= 600 ? "V1" : null;
},
strategyV4: function (score) {
return score >= 0 && score <= 600 ? "V1" : null;
},
};
*/
// const levelMap = {};
// for (let strategy in scoreStrategies) {
// const level = scoreStrategies(strategy)(score);
// if (level) {
// return level;
// }
// }
// console.error(`score=${score},无法确定等级`);
// return "无法确定等级";
}

@ -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;

@ -1,7 +1,7 @@
/* start--微信小程序编译后页面有组件名的元素,特别处理--start */
/* #ifdef MP-WEIXIN || MP-QQ */
u-td, u-th {
flex: 1;
// flex: 1;
align-self: stretch;
}

Loading…
Cancel
Save