# CLAUDE.md - weather-data-ui This file provides guidance to Claude Code when working in the weather-data-ui module. ## Purpose Vue 3 + TypeScript frontend for the weather data management system. Single-page application built with Vite 5. ## Tech Stack - Vue 3.5 (Composition API), TypeScript 5.7, Vite 5.4 - Element Plus 2.10 (UI library) - Pinia 2.3 (state management) - Vue Router 4.2 (hash mode routing) - ECharts 5 + vue-echarts 6 (charts) - Axios 1.11 (HTTP client) - Less/Sass for styling ## Build Commands ```bash npm install npm run dev # dev server on port 8001, hot reload, proxies /api to backend npm run build # production build (vite build --mode production), outputs to dist/ npm run lint # ESLint on src/**/*.{vue,ts} with --fix npm run serve # build + vite preview ``` ## Project Structure ``` src/ ├── main.ts # App bootstrap, Pinia init ├── App.vue # Root component ├── assets/ # Static assets (css, icons, images, theme) ├── components/ # Reusable components │ ├── alert-marquee/ # Alert scrolling marquee (SSE-driven) │ ├── base/ # Base table/form/dialog wrappers │ ├── sys-dept-tree/ # Department tree selector │ ├── sys-radio-group/ # Radio group with dict-driven options │ ├── sys-region-tree/ # Region tree selector │ ├── sys-select/ # Dict-driven select dropdown │ └── wang-editor/ # Rich text editor wrapper ├── composables/ # Vue 3 composables │ ├── useAlertMarquee.ts # SSE alert streaming logic │ ├── useFloatingDrag.ts # Draggable floating panel logic │ ├── useWeatherChart.ts # ECharts chart configuration │ ├── useWeatherConstants.ts # Weather domain constants │ ├── useWeatherExport.ts # Export to Excel/PDF │ ├── useWeatherFilter.ts # Query filter state management │ └── useWeatherStats.ts # Statistical computation ├── constants/ # Application constants │ ├── app.ts # API base URL, request timeout │ ├── cacheKey.ts # Cache key enums │ ├── config.ts # App config │ └── enum.ts # Enums (EMitt events, etc.) ├── hooks/ # Legacy hooks │ └── useView.ts # View loader for dynamic routes ├── layout/ # Layout components │ ├── index.vue # Main layout with sidebar + header │ ├── layout.vue # Alternative layout │ ├── fullscreen-layout.vue # Fullscreen page layout │ ├── header/ # Top header bar │ ├── sidebar/ # Left sidebar navigation │ └── view/ # Content view wrapper (tabs) ├── router/ │ ├── index.ts # Router instance + dynamic route registration │ └── base.ts # Static base routes (login, home, error, iframe) ├── service/ │ └── baseService.ts # HTTP helpers: get/post/put/delete/upload ├── store/ │ ├── index.ts # useAppStore (user, permissions, menus, routes, tabs) │ └── importTasks.ts # Import task progress store ├── types/ # TypeScript type definitions ├── utils/ │ ├── cache.ts # Cookie/localStorage cache helpers (token storage) │ ├── chartBuilder.ts # ECharts option builder │ ├── emits.ts # Event bus (mitt) │ ├── exportReport.ts # PDF/Excel export utilities │ ├── http.ts # Axios instance with interceptors │ ├── router.ts # Route merging and registration helpers │ ├── theme.ts # Theme switching logic │ └── utils.ts # General utility functions └── views/ # Feature views ├── dailyweather/ # Daily weather data query/import/charts ├── home.vue # Dashboard home page ├── iframe.vue # Iframe wrapper for external pages ├── job/ # Scheduled job management ├── login.vue # Login page ├── oss/ # Cloud file storage management ├── region/ # Region management ├── station/ # Weather station management ├── sys/ # System management (users, roles, menus, depts, dicts, alerts) ├── tools/ # Utility tools └── weather/ # Weather data views ``` ## Router Architecture - **Mode**: `createWebHashHistory()` (hash mode) - **Dynamic routing**: On login, `useAppStore.initApp()` fetches `/sys/menu/nav` (menu tree), `/sys/menu/permissions` (perms), `/sys/user/info` (user), `/sys/dict/type/all` (dicts). Menu data is merged with `src/views/**/*.vue` component map via `mergeServerRoute()` to build the full route table. - **Auto-registration**: `registerDynamicToRouterAndNext()` can register a new route at runtime by matching path to a view component file. - **Tab tracking**: Router `beforeEach` guard emits tab push events; tabs are tracked in store state. - **404 fallback**: Unmatched routes redirect to `/error` with `to=404` query param. ## State Management (Pinia) `useAppStore` holds all application state: - `appIsLogin`, `appIsReady`, `appIsRender` -- lifecycle flags - `permissions[]` -- user permission set (strings) - `user` -- current user object - `dicts[]` -- dictionary data array - `routes[]` -- resolved route records - `routeToMeta` -- path-to-metadata mapping for tab titles - `tabs[]`, `activeTabName`, `closedTabs` -- tab management `initApp()` is called once on login -- returns merged routes that are then registered with the router. ## HTTP Layer `utils/http.ts` creates an Axios instance: - **Request interceptor**: Injects `token` header from cache, adds `_t` timestamp to GET requests, handles form-urlencoded serialization - **Response interceptor**: `code === 0` means success; `code === 401` triggers redirect to `/login`; other codes show ElMessage error `service/baseService.ts` wraps HTTP methods: - `get(path, params, headers)` -- adds cache-busting `_t` - `post(path, body, headers)` -- JSON content-type - `put(path, params, headers)` -- JSON content-type - `delete(path, params)` -- sends body - `upload(path, formData, headers)` -- multipart form upload ## SSE Alert Integration `composables/useAlertMarquee.ts` manages SSE connection lifecycle. It connects to the backend SSE endpoint and dispatches `alert`, `alert-withdrawn`, and `alert-deleted` events to the `alert-marquee` component for real-time notification display. ## Environment Variables - `VITE_APP_API`: Backend API base URL (injected into `constants/app.ts` at build time) - `.env.development` / `.env.production`: Environment-specific configs ## Key Dependencies - `@vueuse/core`: Vue composition utilities - `mitt`: Lightweight event emitter - `nprogress`: Page load progress bar - `html2canvas` + `jspdf`: Client-side PDF export - `js-cookie`: Cookie management (token storage) - `qs`: Query string parsing/serialization