Browse Source

feat: 添加日历

test2
song 4 years ago
parent
commit
94e4a7d644
  1. 56
      .eslintrc.js
  2. 1
      CHANGELOG.md
  3. 473
      components/Calendar/Calendar - 副本.vue
  4. 524
      components/Calendar/Calendar.vue
  5. 8
      components/Projects/Projects.vue
  6. 13
      pages.json
  7. 161
      pages/index/index.vue
  8. 64
      pages/project/project.vue
  9. 89
      store/index.js
  10. 3
      store/project/actions.js
  11. 11
      store/project/getters.js
  12. 12
      store/project/index.js
  13. 62
      store/project/mutations.js
  14. 8
      store/project/state.js
  15. 761
      utils/time.js

56
.eslintrc.js

@ -1,21 +1,41 @@
module.exports = { module.exports = {
"env": { env: {
"browser": true, browser: true,
"es2021": true es2021: true,
}, },
"extends": [ extends: [
"plugin:vue/essential", 'plugin:vue/essential',
"airbnb-base" 'airbnb-base',
],
parserOptions: {
ecmaVersion: 13,
parser: '@typescript-eslint/parser',
sourceType: 'module',
},
plugins: [
'vue',
'@typescript-eslint',
],
rules: {
'vue/html-self-closing': 'off',
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-param-reassign': 'off',
'max-len': ['error', { code: 140, tabWidth: 2 }],
'object-curly-newline': ['error', { multiline: true }],
'arrow-parens': ['error', 'as-needed'],
'linebreak-style': 'off',
'vue/attributes-order': 'off',
'vue/singleline-html-element-content-newline': 'off',
'vue/max-attributes-per-line': 'off',
'vue/multiline-html-element-content-newline': 'off',
'vue/html-indent': 'off',
'vue/html-closing-bracket-newline': [
'error',
{
singleline: 'never',
multiline: 'always',
},
], ],
"parserOptions": { },
"ecmaVersion": 13,
"parser": "@typescript-eslint/parser",
"sourceType": "module"
},
"plugins": [
"vue",
"@typescript-eslint"
],
"rules": {
}
}; };

1
CHANGELOG.md

@ -7,6 +7,7 @@
- | first commit | [8dc26de](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/8dc26de) - | first commit | [8dc26de](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/8dc26de)
- | vue3 | [12ed2ad](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/12ed2ad) - | vue3 | [12ed2ad](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/12ed2ad)
- | 使用uview完成api请求 | [1b3efd8](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/1b3efd8) - | 使用uview完成api请求 | [1b3efd8](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/1b3efd8)
- | 更新代码 | [392c8cc](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/392c8cc)
范围|描述|commitId 范围|描述|commitId

473
components/Calendar/Calendar - 副本.vue

