From c9cdd4d727760bbf4de5551482ee12753562946f Mon Sep 17 00:00:00 2001 From: expdsn <18111002318@163.com> Date: Tue, 15 Oct 2024 16:25:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=A4=A9=E6=B0=94=E5=BC=B9?= =?UTF-8?q?=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/weather_img/img/weather_bg_large.webp | Bin 0 -> 33214 bytes src/GlobalModal.tsx | 63 ++-- src/main.css | 17 +- src/main.ts | 2 + src/settings/useSettingsStore.ts | 2 +- src/widgets/weather/Large.tsx | 69 +++- src/widgets/weather/Middle.tsx | 54 ++- src/widgets/weather/Modal.tsx | 334 ++++++++++++++++++- src/widgets/weather/Small.tsx | 2 + src/widgets/weather/useWeatherStore.ts | 40 ++- src/widgets/weather/weatherIcon.tsx | 110 ++++++ 11 files changed, 629 insertions(+), 64 deletions(-) create mode 100644 public/weather_img/img/weather_bg_large.webp create mode 100644 src/widgets/weather/weatherIcon.tsx diff --git a/public/weather_img/img/weather_bg_large.webp b/public/weather_img/img/weather_bg_large.webp new file mode 100644 index 0000000000000000000000000000000000000000..57d4589a543f12be49f1f3509c4f360edee5586f GIT binary patch literal 33214 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%0AoN#Jj-r*vff=n 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 literal 0 HcmV?d00001 diff --git a/src/GlobalModal.tsx b/src/GlobalModal.tsx index 8db28a9..f6d1aa7 100644 --- a/src/GlobalModal.tsx +++ b/src/GlobalModal.tsx @@ -9,7 +9,7 @@ const SearchPage = asyncLoader(() => import('@/layout/header/search/SearchPage') const AdderPage = asyncLoader(() => import('@/layout/adder/AdderPage')) const BackgroundSwtich = asyncLoader(() => import('@/layout/background/BackgroundSwtich')) -const noFullList: RouteStr[] = ['global-search', 'global-adder', 'global-background'] +const fullList: RouteStr[] = [] export default defineComponent(() => { const router = useRouterStore() @@ -43,36 +43,40 @@ export default defineComponent(() => {
{/* 关闭按钮 */}
{ router.back() }} > - +
{/* 全屏按钮 */} - {noFullList.includes(router.path) ? null : ( + {!fullList.includes(router.path) ? null : (
{ full.value = !full.value }} > - +
)} @@ -83,23 +87,22 @@ export default defineComponent(() => { ) : router.path === 'global-adder' ? ( ) : router.path === 'global-background' ? ( - - ) : - router.path.startsWith('widget-') ? ( - (() => { - const name = router.path.split('-')[1] - const selected = widgetList.find((el) => el.name === name) - if (!selected) - return ( -
- 组件维护中 -
- ) - const compo = selected.modal - console.log(compo) - return - })() - ) : null} + + ) : router.path.startsWith('widget-') ? ( + (() => { + const name = router.path.split('-')[1] + const selected = widgetList.find((el) => el.name === name) + if (!selected) + return ( +
+ 组件维护中 +
+ ) + const compo = selected.modal + console.log(compo) + return + })() + ) : null}
diff --git a/src/main.css b/src/main.css index e477f7b..56b04fa 100644 --- a/src/main.css +++ b/src/main.css @@ -3,28 +3,29 @@ @tailwind utilities; :root { - font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-family: - SourceHanSans, + SourceHanSansCN-Regular, -apple-system, - BlinkMacSystemFont, - Helvetica Neue, PingFang SC, Microsoft YaHei, - Source Han Sans SC, Noto Sans CJK SC, - WenQuanYi Micro Hei, - sans-serif; + WenQuanYi Micro Hei !important; } @font-face { - font-family: 'SourceHanSans'; + font-family: 'SourceHanSansCN-Regular'; src: url('/fonts/SourceHanSansCN-Regular.subset.otf') format('truetype'); font-weight: normal; font-style: normal; } +@font-face { + font-family: 'SourceHanSansCN-bold'; + src: url('/fonts/SourceHanSansCN-Regular.subset.otf') format('truetype'); + font-weight: 700; + font-style: normal; +} body { /* ! 全局禁用鼠标选择,需要在其他位置放开 */ user-select: none; diff --git a/src/main.ts b/src/main.ts index 6c56604..e08fc26 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,12 +8,14 @@ import getFp from './utils/getFp' import vOutsideClick from './utils/vOutsideClick' import dayjs from 'dayjs' import Toast, { useToast, type PluginOptions } from 'vue-toastification' +import customParseFormat from 'dayjs/plugin/customParseFormat' import 'vue-toastification/dist/index.css' import 'dayjs/locale/zh-cn' dayjs.locale('zh-cn') const app = createApp(App) export const globalToast = useToast() +dayjs.extend(customParseFormat) // ! persist 利用 localstorage,请不要在大量数据时使用 // 大量数据(扩张内容,文件),清直接使用 ./db.ts diff --git a/src/settings/useSettingsStore.ts b/src/settings/useSettingsStore.ts index 996f4a5..4ce8147 100644 --- a/src/settings/useSettingsStore.ts +++ b/src/settings/useSettingsStore.ts @@ -19,7 +19,7 @@ export default defineStore( showTime: true, showAdder: true, // 尺寸 - blockSize: 6, + blockSize: 6.7, blockPadding: 1, mainWidth: 70, blockRadius: 0.2, diff --git a/src/widgets/weather/Large.tsx b/src/widgets/weather/Large.tsx index ce10fde..d6bc224 100644 --- a/src/widgets/weather/Large.tsx +++ b/src/widgets/weather/Large.tsx @@ -1,10 +1,69 @@ import { defineComponent } from 'vue' import useWeatherStore from './useWeatherStore' - +import WeatherIcon from './weatherIcon' +import dayjs from 'dayjs' +import clsx from 'clsx' export default defineComponent(() => { const weather = useWeatherStore() - return () =>
{}
+ return () => ( +
+
+ {weather.weatherData?.base.stemp}° +
+
+ + {weather.weatherData?.city.name} + +
+ + 最低{weather.weatherData?.base.ltemp}°/{weather.weatherData?.base.htemp}°最高 + +
+
+ + {weather.weatherData?.base.weather} +
+
+
+
+ {weather.weatherData?.weathers7.map((item, idx) => { + return ( +
+ + {idx === 0 + ? '今天' + : idx === 1 + ? '明天' + : dayjs(item.date, 'MM月DD日').format('ddd')} + + + + {item.ltemp + '°/' + item.htemp + '°'} + +
+ ) + })} +
+
+
+
+ ) }) diff --git a/src/widgets/weather/Middle.tsx b/src/widgets/weather/Middle.tsx index f24e718..3f3a7c4 100644 --- a/src/widgets/weather/Middle.tsx +++ b/src/widgets/weather/Middle.tsx @@ -1,33 +1,67 @@ import { defineComponent } from 'vue' import useWeatherStore from './useWeatherStore' +import WeatherIcon from './weatherIcon' +import dayjs from 'dayjs' +import clsx from 'clsx' export default defineComponent(() => { const weather = useWeatherStore() return () => ( -
+
{weather.weatherData?.base.stemp}° -
+
- + {weather.weatherData?.city.name}
- - - {weather.weatherData?.base.ltemp}°/{weather.weatherData?.base.htemp}° - + + {weather.weatherData?.base.ltemp}°/{weather.weatherData?.base.htemp}°
- {weather.weatherData?.base.weather} +
+ + {weather.weatherData?.base.weather} +
+
+
+
+ {weather.weatherData?.weathers7 + .filter((_, idx) => idx < 3) + .map((item, idx) => { + return ( +
+ + {idx === 0 ? '今天' : idx === 1 ? '明天' : dayjs().format('ddd')} + + + + {item.ltemp + '°/' + item.htemp + '°'} + +
+ ) + })} +
diff --git a/src/widgets/weather/Modal.tsx b/src/widgets/weather/Modal.tsx index 9c16be7..388bca6 100644 --- a/src/widgets/weather/Modal.tsx +++ b/src/widgets/weather/Modal.tsx @@ -1,5 +1,333 @@ -import { defineComponent } from 'vue' - +import { Cascader, message } from 'ant-design-vue' +import { computed, defineComponent, onMounted, ref, type HTMLAttributes, type VNodeRef } from 'vue' +import useWeatherStore from './useWeatherStore' +import type { DefaultOptionType } from 'ant-design-vue/es/select' +import { addIcons, OhVueIcon } from 'oh-vue-icons' +import clsx from 'clsx' +import { FaMinus, HiSolidLocationMarker } from 'oh-vue-icons/icons' +import WeatherIcon from './weatherIcon' +import dayjs from 'dayjs' +addIcons(FaMinus, HiSolidLocationMarker) export default defineComponent(() => { - return () =>
+ const store = useWeatherStore() + const hourRef = ref(null) + const cascaderTriiger = ref(true) + const searchValue = ref('') + const filter = (inputValue: string, path: DefaultOptionType[]) => + path.some( + (option) => (option.label as string).toLowerCase().indexOf(inputValue.toLowerCase()) > -1 + ) + onMounted(() => { + store.queryAll() + }) + const nowWeather = computed(() => { + if (store.state.selectedCityCode === -1) return store.weatherData + const idx = store.state.weatherList.findIndex((val) => val.id === store.state.selectedCityCode) + + if (idx !== -1) { + return store.state.weatherList[idx].data + } else { + return store.weatherData + } + }) + function getPracticeIndex(val: string) { + const numVal = parseFloat(val) || 0 + if (numVal < 115) { + return '适宜晨练' + } else { + return '不宜晨练' + } + } + function pollution(val: string) { + const numVal = parseFloat(val) || 0 + if (numVal < 35) { + return '优' + } else if (numVal < 75) { + return '良' + } else if (numVal < 115) { + return '轻度污染' + } else if (numVal < 150) { + return '中度污染' + } else if (numVal < 250) { + return '重度污染' + } else if (numVal >= 250) { + return '严重污染' + } else { + return '未知' + } + } + function shirtIndex(val: string) { + const numVal = parseFloat(val) || 0 + if (numVal < 6) { + return '寒冷' + } else if (numVal < 10.9) { + return '冷' + } else if (numVal < 14.9) { + return '凉' + } else if (numVal < 17.9) { + return '温凉' + } else if (numVal < 20.9) { + return '凉舒适' + } else if (numVal < 23.9) { + return '舒适' + } else if (numVal < 27.9) { + return '热舒适' + } else if (numVal >= 28) { + return '炎热' + } else { + return '温凉' + } + } + function coldIndex(val: string) { + const numVal = parseFloat(val) || 0 + if (numVal < 6) { + return '易发感冒' + } else if (numVal < 10.9) { + return '较易发感冒' + } else { + return '不易发感冒' + } + } + return () => ( +
+
+
+ {cascaderTriiger.value && ( + { + cascaderTriiger.value = false + setTimeout(() => { + cascaderTriiger.value = true + }, 0) + + if (store.state.weatherList.findIndex((val) => val.id === option[2].value) !== -1) { + message.info('该地区已添加') + return + } + if (store.state.weatherList.length >= 5) { + message.info('最多只能添加5个地区') + return + } + store.state.weatherList.push({ + id: option[2].value as number, + name: option[2].label, + data: await store.query(option[2].value as number) + }) + store.state.selectedCityCode = option[2].value as number + }} + notFoundContent="没有找到该地区" + onClick={() => { + if (store.state.cityOptions.length === 0) store.queryCity() + }} + searchValue={searchValue.value} + placeholder="搜索其他地区天气" + showSearch={{ filter }} + onSearch={(value) => { + searchValue.value = value + }} + /> + )} +
+
+
{ + store.state.selectedCityCode = -1 + }} + class={clsx( + 'flex flex-col justify-between gap-x-4 w-full h-[60px] relative py-2 px-3 rounded-lg cursor-pointer hover:bg-gradient-to-b from-[#d6ecff] to-[#dce3ff]', + store.state.selectedCityCode === -1 + ? 'bg-gradient-to-b from-[#d6ecff] to-[#dce3ff]' + : 'bg-black/[0.05]' + )} + > +
+
+ + {store.weatherData?.city.name} +
+ {store.weatherData?.base.stemp}° +
+
+
+ + {store.weatherData?.base.weather} +
+ + {store.weatherData?.base.ltemp}°/{store.weatherData?.base.htemp}° + +
+
+ {store.state.weatherList.map((item) => ( +
{ + store.state.selectedCityCode = item.id + }} + class={clsx( + 'flex flex-col group justify-between gap-x-4 w-full h-[65px] group relative py-2 px-3 rounded-lg cursor-pointer hover:bg-gradient-to-b from-[#d6ecff] to-[#dce3ff]', + store.state.selectedCityCode === item.id + ? 'bg-gradient-to-b from-[#d6ecff] to-[#dce3ff]' + : 'bg-black/[0.05]' + )} + key={item.id} + > +
+
+ {item.data?.city.name} +
+ {item.data?.base.stemp}° +
+
+
+ + {item.data?.base.weather} +
+ + {item.data?.base.ltemp}°/{item.data?.base.htemp}° + +
+ +
+ ))} +
+
+
+
+
+
+ {store.weatherData?.city.name} + {nowWeather.value?.base.stemp}° + + {nowWeather.value?.base.weather} + + {nowWeather.value?.base.ltemp}°/{nowWeather.value?.base.htemp}° + + + + + {nowWeather.value?.base.WD} {nowWeather.value?.base.WS} + +
+
+
+
+ 晨练指数: + {getPracticeIndex(nowWeather.value?.base.aqi || '0')} +
+
+ 空气质量: + {pollution(nowWeather.value?.base.pm25 || '0')} +
+
+ 穿衣指数: + {shirtIndex(nowWeather.value?.base.stemp || '0')} +
+
+ 雨伞指数: + + {nowWeather.value?.hour24.some((val) => val.weather.includes('雨')) + ? '需带伞' + : '无需带伞'} + +
+
+ 感冒指数: + {coldIndex(nowWeather.value?.base.stemp || '0')} +
{' '} +
+ 紫外线指数: + 紫外线{nowWeather.value?.base.ultraviolet} +
+
+
+
+
+ 24小时预报 +
{ + e.preventDefault() + + if (!hourRef.value) return + + hourRef.value.scrollLeft += e.deltaY + }} + > + {nowWeather.value?.hour24.map((item, idx) => ( +
+ + {item.stemp}° + {idx === 0 ? '现在' : item.hour + '时'} +
+ ))} +
+
+
+
+ 7日天气预报 +
+ {nowWeather.value?.weathers7.map((item, idx) => { + return ( +
+ + {item.ltemp + '°/' + item.htemp + '°'} + +
+ + {item.weather} +
+
+ + {dayjs(item.date, 'MM月DD日').format('MM/DD')} + + + {idx === 0 + ? '今天' + : idx === 1 + ? '明天' + : dayjs(item.date, 'MM月DD日').format('ddd')} + +
+
+ ) + })} +
+
+
+
+
+
+ ) }) diff --git a/src/widgets/weather/Small.tsx b/src/widgets/weather/Small.tsx index ef55e43..b000d32 100644 --- a/src/widgets/weather/Small.tsx +++ b/src/widgets/weather/Small.tsx @@ -1,5 +1,6 @@ import { defineComponent } from 'vue' import useWeatherStore from './useWeatherStore' +import WeatherIcon from './weatherIcon' export default defineComponent(() => { const weather = useWeatherStore() @@ -15,6 +16,7 @@ export default defineComponent(() => {
{weather.weatherData?.city.name} +
{weather.weatherData?.base.weather} diff --git a/src/widgets/weather/useWeatherStore.ts b/src/widgets/weather/useWeatherStore.ts index ef70253..0be54ec 100644 --- a/src/widgets/weather/useWeatherStore.ts +++ b/src/widgets/weather/useWeatherStore.ts @@ -19,6 +19,7 @@ type WeatherState = { selected: number selectedCityCode: number cityOptions: AntdCityOptions[] + weatherList: { id: number; data?: WeatherData; name: '' }[] } const baseWeatherUrl = 'https://i.tianqi.com/' @@ -27,7 +28,8 @@ export default defineStore('weather', () => { const state = reactive({ selected: 0, selectedCityCode: -1, - cityOptions: [] + cityOptions: [], + weatherList: [] } as WeatherState) const city = ref('') @@ -53,18 +55,40 @@ export default defineStore('weather', () => { } const fetchWeather = async (code: number) => { try { - const nowResponse = await fetch(baseWeatherUrl + '?c=mfjson' + (code ? '&id=' + code : '')) + const nowResponse = await fetch(baseWeatherUrl + '?c=mfjson' + (code !== -1 ? '&id=' + code : '')) const res = await nowResponse.json() - - weatherData.value = res + return res } catch (e) { return } } + const queryAll = () => { + state.weatherList.forEach(async item => { + item.data = await fetchWeather(item.id) + }) + } + const query = async (code: number) => { + const data = await fetchWeather(code) + return data + } watch( () => state.selectedCityCode, - (e) => { - fetchWeather(e) + async (e) => { + if (e === -1) { + const data = await fetchWeather(e) + + weatherData.value = data + } else { + + const idx = state.weatherList.findIndex((item) => item.id === e) + + if (idx === -1) { + if (!state.weatherList[idx]?.data) return + const data = await fetchWeather(e) + state.weatherList[idx].data = data + } + + } }, { immediate: true @@ -75,7 +99,9 @@ export default defineStore('weather', () => { state, city, weatherData, - queryCity + queryCity, + queryAll, + query } }, { persist: true diff --git a/src/widgets/weather/weatherIcon.tsx b/src/widgets/weather/weatherIcon.tsx new file mode 100644 index 0000000..e7ea211 --- /dev/null +++ b/src/widgets/weather/weatherIcon.tsx @@ -0,0 +1,110 @@ +import { computed, defineComponent, render } from 'vue' + +export default defineComponent({ + name: 'WeatherIcon', + props: { + weather: { + type: String, + default: '' + }, + size: { + type: Number, + default: 24 + } + }, + setup: (props, ctx) => { + const list = [ + '阴', //0 + '大雪', //1 + '暴雪', //2 + '中雪', //3 + '小雪', //4 + '雨夹雪', // 5 + '阵雪', //6 + '雪', //7 + '中雨', //8 + '小阵雨', + '雷阵雨伴有冰雹', // 10 + '阵雨', + '冻雨', + '雷阵雨', + '大雨', + '暴雨', // 15 + '大暴雨', + '特大暴雨', + '夜间小雨', + '小雨', + '晴转小雨', // 20 + '多云转晴', + '睛转多云', + '多云', + '大部份多云', + '打雷', // 25 + '冷', + '霜', + '强沙尘暴', + '沙尘暴', + '龙卷风', // 30 + '杨沙', + '雾', + '晴', + '霾', + '风', // 35 + '大风', + '飓风', + '未知天气', //38 + '多云转阴', + '晴转多云', //40 + '阴转小雨', + '多云转阴', + '轻度雾霾', //43 + '轻度雾霾转多云', //44 + '小雨转多云', //45 + '小雨转晴', + '阴转晴', + '中度雾霾', //48 + '阴转多云', + '阴到小雨', //50 + '晴转雪 ', + '多云转雨', + '风转晴', + '多云转小雪', + '雪转雨', //55 + '小雨转雨', + '多云转雪', + '小雪转多云', + '晴转阴', + '阴转中雨', //60 + '雪转多云', + '小雨转阴', //62 + '小雨转中雨', + '多云转小雨', + '小雨到大雨', //65 + '轻度雾霾转小雨', + '轻度雾霾转晴', + '小雨转雪', + '阴转雨', //69 + '中雨转阴', //70 + '中雨转小雨', //71 + '大雨转小雨' //72 + ] + const idx = computed(() => list.indexOf(props.weather || '未知天气')) + + const url = computed(() => { + return idx.value < 0 ? '/weather_img/38.png' : `/weather_img/${idx.value}.png` + }) + return () => ( + <> + weather icon + + ) + } +})