You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

338 lines
8.8 KiB

<template>
<view class="container">
<image class="cbg" :src="base.imgHost('common_bg.png')"></image>
<view class="search-wrap" v-if="selectList.length>0">
<view class="search">
<!-- <view class="select"> -->
<w-select width="250rpx" :showClose="false" style="margin-left: 20rpx;" v-model="chooseValue"
:list="selectList" valueName="name" keyName="id" @change="changeMonth">
</w-select>
<!-- </view> -->
<view class="all" @click="changeAll">全部课表</view>
</view>
</view>
<view class="search-tab" v-if="selectDayList.length>0">
<u-tabs :bg-color="'#f0f7fc'" active-color="#b89155" :list="selectDayList" name="value" :is-scroll="true"
:current="current" @change="changeSearchDay"></u-tabs>
</view>
<view class="wrap" :style="isAll?'padding-top:100rpx':'padding-top:30rpx'">
<view v-if="dayDataList.length>0">
<view class="item" v-for="item in dayDataList">
<view v-if="isAll" class="item-date">{{item.monthday}}</view>
<view v-if="type=='near' && item.course" style="color:#b89155;padding-bottom:10rpx">
{{item.course.type_detail?item.course.type_detail.name+"|":''}}{{item.course.name?item.course.name:''}}
</view>
<view class="item-period">{{item.period}}</view>
<view class="item-img">
<image :src="base.imgHost('mycourse-c2.png')" style="width:22rpx;height:22rpx"></image>
<text>{{item.theme}}</text>
</view>
<view class="item-img">
<image :src="base.imgHost('mycourse-c1.png')" style="width:20rpx;height:23rpx"></image>
<text>{{item.teacher?item.teacher.name:''}}</text>
</view>
<view class="item-img">
<image :src="base.imgHost('mycourse-c3.png')" style="width:19rpx;height:27rpx"></image>
<text>{{item.address}}</text>
</view>
<view class="item-btn">
<view @click="goSign(item.id)">签到</view>
// <view v-if="item.course_content_evaluation && item.course_content_evaluation.status==1" @click="goSurvey(item.id)">问卷调查</view>
</view>
</view>
</view>
<view class="nodata" v-else>
<u-empty text="当前没有排课" mode="data"></u-empty>
</view>
</view>
</view>
</template>
<script>
import wSelect from "@/components/w-select/w-select.vue"
export default {
components: {
wSelect
},
data() {
return {
list: [],
dayDataList: [],
chooseValue: '',
selectList: '',
selectDayList: [],
current: 0,
isAll: false,
type: ''
}
},
onLoad(options) {
this.type = options.type ? options.type : ''
uni.setNavigationBarTitle({
title: this.type == 'near' ? '近期课表' : '本班课表',
success: function() {
console.log('标题设置成功');
},
fail: function(err) {
console.error('标题设置失败', err);
}
});
this.getMyCourseContents(options.id)
},
methods: {
goSign(id){
uni.navigateTo({
url:'/packages/sign/index?id='+id
})
},
goSurvey(id){
uni.navigateTo({
url:'/packages/surveyFill/index?id='+id
})
},
async getMyCourseContents(id) {
let res = {
list: []
}
if (this.type === 'near') {
// 近期课表
res = await this.$u.api.myCourseContent()
// 筛掉今天之前的
res.list = this.filterDataByToday(res.list)
} else {
res = await this.$u.api.courseContent({
course_id: id,
})
}
this.list = res.list
if (res.list.length > 0) {
// this.dayDataList = res.list
let obj = this.groupByMonthAndSort(res.list)
const currentMonth = this.$moment().format('YYYY年MM月')
const currentDay = this.$moment().format('MM月DD日')
if (this.selectList.length > 0) {
this.selectDayList = this.selectList[this.selectList.length - 1]['item']
this.chooseValue = this.selectList[this.selectList.length - 1]['name']
this.dayDataList = this.selectList[this.selectList.length - 1]['item'][0]['arr']
this.current = 0
this.selectList.map((item, index) => {
if (item.name === currentMonth) {
this.chooseValue = item.name
this.selectDayList = item.item
this.dayDataList = item.item[0]['arr']
item.item.map((cur, index1) => {
if (cur.value === currentDay) {
this.dayDataList = cur['arr']
this.current = index1
}
})
}
})
}
console.log("this.selectList", this.selectList)
}
},
filterDataByToday(arr) {
// 获取当前日期
let filteredData = []
const today = this.$moment().format('YYYY-MM-DD');
// 筛选出 date 字段大于或等于今天的数据
filteredData = arr.filter(item => {
const itemDate = this.$moment(item.date).format('YYYY-MM-DD');
return this.$moment(itemDate).isSameOrAfter(today);
});
return filteredData
},
changeMonth(e) {
console.log("e", e, this.chooseValue)
this.selectDayList = e.item
this.dayDataList = e.item[0]['arr']
this.current = 0
this.isAll = false
},
changeAll() {
this.current = 0
this.selectDayList = []
this.dayDataList = this.list
this.isAll = true
// this.$set(this,'chooseValue','请选择')
},
// 切换日期
changeSearchDay(e) {
console.log("e1", e)
this.current = e
this.dayDataList = this.selectDayList[e]['arr']
},
// 将日期换成 年月合并
groupByMonthAndSort(a) {
// 创建一个空对象来存储按月份分组的数据
const groupedData = {};
const weekArr = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
// 遍历数组 a 中的每个对象
a.forEach(item => {
// 提取 date 字段,并转换为包含年份和月份的字符串格式
const date = this.$moment(item.date, 'YYYY-MM-DD');
const monthKey = date.format('YYYY年MM月');
// 添加 monthday 字段
const weekDay = weekArr[date.day()]
item.monthday = date.format('MM月DD日') + '(' + weekDay + ')';
// 如果这个月份还没有出现在 groupedData 中,就添加一个空数组
if (!groupedData[monthKey]) {
groupedData[monthKey] = [];
}
// 将当前对象添加到对应的月份数组中
groupedData[monthKey].push(item);
});
let _arr = []
for (var k in groupedData) {
_arr.push({
name: k,
item: groupedData[k],
id: k
})
}
this.selectList = this.transformItemsToObject(_arr)
// 返回重组后的数据
return groupedData;
},
// 将 想同日期的合并
transformItemsToObject(arr) {
return arr.map(month => {
const transformedItems = month.item.reduce((acc, curr) => {
const key = curr.monthday;
const existingItem = acc.find(item => item.value === key);
if (existingItem) {
existingItem.arr.push(curr);
} else {
acc.push({
value: key,
arr: [curr]
});
}
return acc;
}, []);
return {
...month,
item: transformedItems
};
});
},
}
}
</script>
<style scoped lang="scss">
.container {
padding: 30rpx;
width: 100%;
height: 100vh;
overflow: scroll;
.cbg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100vh;
}
.search {
position: fixed;
top: 0;
left: 0;
width: 100%;
width: 100%;
padding: 30rpx;
display: flex;
justify-content: space-between;
align-items: center;
box-shadow: 1rpx -4rpx 15rpx 0 #333;
z-index: 9;
background-color: #fff;
height: 100rpx;
.all {
font-size: 28rpx;
color: #b89155;
}
}
.search-tab {
// position: fixed;
// top: 100rpx;
// left: 0;
// width: 100%;
margin-top: 100rpx;
background-color: #fff;
}
.wrap {
position: relative;
// padding-top: 20rpx;
.item {
background-color: #fff;
padding: 30rpx;
margin-bottom: 20rpx;
border-radius: 20rpx;
&-date {
font-size: 32rpx;
color: #b08c6c;
margin-bottom: 20rpx
}
&-period {
color: #333333;
margin-left: 20rpx;
margin-bottom: 10rpx
}
&-img {
color: #666666;
display: flex;
align-items: center;
margin-left: 20rpx;
margin-bottom: 10rpx;
image {
margin-right: 10rpx;
}
}
&-btn{
width: 100%;
position: relative;
padding: 20rpx 0;
display: flex;
justify-content: flex-end;
&>view {
width: 30%;
text-align: center;
margin-left:20rpx;
color: #fff;
background: linear-gradient(to right, #5e5fbc, #0d0398);
border-radius: 30rpx;
padding: 10rpx;
}
}
}
.nodata {
height: 100vh;
}
}
}
</style>