Compare commits

...

2 Commits

Author SHA1 Message Date
plightfield 38c07cb9ce Merge remote-tracking branch 'origin/tomato' 2024-11-04 14:36:43 +08:00
expdsn 229ea2c5d5 revert c2e2c7b895
revert save
2024-11-04 14:25:11 +08:00
7 changed files with 65 additions and 209 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

View File

@ -1,15 +1,11 @@
import { computed, defineComponent, onMounted, ref, Transition } from 'vue'
import returnImg from "~/public/icons/work/return.png"
import endImg from "~/public/icons/work/tomotoIconEnd.png"
import playWaveGif from "~/public/icons/work/playMusicIcon.gif"
import PlayStartImg from "~/public/icons/work/start.png"
import musicIcon from "~/public/icons/work/musicIcon.png"
import WelcomeImg from '~/public/icons/welcome/welcomeTitle.png'
import DivBgImg from '~/public/icons/welcome/back.png'
import startUseImg from '~/public/icons/welcome/startUse.png'
import useBackgroundStore from '../background/useBackgroundStore'
import useLayoutStore from '../useLayoutStore'
import useTomatoStore, { musicList } from '@/widgets/work/useTomatoStore'
import useTomatoStore from '@/widgets/work/useTomatoStore'
import Search from '../header/search'
import { Tooltip } from 'ant-design-vue'
import { formatSeconds } from '@/utils/tool'
export const DefaultPageSetting = [
{
name: '游戏',
@ -55,7 +51,7 @@ export default defineComponent(() => {
}
})
return () =>
store.openFullscreen && (
!store.openFullscreen && (
<div class="fixed left-0 top-0 z-50 w-full ">
<Transition name="background">
{background.bgTrriger && (
@ -88,55 +84,14 @@ export default defineComponent(() => {
</div>
))
}
<div class={"w-[500px] flex justify-center flex-col items-center gap-y-3 h-full text-white "}>
<div class={"w-[500px] flex justify-center flex-col items-center h-full "}>
<span class={"text-[24px] leading-[36px]"}></span>
<span class={"font-din text-[82px] font-bold leading-[115px]"}>{!store.state.isStart ? '15:00' : formatSeconds(store.remainingTime)}</span>
<span class={"font-din text-[82px] font-bold leading-[115px]"}>15:00</span>
<div class={"relative"}>
<div class={"aboslute w-[370px]"}>
<Search isMini></Search>
</div>
<Search isMini></Search>
</div>
<div class={"w-full flex gap-x-4 justify-center mt-5"}>
<Tooltip title={"返回工作模式"}>
<div
onClick={() => {
store.openFullscreen = false
}}
class={"w-[44px] h-[44px] flex items-center justify-center rounded-lg cursor-pointer hover:opacity-90"}
style={{
background: 'linear-gradient(225deg,#707eff 0%,#6b97ff 100%)',
boxShadow: '0 2px 4px #0003'
}}>
<img src={returnImg} alt='return' class={"w-[18px] h-[18px]"}></img>
</div>
</Tooltip>
<Tooltip title={"停止"}>
<div
class={"w-[44px] h-[44px] flex items-center justify-center rounded-lg cursor-pointer hover:opacity-90"}
style={{
background: 'linear-gradient(225deg,#707eff 0%,#6b97ff 100%)',
boxShadow: '0 2px 4px #0003'
}}>
<img src={endImg} alt='return' class={"w-[18px] h-[18px]"}></img>
</div>
</Tooltip>
<div class={"w-[140px] h-[44px] relative bg-[#f0f0f0] rounded-lg flex px-3 items-center justify-between cursor-pointer hover:opacity-90"}
style={{
boxShadow: '0 2px 4px #0003'
}}>
{
store.state.isPlaying ?
<img src={playWaveGif} alt='return' class={"w-[18px] h-[18px] "}></img>
:
<img src={musicIcon} alt='return' class={"w-[18px] h-[18px] "}></img>
}
<span class={"whitespace-nowrap text-ellipsis overflow-hidden text-[#333]"}>{musicList[store.state.selectMusic].name}</span>
<div class={"w-[26px] h-[26px] right-[-14px] rounded-full bg-[#c0c0c0] absolute flex items-center justify-center"}>
<img src={PlayStartImg} alt='start ' class={"w-[12px] h-[12px]"}></img>
</div>
</div>
<div class={"w-full flex gap-x-3"}>
</div>
</div>
</div>

View File

@ -22,18 +22,4 @@ export function generateRandomString(n: number): string {
}
return result;
}
/**
* :
* @param seconds -
* @returns MM:SS
*/
export function formatSeconds(seconds: number): string {
// 计算分钟数
const minutes = Math.floor(seconds / 60);
// 计算剩余的秒数
const remainingSeconds = seconds % 60;
// 返回格式化后的字符串,确保分钟和秒数都是两位数
return `${String(minutes).padStart(2, '0')}:${String(remainingSeconds).padStart(2, '0')}`;
}
}

View File

@ -3,7 +3,7 @@ import { defineComponent } from 'vue'
export default defineComponent(() => {
return () => (
<div class="w-full h-full bg-[#ecfbff] flex flex-col">
large
</div>
)
})

View File

@ -1,7 +1,6 @@
import { computed, defineComponent, ref } from 'vue'
import useTomatoStore from '../useTomatoStore'
import NoDataImg from "~/public/icons/work/noData.png"
import StopImg from "~/public/icons/work/tomotoIconEnd.png"
import clsx from 'clsx'
import dayjs from 'dayjs'
import PlayImg from "~/public/icons/work/work_page-play.png"
@ -89,36 +88,18 @@ export default defineComponent(() => {
<span class={" tracking-wide"}> <span class={"text-[#5b47ff]"}>{store.state.list.filter(val => dayjs(val.finishTime).isSame(dayjs(), 'day') && val.isCompleted).length}</span></span>
<span class={"text-[#ff8686]"}></span>
</div>
{
store.state.isStart ?
<button class={"w-[126px] h-[44px] text-[16px] text-white rounded-lg gap-x-1 font-bold flex items-center justify-center"} style={{
background: 'linear-gradient(225deg,#642FFF 0%,#5162FF 100%)',
boxShadow: '0 2px 4px #0003'
}}
onClick={() => {
store.stopTomatoTime()
}}
>
<img src={StopImg} alt="play img " class={"w-[13px]"} />
</button> :
<button class={"w-[126px] h-[44px] text-[16px] text-white rounded-lg gap-x-1 font-bold flex items-center hover:opacity-90 justify-center"} style={{
background: 'linear-gradient(225deg,#642FFF 0%,#5162FF 100%)',
boxShadow: '0 2px 4px #0003'
}}
onClick={() => {
store.openFullscreen = true
store.beginTomatoTime()
}}
>
<img src={PlayImg} alt="play img " class={"w-[13px]"} />
</button>
}
<button class={"w-[126px] h-[44px] text-[16px] text-white rounded-lg gap-x-1 font-bold flex items-center justify-center"} style={{
background: 'linear-gradient(225deg,#642FFF 0%,#5162FF 100%)',
boxShadow: '0 2px 4px #0003'
}}
onClick={() => {
store.openFullscreen = true
}}
>
<img src={PlayImg} alt="play img " class={"w-[13px]"} />
</button>
</div>
</div>

View File

@ -1,115 +1,49 @@
import useTimeStore from "@/utils/useTimeStore";
import dayjs from "dayjs";
import { defineStore } from "pinia";
import { computed, reactive, ref, watch } from "vue";
import { defineStore } from 'pinia'
import { computed, reactive, ref, watch } from 'vue'
const TOTAL_TIME = 60 * 60 * 15
export type TomatoTarget = {
id: string;
finishTime: number;
remindTime: number | null;
title: string;
isCompleted: boolean;
id: string
finishTime: number
remindTime: number | null
title: string
isCompleted: boolean
}
export type TomatoTime = {
date: number;
finishTime: number;
date: number
finishTime: number
}
export const musicList = [
{
name: 'A Part of Us',
music: 'https://newfatfox.oss-cn-beijing.aliyuncs.com/admin/music/aPartOfUs.mp3'
}, {
name: 'a signal rose',
music: 'https://newfatfox.oss-cn-beijing.aliyuncs.com/admin/music/AsignalRose.mp3'
}, {
name: 'a thousand lifetimes',
music: 'https://newfatfox.oss-cn-beijing.aliyuncs.com/admin/music/aThousandLifetimes.mp3'
}, {
name: 'A Very Brady Special',
music: 'https://newfatfox.oss-cn-beijing.aliyuncs.com/admin/music/AVeryBradySpecial.mp3'
}, {
name: 'A Wonderful Story',
music: 'https://newfatfox.oss-cn-beijing.aliyuncs.com/admin/music/AWonderfulStore.mp3'
}
{
name: 'A Part of Us',
music: 'https://newfatfox.oss-cn-beijing.aliyuncs.com/admin/music/aPartOfUs.mp3'
},
{
name: 'a signal rose',
music: 'https://newfatfox.oss-cn-beijing.aliyuncs.com/admin/music/AsignalRose.mp3'
},
{
name: 'a thousand lifetimes',
music: 'https://newfatfox.oss-cn-beijing.aliyuncs.com/admin/music/aThousandLifetimes.mp3'
},
{
name: 'A Very Brady Special',
music: 'https://newfatfox.oss-cn-beijing.aliyuncs.com/admin/music/AVeryBradySpecial.mp3'
},
{
name: 'A Wonderful Story',
music: 'https://newfatfox.oss-cn-beijing.aliyuncs.com/admin/music/AWonderfulStore.mp3'
}
]
export default defineStore("work", () => {
const state = reactive({
list: [] as TomatoTarget[],
timeList: [] as TomatoTime[],
isPlaying: false as boolean,
selectMusic: 0,
isStart: false as boolean,
beginTime: -1 as number
})
const time = useTimeStore()
const beginTomatoTime = () => {
state.beginTime = dayjs().valueOf()
state.isStart = true
playMusic()
}
const stopTomatoTime = () => {
state.isStart = false
state.beginTime = -1
stopMusic()
}
const remainingTime = computed(() => {
const totalTime = TOTAL_TIME
return dayjs(state.beginTime).add(15, 'minute').diff(dayjs(time.date), 'second')
})
const playAudio = computed(() => {
const audio = new Audio(musicList[state.selectMusic].music)
return audio
})
watch(() => remainingTime, (val) => {
if (val.value < 0) {
state.isPlaying = false
state.isStart = false
state.beginTime = -1
state.timeList.push({
date: dayjs().valueOf(),
finishTime: TOTAL_TIME
})
}
})
// watch(() => state.isPlaying, (val) => {
// if (val) {
// playAudio.value.play()
// } else {
// playAudio.value.pause()
// }
// })
const playMusic = () => {
state.isPlaying = true
playAudio.value.play()
}
const pauseMusic = () => {
state.isPlaying = false
playAudio.value.pause()
}
const stopMusic = () => {
state.isPlaying = false
playAudio.value.pause()
playAudio.value.currentTime = 0
}
const openShowModel = ref<undefined | null | TomatoTarget>()
const openFullscreen = ref(false)
return {
state,
openShowModel,
openFullscreen,
beginTomatoTime,
remainingTime,
playMusic,
pauseMusic,
stopMusic,
stopTomatoTime
}
})
export default defineStore('work', () => {
const state = reactive({
list: [] as TomatoTarget[],
timeList: [] as TomatoTime[]
})
const openShowModel = ref<undefined | null | TomatoTarget>()
const openFullscreen = ref(false)
return {
state,
openShowModel,
openFullscreen
}
})