@ -0,0 +1,473 @@
<template>
<view class="zzx-calendar">
<view class="calendar-heander">
{{ timeStr }}
</view>
<!-- 星期几标题 -->
<view class="calendar-weeks">
<view class="calendar-week" :class="{ 'text-red-500': week === '六' || week === '日' }" v-for="(week, index) in weeks" :key="index">
{{ week }}
</view>
</view>
<view class="calendar-content">
<swiper
class="calendar-swiper"
:style="{
width: '100%',
height: sheight,
}"
:indicator-dots="false"
:autoplay="false"
:duration="duration"
:current="current"
@change="changeSwp"
:circular="true"
>
<swiper-item class="calendar-item" v-for="sitem in swiper" :key="sitem">
<view class="calendar-days">
<!-- 当前的 -->
<template v-if="sitem === current">
<view
class="calendar-day"
v-for="(item, index) in days"
:key="index"
:class="{ 'day-hidden': !item.show }"
@click="clickItem(item)"
>
<view class="date" :class="[item.isToday ? todayClass : '', item.fullDate === selectedDate ? checkedClass : '']">
{{ item.time.getDate() }}
</view>
<view class="dot-show" v-if="item.info === '0'" :style="dotStyle"> </view>
</view>
</template>
<template v-else>
<!-- 下一个月/ -->
<template v-if="current - sitem === 1 || current - sitem === -2">
<view
class="calendar-day"
v-for="(item, index) in predays"
:key="index"
:class="{
'day-hidden': !item.show,
}"
>
<view class="date" :class="[item.isToday ? todayClass : '']">
{{ item.time.getDate() }}
</view>
</view>
</template>
<!-- 上一个月/ -->
<template v-else>
<view
class="calendar-day"
v-for="(item, index) in nextdays"
:key="index"
:class="{
'day-hidden': !item.show,
}"
>
<view class="date" :class="[item.isToday ? todayClass : '']">
{{ item.time.getDate() }}
</view>
</view>
</template>
</template>
</view>
</swiper-item>
</swiper>
<!-- <view class="mode-change" @click="changeMode">
<view :class="weekMode ? 'mode-arrow-bottom' : 'mode-arrow-top'"> </view>
</view> -->
</view>
<view class="flex justify-center u-font-18" style="color: #3b82f6" @click="goToday"> 今日 </view>
</view>
</template>
<script>
import { mapState } from 'vuex';
import { gegerateDates, formatDate } from './generateDates.js';
export default {
props: {
duration: { type: Number, default: 500 },
//
showBack: { type: Boolean, default: false },
// class
todayClass: { type: String, default: 'is-today' },
// class
checkedClass: { type: String, default: 'is-checked' },
//
dotStyle: {
type: Object,
default: () => {
return { background: '#4ade80' };
},
},
},
watch: {
dotList: function (newvalue) {
const days = this.days.slice(0);
const index = days.findIndex(day => day.show);
days.forEach((day, i) => {
newvalue.forEach((item, j) => {
if (i - index === j) {
day.info = item;
}
});
});
this.days = days;
},
},
data() {
return {
weeks: ['日', '一', '二', '三', '四', '五', '六'], //
current: 1,
currentYear: '',
currentMonth: '',
currentDate: '',
days: [],
weekMode: false, // false -> true ->
swiper: [0, 1, 2],
selectedDate: formatDate(new Date(), 'yyyy-MM-dd'), //
start: '',
end: '',
};
},
computed: {
...mapState('project', ['dotList']),
sheight() {
//
//
let h = '35px';
if (!this.weekMode) {
const d = new Date(this.currentYear, this.currentMonth, 0);
const days = d.getDate(); //
let day = new Date(d.setDate(1)).getDay();
// if (day === 0) {
// day = 7;
// }
const pre = 8 - day;
const rows = Math.ceil((days - pre) / 7) + 1;
h = 35 * rows + 'px';
}
return h;
},
//
timeStr() {
let str = '';
const d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate);
const y = d.getFullYear();
const m = d.getMonth() + 1 <= 9 ? `0${d.getMonth() + 1}` : d.getMonth() + 1;
str = `${y}${m}`;
return str;
},
// days
predays() {
let pres = [];
if (this.weekMode) {
//
const d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate);
d.setDate(d.getDate() - 7);
pres = gegerateDates(d, 'week');
} else {
//
const d = new Date(this.currentYear, this.currentMonth - 2, 1);
pres = gegerateDates(d, 'month');
}
return pres;
},
// days
nextdays() {
let nexts = [];
if (this.weekMode) {
//
const d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate);
d.setDate(d.getDate() + 7);
nexts = gegerateDates(d, 'week');
} else {
//
const d = new Date(this.currentYear, this.currentMonth, 1);
nexts = gegerateDates(d, 'month');
}
return nexts;
},
},
created() {
this.initDate();
this.start = this.$moment().startOf('month').valueOf();
this.end = this.$moment().endOf('month').valueOf();
},
methods: {
//
/**
* 滑动切换上下周期
* 根据前一个减去目前的值我们可以判断是下一个月/周还是上一个月/
* current - pre === 1, -2 下一个月/
* current - pre === -1, 2 上一个月或者上一周
*/
changeSwp(e) {
const pre = this.current;
const current = e.target.current;
this.current = current;
if (current - pre === 1 || current - pre === -2) {
//
this.daysNext();
const arr = this.days.filter(s => s.show);
const end = `${arr[arr.length - 1].fullDate} 23:59:59`;
this.start = this.$moment(arr[0].fullDate).valueOf();
this.end = this.$moment(end).valueOf();
this.$emit('handleFindPoint', this.start, this.end);
} else {
//
this.daysPre();
const arr = this.days.filter(s => s.show);
const end = `${arr[arr.length - 1].fullDate} 23:59:59`;
this.start = this.$moment(arr[0].fullDate).valueOf();
this.end = this.$moment(end).valueOf();
this.$emit('handleFindPoint', this.start, this.end);
}
},
//
initDate(cur) {
let date = '';
if (cur) {
date = new Date(cur);
} else {
date = new Date();
}
this.currentDate = date.getDate(); //
this.currentYear = date.getFullYear(); //
this.currentMonth = date.getMonth() + 1; //
this.currentWeek = date.getDay() === 0 ? 7 : date.getDay(); // 1...6,0
// const nowY = new Date().getFullYear(); //
// const nowM = new Date().getMonth() + 1;
// const nowD = new Date().getDate(); //
// const nowW = new Date().getDay();
// this.selectedDate = formatDate(new Date(), 'yyyy-MM-dd')
this.days = [];
let days = [];
if (this.weekMode) {
days = gegerateDates(date, 'week');
// this.selectedDate = days[0].fullDate;
} else {
days = gegerateDates(date, 'month');
// const sel = new Date(this.selectedDate.replace('-', '/').replace('-', '/'));
// const isMonth = sel.getFullYear() === this.currentYear && (sel.getMonth() + 1) === this.currentMonth;
// if(!isMonth) {
// this.selectedDate = formatDate(new Date(this.currentYear, this.currentMonth-1,1), 'yyyy-MM-dd')
// }
}
//
days.forEach((day, i) => {
this.dotList.forEach((item, j) => {
if (i === j) {
day.info = item;
}
});
});
this.days = days;
// ,
let obj = {
start: '',
end: '',
};
if (this.weekMode) {
obj.start = this.days[0].time;
obj.end = this.days[6].time;
} else {
const start = new Date(this.currentYear, this.currentMonth - 1, 1);
const end = new Date(this.currentYear, this.currentMonth, 0);
obj.start = start;
obj.end = end;
}
this.$emit('days-change', obj);
},
//
daysPre() {
if (this.weekMode) {
const d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate);
d.setDate(d.getDate() - 7);
this.initDate(d);
} else {
const d = new Date(this.currentYear, this.currentMonth - 2, 1);
this.initDate(d);
}
},
//
daysNext() {
if (this.weekMode) {
const d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate);
d.setDate(d.getDate() + 7);
this.initDate(d);
} else {
const d = new Date(this.currentYear, this.currentMonth, 1);
this.initDate(d);
}
},
//
changeMode() {
const premode = this.weekMode;
let isweek = false;
if (premode) {
isweek = !!this.days.find(item => item.fullDate === this.selectedDate);
}
this.weekMode = !this.weekMode;
let d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate);
const sel = new Date(this.selectedDate.replace('-', '/').replace('-', '/'));
const isMonth = sel.getFullYear() === this.currentYear && sel.getMonth() + 1 === this.currentMonth;
if ((this.selectedDate && isMonth) || isweek) {
d = new Date(this.selectedDate.replace('-', '/').replace('-', '/'));
}
this.initDate(d);
},
//
clickItem(e) {
this.selectedDate = e.fullDate;
this.$emit('selected-change', e);
},
//
goToday() {
const d = new Date();
this.initDate(d);
},
},
};
</script>
<style lang="scss" scoped>
.zzx-calendar {
width: 100%;
height: auto;
background-color: #fff;
padding-bottom: 10px;
.calendar-heander {
text-align: center;
padding: 16px 0;
position: relative;
font-size: 15px;
}
.calendar-weeks {
width: 100%;
display: flex;
flex-flow: row nowrap;
margin-bottom: 10px;
justify-content: center;
align-items: center;
font-size: 12px;
color: #9ca3af;
font-weight: bold;
.calendar-week {
width: calc(100% / 7);
height: 100%;
text-align: center;
}
}
swiper {
width: 100%;
height: 60upx;
}
.calendar-content {
min-height: 30px;
}
.calendar-swiper {
min-height: 35px;
transition: height ease-out 0.3s;
}
.calendar-item {
margin: 0;
padding: 0;
height: 100%;
}
.calendar-days {
display: flex;
flex-flow: row wrap;
width: 100%;
height: 100%;
overflow: hidden;
font-size: 14px;
.calendar-day {
width: calc(100% / 7);
height: 35px;
text-align: center;
display: flex;
flex-flow: column nowrap;
justify-content: flex-start;
align-items: center;
position: relative;
}
}
.day-hidden {
visibility: hidden;
}
.mode-change {
display: flex;
justify-content: center;
margin-top: 5px;
.mode-arrow-top {
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 5px solid #ff6633;
}
.mode-arrow-bottom {
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 5px solid #ff6633;
}
}
.is-today {
background: #ffffff;
border: 1upx solid #ff6633;
border-radius: 50%;
color: #ff6633;
}
.is-checked {
background: #ff6633;
color: #ffffff;
}
.date {
width: 25px;
height: 25px;
line-height: 25px;
margin: 0 auto;
border-radius: 25px;
}
.dot-show {
width: 6px;
height: 6px;
// background: red;
border-radius: 5px;
position: absolute;
top: 2px;
right: 10px;
}
}
</style>

524
components/Calendar/Calendar.vue

