123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- <template>
- <div
- class="bs-design-wrap"
- :class="`bs-time-count-down-${customTheme}`"
- >
- <span
- v-if="isPast"
- style="color: #ea0b30"
- >(已过期)</span>
- <div
- :class="[
- 'time',
- {
- 'light-theme': customTheme === 'light',
- 'auto-theme': customTheme == 'auto',
- 'dark-theme': customTheme == 'dark'
- }
- ]"
- class="time-text-box"
- :style="
- 'font-size:' +
- config.customize.fontSize +
- 'px;color:' +
- config.customize.color +
- ';font-weight:' +
- config.customize.fontWeight +
- ';font-family:' +
- config.customize.fontFamily
- "
- >
- {{ dateDiff }}
- </div>
- </div>
- </template>
- <script>
- import paramsMixins from 'data-room-ui/js/mixins/paramsMixins'
- import { settingToTheme } from 'data-room-ui/js/utils/themeFormatting'
- import cloneDeep from 'lodash/cloneDeep'
- import { mapMutations, mapState } from 'vuex'
- export default {
- name: 'TimeCountDown',
- mixins: [paramsMixins],
- props: {
- config: {
- type: Object,
- default: () => {}
- }
- },
- data () {
- return {
- timer: '',
- allTime: 0,
- date: '',
- time: new Date().getTime()
- }
- },
- computed: {
- ...mapState({
- customTheme: state => state.bigScreen.pageInfo.pageConfig.customTheme,
- activeCode: state => state.bigScreen.activeCode
- }),
- isPast: {
- get () {
- if (new Date(this.config.endTime).getTime() - this.time < 0) {
- return true
- } else {
- return false
- }
- }
- },
- dateDiff: {
- // eslint-disable-next-line vue/return-in-computed-property
- get () {
- if (this.config.endTime) {
- return this.dateFormat(
- new Date(this.config.endTime).getTime() - this.time
- )
- }
- },
- set (val) {
- this.allTime = val
- }
- }
- },
- watch: {
- 'config.endTime': {
- handler () {
- this.getTime()
- },
- immediate: true
- }
- },
- mounted () {
- this.changeStyle()
- },
- // 销毁定时器
- destroyed () {
- if (this.timer) {
- clearInterval(this.timer) // 关闭
- }
- },
- methods: {
- ...mapMutations({
- changeChartConfig: 'bigScreen/changeChartConfig',
- changeActiveItemConfig: 'bigScreen/changeActiveItemConfig'
- }),
- changeStyle (config) {
- this.config.endTime = this.config.endTime
- ? new Date(this.config.endTime).getTime()
- : new Date().getTime() + 3 * 3600 * 1000 * 24 - 1000
- this.getTime()
- config = { ...this.config, ...config }
- // 样式改变时更新主题配置
- config.theme = settingToTheme(cloneDeep(config), this.customTheme)
- this.changeChartConfig(config)
- if (this.config.code === this.activeCode) {
- this.changeActiveItemConfig(config)
- }
- },
- getTime () {
- if (this.timer) {
- clearInterval(this.timer)
- }
- this.timer = setInterval(() => {
- this.time = this.time + 1000
- if (this.dateDiff <= 0) {
- clearInterval(this.timer)
- }
- }, 1000)
- },
- // 格式化时间
- dateFormat (dateDiff) {
- if (dateDiff < 0) {
- dateDiff = -dateDiff
- }
- const dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)) // 计算出相差天数
- const leave1 = dateDiff % (24 * 3600 * 1000) // 计算天数后剩余的毫秒数
- const hours = Math.floor(leave1 / (3600 * 1000)) // 计算出小时数
- // 计算相差分钟数
- const leave2 = leave1 % (3600 * 1000) // 计算小时数后剩余的毫秒数
- const minutes = Math.floor(leave2 / (60 * 1000)) // 计算相差分钟数
- // 计算相差秒数
- const leave3 = leave2 % (60 * 1000) // 计算分钟数后剩余的毫秒数
- const seconds = Math.round(leave3 / 1000)
- // const leave4=leave3%(60*1000) //计算分钟数后剩余的毫秒数
- // const minseconds=Math.round(leave4/1000)
- const timeFn =
- dayDiff +
- ' 天 ' +
- hours +
- ' 小时 ' +
- minutes +
- ' 分钟 ' +
- seconds +
- ' 秒'
- return timeFn
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- @import "../../BasicComponents/fonts/index.css";
- @import "../../assets/fonts/numberFont/stylesheet.css";
- .bs-design-wrap{
- width: 100%;
- }
- .time {
- height: 100%;
- display: flex;
- align-items: center;
- justify-content: center;
- overflow: auto;
- }
- .light-theme {
- background-color: #ffffff;
- color: #000000;
- }
- .dark-theme {
- background-color: transparent;
- color: #ffffff;
- }
- .auto-theme {
- background-color: transparent;
- color: #000000;
- }
- .time-text-box{
- padding: 20px;
- display: flex;
- align-items: center;
- justify-content: center;
- white-space:nowrap;
- box-sizing: border-box;
- overflow: hidden;
- }
- </style>
|