Browse Source

add course style

course
郑锦全 3 years ago
parent
commit
ce223a2d48
  1. 76
      src/pages.json
  2. 147
      src/subpackage/course/components/cancel_class_modal/cancel_class_modal.vue
  3. 175
      src/subpackage/course/components/class_reset_modal/class_reset_modal.vue
  4. 112
      src/subpackage/course/components/manage/bclass_reserve_item/bclass_reserve_item.vue
  5. 93
      src/subpackage/course/components/manage/class_manage_item/class_manage_item.vue
  6. 108
      src/subpackage/course/components/manage/private_reserve_item/private_reserve_item.vue
  7. 72
      src/subpackage/course/components/manage/student_course_item/student_course_item.vue
  8. 113
      src/subpackage/course/components/sclass_record_section/sclass_record_section.vue
  9. 20
      src/subpackage/course/components/store_name/store_name.vue
  10. 117
      src/subpackage/course/components/tab_bar/tab_bar.vue
  11. 193
      src/subpackage/course/components/task_section/task_section.vue
  12. 427
      src/subpackage/course/pages/arrange_class/arrange_class.vue
  13. 222
      src/subpackage/course/pages/class_add_student/class_add_student.vue
  14. 251
      src/subpackage/course/pages/class_student_detail/class_student_detail.vue
  15. 268
      src/subpackage/course/pages/class_time_change/class_time_change.vue
  16. 11
      src/subpackage/course/pages/index/index.vue
  17. 242
      src/subpackage/course/pages/manage_detail/bclass_reserve_detail/bclass_reserve_detail.vue
  18. 433
      src/subpackage/course/pages/manage_detail/class_manage_detail/class_manage_detail.vue
  19. 159
      src/subpackage/course/pages/manage_detail/private_reserve_detail/private_reserve_detail.vue
  20. 302
      src/subpackage/course/pages/manage_detail/student_course_detail/student_course_detail.vue
  21. 188
      src/subpackage/course/pages/manage_list/manage_list.vue
  22. 132
      src/subpackage/course/pages/task_detail/task_detail.vue
  23. 147
      src/subpackage/course/pages/task_finish_list/task_finish_list.vue
  24. BIN
      src/subpackage/course/static/images/icon/arrow_black.png
  25. BIN
      src/subpackage/course/static/images/icon/arrow_green.png
  26. BIN
      src/subpackage/course/static/images/icon/calendar.png
  27. BIN
      src/subpackage/course/static/images/icon/close_gray.png
  28. BIN
      src/subpackage/course/static/images/icon/phone.png
  29. BIN
      src/subpackage/course/static/images/icon/triangle.png
  30. BIN
      src/subpackage/course/static/images/no_order.png

76
src/pages.json