@ -1,14 +1,10 @@
<template> <template>
<view class="zzx-calendar"> <view class="zzx-calendar">
<view class="calendar-heander"> <view class="calendar-heander">{{ timeStr }}</view>
{{ timeStr }}
</view>
<!-- 星期几标题 --> <!-- 星期几标题 -->
<view class="calendar-weeks"> <view class="calendar-weeks">
<view class="calendar-week" :class="{ 'text-red-500': week === '六' || week === '日' }" v-for="(week, index) in weeks" :key="index"> <view class="calendar-week" :class="{ 'text-red-500': week === '六' || week === '日' }" v-for="(week, index) in data.weeks" :key="index">{{ week }}</view>
{{ week }}
</view>
</view> </view>
<view class="calendar-content"> <view class="calendar-content">
@ -25,26 +21,18 @@
@change="changeSwp" @change="changeSwp"
:circular="true" :circular="true"
> >
<swiper-item class="calendar-item" v-for="sitem in swiper" :key="sitem"> <swiper-item class="calendar-item" v-for="sitem in data.swiper" :key="sitem">
<view class="calendar-days"> <view class="calendar-days">
<!-- 当前的 --> <!-- 当前的 -->
<template v-if="sitem === current"> <template v-if="sitem === data.current">
<view <view class="calendar-day" v-for="(item, index) in days" :key="index" :class="{ 'day-hidden': !item.show }" @click="clickItem(item)">
class="calendar-day" <view class="date" :class="[item.isToday ? todayClass : '', item.fullDate === selectedDate ? checkedClass : '']">{{ item.time.getDate() }}</view>
v-for="(item, index) in days" <view class="dot-show" v-if="item.info === '0'" :style="dotStyle"></view>
:key="index"
:class="{ 'day-hidden': !item.show }"
@click="clickItem(item)"
>
<view class="date" :class="[item.isToday ? todayClass : '', item.fullDate === selectedDate ? checkedClass : '']">
{{ item.time.getDate() }}
</view>
<view class="dot-show" v-if="item.info === '0'" :style="dotStyle"> </view>
</view> </view>
</template> </template>
<template v-else> <template v-else>
<!-- 下一个月/ --> <!-- 下一个月/ -->
<template v-if="current - sitem === 1 || current - sitem === -2"> <template v-if="data.current - sitem === 1 || data.current - sitem === -2">
<view <view
class="calendar-day" class="calendar-day"
v-for="(item, index) in predays" v-for="(item, index) in predays"
@ -53,9 +41,7 @@
'day-hidden': !item.show, 'day-hidden': !item.show,
}" }"
> >
<view class="date" :class="[item.isToday ? todayClass : '']"> <view class="date" :class="[item.isToday ? todayClass : '']">{{ item.time.getDate() }}</view>
{{ item.time.getDate() }}
</view>
</view> </view>
</template> </template>
<!-- 上一个月/ --> <!-- 上一个月/ -->
@ -68,9 +54,7 @@
'day-hidden': !item.show, 'day-hidden': !item.show,
}" }"
> >
<view class="date" :class="[item.isToday ? todayClass : '']"> <view class="date" :class="[item.isToday ? todayClass : '']">{{ item.time.getDate() }}</view>
{{ item.time.getDate() }}
</view>
</view> </view>
</template> </template>
</template> </template>
@ -83,274 +67,262 @@
</view> --> </view> -->
</view> </view>
<view class="flex justify-center u-font-18" style="color: #3b82f6" @click="goToday"> 今日 </view> <view class="flex justify-center u-font-18" style="color: #3b82f6" @click="goToday">今日</view>
</view> </view>
</template> </template>
<script> <script setup>
import { mapState } from 'vuex'; import { reactive, computed, watch, defineProps, defineEmits } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { gegerateDates, formatDate } from './generateDates.js'; import { gegerateDates, formatDate } from './generateDates.js';
export default { defineProps({
props: { duration: { type: Number, default: 500 },
duration: { type: Number, default: 500 }, //
// showBack: { type: Boolean, default: false },
showBack: { type: Boolean, default: false }, // class
// class todayClass: { type: String, default: 'is-today' },
todayClass: { type: String, default: 'is-today' }, // class
// class checkedClass: { type: String, default: 'is-checked' },
checkedClass: { type: String, default: 'is-checked' }, //
// dotStyle: {
dotStyle: { type: Object,
type: Object, default: () => ({ background: '#4ade80' }),
default: () => {
return { background: '#4ade80' };
},
},
}, },
});
watch: { const emit = defineEmits(['handleFindPoint', 'handleFindPoint']);
dotList: function (newvalue) {
const days = this.days.slice(0);
const index = days.findIndex(day => day.show);
days.forEach((day, i) => {
newvalue.forEach((item, j) => {
if (i - index === j) {
day.info = item;
}
});
});
this.days = days;
},
},
data() {
return {
weeks: ['日', '一', '二', '三', '四', '五', '六'], //
current: 1,
currentYear: '',
currentMonth: '',
currentDate: '',
days: [],
weekMode: false, // false -> true ->
swiper: [0, 1, 2],
selectedDate: formatDate(new Date(), 'yyyy-MM-dd'), //
start: '',
end: '',
};
},
computed: { const data = reactive({
...mapState('project', ['dotList']), weeks: ['日', '一', '二', '三', '四', '五', '六'], //
sheight() { current: 1,
// currentYear: '',
// currentMonth: '',
let h = '35px'; currentDate: '',
if (!this.weekMode) { days: [],
const d = new Date(this.currentYear, this.currentMonth, 0); weekMode: false, // false -> true ->
const days = d.getDate(); // swiper: [0, 1, 2],
let day = new Date(d.setDate(1)).getDay(); selectedDate: formatDate(new Date(), 'yyyy-MM-dd'), //
// if (day === 0) { start: dayjs()
// day = 7; .startOf('month')
// } .valueOf(),
const pre = 8 - day; end: dayjs()
const rows = Math.ceil((days - pre) / 7) + 1; .endOf('month')
h = 35 * rows + 'px'; .valueOf(),
} });
return h; const store = useStore();
}, const dotList = computed(() => store.state.project.dotList);
const sheight = computed(() => {
// //
timeStr() { //
let str = ''; let h = '35px';
const d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate); if (!data.weekMode) {
const y = d.getFullYear(); const d = new Date(data.currentYear, data.currentMonth, 0);
const m = d.getMonth() + 1 <= 9 ? `0${d.getMonth() + 1}` : d.getMonth() + 1; const days = d.getDate(); //
str = `${y}${m}`; const day = new Date(d.setDate(1)).getDay();
return str; // if (day === 0) {
}, // day = 7;
// }
// days const pre = 8 - day;
predays() { const rows = Math.ceil((days - pre) / 7) + 1;
let pres = []; h = `${35 * rows}px`;
if (this.weekMode) { }
// return h;
const d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate); });
d.setDate(d.getDate() - 7); //
pres = gegerateDates(d, 'week'); const timeStr = computed(() => {
} else { let str = '';
// const d = new Date(data.currentYear, data.currentMonth - 1, data.currentDate);
const d = new Date(this.currentYear, this.currentMonth - 2, 1); const y = d.getFullYear();
pres = gegerateDates(d, 'month'); const m = d.getMonth() + 1 <= 9 ? `0${d.getMonth() + 1}` : d.getMonth() + 1;
} str = `${y}${m}`;
return pres; return str;
}, });
// days
const predays = computed(() => {
let pres = [];
if (data.weekMode) {
//
const d = new Date(data.currentYear, data.currentMonth - 1, data.currentDate);
d.setDate(d.getDate() - 7);
pres = gegerateDates(d, 'week');
} else {
//
const d = new Date(data.currentYear, data.currentMonth - 2, 1);
pres = gegerateDates(d, 'month');
}
return pres;
});
// days
const nextdays = computed(() => {
let nexts = [];
if (data.weekMode) {
//
const d = new Date(data.currentYear, data.currentMonth - 1, data.currentDate);
d.setDate(d.getDate() + 7);
nexts = gegerateDates(d, 'week');
} else {
//
const d = new Date(data.currentYear, data.currentMonth, 1);
nexts = gegerateDates(d, 'month');
}
return nexts;
});
// days watch(dotList, newValue => {
nextdays() { //
let nexts = []; const days = data.days.slice(0);
if (this.weekMode) { const index = days.findIndex(day => day.show);
// days.forEach((day, i) => {
const d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate); newValue.forEach((item, j) => {
d.setDate(d.getDate() + 7); if (i - index === j) {
nexts = gegerateDates(d, 'week'); day.info = item;
} else {
//
const d = new Date(this.currentYear, this.currentMonth, 1);
nexts = gegerateDates(d, 'month');
} }
return nexts; });
}, });
}, data.days = days;
});
created() { //
this.initDate(); const daysPre = () => {
this.start = this.$moment().startOf('month').valueOf(); // if (this.weekMode) {
this.end = this.$moment().endOf('month').valueOf(); // const d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate);
}, // d.setDate(d.getDate() - 7);
// this.initDate(d);
methods: { // } else {
// // const d = new Date(this.currentYear, this.currentMonth - 2, 1);
/** // this.initDate(d);
* 滑动切换上下周期 // }
* 根据前一个减去目前的值我们可以判断是下一个月/周还是上一个月/ };
* current - pre === 1, -2 下一个月/
* current - pre === -1, 2 上一个月或者上一周
*/
changeSwp(e) {
const pre = this.current;
const current = e.target.current;
this.current = current;
if (current - pre === 1 || current - pre === -2) {
//
this.daysNext();
const arr = this.days.filter(s => s.show);
const end = `${arr[arr.length - 1].fullDate} 23:59:59`;
this.start = this.$moment(arr[0].fullDate).valueOf();
this.end = this.$moment(end).valueOf();
this.$emit('handleFindPoint', this.start, this.end);
} else {
//
this.daysPre();
const arr = this.days.filter(s => s.show);
const end = `${arr[arr.length - 1].fullDate} 23:59:59`;
this.start = this.$moment(arr[0].fullDate).valueOf();
this.end = this.$moment(end).valueOf();
this.$emit('handleFindPoint', this.start, this.end);
}
},
// //
initDate(cur) { const daysNext = () => {
let date = ''; // if (this.weekMode) {
if (cur) { // const d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate);
date = new Date(cur); // d.setDate(d.getDate() + 7);
} else { // this.initDate(d);
date = new Date(); // } else {
} // const d = new Date(this.currentYear, this.currentMonth, 1);
this.currentDate = date.getDate(); // // this.initDate(d);
this.currentYear = date.getFullYear(); // // }
this.currentMonth = date.getMonth() + 1; // };
this.currentWeek = date.getDay() === 0 ? 7 : date.getDay(); // 1...6,0
// const nowY = new Date().getFullYear(); //
// const nowM = new Date().getMonth() + 1;
// const nowD = new Date().getDate(); //
// const nowW = new Date().getDay();
// this.selectedDate = formatDate(new Date(), 'yyyy-MM-dd')
this.days = [];
let days = [];
if (this.weekMode) {
days = gegerateDates(date, 'week');
// this.selectedDate = days[0].fullDate;
} else {
days = gegerateDates(date, 'month');
// const sel = new Date(this.selectedDate.replace('-', '/').replace('-', '/'));
// const isMonth = sel.getFullYear() === this.currentYear && (sel.getMonth() + 1) === this.currentMonth;
// if(!isMonth) {
// this.selectedDate = formatDate(new Date(this.currentYear, this.currentMonth-1,1), 'yyyy-MM-dd')
// }
}
//
days.forEach((day, i) => {
this.dotList.forEach((item, j) => {
if (i === j) {
day.info = item;
}
});
});
this.days = days;
// ,
let obj = {
start: '',
end: '',
};
if (this.weekMode) {
obj.start = this.days[0].time;
obj.end = this.days[6].time;
} else {
const start = new Date(this.currentYear, this.currentMonth - 1, 1);
const end = new Date(this.currentYear, this.currentMonth, 0);
obj.start = start;
obj.end = end;
}
this.$emit('days-change', obj);
},
// /**
daysPre() { * 滑动切换上下周期
if (this.weekMode) { * 根据前一个减去目前的值我们可以判断是下一个月/周还是上一个月/
const d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate); * current - pre === 1, -2 下一个月/
d.setDate(d.getDate() - 7); * current - pre === -1, 2 上一个月或者上一周
this.initDate(d); */
} else { const changeSwp = e => {
const d = new Date(this.currentYear, this.currentMonth - 2, 1); const pre = data.current;
this.initDate(d); const { current } = e.target;
} data.current = current;
}, if (current - pre === 1 || current - pre === -2) {
//
daysNext();
const arr = data.days.filter(s => s.show);
const end = `${arr[arr.length - 1].fullDate} 23:59:59`;
data.start = dayjs(arr[0].fullDate).valueOf();
data.end = dayjs(end).valueOf();
emit('handleFindPoint', this.start, this.end);
} else {
//
daysPre();
const arr = data.days.filter(s => s.show);
const end = `${arr[arr.length - 1].fullDate} 23:59:59`;
data.start = dayjs(arr[0].fullDate).valueOf();
data.end = dayjs(end).valueOf();
emit('handleFindPoint', this.start, this.end);
}
};
// //
daysNext() { const initDate = cur => {
if (this.weekMode) { // let date = '';
const d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate); // if (cur) {
d.setDate(d.getDate() + 7); // date = new Date(cur);
this.initDate(d); // } else {
} else { // date = new Date();
const d = new Date(this.currentYear, this.currentMonth, 1); // }
this.initDate(d); // this.currentDate = date.getDate(); //
} // this.currentYear = date.getFullYear(); //
}, // this.currentMonth = date.getMonth() + 1; //
// this.currentWeek = date.getDay() === 0 ? 7 : date.getDay(); // 1...6,0
// // const nowY = new Date().getFullYear(); //
// // const nowM = new Date().getMonth() + 1;
// // const nowD = new Date().getDate(); //
// // const nowW = new Date().getDay();
// // this.selectedDate = formatDate(new Date(), 'yyyy-MM-dd')
// this.days = [];
// let days = [];
// if (this.weekMode) {
// days = gegerateDates(date, 'week');
// // this.selectedDate = days[0].fullDate;
// } else {
// days = gegerateDates(date, 'month');
// // const sel = new Date(this.selectedDate.replace('-', '/').replace('-', '/'));
// // const isMonth = sel.getFullYear() === this.currentYear && (sel.getMonth() + 1) === this.currentMonth;
// // if(!isMonth) {
// // this.selectedDate = formatDate(new Date(this.currentYear, this.currentMonth-1,1), 'yyyy-MM-dd')
// // }
// }
// //
// days.forEach((day, i) => {
// this.dotList.forEach((item, j) => {
// if (i === j) {
// day.info = item;
// }
// });
// });
// this.days = days;
// // ,
// const obj = {
// start: '',
// end: '',
// };
// if (this.weekMode) {
// obj.start = this.days[0].time;
// obj.end = this.days[6].time;
// } else {
// const start = new Date(this.currentYear, this.currentMonth - 1, 1);
// const end = new Date(this.currentYear, this.currentMonth, 0);
// obj.start = start;
// obj.end = end;
// }
// this.$emit('days-change', obj);
};
// //
changeMode() { const changeMode = () => {
const premode = this.weekMode; // const premode = this.weekMode;
let isweek = false; // let isweek = false;
if (premode) { // if (premode) {
isweek = !!this.days.find(item => item.fullDate === this.selectedDate); // isweek = !!this.days.find((item) => item.fullDate === this.selectedDate);
} // }
this.weekMode = !this.weekMode; // this.weekMode = !this.weekMode;
let d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate); // let d = new Date(this.currentYear, this.currentMonth - 1, this.currentDate);
const sel = new Date(this.selectedDate.replace('-', '/').replace('-', '/')); // const sel = new Date(this.selectedDate.replace('-', '/').replace('-', '/'));
const isMonth = sel.getFullYear() === this.currentYear && sel.getMonth() + 1 === this.currentMonth; // const isMonth = sel.getFullYear() === this.currentYear && sel.getMonth() + 1 === this.currentMonth;
if ((this.selectedDate && isMonth) || isweek) { // if ((this.selectedDate && isMonth) || isweek) {
d = new Date(this.selectedDate.replace('-', '/').replace('-', '/')); // d = new Date(this.selectedDate.replace('-', '/').replace('-', '/'));
} // }
this.initDate(d); // this.initDate(d);
}, };
// //
clickItem(e) { const clickItem = e => {
this.selectedDate = e.fullDate; // this.selectedDate = e.fullDate;
this.$emit('selected-change', e); // this.$emit('selected-change', e);
}, };
// //
goToday() { const goToday = () => {
const d = new Date(); // const d = new Date();
this.initDate(d); // this.initDate(d);
},
},
}; };
initDate();
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

