Merge branch 'preview' into realtime

This commit is contained in:
ccbikai 2025-05-11 18:58:02 +08:00
commit 7291beafea
3 changed files with 57 additions and 21 deletions

View file

@ -18,9 +18,9 @@ const route = useRoute()
<TabsTrigger value="/dashboard/analysis"> <TabsTrigger value="/dashboard/analysis">
{{ $t('nav.analysis') }} {{ $t('nav.analysis') }}
</TabsTrigger> </TabsTrigger>
<TabsTrigger value="/dashboard/realtime"> <!-- <TabsTrigger value="/dashboard/realtime">
{{ $t('nav.realtime') }} {{ $t('nav.realtime') }}
</TabsTrigger> </TabsTrigger> -->
</TabsList> </TabsList>
</Tabs> </Tabs>
<slot name="left" /> <slot name="left" />

View file

@ -3,7 +3,6 @@ import { scaleSequentialSqrt } from 'd3-scale'
import { interpolateYlOrRd } from 'd3-scale-chromatic' import { interpolateYlOrRd } from 'd3-scale-chromatic'
import Globe from 'globe.gl' import Globe from 'globe.gl'
import { debounce } from 'lodash-es' import { debounce } from 'lodash-es'
import data from './data.json'
const countries = ref({}) const countries = ref({})
@ -14,14 +13,14 @@ async function getWorldMapJSON() {
const liveSessionLocations = computed(() => { const liveSessionLocations = computed(() => {
const map = new Map() const map = new Map()
data.forEach((item) => { // data.forEach((item) => {
if (!item.country) // if (!item.country)
return // return
if (!map.has(item.country)) // if (!map.has(item.country))
map.set(item.country, { lat: 37.75100, lon: -122.4194, count: 1 }) // map.set(item.country, { lat: 37.75100, lon: -122.4194, count: 1 })
map.get(item.country).count += 1 // map.get(item.country).count += 1
}) // })
return Array.from(map.values()) return Array.from(map.values())
}) })

View file

@ -36,27 +36,59 @@ export const blobsMap = {
blob15: 'deviceType', blob15: 'deviceType',
} as const } as const
export const doublesMap = {
double1: 'latitude',
double2: 'longitude',
} as const
export type BlobsMap = typeof blobsMap export type BlobsMap = typeof blobsMap
export type BlobsKey = keyof BlobsMap export type BlobsKey = keyof BlobsMap
export type LogsKey = BlobsMap[BlobsKey]
export type LogsMap = { [key in LogsKey]: string | undefined }
export const logsMap: LogsMap = Object.entries(blobsMap).reduce((acc, [k, v]) => ({ ...acc, [v]: k }), {}) as LogsMap export type DoublesMap = typeof doublesMap
export type DoublesKey = keyof DoublesMap
export type LogsKey = BlobsMap[BlobsKey] | DoublesMap[DoublesKey]
export type LogsMap = {
[key in BlobsMap[BlobsKey]]: string | undefined
} & {
[key in DoublesMap[DoublesKey]]?: number | undefined
}
export const logsMap = {
...Object.entries(blobsMap).reduce((acc, [k, v]) => ({ ...acc, [v]: k }), {}),
...Object.entries(doublesMap).reduce((acc, [k, v]) => ({ ...acc, [v]: k }), {}),
} as LogsMap
export function logs2blobs(logs: LogsMap) { export function logs2blobs(logs: LogsMap) {
// @ts-expect-error todo return (Object.keys(blobsMap) as BlobsKey[])
return Object.keys(blobsMap).sort((a, b) => toBlobNumber(a) - toBlobNumber(b)).map(key => logs[blobsMap[key]] || '') .sort((a, b) => toBlobNumber(a) - toBlobNumber(b))
.map(key => String(logs[blobsMap[key] as LogsKey] || ''))
} }
export function blobs2logs(blobs: string[]) { export function blobs2logs(blobs: string[]) {
const logsList = Object.keys(blobsMap) const logsList = Object.keys(blobsMap)
// @ts-expect-error todo return blobs.reduce((logs, blob, i) => {
return blobs.reduce((logs: LogsMap, blob, i) => { const key = blobsMap[logsList[i] as BlobsKey]
// @ts-expect-error todo logs[key] = blob
logs[blobsMap[logsList[i]]] = blob
return logs return logs
}, {}) as LogsMap }, {} as Partial<LogsMap>)
}
export function logs2doubles(logs: LogsMap) {
return (Object.keys(doublesMap) as DoublesKey[])
.sort((a, b) => toBlobNumber(a) - toBlobNumber(b))
.map(key => Number(logs[doublesMap[key] as LogsKey] || 0))
}
export function doubles2logs(doubles: number[]) {
const logsList = Object.keys(doublesMap)
return doubles.reduce((logs, double, i) => {
const key = doublesMap[logsList[i] as DoublesKey]
logs[key] = double
return logs
}, {} as Partial<LogsMap>)
} }
export function useAccessLog(event: H3Event) { export function useAccessLog(event: H3Event) {
@ -108,16 +140,21 @@ export function useAccessLog(event: H3Event) {
browserType: uaInfo?.browser?.type, browserType: uaInfo?.browser?.type,
device: uaInfo?.device?.model, device: uaInfo?.device?.model,
deviceType: uaInfo?.device?.type, deviceType: uaInfo?.device?.type,
// For RealTime Globe
latitude: Number(cf?.latitude || getHeader(event, 'cf-iplatitude') || 0),
longitude: Number(cf?.longitude || getHeader(event, 'cf-iplongitude') || 0),
} }
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
return hubAnalytics().put({ return hubAnalytics().put({
indexes: [link.id], // only one index indexes: [link.id], // only one index
blobs: logs2blobs(accessLogs), blobs: logs2blobs(accessLogs),
doubles: logs2doubles(accessLogs),
}) })
} }
else { else {
console.log('access logs:', logs2blobs(accessLogs), blobs2logs(logs2blobs(accessLogs))) console.log('access logs:', accessLogs, logs2blobs(accessLogs), logs2doubles(accessLogs), { ...blobs2logs(logs2blobs(accessLogs)), ...doubles2logs(logs2doubles(accessLogs)) })
return Promise.resolve() return Promise.resolve()
} }
} }