@ -220,7 +220,7 @@
"navigationBarTitleText": "门店信息列表"
}
}
],
"subpackages": [
{
@ -389,15 +389,79 @@
{
"root": "subpackage/course",
"pages": [
{
{
"path": "pages/index/index",
"style" : {
"navigationBarTitleText": "课程管理" ,
"navigationBarBackgroundColor": "#009874",
"navigationBarTextStyle": "white"
"navigationBarTitleText": "课程管理"
}
},
{
"path": "pages/manage_list/manage_list",
"style" : {
"navigationBarTitleText": "课程管理列表"
}
},
{
"path": "pages/manage_detail/student_course_detail/student_course_detail",
"style" : {
"navigationBarTitleText": "学员课程详情"
}
},
{
"path": "pages/manage_detail/private_reserve_detail/private_reserve_detail",
"style" : {
"navigationBarTitleText": "私教约课记录详情"
}
},
{
"path": "pages/manage_detail/bclass_reserve_detail/bclass_reserve_detail",
"style" : {
"navigationBarTitleText": "大班约课记录详情"
}
},
{
"path": "pages/manage_detail/class_manage_detail/class_manage_detail",
"style" : {
"navigationBarTitleText": "班级管理详情"
}
},
{
"path": "pages/task_detail/task_detail",
"style" : {
"navigationBarTitleText": "作业详情"
}
},
{
"path": "pages/arrange_class/arrange_class",
"style" : {
"navigationBarTitleText": "安排上课"
}
},
{
"path": "pages/class_add_student/class_add_student",
"style" : {
"navigationBarTitleText": "添加学员"
}
},
{
"path": "pages/class_student_detail/class_student_detail",
"style" : {
"navigationBarTitleText": "学员详情"
}
},
{
"path": "pages/class_time_change/class_time_change",
"style" : {
"navigationBarTitleText": "更改上课时间"
}
},
{
"path": "pages/task_finish_list/task_finish_list",
"style" : {
"navigationBarTitleText": "作业完成列表"
}
}
]
}
],

147
src/subpackage/course/components/cancel_class_modal/cancel_class_modal.vue

@ -0,0 +1,147 @@
<template>
<!--弹框 取消上课 -->
<view class="cancel-class-modal" @click.stop="">
<view class="ox-dark-mask fixed-mask " @touchmove.stop.prevent="moveHandle">
<view class="mask-modal" @click.stop="">
<view class="mm-close">
<image src="/subpackage/course/static/images/icon/close_gray.png" @click="closeChange"></image>
</view>
<view class="mm-tit">取消上课</view>
<view class="mm-cause">
<textarea class="mc-textarea" @blur="bindTextAreaBlur" placeholder="请输入取消上课的原因(选填)" maxlength="25" v-model="causeTxt"></textarea>
<view class="mc-num">{{causeTxt.length || 0}}/25</view>
</view>
<view class="mm-btn">
<view class="mb-btn1" hover-class="hover-active" @click="confirmChange">确认</view>
<view class="mb-btn2" hover-class="hover-active" @click="closeChange">取消</view>
</view>
</view>
</view>
</view>
</template>
<script>
import util from '@/utils/util';
export default {
props:{
orderInfo: {
type: Object,
default: ()=>({})
}
},
computed: {
},
data(){
return {
causeTxt: "",
}
},
methods: {
moveHandle(){},
//
bindTextAreaBlur: function(e) {
// console.log( ": " + e.detail.value)
this.causeTxt = e.detail.value
this.$emit('bindTextAreaBlur', this.causeTxt)
},
closeChange(){
this.$emit('reasonClose')
},
confirmChange(){
this.$emit('reasonConfirm', this.causeTxt)
},
},
}
</script>
<style lang="scss">
@import '~style/public.scss';
.cancel-class-modal{
}
//
.fixed-mask{
// position: fixed;
// left: 0;
// top: 0;
// right: 0;
// bottom: 0;
// background-color: rgba(0, 0, 0, .5);
z-index: 999;
}
.mask-modal{
position: absolute;
left: 50%;
top: 46%;
transform: translate(-50%, -50%);
width: 620rpx;
padding: 30rpx 0 82rpx;
border-radius: 10rpx;
background-color: #FFFFFF;
.mm-close{
@include centerFlex(flex-end);
>image{
margin-right: 30rpx;
width: 34rpx;
height: 34rpx;
}
}
.mm-tit{
margin: 16rpx auto 38rpx;
color: #333333;
font-size: 32rpx;
line-height: 44rpx;
text-align: center;
font-weight: 700;
}
.mm-cause{
margin: auto;
position: relative;
width: 538rpx;
height: 150rpx;
border-radius: 10rpx;
border: 2rpx solid #D8D8D8;
.mc-textarea{
margin: 24rpx 20rpx;
width: 498rpx;
height: 102rpx;
color: #333;
font-size: 28rpx;
line-height: 40rpx;
}
.mc-num{
position: absolute;
right: 20rpx;
bottom: 20rpx;
color: #9A9A9D;
font-size: 28rpx;
}
}
.mm-btn{
margin-top: 80rpx;
@include centerFlex(center);
>view{
margin: 0 10rpx;
padding: 22rpx 0;
width: 240rpx;
border-radius: 10rpx;
border: 2rpx solid #009874;
font-size: 32rpx;
line-height: 44rpx;
text-align: center;
}
.mb-btn1{
color: #FFFFFF;
background-color: #009874;
}
.mb-btn2{
color: #009874;
}
}
}
</style>

175
src/subpackage/course/components/class_reset_modal/class_reset_modal.vue

@ -0,0 +1,175 @@
<template>
<!-- 转班弹框 -->
<view class="class-reset-modal" @click.stop="">
<view class="ox-dark-mask fixed-mask" @touchmove.stop.prevent="moveHandle" v-if="isShowClass" @click="closeReset">
<view class="mask-modal" @click.stop="">
<view class="mm-close">
<image src="/subpackage/course/static/images/icon/close_gray.png" @click="closeReset"></image>
</view>
<view class="mm-tit">选择班级</view>
<view class="mm-line">课程名称{{info.course_name || '-'}}</view>
<scroll-view class="mm-scroll" scroll-y>
<view class="ms-list" v-for="(e,i) in classList" :key="i">
<view class="ml-item" @click="selectClass(e)">
<image :class="[resetInfo.new_id==e.id?'mi-img':'mi-icon']" :src="resetInfo.new_id==e.id?'/static/images/icon/selected_987.png':''"></image>
<view class="mi-info">
<view>班级名称{{e.name || '-'}}</view>
<view>班级人数{{e.nums || 0}}</view>
<view>上课教练{{e.coach || '-'}}</view>
</view>
</view>
</view>
</scroll-view>
<view class="mm-btn" hover-class="hover-active" @click="confirmReset">确定</view>
</view>
</view>
</view>
</template>
<script>
import util from '@/utils/util';
export default {
props:{
info: {
type: Object,
default: ()=>({})
},
canlist: {
type: Array,
default() {
return [];
}
},
isShowClass: {
type: Boolean,
default: false
}
},
computed: {
// userInfo(){
// return uni.getStorageSync('loginInfo') || {};
// },
classList(){
let { info, canlist } = this
let _list = []
if(canlist.length > 0)_list = canlist.filter(e=>e.id != info.sclass_id);
return _list || [];
},
},
data() {
return {
resetInfo:{
new_id: "", //ID
// user_id: "",
// user_order_no: "",
},
}
},
methods: {
moveHandle(){},
selectClass(item){
this.resetInfo.new_id = item.id
},
closeReset(){
this.$emit('closeReset')
},
confirmReset(){
let { resetInfo, classList } = this
if(classList.length == 0)return util.showNone('无可选班级!');
if(resetInfo.new_id == '')return util.showNone('请选择!');
this.$emit('confirmReset',resetInfo)
},
},
}
</script>
<style lang="scss">
@import '~style/public.scss';
.class-reset-modal{
.fixed-mask{
z-index: 999;
}
.mask-modal{
position: absolute;
left: 50%;
top: 45%;
transform: translate(-50%, -50%);
width: 558rpx;
padding: 20rpx 0;
border-radius: 10rpx;
background-color: #FFFFFF;
.mm-close{
@include centerFlex(flex-end);
>image{
margin-right: 22rpx;
width: 36rpx;
height: 36rpx;
}
}
.mm-tit{
margin: 6rpx auto 40rpx;
color: #1A1A1A;
font-size: 36rpx;
font-weight: 700;
text-align: center;
}
.mm-line{
flex-grow: 1;
margin: 0 38rpx;
color: #1A1A1A;
font-size: 32rpx;
padding-bottom: 20rpx;
border-bottom: 2rpx solid #E5E5E5;
}
.mm-scroll{
margin-left: 42rpx;
height: 368rpx;
.ms-list{
.ml-item{
padding-top: 28rpx;
display: flex;
align-items: center;
justify-content: flex-start;
>image{
flex-shrink: 0;
margin-right: 24rpx;
margin-top: 14rpx;
}
.mi-icon{
width: 36rpx;
height: 36rpx;
border-radius: 50%;
border: 2rpx solid #9C9C9F;
}
.mi-img{
width: 40rpx;
height: 40rpx;
}
.mi-info{
>view{
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
}
}
}
}
}
.mm-btn{
margin: 60rpx auto;
padding: 18rpx 0;
width: 240rpx;
border-radius: 6rpx;
background-color: #009874;
color: #FFFFFF;
font-size: 32rpx;
text-align: center;
}
}
}
</style>

112
src/subpackage/course/components/manage/bclass_reserve_item/bclass_reserve_item.vue

@ -0,0 +1,112 @@
<template>
<!-- 大班约课记录 -->
<view class="bclass-reserve-item" @click="toDetail">
<view class="bri-line">
<view class="bl-store">欧轩智能场馆(羽毛球馆永泰店)</view>
<view class="bl-status" :class="[false?'status-gray':false?'status-red':'']">待上课</view>
</view>
<view class="bri-view">已预约人数<text>3上课区间5-10</text></view>
<view class="bri-view">上课时间<text>2021.06.02周五 14:00-16:00</text></view>
<view class="bri-view">上课地点<text>羽毛球3号场</text></view>
<view class="bri-view">上课教练<text>周扎米</text></view>
<view class="bri-view">课程名称<text>羽毛球培训课</text></view>
<block v-if="false">
<view class="bri-view">取消时间<text>2021.06.03 11:42:50</text></view>
<view class="bri-view">取消原因<text>教练取消大雨停课</text></view>
</block>
<view class="bri-btn" v-if="true">
<view class="bb-btn1" hover-class="hover-active" @click.stop="">取消上课</view>
<view class="bb-btn2" hover-class="hover-active" @click.stop="">确认上课</view>
</view>
</view>
</template>
<script>
import util from '@/utils/util';
export default {
props:{
orderInfo: {
type: Object,
default: ()=>({})
},
},
computed: {
},
data(){
return {
}
},
methods: {
toDetail(){
let { orderInfo } = this
util.routeTo(`/subpackage/course/pages/manage_detail/bclass_reserve_detail/bclass_reserve_detail`,'nT');
},
},
}
</script>
<style lang="scss">
@import '~style/public.scss';
.bclass-reserve-item{
padding: 26rpx 44rpx 34rpx;
background-color: #FFFFFF;
.bri-line{
margin-bottom: 20rpx;
padding: 0 0 32rpx 2rpx;
border-bottom: 2rpx solid #E5E5E5;
@include centerFlex(space-between);
.bl-store{
color: #1A1A1A;
font-size: 28rpx;
line-height: 40rpx;
font-weight: 700;
@include textHide(1);
}
.bl-status{
flex-shrink: 0;
color: #009874;
font-size: 28rpx;
line-height: 40rpx;
}
.status-gray{
color: #9C9C9F;
}
.status-red{
color: #EA5061;
}
}
.bri-view{
color: #9C9C9F;
font-size: 28rpx;
line-height: 52rpx;
>text{
color: #1A1A1A;
}
}
.bri-btn{
margin-top: 18rpx;
@include centerFlex(flex-end);
>view{
margin-left: 20rpx;
padding: 20rpx 0;
width: 192rpx;
border-radius: 6rpx;
font-size: 28rpx;
line-height: 40rpx;
font-weight: 700;
text-align: center;
}
.bb-btn1{
color: #EA5061;
border: 2rpx solid #EA5061;
background-color: #FFFFFF;
}
.bb-btn2{
color: #FFFFFF;
border: 2rpx solid #009874;
background-color: #009874;
}
}
}
</style>

93
src/subpackage/course/components/manage/class_manage_item/class_manage_item.vue

@ -0,0 +1,93 @@
<template>
<!-- 班级管理 -->
<view class="class-manage-item" @click="toDetail">
<view class="cmi-line">
<view class="cl-store">欧轩智能场馆(羽毛球馆永泰店)</view>
<view class="cl-status" :class="[false?'status-gray':false?'status-red':'']">进行中</view>
</view>
<block v-if="true">
<view class="cmi-view">课程名称<text>羽毛球培训课</text></view>
<view class="cmi-view">班级id<text>2-3</text></view>
<view class="cmi-view">成班人数区间<text>2-6</text></view>
<view class="cmi-view">已报名人数<text>2</text></view>
<view class="cmi-view">报名截止时间<text>2020.12.27 22:55:56</text></view>
</block>
<block v-if="false">
<view class="cmi-view">班级名称<text>冲锋班</text></view>
<view class="cmi-view">班级人数<text>20</text></view>
<view class="cmi-view">上课教练<text>何其多</text></view>
<view class="cmi-view">上课地点<text>欧轩智能场馆3号馆</text></view>
<view class="cmi-view">课程日期<text>2021.08.08-2021.10.10</text></view>
<view class="cmi-view">课程名称<text>羽毛球培训课</text></view>
</block>
</view>
</template>
<script>
import util from '@/utils/util';
export default {
props:{
orderInfo: {
type: Object,
default: ()=>({})
},
},
computed: {
},
data(){
return {
}
},
methods: {
toDetail(){
let { orderInfo } = this
util.routeTo(`/subpackage/course/pages/manage_detail/class_manage_detail/class_manage_detail`,'nT');
},
},
}
</script>
<style lang="scss">
@import '~style/public.scss';
.class-manage-item{
padding: 26rpx 44rpx 30rpx;
background-color: #FFFFFF;
.cmi-line{
margin-bottom: 20rpx;
padding: 0 0 32rpx 2rpx;
border-bottom: 2rpx solid #E5E5E5;
@include centerFlex(space-between);
.cl-store{
color: #1A1A1A;
font-size: 28rpx;
line-height: 40rpx;
font-weight: 700;
@include textHide(1);
}
.cl-status{
flex-shrink: 0;
color: #009874;
font-size: 28rpx;
line-height: 40rpx;
}
.status-gray{
color: #9C9C9F;
}
.status-red{
color: #EA5061;
}
}
.cmi-view{
color: #9C9C9F;
font-size: 28rpx;
line-height: 52rpx;
>text{
color: #1A1A1A;
}
}
}
</style>

108
src/subpackage/course/components/manage/private_reserve_item/private_reserve_item.vue

@ -0,0 +1,108 @@
<template>
<!-- 私教约课记录 -->
<view class="private-reserve-item" @click="toDetail">
<view class="pri-line">
<view class="pl-store">欧轩智能场馆(羽毛球馆永泰店)</view>
<view class="pl-status" :class="[false?'status-gray':false?'status-red':'']">待上课</view>
</view>
<view class="pri-view">学员信息<text>张安 18316536894</text></view>
<view class="pri-view">上课时间<text>2021.06.02周五 14:00-16:00</text></view>
<view class="pri-view">上课地点<text>羽毛球3号场</text></view>
<view class="pri-view">上课教练<text>张夏欧</text></view>
<view class="pri-view">课程名称<text>羽毛球培训课</text></view>
<view class="pri-btn" v-if="true">
<view hover-class="hover-active" @click.stop="isCancelClass=true">取消上课</view>
</view>
<cancel-class-modal
v-if="isCancelClass"
@reasonClose="isCancelClass=false"
></cancel-class-modal>
</view>
</template>
<script>
import util from '@/utils/util';
import cancel_class_modal from '../../cancel_class_modal/cancel_class_modal.vue';
export default {
components: {
'cancel-class-modal': cancel_class_modal,
},
props:{
orderInfo: {
type: Object,
default: ()=>({})
},
},
computed: {
},
data(){
return {
isCancelClass: false,
}
},
methods: {
toDetail(){
let { orderInfo } = this
util.routeTo(`/subpackage/course/pages/manage_detail/private_reserve_detail/private_reserve_detail`,'nT');
},
},
}
</script>
<style lang="scss">
@import '~style/public.scss';
.private-reserve-item{
padding: 26rpx 44rpx 30rpx;
background-color: #FFFFFF;
.pri-line{
margin-bottom: 20rpx;
padding: 0 0 32rpx 2rpx;
border-bottom: 2rpx solid #E5E5E5;
@include centerFlex(space-between);
.pl-store{
color: #1A1A1A;
font-size: 28rpx;
line-height: 40rpx;
font-weight: 700;
@include textHide(1);
}
.pl-status{
flex-shrink: 0;
color: #009874;
font-size: 28rpx;
line-height: 40rpx;
}
.status-gray{
color: #9C9C9F;
}
.status-red{
color: #EA5061;
}
}
.pri-view{
color: #9C9C9F;
font-size: 28rpx;
line-height: 52rpx;
>text{
color: #1A1A1A;
}
}
.pri-btn{
margin-top: 6rpx;
@include centerFlex(flex-end);
>view{
padding: 20rpx 0;
width: 192rpx;
border-radius: 6rpx;
border: 2rpx solid #EA5061;
color: #EA5061;
font-size: 28rpx;
line-height: 40rpx;
font-weight: 700;
text-align: center;
}
}
}
</style>

72
src/subpackage/course/components/manage/student_course_item/student_course_item.vue

@ -0,0 +1,72 @@
<template>
<!-- 学员课程 -->
<view class="student-course-item" @click="toDetail">
<view class="sci-status" :class="[false?'status-gray':false?'status-red':'']">进行中</view>
<view class="sci-view">学员信息<text>张安 18316536894</text></view>
<view class="sci-view">剩余课时<text>10课时 2/12)</text></view>
<view class="sci-view">课程名称<text>羽毛球培训课</text></view>
<view class="sci-view">有效期至<text>2020.12.27</text></view>
<view class="sci-view">课程类型<text>私教课</text></view>
<view class="sci-view">上课教练<text>一级教练</text></view>
</view>
</template>
<script>
import util from '@/utils/util';
export default {
props:{
orderInfo: {
type: Object,
default: ()=>({})
},
},
computed: {
},
data(){
return {
}
},
methods: {
toDetail(){
// this.$emit('closeChange')
let { orderInfo } = this
// ?query=${util.jsonStr(_query)}
util.routeTo(`/subpackage/course/pages/manage_detail/student_course_detail/student_course_detail`,'nT');
},
},
}
</script>
<style lang="scss">
@import '~style/public.scss';
.student-course-item{
position: relative;
padding: 30rpx 44rpx;
background-color: #FFFFFF;
.sci-status{
position: absolute;
top: 30rpx;
right: 44rpx;
font-size: 28rpx;
line-height: 40rpx;
color: #009874;
}
.status-gray{
color: #9A9A9D;
}
.status-red{
color: #EA5061;
}
.sci-view{
// flex-shrink: 0;
margin-right: 84rpx;
color: #9C9C9F;
font-size: 28rpx;
line-height: 52rpx;
>text{
color: #1A1A1A;
}
}
}
</style>

113
src/subpackage/course/components/sclass_record_section/sclass_record_section.vue

@ -0,0 +1,113 @@
<template>
<view class="sclass-record-section">
<view class="cds-tab">
<view>课时编号</view>
<view>上课时间</view>
<view>考勤状态</view>
</view>
<view class="cds-list" v-for="(e,i) in 6" :key="i">
<view class="cl-item">
<view>{{ i+1|| '-'}}</view>
<!-- <view>{{formatDate({date: e.period_date, partition: '.'}) ||'-'}}{{`${' '+e.period_start_time || ''}-${e.period_end_time || ''}` ||''}}</view> -->
<view>2021.06.01 10:00-12:00</view>
<view
:class="[e.user_status==0?'ci-txt-green':
e.user_status==4?'ci-txt-red':'']"
>{{ '正常'||zh_status(e.user_status)}}</view>
</view>
</view>
</view>
</template>
<script>
import util from '@/utils/util';
export default {
props:{
orderInfo: {
type: Object,
default: ()=>({})
},
},
computed: {
},
data() {
return {
}
},
methods: {
formatDate: util.formatDate,
zh_status(status){
let arr = ["待上课","已上课","申请请假中","已请假","缺勤"]
return arr[status] || '';
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
.sclass-record-section{
.cds-tab{
margin: 0 24rpx;
border: 2rpx solid #E8E8E8;
background-color: #F6F8F8;
@include centerFlex(flex-start);
>view{
height: 110rpx;
color: #1A1A1A;
font-size: 28rpx;
text-align: center;
@include centerFlex(center);
&:first-child {
width: 166rpx;
}
&:nth-child(2){
width: 338rpx;
border-left: 2rpx solid #E8E8E8;
border-right: 2rpx solid #E8E8E8;
}
&:nth-child(3){
width: 194rpx;
// border-right: 2rpx solid #E8E8E8;
}
}
}
.cds-list{
.cl-item{
margin: 0 24rpx;
border-left: 2rpx solid #E8E8E8;
border-right: 2rpx solid #E8E8E8;
border-bottom: 2rpx solid #E8E8E8;
background-color: #FFFFFF;
@include centerFlex(flex-start);
>view{
height: 110rpx;
color: #1A1A1A;
font-size: 28rpx;
text-align: center;
@include centerFlex(center);
&:first-child {
width: 166rpx;
}
&:nth-child(2){
width: 338rpx;
border-left: 2rpx solid #E8E8E8;
border-right: 2rpx solid #E8E8E8;
}
&:nth-child(3){
width: 194rpx;
}
}
.ci-txt-green{
color: #009874;
}
.ci-txt-red{
color: #EA5061;
}
}
}
}
</style>

20
src/subpackage/course/components/store_name/store_name.vue

@ -1,9 +1,9 @@
<template>
<picker class="store-name-picker" :range="storeList" range-key="name" @change="storeChange">
<view class="store-name" :style="{background:getThemeBg()}">
<image class="sn-logo" mode="aspectFit" :src="curStoreInfo.logo || ''"></image>
<image mode="aspectFit" :src="curStoreInfo.logo || ''" :class="[theme=='light'?'sn-logo':'sn-logo2']"></image>
<view class="sn-txt" :style="{color:getThemeColor()}">{{curStoreInfo.name || '-'}}</view>
<image class="sn-arrow" mode="aspectFit" :src="getThemeIcon()"></image>
<image :class="[theme=='light'?'sn-arrow':'sn-arrow2']" mode="aspectFit" :src="getThemeIcon()"></image>
</view>
</picker>
</template>
@ -17,7 +17,7 @@ export default {
curStoreInfo: state => state.device.curStoreInfo,
}),
getThemeIcon(){
return ()=> {return (this.theme=='light')?'/subpackage/course/static/images/icon/arrow_white.png':'/subpackage/course/static/images/icon/arrow_b2.png';}
return ()=> {return (this.theme=='light')?'/subpackage/course/static/images/icon/arrow_white.png':'/subpackage/course/static/images/icon/arrow_black.png';}
},
getThemeColor(){
return ()=> {return (this.theme=='light')?'#FFFFFF':'#333333';}
@ -62,6 +62,13 @@ export default {
width: 52upx;
height: 52upx;
}
.sn-logo2{
flex-grow: 0;
flex-shrink: 0;
margin-right: 10upx;
width: 30upx;
height: 30upx;
}
.sn-txt{
/* flex-grow: 1; */
line-height: 40upx;
@ -78,4 +85,11 @@ export default {
width: 28upx;
height: 28upx;
}
.sn-arrow2{
flex-shrink: 0;
flex-grow: 0;
margin-left: 20upx;
width: 20upx;
height: 20upx;
}
</style>

117
src/subpackage/course/components/tab_bar/tab_bar.vue

@ -0,0 +1,117 @@
<template>
<view class="tab-list">
<block v-for="(e,i) in tabList" :key="i">
<view :class="['tab_no', curTabID == e.id ? 'tab_yes':'']" @click="tabChange(e)">
<view class="tab-txt">{{e.name}}
<!-- <view class="tab-hint" v-if="e.hint"><text>{{hintValue}}</text></view> -->
</view>
</view>
</block>
</view>
</template>
<script>
const tabArr = [{name:'全部订单',id:0},{name:'待上课',id:1},{name:'已上课',id:2},{name:'已取消',id:3}];
export default {
name: 'tabBar',
props: {
tabList:{
type: Array,
default: ()=>(tabArr),
},
curTabID:{
type: Number,
default:0
},
hintValue:{
type: Number,
default:0
},
isBottomBorder: {
type: Boolean,
default: false
}
},
data(){
return {
// curTabID: 0
}
},
methods:{
tabChange(item){
// this.curTabID = ID;
this.$emit('change', item)
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
.tab-list{
width: 750rpx;
background-color: #fff;
display: flex;
align-items: center;
justify-content: space-around;
.tab_no{
position: relative;
flex-shrink: 0;
flex-grow: 1;
height: 100rpx;
line-height: 100rpx;
text-align: center;
.tab-txt{
position: relative;
display: inline-block;
font-size: 28rpx;
font-weight: 700;
color: #9A9A9D;
&::after{
content: '';
transition: all .2s;
position: absolute;
left: 50%;
bottom: 2rpx;
transform: translateX(-50%) translateY(50%);
display: block;
// width: 70%;
width: 40rpx;
height: 10rpx;
border-radius: 5rpx;
background-color: #009874;
opacity: 0;
}
// .tab-hint{
// position: absolute;
// top: 20rpx;
// right: -36rpx;
// width: 36rpx;
// height: 36rpx;
// border-radius: 50%;
// background-color: #EA5061;
// display: flex;
// align-items: center;
// justify-content: space-around;
// >text{
// color: #FFFFFF;
// font-size: 24rpx;
// font-weight: 400;
// }
// }
}
&.tab_yes{
.tab-txt{
color: #009874;
&::after{
opacity: 1;
transform: translateX(-50%) translateY(0);
}
}
}
}
}
</style>

193
src/subpackage/course/components/task_section/task_section.vue

@ -0,0 +1,193 @@
<template>
<view class="task-section">
<view class="ts-list" v-for="(e,i) in taskList" :key="i">
<view class="tl-item">
<view class="ti-line">
<!-- {{formatDate({date: e.created_at}) || '-'}} -->
<view>2020-09-08</view>
<view v-if="taskType==''" :class="[true?'status-red':'status-gray']">未完成</view>
<view v-if="taskType=='finish'" class="status-gray">完成情况0/10</view>
</view>
<view class="ti-desc" :class="e.expande?'desc-omit':''" :id="'noname'+i">
{{e.work_content || ''}}
<image class="td-img" @click="expandeChange(i)" v-if="e.isShowExpande" src="/subpackage/course/static/images/icon/arrow_green.png"></image>
</view>
<view class="ti-end">
<view hover-class="hover-active" @click="toTaskDetail(e)">查看</view>
</view>
</view>
</view>
</view>
</template>
<script>
import util from '@/utils/util';
export default {
props:{
// taskInfo: {
// type: Object,
// default: ()=>({})
// },
taskInfo:{
type: Array,
default() {
return [];
}
},
taskType:{
type: String,
default: '' //finish
},
},
computed: {
},
data() {
return {
taskList: [],
}
},
created() {
let _list = this.taskInfo || []
if(_list.length > 0){
_list.forEach((value,index)=>{
value['expande'] = false
value['isShowExpande'] = false
})
this.$nextTick(_=>{
this.taskList = _list
})
}
},
methods: {
formatDate: util.formatDate,
expandeChange(index){
this.taskList[index].isShowExpande = false
this.taskList[index].expande = false
},
async initDesc(){
let that = this
let { taskList } = this
for(var i in taskList){
let res = await this.getQueryResult(i);
if(res==1){
this.taskList[i].isShowExpande = true
this.taskList[i].expande = true
}
}
},
getQueryResult(i){
let that = this
return new Promise((rs,rj)=>{
/**
* 自定义组件需使用uni.createSelectorQuery().in(this)方法
* 页面上直接使用uni.createSelectorQuery()方法即可
* **/
let query = uni.createSelectorQuery().in(this); //wx.createSelectorQuery();
//id
let _id = "noname"+i
query.select('#noname'+i).boundingClientRect()
query.exec(function (res) {
console.log("获取节点信息:",res)
//res mjltest\
if (res[0].height / 20 > 3) {
rs(1)
} else {
rs(2)
}
rj(false)
})
})
},
toTaskDetail(item){
// let _query = {
// work_number: item.work_number,
// work_coach_name: item.work_coach_name,
// created_at: item.created_at,
// }
if(this.taskType == 'finish')return util.routeTo(`/subpackage/course/pages/task_finish_list/task_finish_list`,'nT');;
util.routeTo(`/subpackage/course/pages/task_detail/task_detail`,'nT');
},
// toTaskDetail(item){
// // util.routeTo(`/subpackage/manage/pages/student/task_detail/task_detail?query=${util.jsonStr(item)}`,'nT')
// // util.routeTo(`/subpackage/manage/pages/student/task_detail/task_detail?id=${item.id}`,'nT')
// },
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
.task-section{
.ts-list{
margin-bottom: 24rpx;
.tl-item{
// flex-grow: 1;
padding: 30rpx 42rpx;
background-color: #FFFFFF;
.ti-line{
margin-bottom: 20rpx;
@include centerFlex(space-between);
>view{
&:first-child{
color: #1A1A1A;
font-size: 32rpx;
font-weight: 700;
line-height: 44rpx;
}
&:nth-child(2){
margin: 0 6rpx;
font-size: 28rpx;
line-height: 40rpx;
}
}
.status-gray{
color: #9C9C9F;
}
.status-red{
color: #EA5061;
}
}
.ti-desc{
position: relative;
color: #1A1A1A;
font-size: 28rpx;
line-height: 20px;
.td-img{
position: absolute;
bottom: 0;
right: 0;
width: 24rpx;
height: 24rpx;
}
}
.desc-omit{
@include textHide(3);
}
.ti-end{
margin-top: 30rpx;
@include centerFlex(flex-end);
>view{
margin-left: 20rpx;
padding: 12rpx 0;
width: 156rpx;
border-radius: 6rpx;
font-size: 28rpx;
line-height: 40rpx;
text-align: center;
color: #009874;
border: 2rpx solid #009874;
}
}
}
}
}
</style>

427
src/subpackage/course/pages/arrange_class/arrange_class.vue

@ -0,0 +1,427 @@
<template>
<view class="arrange-class">
<view class="ac-info">
<view>{{pageInfo.brand_name || ''}}{{pageInfo.stadium_name ||'-'}}</view>
<view>课程名称{{pageInfo.course_name || '-'}}</view>
<view>上课教练{{pageInfo.course_coach || '-'}}</view>
<view>
<text>学员信息{{pageInfo.student_name || ''}}{{pageInfo.student_gender!=''?`${pageInfo.student_gender||''}`:''}} {{userInfo.type==2?(' '+pageInfo.student_phone) : ''}}</text>
<image v-if="userInfo.type==2" src="/subpackage/course/static/images/icon/phone.png" @click="phoneCall(pageInfo.student_phone)"></image>
</view>
<view>剩余课时{{pageInfo.period_nums_surplus || 0}} {{pageInfo.period_nums || 0}})</view>
</view>
<view class="ac-section">
<view class="as-tit">{{pageInfo.next_class_number || '-'}}</view>
<!-- 上课教练 -->
<view class="as-line">
<view class="al-txt"><text>*</text>上课教练</view>
<picker class="al-picker" :value="coachName" :range="coachs" @change="coachBindChange">
<view class="al-view al-box">
<view>{{coachName || '请选择上课教练'}}</view>
<image src="/subpackage/course/static/images/icon/triangle.png"></image>
</view>
</picker>
</view>
<!-- 上课日期 -->
<view class="as-line">
<view class="al-txt"><text>*</text>上课日期</view>
<picker class="al-picker" mode="date" :value="submitInfo.date" :start="startDate" :end="endDate" @change="bindDateChange" >
<view class="al-view al-date">
<view class="ad-txt">{{submitInfo.date}}</view>
<view class="ad-img">
<image src="/subpackage/course/static/images/icon/calendar.png"></image>
</view>
</view>
</picker>
</view>
<!-- 上课时间 -->
<view class="as-line">
<view class="al-txt"><text>*</text>上课时间</view>
<picker class="al-picker" :value="submitInfo.start" :range="timeList" @change="startBindChange">
<view class="al-view al-time">
<view>{{submitInfo.start}}</view>
<image src="/subpackage/course/static/images/icon/triangle.png"></image>
</view>
</picker>
<view class="al-to"></view>
<picker class="al-picker" :value="submitInfo.end" :range="timeList" @change="endBindChange">
<view class="al-view al-time">
<view>{{submitInfo.end}}</view>
<image src="/subpackage/course/static/images/icon/triangle.png"></image>
</view>
</picker>
</view>
<!-- 上课场地 -->
<view class="as-line" v-if="pageInfo.is_booking_venue == true">
<view class="al-txt"><text>*</text>上课场地<view class="at-type">({{pageInfo.course_venue_type || '-'}})</view></view>
<picker class="al-picker" :value="venueName" :range="venues" @change="venueBindChange">
<view class="al-view al-box">
<view>{{venueName || '请选择场地'}}</view>
<image src="/subpackage/course/static/images/icon/triangle.png"></image>
</view>
</picker>
</view>
</view>
<view class="ac-fixed">
<view hover-class="hover-active" @click="confirmChange">确定</view>
</view>
</view>
</template>
<script>
import util from '@/utils/util';
import boxServer from '../../js/course_server';
import { BOX_API } from '../../js/course_api';
export default {
computed: {
startDate() {
return this.getDate('start');
},
endDate() {
return this.getDate('end');
},
userInfo(){
return uni.getStorageSync('loginInfo') || {};
},
timeList(){
let _list = []
for(let i = 0; i<=24; i++){
_list.push(`${i<10?'0'+i:i}:00`)
}
return _list;
},
coachs(){
let { coachList } = this
let _arr = []
if(coachList.length > 0){
_arr = this.coachList.map(e=>e.name)
}
return _arr || [];
},
venues(){
let { venueList } = this
let _arr = []
if(venueList.length > 0){
_arr = this.venueList.map(e=>e.name)
}
return _arr || [];
},
},
data() {
return {
coachList: [], //
coachName: "", //
venueList: [], //
venueName: "", //
pageInfo: {},
submitInfo: {
coach_id: "",
date: "",
start: "",
end: "",
venue_id: "",
},
}
},
async onLoad(options){
// let _query = util.jsonPar(options.query);
// this.pageInfo = _query
// this.getStuInfo(options.order_no)
},
methods: {
getDate(type) {
const date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
if (type === 'start') {
year = year - 60;
} else if (type === 'end') {
year = year + 2;
}
month = month > 9 ? month : '0' + month;
day = day > 9 ? day : '0' + day;
return `${year}-${month}-${day}`;
},
//
bindDateChange: function(e) {
let _selectDate = e.target.value
this.submitInfo.date = _selectDate
},
startBindChange(e){
console.log(e);
let _list = this.timeList || [];
this.submitInfo.start = _list[e.detail.value] || ''
},
endBindChange(e){
console.log(e);
let _list = this.timeList || [];
this.submitInfo.end = _list[e.detail.value] || ''
},
coachBindChange(e){
console.log(e);
let _list = this.coachs || [];
this.coachName = _list[e.detail.value] || ''
this.submitInfo.coach_id = this.coachList[e.detail.value].id
},
venueBindChange(e){
console.log(e);
let _list = this.venues || [];
this.venueName = _list[e.detail.value] || ''
this.submitInfo.venue_id = this.venueList[e.detail.value].id
},
phoneCall(mobile) {
let _phoneStr = mobile || ''
let _phoneArr = _phoneStr.split(',') || [];
uni.showActionSheet({
itemList: _phoneArr,
success: res =>{
uni.makePhoneCall({
phoneNumber: _phoneArr[res.tapIndex]
})
}
})
},
confirmChange(){
let { pageInfo, submitInfo } = this
let { coach_id, date, start, end, venue_id } = this.submitInfo
if(coach_id==''||date==""||start=="" ||end=="" || (pageInfo.is_booking_venue==true && venue_id==''))return util.showNone("请完善必选项!");
let nowTime = util.formatDate(new Date(),'-') // 2020-07-21
if(new Date(nowTime).getTime() > new Date(date).getTime())return util.showNone("上课日期不能小于当前系统日期!");
// 2021-09-01便
if(Date.parse('2021-09-01 '+ start) >= Date.parse('2021-09-01 '+ end))return util.showNone("上课时间的结束时间不能小于起始时间!");
let _data = {
order_no: pageInfo.order_no,
coach_id, //ID
date, //
start, //
end, //
}
if(pageInfo.is_booking_venue == true)_data["venue_id"] = venue_id; //ID
util.showLoad();
boxServer.get({
url: BOX_API.student.arrangeStudentAc, //[]
data: _data,
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
util.showNone("操作成功!");
setTimeout(_=>{ uni.navigateBack() }, 1200)
})
},
// -
getStuInfo(order_no){
util.showLoad();
boxServer.get({
url: BOX_API.student.stuInfo,
data: {
order_no,
},
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
this.pageInfo = res
this.getArrangeAcCoach(res.order_no);
})
},
// [] -
getArrangeAcCoach(order_no){
util.showLoad();
boxServer.get({
url: BOX_API.student.arrangeStudentAcCoach,
data: {
order_no,
},
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
this.coachList = res.coachs || []
this.venueList = res.venues || []
})
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
page{
background: #F2F2F7;
}
.arrange-class{
position: relative;
padding-bottom: 150rpx;
.ac-info{
padding: 28rpx 22rpx 30rpx;
background-color: #FFFFFF;
>view{
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
&:first-child{
font-weight: 700;
margin-bottom: 4rpx;
}
&+view{
@include centerFlex(flex-start);
>image{
margin-left: 20rpx;
flex-shrink: 0;
width: 32rpx;
height: 32rpx;
}
}
}
}
.ac-section{
margin: 12rpx 0;
padding: 30rpx 28rpx 50rpx;
background-color: #FFFFFF;
.as-tit{
padding-bottom: 4rpx;
color: #333333;
font-size: 36rpx;
font-weight: 700;
line-height: 50rpx;
}
.as-line{
margin: 20rpx 46rpx 0 6rpx;
@include centerFlex(flex-start);
.al-txt{
position: relative;
margin-right: 18rpx;
flex-shrink: 0;
color: #1A1A1A;
font-size: 28rpx;
line-height: 44rpx;
>text{
color: #EA5061;
font-size: 32rpx;
}
.at-type{
position: absolute;
bottom: -36rpx;
left: 0;
min-width: 130rpx;
text-align: center;
color: #9C9C9F;
font-size: 24rpx;
line-height: 34rpx;
}
}
.al-picker{
flex-grow: 1;
}
.al-view{
flex-grow: 1;
padding-left: 20rpx;
height: 76rpx;
border-radius: 10rpx;
background-color: #F2F2F7;
@include centerFlex(flex-start);
}
.al-box{
>view{
flex-grow: 1;
color: #9C9C9F;
font-size: 28rpx;
line-height: 40rpx;
}
>image{
margin: 0 18rpx;
flex-shrink: 0;
width: 22rpx;
height: 22rpx;
}
}
.al-date{
.ad-txt{
flex-grow: 1;
color: #1A1A1A;
font-size: 28rpx;
line-height: 40rpx;
border-right: 2rpx solid #D8D8D8;
}
.ad-img{
flex-shrink: 0;
height: 76rpx;
padding: 0 16rpx 0 18rpx;
@include centerFlex(center);
>image{
flex-shrink: 0;
width: 34rpx;
height: 34rpx;
}
}
}
.al-time{
>view{
flex-grow: 1;
color: #1A1A1A;
font-size: 28rpx;
line-height: 40rpx;
min-width: 80rpx;
}
>image{
margin: 0 18rpx;
flex-shrink: 0;
width: 22rpx;
height: 22rpx;
}
}
.al-to{
margin: 0 28rpx;
flex-shrink: 0;
color: #B2B2B2;
font-size: 32rpx;
line-height: 44rpx;
}
}
}
.ac-fixed{
position: fixed;
bottom: 0;
left: 0;
padding: 20rpx 0;
width: 750rpx;
background-color: #FFFFFF;
>view{
margin: 0 auto;
padding: 24rpx 0;
width: 670rpx;
border-radius: 44rpx;
background-color: #009874;
color: #FFFFFF;
font-size: 28rpx;
line-height: 40rpx;
text-align: center;
font-weight: 700;
}
}
}
</style>

222
src/subpackage/course/pages/class_add_student/class_add_student.vue

@ -0,0 +1,222 @@
<template>
<view class="add-student">
<view class="as-search">
<view class="as-box">
<image src="/static/images/icon/search.png"></image>
<input class="ab-ipt" placeholder="请输入学员姓名/电话查找" confirm-type="search" v-model="searchText" @change="searchChange"/>
</view>
</view>
<view class="as-name">课程名称{{pageInfo.course_name||'-'}}</view>
<!-- studentList -->
<view class="as-list" v-for="(e,i) in 3" :key="i">
<view class="al-item" @click="itemChange(e,i)">
<image :class="[submitInfo.order_no==e.order_no?'ai-img':'ai-icon']" :src="submitInfo.order_no==e.order_no?'/static/images/icon/selected_987.png':''"></image>
<view class="ai-info">
<view>学员信息{{e.student_name||'-'}}{{e.student_gender || '-'}} {{userInfo.type==2?e.student_phone:''}}</view>
<view>剩余课时<text>{{e.course_period_nums_surplus || 0}}课时</text><text>{{e.course_period_nums_use||0}}/{{e.course_period_nums_total||0}})</text></view>
</view>
</view>
</view>
<view class="as-fixed">
<view hover-class="hover-active" @click="btnChange(1)">确认添加学员</view>
</view>
</view>
</template>
<script>
import util from '@/utils/util';
import boxServer from '../../js/course_server';
import { BOX_API } from '../../js/course_api';
export default {
computed:{
},
data() {
return {
pageInfo: {},
studentList: [],
searchText: "",
submitInfo: {
order_no: "",
subscribe_no: "",
},
}
},
onLoad(options) {
// this.submitInfo.subscribe_no = options.subscribe_no
// this.getSubStudent(options.subscribe_no)
},
methods: {
//
searchChange(e){
let { searchText, pageInfo } = this
if(searchText == '')return this.studentList = pageInfo.students;
this.studentList = pageInfo.students.filter(e=>e.student_name.indexOf(searchText)!=-1||e.student_phone.indexOf(searchText)!=-1 );
},
itemChange(info){
this.submitInfo.order_no = info.order_no
},
btnChange(type){
if(this.submitInfo.order_no=='')return util.showNone('请选择需要添加的学员!');
util.showModal({
title: '是否确认添加学员上课?',
content: '',
showCancel: true,
success: modalRes=>{
if(modalRes.confirm){
this.getSubAdd()
}
}
})
},
//
getSubAdd(){
let { order_no, subscribe_no} = this.submitInfo
util.showLoad();
boxServer.get({
url: BOX_API.appointment.subAdd,
data: {
order_no,
subscribe_no,
},
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
util.showNone('操作成功!');
setTimeout(_=>{
this.getSubStudent(subscribe_no);
util.previousPageFunction({
fnName: 'refreshList',
query: { isLoad: false},
});
},1200);
})
},
//
getSubStudent(subscribe_no){
util.showLoad();
boxServer.get({
url: BOX_API.appointment.subStudent,
data: {
subscribe_no,
},
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
this.searchText = ""
this.submitInfo.order_no = ""
this.pageInfo = res || {};
this.studentList = this.pageInfo.students || []
})
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
page{
background: #F2F2F7;
}
.add-student{
position: relative;
padding-bottom: 170rpx;
.as-search{
padding: 26rpx 24rpx;
background-color: #FFFFFF;
.as-box{
padding: 0rpx 20rpx;
height: 92rpx;
border-radius: 10rpx;
background-color: #F2F2F7;
@include centerFlex(flex-start);
>image{
flex-shrink: 0;
margin-right: 20rpx;
width: 40rpx;
height: 40rpx;
}
.ab-ipt{
flex-grow: 1;
color: #1A1A1A;
font-size: 32rpx;
}
}
}
.as-name{
margin-top: 2rpx;
padding: 26rpx 30rpx;
background-color: #FFFFFF;
color: #1A1A1A;
font-size: 28rpx;
font-weight: 700;
}
.as-list{
margin-top: 2rpx;
.al-item{
padding: 28rpx 40rpx;
display: flex;
justify-content: flex-start;
background-color: #FFFFFF;
>image{
flex-shrink: 0;
margin-right: 28rpx;
}
.ai-icon{
width: 36rpx;
height: 36rpx;
border-radius: 50%;
border: 2rpx solid #9A9A9D;
}
.ai-img{
width: 40rpx;
height: 40rpx;
}
.ai-info{
flex-grow: 1;
margin-top: -10rpx;
>view{
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
>text{
&:first-child{
color: #009874;
}
&:nth-child(2){
color: #9C9C9F;
}
}
}
}
}
}
.as-fixed{
position: fixed;
bottom: 0;
left: 0;
padding: 22rpx 0;
width: 750rpx;
background-color: #FFFFFF;
border-top: 2rpx solid #F2F2F7;
>view{
margin: 0 auto;
padding: 34rpx 0;
width: 670rpx;
border-radius: 10rpx;
background-color: #009874;
color: #FFFFFF;
font-size: 32rpx;
line-height: 44rpx;
text-align: center;
}
}
}
</style>

251
src/subpackage/course/pages/class_student_detail/class_student_detail.vue

@ -0,0 +1,251 @@
<template>
<view class="class-student-detail">
<view class="csd-section">
<view class="cs-view">学员姓名{{pageInfo.student_name||'-'}}{{pageInfo.student_gender||'-'}} </view>
<!-- 只有教务才有 -->
<view class="cs-view">
<text>学员电话{{pageInfo.student_phone ||'-'}}</text>
<image src="/subpackage/course/static/images/icon/phone.png" @click="phoneCall(pageInfo.student_phone)"></image>
</view>
<view class="cs-view">剩余课时{{pageInfo.course_period_residue ||0}}课时 {{pageInfo.course_period_nums_use||0}}/{{pageInfo.course_period_nums||0}})</view>
<view class="cs-end">
<!-- 只有教务才有 -->
<view class="ce-btn1" hover-class="hover-active" @click="isShowClass=true">转班</view>
</view>
</view>
<view class="csd-record">
<view class="cr-tit">上课记录</view>
<sclass-record-section ></sclass-record-section>
</view>
<!-- 转班弹框 -->
<class-reset-modal
:isShowClass="isShowClass"
:info="pageInfo"
:canlist="classList"
@confirmReset="confirmReset"
@closeReset="isShowClass=false"
></class-reset-modal>
</view>
</template>
<script>
import util from '@/utils/util';
import boxServer from '../../js/course_server';
import { BOX_API } from '../../js/course_api';
import class_reset_modal from '../../components/class_reset_modal/class_reset_modal.vue';
import sclass_record_section from '../../components/sclass_record_section/sclass_record_section.vue';
export default {
components: {
'class-reset-modal': class_reset_modal,
'sclass-record-section': sclass_record_section,
},
computed: {
},
data() {
return {
pageInfo: {},
isShowClass: false,
classList: [],
resetInfo: {},
}
},
async onLoad(options){
// let _query = util.jsonPar(options.query);
// this.pageInfo = _query
// this.$nextTick(_=>{
// })
},
methods: {
formatDate: util.formatDate,
phoneCall(mobile) {
let _phoneStr = mobile || ''
let _phoneArr = _phoneStr.split(',') || [];
uni.showActionSheet({
itemList: _phoneArr,
success: res =>{
uni.makePhoneCall({
phoneNumber: _phoneArr[res.tapIndex]
})
}
})
},
zh_status(status){
let arr = ["待上课","已上课","申请请假中","已请假","缺勤"]
return arr[status] || '';
},
//
toAppraise(){
let { pageInfo } = this
let _query = {
course_kind: "成班课",
course_name: pageInfo.course_name,
student_name: pageInfo.student_name,
student_gender: pageInfo.student_gender,
student_phone: pageInfo.student_phone,
sclass_name: pageInfo.sclass_name,
sclass_nums: pageInfo.sclass_nums,
}
util.routeTo(`/subpackage/manage/pages/appointment/appraise/appraise?order_no=${pageInfo.order_no}&query=${util.jsonStr(_query)}`,'nT');
},
//
confirmReset(e){
let { pageInfo } = this
util.showLoad();
boxServer.get({
url: BOX_API.class.reset,
data: {
old_id: pageInfo.sclass_id,
new_id: e.new_id,
user_id: pageInfo.user_id,
user_order_no: pageInfo.order_no,
},
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
util.showNone('操作成功!');
setTimeout(_=>{uni.navigateBack({delta:2})}, 1200)
})
},
//
getCanlist(course_id){
util.showLoad();
boxServer.get({
url: BOX_API.class.canlist,
data: {
course_id,
},
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
this.classList = res.list || []
})
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
page{
background: #FFFFFF;
}
.class-student-detail{
position: relative;
padding-bottom: 160rpx;
.csd-section{
padding: 24rpx 22rpx 0;
.cs-view{
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
@include centerFlex(flex-start);
>image{
margin-left: 30rpx;
flex-shrink: 0;
width: 32rpx;
height: 32rpx;
}
}
.cs-end{
margin-top: 16rpx;
padding: 30rpx 0;
border-top: 2rpx solid #E5E5E5;
@include centerFlex(flex-end);
>view{
margin-left: 20rpx;
padding: 12rpx 0;
width: 156rpx;
text-align: center;
font-size: 28rpx;
line-height: 40rpx;
border-radius: 6rpx;
border: 2rpx solid #009874;
}
.ce-btn1{
color: #009874;
background-color: #FFFFFF;
}
.ce-btn2{
color: #FFFFFF;
background-color: #009874;
}
}
}
.csd-record{
padding-bottom: 26rpx;
border-top: 24rpx solid #F2F2F7;
.cr-tit{
padding: 26rpx 22rpx;
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
}
.cds-tab{
margin: 0 24rpx;
border: 2rpx solid #E8E8E8;
background-color: #F6F8F8;
@include centerFlex(flex-start);
>view{
height: 110rpx;
color: #1A1A1A;
font-size: 28rpx;
text-align: center;
@include centerFlex(center);
&:first-child {
width: 166rpx;
}
&:nth-child(2){
width: 338rpx;
border-left: 2rpx solid #E8E8E8;
border-right: 2rpx solid #E8E8E8;
}
&:nth-child(3){
width: 194rpx;
// border-right: 2rpx solid #E8E8E8;
}
}
}
.cds-list{
.cl-item{
margin: 0 24rpx;
border-left: 2rpx solid #E8E8E8;
border-right: 2rpx solid #E8E8E8;
border-bottom: 2rpx solid #E8E8E8;
background-color: #FFFFFF;
@include centerFlex(flex-start);
>view{
height: 110rpx;
color: #1A1A1A;
font-size: 28rpx;
text-align: center;
@include centerFlex(center);
&:first-child {
width: 166rpx;
}
&:nth-child(2){
width: 338rpx;
border-left: 2rpx solid #E8E8E8;
border-right: 2rpx solid #E8E8E8;
}
&:nth-child(3){
width: 194rpx;
}
}
.ci-txt-green{
color: #009874;
}
.ci-txt-red{
color: #EA5061;
}
}
}
}
}
</style>

268
src/subpackage/course/pages/class_time_change/class_time_change.vue

@ -0,0 +1,268 @@
<template>
<view class="class-time-change">
<view class="ctc-info">
<view class="ci-weight">{{pageInfo.brand_name||'-'}}</view>
<view>课程名称{{pageInfo.course_name||'-'}}</view>
<view>所在班级{{pageInfo.sclass_name||'-'}}</view>
</view>
<view class="ctc-section">
<view class="cs-tit">{{pageInfo.lesson_no|| 0}}</view>
<view class="cs-line">
<view class="cl-txt"><text>*</text>上课日期</view>
<picker class="cl-picker" mode="date" :value="pageInfo.period_date" :start="startDate" :end="endDate" @change="bindDateChange" >
<view class="cl-box">
<view class="cb-txt">{{pageInfo.period_date}}</view>
<view class="cb-img">
<image src="/subpackage/course/static/images/icon/calendar.png"></image>
</view>
</view>
</picker>
</view>
<view class="cs-line">
<view class="cl-txt"><text>*</text>上课时间</view>
<picker class="cl-picker" :value="pageInfo.period_start_time" :range="timeList" @change="startBindChange">
<view class="cl-view">
<view>{{pageInfo.period_start_time}}</view>
<image src="/subpackage/course/static/images/icon/triangle.png"></image>
</view>
</picker>
<view class="cl-to"></view>
<picker class="cl-picker" :value="pageInfo.period_end_time" :range="timeList" @change="endBindChange">
<view class="cl-view">
<view>{{pageInfo.period_end_time}}</view>
<image src="/subpackage/course/static/images/icon/triangle.png"></image>
</view>
</picker>
</view>
</view>
<view class="fixed-btn">
<view hover-class="hover-active" @click="sclassTimeChange">确认更改</view>
</view>
</view>
</template>
<script>
import util from '@/utils/util';
import boxServer from '../../js/course_server';
import { BOX_API } from '../../js/course_api';
export default {
computed: {
startDate() {
return this.getDate('start');
},
endDate() {
return this.getDate('end');
},
timeList(){
let _list = []
for(let i = 0; i<=24; i++){
_list.push(`${i<10?'0'+i:i}:00`)
}
return _list;
},
},
data() {
return {
pageInfo: {
period_date: "",
period_start_time: "",
period_end_time: "",
},
}
},
onLoad(options){
// let _query = util.jsonPar(options.query);
// this.pageInfo = _query
},
methods: {
getDate(type) {
const date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
if (type === 'start') {
year = year - 60;
} else if (type === 'end') {
year = year + 2;
}
month = month > 9 ? month : '0' + month;
day = day > 9 ? day : '0' + day;
return `${year}-${month}-${day}`;
},
//
bindDateChange: function(e) {
let _selectDate = e.target.value
this.pageInfo.period_date = _selectDate
},
startBindChange(e){
console.log(e);
let _list = this.timeList || [];
this.pageInfo.period_start_time = _list[e.detail.value] || ''
},
endBindChange(e){
console.log(e);
let _list = this.timeList || [];
this.pageInfo.period_end_time = _list[e.detail.value] || ''
},
//
sclassTimeChange(){
let { pageInfo } = this
if(pageInfo.period_date==''|| pageInfo.period_start_time==''|| pageInfo.period_end_time=='')return util.showNone("请完善必选项!");
let nowTime = util.formatDate(new Date(),'-') // 2020-07-21
if(new Date(nowTime).getTime() > new Date(pageInfo.period_date).getTime())return util.showNone("上课日期不能小于当前系统日期!");
// 2021-09-01便
if(Date.parse('2021-09-01 '+ pageInfo.period_start_time) >= Date.parse('2021-09-01 '+ pageInfo.period_end_time))return util.showNone("上课时间的结束时间不能小于起始时间!");
this.$emit('closeChange')
util.showLoad();
boxServer.get({
url: BOX_API.schedule.sclassTimeChange,
data: {
id: pageInfo.sclass_id,
lesson_no: pageInfo.lesson_no,
period_date: pageInfo.period_date,
period_start_time: pageInfo.period_start_time,
period_end_time: pageInfo.period_end_time,
},
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
util.showNone('操作成功!');
setTimeout(_=>{
uni.navigateBack()
util.previousPageFunction({
fnName: 'refreshList',
query: { isLoad: false},
});
}, 1200)
})
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
page{
background: #F2F2F7;
}
.class-time-change{
position: relative;
padding-bottom: 160rpx;
.ctc-info{
padding: 24rpx 22rpx;
background-color: #FFFFFF;
>view{
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
}
.ci-weight{
font-weight: 700;
}
}
.ctc-section{
margin: 12rpx 0;
padding: 30rpx 56rpx 58rpx 28rpx;
background-color: #FFFFFF;
.cs-tit{
color: #333333;
font-size: 36rpx;
font-weight: 700;
line-height: 50rpx;
margin-bottom: 16rpx;
}
.cs-line{
margin-top: 32rpx;
@include centerFlex(flex-start);
.cl-txt{
margin-right: 20rpx;
flex-shrink: 0;
color: #1A1A1A;
font-size: 32rpx;
line-height: 44rpx;
>text{
color: #EA5061;
}
}
.cl-box{
flex-grow: 1;
padding-left: 20rpx;
height: 88rpx;
border-radius: 10rpx;
background-color: #F2F2F7;
@include centerFlex(flex-start);
.cb-txt{
flex-grow: 1;
border-right: 2rpx solid #D8D8D8;
color: #1A1A1A;
font-size: 28rpx;
}
.cb-img{
height: 88rpx;
padding: 0 22rpx 0 18rpx;
@include centerFlex(center);
>image{
width: 34rpx;
height: 34rpx;
}
}
}
.cl-picker{
flex-grow: 1;
}
.cl-view{
padding-left: 20rpx;
flex-grow: 1;
height: 88rpx;
border-radius: 10rpx;
background-color: #F2F2F7;
@include centerFlex(flex-end);
>view{
flex-grow: 1;
color: #1A1A1A;
font-size: 28rpx;
min-width: 80rpx;
}
>image{
margin: 0 18rpx;
flex-shrink: 0;
width: 22rpx;
height: 22rpx;
}
}
.cl-to{
margin: 0 26rpx;
flex-shrink: 0;
color: #B2B2B2;
font-size: 32rpx;
line-height: 44rpx;
}
}
}
.fixed-btn{
position: fixed;
bottom: 0;
left: 0;
width: 750rpx;
padding: 20rpx 0 24rpx;
background-color: #FFFFFF;
z-index: 2;
>view{
margin: auto;
padding: 24rpx 0;
width: 670rpx;
border-radius: 10rpx;
background-color: #009874;
color: #FFFFFF;
font-size: 28rpx;
text-align: center;
font-weight: 700;
}
}
}
</style>

11
src/subpackage/course/pages/index/index.vue

@ -33,7 +33,7 @@
<view class="ic-tablist" v-for="(e,i) in tabList" :key="i">
<view class="it-title">{{e.type}}</view>
<view class="it-tabs">
<view class="itt-item" v-for="(item,index) in e.itemList" :key="index" @click="tabChange(item.path)">
<view class="itt-item" v-for="(item,index) in e.itemList" :key="index" @click="tabChange(e.id,item.id)">
<view>
<image :src="'/subpackage/course/static/images/tab/tab_'+ e.id +'_'+ item.id + '.png'"></image>
<view>{{item.name}}</view>
@ -58,7 +58,7 @@ const tabList = [
{
id: 0,
name: "学员课程",
path: "",
path: "/subpackage/course/pages/manage_list/manage_list",
},
{
id: 1,
@ -100,9 +100,10 @@ export default {
},
methods: {
tabChange(path){
if(path=='')return util.showNone('开发中');
util.routeTo(path,'nT')
tabChange(id1,id2){
// if(path=='')return util.showNone('');
let _type_id = `${id1}-${id2}`
util.routeTo(`/subpackage/course/pages/manage_list/manage_list?type_id=${_type_id}`,'nT')
},
}
}

242
src/subpackage/course/pages/manage_detail/bclass_reserve_detail/bclass_reserve_detail.vue

@ -0,0 +1,242 @@
<template>
<view class="bclass-reserve-detail">
<view class="brd-line">
<view>欧轩智能场馆(羽毛球馆永泰店)</view>
<view :class="[false?'bl-gray':false?'bl-red':'bl-green']">待上课</view>
</view>
<view class="brd-section">
<view>预约单号<text>yy202106031256568595</text></view>
<view>预约时间<text>2021.06.03 11:42:50 </text></view>
<!-- 已取消才显示 -->
<block v-if="false">
<view>取消时间<text>2021.06.03 11:42:50</text></view>
<view>取消原因<text>学员取消有事请假</text></view>
</block>
</view>
<view class="brd-section">
<view>上课信息</view>
<view>上课时间<text>2021.06.02周五 14:00-16:00</text></view>
<view>上课地点<text>羽毛球3号场</text></view>
<view>上课教练<text>张瀚</text></view>
<view>课程名称<text>羽毛球培训课</text></view>
<view>课程类型<text>大班课</text></view>
</view>
<view class="brd-stu">
<view class="bs-tit">学员信息</view>
<view class="bs-line">
<view>已预约人数3<text>上课区间5-10</text></view>
<!-- 待确认待上课才显示 -->
<view v-if="true" @click="toAddStu">添加学员</view>
</view>
<view class="bs-list" v-for="i in 3" :key="i">
<view class="bl-item">
<view class="bi-info">
<view>熊启()
<text>18096895331</text>
<image src="/subpackage/course/static/images/icon/phone.png"></image>
</view>
<view>预约时间2020.12.27 22:55:56</view>
</view>
<!-- 待确认待上课才显示 -->
<view class="bi-btn" hover-class="hover-active" v-if="true">取消上课</view>
</view>
</view>
</view>
<!-- 待确认待上课才显示 -->
<view class="brd-fixed" v-if="true">
<view class="bf-line">
<view class="bl-btn1" hover-class="hover-active" @click="isCancelClass=true">取消上课</view>
<!-- v-if="pageInfo.status_text=='待确认'" -->
<view class="bl-btn2" hover-class="hover-active" >确认上课</view>
</view>
</view>
<cancel-class-modal
v-if="isCancelClass"
@reasonClose="isCancelClass=false"
></cancel-class-modal>
</view>
</template>
<script>
import util from '@/utils/util';
import boxServer from '../../../js/course_server';
import { BOX_API } from '../../../js/course_api';
import cancel_class_modal from '../../../components/cancel_class_modal/cancel_class_modal.vue';
export default {
components: {
'cancel-class-modal': cancel_class_modal,
},
data() {
return {
isCancelClass: false,
}
},
methods: {
toAddStu(){
util.routeTo(`/subpackage/course/pages/class_add_student/class_add_student`,'nT');
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
.bclass-reserve-detail{
position: relative;
padding-bottom: 150rpx;
.brd-line{
padding: 24rpx 44rpx 30rpx 30rpx;
background-color: #FFFFFF;
border-bottom: 2rpx solid #E5E5E5;
@include centerFlex(space-between);
>view{
font-size: 28rpx;
line-height: 40rpx;
&:first-child{
color: #1A1A1A;
font-weight: 700;
}
&:nth-child(2){
flex-shrink: 0;
margin-left: 10rpx;
}
}
.bl-green{
color: #009874;
}
.bl-gray{
color: #9C9C9F;
}
.bl-red{
color: #EA5061;
}
}
.brd-section{
margin-bottom: 2rpx;
padding: 25rpx 30rpx 30rpx;
background-color: #FFFFFF;
>view{
color: #9C9C9F;
font-size: 28rpx;
line-height: 52rpx;
>text{
color: #1A1A1A;
}
}
}
.brd-stu{
margin-top: 24rpx;
// padding: 26rpx 30rpx 38rpx;
background-color: #FFFFFF;
.bs-tit{
padding: 30rpx 30rpx 0;
color: #9A9A9D;
font-size: 28rpx;
line-height: 40rpx;
}
.bs-line{
padding: 12rpx 44rpx 26rpx 26rpx;
border-bottom: 2rpx solid #F2F2F7;
@include centerFlex(space-between);
>view{
font-size: 28rpx;
&:first-child{
color: #1A1A1A;
line-height: 52rpx;
>text{
color: #9C9C9F;
}
}
&:nth-child(2){
margin-left: 10rpx;
flex-shrink: 0;
color: #009874;
line-height: 40rpx;
text-decoration: underline;
}
}
}
.bs-list{
.bl-item{
margin: 0 30rpx;
padding: 30rpx 0rpx;
border-bottom: 2rpx solid #D8D8D8;
@include centerFlex(space-between);
.bi-info{
>view{
&:first-child{
color: #333333;
font-size: 32rpx;
line-height: 44rpx;
>text{
margin: 0 28rpx 0 40rpx;
}
>image{
flex-shrink: 0;
width: 32rpx;
height: 32rpx;
}
}
&:nth-child(2){
margin-top: 6rpx;
color: #B2B2B2;
font-size: 28rpx;
line-height: 40rpx;
}
}
}
.bi-btn{
padding: 12rpx 0;
width: 140rpx;
border: 2rpx solid #EA5061;
border-radius: 6rpx;
color: #EA5061;
font-size: 28rpx;
line-height: 40rpx;
text-align: center;
}
}
}
}
.brd-fixed{
position: fixed;
bottom: 0;
left: 0;
padding: 30rpx 0;
width: 750rpx;
background-color: #FFFFFF;
.bf-line{
margin-right: 32rpx;
@include centerFlex(flex-end);
>view{
margin-left: 20rpx;
padding: 20rpx 0;
width: 192rpx;
font-size: 28rpx;
text-align: center;
font-weight: 700;
border-radius: 6rpx;
}
.bl-btn1{
color: #EA5061;
border: 2rpx solid #EA5061;
background-color: #FFFFFF;
}
.bl-btn2{
color: #FFFFFF;
border: 2rpx solid #009874;
background-color: #009874;
}
.bl-btn3{
color: #009874;
border: 2rpx solid #009874;
background-color: #FFFFFF;
}
}
}
}
</style>

433
src/subpackage/course/pages/manage_detail/class_manage_detail/class_manage_detail.vue

@ -0,0 +1,433 @@
<template>
<view class="class-manage-detail" :class="[curTabID==2?'cmd-content':'']">
<view class="cmd-tab">
<tab-bar :tabList="tabList" :curTabID="curTabID" @change="tabChange"></tab-bar>
</view>
<!-- 班级详情 -->
<block v-if="curTabID==0">
<view class="cmd-status">课程状态<text :class="[false?'cs-gray':false?'cs-red':'cs-green']">成班中</text></view>
<view class="cmd-section">
<view>课程信息</view>
<view>欧轩智能羽毛球馆番禺店</view>
<view><text>课程名称</text>羽毛球培训课</view>
<view><text>课程课时数量</text>10节课</view>
<view><text>课时时长</text>1小时</view>
<view><text>课程有效期</text>2021.06.30-2021.09.30</view>
<!-- 成班中失败 -->
<block v-if="true">
<view><text>成班区间人数</text>2-6</view>
<view><text>报名截止时间</text>2021.07.12 23:50:50</view>
</block>
</view>
<view class="cmd-section">
<view>班级信息</view>
<view><text>班级id</text>2-3</view>
<view><text>班级名称</text></view>
<view><text>班级人数</text>20</view>
<view><text>上课教练</text></view>
<view><text>上课地点</text></view>
<view><text>课程日期</text></view>
</view>
<view class="cmd-fixed">
<view hover-class="hover-active" @click="confirmClass()">确认成班</view>
</view>
</block>
<!-- 班级学员 -->
<view class="cmd-stu" v-for="(item,i) in 3" :key="i" v-if="curTabID==1">
<view class="cs-item" @click="toStuDetail()">
<view class="ci-line">
<view>张安
<text>18316536894</text>
<image src="/subpackage/course/static/images/icon/phone.png"></image>
</view>
<image src="/subpackage/course/static/images/icon/arrow_black.png"></image>
</view>
<view class="ci-view">剩余课时10 共12节)</view>
<view class="ci-view"><text>有效期2020.12.27 22:55:56</text></view>
<view class="ci-btn">
<view hover-class="hover-active" @click.stop="isShowClass=true">转班</view>
</view>
</view>
</view>
<!-- 上课表 -->
<view class="cmd-schedule" v-if="curTabID==2">
<block v-if="true">
<view class="cs-tab">
<view>课时</view>
<view>上课时间</view>
<view>上课状态</view>
<view>操作</view>
</view>
<view class="cs-list" v-for="(e,i) in 6" :key="i">
<view class="cl-item">
<view>{{e.lesson_no|| '-'}}</view>
<!-- ${formatDate({date: e.period_date, partition: '.'}) ||'-'} -->
<view>{{`${' '+e.period_start_time || ''}-${e.period_end_time || ''}`}}</view>
<view
:class="[!e.status?'ci-txt-green':'']"
>{{e.status?'已上课':'待上课'}}</view>
<view>
<view hover-class="hover-active" v-if="!e.status" @click="toChange(e)">更改</view>
</view>
</view>
</view>
</block>
<view class="cmd-no" v-if="false">
<image src="/subpackage/course/static/images/no_order.png"></image>
<view>暂未排课</view>
</view>
</view>
<!-- 作业列表 -->
<view class="cmd-task" v-if="curTabID==3">
<task-section ref="refTask" :taskInfo="taskList" taskType="finish" v-if="true"></task-section>
<view class="cmd-no" v-if="false">
<image src="/subpackage/course/static/images/no_order.png"></image>
<view>暂未布置作业</view>
</view>
</view>
<!-- 转班弹框 -->
<class-reset-modal
:isShowClass="isShowClass"
:info="6"
:canlist="canlist"
@confirmReset="confirmReset"
@closeReset="isShowClass=false"
></class-reset-modal>
</view>
</template>
<script>
import util from '@/utils/util';
import boxServer from '../../../js/course_server';
import { BOX_API } from '../../../js/course_api';
import tabBar from '../../../components/tab_bar/tab_bar.vue';
import class_reset_modal from '../../../components/class_reset_modal/class_reset_modal.vue';
import task_section from '../../../components/task_section/task_section.vue';
const tabList=[
{name: '班级详情', id: 0}, {name: '班级学员', id: 1}, {name: '上课表', id: 2}, {name: '作业列表', id: 3},
];
export default {
components: {
'tab-bar': tabBar,
'class-reset-modal': class_reset_modal,
'task-section': task_section,
},
data() {
return {
tabList,
curTabID: 0,
isShowClass: false,
canlist: [],
taskList: [
{
work_content: "今年第三批高考综合改革省份迎来“新高考”,目前,全国实施新高考的省份达到了14个。实施新高考的省份,由于考试科目安",
},
{
work_content: "今年第三批高考综合改革省份迎来“新高考”,目前,全国实施新高考的省份达到了14个。实施新高考的省份,由于考试科目安排的不同,大部分在9日到10日间仍有部分科目的考试。今年新增的8个高考综合改革省份的考生,将在明天完成高中学业水平选考科目的考试后结束高考。",
},
{
work_content: "今年第三批高考综合改革省份迎来“新高考”,目前,全国实施新高考的省份达到了14个。实施新高考的省份,由于考试科目安今年第三批高考综合改革省份迎来“新高考”,目前省份,由于考试科目安",
}
],
}
},
methods: {
formatDate: util.formatDate,
tabChange: util.debounce(function(e){
this.curTabID = e.id;
this.refreshList();
this.$nextTick(() => {
if(this.curTabID==3 && this.taskList.length>0)this.$refs.refTask.initDesc();
});
}, 300, true),
refreshList(){
},
confirmClass(){
util.showModal({
title: '是否确认成班',
content: '确认后代表用户报名成功,提前成立班级安排上课',
showCancel: true,
success: modalRes=>{
if(modalRes.confirm){
// util.showLoad();
// boxServer.get({
// url: BOX_API.schedule.cancelBclassAc,
// data: {
// subscribe_no,
// },
// failMsg: ''
// })
// .then(res=>{
// util.hideLoad();
// this.doSuccess()
// })
}
}
})
},
btnChange(){},
toStuDetail(){
util.routeTo(`/subpackage/course/pages/class_student_detail/class_student_detail`,'nT');
},
//
confirmReset(e){
// this.resetInfo["new_id"] = e.new_id
// this.$emit('confirmReset',this.resetInfo)
},
toChange(){
util.routeTo(`/subpackage/course/pages/class_time_change/class_time_change`,'nT');
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
.class-manage-detail{
position: relative;
padding: 102rpx 0 170rpx;
.cmd-tab{
position: fixed;
top: 0;
left: 0;
width: 750rpx;
border-bottom: 2rpx solid #F2F2F7;
z-index: 10;
}
.cmd-status{
margin-top: 24rpx;
padding: 24rpx 48rpx;
background-color: #FFFFFF;
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
font-weight: 700;
.cs-green{
color: #009874;
}
.cs-gray{
color: #9C9C9F;
}
.cs-red{
color: #EA5061;
}
}
.cmd-section{
margin-top: 2rpx;
padding: 38rpx 48rpx 30rpx;
background-color: #FFFFFF;
>view{
&:first-child{
margin-bottom: 20rpx;
color: #9C9C9F;
font-size: 32rpx;
line-height: 44rpx;
}
&+view{
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
>text{
color: #9C9C9F;
}
}
}
}
.cmd-fixed{
position: fixed;
bottom: 0;
left: 0;
padding: 22rpx 0;
width: 750rpx;
background-color: #FFFFFF;
border-top: 2rpx solid #F2F2F7;
>view{
margin: 0 auto;
padding: 34rpx 0;
width: 670rpx;
border-radius: 10rpx;
background-color: #009874;
color: #FFFFFF;
font-size: 32rpx;
line-height: 44rpx;
text-align: center;
}
}
.cmd-stu{
margin-top: 24rpx;
.cs-item{
position: relative;
flex-grow: 1;
margin-top: 2rpx;
padding: 26rpx 22rpx 20rpx;
background-color: #FFFFFF;
.ci-line{
margin: 0 26rpx;
@include centerFlex(space-between);
>view{
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
>text{
margin: 0 30rpx;
}
>image{
flex-shrink: 0;
width: 32rpx;
height: 32rpx;
}
}
>image{
flex-shrink: 0;
width: 20rpx;
height: 20rpx;
}
}
.ci-view{
margin-left: 26rpx;
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
>text{
color: #9C9C9F;
}
}
.ci-btn{
margin-top: 18rpx;
padding-top: 28rpx;
border-top: 2rpx solid #E5E5E5;
@include centerFlex(flex-end);
>view{
padding: 12rpx 0;
width: 156rpx;
border-radius: 6rpx;
border: 2rpx solid #009874;
color: #009874;
font-size: 28rpx;
line-height: 40rpx;
text-align: center;
}
}
}
}
.cmd-schedule{
padding-top: 24rpx;
border-top: 24rpx solid #F2F2F7;
.cs-tab{
margin: 0 24rpx;
border: 2rpx solid #E8E8E8;
background-color: #F6F8F8;
@include centerFlex(flex-start);
>view{
height: 110rpx;
color: #1A1A1A;
font-size: 28rpx;
text-align: center;
@include centerFlex(center);
&:first-child {
width: 130rpx;
}
&:nth-child(2){
width: 204rpx;
border-left: 2rpx solid #E8E8E8;
border-right: 2rpx solid #E8E8E8;
}
&:nth-child(3){
width: 204rpx;
border-right: 2rpx solid #E8E8E8;
}
&:nth-child(4){
width: 158rpx;
}
}
}
.cs-list{
.cl-item{
margin: 0 24rpx;
border-left: 2rpx solid #E8E8E8;
border-right: 2rpx solid #E8E8E8;
border-bottom: 2rpx solid #E8E8E8;
background-color: #FFFFFF;
@include centerFlex(flex-start);
>view{
height: 110rpx;
color: #1A1A1A;
font-size: 28rpx;
text-align: center;
@include centerFlex(center);
&:first-child {
width: 130rpx;
}
&:nth-child(2){
width: 204rpx;
border-left: 2rpx solid #E8E8E8;
border-right: 2rpx solid #E8E8E8;
}
&:nth-child(3){
width: 204rpx;
border-right: 2rpx solid #E8E8E8;
}
&:nth-child(4){
width: 158rpx;
>view{
padding: 4rpx 0;
width: 110rpx;
border-radius: 6rpx;
background-color: #009874;
color: #FFFFFF;
font-size: 28rpx;
font-weight: 700;
text-align: center;
line-height: 40rpx;
}
}
}
.ci-txt-green{
color: #009874;
}
}
}
}
.cmd-task{
margin-top: 24rpx;
}
.cmd-no{
display: flex;
flex-direction: row;
flex-direction: column;
flex-wrap: wrap;
justify-content: center;
align-items: center;
margin-top: 150rpx;
>image{
width: 346rpx;
height: 346rpx;
}
>view{
margin-top: 46rpx;
color: #9C9C9F;
font-size: 32rpx;
line-height: 44rpx;
text-align: center;
}
}
}
.cmd-content{
min-height: 100vh;
background-color: #FFFFFF;
}
</style>

159
src/subpackage/course/pages/manage_detail/private_reserve_detail/private_reserve_detail.vue

@ -0,0 +1,159 @@
<template>
<view class="private-reserve-detail">
<view class="prd-line">
<view>欧轩智能场馆(羽毛球馆永泰店)</view>
<view :class="[false?'pl-gray':false?'pl-red':'pl-green']">待上课</view>
</view>
<view class="prd-section">
<view>预约单号<text>yy202106031256568595</text></view>
<view>预约时间<text>2021.06.03 11:42:50 </text></view>
<!-- 已取消才显示 -->
<block v-if="false">
<view>取消时间<text>2021.06.03 11:42:50</text></view>
<view>取消原因<text>学员取消有事请假</text></view>
</block>
</view>
<view class="prd-section">
<view>上课信息</view>
<view>上课时间<text>2021.06.02周五 14:00-16:00</text></view>
<view>上课地点<text>羽毛球3号场</text></view>
<view>上课教练<text>张瀚</text></view>
<view>课程名称<text>羽毛球培训课</text></view>
<view>课程类型<text>私教课</text></view>
<view>课程节数<text>第3节共12节</text></view>
</view>
<view class="prd-stu">
<view class="ps-tit">学员信息</view>
<view class="ps-line">
<view class="pl-info">
<view>熊启()
<text>18096895331</text>
<image src="/subpackage/course/static/images/icon/phone.png"></image>
</view>
<view>预约时间2020.12.27 22:55:56</view>
</view>
<!-- 待上课才显示 -->
<view class="pl-btn" hover-class="hover-active" v-if="true" @click="isCancelClass=true">取消上课</view>
</view>
</view>
<cancel-class-modal
v-if="isCancelClass"
@reasonClose="isCancelClass=false"
></cancel-class-modal>
</view>
</template>
<script>
import util from '@/utils/util';
import boxServer from '../../../js/course_server';
import { BOX_API } from '../../../js/course_api';
import cancel_class_modal from '../../../components/cancel_class_modal/cancel_class_modal.vue';
export default {
components: {
'cancel-class-modal': cancel_class_modal,
},
data() {
return {
isCancelClass: false,
}
},
methods: {
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
.private-reserve-detail{
.prd-line{
padding: 24rpx 44rpx 30rpx 30rpx;
background-color: #FFFFFF;
border-bottom: 2rpx solid #E5E5E5;
@include centerFlex(space-between);
>view{
font-size: 28rpx;
line-height: 40rpx;
&:first-child{
color: #1A1A1A;
font-weight: 700;
}
&:nth-child(2){
flex-shrink: 0;
margin-left: 10rpx;
}
}
.pl-green{
color: #009874;
}
.pl-gray{
color: #9C9C9F;
}
.pl-red{
color: #EA5061;
}
}
.prd-section{
margin-bottom: 2rpx;
padding: 25rpx 30rpx 30rpx;
background-color: #FFFFFF;
>view{
color: #9C9C9F;
font-size: 28rpx;
line-height: 52rpx;
>text{
color: #1A1A1A;
}
}
}
.prd-stu{
margin-top: 24rpx;
padding: 26rpx 30rpx 38rpx;
background-color: #FFFFFF;
.ps-tit{
color: #9A9A9D;
font-size: 28rpx;
line-height: 40rpx;
}
.ps-line{
margin-top: 26rpx;
@include centerFlex(space-between);
.pl-info{
>view{
&:first-child{
color: #333333;
font-size: 32rpx;
line-height: 44rpx;
>text{
margin: 0 28rpx 0 40rpx;
}
>image{
flex-shrink: 0;
width: 32rpx;
height: 32rpx;
}
}
&:nth-child(2){
margin-top: 6rpx;
color: #B2B2B2;
font-size: 28rpx;
line-height: 40rpx;
}
}
}
.pl-btn{
padding: 12rpx 0;
width: 140rpx;
border: 2rpx solid #EA5061;
border-radius: 6rpx;
color: #EA5061;
font-size: 28rpx;
line-height: 40rpx;
text-align: center;
}
}
}
}
</style>

302
src/subpackage/course/pages/manage_detail/student_course_detail/student_course_detail.vue

@ -0,0 +1,302 @@
<template>
<view class="student-course-detail" :class="[false?'scd-content':'']">
<view class="scd-section">
<view class="ss-status">进行中</view>
<view class="ss-view">学员姓名张安 </view>
<view class="ss-view">学员电话18316536894
<image src="/subpackage/course/static/images/icon/phone.png"></image>
</view>
<view class="ss-view">剩余课时10课时 共12节)</view>
<!-- 私教课大班课 才有安排上课 -->
<view class="ss-line" v-if="true">
<view hover-class="hover-active" @click="toArrangeClass">安排上课</view>
</view>
</view>
<view class="scd-tab">
<tab-bar :tabList="tabList" :curTabID="curTabID" @change="tabChange"></tab-bar>
</view>
<!-- 课程详情 -->
<view class="scd-info" v-if="curTabID==0">
<view class="si-tit">欧轩智能场馆(羽毛球馆永泰店)</view>
<view>羽毛球杀球训练私教课</view>
<view><text>课程类型</text>私教课</view>
<view><text>总课时</text>14</view>
<!-- 私教课大班课 -->
<block v-if="true">
<view><text>购买课时</text>10</view>
<view><text>赠送课时</text>4</view>
<view><text>有效期至</text>至2022.06.02</view>
<view><text>课时时长</text>2小时/</view>
<view><text>上课教练</text>一级教练</view>
<!-- 私教课才有上课内容 -->
<view v-if="true"><text>上课内容</text></view>
<view><text>上课是否需要场地</text>不含场地费用</view>
</block>
<!-- 成班课 -->
<block v-if="false">
<view><text>课时时长</text>45分钟/</view>
<view><text>有效期至</text>2022.06.02-2022.12.02</view>
<view class="si-tit si-mar">班级信息</view>
<view><text>班级id</text>2-1</view>
<view><text>班级名称</text>冲锋班</view>
<view><text>班级人数</text>20</view>
<view><text>上课教练</text>张三</view>
<view><text>上课地点</text>欧轩智能场馆3号馆</view>
<view><text>课程日期</text>2021.08.08-2021.10.10</view>
</block>
</view>
<!-- 上课记录 -->
<view class="scd-record" v-if="curTabID==1">
<!-- 私教课大班课 -->
<view class="sr-list" v-for="i in 3" :key="i" v-if="false">
<view class="sl-item">
<view>
<view class="si-box">
<view>预约单号yy202106031256568595</view>
<view :class="[true?'sb-red':false?'sb-gray':'sb-green']">已取消</view>
</view>
<view class="si-time">2021.06.03 11:42:50 预约</view>
</view>
<view class="si-wei">课程节数第3节共12节</view>
<view><text>上课时间</text>2021.06.02周五 14:00-16:00</view>
<view><text>上课地点</text>羽毛球3号场</view>
<view><text>上课教练</text>张三</view>
<!-- 已取消显示 -->
<block v-if="true">
<view><text>取消时间</text>2021.06.03 11:42:50</view>
<view><text>取消原因</text>教练取消</view>
</block>
</view>
</view>
<view class="sr-sclass" v-if="true">
<sclass-record-section ></sclass-record-section>
</view>
</view>
<!-- 作业列表 -->
<view class="scd-task" v-if="curTabID==2">
<task-section ref="refTask" :taskInfo="taskList"></task-section>
</view>
</view>
</template>
<script>
import util from '@/utils/util';
import boxServer from '../../../js/course_server';
import { BOX_API } from '../../../js/course_api';
import { mapState } from 'vuex';
import tabBar from '../../../components/tab_bar/tab_bar.vue';
import sclass_record_section from '../../../components/sclass_record_section/sclass_record_section.vue';
import task_section from '../../../components/task_section/task_section.vue';
const tabList=[
{name: '课程详情', id: 0}, {name: '上课记录', id: 1}, {name: '作业列表', id: 2},
];
export default {
components: {
'tab-bar': tabBar,
'sclass-record-section': sclass_record_section,
'task-section': task_section,
},
data() {
return {
tabList,
curTabID: 0,
taskList: [
{
// isShowExpande: false,
// expande: false,
work_content: "今年第三批高考综合改革省份迎来“新高考”,目前,全国实施新高考的省份达到了14个。实施新高考的省份,由于考试科目安",
},
{
// isShowExpande: false,
// expande: false,
work_content: "今年第三批高考综合改革省份迎来“新高考”,目前,全国实施新高考的省份达到了14个。实施新高考的省份,由于考试科目安排的不同,大部分在9日到10日间仍有部分科目的考试。今年新增的8个高考综合改革省份的考生,将在明天完成高中学业水平选考科目的考试后结束高考。",
},
{
// isShowExpande: false,
// expande: false,
work_content: "今年第三批高考综合改革省份迎来“新高考”,目前,全国实施新高考的省份达到了14个。实施新高考的省份,由于考试科目安今年第三批高考综合改革省份迎来“新高考”,目前省份,由于考试科目安",
}
],
}
},
onLoad() {
},
methods: {
tabChange: util.debounce(function(e){
this.curTabID = e.id;
this.refreshList();
this.$nextTick(() => {
if(this.curTabID==2)this.$refs.refTask.initDesc();
});
}, 300, true),
refreshList(){
},
toArrangeClass(){
util.routeTo(`/subpackage/course/pages/arrange_class/arrange_class`,'nT');
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
page{
background: #F2F2F7;
}
.student-course-detail{
.scd-section{
border-bottom: 26rpx solid #F2F2F7;
position: relative;
padding: 24rpx 24rpx 18rpx;
background-color: #FFFFFF;
.ss-status{
position: absolute;
top: 24rpx;
right: 24rpx;
color: #009874;
font-size: 28rpx;
line-height: 52rpx;
}
.ss-view{
padding-right: 84rpx;
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
@include centerFlex(flex-start);
>image{
margin-left: 30rpx;
flex-shrink: 0;
width: 32rpx;
height: 32rpx;
}
}
.ss-line{
margin-top: 18rpx;
padding: 28rpx 0 12rpx;
border-top: 2rpx solid #E5E5E5;
@include centerFlex(flex-end);
>view{
padding: 12rpx 0;
width: 156rpx;
border-radius: 6rpx;
background-color: #009874;
color: #FFFFFF;
font-size: 28rpx;
line-height: 40rpx;
text-align: center;
}
}
}
.scd-tab{
border-bottom: 2rpx solid #F2F2F7;
}
.scd-info{
padding: 26rpx 44rpx 30rpx;
background-color: #FFFFFF;
>view{
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
>text{
color: #9C9C9F;
}
}
.si-tit{
margin: 0 2rpx 14rpx;
color: #1A1A1A;
font-size: 28rpx;
line-height: 40rpx;
font-weight: 700;
}
.si-view{
color: #9C9C9F;
font-size: 28rpx;
line-height: 52rpx;
>text{
color: #1A1A1A;
}
}
.si-mar{
margin-top: 40rpx;
}
}
.scd-record{
.sr-list{
margin-bottom: 24rpx;
.sl-item{
padding: 24rpx 44rpx 30rpx;
background-color: #FFFFFF;
>view{
&:first-child{
margin-bottom: 18rpx;
padding-bottom: 26rpx;
border-bottom: 2rpx solid #E8E8E8;
}
&+view{
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
>text{
color: #9A9A9D;
}
}
}
.si-box{
@include centerFlex(space-between);
>view{
font-size: 28rpx;
line-height: 40rpx;
&:first-child{
color: #333333;
font-weight: 700;
}
&:nth-child(2){
flex-shrink: 0;
}
}
.sb-green{
color: #009874;
}
.sb-gray{
color: #9C9C9F;
}
.sb-red{
color: #EA5061;
}
}
.si-time{
margin-top: 12rpx;
color: #9A9A9D;
font-size: 24rpx;
line-height: 34rpx;
}
.si-wei{
font-weight: 700;
}
}
}
.sr-sclass{
padding: 20rpx 0 100rpx;
background-color: #FFFFFF;
}
}
.scd-task{
margin-top: 24rpx;
}
}
.scd-content{
min-height: 100vh;
background-color: #FFFFFF;
}
</style>

188
src/subpackage/course/pages/manage_list/manage_list.vue

@ -0,0 +1,188 @@
<template>
<view class="manage-list">
<block v-if="true">
<view class="ml-head">
<store-name></store-name>
<view class="mh-view">
<image class="mv-icon" src="/static/images/icon/search.png"></image>
<input class="mv-ipt" :placeholder="plaTxt" />
</view>
<tab-bar :tabList="tabList" :curTabID="curTabID" @change="tabChange"></tab-bar>
</view>
<view class="ml-list" v-for="(e,i) in 6" :key="i" v-if="true">
<student-course-item :orderInfo="e" v-if="typeId == '0-0'"></student-course-item>
<private-reserve-item :orderInfo="e" v-if="typeId == '0-1'"></private-reserve-item>
<bclass-reserve-item :orderInfo="e" v-if="typeId == '0-2'"></bclass-reserve-item>
<class-manage-item :orderInfo="e" v-if="typeId == '0-3'"></class-manage-item>
</view>
<view class="no-item no-list" v-if="false">
<image src="/subpackage/course/static/images/no_order.png"></image>
<view>{{ tipsText }}</view>
</view>
</block>
<view class="no-list" v-if="false">
<image src="/subpackage/course/static/images/no_order.png"></image>
<view>{{ tipsText }}</view>
</view>
</view>
</template>
<script>
import util from '@/utils/util';
import boxServer from '../../js/course_server';
import { BOX_API } from '../../js/course_api';
import { mapState } from 'vuex';
import tabBar from '../../components/tab_bar/tab_bar.vue';
import store_name from '../../components/store_name/store_name';
import student_course_item from '../../components/manage/student_course_item/student_course_item.vue';
import private_reserve_item from '../../components/manage/private_reserve_item/private_reserve_item.vue';
import bclass_reserve_item from '../../components/manage/bclass_reserve_item/bclass_reserve_item.vue';
import class_manage_item from '../../components/manage/class_manage_item/class_manage_item.vue';
export default {
components: {
'tab-bar': tabBar,
'store-name': store_name,
'student-course-item': student_course_item,
'private-reserve-item': private_reserve_item,
'bclass-reserve-item': bclass_reserve_item,
'class-manage-item': class_manage_item,
},
computed:{
// ...mapState([ 'storeInfo' ]),
titleName(){
let { typeId } = this;
if(typeId == '0-0')return '学员管理';
if(typeId == '0-1')return '私教约课记录';
if(typeId == '0-2')return '大班约课记录';
if(typeId == '0-3')return '班级管理';
return '订单管理列表';
},
tipsText(){
let { typeId } = this;
if(typeId == '0-0')return '暂无学员';
if(typeId == '0-1')return '暂无约课记录';
if(typeId == '0-2')return '暂无约课记录';
if(typeId == '0-3')return '暂无班级';
return '';
},
plaTxt(){
let { typeId } = this;
if(typeId == '0-0')return '请输入课程名称/学员姓名/电话查找';
if(typeId == '0-1')return '请输入课程名称/学员姓名/电话查找';
if(typeId == '0-2')return '请输入教练姓名查找';
if(typeId == '0-3')return '请输入课程名称/班级名称查找';
return '';
},
tabList(){
let _list0 = [{name: '全部', id: 0}, {name: '进行中', id: 1}, {name: '已结束', id: 2}, {name: '已退款', id: 3}];
let _list1 = [{name: '全部', id: 0}, {name: '待上课', id: 1}, {name: '已上课', id: 2}, {name: '已取消', id: 3}];
let _list2 = [{name: '全部', id: 0}, {name: '待确认', id: 1}, {name: '待上课', id: 2}, {name: '已上课', id: 3}, {name: '已取消', id: 4}];
let _list3 = [{name: '全部', id: 0}, {name: '成班中', id: 1}, {name: '进行中', id: 2}, {name: '已结束', id: 3}, {name: '失败', id: 4}];
let { typeId } = this;
if(typeId == '0-0')return _list0;
if(typeId == '0-1')return _list1;
if(typeId == '0-2')return _list2;
if(typeId == '0-3')return _list3;
return [];
},
},
data() {
return {
curTabID: 0,
page: 1,
typeId: "",
}
},
onLoad(options){
// let _query = util.jsonPar(options.query);
// this.optionsQuery = _query
this.typeId = options.type_id || ''
this.$nextTick(_=>{
uni.setNavigationBarTitle({
title: this.titleName
})
// this.getCommentList({});
})
},
methods: {
tabChange: util.debounce(function(e){
this.curTabID = e.id;
this.refreshList();
}, 300, true),
refreshList(){
this.page = 1;
// this.subList = [];
// this.getSubscribeList({});
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
page{
background: #F2F2F7;
}
.manage-list{
position: relative;
padding-top: 292rpx;
padding-bottom: 24rpx;
.ml-head{
position: fixed;
top: 0;
left: 0;
width: 750rpx;
background-color: #FFFFFF;
border-bottom: 2rpx solid #F2F2F7;
z-index: 6;
.mh-view{
margin: 0 24rpx;
padding: 0 20rpx;
flex-grow: 1;
height: 92rpx;
border-radius: 10rpx;
background-color: #F2F2F7;
@include centerFlex(flex-start);
.mv-icon{
margin-right: 20rpx;
flex-shrink: 0;
width: 40rpx;
height: 40rpx;
}
.mv-ipt{
flex-grow: 1;
color: #333;
font-size: 32rpx;
line-height: 44rpx;
}
}
}
.ml-list{
margin-top: 24rpx;
}
.no-item{
margin-top: 128rpx;
}
.no-list{
display: flex;
flex-direction: row;
flex-direction: column;
flex-wrap: wrap;
justify-content: center;
align-items: center;
>image{
width: 346rpx;
height: 346rpx;
}
>view{
margin: 46rpx 0;
color: #9C9C9F;
font-size: 32rpx;
line-height: 44rpx;
text-align: center;
}
}
}
</style>

132
src/subpackage/course/pages/task_detail/task_detail.vue

@ -0,0 +1,132 @@
<template>
<view class="task-detail">
<view class="td-info">
<view class="td-txt">布置作业时间{{formatDate({date: pageInfo.created_at, partition: '/'}) || '-'}}</view>
<view class="td-txt">发布人{{pageInfo.work_coach_name || '-'}}</view>
<view class="td-txt td-tit">作业内容</view>
<view class="td-txt">{{pageInfo.work_content || '-'}}</view>
<view class="td-line">
<view>视频链接{{pageInfo.work_video || '无'}}</view>
<view @click="copyOrder(pageInfo.work_video)">复制</view>
</view>
<image class="td-img" mode="aspectFill" v-for="(e,i) in pageInfo.work_imgs" :key="i" :src="e || ''" @tap="previewImageWork(e)"></image>
</view>
<view class="td-info">
<view class="td-txt">作业提交时间{{pageInfo.student_work_at!=''?formatDate({date: pageInfo.student_work_at, partition: '/'}) : ''}}</view>
<view class="td-txt">提交人{{pageInfo.student_name || '-'}}</view>
<view class="td-txt td-tit">完成情况</view>
<view class="td-txt">{{pageInfo.student_work_content ||'无'}}</view>
<view class="td-line">
<view>视频链接{{pageInfo.student_work_video || '无'}}</view>
<view @click="copyOrder(pageInfo.student_work_video)">复制</view>
</view>
<image class="td-img" mode="aspectFill" v-for="(e,i) in pageInfo.student_work_imgs" :key="i" :src="e || ''" @tap="previewImageStu(e)"></image>
</view>
</view>
</template>
<script>
import util from '@/utils/util';
import boxServer from '../../js/course_server';
import { BOX_API } from '../../js/course_api';
export default {
data() {
return {
pageInfo: {},
}
},
async onLoad(options){
// let _query = util.jsonPar(options.query);
// this.pageInfo = _query
// this.getWorkInfo(options.id)
},
methods: {
formatDate: util.formatDate,
copyOrder(data){
uni.setClipboardData({ data })
},
previewImageWork(img){
uni.previewImage({
current: img,
urls: this.pageInfo.work_imgs
})
},
//
previewImageStu(img) {
// var current = e.target.dataset.src
uni.previewImage({
current: img,
urls: this.pageInfo.student_work_imgs
})
},
// -
getWorkInfo(id){
util.showLoad();
boxServer.get({
url: BOX_API.student.workInfo,
data: {
id,
},
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
this.pageInfo = res
})
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
// page{
// background: #F2F2F7;
// }
.task-detail{
.td-info{
margin-bottom: 12rpx;
padding: 24rpx 0 30rpx;
background-color: #FFFFFF;
.td-txt{
margin: 0 60rpx 0 24rpx;
color: #1A1A1A;
font-size: 28rpx;
line-height: 40rpx;
}
.td-tit{
font-weight: 700;
margin: 44rpx 24rpx 20rpx;
}
.td-line{
margin: 30rpx 60rpx 0 26rpx;
flex-grow: 1;
padding: 30rpx 4rpx 6rpx;
border-top: 2rpx solid #D8D8D8;
@include centerFlex(flex-start);
>view{
font-size: 28rpx;
&:first-child{
color: #9A9A9D;
line-height: 40rpx;
@include textHide(1);
}
&:nth-child(2){
margin-left: 20rpx;
flex-shrink: 0;
color: #009874;
}
}
}
.td-img{
margin: 24rpx 16rpx 0 30rpx;
display: inline-block;
width: 200rpx;
height: 200rpx;
border-radius: 10rpx;
}
}
}
</style>

147
src/subpackage/course/pages/task_finish_list/task_finish_list.vue

@ -0,0 +1,147 @@
<template>
<view class="task-finish-list">
<!-- v-if="workList.length>0" -->
<block >
<view class="tfl-box">
<view>布置作业时间{{formatDate({date: pageInfo.created_at, partition: '/'}) || '-'}}</view>
<view>发布人{{pageInfo.work_coach_name||'-'}}</view>
</view>
<!-- workList -->
<view class="tfl-list" v-for="(e,i) in 3" :key="i">
<view class="tl-item" @click="toDetail(e)">
<view class="ti-info">
<view>{{e.student_name||'-'}}{{e.student_gender||'-'}}</view>
<view>{{'-'}}</view>
</view>
<view class="ti-section">
<view v-if="e.work_status==1">{{formatDate({date: pageInfo.student_work_at,}) ||'-'}}</view>
<view class="ts-line">
<view :class="[e.work_status==1?'':'tl-txt']">{{e.work_status==1?'已完成':'未完成'}}</view>
<image src="/subpackage/course/static/images/icon/arrow_black.png"></image>
</view>
</view>
</view>
</view>
<!-- <view class="fixed-btn">
<view hover-class="hover-active" @click="batchRemind">批量提醒完成</view>
</view> -->
</block>
</view>
</template>
<script>
import util from '@/utils/util';
import boxServer from '../../js/course_server';
import { BOX_API } from '../../js/course_api';
export default {
computed:{
},
data() {
return {
pageInfo: {},
workList: [],
}
},
onLoad(options) {
// let _query = util.jsonPar(options.query);
// this.pageInfo = _query
// let { work_number } = options
// this.pageInfo = options
// this.$nextTick(_=>{
// this.getClassWork()
// })
},
methods: {
formatDate: util.formatDate,
// -
getClassWork(){
let { work_number } = this.pageInfo
util.showLoad();
boxServer.get({
url: BOX_API.class.classWork,
data: {
work_number,
},
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
let _list = res || []
this.workList = _list
if(_list.length>0){
this.pageInfo["created_at"] = _list[0].created_at
this.pageInfo["work_coach_name"] = _list[0].work_coach_name
}
})
},
toDetail(item){
util.routeTo(`/subpackage/manage/pages/student/task_detail/task_detail?id=${item.id}`,'nT')
},
//
batchRemind(){
util.showNone('开发中!');
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
page{
background: #F2F2F7;
}
.task-finish-list{
position: relative;
padding-bottom: 160rpx;
.tfl-box{
flex-grow: 1;
padding: 24rpx 22rpx;
background-color: #FFFFFF;
border-bottom: 12rpx solid #F2F2F7;
>view{
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
}
}
.tfl-list{
.tl-item{
padding: 20rpx 36rpx 20rpx 46rpx;
background-color: #FFFFFF;
border-bottom: 2rpx solid #F2F2F7;
@include centerFlex(space-between);
.ti-info{
>view{
color: #1A1A1A;
font-size: 28rpx;
line-height: 52rpx;
}
}
.ti-section{
color: #9C9C9F;
font-size: 28rpx;
line-height: 52rpx;
.ts-time{
}
.ts-line{
@include centerFlex(flex-end);
>image{
margin: 0 2rpx 0 20rpx;
flex-shrink: 0;
width: 20rpx;
height: 20rpx;
}
.tl-txt{
color: #EA5061;
}
}
}
}
}
}
</style>

BIN
src/subpackage/course/static/images/icon/arrow_black.png

After

Width: 20  |  Height: 20  |  Size: 624 B

BIN
src/subpackage/course/static/images/icon/arrow_green.png

After

Width: 24  |  Height: 24  |  Size: 653 B

BIN
src/subpackage/course/static/images/icon/calendar.png

After

Width: 34  |  Height: 34  |  Size: 786 B

BIN
src/subpackage/course/static/images/icon/close_gray.png

After

Width: 34  |  Height: 34  |  Size: 667 B

BIN
src/subpackage/course/static/images/icon/phone.png

After

Width: 32  |  Height: 32  |  Size: 1.1 KiB

BIN
src/subpackage/course/static/images/icon/triangle.png

After

Width: 22  |  Height: 22  |  Size: 428 B

BIN
src/subpackage/course/static/images/no_order.png

After

Width: 346  |  Height: 346  |  Size: 14 KiB

Loading…
Cancel
Save