8
components/Projects/Projects.vue

@ -0,0 +1,8 @@
<template>
</template>
<script>
</script>
<style>
</style>

13
pages.json

@ -3,13 +3,20 @@
{ {
"path": "pages/index/index", "path": "pages/index/index",
"style": { "style": {
"navigationBarTitleText": "uni-app" "navigationBarText": "TALL"
} }
} }
// {
// "path": "pages/project/project",
// "style": {
// "navigationStyle": "custom",
// "navigationBarTextStyle": "white"
// }
// }
], ],
"globalStyle": { "globalStyle": {
"navigationBarTextStyle": "black", "navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app", "navigationBarTitleText": "TALL",
"navigationBarBackgroundColor": "#F8F8F8", "navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8" "backgroundColor": "#F8F8F8"
} }

161
pages/index/index.vue

@ -1,66 +1,97 @@
<template> <template>
<view :style="{ height: height }" class="flex flex-col overflow-hidden u-font-14"> <view class="flex flex-col h-full bg-gray-50" @click="openAuth">
<!-- 标题栏 --> <view class="relative" @touchmove="onMove">
<Title /> <!-- 日历 -->
<Calendar @selected-change="onDateChange" :show-back="true" ref="calendar" @handleFindPoint="handleFindPoint" />
<view class="container flex flex-col flex-1 mx-auto overflow-hidden bg-gray-100"> <!-- 上传 导入wbs -->
<!-- 角色栏 --> <!-- <Upload @success="onUploadSuccess" @error="onUploadError" /> -->
<Roles /> </view>
<!-- 日常任务面板 --> <!-- 项目列表 -->
<Globals /> <Projects @getProjects="getProjects" class="flex-1 overflow-y-auto" />
<!-- 定期任务面板 --> <!-- 全局提示框 -->
<TimeLine @getTasks="getTasks" class="flex-1 overflow-hidden" ref="timeLine" /> <u-top-tips ref="uTips"></u-top-tips>
</view> </view>
</view> </template>
</template>
<script setup>
<script setup> import { reactive, ref, onMounted, computed, watch } from 'vue';
import { import { useStore } from 'vuex';
ref, onMounted import dayjs from 'dayjs';
} from 'vue'; import Calendar from '@/components/Calendar/Calendar.vue';
import Navbar from '@/components/Title/Title.vue'; import Upload from '@/components/Upload/Upload.vue';
import Roles from '@/components/Roles/Roles.vue'; import Projects from '@/components/Projects/Projects.vue';
import Globals from '@/components/Globals/Globals.vue';
import TimeLine from '@/components/TimeLine/TimeLine.vue'; const data = reactive({
calendar: null,
let height = ref(null); days: [],
});
onMounted(() => {
const system = uni.getSystemInfoSync(); const height = ref(null);
height.value = system.windowHeight + 'px'; const store = useStore();
}); const token = computed(() => store.state.user.token);
function getTasks() { // token
watch(
} () => token.value,
</script> newValue => {
console.log('newValue', newValue);
<style> if (!newValue) return;
.content { if (newValue) {
display: flex; handleFindPoint();
flex-direction: column; }
align-items: center; },
justify-content: center; { immediate: true },
} );
.logo { onMounted(() => {
height: 200rpx; const system = uni.getSystemInfoSync();
width: 200rpx; height.value = `${system.windowHeight}px`;
margin-top: 200rpx; });
margin-left: auto;
margin-right: auto; const handleFindPoint = async (start, end) => {
margin-bottom: 50rpx; try {
} const startTime = start
|| dayjs()
.text-area { .startOf('month')
display: flex; .valueOf();
justify-content: center; const endTime = end
} || dayjs()
.endOf('month')
.title { .valueOf();
font-size: 36rpx; const res = await uni.$u.api.findRedPoint(startTime, endTime);
color: #8f8f94; store.commit('project/setDotList', res);
} } catch (error) {
console.log('error: ', error);
}
};
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style> </style>

