项目中需要做一个日历,最终效果如下:
日历实现是可以点击日期左右箭头和弹窗选择日期,下面上代码:
html:
<!--index.wxml-->
<view class="container">
<view class="wrap">
<view class="teacherInfo flex">
<view><text>{{teacherName}}</text>老师</view>
<image id="menu" src="../images/menu.gif" bindtap="powerDrawer" data-statu="{{isopen}}"></image>
</view>
<view class="tab" style="height:{{heigh}}px">
<view class="tabTitle">
<scroll-view scroll-x="true" class="weui-navbar">
<view id="0" class="{{activeIndex == 0 ?'titleActive':''}} titleItem" bindtap="tabClick" >
我的课表
<view class="arrow" wx:if="{{showArrow}}"></view>
</view>
<view id="1" class="{{activeIndex == 1 ?'titleActive':''}} titleItem" bindtap="tabClick">
高思校历
<view class="arrow" wx:if="{{!showArrow}}"></view>
</view>
</scroll-view>
</view>
<view class="tabBody" style="height:{{heigh-34-55}}px">
<view class="tabBodyWrap" style="height:{{heigh-34-55}}px;">
<swiper current="{{activeIndex}}" duration="500" bindchange="swiperChange" style="height:{{heigh-34-55}}px;">
<!-- 课表 -->
<swiper-item>
<view class="tabBodyItem" style="height:{{heigh-34-55}}px;">
<view class="checkDate">
<view class="checkDateWrap">
<view class="date" bindtap="showFloat">{{cur_year}}年{{cur_month}}月</view>
<view class="leftArrow" data-handle="prev" bindtap="handleCalendar"></view>
<view class="rightArrow" data-handle="next" bindtap="handleCalendar"></view>
<view class="bottomArrow"></view>
</view>
<view class="today" bindtap="tapToday">今天</view>
</view>
<view class="month">
<view class="monthTitle flex">
<block wx:for="{{weekArr}}">
<view style="width:{{100/7}}%;text-align:center; color:{{index==5 || index==6 ? '#888':'#888'}}">{{item}}</view>
</block>
</view>
<view class="monthBody flex">
<view wx:if="{{hasEmptyGrid}}" wx:for="{{empytGrids}}" wx:key="{{index}}" data-idx="{{index}}" style="width:{{100/7}}%;"></view>
<block wx:for="{{days}}">
<view class="item" style="width:{{100/7}}%;" bindtap="tapDayItem" data-idx="{{index}}">
<view class="num {{index == cur_day-1?'nowDayColor':''}} {{item.classInfo.length?'haveClass':''}} {{item.choosed==true?'tipColor':''}}" style="color:;">{{item.day}}</view>
</view>
</block>
</view>
</view>
<view class="selectDetail" style="height:{{}}px;">
<view class="detailItem flex" wx:for="{{classContent}}">
<view class="dot">●</view>
<view class="content">
<view>{{item.dtDateSect}}</view>
<view>{{item.title}}</view>
<view class="address"><text wx:if="{{!item.sRoomName}}">{{item.sAreaName}}</text>{{item.sRoomName}}</view>
</view>
<view class="kejie">第{{item.nLessonNo}}讲</view>
</view>
<!-- 无课程 -->
<view class="detailItem detailItem1 flex" wx:if="{{!classContent.length}}">
<view class="dot dot1">●</view>
<view class="content">
<view>今日无课程</view>
</view>
<view class="kejie">--</view>
</view>
</view>
</view>
</swiper-item>
<!-- 校历 -->
<swiper-item>
<view class="tabBodyItem" style="height:{{heigh-34-55}}px;overflow-y: scroll;">
<view><image src="{{picSrc}}" bindtap="previewImage" mode='widthFix' style="width:100%;" ></image></view>
</view>
</swiper-item>
</swiper>
</view>
</view>
</view>
</view>
<!-- 年月浮窗 -->
<view class="float" wx:if="{{show}}" data-id="float" bindtap="closeFloat">
<view class="floatWrap flex">
<div class="year">
<view style="padding-top:0 ;"><image src="../images/nianyue.png"></image></view>
<block wx:for="{{yearArr}}">
<view style="color:{{current1 == item?'#1FBB1C':'#888'}}" bindtap="changeBgColor1" data-cur="{{item}}">{{item}}</view>
</block>
</div>
<div class="month flex">
<block wx:for="{{monthArr}}">
<view style="margin-top:0 ; background:{{current == index?'#1FBB1C':'#fff'}};color:{{current == index?'#fff':'#888'}}" bindtap="changeBgColor" data-cur="{{item}}">{{item}}</view>
</block>
</div>
</view>
</view>
<!-- 弹窗 -->
<!-- <view class="float" wx:if="{{show}}" data-id="float" bindtap="closeFloat">
<view class="floatWrap">
<view class="arrows arrowT"><image class="arrowT" src="../images/arrow-t.png"></image></view>
<view class="floatC">
<view class="floatC-item" wx:for="{{arr}}" data-id="{{item.id}}" wx:key="id" bindtap="getIndex">{{item.value}}</view>
</view>
<view class="arrows arrowB"><image class="arrowB" src="../images/arrow-b.png"></image></view>
</view>
</view>
-->
<!-- 导航 -->
<view class="zoom" wx:if="{{zoomShow}}"></view>
<view animation="{{animationData}}" class="mainMenu drawer_attr_box" wx:if="{{showModalStatus}}" bindtap="closeNav" data-id="closeNav">
<view class="menu" data-id="menu">
<view class="userinfo flex">
<view class="Avatar">
<image src="../images/noface.png" mode='widthFix'></image>
</view>
<view class="name">{{teacherName}}</view>
</view>
<view class="con"><navigator open-type="reLaunch" url='/pages/entranceDoor/entranceDoor'>录入进考门</navigator></view>
<view class="con"><navigator open-type="reLaunch" url='/pages/scorePic/scorePic'>生成成绩单</navigator></view>
<view class="con"><navigator open-type="reLaunch" url='/pages/taskCard/taskCard'>生成任务卡</navigator></view>
<view class="con"><navigator open-type="reLaunch" url='/pages/cardIndex/cardIndex'>转发群打卡</navigator></view>
<view class="quit tac"><button class="btn" bindtap="unlogin" hover-class="hoverLogin">退出登录</button></view>
</view>
</view>
<!-- 导航tab -->
<view class="tabBar flex">
<view class="tabItem" bindtap="changeColor" wx:for="{{tabBarArr}}" data-id="{{index}}" wx:key="id">
<view class="icon"><image class="icon1" mode="aspectFit" src="{{item.iconSrc}}"></image></view>
<view class="txt" style="color:{{item.changeTextColor}}">{{item.txt}}</view>
</view>
</view>
</view>
css:
@import "../../utils/public.wxss";
page{
height: 100%;
}
.container{
padding: 0;
height: 100%;
overflow:hidden;
}
.flex{
display: flex;
}
/*主体内容*/
.wrap{
position: relative;
width: 100%;
height: 100%;
background: #fafafa;
box-sizing: border-box;
}
.wrap .teacherInfo{
width: 100%;
height: 110rpx;
padding: 0 30rpx 0 48rpx;
background: #fff;
justify-content: space-between;
align-items: center;
font-size: 34rpx;
color:#666;
box-sizing: border-box;
}
.wrap .teacherInfo text{
font-size: 46rpx;
color: #1FB923;
}
.wrap .teacherInfo image{
width: 49rpx;
height: 28rpx;
padding: 20rpx 0 20rpx 20rpx;
}
.wrap .tab{
width: 100%;
}
.wrap .tab .tabTitle .titleItem{
width: 50%;
font-size: 26rpx;
text-align: center;
padding: 10px 0;
border-bottom: 1px solid #1FB923;
position: relative;
display: inline-block;
color: #979797;
overflow-y: scroll;
}
.wrap .tab .tabTitle .titleActive{
color: #32343d;
background: #f1f1f1;
}
.wrap .tab .tabTitle .titleItem .arrow{
border: 4px solid #1FB923;
border-top-color: transparent;
border-left-color: transparent;
border-right-color: transparent;
width: 0;
height: 0;
position: absolute;
left: 50%;
bottom: 0;
margin-left: -4px;
}
.wrap .tab .tabBody{
width: 200%;
position: relative;
}
.wrap .tab .tabBodyWrap{
width: 100%;
position: absolute;
left: 0;
top: 0;
}
.wrap .tab .tabBody .tabBodyItem{
width: 50%;
flex-direction: row;
}
.wrap .tab .tabBody .tabBodyItem .checkDate{
position: relative;
width: 100%;
height: 44px;
padding-top: 19px;
text-align: center;
box-sizing: border-box;
}
.wrap .tab .tabBody .tabBodyItem .checkDateWrap{
position: relative;
width: 26%;
text-align: center;
margin-left: 38%;
box-sizing: border-box;
}
.wrap .tab .tabBody .tabBodyItem .checkDate .date{
width: 100%;
height: 100%;
font-size: 24rpx;
color: #888;
}
.wrap .tab .tabBody .tabBodyItem .checkDate .leftArrow{
border: 12rpx solid #838383;
border-top-color: transparent;
border-left-color: transparent;
border-bottom-color: transparent;
width: 0;
height: 0;
position: absolute;
left: -20px;
top: 50%;
margin-top: -6px;
}
.wrap .tab .tabBody .tabBodyItem .checkDate .rightArrow{
border: 12rpx solid #838383;
border-top-color: transparent;
border-right-color: transparent;
border-bottom-color: transparent;
width: 0;
height: 0;
position: absolute;
right: -20px;
top: 50%;
margin-top: -6px;
}
.wrap .tab .tabBody .tabBodyItem .checkDate .bottomArrow{
border: 10rpx solid #838383;
border-left-color: transparent;
border-right-color: transparent;
border-bottom-color: transparent;
width: 0;
height: 0;
position: absolute;
left: 50%;
top:18px;
margin-left: -6px;
}
.wrap .tab .tabBody .tabBodyItem .checkDate .today{
font-size: 22rpx;
position: absolute;
right: 30px;
top: 50%;
margin-top: -10rpx;
color: #46b52e;
background: #fff;
}
.wrap .tab .tabBody .tabBodyItem .month{
width: 100%;
padding: 0 30rpx;
padding-bottom: 20px;
box-shadow: 0 1px 1px #eee;
box-sizing: border-box;
background: #fff;
}
.wrap .tab .tabBody .tabBodyItem .month .monthTitle{
padding: 14rpx 0;
font-size: 24rpx;
border-bottom: 1px solid #e5e5e5;
}
.wrap .tab .tabBody .tabBodyItem .month .monthBody{
flex-wrap: wrap;
padding-top: 36rpx;
font-size: 24rpx;
}
.wrap .tab .tabBody .tabBodyItem .month .monthBody .item{
position: relative;
height: 36rpx;
margin-bottom: 10px;
text-align: center;
box-sizing: border-box;
padding:0 5rpx;
}
.wrap .tab .tabBody .tabBodyItem .month .monthBody .nowDayColor{
color: #46b52e;
}
.wrap .tab .tabBody .tabBodyItem .month .monthBody .tipColor{
color: #fff!important;
background: #1FBB1C!important;
}
.wrap .tab .tabBody .tabBodyItem .month .monthBody .haveClass{
color: #333;
background: #b5e1ab;
}
.wrap .tab .tabBody .tabBodyItem .month .monthBody .activeClass{
color: #fff;
background: green;
}
.wrap .tab .tabBody .tabBodyItem .month .monthBody .num{
width: 100%;
height: 100%;
}
.wrap .tab .tabBody .tabBodyItem .month .monthBody .today{
position: relative;
left: 0;
top: -10rpx;
font-size: 14rpx;
}
.wrap .tab .tabBody .tabBodyItem .selectDetail{
width: 100%;
margin-top:10rpx;
font-size: 24rpx;
color: #32343d;
}
.wrap .tab .tabBody .tabBodyItem .selectDetail .detailItem{
width: 100%;
padding: 10px;
margin-top:10px;
justify-content: center;
align-items: center;
background: #fff;
box-sizing: border-box;
}
.wrap .tab .tabBody .tabBodyItem .selectDetail .detailItem1{
width: 100%;
padding: 20px;
margin-top:10px;
box-sizing: border-box;
}
.wrap .tab .tabBody .tabBodyItem .selectDetail .dot{
width: 50rpx;
color: #ef5757;
padding-top:5rpx;
text-align: center;
}
.wrap .tab .tabBody .tabBodyItem .selectDetail .dot1{
color: #888;
}
.wrap .tab .tabBody .tabBodyItem .selectDetail .content{
flex: 1;
line-height: 20px;
}
.wrap .tab .tabBody .tabBodyItem .selectDetail .address{
color: #989898;
}
.wrap .tab .tabBody .tabBodyItem .selectDetail .kejie{
width: 130rpx;
}
.float .floatWrap{
width: 572rpx;
height: 338rpx;
padding: 26rpx 30rpx 0 20rpx;
box-sizing: border-box;
margin-left: -280rpx;
}
.float .floatWrap .year view{
padding: 20rpx 60rpx;
font-size: 28rpx;
color: #888;
}
.float .floatWrap .year image{
width: 59rpx;
height: 45rpx;
}
.float .floatWrap .month{
width: 342rpx;
flex-wrap: wrap;
color: #888;
}
.float .floatWrap .month view{
width: 55rpx;
height: 55rpx;
border-radius: 26rpx;
margin: 20rpx 28rpx;
font-size: 28rpx;
text-align: center;
line-height: 55rpx;
}
.activeStyle{
background: #1FBB1C;
color: #fff !important;
}
js:
var classList = require('../../utils/classList.js');
var md51 = require('../../utils/md51.js');
var requests = require('../../utils/requests.js');
var publicJs = require('../../utils/public.js');
//获取应用实例
var app = getApp();
Page({
data: {
tabBarArr:[
{id:0,txt:'录入',iconSrc:'../images/write.gif',changeTextColor:'#525252',isChange: false},
{id:1,txt:'查询',iconSrc:'../images/search1.gif',changeTextColor:'#1FBB1C',isChange: true},
{id:2,txt:'工具',iconSrc:'../images/setting.gif',changeTextColor:'#525252',isChange: false},
],
teacherName:'张云',
showModalStatus: false, //控制导航显示
isopen:'open', //控制菜单显示
teacherName: '', //教师名称
teacherToken:'', //教师token
showArrow:true, //显示当前tab的箭头
noticeType: 3, // 默认获取任务, -1是智库
taskArr:[], //任务数组
thinkArr:[], //智库数组
asideFlag:'left', //判断当前是左侧还是右侧
// 日期参数
weekArr:[ '一', '二', '三', '四', '五', '六','日'],
monthArr:[1,2,3,4,5,6,7,8,9,10,11,12],
yearArr:[2016,2017,2018],
hasEmptyGrid: false,
showPicker: false,
dateInfos:[],
activeIndex: 0
},
onLoad: function(){
var that = this;
this.setData({
teacherName: wx.getStorageSync('teacherName'),
teacherToken: wx.getStorageSync('teacherToken')
})
// 获取设备高度
wx.getSystemInfo({
success: function(res) {
that.setData({
windowHeight: res.windowHeight,
windowWidth: res.windowWidth,
heigh: res.windowHeight - 55
})
}
});
var date = new Date(); //当前日期
var cur_day = date.getDate(); //当前日
var cur_year = date.getFullYear(); //当前年份
var cur_month = date.getMonth() + 1; //当前月份
this.setData({
date:cur_year+'-'+cur_month+'-'+cur_day,
current:date.getMonth(),
current1:date.getFullYear()
});
this.calculateEmptyGrids(cur_year, cur_month);
this.calculateDays(cur_year, cur_month);
this.setData({
cur_year,
cur_month,
cur_day,
nowYear:date.getFullYear(),
nowMonth:date.getMonth() + 1,
date:cur_year+'-'+cur_month+'-'+cur_day
});
this.getPic();
},
// 退出登录
unlogin: function(){
publicJs.unlogin()
},
// 关闭弹窗
closeFloat: function(e){
publicJs.closeFloat(e,this)
},
// 菜单按钮
powerDrawer: function (e) {
publicJs.powerDrawer(e,this)
},
// 关闭导航
closeNav: function(e){
publicJs.closeNav(e,this)
},
// 点击改变tabBar颜色
changeColor: function(e){
publicJs.changeColor(e,this)
},
// 点击改变tab
tabClick:function(e){
var that = this;
var idIndex = e.currentTarget.id;
if(idIndex==0){
this.setData({
showArrow:true,
});
}else{
this.setData({
showArrow:false,
});
}
this.setData({
activeIndex:idIndex,
});
},
swiperChange:function(e){
var current = e.detail.current;
if(current == 0){
this.setData({
showArrow:true,
});
}else{
this.setData({
showArrow:false,
});
}
this.setData({
activeIndex:current,
// slideOffset:offsetW
});
},
// 获取信息
getDateInfos: function(callback){
var that = this;
// 时间戳
var stamp = new Date().getTime();
// 学年
var year = this.data.schoolYear;
// 学期
var nSemester = this.data.nSemester;
// 教师token
var token = this.data.teacherToken;
// 获取信息的类型
var date = this.data.date;
var query1 = 'appid=web&date='+date+'×tamp='+stamp+'&token='+token;
var query2 = {
appid: 'web',
timestamp:stamp,
token:token,
date:date,
}
var signS = publicJs.sortQuery(query2)
var sign = md51.md5(signS+'test');
var query = query1 + '&sign=' + sign;
wx.showLoading({
title:'努力加载中...',
success: function(){
requests.requestGet('/api/Calendar/MonthCourse?'+ query,function(res){
console.log(res)
if(res.data.ResultType == 0){
var result = res.data.AppendData;
that.setData({dateInfos:result})
callback();
}else if(res.data.ResultType == 7){
wx.showModal({
title: '提示',
content: '请重新登陆',
showCancel: false,
success:function(){
wx.clearStorageSync();
wx.reLaunch({ url: '/pages/index/index'})
}
})
}
setTimeout(function(){
wx.hideLoading()
},500)
})
}
})
},
// 获取校历
getPic:function(){
var that = this;
// 时间戳
var stamp = new Date().getTime();
// 学年
var year = this.data.schoolYear;
// 学期
var nSemester = this.data.nSemester;
// 教师token
var token = this.data.teacherToken;
// 获取信息的类型
var date = this.data.date;
var query1 = 'appid=web×tamp='+stamp+'&token='+token;
var query2 = {
appid: 'web',
timestamp:stamp,
token:token,
}
var signS = publicJs.sortQuery(query2)
var sign = md51.md5(signS+'test');
var query = query1 + '&sign=' + sign;
wx.showLoading({
title:'努力加载中...',
success: function(){
requests.requestGet('/api/Calendar/GetSchoolCalendar?'+ query,function(res){
console.log(res)
if(res.data.ResultType == 0){
that.setData({
picSrc:res.data.AppendData
})
}else if(res.data.ResultType == 7){
wx.showModal({
title: '提示',
content: '请重新登陆',
showCancel: false,
success:function(){
wx.clearStorageSync();
wx.reLaunch({ url: '/pages/index/index'})
}
})
}
setTimeout(function(){
wx.hideLoading()
},500)
})
}
})
},
previewImage: function(){
var that = this;
wx.previewImage({
current: that.data.picSrc, // 当前显示图片的http链接
urls: [that.data.picSrc], // 需要预览的图片http链接列表
})
},
// 点击改变tab
changeTab:function(e){
animation(this,e, -this.data.windowWidth,0);
function animation(obj,e ,x1,x2) {
var animation = wx.createAnimation({
duration: 300,
timingFunction: "linear",
delay: 0
});
obj.animation = animation;
if(e.target.dataset.index == '2'){
animation.translateX(x1).step();
obj.setData({
showArrow: false,
asideFlag:'right',
})
}else{
animation.translateX(x2).step();
obj.setData({
showArrow: true,
asideFlag:'left'
})
}
obj.setData({
animationData1: animation.export()
})
}
},
// 显示年月浮层
showFloat: function(){
this.setData({show: true,})
},
// 改变月的背景色并关闭浮层
changeBgColor: function(e){
// 恢复初始样式
for(var i = 0 ; i < this.data.days.length; i++){
this.data.days[i].classInfo = []
}
this.setData({days:this.data.days})
var cur = e.target.dataset.cur
this.setData({
current: cur,
show:false,
cur_year:this.data.nowYear,
nowYear:new Date().getFullYear(),
nowMonth:new Date().getMonth()+1,
current1:new Date().getFullYear(),
cur_month:cur,
})
this.setData({
date:this.data.cur_year+'-'+(this.data.cur_month)+'-'+1
})
if(this.data.cur_year== this.data.nowYear && this.data.current == this.data.nowMonth){
this.setData({cur_day:new Date().getDate()})
}else{
this.setData({cur_day:1})
}
this.calculateEmptyGrids(this.data.cur_year, cur);
this.calculateDays(this.data.cur_year, cur);
},
// 改变年的背景色
changeBgColor1: function(e){
var cur = e.target.dataset.cur
this.setData({
current1: cur,
nowYear:cur,
})
},
// 点击今天回到当日
tapToday:function(){
var date = new Date(); //当前日期
var cur_day = date.getDate(); //当前日
var cur_year = date.getFullYear(); //当前年份
var cur_month = date.getMonth() + 1; //当前月份
this.setData({
date:cur_year+'-'+cur_month+'-'+1
})
this.calculateEmptyGrids(cur_year, cur_month);
this.calculateDays(cur_year, cur_month);
this.setData({
cur_year: cur_year,
cur_month: cur_month,
cur_day: cur_day
})
},
// 处理获取的天的展示
//获取指定年的月份有多少天
getThisMonthDays:function(year, month) {
return new Date(year, month, 0).getDate();
},
获取当前月中第一天是星期几
getFirstDayOfWeek:function(year, month) {
return new Date(Date.UTC(year, month-1, 0)).getDay();
},
// 获取当月第一天之前的数组
calculateEmptyGrids:function(year, month) {
const firstDayOfWeek = this.getFirstDayOfWeek(year, month);
let empytGrids = [];
if (firstDayOfWeek > 0) {
for (var i = 0; i < firstDayOfWeek; i++) {
empytGrids.push(i);
}
this.setData({
hasEmptyGrid: true,
empytGrids
});
} else {
this.setData({
hasEmptyGrid: false,
empytGrids: []
});
}
},
// 获取指定月的天数的数组
calculateDays:function(year, month) {
var that = this;
var days = [];
var thisMonthDays = this.getThisMonthDays(year, month);
this.getDateInfos(function(){
for (var i = 0; i < that.data.dateInfos.length; i++) {
days.push({
day: i+1,
choosed: false,
classInfo: that.data.dateInfos[i].CalendarList
});
}
that.setData({
days:days
});
});
},
//点击两侧箭头的事件
handleCalendar:function(e) {
for(var i = 0 ; i < this.data.days.length; i++){
this.data.days[i].classInfo = []
}
this.setData({days:this.data.days})
var handle = e.currentTarget.dataset.handle;
var cur_year = this.data.cur_year;
var cur_month = this.data.cur_month;
var nowYear = new Date().getFullYear();
var nowMonth = new Date().getMonth()+1;
var nowDay = new Date().getDate();
if (handle === 'prev') {
var newMonth = cur_month - 1;
var newYear = cur_year;
if (newMonth < 1) {
newYear = cur_year - 1;
newMonth = 12;
}
} else {
var newMonth = cur_month + 1;
var newYear = cur_year;
if (newMonth > 12) {
newYear = cur_year + 1;
newMonth = 1;
}
}
this.setData({
date:newYear+'-'+newMonth+'-'+1
})
console.log(this.data.days)
this.calculateEmptyGrids(newYear, newMonth);
this.calculateDays(newYear, newMonth);
this.setData({
cur_year: newYear,
cur_month: newMonth,
});
if(newYear==nowYear && newMonth == nowMonth){
this.setData({cur_day:nowDay})
}else{
this.setData({cur_day:1})
}
},
// 选择每天的日期改变状态
tapDayItem:function(e) {
var idx = e.currentTarget.dataset.idx;
var days = this.data.days;
for(var i = 0 ; i < days.length; i++){
days[i].choosed = false;
}
days[ idx ].choosed = !days[ idx ].choosed;
this.setData({
days,
});
// 显示课程
this.setData({classContent:days[idx].classInfo})
},
})