master
lion 1 year ago
parent 82706cdf2f
commit aa0051a184

@ -25,7 +25,8 @@ let apiApp = {
// 预约
scheduleIndex: '/api/mobile/schedule/index',
scheduleSave: '/api/mobile/schedule/save',
scheduleDetail: '/api/mobile/schedule/detail',
scheduleDetail: '/api/mobile/schedule/detail',
scheduleCheck:'/api/mobile/schedule/check',
// 其他
otherConfig: '/api/mobile/other/config',
otherBanner: '/api/mobile/other/banner',
@ -63,7 +64,8 @@ const install = (Vue, vm) => {
// 预约
let scheduleIndex = (params = {}) => vm.$u.get(apiApp.scheduleIndex, params);
let scheduleSave = (params = {}) => vm.$u.post(apiApp.scheduleSave, params);
let scheduleDetail = (params = {}) => vm.$u.get(apiApp.scheduleDetail, params);
let scheduleDetail = (params = {}) => vm.$u.get(apiApp.scheduleDetail, params);
let scheduleCheck = (params = {}) => vm.$u.get(apiApp.scheduleCheck, params);
// 其他
let otherConfig = (params = {}) => vm.$u.get(apiApp.otherConfig, params);
@ -106,6 +108,7 @@ const install = (Vue, vm) => {
scheduleIndex,
scheduleSave,
scheduleDetail,
scheduleCheck,
// 资讯
courseNews,
// 其他

@ -23,8 +23,8 @@ const install = (Vue, vm) => {
// 请求拦截部分,如配置,每次请求前都会执行
Vue.prototype.$u.http.interceptor.request = (config) => {
console.log('config-http', config)
let stbc_lifeData = uni.getStorageSync('stbc_lifeData')
let vuex_token = stbc_lifeData.vuex_token;
let stbc1_lifeData = uni.getStorageSync('stbc1_lifeData')
let vuex_token = stbc1_lifeData.vuex_token;
if (vuex_token || vm.vuex_token) {
config.header['Authorization'] = `Bearer ${vuex_token || vm.vuex_token}`;
}
@ -43,7 +43,7 @@ const install = (Vue, vm) => {
confirmText: '重新获取',
success: function(res) {
if (res.confirm) {
uni.removeStorageSync('stbc_lifeData')
uni.removeStorageSync('stbc1_lifeData')
uni.login({
provider: 'weixin',
success: (res) => {
@ -56,7 +56,7 @@ const install = (Vue, vm) => {
},
method: 'GET',
success: result => {
uni.setStorageSync("stbc_lifeData", {'vuex_token': result.data.token})
uni.setStorageSync("stbc1_lifeData", {'vuex_token': result.data.token})
uni.request({
url: baseUrl + "/api/mobile/user/get-user-info",
header:{
@ -66,7 +66,7 @@ const install = (Vue, vm) => {
},
method: 'GET',
success: result1 => {
uni.setStorageSync("stbc_lifeData", {
uni.setStorageSync("stbc1_lifeData", {
'vuex_token': result.data.token,
"vuex_user" : result1.data.user
})

@ -103,7 +103,7 @@
},
onReady() {
// this.$refs.uForm.setRules(this.rules);
let token = uni.getStorageSync("stbc_lifeData").vuex_token
let token = uni.getStorageSync("stbc1_lifeData").vuex_token
console.log("token", token)
this.formData = {
token: token

@ -4,6 +4,9 @@
<image class="next-search-img" :src="nextSearchImgSrc"></image>
<input class="next-input" @input="search" v-model="searchStr" placeholder="请输入搜索信息" maxlength="50"
placeholder-class="next-placeholder" />
</view>
<view class="tips">
按照姓名首字母顺序排列,排名不分先后
</view>
<scroll-view @scroll="scrollCallback" class="next-scroll-left" scroll-y="true" :scroll-with-animation="true"
:scroll-into-view="scrollIntoView">
@ -23,15 +26,24 @@
<view class="left-item-card-info"
:style="inx<item.length-1?'border-bottom: solid #F4F4F4 1rpx;':''">
<slot v-if="$slots.name" name="name" :data="mess"></slot>
<view v-else class="left-item-card-name">
<text>{{mess.name}}</text>
<text class="courseName"
v-if="mess.course_signs.length>0">{{mess.course_signs[0]['course'].name}}</text>
</view>
<slot v-if="$slots.phone" name="phone" :data="mess"></slot>
<view class="left-item-card-phone" v-else-if="mess[phoneKey]">{{mess[phoneKey]}}</view>
<view>{{mess['company_name']||''}}</view>
<view>{{mess['company_position']||''}}</view>
<view v-else class="left-item-card-name">
<view>
<text style="font-size:32rpx;color:#000">{{mess.name}}</text>
<!-- <text class="courseName"
v-if="mess.course_signs.length>0 && mess.course_signs[0]['position']">
{{mess.course_signs[0]['position']}}</text> -->
</view>
<!-- <view>
<text class="courseName"
v-if="mess.course_signs.length>0">{{mess.course_signs[0]['course'].name}}</text>
</view> -->
</view>
<!-- <slot v-if="$slots.phone" name="phone" :data="mess"></slot> -->
<!-- <view class="left-item-card-phone" v-else-if="mess[phoneKey]">{{mess[phoneKey]}}</view> -->
<view style="font-size:28rpx;color:#666;margin-bottom:10rpx">{{mess['company_name']||''}}</view>
<!-- <view>{{mess['company_position']||''}}</view> -->
<view style="font-size:24rpx;color:#999;margin-bottom:10rpx">如需联系方式请联系班主任</view>
</view>
</view>
<!-- <view class="wrap-item">
@ -49,7 +61,7 @@
<view class="no-data-name">暂无数据</view>
</view>
</scroll-view>
<view class="next-scroll-right" v-if="hasData">
<view class="next-scroll-right" v-if="false">
<image class="next-scroll-right-top" :src="nextScrollRightTopSrc" @click.stop="scrollTop"></image>
<view :class="{'next-scroll-right-name':true,'next-scroll-right-select':item==scrollIntoViewCopy}"
v-for="(item,index) in scrollRightList" :key="index" @click.stop="chooseType(item)">{{item}}
@ -128,20 +140,20 @@
created() {
this.$watch(() => this.dataList, (newList) => {
if (newList && newList.length) this.cleanData(newList)
if (this.isInterlock) {
this.$nextTick(() => {
Object.keys(this.scrollRightList).map(key => {
const query = uni.createSelectorQuery().in(this).select(
`#item${this.scrollRightList[key]}`);
query && query.boundingClientRect(res => {
const {
top
} = res
position[this.scrollRightList[key]] = top
}).exec()
})
})
}
// if (this.isInterlock) {
// this.$nextTick(() => {
// Object.keys(this.scrollRightList).map(key => {
// const query = uni.createSelectorQuery().in(this).select(
// `#item${this.scrollRightList[key]}`);
// query && query.boundingClientRect(res => {
// const {
// top
// } = res
// position[this.scrollRightList[key]] = top
// }).exec()
// })
// })
// }
}, {
immediate: true,
deep: true,
@ -270,11 +282,19 @@
<style lang="scss" scoped>
.next-list {
width: 100%;
height: calc(100vh - 160rpx);
// height: calc(100vh - 160rpx);
// background-color: #F4F4F4;
box-sizing: border-box;
padding-top: 1px;
.tips{
font-size: 24rpx;
text-align: left;
padding-left:30rpx;
color:#999999;
margin-bottom:30rpx;
border-bottom:1rpx solid #cfd5d9;
padding-bottom:20rpx;
}
.next-search {
width: 100%;
height: 106rpx;
@ -311,7 +331,7 @@
}
.next-scroll-left {
height: 100%;
// height: 100%;
// padding-top: 106rpx;
.left-list {

@ -121,9 +121,10 @@
},
panelReset() {
this.index = 0;
this.plate = Array.from({
length: 8
}, v => '');
// this.plate = Array.from({
// length: 8
// }, v => '');
this.plate = ['苏', 'E', '', '', '', '', '']
this.newEnergy = false;
},
}

@ -133,7 +133,7 @@
onLoad(options) {
this.course_id = options.id
this.getCourseDetail(options.id)
let user = uni.getStorageSync("stbc_lifeData") ? uni.getStorageSync("stbc_lifeData").vuex_user : {}
let user = uni.getStorageSync("stbc1_lifeData") ? uni.getStorageSync("stbc1_lifeData").vuex_user : {}
this.form = user
this.getPosition()
},

@ -10,8 +10,8 @@
<u-form-item label="性别" prop="sex" required>
<u-input @click="showSex = true" placeholder="请选择性别" v-model="form.sex" type="select" />
</u-form-item>
<u-form-item label="身份证号" prop="idcard" required>
<u-input type="idcard" placeholder="请输入身份证号" v-model="form.idcard" /></u-form-item>
<!-- <u-form-item label="身份证号" prop="idcard" required>
<u-input type="idcard" placeholder="请输入身份证号" v-model="form.idcard" /></u-form-item> -->
<u-form-item label="联系方式" prop="mobile" required>
<u-input type="number" placeholder="请输入联系方式" v-model="form.mobile" />
</u-form-item>
@ -102,17 +102,17 @@
message: '手机号码不正确',
trigger: ['blur'],
}],
idcard: [{
required: true,
message: '请输入身份证号',
trigger: ['blur'],
}, {
validator: (rule, value, callback) => {
return this.$u.test.idCard(value);
},
message: '身份证号不正确',
trigger: ['blur'],
}],
// idcard: [{
// required: true,
// message: '',
// trigger: ['blur'],
// }, {
// validator: (rule, value, callback) => {
// return this.$u.test.idCard(value);
// },
// message: '',
// trigger: ['blur'],
// }],
email: [{
required: true,
message: '请输入邮箱',
@ -133,7 +133,7 @@
onLoad(options) {
this.course_id = options.id
this.getCourseDetail(options.id)
let user = uni.getStorageSync("stbc_lifeData") ? uni.getStorageSync("stbc_lifeData").vuex_user : {}
let user = uni.getStorageSync("stbc1_lifeData") ? uni.getStorageSync("stbc1_lifeData").vuex_user : {}
this.form = user
this.getPosition()
},

@ -0,0 +1,306 @@
<template>
<view class="container">
<image class="cbg" :src="base.imgHost('common_bg.png')"></image>
<view class="book-top">
<text class="book-top-line"></text>
<image :src="base.imgHost('book-top.png')"></image>
</view>
<view class="book">
<view class="book-pic">
<block v-for="(item,index) in siteList">
<view class="book-pic-item">
<block v-if="item.image.length>0">
<swiper circular :indicator-dots="item.image.length>1?true:false"
indicator-active-color="#b79373" indicator-color="#fff" style="height:350rpx"
:autoplay="false">
<swiper-item v-for="file in item.image">
<image :src="file.url" />
</swiper-item>
</swiper>
<view class="book-pic-item-book">
<view>{{item.name}}</view>
<view @click="toUrl(item.id)" v-if="item.is_book" class="book-pic-item-book-submit">
预约
</view>
</view>
<view class="book-pic-item-introduce" v-if="item.introduce">{{item.introduce}}</view>
<view v-if="item.floor" class="book-pic-item-info">
<image style="width:20rpx;height:26rpx;margin-right:30rpx"
:src="base.imgHost('book-address.png')"></image>
<view class="book-pic-item-info-between">
<text></text>
<text></text>
</view>
<view>{{item.floor}}</view>
</view>
<view v-if="item.start_time" class="book-pic-item-info">
<image style="width:24rpx;height:24rpx;margin-right:26rpx"
:src="base.imgHost('book-time.png')"></image>
<text></text>
<view class="book-pic-item-info-between">
<text></text>
<text></text>
</view>
<view>{{item.start_time}}-{{item.end_time}}</view>
</view>
<view v-if="item.total" class="book-pic-item-info">
<image style="width:29rpx;height:21rpx;margin-right:21rpx"
:src="base.imgHost('book-people.png')"></image>
<view class="book-pic-item-info-between">
<text>容纳</text>
<text>人数</text>
</view>
<view>{{item.total}}</view>
</view>
</block>
<block v-else>
<swiper circular :indicator-dots="false" indicator-active-color="#b79373"
indicator-color="#fff" style="height:350rpx" :autoplay="false">
<swiper-item>
<image :src="base.imgHost('index_swiper.png')" />
</swiper-item>
</swiper>
<view class="book-pic-item-book">
<view>{{item.name}}</view>
<view @click="toUrl(item.id)" v-if="item.is_book" class="book-pic-item-book-submit">
预约
</view>
</view>
<view v-if="item.introduce">{{item.introduce}}</view>
<view v-if="item.floor" class="book-pic-item-info">
<image style="width:20rpx;height:26rpx;margin-right:30rpx"
:src="base.imgHost('book-address.png')"></image>
<view class="book-pic-item-info-between">
<text></text>
<text></text>
</view>
<view>{{item.floor}}</view>
</view>
<view v-if="item.start_time" class="book-pic-item-info">
<image style="width:24rpx;height:24rpx;margin-right:26rpx"
:src="base.imgHost('book-time.png')"></image>
<view class="book-pic-item-info-between">
<text></text>
<text></text>
</view>
<view>{{item.start_time}}-{{item.end_time}}</view>
</view>
<view v-if="item.total" class="book-pic-item-info">
<image style="width:29rpx;height:21rpx;margin-right:21rpx"
:src="base.imgHost('book-people.png')"></image>
<view class="book-pic-item-info-between">
<text>容纳人数</text>
</view>
<view>{{item.total}}</view>
</view>
</block>
</view>
</block>
</view>
</view>
<tabbar :currentPage="2"></tabbar>
</view>
</template>
<script>
import tabbar from '@/components/tabbar/tabbar.vue';
export default {
components: {
tabbar
},
data() {
return {
user: {},
can_appointment: false,
is_schoolmate: 0,
door_appointments: false, //
siteList: []
}
},
onShareAppMessage() {
return {
title: "苏州科技商学院",
imageUrl: "/static/share.jpg"
}
},
onShareTimeline() {
return {
title: "苏州科技商学院",
imageUrl: "/static/share.jpg"
}
},
onShow() {
this.getUser()
},
onLoad() {
this.getSites()
},
methods: {
//
getSites() {
this.$u.api.otherConfig().then(res => {
this.siteList = this.base.deepCopy(res.appointment_type)
this.siteList = this.siteList.sort((a, b) => {
a.sort - b.sort
})
})
},
getUser() {
this.$u.api.user().then(res => {
this.is_schoolmate = res.user.is_schoolmate
if (res.user.appointment_total - res.user.pass_appointments > 0) {
this.can_appointment = true
} else {
this.can_appointment = false
}
this.door_appointments = res.door_appointments ? true : false
this.$u.vuex('vuex_user', res.user)
})
},
toUrl(type) {
if (!this.is_schoolmate) {
this.base.toast("您还不是校友,还不能享有该权益")
return
}
if (!this.can_appointment) {
this.base.toast("您当前没有可预约次数")
return
}
if (this.door_appointments) {
this.base.toast("您当前已有预约")
return
}
uni.navigateTo({
url: '/packages/booksubmit/index?type=' + type
})
}
},
}
</script>
<style scoped lang="scss">
.container {
width: 100%;
height: 100vh;
padding-bottom: 200rpx;
.cbg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100vh;
}
.book-top {
position: relative;
padding: 80rpx 0 60rpx 0;
image {
width: 539rpx;
height: 88rpx;
display: block;
margin: 0 auto;
}
text {
width: 1rpx;
height: 220rpx;
background-color: #271f8e;
display: block;
position: absolute;
top: 50rpx;
left: 60rpx;
z-index: 99;
}
}
.book {
position: relative;
padding: 0 30rpx;
height: calc(100vh - 400rpx);
overflow: scroll;
&-block {
display: flex;
align-items: center;
justify-content: space-between;
image {
width: 330rpx;
height: 126rpx;
}
}
&-pic {
&-item {
font-size: 0;
border-radius: 10rpx;
margin-bottom: 30rpx;
background-color: #fff;
padding-bottom: 30rpx;
image {
width: 100%;
height: 350rpx;
border-radius: 10rpx 10rpx 0 0;
}
&-book {
font-size: 32rpx;
color: #000;
display: flex;
align-items: center;
justify-content: space-between;
padding: 30rpx;
&-submit {
font-size: 24rpx;
color: #fff;
background: linear-gradient(to right, #e4cdb4, #c69c6d);
border-radius: 30rpx;
padding: 10rpx 30rpx;
}
}
&-introduce {
font-size: 28rpx;
color: #999;
padding: 30rpx;
padding-top: 0
}
&-info {
display: flex;
align-items: center;
margin-bottom: 10rpx;
padding: 0 30rpx;
font-size: 28rpx;
color: #000;
&>view{
margin-right:10rpx;
}
&-between {
width: 135rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
// text{
// margin-right:10rpx;
// }
}
}
}
}
}
</style>

@ -16,6 +16,10 @@
<u-form-item label="预约事项" prop="content" required>
<u-input :placeholder="'请输入预约事项'" v-model="form.content" type="textarea" />
</u-form-item>
<u-form-item label="身份证号" prop="idcard" required>
<u-input :placeholder="'请输入身份证号'" v-model="form.idcard" type="idcard" />
</u-form-item>
<u-form-item label="车牌" prop="plate">
<u-button size="mini" type="primary" @click="openPlate(-1)"></u-button>
<view v-for="(item,index) in plateList">
@ -62,7 +66,7 @@
<u-popup v-model="showPlate" mode="bottom">
<view class="modal-tip">车牌号</view>
<view class="modal-content" style="height:400rpx">
<plate @listenPlateChange="(val)=>{plateChange(val,index)}" :defaultPlate="plateNumber" />
<plate ref="plates" @listenPlateChange="(val)=>{plateChange(val,index)}" :defaultPlate="plateNumber" />
</view>
<view class="form-btn" @click="confirmPlate">
<view type="primary">确认</view>
@ -104,7 +108,8 @@
return {
dateShow: false,
hMin:0,
hMax:24,
hMax:24,
appoinementType:'',
dateParams: {
year: true,
month: true,
@ -148,6 +153,17 @@
required: true,
message: '请输入预约事项',
trigger: ['change', 'blur'],
}],
idcard: [{
required: true,
message: '请输入身份证号',
trigger: ['blur'],
}, {
validator: (rule, value, callback) => {
return this.$u.test.idCard(value);
},
message: '身份证号不正确',
trigger: ['blur'],
}],
timeRange: [{
required: true,
@ -158,7 +174,8 @@
required: true,
message: '请选择预约场地',
trigger: ['change', 'blur'],
}]
}],
},
@ -167,10 +184,19 @@
onReady() {
this.$refs.uForm.setRules(this.rules);
},
onLoad() {
onLoad(options) {
this.appoinementType = options.type?options.type:''
this.getUser()
this.getSites()
},
methods: {
methods: {
getUser() {
this.$u.api.user().then(res => {
console.log("res", res)
this.form.idcard = res.user.idcard
this.$u.vuex('vuex_user', res.user)
})
},
//
dateConfirm(e) {
console.log("date", e)
@ -193,8 +219,15 @@
},
//
getSites() {
this.$u.api.otherConfig().then(res => {
this.siteList = res.appointment.filter(item=>item.status===1)
this.$u.api.otherConfig({
appointment_type_id:this.appoinementType
}).then(res => {
this.siteList = res.appointment.filter(item=>item.status===1)
if(this.siteList.length===0){
this.base.toast("当前没有场地可以预约")
}else{
this.siteList = this.siteList.sort((a, b) => a['sort'] - b['sort']);
}
})
},
siteConfirm(e) {
@ -236,9 +269,23 @@
this.plateList.splice(index,1)
},
confirmPlate(){
console.log("this.plateList[this.plateIndex]",this.plateList[this.plateIndex])
console.log(this.plateList[this.plateIndex]['plate'])
console.log(this.plateList[this.plateIndex]['plate'].length<7)
if(!this.plateList[this.plateIndex]){
this.base.toast("请输入车牌号")
return
}
if(this.base.isNull(this.plateList[this.plateIndex]['plate'])
|| this.plateList[this.plateIndex]['plate'].length<7){
this.base.toast("请输入正确的车牌号")
return
}
this.showPlate=false
this.plateList[this.plateIndex]['show'] = true
this.plateIndex= -1
this.$refs.plates.panelReset()
this.plateNumber = ['苏', 'E', '', '', '', '', '']
},
//
@ -286,7 +333,12 @@
},
submit() {
let start_time = ''
let end_time = ''
let end_time = ''
// this.$u.api.scheduleCheck({
// site:this.siteList[e[0]].id
// }).then(res=>{
// console.log("res",res)
// })
this.$refs.uForm.validate(valid => {
if (valid) {
start_time = this.form.date + ' ' + this.form.start_time + ':00'

@ -1,31 +1,35 @@
<template>
<view class="container">
<image class="cbg" :src="base.imgHost('course-bg.png')"></image>
<view class="detail">
<view class="detail-title">{{info.name}}</view>
<view class="detail-time" v-if="info.start_date">
<u-icon name="clock"></u-icon>
<text>开课日期{{info.start_date}} {{info.end_date}}</text>
<view v-if="!hasImg"></view>
<view v-else>
<view class="detail">
<!-- <view class="detail-title">{{info.name}}</view>
<view class="detail-time" v-if="info.start_date">
<u-icon name="clock"></u-icon>
<text>开课日期{{info.start_date}} {{info.end_date}}</text>
</view> -->
<block v-if="imgList.length>0">
<view v-for="item in imgList">
<image mode="widthFix" :src="item.url"></image>
</view>
</block>
<block v-else>
<view class="detail-noinfo">
<image mode="widthFix" :src="base.imgHost('mycourse-status.png')"></image>
<text>课程详情敬请期待...</text>
</view>
</block>
</view>
<block v-if="imgList.length>0">
<view v-for="item in imgList">
<image mode="widthFix" :src="item.url"></image>
</view>
</block>
<block v-else>
<view class="detail-noinfo">
<image mode="widthFix" :src="base.imgHost('mycourse-status.png')"></image>
<text>课程详情敬请期待...</text>
<view class="detail-btn" v-if="info.sign_status===10">
<view @click="toApply">
<image class="course-btn" :src="base.imgHost('course-btn.png')"></image>
<text>我要报名</text>
</view>
</block>
</view>
<view class="detail-btn" v-if="info.status===1&&info.course_status===30">
<view @click="toApply">
<image class="course-btn" :src="base.imgHost('course-btn.png')"></image>
<text>我要报名</text>
</view>
</view>
<tabbar :currentPage="1"></tabbar>
<view class="modal">
<u-popup v-model="showRegister" mode="bottom">
@ -63,7 +67,8 @@
course_id: '',
info: {},
imgList: [],
showRegister: false
showRegister: false,
hasImg: false,
}
},
@ -73,21 +78,21 @@
title: this.info.name,
imageUrl: '/static/share.jpg'
}
},
onShareTimeline() {
return {
path: "/packages/course/detail?id=" + this.course_id, // onload(data){let id=data.id;}
title: this.info.name,
imageUrl: '/static/share.jpg'
}
},
onShareTimeline() {
return {
path: "/packages/course/detail?id=" + this.course_id, // onload(data){let id=data.id;}
title: this.info.name,
imageUrl: '/static/share.jpg'
}
},
onLoad(options) {
this.course_id = options.id
let token = uni.getStorageSync('stbc_lifeData') ? uni.getStorageSync('stbc_lifeData').vuex_token : ''
let token = uni.getStorageSync('stbc1_lifeData') ? uni.getStorageSync('stbc1_lifeData').vuex_token : ''
if (this.base.isNull(token)) {
this.getToken()
} else {
let user = uni.getStorageSync("stbc_lifeData") ? uni.getStorageSync("stbc_lifeData").vuex_user : {}
let user = uni.getStorageSync("stbc1_lifeData") ? uni.getStorageSync("stbc1_lifeData").vuex_user : {}
if (!this.base.isNull(user.mobile)) {
this.hasMobile = true
} else {
@ -96,6 +101,9 @@
this.getCourseDetail(this.course_id)
}
},
onHide() {
this.showRegister = false
},
methods: {
async getToken() {
let that = this
@ -105,7 +113,7 @@
this.$u.api.login({
code: res.code
}).then(res1 => {
uni.setStorageSync("stbc_lifeData", {
uni.setStorageSync("stbc1_lifeData", {
'vuex_token': res1.token
})
uni.request({
@ -115,7 +123,7 @@
},
method: "GET",
success(res2) {
uni.setStorageSync("stbc_lifeData", {
uni.setStorageSync("stbc1_lifeData", {
'vuex_token': res1.token,
"vuex_user": res2.data.user
})
@ -140,7 +148,6 @@
});
},
async getCourseDetail(id) {
const res = await this.$u.api.courseDetail({
course_id: id
})
@ -148,13 +155,34 @@
if (res.publicize && res.publicize.length > 0) {
this.imgList = res.publicize
}
this.hasImg = true
uni.setNavigationBarTitle({
title: res.name,
success: function() {
console.log('标题设置成功');
},
fail: function(err) {
console.error('标题设置失败', err);
}
});
},
//
//
//
toApply() {
//
let that = this
if (this.info.my_user) {
this.base.toast("您已报名该课程", 2000, function() {
setTimeout(function() {
uni.navigateTo({
url: '/packages/mycourse/detail?id=' + that.info.id
})
}, 1500)
})
return
}
// total
//
if (!this.info.is_fee && (this.info.total && this.info.total > 0)) {
//
@ -175,7 +203,6 @@
},
//
goBind() {
console.log("qwe")
uni.navigateTo({
url: '/packages/register/login?id=' + this.course_id
})
@ -209,9 +236,9 @@
width: 100%;
height: 100vh;
overflow: scroll;
padding: 40rpx 80rpx;
// padding: 40rpx 80rpx;
position: relative;
padding-bottom: 340rpx;
padding-bottom: 115rpx;
image {
width: 100%;
@ -282,47 +309,47 @@
}
}
.modal {
::v-deep .u-drawer-bottom {
border-radius: 40rpx;
}
&-tip {
text-align: center;
padding: 30rpx;
font-size: 32rpx;
}
&-content {
height: 450rpx;
padding: 0 30rpx;
font-size: 32rpx;
text-align: center;
&>view {
margin: 30rpx auto;
}
}
&-bind {
width: 45%;
text-align: center;
margin: 0 auto;
color: #fff;
border-radius: 30rpx;
padding: 20rpx;
background: linear-gradient(to right, #e4cdb4, #c69c6d);
}
&-register {
width: 45%;
text-align: center;
margin: 0 auto;
color: #fff;
border-radius: 30rpx;
padding: 20rpx;
background: linear-gradient(to right, #5e5fbc, #0d0398);
}
.modal {
::v-deep .u-drawer-bottom {
border-radius: 40rpx;
}
&-tip {
text-align: center;
padding: 30rpx;
font-size: 32rpx;
}
&-content {
height: 450rpx;
padding: 0 30rpx;
font-size: 32rpx;
text-align: center;
&>view {
margin: 30rpx auto;
}
}
&-bind {
width: 45%;
text-align: center;
margin: 0 auto;
color: #fff;
border-radius: 30rpx;
padding: 20rpx;
background: linear-gradient(to right, #e4cdb4, #c69c6d);
}
&-register {
width: 45%;
text-align: center;
margin: 0 auto;
color: #fff;
border-radius: 30rpx;
padding: 20rpx;
background: linear-gradient(to right, #5e5fbc, #0d0398);
}
}
}
</style>

@ -9,14 +9,15 @@
<u-form-item label="性别" prop="sex">
{{form.sex}}
</u-form-item>
<u-form-item label="联系方式" prop="mobile">
<u-input type="number" border placeholder="请输入联系方式" v-model="form.mobile" />
</u-form-item>
<u-form-item label="身份证号" prop="idcard">
{{form.idcard}}
<u-input type="idcard" border placeholder="请输入身份证号" v-model="form.idcard" />
</u-form-item>
<u-form-item label="出生日期" prop="birthday">
{{form.birthday}}
</u-form-item>
<u-form-item label="联系方式" prop="mobile">
<u-input type="number" border placeholder="请输入联系方式" v-model="form.mobile" />
<u-input @click="dateShow=true" placeholder="请选择出生日期" v-model="form.birthday"
type="select" /></u-form-item>
</u-form-item>
<u-form-item label="邮箱" prop="email">
<u-input v-model="form.email" border placeholder="请输入邮箱" /></u-form-item>
@ -28,17 +29,18 @@
placeholder="请选择职务" />
</u-form-item>
<u-form-item label="车牌" prop="plate">
<view style="display: flex;align-items: center;justify-content: space-between;">
<view v-if="plateList.length>0">
<view v-for="item in plateList">
{{item}}
<u-icon color="red" style="margin-left:20rpx" @click="delPlate(index)" name="close"></u-icon>
</view>
</view>
<u-button size="mini" type="primary" v-if="plateList.length<2" @click="addPlate"></u-button>
<u-form-item label="车牌" prop="plate">
<view style="display: flex;align-items: center;justify-content: space-between;">
<view v-if="plateList.length>0">
<view v-for="item in plateList">
{{item}}
<u-icon color="red" style="margin-left:20rpx" @click="delPlate(index)"
name="close"></u-icon>
</view>
</view>
<u-button size="mini" type="primary" v-if="plateList.length<2" @click="addPlate"></u-button>
</view>
</u-form-item>
</u-form>
@ -54,7 +56,7 @@
<view class="modal-tip">绑定车牌号</view>
<view class="modal-content" style="height:400rpx">
<view>
<plate @listenPlateChange="plateChange" :defaultPlate="plateNumber" />
<plate ref="plates" @listenPlateChange="plateChange" :defaultPlate="plateNumber" />
</view>
</view>
<view class="form-btn">
@ -78,8 +80,8 @@
return {
showPosition: false,
positionList: [],
form: {
form: {
},
plateList: [],
showPark: false,
@ -97,11 +99,19 @@
message: '手机号码不正确',
trigger: ['blur'],
}],
email: [{
required: true,
message: '请输入邮箱',
idcard: [{
validator: (rule, value, callback) => {
console.log("value", value, this.base.isNull(value))
if (!this.base.isNull(value)) {
return this.$u.test.idCard(value);
} else {
return true
}
},
message: '身份证号不正确',
trigger: ['blur'],
}, {
}],
email: [{
validator: (rule, value, callback) => {
return this.$u.test.email(value);
},
@ -136,7 +146,7 @@
getUserInfo() {
this.$u.api.user().then(res => {
console.log("res", res)
// this.form = this.base.requestToForm(res.user, this.form)
// this.form = this.base.requestToForm(res.user, this.form)
this.form = this.base.deepCopy(res.user)
if (res.user.plate) {
this.plateList = res.user.plate.split(',')
@ -156,34 +166,36 @@
}
// this.plateList.push('')
this.showPark = true
},
delPlate(index){
this.plateList.splice(index,1)
this.saveUser('del')
},
delPlate(index) {
this.plateList.splice(index, 1)
this.saveUser('del')
},
changeMobile() {
},
plateChange(val){
this.plate1 = val.join('')
},
plateChange(val) {
this.plate1 = val.join('')
},
saveUser(type) {
if (type == 'add') {
console.log("this.plate1",this.plate1)
if(this.plate1.length<7){
this.base.toast("车牌号不正确")
return
}
if(this.plateList.indexOf(this.plate1)!==-1){
this.base.toast("车牌号不能重复")
return
if (type == 'add') {
console.log("this.plate1", this.plate1)
if (this.base.isNull(this.plate1) || this.plate1.length < 7) {
this.base.toast("车牌号不正确")
return
}
if (this.plateList.indexOf(this.plate1) !== -1) {
this.base.toast("车牌号不能重复")
return
}
this.plateList.push(this.plate1)
this.form.plate = this.plateList.join(",")
}
if(type=='del'){
this.form.plate = this.plateList.join(",")
}
if (type == 'del') {
this.form.plate = this.plateList.join(",")
}
console.log("plateList", this.plateList)
let that = this
@ -191,25 +203,26 @@
if (valid) {
this.$u.api.saveUser(this.form).then(res => {
this.showPark = false
this.plate1 = ''
let toastTitle = "更新用户信息成功"
if(type==='add'){
toastTitle = "新增车牌成功"
}else if(type==='del'){
toastTitle = "删除车牌成功"
}else{
toastTitle = "更新用户信息成功"
this.plate1 = ''
let toastTitle = "更新用户信息成功"
if (type === 'add') {
toastTitle = "新增车牌成功"
} else if (type === 'del') {
toastTitle = "删除车牌成功"
} else {
toastTitle = "更新用户信息成功"
}
this.$refs.plates.panelReset()
this.base.toast(toastTitle, 2000, function() {
if (type === 'add' || type==='del') {
if (type === 'add' || type === 'del') {
that.getUserInfo()
} else {
setTimeout(function(){
uni.switchTab({
url: '/pages/me/index'
})
},2000)
} else {
setTimeout(function() {
uni.switchTab({
url: '/pages/me/index'
})
}, 2000)
}
})

@ -17,7 +17,9 @@
场地预约
</view>
<view>
<text :class="{'success':item.status===1,'warn':item.status>1}">{{item.status_text}}</text>
<text :class="{'success':item.status===1,'warn':item.status>1}">
{{statusList[item.status]}}
</text>
</view>
</view>
<view class="list-item-middle">
@ -64,7 +66,14 @@
current_page: 1,
total_page: 0,
load_status: '',
book_list: [],
book_list: [],
statusList:{
0:'待审核',
1:'通过',
2:'审核不通过',
3:'已取消',
}
}
},
onLoad() {

@ -69,7 +69,7 @@
},
onLoad(options) {
this.course_id = options.id
let token = uni.getStorageSync('stbc_lifeData') ? uni.getStorageSync('stbc_lifeData').vuex_token : ''
let token = uni.getStorageSync('stbc1_lifeData') ? uni.getStorageSync('stbc1_lifeData').vuex_token : ''
this.header.Authorization = `Bearer ${token}`
this.getCourseDetail(options.id)

@ -6,11 +6,11 @@
<view class="wrap-status">
<view v-if="info.status===0">
<view class="wrap-status-name">{{userInfo.username}}:</view>
<view class="wrap-status-content">{{wait_tip}}</view>
<view class="wrap-status-content">{{info.reason?info.reason:wait_tip}}</view>
</view>
<view v-else-if="info.status===1">
<view class="wrap-status-name">{{userInfo.username}}:</view>
<view class="wrap-status-content">{{pass_tip}}</view>
<view class="wrap-status-content">{{info.reason?info.reason:pass_tip}}</view>
<!-- v-if="courseInfo.is_fee===1 && info.fee_status!=1" -->
<view class="wrap-status-btn">
<view @click="toPay" v-if="courseInfo.is_fee===1 && info.fee_status!=1"></view>
@ -19,11 +19,11 @@
</view>
<view v-else-if="info.status===2">
<view class="wrap-status-name">{{userInfo.username}}:</view>
<view class="wrap-status-content">{{fault_tip}}</view>
<view class="wrap-status-content">{{info.reason?info.reason:fault_tip}}</view>
</view>
<view v-else-if="info.status===3">
<view class="wrap-status-name">{{userInfo.username}}:</view>
<view class="wrap-status-content">{{back_tip}}</view>
<view class="wrap-status-content">{{info.reason?info.reason:back_tip}}</view>
</view>
</view>
<view class="wrap-img">

@ -2,27 +2,49 @@
<view class="container">
<image class="cbg" :src="base.imgHost('common_bg.png')"></image>
<view class="wrap">
<view v-if="teacher">
<view class="teacher">
<view>
<image style="width:97rpx;height:97rpx;margin-right:30rpx" :src="base.imgHost('txl-teacher.png')"></image>
</view>
<view>
<view class="teacher-name">
<view style="display: flex;align-items: center;">
<text>{{teacher.name}}</text>
<text class="courseName">班主任</text>
</view>
</view>
<view class="teacher-mobile">
<image style="width:22rpx;height:22rpx;margin-right:20rpx" :src="base.imgHost('txl-phone.png')"></image>
<view>{{teacher.mobile?teacher.mobile:''}}</view>
</view>
</view>
</view>
</view>
<!-- <view v-if="teacher">
<view class="teacher">
<view>
<image style="width:97rpx;height:97rpx;margin-right:30rpx" :src="base.imgHost('txl-student.png')"></image>
</view>
<view>
<view class="teacher-name">
<view style="display: flex;align-items: center;">
<text>{{teacher.name}}</text>
<text class="courseName">班主任</text>
</view>
</view>
<view class="teacher-company">苏州朗业网络科技有限公司</view>
<view class="teacher-mobile">
<image style="width:22rpx;height:22rpx;margin-right:20rpx" :src="base.imgHost('txl-phone.png')"></image>
<view>{{teacher.mobile?teacher.mobile:''}}</view>
</view>
</view>
</view>
</view> -->
<view v-if="list.length>0">
<nextIndexedXlist :dataList="list" :show-avatar="false">
</nextIndexedXlist>
<!-- <u-index-list :scrollTop="scrollTop" @select="selectIndex">
<view v-for="(item, index) in indexList" :key="index">
<u-index-anchor :custom-style="{background:'transparent'}" :use-slot="true">
<text class="anchor-text">{{item}}</text>
</u-index-anchor>
<block v-for="item1 in list">
<view class="wrap-item" v-if="item===item1.letter">
<view class="wrap-item-name">
<text>{{item1.username}}</text>
<text class="courseName"
v-if="item1.course_signs.length>0">{{item1.course_signs[0]['course'].name}}</text>
</view>
<view>{{item1.company_name}}</view>
<view>{{item1.company_position}}</view>
</view>
</block>
</view>
</u-index-list> -->
</view>
<view class="nodata" v-else>
<u-empty mode="data"></u-empty>
@ -40,35 +62,39 @@
},
data() {
return {
list: [],
teacher: null,
studentList:[]
}
},
onLoad(options) {
this.getMyCourseTxl(options.id)
},
methods: {
async getMyCourseTxl(id) {
const res = await this.$u.api.courseUserList({
course_id: id,
type: 2
async getMyCourseTxl(id) {
const res = await this.$u.api.courseUserList({
course_id: id,
type: 2
})
this.list = res.list
// res.list.map(item=>{
// })
this.list = res.list
this.teacher = res.teacher
},
}
}
</script>
<style scoped lang="scss">
::v-deep .next-list{
height:calc(100vh - 60rpx)
}
<style scoped lang="scss">
.container {
padding: 30rpx 60rpx;
width: 100%;
height: 100vh;
overflow: scroll;
overflow: hidden;
.cbg {
position: absolute;
@ -79,35 +105,78 @@
}
.wrap {
position: relative;
position: relative;
height:100%;
overflow: scroll;
// padding-top: 100rpx;
.nodata {
height: calc(100vh - 160rpx);
}
&-item {
margin: 30rpx 0;
.teacher {
width: 100%;
background-color: #FFFFFF;
box-sizing: border-box;
padding-left: 24rpx;
margin-bottom: 30rpx;
padding: 30rpx;
background-color: #fff;
border-radius: 20rpx;
&>view {
margin-bottom: 10rpx;
}
border-radius: 20rpx;
display: flex;
align-items: center;
&-name {
font-size: 32rpx;
color: #333;
margin-bottom: 10rpx;
.courseName {
color: #b89155;
margin: 0 10rpx;
font-size: 28rpx;
margin: 0 20rpx;
font-size: 24rpx;
border-radius: 0rpx 28rpx 28rpx 28rpx;
color: #fff;
padding:0rpx 15rpx;
background: #b89155;
}
}
&-mobile {
display: flex;
align-items: center;
color:#666666;
font-size: 28rpx;
margin-bottom: 10rpx;
}
&-company{
margin-bottom: 10rpx;
}
}
// &-item {
// margin: 30rpx 0;
// padding: 30rpx;
// background-color: #fff;
// border-radius: 20rpx;
// &>view {
// margin-bottom: 10rpx;
// }
// &-name {
// font-size: 32rpx;
// color: #333;
// .courseName {
// color: #b89155;
// margin: 0 10rpx;
// font-size: 28rpx;
// }
// }
// }
}
}
</style>

@ -9,16 +9,13 @@
<u-form-item label="性别" prop="sex" required>
<u-input @click="showSex = true" placeholder="请选择性别" v-model="form.sex" type="select" />
</u-form-item>
<u-form-item label="身份证号" prop="idcard" required>
<u-input type="idcard" placeholder="请输入身份证号"
v-model="form.idcard" /></u-form-item>
<u-form-item label="联系方式" prop="mobile" required>
<u-input type="number" placeholder="请输入联系方式"
v-model="form.mobile" />
</u-form-item>
<u-form-item label="出生日期" prop="birthday" required>
<u-form-item label="出生日期" prop="birthday">
<u-input @click="dateShow=true" placeholder="请选择出生日期" v-model="form.birthday" type="select" /></u-form-item>
<u-form-item label="邮箱" prop="email" required>
<u-form-item label="邮箱" prop="email">
<u-input v-model="form.email" placeholder="请输入邮箱"/></u-form-item>
<u-form-item label="公司名称" prop="company_name">
<u-input v-model="form.company_name" placeholder="请输入公司名称"/>
@ -75,13 +72,7 @@
required: true,
message: '请选择性别',
trigger: ['change','blur'],
}],
birthday: [{
required: true,
message: '请选择出生日期',
trigger: ['change','blur'],
}],
}],
mobile: [{
required: true,
message: '请输入联系方式',
@ -93,28 +84,13 @@
message: '手机号码不正确',
trigger: ['blur'],
}],
idcard: [{
required: true,
message: '请输入身份证号',
trigger: ['blur'],
}, {
validator: (rule, value, callback) => {
return this.$u.test.idCard(value);
},
message: '身份证号不正确',
trigger: ['blur'],
}],
email: [{
required: true,
message: '请输入邮箱',
trigger: ['blur'],
}, {
validator: (rule, value, callback) => {
return this.$u.test.email(value);
},
message: '邮箱不正确',
trigger: ['blur'],
}],
// email: [{
// validator: (rule, value, callback) => {
// return this.$u.test.email(value);
// },
// message: '',
// trigger: ['blur'],
// }],
}
}
@ -149,19 +125,20 @@
saveUser() {
let that = this
this.$refs.uForm.validate(valid => {
if (valid) {
if (valid) {
this.form.name = this.form.username
this.$u.api.saveUser(this.form).then(res => {
this.$u.api.user().then(res => {
this.$u.vuex('vuex_user', res.user)
this.base.toast("注册成功",2000,function(){
console.log("that.course_id",that.course_id)
if(that.course_id){
// uni.redirectTo({
// url:'/packages/apply/index?id='+that.course_id
// })
uni.redirectTo({
url:'/pages/course/index'
url:'/packages/course/detail?id='+that.course_id
})
// uni.redirectTo({
// url:'/pages/course/index'
// })
}else{
uni.switchTab({
url: '/pages/me/index'

@ -9,8 +9,6 @@
<u-tabs :bg-color="'#f0f7fc'" active-color="#b89155" :list="selectArr.company_industry" name="value"
:is-scroll="true" :current="current" @change="changeSearch"></u-tabs>
</view>
</view>
<view class="wrap">
@ -18,24 +16,6 @@
<view v-if="list.length>0">
<nextIndexedXlist :dataList="list" :show-avatar="false">
</nextIndexedXlist>
<!-- <u-index-list :scrollTop="scrollTop" @select="selectIndex">
<view v-for="(item, index) in indexList" :key="index">
<u-index-anchor :custom-style="{background:'transparent'}" :use-slot="true">
<text class="anchor-text">{{item}}</text>
</u-index-anchor>
<block v-for="item1 in list">
<view class="wrap-item" v-if="item===item1.letter">
<view class="wrap-item-name">
<text>{{item1.username}}</text>
<text class="courseName"
v-if="item1.course_signs.length>0">{{item1.course_signs[0]['course'].name}}</text>
</view>
<view>{{item1.company_name}}</view>
<view>{{item1.company_position}}</view>
</view>
</block>
</view>
</u-index-list> -->
</view>
<view class="nodata" v-else>
<u-empty mode="data"></u-empty>
@ -122,16 +102,8 @@
},
current: 0,
list: [],
scrollTop: 0,
indexList: ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S",
"T", "U",
"V", "W", "X", "Y", "Z", "#"
]
}
},
onPageScroll(e) {
this.scrollTop = e.scrollTop;
},
onLoad() {
this.getMyCourseTxl()
this.getIndustry()
@ -148,12 +120,6 @@
company_industry: this.select.company_industry,
type: 1
})
res.list.map(item => {
if (!item.letter) {
item.letter = "#"
item.name = item.username
}
})
this.list = res.list
this.showSearch = false
@ -274,7 +240,8 @@
.wrap {
position: relative;
padding-top: 100rpx;
height:100%;
overflow: scroll;
.nodata {
height: calc(100vh - 160rpx);
}

@ -8,20 +8,24 @@
export default{
data(){
return{
link:''
link:'',
baseUrl:'https://szsatbc2024.115.langye.net'
}
},
onLoad(options) {
// http://szsatbc2024.115.langye.net
if(options.type==1){
//
this.link = 'https://szsatbc2024.115.langye.net/about/aboutinfo/?from=wx'
this.link = this.baseUrl+'/about/aboutinfo/?from=wx'
}else if(options.type==2){
//
this.link = `https://szsatbc2024.115.langye.net/news/?from=wx`
this.link = this.baseUrl+`/news/?from=wx`
}else if(options.type==3){
//
this.link = `https://szsatbc2024.115.langye.net${options.url}?from=wx`
this.link = this.baseUrl+`${options.url}?from=wx`
}else if(options.type==4){
//
this.link = this.baseUrl+`/contact/?from=wx`
}
},
methods:{

@ -34,7 +34,7 @@
},{
"path": "course/detail",
"style": {
"navigationBarTitleText": "课程详情"
"navigationBarTitleText": ""
}
},{
"path": "register/index",
@ -57,6 +57,11 @@
"style": {
"navigationBarTitleText": "我要预约"
}
},{
"path": "booksubmit/appointment",
"style": {
"navigationBarTitleText": "场地预约"
}
},{
"path": "schoolmate/index",
"style": {

@ -1,41 +1,9 @@
<template>
<view class="container">
<image class="cbg" :src="base.imgHost('common_bg.png')"></image>
<view class="book-top">
<text class="book-top-line"></text>
<image :src="base.imgHost('book-top.png')"></image>
</view>
<view class="book">
<view class="book-pic">
<block v-for="(item,index) in siteList">
<view class="book-pic-item" v-if="item.files.length>0">
<block>
<swiper circular :indicator-dots="item.files.length>1?true:false"
indicator-active-color="#b79373"
indicator-color="#fff"
style="height:350rpx" :autoplay="false" >
<swiper-item v-for="file in item.files">
<image :src="file.url" />
</swiper-item>
</swiper>
<view>
<view>{{item.name}}</view>
<!-- <view>
<text class="colortext">{{item['current_swiper']}}</text>
<text>/{{item.files.length}}</text>
</view> -->
</view>
</block>
</view>
</block>
</view>
<view class="book-block">
<image @click="toUrl(1)" :src="base.imgHost('book-icon1.png')"></image>
<image @click="toUrl(2)" :src="base.imgHost('book-icon2.png')"></image>
</view>
</view>
<image class="cbg" :src="base.imgHost('book-bg.png')"></image>
<image class="schoolmate" @click="toUrl(2)" :src="base.imgHost('book-schoolmate.png')"></image>
<image class="book" @click="toUrl(1)" :src="base.imgHost('book-book.png')"></image>
<tabbar :currentPage="2"></tabbar>
</view>
</template>
@ -51,8 +19,7 @@
user: {},
can_appointment: false,
is_schoolmate: 0,
door_appointments: false, //
siteList:[]
door_appointments: false, //
}
},
onShareAppMessage() {
@ -71,33 +38,8 @@
this.getUser()
},
onLoad() {
this.getSites()
},
methods: {
//
getSites() {
this.$u.api.otherConfig().then(res => {
let _arr = res.appointment.filter(item=>item.status===1)
_arr.map(site=>{
site.current_swiper = 1
})
this.siteList = this.base.deepCopy(_arr)
})
},
// changeCurrent(e,item){
// console.log(e,item)
// if(e.detail.current+2>item.files.length){
// this.$set(item,'current_swiper',e.detail.current+2)
// }else{
// this.$set(item,'current_swiper',e.detail.current+2)
// }
// // item.current_swiper = e.detail.current+1
// // this.siteList[index]['current_swiper'] = e.detail.current + 1
// console.log("item.current_swiper",item.current_swiper)
// },
methods: {
getUser() {
this.$u.api.user().then(res => {
console.log("res", res)
@ -122,7 +64,7 @@
return
}
uni.navigateTo({
url: '/packages/booksubmit/index'
url: '/packages/booksubmit/appointment'
})
} else if (type === 2) {
@ -153,81 +95,24 @@
left: 0;
width: 100%;
height: 100vh;
}
.book-top {
position: relative;
padding: 80rpx 0 60rpx 0;
image {
width: 539rpx;
height: 88rpx;
display: block;
margin: 0 auto;
}
text {
width: 1rpx;
height: 220rpx;
background-color: #271f8e;
display: block;
position: absolute;
top: 50rpx;
left: 60rpx;
z-index: 99;
}
}
.book {
position: relative;
padding: 0 30rpx;
height: calc(100vh - 400rpx);
overflow: scroll;
&-block {
display: flex;
align-items: center;
justify-content: space-between;
image {
width: 330rpx;
height: 126rpx;
}
}
&-pic {
&-item {
font-size: 0;
border-radius: 10rpx;
margin-bottom: 30rpx;
image {
width: 100%;
height: 350rpx;
}
&>view {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20rpx 30rpx;
background-color: #fff;
font-size: 28rpx;
color: #000;
border-radius: 0 0 10rpx 10rpx;
text {
color: #666;
font-size: 24rpx;
}
.colortext {
color: #b79373;
}
}
}
}
}
}
.schoolmate{
width:367rpx;
height:186rpx;
position: absolute;
top: 300rpx;
left: 30rpx;
}
.book{
width:367rpx;
height:186rpx;
position: absolute;
bottom: 300rpx;
right: 30rpx;
}
}
</style>

@ -5,40 +5,32 @@
<scroll-view :scroll-y="true" @scrolltolower="scrollGet" class="list">
<topBanner :banner_list="banner_list"></topBanner>
<view v-if="hasData" style="padding-bottom: 200rpx;">
<view class="list-item"
:class="{'list-end':item.sign_date_status==='已结束','list-start':item.sign_date_status==='未开始'||item.sign_date_status==='待定'}"
v-for="item in course_list">
<!-- 10进行中 40已结束 -->
<view class="list-item" :class="{'list-end':item.sign_status===40}" v-for="item in course_list">
<view class="list-item-wrap">
<view class="list-item-wrap-time">
<view v-if="!item.sign_start_date || item.sign_date_status==='待定'">
<view class="bigFont" style="border-bottom: none;font-size: 36rpx;">
{{convertToChineseMonth(item.sign_start_date,item.sign_date_status).month}}</view>
<view class="bigFont" style="border-bottom: none;font-size: 36rpx;">
{{convertToChineseMonth(item.sign_start_date,item.sign_date_status).year}}</view>
</view>
<view v-else>
<view>{{convertToChineseMonth(item.sign_start_date).month}}</view>
<view class="bigFont">{{convertToChineseMonth(item.sign_start_date).day}}</view>
<view>{{convertToChineseMonth(item.sign_start_date).year}}</view>
<view>
<view class="list-item-wrap-time-date">
<view>{{convertToChineseMonth(item.sign_start_date).month}}</view>
<view class="bigFont">{{convertToChineseMonth(item.sign_start_date).day}}</view>
<view>{{convertToChineseMonth(item.sign_start_date).year}}</view>
</view>
<view class="list-item-wrap-time-status">报名{{item.sign_date_status}}</view>
</view>
</view>
<view class="list-item-wrap-status">
<view class="list-item-wrap-status-type">
<text>{{item.type_detail.name}}</text>
<text>{{item.is_fee===1?'付费':'公益'}}</text>
</view>
<view class="list-item-wrap-status-title">{{item.name}}</view>
<view class="list-item-wrap-status-label">
报名{{item.sign_date_status}}
<text v-if="item.sign_status===10" @click="toDetail(item)"></text>
<text v-else @click="toDetail(item)"></text>
</view>
</view>
</view>
<view class="list-item-btn">
<view @click="toDetail(item)"></view>
</view>
</view>
<!-- <u-loadmore v-if="load_status" :status="load_status" /> -->
</view>
<view class="nodata" v-else>
<u-empty mode="data"></u-empty>
@ -98,15 +90,15 @@
}
},
onShareAppMessage() {
return{
title:"苏州科技商学院",
imageUrl:"/static/share.jpg"
return {
title: "苏州科技商学院",
imageUrl: "/static/share.jpg"
}
},
onShareTimeline() {
return{
title:"苏州科技商学院",
imageUrl:"/static/share.jpg"
return {
title: "苏州科技商学院",
imageUrl: "/static/share.jpg"
}
},
onLoad() {
@ -116,7 +108,7 @@
},
onShow() {
this.showRegister = false
let user = uni.getStorageSync("stbc_lifeData") ? uni.getStorageSync("stbc_lifeData").vuex_user : {}
let user = uni.getStorageSync("stbc1_lifeData") ? uni.getStorageSync("stbc1_lifeData").vuex_user : {}
if (!this.base.isNull(user.mobile)) {
this.hasMobile = true
} else {
@ -146,7 +138,7 @@
const res = await this.$u.api.courseIndex({
page: this.current_page,
page_size: 10,
status:1
status: 1
})
this.total_page = res.last_page
if (res.data.length === 0 && this.current_page === 1) {
@ -155,31 +147,23 @@
this.course_list.push(...res.data)
},
convertToChineseMonth(dateString, dateStatus) {
if (this.base.isNull(dateString) || dateStatus === '待定') {
return {
month: '预告',
year: "课程"
}
} else {
//
const dateParts = dateString.split('-');
const year = parseInt(dateParts[0], 10);
const monthNumber = parseInt(dateParts[1], 10);
const day = parseInt(dateParts[2], 10);
//
const chineseMonths = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];
//
const chineseMonth = chineseMonths[monthNumber - 1];
return {
year: year,
month: chineseMonth,
day: day
}
//
const dateParts = dateString.split('-');
const year = parseInt(dateParts[0], 10);
const monthNumber = parseInt(dateParts[1], 10);
const day = parseInt(dateParts[2], 10);
//
const chineseMonths = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];
//
const chineseMonth = chineseMonths[monthNumber - 1];
return {
year: year,
month: chineseMonth,
day: day
}
},
//
toDetail(item) {
@ -187,10 +171,7 @@
url: '/packages/course/detail?id=' + item.id
})
return
this.go_course_id = item.id
// total
//
@ -274,38 +255,47 @@
border-radius: 10rpx;
&-wrap {
width: calc(100% - 150rpx);
width: 100%;
display: flex;
&-time {
padding: 30rpx;
background: linear-gradient(to bottom, #5e5fbc, #0d0398);
border-radius: 10rpx 0 0 10rpx;
color: #fff;
width: 120rpx;
width: 170rpx;
text-align: center;
font-size: 24rpx;
font-size: 0rpx;
position: relative;
&>view {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
width:100%;
padding:25rpx;
>view{
font-size: 24rpx;
}
}
.bigFont {
font-size: 50rpx;
border-bottom: 1rpx solid #ddd;
// border-bottom: 1rpx solid #ddd;
}
&-date{
padding-bottom:15rpx;
border-bottom: 1rpx solid #fff;
}
&-status{
padding-top:10rpx;
}
}
&-status {
margin: 20rpx;
border-right: 1px solid #ddd;
width: calc(100% - 120rpx);
margin-right: 0;
padding-right: 20rpx;
// border-right: 1px solid #ddd;
width: calc(100% - 170rpx);
padding: 30rpx;
position: relative;
&-type {
@ -334,71 +324,34 @@
}
&-label {
padding: 5rpx 20rpx;
border: 1px solid #cfcfcf;
border-radius: 30rpx;
display: inline-block;
position: relative;
&:before {
content: " ";
background: #00b318;
text-align: right;
text {
display: inline-block;
padding: 5rpx 20rpx;
border: 1px solid #cfcfcf;
border-radius: 30rpx;
display: inline-block;
width: 10rpx;
height: 10rpx;
top: -5rpx;
position: relative;
// top: -2rpx;
margin-right: 14rpx;
border-radius: 50%;
}
}
}
}
&-btn {
width: 150rpx;
font-size: 24rpx;
background: linear-gradient(to right, #5e5fbc, #0d0398);
color: #fff;
padding: 10rpx 20rpx;
border-radius: 30rpx;
margin: 20rpx;
text-align: center;
}
}
//
&-start {
.list-item-wrap {
width: 100%;
&-time {
background: linear-gradient(to bottom, #cf847d, #b00d10);
}
&-status {
border-right: none;
&-type {
&>text {
background: linear-gradient(to right, #cf847d, #b00d10);
&:before {
content: " ";
background: #00b318;
display: inline-block;
width: 10rpx;
height: 10rpx;
top: -5rpx;
position: relative;
// top: -2rpx;
margin-right: 14rpx;
border-radius: 50%;
}
}
}
&-label {
&:before {
content: " ";
background: #cfcfcf;
}
}
}
}
.list-item-btn {
display: none;
}
}
@ -420,11 +373,14 @@
}
}
&-label {
&:before {
content: " ";
background: #cfcfcf;
&-label {
text{
&:before {
content: " ";
background: #efa36e;
}
}
}
}

@ -96,7 +96,7 @@
onLoad() {
let menuButtonObject = uni.getMenuButtonBoundingClientRect();
this.topNavHeight = menuButtonObject.height + 8
let token = uni.getStorageSync('stbc_lifeData') ? uni.getStorageSync('stbc_lifeData').vuex_token : ''
let token = uni.getStorageSync('stbc1_lifeData') ? uni.getStorageSync('stbc1_lifeData').vuex_token : ''
if (this.base.isNull(token)) {
this.getToken()
}
@ -131,7 +131,7 @@
this.$u.api.login({
code: res.code
}).then(res1 => {
uni.setStorageSync("stbc_lifeData", {
uni.setStorageSync("stbc1_lifeData", {
'vuex_token': res1.token
})
uni.request({
@ -141,7 +141,7 @@
},
method: "GET",
success(res2) {
uni.setStorageSync("stbc_lifeData", {
uni.setStorageSync("stbc1_lifeData", {
'vuex_token': res1.token,
"vuex_user": res2.data.user
})

@ -4,20 +4,32 @@
<view class="wrap">
<view class="me">
<image class="me-top" :src="base.imgHost('me-top.png')"></image>
<view class="me-name" @click="tourl(1)">
{{userInfo.username?userInfo.username:'-'}}
<u-icon name="arrow-right" size="32" style="margin-left:40rpx"></u-icon>
<view @click="toUrl(1)" class="me-wrap">
<view class="me-name">
<image :src="base.imgHost('me-logo.png')"></image>
<view>
<view>
{{userInfo.username?userInfo.username:'-'}}
</view>
<view>
{{userInfo.mobile?userInfo.mobile:''}}
</view>
</view>
</view>
<u-icon name="arrow-right" size="32" color="#fff"></u-icon>
</view>
</view>
<view class="menu">
<view @click="tourl(2)">
<view @click="toUrl(2)">
<view>
<image :src="base.imgHost('me-icon1.png')" style="width:52rpx;height:48rpx;"></image>
<text>我的课程</text>
</view>
<u-icon name="arrow-right" size="32" color="#666" style="margin-left:40rpx"></u-icon>
</view>
<view @click="tourl(3)">
<view @click="toUrl(3)">
<view>
<image :src="base.imgHost('me-icon2.png')" style="width:50rpx;height:50rpx;"></image>
<text>我的预约</text>
@ -38,6 +50,13 @@
</view>
<u-icon name="arrow-right" size="32" color="#666" style="margin-left:40rpx"></u-icon>
</view>
<view @click="toUrl(4)">
<view>
<image :src="base.imgHost('me-icon5.png')" style="width:48rpx;height:52rpx;"></image>
<text>联系我们</text>
</view>
<u-icon name="arrow-right" size="32" color="#666" style="margin-left:40rpx"></u-icon>
</view>
</view>
</view>
@ -66,10 +85,9 @@
<text>姓名</text>
<text>{{userInfo.username}}</text>
</view>
<view>
<text>学籍</text>
<text class="courseName"
v-if="userInfo.course_signs.length>0">{{userInfo.course_signs[0]['course'].name}}</text>
<view v-if="userInfo.course_signs.length>0">
<text>学籍</text>
<text class="courseName">{{userInfo.course_signs[0]['course'].name}}</text>
</view>
</view>
</view>
@ -121,20 +139,21 @@
type: 'register',
showGzh: false,
showCard: false,
userInfo: {}
userInfo: {},
hasMobile:false
}
},
onShareAppMessage() {
return {
title: "苏州科技商学院",
imageUrl: "/static/share.jpg"
}
},
onShareTimeline() {
return {
title: "苏州科技商学院",
imageUrl: "/static/share.jpg"
}
},
onShareAppMessage() {
return{
title:"苏州科技商学院",
imageUrl:"/static/share.jpg"
}
},
onShareTimeline() {
return{
title:"苏州科技商学院",
imageUrl:"/static/share.jpg"
}
},
onShow() {
this.showRegister = false
@ -142,7 +161,12 @@
},
onLoad() {},
methods: {
refreshCode() {
refreshCode() {
if(!this.hasMobile){
this.base.toast("请先绑定或注册")
this.showRegister = true
return
}
this.showCard = true
this.$refs.uqrcode.make({
success: () => {
@ -152,9 +176,17 @@
console.log(err)
}
});
},
tourl(type) {
toUrl(type) {
if(type===1 || type===2 || type===3){
if(!this.hasMobile){
this.base.toast("请先绑定或注册")
this.showRegister = true
return
}
}
if (type === 1) {
uni.navigateTo({
url: '/packages/my/index'
@ -167,6 +199,10 @@
uni.navigateTo({
url: '/packages/mybook/index'
})
} else if (type === 4) {
uni.navigateTo({
url: '/packages/webview/index?type=4'
})
}
},
getUserInfo() {
@ -175,9 +211,11 @@
this.$u.vuex('vuex_user', res.user)
this.userInfo = res.user
if (this.base.isNull(res.user.mobile)) {
this.showRegister = true
this.showRegister = true
this.hasMobile = false
} else {
this.showRegister = false
this.showRegister = false
this.hasMobile = true
}
})
},
@ -227,31 +265,42 @@
height: 435rpx;
}
&-wrap {
display: flex;
justify-content: space-between;
align-items: center;
position: absolute;
top: 120rpx;
left: 0;
padding: 0 30rpx;
width: 100%;
}
&-name {
display: flex;
align-items: center;
image {
width: 110rpx;
height: 110rpx;
margin-right: 20rpx;
}
color: #fff;
font-size: 32rpx;
position: absolute;
top: 120rpx;
left: 30rpx;
}
}
// .me{
// background-color: #ceab8a;
// padding:30rpx;
// text-align: center;
// color:#fff;
// border-radius: 20rpx;
// }
.menu {
position: absolute;
top: 240rpx;
top: 320rpx;
width: 100%;
background-color: #fff;
// z-index: 999;
border-radius: 40rpx 40rpx 0 0;
height: calc(100% - 240rpx);
height: calc(100% - 320rpx);
padding: 40rpx;
overflow: scroll;
&>view {
padding: 30rpx;

@ -2,11 +2,11 @@ import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
let stbc_lifeData = {};
let stbc1_lifeData = {};
try{
// 尝试获取本地是否存在stbc_lifeData变量第一次启动APP时是不存在的
stbc_lifeData = uni.getStorageSync('stbc_lifeData');
// 尝试获取本地是否存在stbc1_lifeData变量第一次启动APP时是不存在的
stbc1_lifeData = uni.getStorageSync('stbc1_lifeData');
}catch(e){
}
@ -15,26 +15,26 @@ try{
let saveStateKeys = ['vuex_user', 'vuex_token','vuex_share'];
// 保存变量到本地存储中
const savestbc_LifeData = function(key, value){
const savestbc1_LifeData = function(key, value){
// 判断变量名是否在需要存储的数组中
if(saveStateKeys.indexOf(key) != -1) {
// 获取本地存储的stbc_lifeData对象将变量添加到对象中
let tmp = uni.getStorageSync('stbc_lifeData');
// 第一次打开APP不存在stbc_lifeData变量故放一个{}空对象
// 获取本地存储的stbc1_lifeData对象将变量添加到对象中
let tmp = uni.getStorageSync('stbc1_lifeData');
// 第一次打开APP不存在stbc1_lifeData变量故放一个{}空对象
tmp = tmp ? tmp : {};
tmp[key] = value;
// 执行这一步后所有需要存储的变量都挂载在本地的stbc_lifeData对象中
uni.setStorageSync('stbc_lifeData', tmp);
// 执行这一步后所有需要存储的变量都挂载在本地的stbc1_lifeData对象中
uni.setStorageSync('stbc1_lifeData', tmp);
}
}
const store = new Vuex.Store({
// 下面这些值仅为示例,使用过程中请删除
state: {
// 如果上面从本地获取的stbc_lifeData对象下有对应的属性就赋值给state中对应的变量
// 如果上面从本地获取的stbc1_lifeData对象下有对应的属性就赋值给state中对应的变量
// 加上vuex_前缀是防止变量名冲突也让人一目了然
vuex_user: stbc_lifeData.vuex_user ? stbc_lifeData.vuex_user : {},
vuex_token: stbc_lifeData.vuex_token ? stbc_lifeData.vuex_token : '',
// 如果vuex_version无需保存到本地永久存储无需stbc_lifeData.vuex_version方式
vuex_user: stbc1_lifeData.vuex_user ? stbc1_lifeData.vuex_user : {},
vuex_token: stbc1_lifeData.vuex_token ? stbc1_lifeData.vuex_token : '',
// 如果vuex_version无需保存到本地永久存储无需stbc1_lifeData.vuex_version方式
vuex_version: '1.0.0',
vuex_sign_base64: '',
@ -59,7 +59,7 @@ const store = new Vuex.Store({
saveKey = payload.name;
}
// 保存变量到本地,见顶部函数定义
savestbc_LifeData(saveKey, state[saveKey])
savestbc1_LifeData(saveKey, state[saveKey])
}
}
})

Loading…
Cancel
Save