f9cb72ed06
- apps/viewer (@photo/viewer): Vite 5 + Vue 3.4 + TS 最小骨架(无 Pinia/UI 库) - router: /a/:token 活动页 + /a/:token/p/:photoId 单图深链(复用活动页组件) - i18n: vue-i18n 9,zh-CN/en 词条,localStorage(viewer.locale) 持久 + navigator.language 检测兜底 zh-CN;顶栏语言切换组件;文案全量走 i18n - api client: 类型化 fetch 封装(契约生成类型直连),错误信封 → ApiError, 错误码 → i18n key 映射表(src/api/errors.ts) - scripts: dev/build/preview/test(vitest 10 例)/test:e2e(Playwright 冒烟, webServer 自拉 dev)/lint/vue-tsc 全部接入 turbo - root: +@playwright/test、+eslint-plugin-vue(flat config 收敛到 apps/**/*.vue)、 pnpm.onlyBuiltDependencies 放行 esbuild Co-Authored-By: Claude Code <noreply@anthropic.com>
22 lines
849 B
Vue
22 lines
849 B
Vue
<script setup lang="ts">
|
|
import { computed } from 'vue';
|
|
import { useI18n } from 'vue-i18n';
|
|
import { useRoute } from 'vue-router';
|
|
|
|
// 脚手架占位页:Task 6 起替换为活动信息区 + 空态,Task 7/8 补瀑布流与大图。
|
|
// 单图深链(/a/:token/p/:photoId)复用本组件,photoId 用于定位目标照片。
|
|
const route = useRoute();
|
|
const { t } = useI18n();
|
|
|
|
const token = computed(() => String(route.params.token ?? ''));
|
|
const photoId = computed(() => (route.params.photoId !== undefined ? String(route.params.photoId) : null));
|
|
</script>
|
|
|
|
<template>
|
|
<section class="activity">
|
|
<p class="meta">{{ t('route.tokenLabel') }}: {{ token }}</p>
|
|
<p v-if="photoId !== null" class="meta">{{ t('route.photoLabel') }}: {{ photoId }}</p>
|
|
<p class="empty-notice">{{ t('album.emptyNotice') }}</p>
|
|
</section>
|
|
</template>
|