64
pages/project/project.vue

@ -0,0 +1,64 @@
<template>
<view :style="{ height: height }" class="flex flex-col overflow-hidden u-font-14">
<!-- 标题栏 -->
<Title />
<view class="container flex flex-col flex-1 mx-auto overflow-hidden bg-gray-100">
<!-- 角色栏 -->
<Roles />
<!-- 日常任务面板 -->
<Globals />
<!-- 定期任务面板 -->
<TimeLine @getTasks="getTasks" class="flex-1 overflow-hidden" ref="timeLine" />
</view>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import Navbar from '@/components/Title/Title.vue';
import Roles from '@/components/Roles/Roles.vue';
import Globals from '@/components/Globals/Globals.vue';
import TimeLine from '@/components/TimeLine/TimeLine.vue';
let height = ref(null);
onMounted(() => {
const system = uni.getSystemInfoSync();
height.value = system.windowHeight + 'px';
});
function getTasks() {
}
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>

89
store/index.js

@ -1,45 +1,46 @@
import { createStore } from 'vuex'; import { createStore } from 'vuex';
import user from './user/index.js'; import user from './user/index.js';
import socket from './socket/index.js'; import socket from './socket/index.js';
import project from './project/index.js';
// 不属于具体模块的 应用级的 store内容
const state = { // 不属于具体模块的 应用级的 store内容
networkConnected: true, // 网络是否连接 const state = {
forceUseStorage: true, // 强制启用storage networkConnected: true, // 网络是否连接
systemInfo: null, // 系统设备信息 forceUseStorage: true, // 强制启用storage
}; systemInfo: null, // 系统设备信息
};
const getters = {
// 是否启用本地存储 const getters = {
// 设置了强制启用本地存储 或者 没有网络连接的时候 // 是否启用本地存储
useStorage({ networkConnected, forceUseStorage }) { // 设置了强制启用本地存储 或者 没有网络连接的时候
return forceUseStorage || !networkConnected; useStorage({ networkConnected, forceUseStorage }) {
}, return forceUseStorage || !networkConnected;
}; },
};
const mutations = {
/** const mutations = {
* 设置网络是否连接的变量 /**
* @param {*} state * 设置网络是否连接的变量
* @param {boolean} networkConnected * @param {*} state
*/ * @param {boolean} networkConnected
setNetworkConnected(state, networkConnected) { */
state.networkConnected = networkConnected; setNetworkConnected(state, networkConnected) {
}, state.networkConnected = networkConnected;
},
/**
* 设置系统信息的数据 /**
* @param {object} state * 设置系统信息的数据
* @param {object | null} data 获取到的数据 * @param {object} state
*/ * @param {object | null} data 获取到的数据
setSystemInfo(state, data) { */
state.systemInfo = data; setSystemInfo(state, data) {
}, state.systemInfo = data;
}; },
};
export default createStore({
state, export default createStore({
getters, state,
mutations, getters,
modules: {user, socket} mutations,
modules: { user, socket, project },
}); });

