123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- // page-dynamic.component.ts
- import { Component, AfterViewInit } from '@angular/core';
- import { FormsModule } from '@angular/forms';
- @Component({
- selector: 'app-page-dynamic',
- standalone: true,
- templateUrl: './page-dynamic.html',
- styleUrls: ['./page-dynamic.scss'],
- imports: [FormsModule]
- })
- export class PageDynamic implements AfterViewInit {
- isOcrSuccess: boolean | null = null;
- activeLanterns = false;
- isProcessing = false;
- formData = {
- awardName: '',
- applicant: '',
- description: '',
- document: null as File | null
- };
- ngAfterViewInit() {
- this.initCraneInteraction();
- this.initPavilionInteraction();
- }
- onOcrClick() {
- this.isProcessing = true;
- this.activeLanterns = false;
- this.isOcrSuccess = null;
- // 模拟OCR处理过程
- setTimeout(() => {
- this.isProcessing = false;
- const isSuccess = Math.random() > 0.3;
- this.isOcrSuccess = isSuccess;
- this.activeLanterns = isSuccess;
-
- if (!isSuccess) {
- this.createCeramicShards();
- }
- }, 1500);
- }
- createCeramicShards() {
- const gate = document.querySelector('.ocr-gate');
- if (!gate) return;
- for (let i = 0; i < 8; i++) {
- const shard = document.createElement('div');
- shard.classList.add('ceramic-shard');
- shard.style.setProperty('--angle', `${Math.random() * 360}deg`);
- shard.style.setProperty('--distance', `${50 + Math.random() * 100}px`);
- gate.appendChild(shard);
- setTimeout(() => {
- shard.style.opacity = '1';
- shard.style.transform = `translate(
- calc(var(--distance) * cos(var(--angle))),
- calc(var(--distance) * sin(var(--angle)))
- ) rotate(var(--angle))`;
- }, 10);
- setTimeout(() => {
- shard.remove();
- }, 1000);
- }
- }
- initCraneInteraction() {
- const cranes = document.querySelectorAll('.crane');
- cranes.forEach(crane => {
- crane.addEventListener('mouseenter', () => {
- if (!crane.classList.contains('main-crane')) {
- crane.classList.add('hovered');
- }
- });
-
- crane.addEventListener('mouseleave', () => {
- crane.classList.remove('hovered');
- });
- });
- }
- initPavilionInteraction() {
- const pavilion = document.querySelector('.pavilion-model');
- if (!pavilion) return;
- // 使用类型断言明确指定事件类型
- pavilion.addEventListener('mousemove', (e: Event) => {
- const mouseEvent = e as MouseEvent; // 类型断言
- const rect = pavilion.getBoundingClientRect();
- const centerX = rect.left + rect.width / 2;
- const centerY = rect.top + rect.height / 2;
-
- const rotateY = (mouseEvent.clientX - centerX) / 20;
- const rotateX = (centerY - mouseEvent.clientY) / 20;
-
- (pavilion as HTMLElement).style.transform =
- `perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;
- });
-
- pavilion.addEventListener('mouseleave', () => {
- (pavilion as HTMLElement).style.transform =
- 'perspective(1000px) rotateX(0) rotateY(0)';
- });
- }
- onFileSelected(event: Event) {
- const input = event.target as HTMLInputElement;
- if (input.files && input.files.length > 0) {
- this.formData.document = input.files[0];
- }
- }
- submitForm() {
- console.log('Form submitted:', this.formData);
- // 实际应用中这里会发送数据到服务器
- alert('奖项申报已提交!');
- this.formData = {
- awardName: '',
- applicant: '',
- description: '',
- document: null
- };
- }
- }
|