blob: 4088589e49ebcefb1076b59dc2f9fbf09dd46334 [file] [view]
# TSFile Viewer
A web-based application for viewing and analyzing Apache TsFile format data. Built with Vue 3 and Spring Boot 4.
[中文文档](README.zh-CN.md) | [English](README.md)
## Features
- **File Management**: Browse server directories and upload TSFile files
- **Metadata Viewing**: Display comprehensive TSFile metadata including schema, devices, measurements, and statistics
- **Data Preview**: Paginated data tables with advanced filtering (time range, devices, measurements, value range)
- **Data Visualization**: Interactive charts using ECharts 6 with multi-series overlay, aggregation, and drill-down
- **Tree & Table Models**: Support for both Tree Model (path-based) and Table Model (relational) TSFile formats
- **Export**: Export filtered data as CSV or JSON, export charts as PNG or SVG
- **Performance**: Chunk-level reading, metadata caching, automatic downsampling for large datasets
- **Deployment Flexibility**: Support for both embedded (single JAR) and separate (frontend + backend) deployment
## Technology Stack
### Backend
- Spring Boot 4.0.1 with JDK 21
- Apache TSFile 2.2.0
- Caffeine cache for metadata and reader caching
- Maven 3.9+
### Frontend
- Vue 3.5.x with Composition API
- Vite 8.x build tool
- Nuxt UI components (Tailwind CSS-based)
- Pinia 2.x state management
- ECharts 6.0.x for visualization
- TypeScript 5.4.x+
## Quick Start
### Prerequisites
- JDK 17 or 21 (LTS)
- Maven 3.9+
- Node.js ^20.19.0 || >=22.12.0
- pnpm package manager
### Development Mode
1. **Start Backend:**
```bash
cd backend
mvn spring-boot:run
```
Backend will run at `http://localhost:8080`
2. **Start Frontend:**
```bash
cd frontend
pnpm install
pnpm dev
```
Frontend will run at `http://localhost:5173`
3. **Access Application:**
Open `http://localhost:5173/view/` in your browser
### Production Build
#### Embedded Deployment (Single JAR)
```bash
# Linux/Mac
./build-embedded.sh
# Windows
build-embedded.bat
# Run
java -jar backend/target/tsfile-viewer-*.jar
```
Access at `http://localhost:8080/view/`
#### Separate Deployment
```bash
# Linux/Mac
./build-separate.sh
# Windows
build-separate.bat
```
See [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md) for detailed deployment instructions.
## Configuration
### Backend Configuration
Edit `backend/src/main/resources/application.yml`:
```yaml
tsfile:
# Whitelist of allowed directories
allowed-directories:
- /data/tsfiles
- /uploads/tsfiles
# Upload directory
upload-directory: /uploads/tsfiles
# Cache settings
cache:
metadata:
max-size: 1000
ttl-minutes: 60
reader:
max-size: 100
ttl-minutes: 30
```
### Frontend Configuration
Create `frontend/.env.production`:
```env
# API base URL (default/recommended for reverse proxy)
VITE_API_BASE_URL=/api
```
## Project Structure
```
tsfile-viewer/
├── backend/ # Spring Boot Maven project
│ ├── src/main/java/
│ │ └── com/timecho/tsfile/viewer/
│ │ ├── controller/ # REST API endpoints
│ │ ├── service/ # Business logic
│ │ ├── tsfile/ # TSFile parsing utilities
│ │ ├── config/ # Spring configuration
│ │ └── dto/ # Data transfer objects
│ └── pom.xml
├── frontend/ # Vue 3 + Vite SPA
│ ├── src/
│ │ ├── views/ # Page components
│ │ ├── components/ # Reusable components
│ │ ├── stores/ # Pinia state management
│ │ ├── api/ # API client
│ │ └── composables/ # Vue composables
│ └── package.json
├── tsfile-source/ # TSFile v2.2.0 source (reference)
├── build-embedded.sh # Embedded deployment build script
├── build-separate.sh # Separate deployment build script
├── docs/ # Project documentation
│ ├── DEPLOYMENT.md # Deployment guide
│ ├── API.md # API documentation
│ └── ...
└── README.md
```
## Usage
### 1. File Selection
- Browse server directories using the file tree
- Upload local TSFile files (drag-drop or click to browse)
- Access recently viewed files from the recent files list
### 2. Metadata Viewing
- View basic information: version, time range, device/measurement counts
- Toggle between Tree Model and Table Model views
- Explore measurements with data types, encoding, and compression
- Browse RowGroups and Chunks with detailed statistics
### 3. Data Preview
- Apply filters: time range, devices, measurements, value range
- Navigate paginated data with sortable columns
- Export filtered data as CSV or JSON
### 4. Data Visualization
- Select measurements for multi-series charts
- Apply aggregation functions (min, max, avg, count)
- Zoom and pan with DataZoom controls
- Click data points for drill-down details
- Export charts as PNG or SVG
## API Endpoints
- `GET /api/files/tree` - Browse file tree
- `POST /api/files/upload` - Upload TSFile
- `GET /api/meta/{fileId}` - Get metadata
- `POST /api/data/preview` - Preview data with filters
- `POST /api/data/query` - Query chart data with aggregation
See API documentation at `/swagger-ui.html` (if enabled)
## Development
### Backend
```bash
cd backend
# Run tests
mvn test
# Format code
mvn spotless:apply
# Check formatting
mvn spotless:check
# Build
mvn clean package
```
### Frontend
```bash
cd frontend
# Install dependencies
pnpm install
# Run dev server
pnpm dev
# Build for production
pnpm build
# Run tests
pnpm test:unit
# Lint
pnpm lint
# Format
pnpm format
# Type check
pnpm type-check
```
## Testing
### Backend Tests
131 tests covering:
- TSFile parsing utilities
- Data reading and filtering
- Cache behavior
- REST API endpoints
- Error handling
Run: `mvn test`
### Frontend Tests
Component and integration tests using Vitest + Vue Test Utils
Run: `pnpm test:unit`
## Performance
- **Chunk-level reading**: Streams data without loading entire files
- **Metadata caching**: 1-hour TTL, 1000 entries max
- **Reader caching**: 30-minute TTL, 100 entries max
- **Automatic downsampling**: LTTB algorithm for >1000 data points
- **Virtual scrolling**: Efficient rendering for large tables
- **Route-based code splitting**: Lazy loading for optimal bundle size
## Security
- **Directory whitelist**: Restricts file system access to configured paths
- **Upload validation**: File extension and size checks
- **Reverse Proxy Support**: Recommended way to connect in separate deployment
- **Path traversal protection**: Rejects `..` and absolute paths outside whitelist
## License
See [LICENSE](LICENSE) file for details.
## Contributing
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Run tests and formatting
5. Submit a pull request
## Support
For issues and questions:
- Check [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md) for deployment help
- Review API documentation
- Open a GitHub issue
## Acknowledgments
- Apache TsFile library
- Vue.js and Spring Boot communities
- ECharts visualization library