3
store/project/actions.js

@ -0,0 +1,3 @@
const actions = {};
export default actions;

11
store/project/getters.js

@ -0,0 +1,11 @@
const getters = {
/**
* 当前项目的id
* @param {object} project
*/
projectId({ project }) {
return project.id;
},
};
export default getters;

12
store/project/index.js

@ -0,0 +1,12 @@
import state from './state';
import getters from './getters';
import mutations from './mutations';
import actions from './actions';
export default {
namespaced: true,
state,
getters,
mutations,
actions,
};

62
store/project/mutations.js

@ -0,0 +1,62 @@
const mutations = {
/**
* 设置state projects书籍
* @param {object} state
* @param {array} projects 项目列表
*/
setProjects(state, projects) {
if (!projects || !projects.length) {
state.projects = [];
} else {
state.projects = [...projects];
}
},
/**
* 设置子项目收缩展开
* @param { object } state
* @param { object } options options:{ index,show }
*/
setProjectItemShow(state, options) {
if (options.show) {
for (var i = 0; i < state.projects.length; i++) {
if (i === options.index) {
state.projects[i].show = true;
} else {
state.projects[i].show = false;
}
}
} else {
state.projects[options.index].show = false;
}
},
/**
* 设置当前项目信息
* @param { object } state
* @param { object } data
*/
setProject(state, data) {
state.project = data || { name: '加载中...' };
},
/**
* 设置当前项目名称
* @param { object } state
* @param { string } data
*/
setProjectName(state, data) {
state.project.name = data;
},
/**
* 设置小红点
* @param { object } state
* @param { string } data
*/
setDotList(state, data) {
state.dotList = data;
},
};
export default mutations;

8
store/project/state.js

@ -0,0 +1,8 @@
/* eslint-disable */
const state = {
project: { name: '加载中...' }, // 当前项目信息
projects: [], // 项目列表
dotList: [], // 小红点
};
export default state;

761
utils/time.js

