fix bugs
Some checks are pending
Test / build (lts/*, ubuntu-latest) (push) Waiting to run
Test / build (lts/*, windows-latest) (push) Waiting to run

This commit is contained in:
Dustella 2025-02-21 14:25:27 +08:00
parent 94746d9a85
commit 27e35c3665
Signed by: Dustella
GPG Key ID: 35AA0AA3DC402D5C
13 changed files with 373 additions and 146 deletions

2
components.d.ts vendored
View File

@ -104,7 +104,7 @@ declare module 'vue' {
MenubarSubContent: typeof import('./src/components/ui/menubar/MenubarSubContent.vue')['default']
MenubarSubTrigger: typeof import('./src/components/ui/menubar/MenubarSubTrigger.vue')['default']
MenubarTrigger: typeof import('./src/components/ui/menubar/MenubarTrigger.vue')['default']
Month_power_wave_plot: typeof import('./src/components/dense/saber/month_power_wave_plot.vue')['default']
Month_year_power_wave_plot: typeof import('./src/components/dense/saber/month_year_power_wave_plot.vue')['default']
NavigationMenu: typeof import('./src/components/ui/navigation-menu/NavigationMenu.vue')['default']
NavigationMenuContent: typeof import('./src/components/ui/navigation-menu/NavigationMenuContent.vue')['default']
NavigationMenuIndicator: typeof import('./src/components/ui/navigation-menu/NavigationMenuIndicator.vue')['default']

View File

@ -85,7 +85,7 @@ function download() {
</ParamsCard>
</ResizablePanel>
<ResizableHandle id="demo-handle-1" />
<ResizablePanel id="demo-panel-2" :default-size="500">
<ResizablePanel id="demo-panel-2" :default-size="350">
<ImageContainer v-slot="metadata" :image-result="imageResult">
<slot name="extra-meta" :metadata="metadata.metadata" />
</ImageContainer>

View File

@ -43,12 +43,12 @@ const queryUrl = computed(() => {
query.set('model_name', mode)
query.set('wind_type', windType)
query.set('H', (selectedH.value * 1000).toString())
query.set('mode', selectedDateType.value)
query.set('mode', props.isDay ? 'day' : selectedDateType.value)
if (props.isDay) {
const queryDay = `${selectedDate.value.slice(0, 4)}-${selectedDate.value.slice(4, 6)}-${selectedDate.value.slice(6, 8)}`
query.set('day', queryDay)
}
if (selectedDateType.value === 'month') {
if (!props.isDay && selectedDateType.value === 'month') {
query.set('month', selectedMonth.value)
}
// const query = `?station=${station}&year=${year}&model_name=${mode}&wind_type=${windType}&H=${selectedH.value}`
@ -85,11 +85,16 @@ onMounted(async () => {
})
paths.value = data
if (props.isDay) {
selectedDate.value = Array.from(dates.value).filter(
d => d.startsWith(`${selectedYear.value}${selectedMonth.value.padStart(2, '0')}`),
)[0]
}
})
watch(selectedYear, (newV) => {
watch([selectedYear, selectedMonth], () => {
selectedDate.value = Array.from(dates.value).filter(
d => d.startsWith(newV),
d => d.startsWith(`${selectedYear.value}${selectedMonth.value.padStart(2, '0')}`),
)[0]
})
</script>
@ -179,26 +184,7 @@ watch(selectedYear, (newV) => {
</SelectGroup>
</SelectContent>
</Select>
<div v-if="selectedDateType === 'day'">
<Label>日期</Label>
<Select v-model="selectedDate">
<SelectTrigger>
<SelectValue placeholder="Select a fruit" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel></SelectLabel>
<SelectItem
v-for="date in Array.from(dates).filter(
(d) => d.startsWith(selectedYear),
)" :key="date" :value="date"
>
{{ date }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</div>
<div v-if="selectedDateType === 'month'">
<Label>月份</Label>
<Select v-model="selectedMonth">
@ -219,6 +205,26 @@ watch(selectedYear, (newV) => {
</SelectContent>
</Select>
</div>
<div v-if="props.isDay ">
<Label>日期</Label>
<Select v-model="selectedDate">
<SelectTrigger>
<SelectValue placeholder="Select a fruit" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel></SelectLabel>
<SelectItem
v-for="date in Array.from(dates).filter(
(d) => d.startsWith(`${selectedYear}${selectedMonth.padStart(2, '0')}`),
)" :key="date" :value="date"
>
{{ date }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</div>
</div>
</div>
</Denseframework>

View File

@ -22,10 +22,28 @@ const lat_ranges = [
'50,60',
]
const lon_ranges = [
'0 ~ 24',
'24 ~ 48',
'48 ~ 72',
'72 ~ 96',
'96 ~ 120',
'120 ~ 144',
'144 ~ 168',
'168 ~ 192',
'192 ~ 216',
'216 ~ 240',
'240 ~ 264',
'264 ~ 288',
'288 ~ 312',
'312 ~ 336',
'336 ~ 360',
]
const selected = reactive({
path: '',
day: '',
cycle_no: 1,
cycle_no: '1',
lat_range: '0,10',
})
@ -105,14 +123,31 @@ watch(() => selected.path, async () => {
</SelectGroup>
</SelectContent>
</Select>
<Label for="age">Cycle No.</Label>
<NumberField id="age" v-model:model-value="selected.cycle_no" :default-value="1" :min="0">
<Label for="age">纬度范围</Label>
<Select v-model="selected.cycle_no">
<SelectTrigger>
<SelectValue placeholder="选择纬度范围" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>纬度范围</SelectLabel>
<SelectItem v-for="i in 15" :key="i" :value="i.toString()">
{{ lon_ranges[i - 1] }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
<!-- <NumberField
id="age"
v-model:model-value="selected.cycle_no"
:default-value="1" :min="0"
>
<NumberFieldContent>
<NumberFieldDecrement />
<NumberFieldInput />
<NumberFieldIncrement />
</NumberFieldContent>
</NumberField>
</NumberField> -->
</div>
</div>
</DenseFramework>

View File

@ -16,7 +16,7 @@ import { currentSaberDays, parseDayOfYear, refreshCurrentSaberDays, refreshPath,
const selected = reactive({
path: './saber/data/2012/SABER_Temp_O3_April2012_v2.0.nc',
day: '',
cycle_no: 1,
cycle_no: '1',
lat_range: '0,10',
})
@ -29,6 +29,24 @@ const lat_ranges = [
'50,60',
]
const lon_ranges = [
'0 ~ 24',
'24 ~ 48',
'48 ~ 72',
'72 ~ 96',
'96 ~ 120',
'120 ~ 144',
'144 ~ 168',
'168 ~ 192',
'192 ~ 216',
'216 ~ 240',
'240 ~ 264',
'264 ~ 288',
'288 ~ 312',
'312 ~ 336',
'336 ~ 360',
]
const urll = computed(() => {
// const path = encodeURIComponent(selected.path)
// const day = encodeURIComponent(selected.day)
@ -105,14 +123,20 @@ watch(() => selected.path, async () => {
</SelectGroup>
</SelectContent>
</Select>
<Label for="age">Cycle No.</Label>
<NumberField id="age" v-model:model-value="selected.cycle_no" :default-value="1" :min="0">
<NumberFieldContent>
<NumberFieldDecrement />
<NumberFieldInput />
<NumberFieldIncrement />
</NumberFieldContent>
</NumberField>
<Label for="age">纬度范围</Label>
<Select v-model="selected.cycle_no">
<SelectTrigger>
<SelectValue placeholder="选择纬度范围" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>纬度范围</SelectLabel>
<SelectItem v-for="i in 15" :key="i" :value="i.toString()">
{{ lon_ranges[i - 1] }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</div>
</div>
</DenseFramework>

View File

@ -1,82 +0,0 @@
<route lang="json">
{
"meta": {
"title": "Saber月周期功率波图",
"description": "Saber月周期功率波图",
"group": "Saber",
"item_name": "月周期功率波图"
}
}
</route>
<script setup lang="ts">
import { API_BASE_URL } from '~/CONSTANT'
import { refreshPath, renderPath, saberPaths } from './utils'
const lat_ranges = [
'0,10',
'10,20',
'20,30',
'30,40',
'40,50',
'50,60',
]
const selected = reactive({
path: '',
lat_range: '0,10',
})
const urll = computed(() => {
const query = new URLSearchParams()
query.set('path', selected.path)
query.set('lat_range', selected.lat_range)
return `${API_BASE_URL}/saber/render/gravity_wave/per_month/power_wave_plot?${query}`
})
onMounted(async () => {
await refreshPath()
selected.path = saberPaths.value[0]
})
</script>
<template>
<DenseFramework :image-query="urll">
<div>
<div flex="~ col items-stretch gap-3" py-3>
<Label>纬度带</Label>
<Select v-model="selected.lat_range">
<SelectTrigger>
<SelectValue placeholder="选择纬度带" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>纬度带</SelectLabel>
<SelectItem v-for="lat_range in lat_ranges" :key="lat_range" :value="lat_range">
{{ lat_range.replace(",", " ~ ") }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
<Label for="day">年月</Label>
<Select v-model="selected.path">
<SelectTrigger>
<SelectValue placeholder="选择日期" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>月份</SelectLabel>
<SelectItem v-for="path in saberPaths.sort((a, b) => renderPath(a).localeCompare(renderPath(b)))" :key="path" :value="path">
{{ renderPath(path) }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</div>
</div>
</DenseFramework>
</template>
<style scoped>
</style>

View File

@ -0,0 +1,145 @@
<route lang="json">
{
"meta": {
"title": "Saber月周期功率波图",
"description": "Saber月周期功率波图",
"group": "Saber",
"item_name": "月周期功率波图"
}
}
</route>
<script setup lang="ts">
import { API_BASE_URL } from '~/CONSTANT'
import { refreshPath, renderPath, saberPaths } from './utils'
const currentMode = ref('月统计图')
const allYears = ref([] as string[])
const lat_ranges = [
'-60,-50',
'-50,-40',
'-40,-30',
'-30,-20',
'-20,-10',
'-10,0',
'0,10',
'10,20',
'20,30',
'30,40',
'40,50',
'50,60',
]
const selected = reactive({
path: '',
lat_range: '0,10',
year: '',
})
const urll = computed(() => {
if (currentMode.value === '月统计图') {
const query = new URLSearchParams()
query.set('path', selected.path)
query.set('lat_range', selected.lat_range)
return `${API_BASE_URL}/saber/render/gravity_wave/per_month/power_wave_plot?${query}`
}
else {
const query = new URLSearchParams()
query.set('year', selected.year)
query.set('lat_range', selected.lat_range)
return `${API_BASE_URL}/saber/render/gravity_wave/per_year/power_wave_plot?${query}`
}
})
onMounted(async () => {
await refreshPath()
selected.path = saberPaths.value[0]
// traverse all paths to get all years,
// in each item, str is like ../data/saber/2017/SABER_Temp_O3_June2017_v2.0.nc
const years = Array.from(new Set(saberPaths.value.map((str: string) => str.match(/(\d{4})/)?.[1])))
allYears.value = years.filter(year => year !== null).map(year => year!)
selected.year = allYears.value[0]
})
</script>
<template>
<DenseFramework :image-query="urll">
<div>
<Label>模式</Label>
<Tabs v-model="currentMode">
<TabsList class="grid grid-cols-2 w-full">
<TabsTrigger value="月统计图">
月统计图
</TabsTrigger>
<TabsTrigger value="年统计图">
年统计图
</TabsTrigger>
</TabsList>
</Tabs>
<div v-if="currentMode === '月统计图'" flex="~ col items-stretch gap-3" py-3>
<Label for="day">年月</Label>
<Select v-model="selected.path">
<SelectTrigger>
<SelectValue placeholder="选择日期" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>月份</SelectLabel>
<SelectItem v-for="path in saberPaths.sort((a, b) => renderPath(a).localeCompare(renderPath(b)))" :key="path" :value="path">
{{ renderPath(path) }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
<Label>纬度带</Label>
<Select v-model="selected.lat_range">
<SelectTrigger>
<SelectValue placeholder="选择纬度带" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>纬度带</SelectLabel>
<SelectItem v-for="lat_range in lat_ranges" :key="lat_range" :value="lat_range">
{{ lat_range.replace(",", " ~ ") }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</div>
<div v-else class="flex flex-col gap-3 py-2">
<Label>年份</Label>
<Select v-model="selected.year">
<SelectTrigger>
<SelectValue placeholder="选择年份" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>年份</SelectLabel>
<SelectItem v-for="year in allYears" :key="year" :value="year">
{{ year }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
<Label>纬度带</Label>
<Select v-model="selected.lat_range">
<SelectTrigger>
<SelectValue placeholder="选择纬度带" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>纬度带</SelectLabel>
<SelectItem v-for="lat_range in lat_ranges" :key="lat_range" :value="lat_range">
{{ lat_range.replace(",", " ~ ") }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</div>
</div>
</DenseFramework>
</template>
<style scoped>
</style>

View File

@ -108,14 +108,7 @@ async function customHandle(resp: Response) {
<span v-for="(v, k) in metadata" :key="k">{{ k }}: {{ v }}</span>
</div>
</template>
<Label>选择模式</Label>
<Tabs v-model="selected.selectedMode" default-value="观测的二阶多项式拟合">
<TabsList class="grid grid-cols-1 w-full">
<TabsTrigger v-for="m in modes" :key="m" :value="m">
{{ m }}
</TabsTrigger>
</TabsList>
</Tabs>
<Label>选择台站</Label>
<Select v-model="selected.station">
<SelectTrigger>
@ -144,6 +137,14 @@ async function customHandle(resp: Response) {
</SelectGroup>
</SelectContent>
</Select>
<Label>选择模式</Label>
<Tabs v-model="selected.selectedMode" default-value="观测的二阶多项式拟合">
<TabsList class="grid grid-cols-1 w-full">
<TabsTrigger v-for="m in modes" :key="m" :value="m">
{{ m }}
</TabsTrigger>
</TabsList>
</Tabs>
</DenseFramework>
</template>

View File

@ -10,12 +10,29 @@ meta:
import { API_BASE_URL } from '~/CONSTANT'
const selectedMode = ref('w/f值统计结果')
const selectedStation = ref('LIN')
const allStations = ref([] as string[])
const isIllegal = ref(false)
const startYear = ref(2017)
const endYear = ref(2024)
onMounted(async () => {
await baseFetch<string []>(`${API_BASE_URL}/balloon/metadata`).json().then(({ data }) => {
const das = data.value!
const _allStations = das.map((a: string) => {
const stationPattern = /data\/balloon\/(\w+)\//
return a.match(stationPattern)?.[1]
}) as string[]
const stations = Array.from(new Set(_allStations))
allStations.value = stations
selectedStation.value = stations[0]
})
})
const modes = [
'w/f值统计结果',
@ -70,26 +87,22 @@ watch([selectedMode, startYear, endYear], () => {
<DenseFramework :image-query="queryUrl">
<div flex="col gap-5 ~ justify-center">
<div>
<Label>统计参数</Label>
<Select v-model="selectedMode">
<Label>选择台站</Label>
<Select v-model="selectedStation">
<SelectTrigger>
<SelectValue placeholder="Select a fruit" />
<SelectValue placeholder="选择台站" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>模式</SelectLabel>
<SelectItem
v-for="mode in Array.from(modes).sort(((a, b) => {
return mode_display_mapping[a].length - mode_display_mapping[b].length
}))"
:key="mode" :value="mode"
>
{{ mode_display_mapping[mode] }}
<SelectLabel>台站</SelectLabel>
<SelectItem v-for="s in allStations" :key="s" :value="s">
{{ s }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</div>
<NumberField
id="start"
v-model:model-value="startYear" :format-options="{
@ -118,6 +131,27 @@ watch([selectedMode, startYear, endYear], () => {
<NumberFieldIncrement />
</NumberFieldContent>
</NumberField>
<div>
<Label>统计参数</Label>
<Select v-model="selectedMode">
<SelectTrigger>
<SelectValue placeholder="Select a fruit" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>模式</SelectLabel>
<SelectItem
v-for="mode in Array.from(modes).sort(((a, b) => {
return mode_display_mapping[a].length - mode_display_mapping[b].length
}))"
:key="mode" :value="mode"
>
{{ mode_display_mapping[mode] }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</div>
</div>
</DenseFramework>
</template>

View File

@ -33,10 +33,26 @@ const df = new DateFormatter('zh-CN', {
dateStyle: 'long',
})
const lat_ranges = [
'-60 ~ -50',
'-50 ~ -40',
'-40 ~ -30',
'-30 ~ -20',
'-20 ~ -10',
'-10 ~ 0',
'0 ~ 10',
'10 ~ 20',
'20 ~ 30',
'30 ~ 40',
'40 ~ 50',
'50 ~ 60',
]
const selected = reactive({
year: '2008',
day: '1',
mode: 'mean_ktemp_Nz',
lat_range: '0 ~ 10',
})
const value = ref<DateValue>(
@ -52,13 +68,14 @@ const queryUrl = computed(() => {
const day_No = getDayOfYear(theDate)
query.set('day', day_No.toString())
query.set('mode', selected.mode)
query.set('lat_range', selected.lat_range)
return `/cosmic/render/gravity_wave/perday?${query}`
})
</script>
<template>
<DenseFramework :image-query="queryUrl">
<Label>模式</Label>
<Label>统计参数</Label>
<Tabs v-model:model-value="selected.mode">
<TabsList class="grid grid-cols-1 w-full">
<TabsTrigger value="mean_ktemp_Nz">
@ -102,6 +119,20 @@ const queryUrl = computed(() => {
<Calendar v-model="value " initial-focus />
</PopoverContent>
</Popover>
<Label>纬度带</Label>
<Select v-model="selected.lat_range">
<SelectTrigger>
<SelectValue placeholder="选择纬度带" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>纬度带</SelectLabel>
<SelectItem v-for="lat_range in lat_ranges" :key="lat_range" :value="lat_range">
{{ lat_range }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</DenseFramework>
</template>

View File

@ -22,18 +22,35 @@ const MODES = [
'不同高度下的逐日统计分析',
'每月浮力频率变化趋势',
'每月平均重力势能的折线图',
'布伦特-维萨拉频率分布',
'浮力频率均值',
'每月平均N^2的折线图',
]
const lat_ranges = [
'-60 ~ -50',
'-50 ~ -40',
'-40 ~ -30',
'-30 ~ -20',
'-20 ~ -10',
'-10 ~ 0',
'0 ~ 10',
'10 ~ 20',
'20 ~ 30',
'30 ~ 40',
'40 ~ 50',
'50 ~ 60',
]
const selected = reactive({
year: '2008',
// begin_day
mode: '不同高度下的逐日统计分析',
lat_range: '0 ~ 10',
})
const queryUrl = computed(() => {
const q = new URLSearchParams()
q.set('year', selected.year)
q.set('mode', selected.mode)
q.set('lat_range', selected.lat_range)
return `${API_BASE_URL}/cosmic/render/gravity_wave/multiday?${q}`
})
</script>
@ -54,7 +71,7 @@ const queryUrl = computed(() => {
</SelectGroup>
</SelectContent>
</Select>
<Label>模式</Label>
<Label>统计参数</Label>
<Tabs v-model="selected.mode">
<TabsList class="grid grid-cols-1 w-full">
<TabsTrigger v-for="mode in MODES" :key="mode" :value="mode">
@ -62,6 +79,20 @@ const queryUrl = computed(() => {
</TabsTrigger>
</TabsList>
</Tabs>
<Label>纬度带</Label>
<Select v-model="selected.lat_range">
<SelectTrigger>
<SelectValue placeholder="选择纬度带" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>纬度带</SelectLabel>
<SelectItem v-for="lat_range in lat_ranges" :key="lat_range" :value="lat_range">
{{ lat_range }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</DenseFramework>
</template>

View File

@ -7,5 +7,5 @@
</route>
<template>
<Month_power_wave_plot />
<Month_year_power_wave_plot />
</template>

View File

@ -21,8 +21,9 @@ const selected = reactive({
})
const ranges = [
'-20',
'-30',
'30',
'-60',
'60',
]
@ -30,6 +31,7 @@ const queryUrl = computed(() => {
const q = new URLSearchParams()
q.set('year', selected.year)
q.set('T', selected.T.toString())
q.set('k', selected.k.toString())
return `${API_BASE_URL}/saber/render/planet_wave/per_year/energy_plot?${q}`
})
</script>
@ -74,7 +76,7 @@ const queryUrl = computed(() => {
}" :default-value="94"
:step="20"
:max="110"
:min="70"
:min="30"
>
<NumberFieldContent>
<NumberFieldDecrement />