@ -1,384 +1,379 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
// const advancedFormat = require('dayjs/plugin/advancedFormat'); // const advancedFormat = require('dayjs/plugin/advancedFormat');
// const weekOfYear = require('dayjs/plugin/weekOfYear'); // const weekOfYear = require('dayjs/plugin/weekOfYear');
// const duration = require('dayjs/plugin/duration'); // const duration = require('dayjs/plugin/duration');
// dayjs.extend(advancedFormat); // dayjs.extend(advancedFormat);
// dayjs.extend(weekOfYear); // dayjs.extend(weekOfYear);
// dayjs.extend(duration); // dayjs.extend(duration);
/** /**
* 格式化数字 * 格式化数字
* @param {*} n * @param {*} n
*/ */
const formatNumber = n => { const formatNumber = (n) => {
const str = n.toString(); const str = n.toString();
return str[1] ? str : `0${str}`; return str[1] ? str : `0${str}`;
}; };
/** /**
* 格式化时间 * 格式化时间
* @param {number} beginTime * @param {number} beginTime
*/ */
const formatTime = beginTime => { const formatTime = (beginTime) => {
const date = new Date(beginTime); const date = new Date(beginTime);
const year = date.getFullYear(); const year = date.getFullYear();
const month = date.getMonth() + 1; const month = date.getMonth() + 1;
const day = date.getDate(); const day = date.getDate();
const hour = date.getHours(); const hour = date.getHours();
const minute = date.getMinutes(); const minute = date.getMinutes();
const second = date.getSeconds(); const second = date.getSeconds();
return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}`; return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}`;
}; };
/** /**
* 添加一定时间的时长 * 添加一定时间的时长
* @param {number | date} time * @param {number | date} time
* @param {number} num * @param {number} num
* @param {string} cycle * @param {string} cycle
*/ */
const add = (time, num, cycle) => { const add = (time, num, cycle) => {
const str = dayjs(time).add(num, cycle); const str = dayjs(time).add(num, cycle);
return str; return str;
}; };
/** /**
* 时间转换 08:00 转换成8小时0分钟 * 时间转换 08:00 转换成8小时0分钟
* @param {string} time * @param {string} time
* @returns {{hours: number, minutes: number}} * @returns {{hours: number, minutes: number}}
*/ */
const convertTime = time => { const convertTime = (time) => {
const arr = time.split(':'); const arr = time.split(':');
return { return {
hours: parseInt(arr[0], 10), hours: parseInt(arr[0], 10),
minutes: parseInt(arr[1], 10), minutes: parseInt(arr[1], 10),
}; };
}; };
/** /**
* 将秒 -> * 将秒 ->
* @param {number} seconds * @param {number} seconds
*/ */
const secondToMinute = seconds => { const secondToMinute = (seconds) => {
const minute = formatNumber(Math.floor(seconds / 60)); const minute = formatNumber(Math.floor(seconds / 60));
const second = formatNumber(parseInt(seconds % 60, 10)); const second = formatNumber(parseInt(seconds % 60, 10));
return { return {
minute, minute,
second, second,
}; };
}; };
/** /**
* 将时间戳 -> : * 将时间戳 -> :
* @param {Number} timestamp 时间戳 * @param {Number} timestamp 时间戳
* @return date:2018/10/09 time: 12:59 * @return date:2018/10/09 time: 12:59
*/ */
const setTimestampToStr = timestamp => { const setTimestampToStr = (timestamp) => {
const timeObj = new Date(timestamp); const timeObj = new Date(timestamp);
const year = timeObj.getFullYear(); const year = timeObj.getFullYear();
const month = formatNumber(timeObj.getMonth() + 1); const month = formatNumber(timeObj.getMonth() + 1);
const day = formatNumber(timeObj.getDate()); const day = formatNumber(timeObj.getDate());
const hour = formatNumber(timeObj.getHours()); const hour = formatNumber(timeObj.getHours());
const minute = formatNumber(timeObj.getMinutes()); const minute = formatNumber(timeObj.getMinutes());
const date = `${year}-${month}-${day}`; const date = `${year}-${month}-${day}`;
const time = `${hour}:${minute}`; const time = `${hour}:${minute}`;
return { return {
date, date,
time, time,
}; };
}; };
/** /**
* 检测时间(ms)是不是今天 * 检测时间(ms)是不是今天
* @param {Number} time 时间戳 * @param {Number} time 时间戳
*/ */
const validateTimeIsToday = time => { const validateTimeIsToday = (time) => {
const timeDate = new Date(time); const timeDate = new Date(time);
const date = new Date(); const date = new Date();
return timeDate.getFullYear() === date.getFullYear() && timeDate.getMonth() === date.getMonth() && timeDate return timeDate.getFullYear() === date.getFullYear() && timeDate.getMonth() === date.getMonth() && timeDate
.getDate() === date.getDate(); .getDate() === date.getDate();
}; };
/** /**
* 检测两个日期是否相同 * 检测两个日期是否相同
* @param {number | date} time * @param {number | date} time
* @param {number | date} value * @param {number | date} value
* @param {string} cycle 传入 day 将会比较 day month和 year * @param {string} cycle 传入 day 将会比较 day month和 year
*/ */
const isSame = (time, value, cycle) => { const isSame = (time, value, cycle) => {
const str = dayjs(time).isSame(value, cycle); const str = dayjs(time).isSame(value, cycle);
return str; return str;
}; };
/** /**
* 格式化开始时间 * 格式化开始时间
* @param {Number} timestamp 时间戳 * @param {Number} timestamp 时间戳
* @return * @return
* 如果是今天 -> : * 如果是今天 -> :
* 如果不是今年 -> // : * 如果不是今年 -> // :
* 否则 ** : * 否则 ** :
*/ */
const formatBeginTime = timestamp => { const formatBeginTime = (timestamp) => {
const timeObj = new Date(timestamp); const timeObj = new Date(timestamp);
const year = timeObj.getFullYear(); const year = timeObj.getFullYear();
const month = formatNumber(timeObj.getMonth() + 1); const month = formatNumber(timeObj.getMonth() + 1);
const day = formatNumber(timeObj.getDate()); const day = formatNumber(timeObj.getDate());
const hour = formatNumber(timeObj.getHours()); const hour = formatNumber(timeObj.getHours());
const minute = formatNumber(timeObj.getMinutes()); const minute = formatNumber(timeObj.getMinutes());
const date = `${year}/${month}/${day}`; const date = `${year}/${month}/${day}`;
const time = `${hour}:${minute}`; const time = `${hour}:${minute}`;
const currentYear = new Date().getFullYear(); const currentYear = new Date().getFullYear();
if (validateTimeIsToday(timestamp)) { if (validateTimeIsToday(timestamp)) {
// 今天 // 今天
return `今天 ${time}`; return `今天 ${time}`;
} else if (currentYear !== year) { } if (currentYear !== year) {
// 不是今年 // 不是今年
return `${date} ${time}`; return `${date} ${time}`;
} else { }
return `${month}${day}${time}`; return `${month}${day}${time}`;
} };
};
/**
/** * 格式化时长
* 格式化时长 * @param {Number} duration 时长
* @param {Number} duration 时长 * 超过24小时 24 * 60 * 60 * 1000 ms 转换成天数 + 小时 + 分钟
* 超过24小时 24 * 60 * 60 * 1000 ms 转换成天数 + 小时 + 分钟 * 小于1分钟 60 * 1000 ms 转换成秒钟
* 小于1分钟 60 * 1000 ms 转换成秒钟 * 其余的显示分钟
* 其余的显示分钟 * 超过2小时 2 * 60 * 60 * 1000 ms 转换成小时 + 分钟数
* 超过2小时 2 * 60 * 60 * 1000 ms 转换成小时 + 分钟数 */
*/ const formatDuration = (duration) => {
const formatDuration = duration => { const minuteTime = 60 * 1000;
const minuteTime = 60 * 1000; const hourTime = 60 * minuteTime;
const hourTime = 60 * minuteTime; const dayTime = 24 * hourTime;
const dayTime = 24 * hourTime; const days = Math.floor(duration / dayTime);
const days = Math.floor(duration / dayTime); const hours = Math.floor((duration % dayTime) / hourTime);
const hours = Math.floor((duration % dayTime) / hourTime); const minutes = Math.floor((duration % hourTime) / minuteTime);
const minutes = Math.floor((duration % hourTime) / minuteTime); if (duration <= 60 * 1000) {
if (duration <= 60 * 1000) { // 小于1分钟 返回几秒
// 小于1分钟 返回几秒 return `${Math.floor(duration / 1000)}`;
return `${Math.floor(duration / 1000)}`; } if (duration > dayTime) {
} else if (duration > dayTime) { // 大于1天
// 大于1天 if (minutes === 0) {
if (minutes === 0) { if (hours === 0) {
if (hours === 0) { // 分钟数是0 和 小时数是0 返回 几天
// 分钟数是0 和 小时数是0 返回 几天 return `${days}`;
return `${days}`; }
} else { // 分钟是0 小时不是0 返回 几天几小时
// 分钟是0 小时不是0 返回 几天几小时 return `${days}${hours}小时`;
return `${days}${hours}小时`; }
} // 分钟不是0 返回几天几时几分
} else { return `${days}${hours}${minutes}`;
// 分钟不是0 返回几天几时几分 } if (duration > 2 * hourTime) {
return `${days}${hours}${minutes}`; // 大于2h
} if (minutes === 0) {
} else if (duration > 2 * hourTime) { // 分钟是0 返回几小时
// 大于2h return `${hours}小时`;
if (minutes === 0) { }
// 分钟是0 返回几小时 // 分钟不是0 返回几小时几分钟
return `${hours}小时`; return `${hours}小时${minutes}分钟`;
} else { }
// 分钟不是0 返回几小时几分钟 // 其余情况 返回 几分钟
return `${hours}小时${minutes}分钟`; return `${parseInt(duration / minuteTime)}分钟`;
} };
} else {
// 其余情况 返回 几分钟 /**
return `${parseInt(duration / minuteTime)}分钟`; * 格式化时长 转换成对象格式
} * @param {Number} duration 时长
}; * 超过24小时 24 * 60 * 60 * 1000 ms 转换成{days, hours, minutes, seconds: 0}
* 小于1分钟 60 * 1000 ms 转换成秒钟 { days: 0, hours: 0, minutes: 0, seconds }
/** * 其余的显示分钟 { days: 0, hours: 0, minutes, seconds: 0 }
* 格式化时长 转换成对象格式 * 超过2小时 2 * 60 * 60 * 1000 ms 转换成{ days: 0, hours, minutes, seconds: 0 }
* @param {Number} duration 时长 */
* 超过24小时 24 * 60 * 60 * 1000 ms 转换成{days, hours, minutes, seconds: 0} const formatDurationToObject = (duration) => {
* 小于1分钟 60 * 1000 ms 转换成秒钟 { days: 0, hours: 0, minutes: 0, seconds } const minuteTime = 60 * 1000;
* 其余的显示分钟 { days: 0, hours: 0, minutes, seconds: 0 } const hourTime = 60 * minuteTime;
* 超过2小时 2 * 60 * 60 * 1000 ms 转换成{ days: 0, hours, minutes, seconds: 0 } const dayTime = 24 * hourTime;
*/ const days = Math.floor(duration / dayTime);
const formatDurationToObject = duration => { const hours = Math.floor((duration % dayTime) / hourTime);
const minuteTime = 60 * 1000; const minutes = Math.floor((duration % hourTime) / minuteTime);
const hourTime = 60 * minuteTime; const result = {
const dayTime = 24 * hourTime; days: 0,
const days = Math.floor(duration / dayTime); hours: 0,
const hours = Math.floor((duration % dayTime) / hourTime); minutes: 0,
const minutes = Math.floor((duration % hourTime) / minuteTime); seconds: 0,
const result = { };
days: 0, if (duration <= 60 * 1000) {
hours: 0, // 小于1分钟 返回几秒
minutes: 0, result.seconds = Math.floor(duration / 1000);
seconds: 0, } else if (duration > dayTime) {
}; // 大于1天
if (duration <= 60 * 1000) { if (minutes === 0) {
// 小于1分钟 返回几秒 if (hours === 0) {
result.seconds = Math.floor(duration / 1000); // 分钟数是0 和 小时数是0 返回 几天
} else if (duration > dayTime) { result.days = days;
// 大于1天 } else {
if (minutes === 0) { // 分钟是0 小时不是0 返回 几天几小时
if (hours === 0) { result.days = days;
// 分钟数是0 和 小时数是0 返回 几天 result.hours = hours;
result.days = days; }
} else { } else {
// 分钟是0 小时不是0 返回 几天几小时 // 分钟不是0 返回几天几时几分
result.days = days; result.days = days;
result.hours = hours; result.hours = hours;
} result.minutes = minutes;
} else { }
// 分钟不是0 返回几天几时几分 } else if (duration > 2 * hourTime) {
result.days = days; // 大于2h
result.hours = hours; if (minutes === 0) {
result.minutes = minutes; // 分钟是0 返回几小时
} result.hours = hours;
} else if (duration > 2 * hourTime) { } else {
// 大于2h // 分钟不是0 返回几小时几分钟
if (minutes === 0) { result.hours = hours;
// 分钟是0 返回几小时 result.minutes = minutes;
result.hours = hours; }
} else { } else {
// 分钟不是0 返回几小时几分钟 // 其余情况 返回 几分钟
result.hours = hours; result.minutes = minutes;
result.minutes = minutes; }
} return result;
} else { };
// 其余情况 返回 几分钟
result.minutes = minutes; /**
} * 将对象格式的时间转换成时间戳
return result; * @param {obj} 对象格式的时间 days, hours, minutes, seconds
}; * @return 时长的ms
*/
/** const formatObjectTimeToMs = (days = 0, hours = 0, minutes = 0, seconds = 0) => days * 24 * 60 * 60 * 1000 + hours * 60 * 60 * 1000 + minutes * 60 * 1000 + seconds * 1000;
* 将对象格式的时间转换成时间戳
* @param {obj} 对象格式的时间 days, hours, minutes, seconds /**
* @return 时长的ms * 计算过滤 周期
*/ * @param {string} time 周期字符串
const formatObjectTimeToMs = (days = 0, hours = 0, minutes = 0, seconds = 0) => { * @return {string} cycle 周期英文字符串
return days * 24 * 60 * 60 * 1000 + hours * 60 * 60 * 1000 + minutes * 60 * 1000 + seconds * 1000; */
}; const computeCycle = (time) => {
// 加载下一个周期的任务
/** let cycle = 'day';
* 计算过滤 周期 switch (time) {
* @param {string} time 周期字符串 case '天':
* @return {string} cycle 周期英文字符串 cycle = 'day';
*/ break;
const computeCycle = time => { case '周':
// 加载下一个周期的任务 cycle = 'week';
let cycle = 'day'; break;
switch (time) { case '月':
case '天': cycle = 'month';
cycle = 'day'; break;
break; default:
case '周': cycle = '日程';
cycle = 'week'; break;
break; }
case '月': return cycle;
cycle = 'month'; };
break;
default: /**
cycle = '日程'; * 将时间按周期语义化
break; * @param {string} cycle 周期
} * @param {number|string} time 时间
return cycle; */
}; const formatStartTimeToCycleTime = (cycle, time) => {
let result = '';
/** const _time = dayjs(+time);
* 将时间按周期语义化 switch (cycle) {
* @param {string} cycle 周期 case '天':
* @param {number|string} time 时间 result = _time.format('YYYY年M月D日');
*/ break;
const formatStartTimeToCycleTime = (cycle, time) => { case '周':
let result = ''; result = _time.format('YYYY年w周');
const _time = dayjs(+time); break;
switch (cycle) { case '月':
case '天': result = _time.format('YYYY年M月');
result = _time.format('YYYY年M月D日'); break;
break; case '日程':
case '周': result = _time.format('YYYY年M月D日 HH:mm');
result = _time.format('YYYY年w周'); break;
break; default:
case '月': result = _time.format('YYYY年M月D日');
result = _time.format('YYYY年M月'); break;
break; }
case '日程': return result;
result = _time.format('YYYY年M月D日 HH:mm'); };
break;
default: /**
result = _time.format('YYYY年M月D日'); * 计算进行中状态剩余时间 显示数字
break; * @param {number} leftTime 剩余时间ms
} * @returns { num: 显示的数字, time: 演示器演示时长 }
return result; */
}; const computeDurationText = (leftTime) => {
try {
/** if (leftTime < 0) {
* 计算进行中状态剩余时间 显示数字 return {
* @param {number} leftTime 剩余时间ms num: 0,
* @returns { num: 显示的数字, time: 演示器演示时长 } time: null,
*/ };
const computeDurationText = leftTime => { }
try { const {
if (leftTime < 0) return { years,
num: 0, months,
time: null days,
}; hours,
const { minutes,
years, seconds,
months, milliseconds,
days, } = dayjs.duration(leftTime).$d;
hours, let num = 0;
minutes, let time = 1000;
seconds,
milliseconds if (years > 0) {
} = dayjs.duration(leftTime).$d; num = years;
let num = 0; time = 60 * 60 * 1000; // 按小时
let time = 1000; } else if (months > 0) {
num = months;
if (years > 0) { time = 60 * 60 * 1000; // 按小时
num = years; } else if (days > 0) {
time = 60 * 60 * 1000; // 按小时 num = days;
} else if (months > 0) { time = 60 * 60 * 1000; // 按小时
num = months; } else if (hours > 0) {
time = 60 * 60 * 1000; // 按小时 num = hours;
} else if (days > 0) { } else if (minutes > 0) {
num = days; num = minutes;
time = 60 * 60 * 1000; // 按小时 } else if (seconds > 0) {
} else if (hours > 0) { num = seconds;
num = hours; } else if (milliseconds > 0) {
} else if (minutes > 0) { num = milliseconds;
num = minutes; time = 16;
} else if (seconds > 0) { } else {
num = seconds; time = null;
} else if (milliseconds > 0) { }
num = milliseconds; return {
time = 16; num,
} else { time,
time = null; };
} } catch (error) {
return { console.log('🚀 ~ file: time.js ~ line 335 ~ computeDurationText ~ error', error);
num, return {
time num: 0,
}; time: null,
} catch (error) { };
console.log('🚀 ~ file: time.js ~ line 335 ~ computeDurationText ~ error', error); }
return { };
num: 0,
time: null export default {
}; formatNumber,
} formatTime,
}; add,
convertTime,
export default { secondToMinute,
formatNumber, setTimestampToStr,
formatTime, isSame,
add, formatBeginTime,
convertTime, formatDuration,
secondToMinute, formatDurationToObject,
setTimestampToStr, formatObjectTimeToMs,
isSame, computeCycle,
formatBeginTime, formatStartTimeToCycleTime,
formatDuration, computeDurationText,
formatDurationToObject,
formatObjectTimeToMs,
computeCycle,
formatStartTimeToCycleTime,
computeDurationText,
}; };

Loading…
Cancel
Save