diff --git a/.gitignore b/.gitignore index e53cab94..bc27e412 100644 --- a/.gitignore +++ b/.gitignore @@ -20,8 +20,14 @@ __pycache__/ .venv/ venv/ +# Backend (Go) +infogenie-backend-go/vendor/ +infogenie-backend-go/*.exe +infogenie-backend-go/server +infogenie-backend-go/tmp/ +infogenie-backend-go/go.work* + # Env (do not commit secrets) InfoGenie-backend/.env .env.local .env.*.local - diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..bc6739ba --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,113 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working in this repository. + +## Repository layout + +This repo is a multi-app workspace with the React frontend as the main active surface: + +- `infogenie-frontend/` — React 18 SPA built with Create React App. This is the primary app. +- `infogenie-backend-java/` — Spring Boot 3.5 / Java 17 backend skeleton. +- `InfoGenie-go-backend/` — legacy/alternate backend directory; currently only contains a README. + +The frontend mixes two layers: + +- A React shell for navigation, auth, shared layout, and embedded views. +- A large set of static HTML/JS mini-apps under `public/` and the corresponding built copies under `build/`. + +## Frontend architecture + +Key React entry points: + +- `src/index.js` bootstraps the app and explicitly unregisters service workers / clears caches to avoid stale assets. +- `src/App.js` owns the top-level layout, router, global toast container, particle effect, and auth provider. +- `src/contexts/UserContext.js` is the session source of truth. It hydrates from `localStorage`, calls the auth service, and exposes login/logout helpers. +- `src/utils/api.js` is the shared Axios layer. It injects the bearer token, handles 401 redirects, and defines the separate auth-center client. +- `src/config/env.js` resolves runtime API endpoints from `REACT_APP_*` env vars or the current origin. + +The app is route-driven, with major pages for: + +- home entry / section selection +- login + auth callback +- 60s API browser and item detail routes +- small games +- toolbox +- AI app launcher +- user profile and admin + +### Config-driven content + +Most catalog-like UI is data-driven rather than hard-coded in pages: + +- `src/config/Api60sConfig.js` defines the 60s API categories, toolbox catalogs, and static page path mappings. +- `src/config/StaticPageConfig.js` defines AI app and small-game launch metadata. +- `src/utils/site60sVisibility.js` fetches the backend site visibility list and filters the 60s API catalog before rendering. + +This means many UI changes are done by editing config objects, not component logic. + +### Static page embedding pattern + +Several pages open a full-screen embedded static page instead of rendering everything in React: + +- AI apps use `FullscreenEmbed` with token injection. +- Toolbox items also launch through `FullscreenEmbed`. +- 60s API detail pages map `itemId` to a static HTML page path. + +When changing any mini-app, check both the React catalog entry and the matching file path under `public/`. + +## Backend architecture + +`infogenie-backend-java/` is currently a minimal Spring Boot bootstrap: + +- `src/main/java/.../InfogenieBackendJavaApplication.java` contains only the application entry point. +- `src/test/java/.../InfogenieBackendJavaApplicationTests.java` contains the default context load test. +- `src/main/resources/application.yaml` only sets the application name right now. + +There is no REST controller layer in this Java module yet. + +## Common commands + +### Frontend (`infogenie-frontend/`) + +```bash +npm install +npm start +npm run dev +npm run build +npm test +``` + +Single test file or pattern: + +```bash +npm test -- --runInBand --watch=false src/path/to/test-file.test.js +npm test -- --runInBand --watch=false --testNamePattern="pattern" +``` + +There is no separate lint script in `package.json`; the project relies on CRA's built-in ESLint checks during `start`, `test`, and `build`. + +### Java backend (`infogenie-backend-java/`) + +```bash +mvn test +mvn spring-boot:run +mvn -Dtest=InfogenieBackendJavaApplicationTests test +``` + +## Environment variables + +Frontend runtime config comes from: + +- `REACT_APP_API_URL` +- `REACT_APP_AUTH_URL` +- `REACT_APP_AUTH_API_URL` +- `REACT_APP_DEBUG` + +If these are unset, the frontend falls back to the current origin for the main API and built-in auth defaults for auth URLs. + +## Practical notes + +- The frontend auth flow depends on `localStorage` keys such as `token`, `user`, and `expiresAt`. +- 401 responses from the shared Axios client clear the session and redirect to `/login`. +- The 60s API list is filtered by backend visibility data, so a missing/failed visibility fetch intentionally fails open and shows all items. +- The home page is just a launcher for the main product areas; the detailed behavior lives in the section pages and config files. diff --git a/InfoGenie-backend/.dockerignore b/InfoGenie-backend/.dockerignore deleted file mode 100644 index 67818e6e..00000000 --- a/InfoGenie-backend/.dockerignore +++ /dev/null @@ -1,19 +0,0 @@ - - -# Python cache -__pycache__ - -# Git -.git -.gitignore - -# IDE -.vscode -.idea -*.swp -*.swo - -# Test files -InfoGenie-backend/test - - diff --git a/InfoGenie-backend/.env.example b/InfoGenie-backend/.env.example deleted file mode 100644 index 2ff2689c..00000000 --- a/InfoGenie-backend/.env.example +++ /dev/null @@ -1,16 +0,0 @@ -# InfoGenie 环境变量配置示例 -# 复制为 .env 并按需填写;不要把 .env 提交到仓库 - -# 邮件配置 -MAIL_USERNAME=your_email@example.com -MAIL_PASSWORD=your_mail_password_or_app_token - -# 数据库配置 -MONGO_URI=mongodb://user:pass@127.0.0.1:27017/InfoGenie?authSource=admin - -# 应用密钥 -SECRET_KEY=change-me - -# 环境配置 -FLASK_ENV=development - diff --git a/InfoGenie-backend/.gitignore b/InfoGenie-backend/.gitignore deleted file mode 100644 index 3c593d0c..00000000 --- a/InfoGenie-backend/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -#项目自忽略 -.vscode -__pycache__ \ No newline at end of file diff --git a/InfoGenie-backend/Dockerfile b/InfoGenie-backend/Dockerfile deleted file mode 100644 index dac43587..00000000 --- a/InfoGenie-backend/Dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -# InfoGenie 后端 Docker 镜像 -# 仅包含后端服务,使用 Gunicorn - -FROM python:3.10-slim - -# 安装 curl 用于健康检查 -RUN apt-get update && apt-get install -y \ - curl \ - && rm -rf /var/lib/apt/lists/* - -# 设置工作目录 -WORKDIR /app - -# 复制依赖文件 -COPY requirements.txt . - -# 安装 Python 依赖 -RUN pip install --no-cache-dir -r requirements.txt gunicorn - -# 复制后端代码 -COPY . . - -# 创建持久化数据目录 -RUN mkdir -p /app/data/logs - -# 暴露端口 -EXPOSE 2323 - -# 使用 Gunicorn 启动应用 -CMD ["gunicorn", "--bind", "0.0.0.0:2323", "--workers", "4", "--threads", "2", "--timeout", "120", "--access-logfile", "-", "--error-logfile", "-", "app:app"] diff --git a/InfoGenie-backend/app.py b/InfoGenie-backend/app.py deleted file mode 100755 index 608e0600..00000000 --- a/InfoGenie-backend/app.py +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -InfoGenie 后端主应用入口 -Created by: 万象口袋 -Date: 2025-09-02 -""" - -from flask import Flask, jsonify, request, send_from_directory -from flask_cors import CORS -from flask_pymongo import PyMongo -import os -from datetime import datetime, timedelta -import hashlib -import secrets - -# 导入模块 -from modules.auth import auth_bp -from modules.user_management import user_bp -from modules.email_service import init_mail -from modules.aimodelapp import aimodelapp_bp - -from config import Config - -# 创建Flask应用 -def create_app(): - """创建Flask应用实例""" - app = Flask(__name__) - - # 加载配置 - app.config.from_object(Config) - - # 启用CORS跨域支持(允许所有源) - CORS(app, supports_credentials=True) - - # 初始化MongoDB - mongo = PyMongo(app) - app.mongo = mongo - - # 初始化邮件服务 - init_mail(app) - - # 注册蓝图 - app.register_blueprint(auth_bp, url_prefix='/api/auth') - app.register_blueprint(user_bp, url_prefix='/api/user') - app.register_blueprint(aimodelapp_bp, url_prefix='/api/aimodelapp') - - # 基础路由 - @app.route('/') - def index(): - """API根路径""" - return jsonify({ - 'message': '万象口袋 后端 API 服务运行中', - "description": "提供用户认证、用户管理、聚合API、小游戏接口和AI模型应用接口", - "email":"shumengya666@outlook.com", - 'version': '2.2.0', - 'timestamp': datetime.now().isoformat(), - 'endpoints': { - 'auth': '/api/auth', - '60s_api': '/api/60s', - 'user': '/api/user', - 'smallgame': '/api/smallgame', - 'aimodelapp': '/api/aimodelapp' - } - }) - - @app.route('/api/health') - def health_check(): - """健康检查接口""" - try: - # 检查数据库连接 - mongo.db.command('ping') - db_status = 'connected' - except Exception as e: - db_status = f'error: {str(e)}' - - return jsonify({ - 'status': 'running', - 'database': db_status, - 'timestamp': datetime.now().isoformat() - }) - - # 60sapi静态文件服务 - @app.route('/60sapi/') - def serve_60sapi_files(filename): - """提供60sapi目录下的静态文件服务""" - try: - # 获取项目根目录 - project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - api_directory = os.path.join(project_root, 'frontend', '60sapi') - - # 安全检查:确保文件路径在允许的目录内 - full_path = os.path.join(api_directory, filename) - if not os.path.commonpath([api_directory, full_path]) == api_directory: - return jsonify({'error': '非法文件路径'}), 403 - - # 检查文件是否存在 - if not os.path.exists(full_path): - return jsonify({'error': '文件不存在'}), 404 - - # 获取文件目录和文件名 - directory = os.path.dirname(full_path) - file_name = os.path.basename(full_path) - - return send_from_directory(directory, file_name) - - except Exception as e: - return jsonify({'error': f'文件服务错误: {str(e)}'}), 500 - - # smallgame静态文件服务 - @app.route('/smallgame/') - def serve_smallgame_files(filename): - """提供smallgame目录下的静态文件服务""" - try: - # 获取项目根目录 - project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - game_directory = os.path.join(project_root, 'frontend', 'smallgame') - - # 安全检查:确保文件路径在允许的目录内 - full_path = os.path.join(game_directory, filename) - if not os.path.commonpath([game_directory, full_path]) == game_directory: - return jsonify({'error': '非法文件路径'}), 403 - - # 检查文件是否存在 - if not os.path.exists(full_path): - return jsonify({'error': '文件不存在'}), 404 - - # 获取文件目录和文件名 - directory = os.path.dirname(full_path) - file_name = os.path.basename(full_path) - - return send_from_directory(directory, file_name) - - except Exception as e: - return jsonify({'error': f'文件服务错误: {str(e)}'}), 500 - - # aimodelapp静态文件服务 - @app.route('/aimodelapp/') - def serve_aimodelapp_files(filename): - """提供aimodelapp目录下的静态文件服务""" - try: - # 获取项目根目录 - project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - ai_directory = os.path.join(project_root, 'frontend', 'public', 'aimodelapp') - - # 安全检查:确保文件路径在允许的目录内 - full_path = os.path.join(ai_directory, filename) - if not os.path.commonpath([ai_directory, full_path]) == ai_directory: - return jsonify({'error': '非法文件路径'}), 403 - - # 检查文件是否存在 - if not os.path.exists(full_path): - return jsonify({'error': '文件不存在'}), 404 - - # 获取文件目录和文件名 - directory = os.path.dirname(full_path) - file_name = os.path.basename(full_path) - - return send_from_directory(directory, file_name) - - except Exception as e: - return jsonify({'error': f'文件服务错误: {str(e)}'}), 500 - - # 错误处理 - @app.errorhandler(404) - def not_found(error): - return jsonify({ - 'error': 'API接口不存在', - 'message': '请检查请求路径是否正确' - }), 404 - - @app.errorhandler(500) - def internal_error(error): - return jsonify({ - 'error': '服务器内部错误', - 'message': '请稍后重试或联系管理员' - }), 500 - - return app - -# 为 Gunicorn 创建应用实例 -app = create_app() - -if __name__ == '__main__': - print("🚀 启动 InfoGenie 后端服务...") - app.run(debug=True, host='0.0.0.0', port=5002) diff --git a/InfoGenie-backend/config.py b/InfoGenie-backend/config.py deleted file mode 100755 index 4836948d..00000000 --- a/InfoGenie-backend/config.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -InfoGenie 配置文件 -Created by: 万象口袋 -Date: 2025-09-02 -""" - -import os -from datetime import timedelta -from dotenv import load_dotenv - -# 加载环境变量 -load_dotenv() - -class Config: - """应用配置类""" - - # 基础配置 - SECRET_KEY = os.environ.get('SECRET_KEY') or 'infogenie-secret-key-2025' - - # MongoDB 配置 - MONGO_URI = os.environ.get('MONGO_URI') or 'mongodb://localhost:27017/InfoGenie' - - # hwt 配置 - HWT_LIFETIME = timedelta(days=7) # hwt持续7天 - HWT_SECURE = False # 开发环境设为False,生产环境设为True - HWT_HTTPONLY = True - HWT_SAMESITE = 'Lax' - HWT_DOMAIN = None # 开发环境设为None,生产环境设为具体域名 - HWT_PATH = '/' - HWT_REFRESH_EACH_REQUEST = True # 每次请求刷新hwt过期时间 - - # 邮件配置 - MAIL_SERVER = 'smtp.qq.com' - MAIL_PORT = 465 - MAIL_USE_SSL = True - MAIL_USE_TLS = False - MAIL_USERNAME = os.environ.get('MAIL_USERNAME') or 'your-email@qq.com' - MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') or 'your-app-password' - MAIL_DEFAULT_SENDER = ('InfoGenie 万象口袋', os.environ.get('MAIL_USERNAME') or 'your-email@qq.com') - - # API 配置 - API_RATE_LIMIT = '100 per hour' # API调用频率限制 - - # 外部API配置 - EXTERNAL_APIS = { - '60s': [ - 'https://60s.api.shumengya.top' - ] - } - - # 应用信息 - APP_INFO = { - 'name': '✨ 万象口袋 ✨', - 'description': '🎨 一个多功能的聚合软件应用 💬', - 'author': '👨‍💻 by-万象口袋', - 'version': '1.0.0', - 'icp': '📄 蜀ICP备2025151694号' - } - -class DevelopmentConfig(Config): - """开发环境配置""" - DEBUG = True - TESTING = False - -class ProductionConfig(Config): - """生产环境配置""" - DEBUG = False - TESTING = False - HWT_SECURE = True - -class TestingConfig(Config): - """测试环境配置""" - DEBUG = True - TESTING = True - MONGO_URI = 'mongodb://localhost:27017/InfoGenie_Test' - -# 配置字典 -config = { - 'development': DevelopmentConfig, - 'production': ProductionConfig, - 'testing': TestingConfig, - 'default': DevelopmentConfig -} diff --git a/InfoGenie-backend/docker-compose.yml b/InfoGenie-backend/docker-compose.yml deleted file mode 100644 index 920183e2..00000000 --- a/InfoGenie-backend/docker-compose.yml +++ /dev/null @@ -1,39 +0,0 @@ -version: '3.8' - -services: - infogenie-backend: - build: - context: . - dockerfile: Dockerfile - container_name: infogenie-backend - restart: always - ports: - - "2323:2323" - volumes: - # 持久化数据映射 - - /shumengya/docker/infogenie-backend/data:/app/data - - environment: - # 从 .env 文件读取环境变量 - - MONGO_URI=${MONGO_URI} - - MAIL_USERNAME=${MAIL_USERNAME} - - MAIL_PASSWORD=${MAIL_PASSWORD} - - SECRET_KEY=${SECRET_KEY} - - FLASK_ENV=production - # 生产环境配置 - - HWT_DOMAIN=.shumengya.top - - HWT_SECURE=False # 如果使用 HTTPS 反向代理,设为 False;直接 HTTPS 设为 True - env_file: - - .env - networks: - - infogenie-network - healthcheck: - test: ["CMD-SHELL", "curl -f http://localhost:2323/api/health || exit 1"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - -networks: - infogenie-network: - driver: bridge diff --git a/InfoGenie-backend/modules/__pycache__/aimodelapp.cpython-310.pyc b/InfoGenie-backend/modules/__pycache__/aimodelapp.cpython-310.pyc deleted file mode 100644 index abcfffba..00000000 Binary files a/InfoGenie-backend/modules/__pycache__/aimodelapp.cpython-310.pyc and /dev/null differ diff --git a/InfoGenie-backend/modules/__pycache__/aimodelapp.cpython-313.pyc b/InfoGenie-backend/modules/__pycache__/aimodelapp.cpython-313.pyc deleted file mode 100755 index 68c49b55..00000000 Binary files a/InfoGenie-backend/modules/__pycache__/aimodelapp.cpython-313.pyc and /dev/null differ diff --git a/InfoGenie-backend/modules/__pycache__/api_60s.cpython-313.pyc b/InfoGenie-backend/modules/__pycache__/api_60s.cpython-313.pyc deleted file mode 100755 index dd7dd5b8..00000000 Binary files a/InfoGenie-backend/modules/__pycache__/api_60s.cpython-313.pyc and /dev/null differ diff --git a/InfoGenie-backend/modules/__pycache__/api_scanner.cpython-313.pyc b/InfoGenie-backend/modules/__pycache__/api_scanner.cpython-313.pyc deleted file mode 100755 index 27fd75a6..00000000 Binary files a/InfoGenie-backend/modules/__pycache__/api_scanner.cpython-313.pyc and /dev/null differ diff --git a/InfoGenie-backend/modules/__pycache__/auth.cpython-310.pyc b/InfoGenie-backend/modules/__pycache__/auth.cpython-310.pyc deleted file mode 100644 index 58d3b639..00000000 Binary files a/InfoGenie-backend/modules/__pycache__/auth.cpython-310.pyc and /dev/null differ diff --git a/InfoGenie-backend/modules/__pycache__/auth.cpython-313.pyc b/InfoGenie-backend/modules/__pycache__/auth.cpython-313.pyc deleted file mode 100755 index 71487c3c..00000000 Binary files a/InfoGenie-backend/modules/__pycache__/auth.cpython-313.pyc and /dev/null differ diff --git a/InfoGenie-backend/modules/__pycache__/email_service.cpython-310.pyc b/InfoGenie-backend/modules/__pycache__/email_service.cpython-310.pyc deleted file mode 100644 index ca0eb326..00000000 Binary files a/InfoGenie-backend/modules/__pycache__/email_service.cpython-310.pyc and /dev/null differ diff --git a/InfoGenie-backend/modules/__pycache__/email_service.cpython-313.pyc b/InfoGenie-backend/modules/__pycache__/email_service.cpython-313.pyc deleted file mode 100755 index 8c30c86a..00000000 Binary files a/InfoGenie-backend/modules/__pycache__/email_service.cpython-313.pyc and /dev/null differ diff --git a/InfoGenie-backend/modules/__pycache__/game_stats.cpython-313.pyc b/InfoGenie-backend/modules/__pycache__/game_stats.cpython-313.pyc deleted file mode 100644 index 293c4fae..00000000 Binary files a/InfoGenie-backend/modules/__pycache__/game_stats.cpython-313.pyc and /dev/null differ diff --git a/InfoGenie-backend/modules/__pycache__/smallgame.cpython-313.pyc b/InfoGenie-backend/modules/__pycache__/smallgame.cpython-313.pyc deleted file mode 100755 index 294cb898..00000000 Binary files a/InfoGenie-backend/modules/__pycache__/smallgame.cpython-313.pyc and /dev/null differ diff --git a/InfoGenie-backend/modules/__pycache__/user_management.cpython-310.pyc b/InfoGenie-backend/modules/__pycache__/user_management.cpython-310.pyc deleted file mode 100644 index 74317c1b..00000000 Binary files a/InfoGenie-backend/modules/__pycache__/user_management.cpython-310.pyc and /dev/null differ diff --git a/InfoGenie-backend/modules/__pycache__/user_management.cpython-313.pyc b/InfoGenie-backend/modules/__pycache__/user_management.cpython-313.pyc deleted file mode 100755 index 7d164dd7..00000000 Binary files a/InfoGenie-backend/modules/__pycache__/user_management.cpython-313.pyc and /dev/null differ diff --git a/InfoGenie-backend/modules/aimodelapp.py b/InfoGenie-backend/modules/aimodelapp.py deleted file mode 100755 index 2061e7ba..00000000 --- a/InfoGenie-backend/modules/aimodelapp.py +++ /dev/null @@ -1,1087 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -AI模型应用服务模块 -Created by: 万象口袋 -Date: 2025-01-15 -""" - -from flask import Blueprint, request, jsonify, current_app -import requests -import json -import os -from datetime import datetime -from bson import ObjectId -from functools import wraps - -# 创建蓝图 -aimodelapp_bp = Blueprint('aimodelapp', __name__) - -# AI功能萌芽币消耗配置 -AI_COST = 100 # 每次调用AI功能消耗的萌芽币数量 - -# 验证用户萌芽币余额装饰器 -def verify_user_coins(f): - """验证用户萌芽币余额并在调用AI功能后扣除相应数量的萌芽币""" - @wraps(f) - def decorated(*args, **kwargs): - try: - # 获取用户认证信息 - token = request.headers.get('Authorization') - if not token: - return jsonify({ - 'success': False, - 'message': '未提供认证信息', - 'error_code': 'auth_required' - }), 401 - - if token.startswith('Bearer '): - token = token[7:] - - # 解析JWT token - import jwt - try: - payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256']) - user_id = payload['user_id'] - except Exception as jwt_error: - print(f"JWT解析错误: {str(jwt_error)}") - return jsonify({ - 'success': False, - 'message': '无效的认证信息', - 'error_code': 'invalid_token' - }), 401 - - # 查询用户萌芽币余额 - users_collection = current_app.mongo.db.userdata - user = users_collection.find_one({'_id': ObjectId(user_id)}) - - if not user: - return jsonify({ - 'success': False, - 'message': '用户不存在', - 'error_code': 'user_not_found' - }), 404 - - # 检查萌芽币余额 - current_coins = user.get('萌芽币', 0) - if current_coins < AI_COST: - return jsonify({ - 'success': False, - 'message': f'萌芽币余额不足!当前余额: {current_coins}, 需要: {AI_COST}', - 'error_code': 'insufficient_coins', - 'current_coins': current_coins, - 'required_coins': AI_COST - }), 402 - - # 先扣除萌芽币,确保无论服务是否成功都会扣费 - deduct_result = users_collection.update_one( - {'_id': ObjectId(user_id)}, - {'$inc': {'萌芽币': -AI_COST}} - ) - - if deduct_result.modified_count < 1: - print(f"警告: 用户 {user_id} 萌芽币扣除失败") - - # 为请求添加用户信息,以便在函数内部使用 - request.current_user = { - 'user_id': user_id, - 'username': user.get('用户名', ''), - 'email': user.get('邮箱', '') - } - - # 保存API调用类型 - api_type = request.path.split('/')[-1] - - # 添加使用记录 - usage_record = { - 'api_type': api_type, - 'timestamp': datetime.now().isoformat(), - 'cost': AI_COST - } - - # 更新用户的AI使用历史记录 - users_collection.update_one( - {'_id': ObjectId(user_id)}, - {'$push': {'ai_usage_history': usage_record}} - ) - - # 调用原函数 - result = f(*args, **kwargs) - - return result - - except Exception as e: - print(f"验证萌芽币时发生错误: {str(e)}") - return jsonify({ - 'success': False, - 'message': '处理请求时出错', - 'error': str(e) - }), 500 - - return decorated - -#加载AI配置文件 -def load_ai_config(): - """加载AI配置文件""" - try: - config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'ai_config.json') - with open(config_path, 'r', encoding='utf-8') as f: - return json.load(f) - except Exception as e: - print(f"加载AI配置失败: {e}") - return None - -#调用DeepSeek API,带重试机制 -def call_deepseek_api(messages, model="deepseek-chat", max_retries=3): - """调用DeepSeek API,带重试机制""" - config = load_ai_config() - if not config or 'deepseek' not in config: - return None, "AI配置加载失败" - - deepseek_config = config['deepseek'] - - headers = { - 'Authorization': f'Bearer {deepseek_config["api_key"]}', - 'Content-Type': 'application/json' - } - - data = { - 'model': model, - 'messages': messages, - 'temperature': 0.7, - 'max_tokens': 2000 - } - - import time - - for attempt in range(max_retries): - try: - # 增加超时时间到90秒 - response = requests.post( - f"{deepseek_config['api_base']}/chat/completions", - headers=headers, - json=data, - timeout=90 - ) - - if response.status_code == 200: - result = response.json() - return result['choices'][0]['message']['content'], None - else: - error_msg = f"API调用失败: {response.status_code} - {response.text}" - if attempt < max_retries - 1: - print(f"第{attempt + 1}次尝试失败,等待重试: {error_msg}") - time.sleep(2 ** attempt) # 指数退避 - continue - return None, error_msg - - except requests.exceptions.Timeout: - error_msg = "API请求超时" - if attempt < max_retries - 1: - print(f"第{attempt + 1}次尝试超时,等待重试") - time.sleep(2 ** attempt) # 指数退避 - continue - return None, f"{error_msg}(已重试{max_retries}次)" - - except Exception as e: - error_msg = f"API调用异常: {str(e)}" - if attempt < max_retries - 1: - print(f"第{attempt + 1}次尝试异常,等待重试: {error_msg}") - time.sleep(2 ** attempt) # 指数退避 - continue - return None, f"{error_msg}(已重试{max_retries}次)" - -#调用Kimi API -def call_kimi_api(messages, model="kimi-k2-0905-preview"): - """调用Kimi API""" - config = load_ai_config() - if not config or 'kimi' not in config: - return None, "AI配置加载失败" - - kimi_config = config['kimi'] - - headers = { - 'Authorization': f'Bearer {kimi_config["api_key"]}', - 'Content-Type': 'application/json' - } - - data = { - 'model': model, - 'messages': messages, - 'temperature': 0.7, - 'max_tokens': 2000 - } - - try: - response = requests.post( - f"{kimi_config['api_base']}/v1/chat/completions", - headers=headers, - json=data, - timeout=30 - ) - - if response.status_code == 200: - result = response.json() - return result['choices'][0]['message']['content'], None - else: - return None, f"API调用失败: {response.status_code} - {response.text}" - - except Exception as e: - return None, f"API调用异常: {str(e)}" - -#统一的AI聊天接口 -@aimodelapp_bp.route('/chat', methods=['POST']) -@verify_user_coins -def ai_chat(): - """统一的AI聊天接口""" - try: - data = request.get_json() - - if not data: - return jsonify({'error': '请求数据为空'}), 400 - - # 获取请求参数 - messages = data.get('messages', []) - model_provider = data.get('provider', 'deepseek') # 默认使用deepseek - model_name = data.get('model', 'deepseek-chat') # 默认模型 - - if not messages: - return jsonify({'error': '消息内容不能为空'}), 400 - - # 根据提供商调用对应的API - if model_provider == 'deepseek': - content, error = call_deepseek_api(messages, model_name) - elif model_provider == 'kimi': - content, error = call_kimi_api(messages, model_name) - else: - return jsonify({'error': f'不支持的AI提供商: {model_provider}'}), 400 - - if error: - return jsonify({'error': error}), 500 - - return jsonify({ - 'success': True, - 'content': content, - 'provider': model_provider, - 'model': model_name, - 'timestamp': datetime.now().isoformat() - }) - - except Exception as e: - return jsonify({'error': f'服务器错误: {str(e)}'}), 500 - -#姓名分析专用接口 -@aimodelapp_bp.route('/name-analysis', methods=['POST']) -@verify_user_coins -def name_analysis(): - """姓名分析专用接口""" - try: - data = request.get_json() - name = data.get('name', '').strip() - - if not name: - return jsonify({'error': '姓名不能为空'}), 400 - - # 构建姓名分析的专业提示词 - prompt = f"""你是一位专业的姓名学专家和语言学家,请对输入的姓名进行全面分析。请直接输出分析结果,不要包含任何思考过程或标签。 - -姓名:{name} - -请按照以下格式严格输出分析结果: - -【稀有度评分】 -评分:X% -评价:[对稀有度的详细说明,包括姓氏和名字的常见程度分析] - -【音韵评价】 -评分:X% -评价:[对音韵美感的分析,包括声调搭配、读音流畅度、音律和谐度等] - -【含义解读】 -[详细分析姓名的寓意内涵,包括: -1. 姓氏的历史渊源和文化背景 -2. 名字各字的含义和象征 -3. 整体姓名的寓意组合 -4. 可能体现的父母期望或文化内涵 -5. 与传统文化、诗词典故的关联等] - -要求: -1. 评分必须是1-100的整数百分比,要有明显区分度,避免雷同 -2. 分析要专业、客观、有依据,评分要根据实际情况有所差异 -3. 含义解读要详细深入,至少150字 -4. 严格按照上述格式输出,不要添加思考过程、标签或其他内容 -5. 如果是生僻字或罕见姓名,要特别说明 -6. 直接输出最终结果,不要显示推理过程""" - - messages = [ - {"role": "user", "content": prompt} - ] - - # 使用DeepSeek进行分析 - content, error = call_deepseek_api(messages) - - if error: - return jsonify({'error': error}), 500 - - return jsonify({ - 'success': True, - 'analysis': content, - 'name': name, - 'timestamp': datetime.now().isoformat() - }) - - except Exception as e: - return jsonify({'error': f'姓名分析失败: {str(e)}'}), 500 - -#变量命名助手接口 -@aimodelapp_bp.route('/variable-naming', methods=['POST']) -@verify_user_coins -def variable_naming(): - """变量命名助手接口""" - try: - data = request.get_json() - description = data.get('description', '').strip() - language = data.get('language', 'javascript').lower() - - if not description: - return jsonify({'error': '变量描述不能为空'}), 400 - - # 构建变量命名的提示词 - prompt = f"""你是一个专业的变量命名助手。请根据以下描述为变量生成合适的名称: - -描述:{description} - -请为每种命名规范生成3个变量名建议: -1. camelCase (驼峰命名法) -2. PascalCase (帕斯卡命名法) -3. snake_case (下划线命名法) -4. kebab-case (短横线命名法) -5. CONSTANT_CASE (常量命名法) - -要求: -- 变量名要准确反映功能和用途 -- 严格遵循各自的命名规范 -- 避免使用缩写,除非是广泛认知的缩写 -- 名称要简洁但具有描述性 -- 考虑代码的可读性和维护性 - -请按以下JSON格式返回: -{{ - "suggestions": {{ - "camelCase": [ - {{"name": "变量名1", "description": "解释说明1"}}, - {{"name": "变量名2", "description": "解释说明2"}}, - {{"name": "变量名3", "description": "解释说明3"}} - ], - "PascalCase": [ - {{"name": "变量名1", "description": "解释说明1"}}, - {{"name": "变量名2", "description": "解释说明2"}}, - {{"name": "变量名3", "description": "解释说明3"}} - ], - "snake_case": [ - {{"name": "变量名1", "description": "解释说明1"}}, - {{"name": "变量名2", "description": "解释说明2"}}, - {{"name": "变量名3", "description": "解释说明3"}} - ], - "kebab-case": [ - {{"name": "变量名1", "description": "解释说明1"}}, - {{"name": "变量名2", "description": "解释说明2"}}, - {{"name": "变量名3", "description": "解释说明3"}} - ], - "CONSTANT_CASE": [ - {{"name": "变量名1", "description": "解释说明1"}}, - {{"name": "变量名2", "description": "解释说明2"}}, - {{"name": "变量名3", "description": "解释说明3"}} - ] - }} -}} - -只返回JSON格式的结果,不要包含其他文字。""" - - messages = [ - {"role": "user", "content": prompt} - ] - - # 使用DeepSeek进行分析 - content, error = call_deepseek_api(messages) - - if error: - return jsonify({'error': error}), 500 - - # 解析AI返回的JSON格式数据 - try: - # 尝试直接解析JSON - ai_response = json.loads(content) - suggestions = ai_response.get('suggestions', {}) - except json.JSONDecodeError: - # 如果直接解析失败,尝试提取JSON部分 - import re - json_match = re.search(r'\{[\s\S]*\}', content) - if json_match: - try: - ai_response = json.loads(json_match.group()) - suggestions = ai_response.get('suggestions', {}) - except json.JSONDecodeError: - return jsonify({'error': 'AI返回的数据格式无法解析'}), 500 - else: - return jsonify({'error': 'AI返回的数据中未找到有效的JSON格式'}), 500 - - return jsonify({ - 'success': True, - 'suggestions': suggestions, - 'description': description, - 'language': language, - 'timestamp': datetime.now().isoformat() - }) - - except Exception as e: - return jsonify({'error': f'变量命名失败: {str(e)}'}), 500 - -#AI写诗助手接口 -@aimodelapp_bp.route('/poetry', methods=['POST']) -@verify_user_coins -def poetry_assistant(): - """AI写诗助手接口""" - try: - data = request.get_json() - theme = data.get('theme', '').strip() - style = data.get('style', '现代诗').strip() - mood = data.get('mood', '').strip() - - if not theme: - return jsonify({'error': '诗歌主题不能为空'}), 400 - - # 构建写诗的提示词 - prompt = f"""你是一位才华横溢的诗人,请根据以下要求创作一首诗歌。 - -主题:{theme} -风格:{style} -情感基调:{mood if mood else '自由发挥'} - -创作要求: -1. 紧扣主题,情感真挚 -2. 语言优美,意境深远 -3. 符合指定的诗歌风格 -4. 长度适中,朗朗上口 -5. 如果是古体诗,注意平仄和韵律 - -请直接输出诗歌作品,不需要额外的解释或分析。""" - - messages = [ - {"role": "user", "content": prompt} - ] - - # 使用DeepSeek进行创作 - content, error = call_deepseek_api(messages) - - if error: - return jsonify({'error': error}), 500 - - return jsonify({ - 'success': True, - 'poem': content, - 'theme': theme, - 'style': style, - 'mood': mood, - 'timestamp': datetime.now().isoformat() - }) - - except Exception as e: - return jsonify({'error': f'诗歌创作失败: {str(e)}'}), 500 - -#AI语言翻译接口 -@aimodelapp_bp.route('/translation', methods=['POST']) -@verify_user_coins -def translation(): - """AI语言翻译接口""" - try: - data = request.get_json() - source_text = data.get('source_text', '').strip() - target_language = data.get('target_language', 'zh-CN').strip() - - if not source_text: - return jsonify({'error': '翻译内容不能为空'}), 400 - - # 语言映射 - language_map = { - 'zh-CN': '中文(简体)', - 'zh-TW': '中文(繁体)', - 'en': '英语', - 'ja': '日语', - 'ko': '韩语', - 'fr': '法语', - 'de': '德语', - 'es': '西班牙语', - 'it': '意大利语', - 'pt': '葡萄牙语', - 'ru': '俄语', - 'ar': '阿拉伯语', - 'hi': '印地语', - 'th': '泰语', - 'vi': '越南语' - } - - target_language_name = language_map.get(target_language, target_language) - - # 构建翻译的专业提示词 - prompt = f"""你是一位专业的翻译专家,精通多种语言的翻译工作。请将以下文本翻译成{target_language_name}。 - -原文:{source_text} - -翻译要求: -1. 【信】- 忠实原文,准确传达原意,不遗漏、不添加、不歪曲 -2. 【达】- 译文通顺流畅,符合目标语言的表达习惯和语法规范 -3. 【雅】- 用词优美得体,风格与原文相符,具有良好的可读性 - -特别注意: -- 自动检测源语言,无需用户指定 -- 保持原文的语气、情感色彩和文体风格 -- 对于专业术语,提供准确的对应翻译 -- 对于文化特色词汇,在保持原意的基础上进行适当的本土化处理 -- 如果是单词或短语,提供多个常用含义的翻译 -- 如果是句子,确保语法正确、表达自然 - -请按以下JSON格式返回翻译结果: -{{ - "detected_language": "检测到的源语言名称", - "target_language": "{target_language_name}", - "translation": "翻译结果", - "alternative_translations": [ - "备选翻译1", - "备选翻译2", - "备选翻译3" - ], - "explanation": "翻译说明(包括语境、用法、注意事项等)", - "pronunciation": "目标语言的发音指导(如适用)" -}} - -只返回JSON格式的结果,不要包含其他文字。""" - - messages = [ - {"role": "user", "content": prompt} - ] - - # 使用DeepSeek进行翻译 - content, error = call_deepseek_api(messages) - - if error: - return jsonify({'error': error}), 500 - - return jsonify({ - 'success': True, - 'translation_result': content, - 'source_text': source_text, - 'target_language': target_language, - 'timestamp': datetime.now().isoformat() - }) - - except Exception as e: - return jsonify({'error': f'翻译失败: {str(e)}'}), 500 - -#现代文转文言文接口 -@aimodelapp_bp.route('/classical_conversion', methods=['POST']) -@verify_user_coins -def classical_conversion(): - """现代文转文言文接口""" - try: - data = request.get_json() - modern_text = data.get('modern_text', '').strip() - style = data.get('style', '古雅').strip() - article_type = data.get('article_type', '散文').strip() - - if not modern_text: - return jsonify({'error': '现代文内容不能为空'}), 400 - - # 构建文言文转换的专业提示词 - prompt = f"""你是一位精通古代文言文的文学大师,擅长将现代文转换为优美的文言文。请将以下现代文转换为文言文。 - -现代文:{modern_text} - -转换要求: -1. 风格:{style} -2. 文体:{article_type} -3. 保持原文的核心意思和情感色彩 -4. 使用恰当的文言文语法和词汇 -5. 注重音韵美感和文字的雅致 -6. 根据不同风格调整用词和句式 - -风格说明: -- 古雅:典雅庄重,用词考究,句式工整 -- 简洁:言简意赅,删繁就简,朴实无华 -- 华丽:辞藻华美,对仗工整,音韵和谐 -- 朴实:平实自然,通俗易懂,贴近生活 - -文体特点: -- 散文:行文自由,情理并茂 -- 诗歌:讲究韵律,意境深远 -- 议论文:逻辑严密,论证有力 -- 记叙文:叙事生动,描写细腻 -- 书信:格式规范,情真意切 -- 公文:庄重严肃,用词准确 - -请按以下JSON格式返回转换结果: -{{ - "classical_text": "转换后的文言文", - "translation_notes": "转换说明,包括重要词汇的选择理由和语法特点", - "style_analysis": "风格分析,说明如何体现所选风格特点", - "difficulty_level": "难度等级(初级/中级/高级)", - "key_phrases": [ - {{ - "modern": "现代词汇", - "classical": "对应文言文词汇", - "explanation": "转换说明" - }} - ], - "cultural_elements": "文化内涵说明,包含的典故、意象等" -}} - -只返回JSON格式的结果,不要包含其他文字。""" - - messages = [ - {"role": "user", "content": prompt} - ] - - # 使用DeepSeek进行文言文转换 - content, error = call_deepseek_api(messages) - - if error: - return jsonify({'error': error}), 500 - - return jsonify({ - 'success': True, - 'conversion_result': content, - 'modern_text': modern_text, - 'style': style, - 'article_type': article_type, - 'timestamp': datetime.now().isoformat() - }) - - except Exception as e: - return jsonify({'error': f'文言文转换失败: {str(e)}'}), 500 - -#AI表情制作器接口 -@aimodelapp_bp.route('/expression-maker', methods=['POST']) -@verify_user_coins -def expression_maker(): - """AI表情制作器接口""" - try: - data = request.get_json() - text = data.get('text', '').strip() - style = data.get('style', 'mixed').strip() - - if not text: - return jsonify({'error': '文字内容不能为空'}), 400 - - # 风格映射 - style_prompts = { - 'mixed': '混合使用Emoji表情和颜文字', - 'emoji': '仅使用Emoji表情符号', - 'kaomoji': '仅使用颜文字(日式表情符号)', - 'cute': '使用可爱风格的表情符号', - 'cool': '使用酷炫风格的表情符号' - } - - style_description = style_prompts.get(style, style_prompts['mixed']) - - # 构建表情制作的提示词 - prompt = f"""你是一个专业的表情符号专家,擅长为文字内容生成合适的表情符号。请根据以下文字内容生成相应的表情符号: - -文字内容:{text} -表情风格:{style_description} - -请为这个文字内容生成表情符号,要求: -1. 准确表达文字的情感和含义 -2. 符合指定的表情风格 -3. 提供多样化的选择 -4. 包含使用场景说明 - -请按以下分类生成表情符号: -1. Emoji表情(使用Unicode表情符号) -2. 颜文字(使用ASCII字符组成的表情) -3. 组合表情(多个符号组合使用) - -每个分类提供5个不同的表情选项,每个选项包含: -- 表情符号本身 -- 适用场景说明 -- 情感强度(轻微/中等/强烈) - -请按以下JSON格式返回: -{{ - "expressions": {{ - "emoji": [ - {{ - "symbol": "😊", - "description": "适用场景和情感说明", - "intensity": "中等", - "usage": "使用建议" - }} - ], - "kaomoji": [ - {{ - "symbol": "(^_^)", - "description": "适用场景和情感说明", - "intensity": "轻微", - "usage": "使用建议" - }} - ], - "combination": [ - {{ - "symbol": "🎉✨", - "description": "适用场景和情感说明", - "intensity": "强烈", - "usage": "使用建议" - }} - ] - }}, - "summary": {{ - "emotion_analysis": "对输入文字的情感分析", - "recommended_usage": "推荐的使用场景", - "style_notes": "风格特点说明" - }} -}} - -只返回JSON格式的结果,不要包含其他文字。""" - - messages = [ - {"role": "user", "content": prompt} - ] - - # 使用DeepSeek进行分析 - content, error = call_deepseek_api(messages) - - if error: - return jsonify({'error': error}), 500 - - # 解析AI返回的JSON格式数据 - try: - # 尝试直接解析JSON - ai_response = json.loads(content) - expressions = ai_response.get('expressions', {}) - summary = ai_response.get('summary', {}) - except json.JSONDecodeError: - # 如果直接解析失败,尝试提取JSON部分 - import re - json_match = re.search(r'\{[\s\S]*\}', content) - if json_match: - try: - ai_response = json.loads(json_match.group()) - expressions = ai_response.get('expressions', {}) - summary = ai_response.get('summary', {}) - except json.JSONDecodeError: - return jsonify({'error': 'AI返回的数据格式无法解析'}), 500 - else: - return jsonify({'error': 'AI返回的数据中未找到有效的JSON格式'}), 500 - - return jsonify({ - 'success': True, - 'expressions': expressions, - 'summary': summary, - 'text': text, - 'style': style, - 'timestamp': datetime.now().isoformat() - }) - - except Exception as e: - return jsonify({'error': f'表情制作失败: {str(e)}'}), 500 - -#Linux命令生成接口 -@aimodelapp_bp.route('/linux-command', methods=['POST']) -@verify_user_coins -def linux_command_generator(): - """Linux命令生成接口""" - try: - data = request.get_json() - task_description = data.get('task_description', '').strip() - difficulty_level = data.get('difficulty_level', 'beginner').strip() - - if not task_description: - return jsonify({'error': '任务描述不能为空'}), 400 - - # 构建Linux命令生成的专业提示词 - prompt = f"""你是一位Linux系统专家,请根据用户的任务描述生成相应的Linux命令。 - -任务描述:{task_description} -用户水平:{difficulty_level} - -请为这个任务生成合适的Linux命令,要求: -1. 命令准确可用,符合Linux标准 -2. 根据用户水平提供适当的复杂度 -3. 提供多种实现方式(如果有的话) -4. 包含安全提示和注意事项 -5. 解释每个命令的作用和参数 - -用户水平说明: -- beginner(初学者):提供基础命令,详细解释 -- intermediate(中级):提供常用命令和选项 -- advanced(高级):提供高效命令和高级用法 - -请按以下JSON格式返回: -{{ - "commands": [ - {{ - "command": "具体的Linux命令", - "description": "命令的详细说明", - "safety_level": "safe/caution/dangerous", - "explanation": "命令各部分的解释", - "example_output": "预期的命令输出示例", - "alternatives": ["替代命令1", "替代命令2"] - }} - ], - "safety_warnings": ["安全提示1", "安全提示2"], - "prerequisites": ["前置条件1", "前置条件2"], - "related_concepts": ["相关概念1", "相关概念2"] -}} - -只返回JSON格式的结果,不要包含其他文字。""" - - messages = [ - {"role": "user", "content": prompt} - ] - - # 使用DeepSeek进行命令生成 - content, error = call_deepseek_api(messages) - - if error: - return jsonify({'error': error}), 500 - - return jsonify({ - 'success': True, - 'command_result': content, - 'task_description': task_description, - 'difficulty_level': difficulty_level, - 'timestamp': datetime.now().isoformat() - }) - - except Exception as e: - return jsonify({'error': f'Linux命令生成失败: {str(e)}'}), 500 - -#AI文章排版(Markdown格式化)接口 -@aimodelapp_bp.route('/markdown_formatting', methods=['POST']) -@verify_user_coins -def markdown_formatting(): - """AI文章排版(Markdown格式化)接口""" - try: - data = request.get_json() - article_text = data.get('article_text', '').strip() - emoji_style = data.get('emoji_style', 'balanced').strip() - markdown_option = data.get('markdown_option', 'standard').strip() - - if not article_text: - return jsonify({'error': '文章内容不能为空'}), 400 - - # 构建Markdown排版的提示词 - prompt = f"""你是一位专业的文档排版助手。请将用户提供的全文按“标准Markdown格式”进行排版,并在不改变任何原文内容的前提下进行结构化呈现。严格遵守以下规则: - -1) 保留所有原始内容,严禁改写、删减或添加新内容。 -2) 使用合理的Markdown结构(标题、分节、段落、列表、引用、表格如有必要、代码块仅当原文包含)。 -3) 智能添加适量Emoji以增强可读性({emoji_style}),在标题、关键句、列表项等处点缀;避免过度使用,保持专业。 -4) 保持语言与语气不变,只优化排版和表现形式。 -5) 输出“纯Markdown文本”,不要包含任何JSON、HTML、XML、解释文字、或代码块围栏标记(例如不要在最外层使用```)。 - -如果原文本较长,可在开头自动生成简洁的“目录”以便阅读。 - -原文如下: -{article_text} -""" - - messages = [{"role": "user", "content": prompt}] - - # 使用DeepSeek进行排版生成 - content, error = call_deepseek_api(messages) - - if error: - return jsonify({'error': error}), 500 - - # 返回AI生成的Markdown文本 - return jsonify({ - 'success': True, - 'formatted_markdown': content, - 'source_text': article_text, - 'emoji_style': emoji_style, - 'markdown_option': markdown_option, - 'timestamp': datetime.now().isoformat() - }) - - except Exception as e: - return jsonify({'error': f'文章排版失败: {str(e)}'}), 500 - -#获取用户萌芽币余额 -@aimodelapp_bp.route('/coins', methods=['GET']) -def get_user_coins(): - """获取用户萌芽币余额""" - try: - # 获取用户认证信息 - token = request.headers.get('Authorization') - if not token: - return jsonify({ - 'success': False, - 'message': '未提供认证信息', - 'error_code': 'auth_required' - }), 401 - - if token.startswith('Bearer '): - token = token[7:] - - # 解析JWT token - import jwt - try: - payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256']) - user_id = payload['user_id'] - except jwt.ExpiredSignatureError: - return jsonify({ - 'success': False, - 'message': 'Token已过期,请重新登录', - 'error_code': 'token_expired' - }), 401 - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'无效的认证信息: {str(e)}', - 'error_code': 'invalid_token' - }), 401 - - # 查询用户萌芽币余额 - users_collection = current_app.mongo.db.userdata - user = users_collection.find_one({'_id': ObjectId(user_id)}) - - if not user: - return jsonify({ - 'success': False, - 'message': '用户不存在', - 'error_code': 'user_not_found' - }), 404 - - # 返回萌芽币信息 - current_coins = user.get('萌芽币', 0) - username = user.get('用户名', '用户') - - # 增加额外有用信息 - ai_usage_history = [] - if 'ai_usage_history' in user: - ai_usage_history = user['ai_usage_history'][-5:] # 最近5条使用记录 - - return jsonify({ - 'success': True, - 'data': { - 'coins': current_coins, - 'ai_cost': AI_COST, - 'can_use_ai': current_coins >= AI_COST, - 'username': username, - 'usage_count': len(ai_usage_history), - 'recent_usage': ai_usage_history - }, - 'message': f'当前萌芽币余额: {current_coins}' - }), 200 - except Exception as e: - return jsonify({ - 'success': False, - 'message': '处理请求时出错', - 'error': str(e) - }), 500 - -#获取可用的AI模型列表 -@aimodelapp_bp.route('/models', methods=['GET']) -def get_available_models(): - """获取可用的AI模型列表""" - try: - config = load_ai_config() - if not config: - return jsonify({'error': 'AI配置加载失败'}), 500 - - models = {} - for provider, provider_config in config.items(): - if 'model' in provider_config: - models[provider] = provider_config['model'] - - return jsonify({ - 'success': True, - 'models': models, - 'default_provider': 'deepseek', - 'default_model': 'deepseek-chat' - }) - - except Exception as e: - return jsonify({'error': f'获取模型列表失败: {str(e)}'}), 500 - -#中国亲戚称呼计算器接口(普通话版 + 方言) -@aimodelapp_bp.route('/kinship-calculator', methods=['POST']) -@verify_user_coins -def kinship_calculator(): - """中国亲戚称呼计算器接口""" - try: - data = request.get_json() or {} - relation_chain = (data.get('relation_chain') or '').strip() - dialects = data.get('dialects') # 可选,指定方言列表 - - if not relation_chain: - return jsonify({'error': '亲属关系链不能为空'}), 400 - - # 组装提示词:要求严格JSON输出 - requested_dialects = dialects if isinstance(dialects, list) and dialects else [ - '粤语', '闽南语', '上海话', '四川话', '东北话', '客家话' - ] - - prompt = f"""你是一位中国亲属称呼专家。请解析下面的亲属关系链,给出最终的亲属称呼。 -输入的关系链会用“的”连接,如“妈妈的爸爸”“爸爸的姐姐的儿子”。 - -请遵循: -1) 以中国大陆通行的标准普通话称呼为准,给出最常用、规范的最终称呼。 -2) 同时给出若干方言的对应称呼:{', '.join(requested_dialects)}。 -3) 如存在地区差异或性别歧义,请在notes中说明,但最终给出一个最常用称呼。 -4) 不要展示推理过程;只输出JSON。 - -严格按以下JSON结构输出: -{{ - "mandarin_title": "标准普通话称呼", - "dialect_titles": {{ - "粤语": {{"title": "称呼", "romanization": "粤拼或发音", "notes": "可选说明"}}, - "闽南语": {{"title": "称呼", "romanization": "白话字或发音", "notes": "可选说明"}}, - "上海话": {{"title": "称呼", "romanization": "拟音或IPA", "notes": "可选说明"}}, - "四川话": {{"title": "称呼", "romanization": "拟音或IPA", "notes": "可选说明"}}, - "东北话": {{"title": "称呼", "romanization": "拟音或IPA", "notes": "可选说明"}}, - "客家话": {{"title": "称呼", "romanization": "客家话拟音", "notes": "可选说明"}} - }}, - "notes": "总体说明(如地区差异、辈分方向、父系/母系等提示)" -}} - -关系链: -{relation_chain} -""" - - messages = [{"role": "user", "content": prompt}] - content, error = call_deepseek_api(messages) - - if error: - return jsonify({'error': error}), 500 - - # 解析AI返回的JSON - try: - result = json.loads(content) - except json.JSONDecodeError: - import re - m = re.search(r'\{[\s\S]*\}', content) - if not m: - return jsonify({'error': 'AI返回的数据中未找到有效JSON'}), 500 - try: - result = json.loads(m.group()) - except Exception: - return jsonify({'error': 'AI返回的JSON格式无法解析'}), 500 - - mandarin_title = result.get('mandarin_title') - dialect_titles = result.get('dialect_titles', {}) - notes = result.get('notes', '') - - if not mandarin_title: - return jsonify({'error': '未获得标准普通话称呼'}), 500 - - return jsonify({ - 'success': True, - 'relation_chain': relation_chain, - 'mandarin_title': mandarin_title, - 'dialect_titles': dialect_titles, - 'notes': notes, - 'timestamp': datetime.now().isoformat() - }) - - except Exception as e: - return jsonify({'error': f'亲戚称呼计算失败: {str(e)}'}), 500 \ No newline at end of file diff --git a/InfoGenie-backend/modules/auth.py b/InfoGenie-backend/modules/auth.py deleted file mode 100755 index 1f186701..00000000 --- a/InfoGenie-backend/modules/auth.py +++ /dev/null @@ -1,455 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -用户认证模块 -Created by: 万象口袋 -Date: 2025-09-02 -""" - -from flask import Blueprint, request, jsonify, current_app -from werkzeug.security import generate_password_hash, check_password_hash -import hashlib -import re -import jwt -from datetime import datetime, timedelta -from functools import wraps -from .email_service import send_verification_email, verify_code, is_qq_email, get_qq_avatar_url - -auth_bp = Blueprint('auth', __name__) - -#生成JWT token -def generate_token(user_data): - """生成JWT token""" - payload = { - 'user_id': user_data['user_id'], - 'email': user_data['email'], - 'username': user_data['username'], - 'exp': datetime.utcnow() + timedelta(days=7), # 7天过期 - 'iat': datetime.utcnow() - } - return jwt.encode(payload, current_app.config['SECRET_KEY'], algorithm='HS256') - -#验证JWT token -def verify_token(token): - """验证JWT token""" - try: - payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256']) - return {'success': True, 'data': payload} - except jwt.ExpiredSignatureError: - return {'success': False, 'message': 'Token已过期'} - except jwt.InvalidTokenError: - return {'success': False, 'message': 'Token无效'} - -#JWT token验证装饰器 -def token_required(f): - """JWT token验证装饰器""" - @wraps(f) - def decorated(*args, **kwargs): - token = request.headers.get('Authorization') - if not token: - return jsonify({'success': False, 'message': '缺少认证token'}), 401 - - if token.startswith('Bearer '): - token = token[7:] - - result = verify_token(token) - if not result['success']: - return jsonify({'success': False, 'message': result['message']}), 401 - - request.current_user = result['data'] - return f(*args, **kwargs) - return decorated - -#验证QQ邮箱格式 -def validate_qq_email(email): - """验证QQ邮箱格式""" - return is_qq_email(email) - -#验证密码格式 -def validate_password(password): - """验证密码格式(6-20位)""" - return 6 <= len(password) <= 20 - - -#==========================对外暴露的HTTP接口========================== -#发送验证码邮件 -@auth_bp.route('/send-verification', methods=['POST']) -def send_verification(): - """发送验证码邮件""" - try: - data = request.get_json() - email = data.get('email', '').strip() - verification_type = data.get('type', 'register') # register, login - - # 参数验证 - if not email: - return jsonify({ - 'success': False, - 'message': '邮箱地址不能为空' - }), 400 - - if not validate_qq_email(email): - return jsonify({ - 'success': False, - 'message': '仅支持QQ邮箱(qq.com、vip.qq.com、foxmail.com)' - }), 400 - - # 获取数据库集合 - db = current_app.mongo.db - users_collection = db.userdata - - # 检查邮箱是否已注册 - existing_user = users_collection.find_one({'邮箱': email}) - - if verification_type == 'register' and existing_user: - return jsonify({ - 'success': False, - 'message': '该邮箱已被注册' - }), 409 - - if verification_type == 'login' and not existing_user: - return jsonify({ - 'success': False, - 'message': '该邮箱尚未注册' - }), 404 - - # 发送验证码 - result = send_verification_email(email, verification_type) - - if result['success']: - return jsonify(result), 200 - else: - return jsonify(result), 500 - - except Exception as e: - current_app.logger.error(f"发送验证码失败: {str(e)}") - return jsonify({ - 'success': False, - 'message': '发送失败,请稍后重试' - }), 500 - -#验证验证码 -@auth_bp.route('/verify-code', methods=['POST']) -def verify_verification_code(): - """验证验证码""" - try: - data = request.get_json() - email = data.get('email', '').strip() - code = data.get('code', '').strip() - - # 参数验证 - if not email or not code: - return jsonify({ - 'success': False, - 'message': '邮箱和验证码不能为空' - }), 400 - - # 验证码校验 - result = verify_code(email, code) - - if result['success']: - return jsonify(result), 200 - else: - return jsonify(result), 400 - - except Exception as e: - current_app.logger.error(f"验证码校验失败: {str(e)}") - return jsonify({ - 'success': False, - 'message': '验证失败,请稍后重试' - }), 500 - -#用户注册 -@auth_bp.route('/register', methods=['POST']) -def register(): - """用户注册(需要先验证邮箱)""" - try: - data = request.get_json() - email = data.get('email', '').strip() - username = data.get('username', '').strip() - password = data.get('password', '').strip() - code = data.get('code', '').strip() - - # 参数验证 - if not all([email, username, password, code]): - return jsonify({ - 'success': False, - 'message': '所有字段都不能为空' - }), 400 - - if not validate_qq_email(email): - return jsonify({ - 'success': False, - 'message': '仅支持QQ邮箱注册' - }), 400 - - if not validate_password(password): - return jsonify({ - 'success': False, - 'message': '密码长度必须在6-20位之间' - }), 400 - - # 验证验证码 - verify_result = verify_code(email, code) - if not verify_result['success'] or verify_result.get('type') != 'register': - return jsonify({ - 'success': False, - 'message': '验证码无效或已过期' - }), 400 - - # 获取数据库集合 - db = current_app.mongo.db - users_collection = db.userdata - - # 检查邮箱是否已被注册 - if users_collection.find_one({'邮箱': email}): - return jsonify({ - 'success': False, - 'message': '该邮箱已被注册' - }), 409 - - # 检查用户名是否已被使用 - if users_collection.find_one({'用户名': username}): - return jsonify({ - 'success': False, - 'message': '该用户名已被使用' - }), 409 - - # 获取QQ头像 - avatar_url = get_qq_avatar_url(email) - - # 创建新用户 - password_hash = generate_password_hash(password) - user_data = { - '邮箱': email, - '用户名': username, - '密码': password_hash, - '头像': avatar_url, - '注册时间': datetime.now().isoformat(), - '最后登录': None, - '登录次数': 0, - '用户状态': 'active', - '等级': 0, - '经验': 0, - '萌芽币': 0, - '签到系统': { - '连续签到天数': 0, - '今日是否已签到': False, - '签到时间': '2025-01-01' - } - } - - result = users_collection.insert_one(user_data) - - if result.inserted_id: - return jsonify({ - 'success': True, - 'message': '注册成功!', - 'user': { - 'email': email, - 'username': username, - 'avatar': avatar_url - } - }), 201 - else: - return jsonify({ - 'success': False, - 'message': '注册失败,请稍后重试' - }), 500 - - except Exception as e: - current_app.logger.error(f"注册失败: {str(e)}") - return jsonify({ - 'success': False, - 'message': '注册失败,请稍后重试' - }), 500 - -#用户登录 -@auth_bp.route('/login', methods=['POST']) -def login(): - """用户登录(支持邮箱+验证码或邮箱+密码)""" - try: - data = request.get_json() - email = data.get('email', '').strip() - password = data.get('password', '').strip() - code = data.get('code', '').strip() - - # 参数验证 - if not email: - return jsonify({ - 'success': False, - 'message': '邮箱地址不能为空' - }), 400 - - if not validate_qq_email(email): - return jsonify({ - 'success': False, - 'message': '仅支持QQ邮箱登录' - }), 400 - - # 获取数据库集合 - db = current_app.mongo.db - users_collection = db.userdata - - # 查找用户 - user = users_collection.find_one({'邮箱': email}) - - if not user: - return jsonify({ - 'success': False, - 'message': '该邮箱尚未注册' - }), 404 - - # 检查用户状态 - if user.get('用户状态') != 'active': - return jsonify({ - 'success': False, - 'message': '账号已被禁用,请联系管理员' - }), 403 - - # 验证方式:验证码登录或密码登录 - if code: - # 验证码登录 - verify_result = verify_code(email, code) - if not verify_result['success'] or verify_result.get('type') != 'login': - return jsonify({ - 'success': False, - 'message': '验证码无效或已过期' - }), 400 - elif password: - # 密码登录 - if not check_password_hash(user['密码'], password): - return jsonify({ - 'success': False, - 'message': '密码错误' - }), 401 - else: - return jsonify({ - 'success': False, - 'message': '请输入密码或验证码' - }), 400 - - # 登录成功,更新用户信息 - users_collection.update_one( - {'邮箱': email}, - { - '$set': {'最后登录': datetime.now().isoformat()}, - '$inc': {'登录次数': 1} - } - ) - - # 生成JWT token - user_data = { - 'user_id': str(user['_id']), - 'email': email, - 'username': user.get('用户名', '') - } - token = generate_token(user_data) - - return jsonify({ - 'success': True, - 'message': '登录成功!', - 'token': token, - 'user': { - 'id': str(user['_id']), - 'email': email, - 'username': user.get('用户名', ''), - 'avatar': user.get('头像', ''), - 'login_count': user.get('登录次数', 0) + 1 - } - }), 200 - - except Exception as e: - current_app.logger.error(f"登录失败: {str(e)}") - return jsonify({ - 'success': False, - 'message': '登录失败,请稍后重试' - }), 500 - - # 登录成功,创建会话 - hwt = getattr(request, 'hwt', {}) - hwt['user_id'] = str(user['_id']) - hwt['account'] = user['账号'] - hwt['logged_in'] = True - - # 更新登录信息 - users_collection.update_one( - {'_id': user['_id']}, - { - '$set': {'最后登录': datetime.now().isoformat()}, - '$inc': {'登录次数': 1} - } - ) - - return jsonify({ - 'success': True, - 'message': '登录成功!', - 'user': { - 'account': user['账号'], - 'last_login': user.get('最后登录'), - 'login_count': user.get('登录次数', 0) + 1 - } - }), 200 - - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -#用户登出 -@auth_bp.route('/logout', methods=['POST']) -def logout(): - """用户登出""" - try: - # JWT是无状态的,客户端删除token即可 - return jsonify({ - 'success': True, - 'message': '已成功登出' - }), 200 - - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -#检查登录状态 -@auth_bp.route('/check', methods=['GET']) -def check_login(): - """检查登录状态""" - try: - token = request.headers.get('Authorization') - if not token: - return jsonify({ - 'success': True, - 'logged_in': False - }), 200 - - if token.startswith('Bearer '): - token = token[7:] - - result = verify_token(token) - if result['success']: - user_data = result['data'] - return jsonify({ - 'success': True, - 'logged_in': True, - 'user': { - 'id': user_data['user_id'], - 'email': user_data['email'], - 'username': user_data['username'] - } - }), 200 - else: - return jsonify({ - 'success': True, - 'logged_in': False - }), 200 - - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 -#==========================对外暴露的HTTP接口========================== \ No newline at end of file diff --git a/InfoGenie-backend/modules/email_service.py b/InfoGenie-backend/modules/email_service.py deleted file mode 100755 index 56244858..00000000 --- a/InfoGenie-backend/modules/email_service.py +++ /dev/null @@ -1,283 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -邮件发送模块 -负责处理用户注册、登录验证邮件 -""" - -import random -import string -import smtplib -from datetime import datetime, timedelta -from email.mime.text import MIMEText -from email.header import Header -from flask import current_app -import logging -import os - -# 验证码存储(生产环境建议使用Redis) -verification_codes = {} - -# 初始化日志 -def init_mail(app): - """初始化邮件配置""" - # 使用smtplib直接发送,不需要Flask-Mail - pass - -# 生成验证码 -def generate_verification_code(length=6): - """生成验证码""" - return ''.join(random.choices(string.digits, k=length)) - -# 发送验证邮件 -def send_verification_email(email, verification_type='register'): - """ - 发送验证邮件 - - Args: - email: 收件人邮箱 - verification_type: 验证类型 ('register', 'login', 'reset_password') - - Returns: - dict: 发送结果 - """ - try: - # 验证QQ邮箱格式 - if not is_qq_email(email): - return { - 'success': False, - 'message': '仅支持QQ邮箱注册登录' - } - - # 生成验证码 - code = generate_verification_code() - - # 存储验证码(5分钟有效期) - verification_codes[email] = { - 'code': code, - 'type': verification_type, - 'expires_at': datetime.now() + timedelta(minutes=5), - 'attempts': 0 - } - - # 获取邮件配置 - 使用与QQEmailSendAPI相同的配置 - sender_email = os.environ.get('MAIL_USERNAME', '3205788256@qq.com') - sender_password = os.environ.get('MAIL_PASSWORD', 'szcaxvbftusqddhi') - - # 邮件模板 - if verification_type == 'register': - subject = '【万象口袋】注册验证码' - html_content = f''' - - -
-
-

万象口袋

-

欢迎注册万象口袋

-
- -
-

验证码

-
- {code} -
-

请在5分钟内输入此验证码完成注册

-
- -
-

- 如果您没有申请注册,请忽略此邮件
- 此验证码5分钟内有效,请勿泄露给他人 -

-
-
- - - ''' - else: # login - subject = '【InfoGenie】登录验证码' - html_content = f''' - - -
-
-

InfoGenie 万象口袋

-

安全登录验证

-
- -
-

登录验证码

-
- {code} -
-

请在5分钟内输入此验证码完成登录

-
- -
-

- 如果不是您本人操作,请检查账户安全
- 此验证码5分钟内有效,请勿泄露给他人 -

-
-
- - - ''' - - # 创建邮件 - 使用与QQEmailSendAPI相同的方式 - message = MIMEText(html_content, 'html', 'utf-8') - message['From'] = sender_email # 直接使用邮箱地址,不使用Header包装 - message['To'] = email - message['Subject'] = Header(subject, 'utf-8') - - # 发送邮件 - 使用SSL端口465 - try: - # 使用与QQEmailSendAPI相同的连接方式 - smtp_obj = smtplib.SMTP_SSL('smtp.qq.com', 465) - smtp_obj.login(sender_email, sender_password) - smtp_obj.sendmail(sender_email, [email], message.as_string()) - smtp_obj.quit() - - print(f"验证码邮件发送成功: {email}") - return { - 'success': True, - 'message': '验证码已发送到您的邮箱', - 'email': email - } - - except smtplib.SMTPAuthenticationError as auth_error: - print(f"SMTP认证失败: {str(auth_error)}") - return { - 'success': False, - 'message': 'SMTP认证失败,请检查邮箱配置' - } - except smtplib.SMTPConnectError as conn_error: - print(f"SMTP连接失败: {str(conn_error)}") - return { - 'success': False, - 'message': 'SMTP服务器连接失败' - } - except Exception as smtp_error: - print(f"SMTP发送失败: {str(smtp_error)}") - return { - 'success': False, - 'message': f'邮件发送失败: {str(smtp_error)}' - } - - except Exception as e: - print(f"邮件发送失败: {str(e)}") - return { - 'success': False, - 'message': '邮件发送失败,请稍后重试' - } - -# 验证验证码 -def verify_code(email, code): - """ - 验证验证码 - - Args: - email: 邮箱地址 - code: 验证码 - - Returns: - dict: 验证结果 - """ - if email not in verification_codes: - return { - 'success': False, - 'message': '验证码不存在或已过期' - } - - stored_info = verification_codes[email] - - # 检查过期时间 - if datetime.now() > stored_info['expires_at']: - del verification_codes[email] - return { - 'success': False, - 'message': '验证码已过期,请重新获取' - } - - # 检查尝试次数 - if stored_info['attempts'] >= 3: - del verification_codes[email] - return { - 'success': False, - 'message': '验证码输入错误次数过多,请重新获取' - } - - # 验证码校验 - if stored_info['code'] != code: - stored_info['attempts'] += 1 - return { - 'success': False, - 'message': f'验证码错误,还可尝试{3 - stored_info["attempts"]}次' - } - - # 验证成功,删除验证码 - verification_type = stored_info['type'] - del verification_codes[email] - - return { - 'success': True, - 'message': '验证码验证成功', - 'type': verification_type - } - -# 验证QQ邮箱格式 -def is_qq_email(email): - """ - 验证是否为QQ邮箱 - - Args: - email: 邮箱地址 - - Returns: - bool: 是否为QQ邮箱 - """ - if not email or '@' not in email: - return False - - domain = email.split('@')[1].lower() - qq_domains = ['qq.com', 'vip.qq.com', 'foxmail.com'] - - return domain in qq_domains - -# 获取QQ头像URL -def get_qq_avatar_url(email): - """ - 根据QQ邮箱获取QQ头像URL - - Args: - email: QQ邮箱地址 - - Returns: - str: QQ头像URL - """ - if not is_qq_email(email): - return None - - # 提取QQ号码 - qq_number = email.split('@')[0] - - # 验证是否为纯数字(QQ号) - if not qq_number.isdigit(): - return None - - # 返回QQ头像API URL - return f"https://q1.qlogo.cn/g?b=qq&nk={qq_number}&s=100" - -# 清理过期验证码 -def cleanup_expired_codes(): - """清理过期的验证码""" - current_time = datetime.now() - expired_emails = [ - email for email, info in verification_codes.items() - if current_time > info['expires_at'] - ] - - for email in expired_emails: - del verification_codes[email] - - return len(expired_emails) \ No newline at end of file diff --git a/InfoGenie-backend/modules/user_management.py b/InfoGenie-backend/modules/user_management.py deleted file mode 100755 index 6bac4343..00000000 --- a/InfoGenie-backend/modules/user_management.py +++ /dev/null @@ -1,550 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -用户管理模块 -Created by: 万象口袋 -Date: 2025-09-02 -""" - -from flask import Blueprint, request, jsonify, current_app -from datetime import datetime -from bson import ObjectId -import jwt -from functools import wraps - -user_bp = Blueprint('user', __name__) - -# 验证JWT token -def verify_token(token): - """验证JWT token""" - try: - payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256']) - return {'success': True, 'data': payload} - except jwt.ExpiredSignatureError: - return {'success': False, 'message': 'Token已过期'} - except jwt.InvalidTokenError: - return {'success': False, 'message': 'Token无效'} - -# 登录验证装饰器(支持JWT token和hwt) -def login_required(f): - """登录验证装饰器(支持JWT token和hwt)""" - @wraps(f) - def decorated_function(*args, **kwargs): - # 优先检查JWT token - token = request.headers.get('Authorization') - if token: - if token.startswith('Bearer '): - token = token[7:] - - result = verify_token(token) - if result['success']: - request.current_user = result['data'] - return f(*args, **kwargs) - # 回退到hwt验证 - hwt = getattr(request, 'hwt', {}) - if not hwt.get('logged_in'): - return jsonify({ - 'success': False, - 'message': '请先登录' - }), 401 - return f(*args, **kwargs) - return decorated_function - return decorated_function - - -#==========================对外暴露的HTTP接口========================== -# 获取用户资料 -@user_bp.route('/profile', methods=['GET']) -@login_required -def get_profile(): - """获取用户资料""" - try: - # 优先从JWT token获取用户信息 - user_id = None - if hasattr(request, 'current_user') and request.current_user: - user_id = request.current_user.get('user_id') - else: - # 回退到hwt验证 - hwt = getattr(request, 'hwt', {}) - user_id = hwt.get('user_id') - - if not user_id: - return jsonify({ - 'success': False, - 'message': '无法获取用户信息' - }), 401 - - users_collection = current_app.mongo.db.userdata - user = users_collection.find_one({'_id': ObjectId(user_id)}) - if not user: - return jsonify({ - 'success': False, - 'message': '用户不存在' - }), 404 - # 返回用户信息(不包含密码) - profile = { - 'account': user.get('邮箱'), - 'username': user.get('用户名'), - 'avatar': user.get('头像'), - 'register_time': user.get('注册时间'), - 'last_login': user.get('最后登录'), - 'login_count': user.get('登录次数', 0), - 'status': user.get('用户状态', 'active'), - 'level': user.get('等级', 1), - 'experience': user.get('经验', 0), - 'coins': user.get('萌芽币', 0) - } - return jsonify({ - 'success': True, - 'data': profile - }), 200 - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -# 为指定账号增加萌芽币 -@user_bp.route('/add-coins', methods=['POST']) -@login_required -def add_coins(): - """为指定账号增加萌芽币(支持email或username指定账号,amount为正整数)""" - try: - data = request.get_json() or {} - email = (data.get('email') or '').strip() - username = (data.get('username') or '').strip() - amount = data.get('amount') - - # 参数校验 - if not email and not username: - return jsonify({ - 'success': False, - 'message': '请提供email或username其中之一' - }), 400 - - if amount is None: - return jsonify({ - 'success': False, - 'message': 'amount不能为空' - }), 400 - - try: - amount_int = int(amount) - except Exception: - return jsonify({ - 'success': False, - 'message': 'amount必须为整数' - }), 400 - - if amount_int <= 0: - return jsonify({ - 'success': False, - 'message': 'amount必须为正整数' - }), 400 - - users_collection = current_app.mongo.db.userdata - query = {'邮箱': email} if email else {'用户名': username} - user = users_collection.find_one(query) - if not user: - return jsonify({ - 'success': False, - 'message': '用户不存在' - }), 404 - - before_coins = user.get('萌芽币', 0) - update_result = users_collection.update_one(query, {'$inc': {'萌芽币': amount_int}}) - - if update_result.modified_count == 0: - return jsonify({ - 'success': False, - 'message': '更新失败,请稍后重试' - }), 500 - - updated = users_collection.find_one({'_id': user['_id']}) - new_coins = updated.get('萌芽币', before_coins) - - return jsonify({ - 'success': True, - 'message': f"已为账户{email or username}增加{amount_int}萌芽币", - 'data': { - 'before_coins': before_coins, - 'added': amount_int, - 'new_coins': new_coins, - 'user': { - 'id': str(updated.get('_id')), - 'email': updated.get('邮箱'), - 'username': updated.get('用户名'), - 'avatar': updated.get('头像'), - 'register_time': updated.get('注册时间'), - 'last_login': updated.get('最后登录'), - 'login_count': updated.get('登录次数', 0), - 'status': updated.get('用户状态', 'active'), - 'level': updated.get('等级', 0), - 'experience': updated.get('经验', 0), - 'coins': new_coins - } - } - }), 200 - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -# 列出所有用户 -@user_bp.route('/list', methods=['GET']) -@login_required -def list_users(): - """列出所有用户(不返回密码)""" - try: - users_collection = current_app.mongo.db.userdata - cursor = users_collection.find({}, {'密码': 0}) - users = [] - for u in cursor: - users.append({ - 'id': str(u.get('_id')), - 'email': u.get('邮箱'), - 'username': u.get('用户名'), - 'avatar': u.get('头像'), - 'register_time': u.get('注册时间'), - 'last_login': u.get('最后登录'), - 'login_count': u.get('登录次数', 0), - 'status': u.get('用户状态', 'active'), - 'level': u.get('等级', 0), - 'experience': u.get('经验', 0), - 'coins': u.get('萌芽币', 0) - }) - return jsonify({ - 'success': True, - 'count': len(users), - 'data': users - }), 200 - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -# 修改密码 -@user_bp.route('/change-password', methods=['POST']) -@login_required -def change_password(): - """修改密码""" - try: - data = request.get_json() - old_password = data.get('old_password', '').strip() - new_password = data.get('new_password', '').strip() - - if not old_password or not new_password: - return jsonify({ - 'success': False, - 'message': '旧密码和新密码不能为空' - }), 400 - - if len(new_password) < 6 or len(new_password) > 20: - return jsonify({ - 'success': False, - 'message': '新密码长度必须在6-20位之间' - }), 400 - - hwt = getattr(request, 'hwt', {}) - user_id = hwt.get('user_id') - users_collection = current_app.mongo.db.userdata - user = users_collection.find_one({'_id': ObjectId(user_id)}) - if not user: - return jsonify({ - 'success': False, - 'message': '用户不存在' - }), 404 - from werkzeug.security import check_password_hash, generate_password_hash - # 验证旧密码 - if not check_password_hash(user['密码'], old_password): - return jsonify({ - 'success': False, - 'message': '原密码错误' - }), 401 - # 更新密码 - new_password_hash = generate_password_hash(new_password) - result = users_collection.update_one( - {'_id': ObjectId(user_id)}, - {'$set': {'密码': new_password_hash}} - ) - if result.modified_count > 0: - return jsonify({ - 'success': True, - 'message': '密码修改成功' - }), 200 - else: - return jsonify({ - 'success': False, - 'message': '密码修改失败' - }), 500 - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -# 获取用户统计信息 -@user_bp.route('/stats', methods=['GET']) -@login_required -def get_user_stats(): - """获取用户统计信息""" - try: - hwt = getattr(request, 'hwt', {}) - user_id = hwt.get('user_id') - # 这里可以添加更多统计信息,比如API调用次数等 - stats = { - 'login_today': 1, # 今日登录次数 - 'api_calls_today': 0, # 今日API调用次数 - 'total_api_calls': 0, # 总API调用次数 - 'join_days': 1, # 加入天数 - 'last_activity': datetime.now().isoformat() - } - return jsonify({ - 'success': True, - 'data': stats - }), 200 - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -# 获取用户游戏数据 -@user_bp.route('/game-data', methods=['GET']) -@login_required -def get_user_game_data(): - """获取用户游戏数据""" - try: - # 优先从JWT token获取用户ID - if hasattr(request, 'current_user'): - user_id = request.current_user['user_id'] - else: - hwt = getattr(request, 'hwt', {}) - user_id = hwt.get('user_id') - - users_collection = current_app.mongo.db.userdata - - user = users_collection.find_one({'_id': ObjectId(user_id)}) - - if not user: - return jsonify({ - 'success': False, - 'message': '用户不存在' - }), 404 - - # 返回用户游戏数据 - game_data = { - 'level': user.get('等级', 0), - 'experience': user.get('经验', 0), - 'coins': user.get('萌芽币', 0), - 'checkin_system': user.get('签到系统', { - '连续签到天数': 0, - '今日是否已签到': False, - '签到时间': '2025-01-01' - }) - } - - return jsonify({ - 'success': True, - 'data': game_data - }), 200 - - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -# 每日签到 -@user_bp.route('/checkin', methods=['POST']) -@login_required -def daily_checkin(): - """每日签到""" - try: - # 优先从JWT token获取用户ID - if hasattr(request, 'current_user'): - user_id = request.current_user['user_id'] - else: - hwt = getattr(request, 'hwt', {}) - user_id = hwt.get('user_id') - - users_collection = current_app.mongo.db.userdata - - user = users_collection.find_one({'_id': ObjectId(user_id)}) - - if not user: - return jsonify({ - 'success': False, - 'message': '用户不存在' - }), 404 - - # 获取当前日期 - today = datetime.now().strftime('%Y-%m-%d') - - # 获取签到系统数据 - checkin_system = user.get('签到系统', { - '连续签到天数': 0, - '今日是否已签到': False, - '签到时间': '2025-01-01' - }) - - # 检查今日是否已签到 - if checkin_system.get('今日是否已签到', False) and checkin_system.get('签到时间') == today: - return jsonify({ - 'success': False, - 'message': '今日已签到,请明天再来!' - }), 400 - - # 计算连续签到天数 - last_checkin_date = checkin_system.get('签到时间', '2025-01-01') - consecutive_days = checkin_system.get('连续签到天数', 0) - - # 检查是否连续签到 - if last_checkin_date: - try: - last_date = datetime.strptime(last_checkin_date, '%Y-%m-%d') - today_date = datetime.strptime(today, '%Y-%m-%d') - days_diff = (today_date - last_date).days - - if days_diff == 1: - # 连续签到 - consecutive_days += 1 - elif days_diff > 1: - # 断签,重新开始 - consecutive_days = 1 - else: - # 同一天,不应该发生 - consecutive_days = consecutive_days - except: - consecutive_days = 1 - else: - consecutive_days = 1 - - # 签到奖励 - coin_reward = 300 - exp_reward = 200 - - # 获取当前用户数据 - current_coins = user.get('萌芽币', 0) - current_exp = user.get('经验', 0) - current_level = user.get('等级', 0) - - # 计算新的经验和等级 - new_exp = current_exp + exp_reward - new_level = current_level - - # 等级升级逻辑:100 × 1.2^(等级) - while True: - exp_needed = int(100 * (1.2 ** new_level)) - if new_exp >= exp_needed: - new_exp -= exp_needed - new_level += 1 - else: - break - - # 更新用户数据 - update_data = { - '萌芽币': current_coins + coin_reward, - '经验': new_exp, - '等级': new_level, - '签到系统': { - '连续签到天数': consecutive_days, - '今日是否已签到': True, - '签到时间': today - } - } - - result = users_collection.update_one( - {'_id': ObjectId(user_id)}, - {'$set': update_data} - ) - - if result.modified_count > 0: - level_up = new_level > current_level - return jsonify({ - 'success': True, - 'message': '签到成功!', - 'data': { - 'coin_reward': coin_reward, - 'exp_reward': exp_reward, - 'consecutive_days': consecutive_days, - 'level_up': level_up, - 'new_level': new_level, - 'new_coins': current_coins + coin_reward, - 'new_exp': new_exp - } - }), 200 - else: - return jsonify({ - 'success': False, - 'message': '签到失败,请稍后重试' - }), 500 - - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -# 删除账户 -@user_bp.route('/delete', methods=['POST']) -@login_required -def delete_account(): - """删除账户""" - try: - data = request.get_json() - password = data.get('password', '').strip() - - if not password: - return jsonify({ - 'success': False, - 'message': '请输入密码确认删除' - }), 400 - - hwt = getattr(request, 'hwt', {}) - user_id = hwt.get('user_id') - users_collection = current_app.mongo.db.userdata - - user = users_collection.find_one({'_id': ObjectId(user_id)}) - - if not user: - return jsonify({ - 'success': False, - 'message': '用户不存在' - }), 404 - - from werkzeug.security import check_password_hash - - # 验证密码 - if not check_password_hash(user['密码'], password): - return jsonify({ - 'success': False, - 'message': '密码错误' - }), 401 - - # 删除用户 - result = users_collection.delete_one({'_id': ObjectId(user_id)}) - - if result.deleted_count > 0: - # 清除会话 - hwt = getattr(request, 'hwt', {}) - hwt.clear() - - return jsonify({ - 'success': True, - 'message': '账户已成功删除' - }), 200 - else: - return jsonify({ - 'success': False, - 'message': '删除失败' - }), 500 - - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 -#==========================对外暴露的HTTP接口========================== \ No newline at end of file diff --git a/InfoGenie-backend/requirements.txt b/InfoGenie-backend/requirements.txt deleted file mode 100755 index 0a9fabfc..00000000 --- a/InfoGenie-backend/requirements.txt +++ /dev/null @@ -1,29 +0,0 @@ -# InfoGenie 后端依赖包 -# Web框架 -Flask==2.3.3 -Flask-CORS==4.0.0 - -# 数据库 -Flask-PyMongo==2.3.0 -pymongo==4.5.0 - -# 密码加密 -Werkzeug==2.3.7 - -# JWT认证 -PyJWT==2.8.0 - -# HTTP请求 -requests==2.31.0 - -# 邮件发送 -Flask-Mail==0.9.1 - -# 数据处理 -python-dateutil==2.8.2 - -# 环境变量 -python-dotenv==1.0.0 - -# 开发工具 -flask-limiter==3.5.0 # API限流 diff --git a/InfoGenie-backend/start_backend.bat b/InfoGenie-backend/start_backend.bat deleted file mode 100755 index 3caf17ca..00000000 --- a/InfoGenie-backend/start_backend.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -python app.py \ No newline at end of file diff --git a/InfoGenie-backend/start_backend.sh b/InfoGenie-backend/start_backend.sh deleted file mode 100755 index 75eb545b..00000000 --- a/InfoGenie-backend/start_backend.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -python3 app.py diff --git a/InfoGenie-backend/后端架构文档.md b/InfoGenie-backend/后端架构文档.md deleted file mode 100755 index 3d7a375b..00000000 --- a/InfoGenie-backend/后端架构文档.md +++ /dev/null @@ -1,396 +0,0 @@ -# InfoGenie 后端架构文档 - -## 项目概述 - -InfoGenie(万象口袋)是一个基于前后端分离架构的多功能聚合软件应用。后端采用Flask框架提供RESTful API服务,前端通过HTTP请求调用后端API,实现数据交互和业务逻辑处理。 - -## 技术栈 - -### 核心框架 -- **Web框架**: Flask 2.3.3 -- **数据库**: MongoDB (Flask-PyMongo 2.3.0) -- **认证**: JWT (PyJWT 2.8.0) -- **跨域**: Flask-CORS 4.0.0 - -### 辅助工具 -- **邮件服务**: Flask-Mail 0.9.1 -- **密码加密**: Werkzeug 2.3.7 -- **环境配置**: python-dotenv 1.0.0 -- **API限流**: Flask-Limiter 3.5.0 - -## 架构设计原则 - -### 前后端分离 -- 后端专注于数据处理和业务逻辑 -- 前端负责用户界面和交互体验 -- 通过RESTful API进行数据交换 -- 完全解耦,便于独立开发和部署 - -### 模块化设计 -- 按功能划分独立模块 -- 每个模块职责单一 -- 便于维护和扩展 - -## 核心模块详解 - -### 1. 认证模块 (auth.py) - -**功能职责**: -- 用户注册和登录 -- JWT Token生成和管理 -- 邮箱验证码验证 -- QQ邮箱格式验证 - -**API端点**: -``` -POST /api/auth/send-verification # 发送验证码 -POST /api/auth/verify-code # 验证验证码 -POST /api/auth/register # 用户注册 -POST /api/auth/login # 用户登录 -POST /api/auth/logout # 用户登出 -GET /api/auth/check # 检查登录状态 -``` - -**数据流程**: -1. 前端发送注册/登录请求 -2. 后端验证邮箱格式(仅支持QQ邮箱) -3. 发送验证码邮件到用户邮箱 -4. 用户输入验证码完成验证 -5. 验证成功后生成JWT Token返回给前端 - -**安全特性**: -- 密码使用Werkzeug进行哈希加密 -- JWT Token 7天有效期 -- 验证码5分钟有效期,限制尝试次数 - -### 2. 用户管理模块 (user_management.py) - -**功能职责**: -- 用户资料管理 -- 密码修改 -- 每日签到系统 -- 用户游戏数据管理 -- 账户删除 - -**API端点**: -``` -GET /api/user/profile # 获取用户资料 -POST /api/user/change-password # 修改密码 -GET /api/user/stats # 获取用户统计 -GET /api/user/game-data # 获取游戏数据 -POST /api/user/checkin # 每日签到 -POST /api/user/delete # 删除账户 -``` - -**数据结构**: -```json -{ - "邮箱": "user@qq.com", - "用户名": "用户名", - "密码": "哈希密码", - "头像": "QQ头像URL", - "注册时间": "2025-01-01T00:00:00", - "最后登录": "2025-01-01T00:00:00", - "登录次数": 10, - "用户状态": "active", - "等级": 5, - "经验": 1200, - "萌芽币": 1500, - "签到系统": { - "连续签到天数": 7, - "今日是否已签到": true, - "签到时间": "2025-01-01" - } -} -``` - -**业务逻辑**: -- 签到奖励:300萌芽币 + 200经验 -- 等级升级:100 × 1.2^(等级) 经验需求 - -### 3. 邮件服务模块 (email_service.py) - -**功能职责**: -- 验证码邮件发送 -- QQ邮箱格式验证 -- QQ头像获取 -- 邮件模板管理 - -**邮件模板**: -- 注册验证码邮件(HTML格式) -- 登录验证码邮件(HTML格式) -- 支持自定义邮件内容和样式 - -**安全考虑**: -- 仅支持QQ邮箱(qq.com、vip.qq.com、foxmail.com) -- 使用SSL加密连接 -- 验证码存储在内存中(生产环境建议使用Redis) - -### 4. AI模型应用模块 (aimodelapp.py) - -**功能职责**: -- 集成多种AI服务(DeepSeek、Kimi) -- 提供AI功能API接口 -- 统一AI接口调用 -- 管理用户萌芽币消费(每次调用消耗100萌芽币) - -**支持的AI功能**: -1. **AI聊天接口** (`/api/aimodelapp/chat`) -2. **姓名分析** (`/api/aimodelapp/name-analysis`) -3. **变量命名助手** (`/api/aimodelapp/variable-naming`) -4. **AI写诗助手** (`/api/aimodelapp/poetry`) -5. **AI语言翻译** (`/api/aimodelapp/translation`) -6. **现代文转文言文** (`/api/aimodelapp/classical_conversion`) -7. **AI表情制作器** (`/api/aimodelapp/expression-maker`) -8. **Linux命令生成** (`/api/aimodelapp/linux-command`) -9. **获取可用模型** (`/api/aimodelapp/models`) - -**AI配置**: -```json -{ - "deepseek": { - "api_key": "your-api-key", - "api_base": "https://api.deepseek.com", - "model": ["deepseek-chat", "deepseek-reasoner"] - }, - "kimi": { - "api_key": "your-api-key", - "api_base": "https://api.moonshot.cn", - "model": ["kimi-k2-0905-preview", "kimi-k2-0711-preview"] - } -} -``` - -**调用流程**: -1. 前端发送AI请求(包含消息、模型提供商等参数) -2. 后端加载AI配置文件 -3. 调用对应AI API(带重试机制) -4. 返回AI响应给前端 - -## API设计规范 - -### 请求/响应格式 - -**成功响应**: -```json -{ - "success": true, - "data": {...}, - "message": "操作成功", - "timestamp": "2025-01-01T00:00:00" -} -``` - -**错误响应**: -```json -{ - "success": false, - "message": "错误信息", - "error": "错误详情" -} -``` - -### 认证方式 - -**JWT Token认证**: -``` -Authorization: Bearer -``` - -**支持的认证端点**: -- 所有 `/api/user/*` 端点需要认证 -- 部分 `/api/aimodelapp/*` 端点需要认证 - -### 错误处理 - -**HTTP状态码**: -- 200: 成功 -- 400: 请求参数错误 -- 401: 未认证/认证失败 -- 403: 权限不足 -- 404: 资源不存在 -- 409: 资源冲突 -- 500: 服务器内部错误 - -## 数据库设计 - -### MongoDB集合 - -**主要集合**: `userdata` -- 存储所有用户相关数据 -- 支持动态字段扩展 -- 使用ObjectId作为用户唯一标识 - -### 数据关系 -- 用户数据自包含,无复杂关联 -- 通过用户ID进行数据关联 -- 支持水平扩展 - -## 部署和配置 - -### 环境配置 - -**必需环境变量**: -``` -SECRET_KEY=your-secret-key -MONGO_URI=mongodb://localhost:27017/InfoGenie -MAIL_USERNAME=your-email@qq.com -MAIL_PASSWORD=your-app-password -``` - -### 启动方式 - -**开发环境**: -```bash -python app.py -``` - -**生产环境**: -- 支持Docker部署 -- 提供docker-compose配置 -- 支持Gunicorn WSGI服务器 - -### 静态文件服务 - -**支持的前端资源**: -- `/60sapi/*`: 60秒API相关文件 -- `/smallgame/*`: 小游戏相关文件 -- `/aimodelapp/*`: AI模型应用相关文件 - -## 安全考虑 - -### 数据安全 -- 密码哈希存储 -- JWT Token安全传输 -- 输入数据验证和过滤 - -### API安全 -- CORS配置(生产环境限制域名) -- API限流保护 -- 请求日志记录 - -### 部署安全 -- 环境变量管理敏感信息 -- HTTPS证书配置 -- 防火墙和访问控制 - -## 前后端协作指南 - -### 前端调用示例 - -**用户登录**: -```javascript -// 1. 发送验证码 -fetch('/api/auth/send-verification', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ email: 'user@qq.com', type: 'login' }) -}); - -// 2. 验证验证码并登录 -fetch('/api/auth/login', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - email: 'user@qq.com', - code: '123456' - }) -}); - -// 3. 保存token到localStorage -localStorage.setItem('token', response.token); -``` - -**调用需要认证的API**: -```javascript -fetch('/api/user/profile', { - method: 'GET', - headers: { - 'Authorization': `Bearer ${localStorage.getItem('token')}` - } -}); -``` - -### 数据约定 - -**前端发送数据格式**: -- 所有请求使用JSON格式 -- 必填字段验证 -- 参数命名使用snake_case - -**后端返回数据格式**: -- 统一响应格式 -- 时间戳使用ISO格式 -- 错误信息清晰明确 - -### 开发协作流程 - -1. **API设计阶段**: - - 后端定义API接口规范 - - 前端根据规范开发调用代码 - - 约定数据格式和错误处理 - -2. **联调阶段**: - - 使用统一的测试数据 - - 验证各种边界情况 - - 确认错误处理逻辑 - -3. **部署阶段**: - - 后端部署API服务 - - 前端配置API基础URL - - 验证跨域和认证配置 - -## 新功能添加 - -### 1. AI功能萌芽币消费系统 - -**功能描述**: -- 用户每次调用AI模型应用(aimodelapp)需消耗100萌芽币 -- 当用户萌芽币余额不足时,无法使用AI功能 -- 记录用户的AI使用历史 - -**API端点**: -``` -GET /api/aimodelapp/coins # 查询用户萌芽币余额和使用历史 -``` - -**技术实现**: -- 使用装饰器模式实现请求前验证和扣除萌芽币 -- 在MongoDB中记录用户AI使用历史 -- 通过JWT Token验证用户身份 - -**业务逻辑**: -1. 当用户请求AI功能时,首先验证JWT Token -2. 检查用户萌芽币余额是否≥100 -3. 如余额充足,先扣除萌芽币,然后再调用AI服务 -4. 记录使用历史,包括API类型、时间和消费萌芽币数量 -5. 返回AI服务结果给用户 - -**响应示例(查询萌芽币余额)**: -```json -{ - "success": true, - "data": { - "coins": 200, - "ai_cost": 100, - "can_use_ai": true, - "username": "用户名", - "usage_count": 1, - "recent_usage": [ - { - "api_type": "chat", - "cost": 100, - "timestamp": "2025-09-16T11:15:47.285720" - } - ] - }, - "message": "当前萌芽币余额: 200" -} -``` - -**前端开发注意事项**: -- 每个需要调用AI功能的页面应首先检查用户萌芽币余额 -- 当萌芽币不足时,向用户提示并引导用户通过签到等方式获取萌芽币 -- 可在UI中展示用户最近的AI使用记录和萌芽币消费情况 - ---- diff --git a/InfoGenie-backend/用户数据模板.json b/InfoGenie-backend/用户数据模板.json deleted file mode 100755 index b9cdbaa4..00000000 --- a/InfoGenie-backend/用户数据模板.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "账号":"3205788256", - "邮箱":"3205788256@qq.com", - "密码":"0123456789", - "等级":0, - "经验":0, - "萌芽币":0, - "签到系统":{ - "连续签到天数":0, - "今日是否已签到":false, - "签到时间":"2025-01-01" - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/.env.development b/InfoGenie-frontend/.env.development index bf4bf9b4..da2550ea 100644 --- a/InfoGenie-frontend/.env.development +++ b/InfoGenie-frontend/.env.development @@ -1,11 +1,7 @@ -# React 开发环境变量 - -# API URL - 开发环境使用本地后端 +# 复制为 .env.local 后可按需覆盖本地开发值 REACT_APP_API_URL=http://127.0.0.1:5002 - -# 应用信息 +REACT_APP_AUTH_URL=https://auth.shumengya.top +REACT_APP_AUTH_API_URL=https://auth.api.shumengya.top REACT_APP_NAME=InfoGenie REACT_APP_VERSION=1.0.0 - -# 调试模式 REACT_APP_DEBUG=true diff --git a/InfoGenie-frontend/.env.production b/InfoGenie-frontend/.env.production index 5d24c3f0..33b98de6 100644 --- a/InfoGenie-frontend/.env.production +++ b/InfoGenie-frontend/.env.production @@ -1,13 +1,7 @@ -# React 生产环境变量 -# 用于前端独立部署 - -# API URL - 指向后端服务器 -# 使用域名方式访问后端 API +# 生产前端环境变量 REACT_APP_API_URL=https://infogenie.api.shumengya.top - -# 应用信息 +REACT_APP_AUTH_URL=https://auth.shumengya.top +REACT_APP_AUTH_API_URL=https://auth.api.shumengya.top REACT_APP_NAME=InfoGenie REACT_APP_VERSION=1.0.0 - -# 调试模式(生产环境关闭) REACT_APP_DEBUG=false diff --git a/InfoGenie-frontend/前端架构文档.md b/InfoGenie-frontend/README.md old mode 100755 new mode 100644 similarity index 100% rename from InfoGenie-frontend/前端架构文档.md rename to InfoGenie-frontend/README.md diff --git a/InfoGenie-frontend/build_frontend.bat b/InfoGenie-frontend/build_frontend.bat deleted file mode 100755 index cc07c378..00000000 --- a/InfoGenie-frontend/build_frontend.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -npm run build -npx serve -s build -pause \ No newline at end of file diff --git a/InfoGenie-frontend/env.backup b/InfoGenie-frontend/env.backup deleted file mode 100755 index a4fef6fc..00000000 --- a/InfoGenie-frontend/env.backup +++ /dev/null @@ -1,5 +0,0 @@ -# 生产环境API配置 -REACT_APP_API_URL=https://infogenie.api.shumengya.top - -# 生产环境API配置 -REACT_APP_API_URL=http://127.0.0.1:5002 \ No newline at end of file diff --git a/InfoGenie-frontend/package-lock.json b/InfoGenie-frontend/package-lock.json index 57e5c300..cfd53b16 100755 --- a/InfoGenie-frontend/package-lock.json +++ b/InfoGenie-frontend/package-lock.json @@ -83,7 +83,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "license": "MIT", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -733,7 +732,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1617,7 +1615,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", @@ -4682,7 +4679,8 @@ "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/q": { "version": "1.5.8", @@ -4838,7 +4836,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -4892,7 +4889,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -5262,7 +5258,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5361,7 +5356,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6327,7 +6321,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001737", "electron-to-chromium": "^1.5.211", @@ -6486,9 +6479,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001739", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz", - "integrity": "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==", + "version": "1.0.30001780", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", "funding": [ { "type": "opencollective", @@ -7394,8 +7387,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -8261,7 +8253,6 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -11096,7 +11087,6 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -15168,7 +15158,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -16356,7 +16345,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -16722,7 +16710,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -16873,7 +16860,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -16925,7 +16911,6 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -17444,7 +17429,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "license": "MIT", - "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -17690,7 +17674,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -19396,7 +19379,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=10" }, @@ -19826,7 +19808,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -19898,7 +19879,6 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "license": "MIT", - "peer": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -20311,7 +20291,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", diff --git a/InfoGenie-frontend/package.json b/InfoGenie-frontend/package.json index 5e50057c..156f745a 100755 --- a/InfoGenie-frontend/package.json +++ b/InfoGenie-frontend/package.json @@ -1,7 +1,7 @@ { "name": "infogenie-frontend", "version": "1.0.0", - "description": "✨ 万象口袋 - 前端React应用", + "description": "万象口袋 - 前端React应用", "keywords": [ "react", "api", diff --git a/InfoGenie-frontend/public/60sapi/ig-embed.js b/InfoGenie-frontend/public/60sapi/ig-embed.js new file mode 100644 index 00000000..e3ffb465 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/ig-embed.js @@ -0,0 +1,13 @@ +/** + * 在 iframe 内嵌展示时隐藏静态页自带的顶栏,避免与 FullscreenEmbed 顶栏重复 + */ +(function () { + try { + if (window.self !== window.top) { + var el = document.createElement('style'); + el.setAttribute('data-ig-embed', '1'); + el.textContent = '.header{display:none!important}'; + document.head.appendChild(el); + } + } catch (e) { /* 忽略 */ } +})(); diff --git a/InfoGenie-frontend/public/60sapi/sixty-runtime.js b/InfoGenie-frontend/public/60sapi/sixty-runtime.js new file mode 100644 index 00000000..abfffd99 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/sixty-runtime.js @@ -0,0 +1,13 @@ +/* 由 SPA 在 iframe URL 上附加 ?sixty_base=encodeURIComponent(baseUrl);无参数时默认萌芽节点 */ +(function () { + var fallback = 'https://60s.api.shumengya.top'; + var base = fallback; + try { + var q = new URLSearchParams(window.location.search).get('sixty_base'); + if (q) { + base = decodeURIComponent(q); + } + } catch (e) {} + base = String(base).replace(/\/+$/, ''); + window.__SIXTY_API_BASE__ = base || fallback; +})(); diff --git a/InfoGenie-frontend/public/60sapi/周期资讯/AI资讯快报.html b/InfoGenie-frontend/public/60sapi/周期资讯/AI资讯快报.html new file mode 100644 index 00000000..6e9303af --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/周期资讯/AI资讯快报.html @@ -0,0 +1,105 @@ + + + + +AI资讯快报 + + + + + +
+ +

🤖 AI资讯快报

+ +
+
+
加载中...
+
+ + + diff --git a/InfoGenie-frontend/public/60sapi/周期资讯/Epic免费游戏.html b/InfoGenie-frontend/public/60sapi/周期资讯/Epic免费游戏.html new file mode 100644 index 00000000..a360dfc2 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/周期资讯/Epic免费游戏.html @@ -0,0 +1,111 @@ + + + + +Epic免费游戏 + + + + + +
+ +

🎮 Epic免费游戏

+ +
+
+
加载中...
+
+ + + diff --git a/InfoGenie-frontend/public/60sapi/周期资讯/农历信息.html b/InfoGenie-frontend/public/60sapi/周期资讯/农历信息.html new file mode 100644 index 00000000..1abdda62 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/周期资讯/农历信息.html @@ -0,0 +1,64 @@ + + + + +农历信息 + + + + + +
+ +

🌙 农历信息

+ +
+
+
加载中...
+
+ + + diff --git a/InfoGenie-frontend/public/60sapi/周期资讯/历史上的今天.html b/InfoGenie-frontend/public/60sapi/周期资讯/历史上的今天.html new file mode 100644 index 00000000..55c16b76 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/周期资讯/历史上的今天.html @@ -0,0 +1,64 @@ + + + + +历史上的今天 + + + + + +
+ +

📅 历史上的今天

+ +
+
+
加载中...
+
+ + + diff --git a/InfoGenie-frontend/public/60sapi/周期资讯/当日货币汇率.html b/InfoGenie-frontend/public/60sapi/周期资讯/当日货币汇率.html new file mode 100644 index 00000000..b9e2a954 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/周期资讯/当日货币汇率.html @@ -0,0 +1,71 @@ + + + + +当日货币汇率 + + + + + +
+ +

💱 当日货币汇率

+ +
+
+
加载中...
+
+ + + diff --git a/InfoGenie-frontend/public/60sapi/周期资讯/必应每日壁纸.html b/InfoGenie-frontend/public/60sapi/周期资讯/必应每日壁纸.html new file mode 100644 index 00000000..5059b56b --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/周期资讯/必应每日壁纸.html @@ -0,0 +1,52 @@ + + + + +必应每日壁纸 + + + + + +
+ +

🖼️ 必应每日壁纸

+ +
+
+
加载中...
+
+ + + diff --git a/InfoGenie-frontend/public/60sapi/周期资讯/摸鱼日历.html b/InfoGenie-frontend/public/60sapi/周期资讯/摸鱼日历.html new file mode 100644 index 00000000..951d7f32 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/周期资讯/摸鱼日历.html @@ -0,0 +1,81 @@ + + + + +摸鱼日历 + + + + + +
+ +

🐟 摸鱼日历

+ +
+
+
加载中...
+
+ + + diff --git a/InfoGenie-frontend/public/60sapi/周期资讯/每天60s读懂世界.html b/InfoGenie-frontend/public/60sapi/周期资讯/每天60s读懂世界.html new file mode 100644 index 00000000..7ebe009e --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/周期资讯/每天60s读懂世界.html @@ -0,0 +1,64 @@ + + + + +每天60s读懂世界 + + + + + +
+ +

🌍 每天60s读懂世界

+ +
+
+
加载中...
+
+ + + diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/JS趣味题.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/JS趣味题.html new file mode 100644 index 00000000..6c68cea2 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/JS趣味题.html @@ -0,0 +1,56 @@ + + + + +JS趣味题 + + + + + +
+ +

💻 JS趣味题

+ +
+
+
加载中...
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/今日运势.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/今日运势.html new file mode 100644 index 00000000..508b7ac5 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/今日运势.html @@ -0,0 +1,56 @@ + + + + +今日运势 + + + + + +
+ +

⭐ 今日运势

+ +
+
+
加载中...
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/发病文学.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/发病文学.html new file mode 100644 index 00000000..4e80311c --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/发病文学.html @@ -0,0 +1,61 @@ + + + + +发病文学 + + + + + +
+ +

📖 发病文学

+
+
+
+ + + +
+
+
+ + + diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/疯狂星期四.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/疯狂星期四.html new file mode 100644 index 00000000..83e0b713 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/疯狂星期四.html @@ -0,0 +1,56 @@ + + + + +疯狂星期四 + + + + + +
+ +

🍗 疯狂星期四

+ +
+
+
加载中...
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/答案之书.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/答案之书.html new file mode 100644 index 00000000..98d2aedd --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/答案之书.html @@ -0,0 +1,56 @@ + + + + +答案之书 + + + + + +
+ +

📘 答案之书

+ +
+
+
加载中...
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/英文冷笑话.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/英文冷笑话.html new file mode 100644 index 00000000..6513cc4a --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/英文冷笑话.html @@ -0,0 +1,56 @@ + + + + +英文冷笑话 + + + + + +
+ +

😄 英文冷笑话

+ +
+
+
加载中...
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css deleted file mode 100755 index c2e020b1..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css +++ /dev/null @@ -1,190 +0,0 @@ -/* 背景样式文件 */ - -/* 主体背景 */ -body { - background: linear-gradient(135deg, #e8f5e8 0%, #c8e6c9 50%, #a5d6a7 100%); - background-attachment: fixed; - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; -} - -/* 背景动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 装饰性背景元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(129, 199, 132, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(165, 214, 167, 0.08) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 浮动装饰圆点 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.2), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.2), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(129, 199, 132, 0.3), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: float 20s linear infinite; - pointer-events: none; - z-index: -1; - opacity: 0.6; -} - -@keyframes float { - 0% { - transform: translateY(0px); - } - 50% { - transform: translateY(-10px); - } - 100% { - transform: translateY(0px); - } -} - -/* 题目容器背景增强 */ -.question-container { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px rgba(26, 77, 26, 0.1), - inset 0 1px 0 rgba(255, 255, 255, 0.2); -} - -/* 错误容器背景 */ -.error-container { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); -} - -/* 结果容器背景 */ -.result-container { - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -/* 代码块背景 */ -.code-block { - background: rgba(248, 249, 250, 0.9); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -/* 选项背景 */ -.option { - background: rgba(255, 255, 255, 0.8); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -.option:hover { - background: rgba(76, 175, 80, 0.05); -} - -.option.selected { - background: linear-gradient(135deg, rgba(76, 175, 80, 0.15), rgba(76, 175, 80, 0.08)); -} - -/* 按钮背景增强 */ -.submit-btn { - background: linear-gradient(135deg, #4caf50, #45a049); - box-shadow: 0 4px 15px rgba(76, 175, 80, 0.2); -} - -.show-answer-btn { - background: linear-gradient(135deg, #2196f3, #1976d2); - box-shadow: 0 4px 15px rgba(33, 150, 243, 0.2); -} - -.retry-btn { - background: linear-gradient(135deg, #ff9800, #f57c00); - box-shadow: 0 4px 15px rgba(255, 152, 0, 0.2); -} - -.refresh-btn { - background: linear-gradient(135deg, #4caf50, #45a049); - box-shadow: 0 4px 15px rgba(76, 175, 80, 0.2); -} - -/* 移动端背景优化 */ -@media (max-width: 768px) { - body { - background-attachment: scroll; - } - - body::after { - opacity: 0.4; - background-size: 150px 75px; - } - - .question-container { - backdrop-filter: blur(8px); - -webkit-backdrop-filter: blur(8px); - } -} - -/* 高对比度模式支持 */ -@media (prefers-contrast: high) { - body { - background: #f0f8f0; - } - - body::before, - body::after { - display: none; - } - - .question-container { - background: #ffffff; - border: 2px solid #4caf50; - } -} - -/* 减少动画模式支持 */ -@media (prefers-reduced-motion: reduce) { - body { - animation: none; - background: #e8f5e8; - } - - body::after { - animation: none; - } - - .refresh-btn:hover { - transform: scale(1.1); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css deleted file mode 100755 index 540f0c2a..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css +++ /dev/null @@ -1,597 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: #2d5a27; - min-height: 100vh; - overflow-x: hidden; -} - -/* 容器布局 */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - padding: 30px 0; -} - -.header h1 { - font-size: 2.5rem; - color: #1a4d1a; - margin-bottom: 10px; - font-weight: 700; - text-shadow: 0 2px 4px rgba(26, 77, 26, 0.1); -} - -.subtitle { - font-size: 1.1rem; - color: #4a7c59; - opacity: 0.8; -} - -/* 主内容区域 */ -.main-content { - flex: 1; - display: flex; - justify-content: center; - align-items: flex-start; -} - -/* 加载动画 */ -.loading { - text-align: center; - padding: 60px 20px; -} - -.spinner { - width: 50px; - height: 50px; - border: 4px solid #e8f5e8; - border-top: 4px solid #4caf50; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading p { - color: #4a7c59; - font-size: 1.1rem; -} - -/* 题目容器 */ -.question-container { - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - padding: 40px; - box-shadow: 0 10px 30px rgba(26, 77, 26, 0.1); - border: 2px solid rgba(76, 175, 80, 0.2); - width: 100%; - max-width: 800px; - backdrop-filter: blur(10px); -} - -/* 题目头部 */ -.question-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 30px; - padding-bottom: 15px; - border-bottom: 2px solid #e8f5e8; -} - -.question-id { - font-size: 1.1rem; - color: #4caf50; - font-weight: 600; - background: linear-gradient(135deg, #e8f5e8, #c8e6c9); - padding: 8px 16px; - border-radius: 20px; -} - -.refresh-btn { - background: linear-gradient(135deg, #4caf50, #45a049); - border: none; - border-radius: 50%; - width: 45px; - height: 45px; - color: white; - cursor: pointer; - transition: all 0.3s ease; - display: flex; - align-items: center; - justify-content: center; -} - -.refresh-btn:hover { - transform: rotate(180deg) scale(1.1); - box-shadow: 0 5px 15px rgba(76, 175, 80, 0.3); -} - -/* 题目文本 */ -.question-text h2 { - font-size: 1.5rem; - color: #1a4d1a; - margin-bottom: 25px; - text-align: center; -} - -/* 代码块 */ -.code-block { - background: #f8f9fa; - border: 2px solid #e8f5e8; - border-radius: 12px; - margin: 25px 0; - overflow-x: auto; - position: relative; -} - -.code-block pre { - margin: 0; - padding: 25px; - font-family: 'Consolas', 'Monaco', 'Courier New', monospace; - font-size: 0.95rem; - line-height: 1.5; - color: #2d5a27; - white-space: pre-wrap; - word-wrap: break-word; - background: transparent !important; -} - -.code-block code { - font-family: 'Consolas', 'Monaco', 'Courier New', monospace; - background: transparent !important; -} - -/* 代码高亮自定义样式 - 丰富的语法高亮 */ -.code-block .hljs { - background: transparent !important; - color: #333333 !important; -} - -/* JavaScript 关键字 - 蓝色 */ -.code-block .hljs-keyword { - color: #0066cc !important; - font-weight: 600; -} - -/* 字符串 - 绿色 */ -.code-block .hljs-string { - color: #22aa22 !important; -} - -/* 数字 - 橙色 */ -.code-block .hljs-number { - color: #ff6600 !important; -} - -/* 函数名 - 紫色 */ -.code-block .hljs-function, -.code-block .hljs-title.function_ { - color: #9933cc !important; - font-weight: 600; -} - -/* 变量名 - 深蓝色 */ -.code-block .hljs-variable, -.code-block .hljs-name { - color: #0066aa !important; -} - -/* 注释 - 灰色 */ -.code-block .hljs-comment { - color: #888888 !important; - font-style: italic; -} - -/* 内置对象和方法 - 深紫色 */ -.code-block .hljs-built_in { - color: #663399 !important; - font-weight: 500; -} - -/* 字面量 (true, false, null) - 红色 */ -.code-block .hljs-literal { - color: #cc0000 !important; - font-weight: 600; -} - -/* 操作符 - 深灰色 */ -.code-block .hljs-operator { - color: #666666 !important; -} - -/* 标点符号 - 深灰色 */ -.code-block .hljs-punctuation { - color: #666666 !important; -} - -/* 属性名 - 深蓝色 */ -.code-block .hljs-property, -.code-block .hljs-attr { - color: #0066aa !important; -} - -/* 类名和构造函数 - 深绿色 */ -.code-block .hljs-title.class_, -.code-block .hljs-title { - color: #228833 !important; - font-weight: 600; -} - -/* 参数 - 深蓝色 */ -.code-block .hljs-params { - color: #0066aa !important; -} - -/* 正则表达式 - 深红色 */ -.code-block .hljs-regexp { - color: #aa0066 !important; -} - -/* 模板字符串 - 深绿色 */ -.code-block .hljs-template-variable, -.code-block .hljs-template-tag { - color: #228833 !important; -} - -/* 选项容器 */ -.options-container { - margin: 30px 0; -} - -.option { - background: rgba(255, 255, 255, 0.8); - border: 2px solid #e8f5e8; - border-radius: 12px; - padding: 15px 20px; - margin: 12px 0; - cursor: pointer; - transition: all 0.3s ease; - font-size: 1rem; - position: relative; - overflow: hidden; -} - -.option:hover { - border-color: #4caf50; - background: rgba(76, 175, 80, 0.05); - transform: translateX(5px); -} - -.option.selected { - border-color: #4caf50; - background: linear-gradient(135deg, rgba(76, 175, 80, 0.1), rgba(76, 175, 80, 0.05)); - color: #1a4d1a; - font-weight: 600; -} - -.option.correct { - border-color: #4caf50; - background: linear-gradient(135deg, rgba(76, 175, 80, 0.2), rgba(76, 175, 80, 0.1)); - color: #1a4d1a; -} - -.option.incorrect { - border-color: #f44336; - background: linear-gradient(135deg, rgba(244, 67, 54, 0.1), rgba(244, 67, 54, 0.05)); - color: #c62828; -} - -/* 按钮样式 */ -.action-buttons { - display: flex; - gap: 15px; - margin: 30px 0; - justify-content: center; - flex-wrap: wrap; -} - -.submit-btn, .show-answer-btn, .retry-btn, .export-btn { - padding: 12px 30px; - border: none; - border-radius: 25px; - font-size: 1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - min-width: 120px; - display: flex; - align-items: center; - justify-content: center; - gap: 8px; -} - -.submit-btn { - background: linear-gradient(135deg, #4caf50, #45a049); - color: white; -} - -.submit-btn:hover:not(:disabled) { - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(76, 175, 80, 0.3); -} - -.submit-btn:disabled { - background: #cccccc; - cursor: not-allowed; - transform: none; - box-shadow: none; -} - -.show-answer-btn { - background: linear-gradient(135deg, #2196f3, #1976d2); - color: white; -} - -.show-answer-btn:hover { - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(33, 150, 243, 0.3); -} - -.retry-btn { - background: linear-gradient(135deg, #ff9800, #f57c00); - color: white; -} - -.retry-btn:hover { - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(255, 152, 0, 0.3); -} - -.export-btn { - background: linear-gradient(135deg, #9c27b0, #7b1fa2); - color: white; -} - -.export-btn:hover { - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(156, 39, 176, 0.3); -} - -.export-btn svg { - width: 16px; - height: 16px; -} - -/* 结果容器 */ -.result-container { - margin-top: 30px; - padding: 25px; - background: rgba(255, 255, 255, 0.9); - border-radius: 15px; - border: 2px solid #e8f5e8; -} - -.result-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 20px; - padding-bottom: 15px; - border-bottom: 1px solid #e8f5e8; -} - -.result-status { - font-size: 1.2rem; - font-weight: 600; -} - -.result-status.correct { - color: #4caf50; -} - -.result-status.incorrect { - color: #f44336; -} - -.correct-answer { - font-weight: 600; - color: #4caf50; - background: rgba(76, 175, 80, 0.1); - padding: 5px 12px; - border-radius: 15px; -} - -.explanation { - color: #2d5a27; - line-height: 1.7; - font-size: 1rem; -} - -.explanation pre { - background: #f8f9fa; - border: 1px solid #e8f5e8; - border-radius: 8px; - padding: 15px; - margin: 15px 0; - overflow-x: auto; - font-family: 'Consolas', 'Monaco', 'Courier New', monospace; -} - -/* 错误容器 */ -.error-container { - text-align: center; - padding: 60px 20px; - background: rgba(255, 255, 255, 0.9); - border-radius: 20px; - border: 2px solid rgba(244, 67, 54, 0.2); - max-width: 500px; - margin: 0 auto; -} - -.error-icon { - font-size: 3rem; - margin-bottom: 20px; -} - -.error-container h3 { - color: #f44336; - margin-bottom: 15px; - font-size: 1.5rem; -} - -.error-container p { - color: #666; - margin-bottom: 25px; - font-size: 1.1rem; -} - -/* 底部 */ -.footer { - text-align: center; - padding: 30px 0; - margin-top: 40px; - color: #4a7c59; - opacity: 0.7; - border-top: 1px solid rgba(76, 175, 80, 0.2); -} - -/* 平板端适配 (768px - 1024px) */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2.2rem; - } - - .question-container { - padding: 30px; - } - - .action-buttons { - flex-wrap: wrap; - } -} - -/* 手机端适配 (最大768px) */ -@media (max-width: 768px) { - .container { - padding: 10px; - } - - .header { - margin-bottom: 25px; - padding: 20px 0; - } - - .header h1 { - font-size: 1.8rem; - } - - .subtitle { - font-size: 1rem; - } - - .question-container { - padding: 20px; - border-radius: 15px; - } - - .question-header { - flex-direction: column; - gap: 15px; - text-align: center; - } - - .question-text h2 { - font-size: 1.3rem; - } - - .code-block pre { - padding: 15px; - font-size: 0.85rem; - } - - .option { - padding: 12px 15px; - font-size: 0.95rem; - } - - .action-buttons { - flex-direction: column; - align-items: center; - } - - .submit-btn, .show-answer-btn, .retry-btn { - width: 100%; - max-width: 200px; - } - - .result-header { - flex-direction: column; - gap: 10px; - text-align: center; - } - - .explanation { - font-size: 0.95rem; - } - - .explanation pre { - padding: 10px; - font-size: 0.8rem; - } -} - -/* 小屏手机适配 (最大480px) */ -@media (max-width: 480px) { - .container { - padding: 8px; - } - - .header h1 { - font-size: 1.6rem; - } - - .question-container { - padding: 15px; - } - - .question-id { - font-size: 1rem; - padding: 6px 12px; - } - - .refresh-btn { - width: 40px; - height: 40px; - } - - .code-block pre { - font-size: 0.8rem; - padding: 12px; - } - - .option { - padding: 10px 12px; - font-size: 0.9rem; - } - - .submit-btn, .show-answer-btn, .retry-btn { - padding: 10px 20px; - font-size: 0.95rem; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/index.html deleted file mode 100755 index 46e66a0a..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/index.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - 随机JavaScript趣味题 - - - - - - - - - -
-
-

JavaScript趣味题

-

测试你的JavaScript知识

-
- -
-
-
-

正在加载题目...

-
- - - - -
- -
-

JavaScript趣味题集合

-
-
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js deleted file mode 100755 index 5bf6a0cd..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js +++ /dev/null @@ -1,582 +0,0 @@ -// JavaScript趣味题应用 -class JSQuizApp { - constructor() { - this.apiEndpoints = [ - 'https://60s.api.shumengya.top', - ]; - this.currentApiIndex = 0; - this.currentQuestion = null; - this.selectedOption = null; - this.isAnswered = false; - this.loadStartTime = null; - - this.initElements(); - this.bindEvents(); - this.preloadResources(); - this.loadQuestion(); - } - - // 初始化DOM元素 - initElements() { - this.elements = { - loading: document.getElementById('loading'), - questionContainer: document.getElementById('questionContainer'), - errorContainer: document.getElementById('errorContainer'), - questionId: document.getElementById('questionId'), - questionText: document.getElementById('questionText'), - codeContent: document.getElementById('codeContent'), - optionsContainer: document.getElementById('optionsContainer'), - submitBtn: document.getElementById('submitBtn'), - showAnswerBtn: document.getElementById('showAnswerBtn'), - refreshBtn: document.getElementById('refreshBtn'), - retryBtn: document.getElementById('retryBtn'), - exportBtn: document.getElementById('exportBtn'), - resultContainer: document.getElementById('resultContainer'), - resultStatus: document.getElementById('resultStatus'), - correctAnswer: document.getElementById('correctAnswer'), - explanation: document.getElementById('explanation'), - errorMessage: document.getElementById('errorMessage') - }; - } - - // 预加载资源 - preloadResources() { - // 预连接API服务器 - this.apiEndpoints.forEach(endpoint => { - const link = document.createElement('link'); - link.rel = 'preconnect'; - link.href = endpoint; - document.head.appendChild(link); - }); - } - - // 绑定事件 - bindEvents() { - this.elements.submitBtn.addEventListener('click', () => this.submitAnswer()); - this.elements.showAnswerBtn.addEventListener('click', () => this.showAnswer()); - this.elements.refreshBtn.addEventListener('click', () => this.loadQuestion()); - this.elements.retryBtn.addEventListener('click', () => this.loadQuestion()); - this.elements.exportBtn.addEventListener('click', () => this.exportToMarkdown()); - } - - // 显示加载状态 - showLoading() { - this.elements.loading.style.display = 'block'; - this.elements.questionContainer.style.display = 'none'; - this.elements.errorContainer.style.display = 'none'; - } - - // 显示题目 - showQuestion() { - this.elements.loading.style.display = 'none'; - this.elements.questionContainer.style.display = 'block'; - this.elements.errorContainer.style.display = 'none'; - } - - // 显示错误 - showError(message) { - this.elements.loading.style.display = 'none'; - this.elements.questionContainer.style.display = 'none'; - this.elements.errorContainer.style.display = 'block'; - this.elements.errorMessage.textContent = message; - } - - // 获取当前API地址 - getCurrentApiUrl() { - return `${this.apiEndpoints[this.currentApiIndex]}/v2/awesome-js`; - } - - // 切换到下一个API - switchToNextApi() { - this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length; - } - - // 加载题目 - async loadQuestion() { - this.loadStartTime = Date.now(); - this.showLoading(); - this.resetQuestion(); - - let attempts = 0; - const maxAttempts = this.apiEndpoints.length; - - while (attempts < maxAttempts) { - try { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 5000); - - const response = await fetch(this.getCurrentApiUrl(), { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - signal: controller.signal - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - this.currentQuestion = data.data; - const loadTime = Date.now() - this.loadStartTime; - console.log(`题目加载完成,耗时: ${loadTime}ms`); - this.displayQuestion(); - return; - } else { - throw new Error(data.message || '数据格式错误'); - } - - } catch (error) { - console.warn(`API ${this.getCurrentApiUrl()} 请求失败:`, error.message); - attempts++; - - if (attempts < maxAttempts) { - this.switchToNextApi(); - console.log(`切换到备用API: ${this.getCurrentApiUrl()}`); - } else { - this.showError(`所有API接口都无法访问,请检查网络连接后重试。\n最后尝试的错误: ${error.message}`); - return; - } - } - } - } - - // 重置题目状态 - resetQuestion() { - this.selectedOption = null; - this.isAnswered = false; - this.elements.resultContainer.style.display = 'none'; - this.elements.submitBtn.disabled = true; - this.elements.submitBtn.textContent = '提交答案'; - this.elements.showAnswerBtn.style.display = 'inline-block'; - - // 清空选项容器,防止重复显示 - this.elements.optionsContainer.innerHTML = ''; - - // 移除所有选项的事件监听器 - const existingOptions = document.querySelectorAll('.option'); - existingOptions.forEach(option => { - option.removeEventListener('click', this.selectOption); - }); - } - - // 显示题目内容 - displayQuestion() { - const question = this.currentQuestion; - - console.log('显示题目:', question); - - // 设置题目ID - this.elements.questionId.textContent = `题目 #${question.id}`; - - // 设置题目文本 - this.elements.questionText.innerHTML = `

${this.escapeHtml(question.question)}

`; - - // 设置代码内容并应用语法高亮 - this.elements.codeContent.textContent = question.code; - - // 应用语法高亮 - if (typeof hljs !== 'undefined') { - hljs.highlightElement(this.elements.codeContent); - } - - // 确保选项容器已清空 - this.elements.optionsContainer.innerHTML = ''; - - // 生成选项 - this.generateOptions(question.options); - - this.showQuestion(); - } - - // 生成选项 - generateOptions(options) { - // 确保清空容器 - this.elements.optionsContainer.innerHTML = ''; - - // 验证选项数据 - if (!Array.isArray(options) || options.length === 0) { - console.error('选项数据无效:', options); - return; - } - - // 移除可能存在的重复选项 - const uniqueOptions = [...new Set(options)]; - - uniqueOptions.forEach((option, index) => { - const optionElement = document.createElement('div'); - optionElement.className = 'option'; - optionElement.textContent = option; - optionElement.dataset.index = index; - optionElement.dataset.value = option.charAt(0); // A, B, C, D - - optionElement.addEventListener('click', () => this.selectOption(optionElement)); - - this.elements.optionsContainer.appendChild(optionElement); - }); - - console.log('生成选项:', uniqueOptions); - } - - // 选择选项 - selectOption(optionElement) { - if (this.isAnswered) return; - - // 移除之前的选中状态 - document.querySelectorAll('.option.selected').forEach(el => { - el.classList.remove('selected'); - }); - - // 设置当前选中 - optionElement.classList.add('selected'); - this.selectedOption = optionElement.dataset.value; - - // 启用提交按钮 - this.elements.submitBtn.disabled = false; - } - - // 提交答案 - submitAnswer() { - if (!this.selectedOption || this.isAnswered) return; - - this.isAnswered = true; - this.elements.submitBtn.disabled = true; - this.elements.submitBtn.textContent = '已提交'; - this.elements.showAnswerBtn.style.display = 'none'; - - const isCorrect = this.selectedOption === this.currentQuestion.answer; - - // 显示结果 - this.showResult(isCorrect); - - // 标记选项 - this.markOptions(); - } - - // 显示答案 - showAnswer() { - this.isAnswered = true; - this.elements.submitBtn.disabled = true; - this.elements.submitBtn.textContent = '已显示答案'; - this.elements.showAnswerBtn.style.display = 'none'; - - // 显示结果(不判断对错) - this.showResult(null); - - // 标记正确答案 - this.markCorrectAnswer(); - } - - // 显示结果 - showResult(isCorrect) { - const resultContainer = this.elements.resultContainer; - const resultStatus = this.elements.resultStatus; - const correctAnswer = this.elements.correctAnswer; - const explanation = this.elements.explanation; - - // 设置结果状态 - if (isCorrect === true) { - resultStatus.textContent = '✅ 回答正确!'; - resultStatus.className = 'result-status correct'; - } else if (isCorrect === false) { - resultStatus.textContent = '❌ 回答错误'; - resultStatus.className = 'result-status incorrect'; - } else { - resultStatus.textContent = '💡 答案解析'; - resultStatus.className = 'result-status'; - } - - // 设置正确答案 - correctAnswer.textContent = `正确答案: ${this.currentQuestion.answer}`; - - // 设置解析内容 - explanation.innerHTML = this.formatExplanation(this.currentQuestion.explanation); - - // 显示结果容器 - resultContainer.style.display = 'block'; - - // 滚动到结果区域 - setTimeout(() => { - resultContainer.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); - }, 100); - } - - // 标记选项 - markOptions() { - const options = document.querySelectorAll('.option'); - const correctAnswer = this.currentQuestion.answer; - - options.forEach(option => { - const optionValue = option.dataset.value; - - if (optionValue === correctAnswer) { - option.classList.add('correct'); - } else if (option.classList.contains('selected')) { - option.classList.add('incorrect'); - } - - // 禁用点击 - option.style.pointerEvents = 'none'; - }); - } - - // 标记正确答案 - markCorrectAnswer() { - const options = document.querySelectorAll('.option'); - const correctAnswer = this.currentQuestion.answer; - - options.forEach(option => { - const optionValue = option.dataset.value; - - if (optionValue === correctAnswer) { - option.classList.add('correct'); - } - - // 禁用点击 - option.style.pointerEvents = 'none'; - }); - } - - // 格式化解析内容 - formatExplanation(explanation) { - // 转义HTML - let formatted = this.escapeHtml(explanation); - - // 处理代码块 - formatted = formatted.replace(/```js\n([\s\S]*?)\n```/g, '
$1
'); - formatted = formatted.replace(/```javascript\n([\s\S]*?)\n```/g, '
$1
'); - formatted = formatted.replace(/```([\s\S]*?)```/g, '
$1
'); - - // 处理行内代码 - formatted = formatted.replace(/`([^`]+)`/g, '$1'); - - // 处理换行 - formatted = formatted.replace(/\n\n/g, '

'); - formatted = formatted.replace(/\n/g, '
'); - - // 包装段落 - if (!formatted.includes('

')) { - formatted = '

' + formatted + '

'; - } - - return formatted; - } - - // HTML转义 - escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; - } - - // 导出为Markdown - exportToMarkdown() { - if (!this.currentQuestion) { - alert('请先加载题目后再导出!'); - return; - } - - const question = this.currentQuestion; - const timestamp = new Date().toLocaleString('zh-CN'); - - // 构建Markdown内容 - let markdown = `# JavaScript趣味题 #${question.id}\n\n`; - markdown += `> 导出时间: ${timestamp}\n\n`; - - // 题目部分 - markdown += `## 题目\n\n`; - markdown += `${question.question}\n\n`; - - // 代码部分 - markdown += `## 代码\n\n`; - markdown += `\`\`\`javascript\n${question.code}\n\`\`\`\n\n`; - - // 选项部分 - markdown += `## 选项\n\n`; - question.options.forEach((option, index) => { - const letter = String.fromCharCode(65 + index); // A, B, C, D - const isCorrect = letter === question.answer; - markdown += `${letter}. ${option}${isCorrect ? ' ✅' : ''}\n`; - }); - markdown += `\n`; - - // 答案部分 - markdown += `## 正确答案\n\n`; - markdown += `**${question.answer}**\n\n`; - - // 解析部分 - markdown += `## 答案解析\n\n`; - // 清理解析内容中的HTML标签,转换为Markdown格式 - let explanation = question.explanation; - explanation = explanation.replace(//gi, '\n'); - explanation = explanation.replace(/

/gi, '\n'); - explanation = explanation.replace(/<\/p>/gi, '\n'); - explanation = explanation.replace(/]*>/gi, '`'); - explanation = explanation.replace(/<\/code>/gi, '`'); - explanation = explanation.replace(/

/gi, '\n```javascript\n');
-        explanation = explanation.replace(/<\/code><\/pre>/gi, '\n```\n');
-        explanation = explanation.replace(/<[^>]*>/g, ''); // 移除其他HTML标签
-        explanation = explanation.replace(/\n\s*\n/g, '\n\n'); // 清理多余空行
-        markdown += explanation.trim() + '\n\n';
-        
-        // 添加页脚
-        markdown += `---\n\n`;
-        markdown += `*本题目来源于JavaScript趣味题集合*\n`;
-        markdown += `*导出工具: JavaScript趣味题网页版*\n`;
-        
-        // 创建下载
-        this.downloadMarkdown(markdown, `JavaScript趣味题_${question.id}_${new Date().getTime()}.md`);
-    }
-    
-    // 下载Markdown文件
-    downloadMarkdown(content, filename) {
-        const blob = new Blob([content], { type: 'text/markdown;charset=utf-8' });
-        const url = URL.createObjectURL(blob);
-        
-        const link = document.createElement('a');
-        link.href = url;
-        link.download = filename;
-        link.style.display = 'none';
-        
-        document.body.appendChild(link);
-        link.click();
-        document.body.removeChild(link);
-        
-        // 清理URL对象
-        setTimeout(() => {
-            URL.revokeObjectURL(url);
-        }, 100);
-        
-        // 显示成功提示
-        this.showExportSuccess(filename);
-    }
-    
-    // 显示导出成功提示
-    showExportSuccess(filename) {
-        // 创建临时提示元素
-        const toast = document.createElement('div');
-        toast.style.cssText = `
-            position: fixed;
-            top: 20px;
-            right: 20px;
-            background: linear-gradient(135deg, #4caf50, #45a049);
-            color: white;
-            padding: 15px 20px;
-            border-radius: 8px;
-            box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3);
-            z-index: 10000;
-            font-size: 14px;
-            max-width: 300px;
-            word-wrap: break-word;
-            animation: slideInRight 0.3s ease-out;
-        `;
-        
-        toast.innerHTML = `
-            
- - - -
-
导出成功!
-
${filename}
-
-
- `; - - // 添加动画样式 - const style = document.createElement('style'); - style.textContent = ` - @keyframes slideInRight { - from { - transform: translateX(100%); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } - } - @keyframes slideOutRight { - from { - transform: translateX(0); - opacity: 1; - } - to { - transform: translateX(100%); - opacity: 0; - } - } - `; - document.head.appendChild(style); - - document.body.appendChild(toast); - - // 3秒后自动消失 - setTimeout(() => { - toast.style.animation = 'slideOutRight 0.3s ease-in'; - setTimeout(() => { - if (toast.parentNode) { - document.body.removeChild(toast); - } - if (style.parentNode) { - document.head.removeChild(style); - } - }, 300); - }, 3000); - } -} - -// 页面加载完成后初始化应用 -document.addEventListener('DOMContentLoaded', () => { - new JSQuizApp(); -}); - -// 添加键盘快捷键支持 -document.addEventListener('keydown', (e) => { - // 按R键刷新题目 - if (e.key.toLowerCase() === 'r' && !e.ctrlKey && !e.metaKey) { - const refreshBtn = document.getElementById('refreshBtn'); - if (refreshBtn && !document.querySelector('.loading').style.display !== 'none') { - refreshBtn.click(); - } - } - - // 按数字键1-4选择选项 - if (['1', '2', '3', '4'].includes(e.key)) { - const options = document.querySelectorAll('.option'); - const index = parseInt(e.key) - 1; - if (options[index] && !options[index].style.pointerEvents) { - options[index].click(); - } - } - - // 按Enter键提交答案 - if (e.key === 'Enter') { - const submitBtn = document.getElementById('submitBtn'); - if (submitBtn && !submitBtn.disabled) { - submitBtn.click(); - } - } -}); - -// 添加触摸设备支持 -if ('ontouchstart' in window) { - document.addEventListener('touchstart', () => {}, { passive: true }); -} - -// 添加网络状态监听 -if ('navigator' in window && 'onLine' in navigator) { - window.addEventListener('online', () => { - console.log('网络连接已恢复'); - }); - - window.addEventListener('offline', () => { - console.log('网络连接已断开'); - }); -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json deleted file mode 100755 index 0499383a..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "id": 11, - "question": "输出是什么?", - "code": "function Person(firstName, lastName) {\n this.firstName = firstName;\n this.lastName = lastName;\n}\n\nconst member = new Person(\"Lydia\", \"Hallie\");\nPerson.getFullName = function () {\n return `${this.firstName} ${this.lastName}`;\n}\n\nconsole.log(member.getFullName());", - "options": [ - "A: `TypeError`", - "B: `SyntaxError`", - "C: `Lydia Hallie`", - "D: `undefined` `undefined`" - ], - "answer": "A", - "explanation": "你不能像常规对象那样,给构造函数添加属性。如果你想一次性给所有实例添加特性,你应该使用原型。因此本例中,使用如下方式:\n\n```js\nPerson.prototype.getFullName = function () {\n return `${this.firstName} ${this.lastName}`;\n}\n```\n\n这才会使 `member.getFullName()` 起作用。为什么这么做有益的?假设我们将这个方法添加到构造函数本身里。也许不是每个 `Person` 实例都需要这个方法。这将浪费大量内存空间,因为它们仍然具有该属性,这将占用每个实例的内存空间。相反,如果我们只将它添加到原型中,那么它只存在于内存中的一个位置,但是所有实例都可以访问它!" - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/background.css deleted file mode 100755 index 5e15d96d..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/background.css +++ /dev/null @@ -1,81 +0,0 @@ -/* 背景样式文件 */ -body { - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 25%, #ffd3a5 50%, #a8e6cf 75%, #88d8a3 100%); - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; - position: relative; -} - -/* 背景动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(39, 174, 96, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(46, 204, 113, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(26, 188, 156, 0.05) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 浮动装饰圆点 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(39, 174, 96, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(46, 204, 113, 0.2), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(26, 188, 156, 0.3), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(39, 174, 96, 0.2), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(46, 204, 113, 0.3), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: floatDots 20s linear infinite; - pointer-events: none; - z-index: -1; -} - -@keyframes floatDots { - 0% { - transform: translateY(0px); - } - 100% { - transform: translateY(-100px); - } -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - body::after { - background-size: 150px 75px; - animation-duration: 25s; - } -} - -@media (max-width: 480px) { - body::after { - background-size: 100px 50px; - animation-duration: 30s; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/style.css deleted file mode 100755 index a190f17c..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/style.css +++ /dev/null @@ -1,339 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #2c3e50; - min-height: 100vh; - overflow-x: hidden; -} - -/* 容器布局 */ -.container { - min-height: 100vh; - display: flex; - flex-direction: column; - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - padding: 30px 0; -} - -.title { - font-size: 2.5rem; - font-weight: 700; - color: #27ae60; - margin-bottom: 10px; - text-shadow: 0 2px 4px rgba(39, 174, 96, 0.2); -} - -.subtitle { - font-size: 1.1rem; - color: #7f8c8d; - font-weight: 400; -} - -/* 主要内容区域 */ -.main { - flex: 1; - display: flex; - justify-content: center; - align-items: center; -} - -.content-card { - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - padding: 40px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); - backdrop-filter: blur(10px); - border: 1px solid rgba(39, 174, 96, 0.1); - width: 100%; - max-width: 600px; - transition: transform 0.3s ease, box-shadow 0.3s ease; -} - -.content-card:hover { - transform: translateY(-5px); - box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15); -} - -/* KFC文案内容 */ -.kfc-content { - min-height: 200px; - padding: 30px; - background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); - border-radius: 15px; - border-left: 5px solid #27ae60; - margin-bottom: 30px; - position: relative; - overflow: hidden; -} - -.kfc-content::before { - content: '"'; - position: absolute; - top: 10px; - left: 15px; - font-size: 3rem; - color: #27ae60; - opacity: 0.3; - font-family: serif; -} - -.kfc-content p { - font-size: 1.1rem; - line-height: 1.8; - color: #2c3e50; - margin-left: 20px; - position: relative; - z-index: 1; -} - -.loading-text { - text-align: center; - color: #7f8c8d; - font-style: italic; -} - -/* 按钮组 */ -.button-group { - display: flex; - gap: 15px; - justify-content: center; - margin-bottom: 20px; -} - -.generate-btn, .copy-btn { - padding: 15px 30px; - border: none; - border-radius: 50px; - font-size: 1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - position: relative; - overflow: hidden; -} - -.generate-btn { - background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); - color: white; - box-shadow: 0 4px 15px rgba(39, 174, 96, 0.3); -} - -.generate-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(39, 174, 96, 0.4); -} - -.generate-btn:active { - transform: translateY(0); -} - -.generate-btn:disabled { - opacity: 0.7; - cursor: not-allowed; - transform: none; -} - -.copy-btn { - background: linear-gradient(135deg, #3498db 0%, #5dade2 100%); - color: white; - box-shadow: 0 4px 15px rgba(52, 152, 219, 0.3); -} - -.copy-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(52, 152, 219, 0.4); -} - -/* 编号信息 */ -.index-info { - text-align: center; - padding: 10px; - background: rgba(39, 174, 96, 0.1); - border-radius: 10px; - border: 1px solid rgba(39, 174, 96, 0.2); -} - -.index-text { - color: #27ae60; - font-weight: 600; - font-size: 0.9rem; -} - -#indexNumber { - color: #2c3e50; - font-weight: 700; -} - -/* 底部 */ -.footer { - text-align: center; - padding: 20px 0; - color: #7f8c8d; - font-size: 0.9rem; - margin-top: 40px; -} - -/* 提示框 */ -.toast { - position: fixed; - top: 20px; - right: 20px; - background: #27ae60; - color: white; - padding: 15px 25px; - border-radius: 10px; - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); - transform: translateX(400px); - transition: transform 0.3s ease; - z-index: 1000; - font-weight: 600; -} - -.toast.show { - transform: translateX(0); -} - -/* 平板端适配 (768px - 1024px) */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - padding: 15px; - } - - .title { - font-size: 2.2rem; - } - - .content-card { - padding: 35px; - max-width: 550px; - } - - .kfc-content { - padding: 25px; - min-height: 180px; - } - - .button-group { - flex-direction: row; - gap: 12px; - } - - .generate-btn, .copy-btn { - padding: 12px 25px; - font-size: 0.95rem; - } -} - -/* 手机端适配 (最大768px) */ -@media (max-width: 768px) { - .container { - padding: 10px; - } - - .header { - margin-bottom: 30px; - padding: 20px 0; - } - - .title { - font-size: 1.8rem; - margin-bottom: 8px; - } - - .subtitle { - font-size: 1rem; - } - - .content-card { - padding: 25px; - margin: 0 5px; - border-radius: 15px; - } - - .kfc-content { - padding: 20px; - min-height: 150px; - margin-bottom: 25px; - } - - .kfc-content::before { - font-size: 2.5rem; - top: 5px; - left: 10px; - } - - .kfc-content p { - font-size: 1rem; - line-height: 1.7; - margin-left: 15px; - } - - .button-group { - flex-direction: column; - gap: 10px; - } - - .generate-btn, .copy-btn { - padding: 12px 20px; - font-size: 0.9rem; - width: 100%; - } - - .footer { - font-size: 0.8rem; - margin-top: 30px; - } - - .toast { - right: 10px; - left: 10px; - transform: translateY(-100px); - font-size: 0.9rem; - } - - .toast.show { - transform: translateY(0); - } -} - -/* 小屏手机适配 (最大480px) */ -@media (max-width: 480px) { - .title { - font-size: 1.6rem; - } - - .content-card { - padding: 20px; - margin: 0; - } - - .kfc-content { - padding: 15px; - min-height: 120px; - } - - .kfc-content p { - font-size: 0.95rem; - margin-left: 10px; - } - - .generate-btn, .copy-btn { - padding: 10px 15px; - font-size: 0.85rem; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/index.html deleted file mode 100755 index 49ec4123..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/index.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - 随机KFC文案生成器 - - - - -
-
-

🍗 随机KFC文案生成器

-

疯狂星期四,文案来一套!

-
- -
-
-
-

点击按钮获取随机KFC文案...

-
- -
- - -
- - -
-
- -
-

© 2024 KFC文案生成器 | 让每个星期四都疯狂起来

-
-
- -
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/js/main.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/js/main.js deleted file mode 100755 index d5188864..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/js/main.js +++ /dev/null @@ -1,240 +0,0 @@ -// KFC文案生成器主要功能 -class KFCGenerator { - constructor() { - this.apiEndpoints = []; - this.currentApiIndex = 0; - this.isLoading = false; - - this.init(); - } - - // 初始化 - async init() { - await this.loadApiEndpoints(); - this.bindEvents(); - } - - // 加载API接口列表 - async loadApiEndpoints() { - try { - // 直接硬编码API端点,避免CORS问题 - this.apiEndpoints = ["https://60s.api.shumengya.top"]; - } catch (error) { - console.error('加载API接口列表失败:', error); - this.showToast('加载接口配置失败', 'error'); - } - } - - // 绑定事件 - bindEvents() { - const generateBtn = document.getElementById('generateBtn'); - const copyBtn = document.getElementById('copyBtn'); - - generateBtn.addEventListener('click', () => this.generateKFC()); - copyBtn.addEventListener('click', () => this.copyContent()); - } - - // 生成KFC文案 - async generateKFC() { - if (this.isLoading) return; - - this.setLoadingState(true); - - let success = false; - let attempts = 0; - const maxAttempts = this.apiEndpoints.length; - - while (!success && attempts < maxAttempts) { - try { - const apiUrl = this.apiEndpoints[this.currentApiIndex]; - const data = await this.fetchKFCData(apiUrl); - - if (data && data.code === 200 && data.data && data.data.kfc) { - this.displayKFC(data.data); - success = true; - } else { - throw new Error('API返回数据格式错误'); - } - } catch (error) { - console.error(`API ${this.currentApiIndex + 1} 请求失败:`, error); - this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length; - attempts++; - } - } - - if (!success) { - this.showError('所有API接口都无法访问,请稍后重试'); - } - - this.setLoadingState(false); - } - - // 请求KFC数据 - async fetchKFCData(apiUrl) { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 - - try { - const response = await fetch(`${apiUrl}/v2/kfc`, { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - signal: controller.signal - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - return await response.json(); - } catch (error) { - clearTimeout(timeoutId); - throw error; - } - } - - // 显示KFC文案 - displayKFC(data) { - const contentElement = document.getElementById('kfcContent'); - const indexElement = document.getElementById('indexNumber'); - const indexInfo = document.getElementById('indexInfo'); - const copyBtn = document.getElementById('copyBtn'); - - // 显示文案内容 - contentElement.innerHTML = `

${this.escapeHtml(data.kfc)}

`; - - // 显示编号信息 - if (data.index) { - indexElement.textContent = data.index; - indexInfo.style.display = 'block'; - } else { - indexInfo.style.display = 'none'; - } - - // 显示复制按钮 - copyBtn.style.display = 'inline-block'; - - // 添加显示动画 - contentElement.style.opacity = '0'; - contentElement.style.transform = 'translateY(20px)'; - - setTimeout(() => { - contentElement.style.transition = 'all 0.5s ease'; - contentElement.style.opacity = '1'; - contentElement.style.transform = 'translateY(0)'; - }, 100); - } - - // 显示错误信息 - showError(message) { - const contentElement = document.getElementById('kfcContent'); - contentElement.innerHTML = `

${this.escapeHtml(message)}

`; - - const copyBtn = document.getElementById('copyBtn'); - const indexInfo = document.getElementById('indexInfo'); - copyBtn.style.display = 'none'; - indexInfo.style.display = 'none'; - } - - // 复制文案内容 - async copyContent() { - const contentElement = document.getElementById('kfcContent'); - const textContent = contentElement.querySelector('p')?.textContent; - - if (!textContent || textContent.includes('点击按钮获取') || textContent.includes('失败')) { - this.showToast('没有可复制的内容', 'error'); - return; - } - - try { - if (navigator.clipboard && window.isSecureContext) { - await navigator.clipboard.writeText(textContent); - } else { - // 降级方案 - const textArea = document.createElement('textarea'); - textArea.value = textContent; - textArea.style.position = 'fixed'; - textArea.style.left = '-999999px'; - textArea.style.top = '-999999px'; - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - document.execCommand('copy'); - textArea.remove(); - } - - this.showToast('文案已复制到剪贴板', 'success'); - } catch (error) { - console.error('复制失败:', error); - this.showToast('复制失败,请手动选择复制', 'error'); - } - } - - // 设置加载状态 - setLoadingState(loading) { - this.isLoading = loading; - const generateBtn = document.getElementById('generateBtn'); - const btnText = generateBtn.querySelector('.btn-text'); - const btnLoading = generateBtn.querySelector('.btn-loading'); - - if (loading) { - generateBtn.disabled = true; - btnText.style.display = 'none'; - btnLoading.style.display = 'inline'; - } else { - generateBtn.disabled = false; - btnText.style.display = 'inline'; - btnLoading.style.display = 'none'; - } - } - - // 显示提示消息 - showToast(message, type = 'success') { - const toast = document.getElementById('toast'); - toast.textContent = message; - toast.className = `toast ${type}`; - toast.classList.add('show'); - - setTimeout(() => { - toast.classList.remove('show'); - }, 3000); - } - - // HTML转义 - escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; - } -} - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', () => { - const generator = new KFCGenerator(); - // 页面加载完成后自动生成一条文案 - setTimeout(() => { - generator.generateKFC(); - }, 1000); -}); - -// 添加键盘快捷键支持 -document.addEventListener('keydown', (event) => { - // 按空格键生成文案 - if (event.code === 'Space' && event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') { - event.preventDefault(); - document.getElementById('generateBtn').click(); - } - - // Ctrl+C 复制文案 - if (event.ctrlKey && event.key === 'c' && event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') { - const copyBtn = document.getElementById('copyBtn'); - if (copyBtn.style.display !== 'none') { - event.preventDefault(); - copyBtn.click(); - } - } -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/返回接口.json deleted file mode 100755 index 23ea61f5..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/返回接口.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "index": 78, - "kfc": "我叫夯大力 立冬给我准备了糖炒栗子了没有 没准备的自动绝交 再 v 我 50 吃疯狂星期四 然后再给我点杯奶茶 再给我两万块钱 懂吗你们" - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言.html new file mode 100644 index 00000000..fd8f3dcd --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言.html @@ -0,0 +1,56 @@ + + + + +随机一言 + + + + + +
+ +

💭 随机一言

+ +
+
+
加载中...
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/background.css deleted file mode 100755 index 7ef065d5..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/background.css +++ /dev/null @@ -1,167 +0,0 @@ -/* 背景样式文件 - 金色光辉主题 */ - -/* 主背景 */ -body { - background: linear-gradient( - 135deg, - #f1f8e9 0%, - #dcedc8 25%, - #c8e6c8 50%, - #a5d6a7 75%, - #81c784 100% - ); - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; - position: relative; -} - -/* 背景装饰层 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 20% 80%, rgba(129, 199, 132, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(165, 214, 167, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(102, 187, 106, 0.05) 0%, transparent 50%); - pointer-events: none; - z-index: 1; -} - -/* 动态光点效果 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(129, 199, 132, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(165, 214, 167, 0.2), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(102, 187, 106, 0.4), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(129, 199, 132, 0.2), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(165, 214, 167, 0.3), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: sparkle 20s linear infinite; - pointer-events: none; - z-index: 2; -} - -/* 背景动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -@keyframes sparkle { - 0% { - transform: translateY(0); - opacity: 1; - } - 100% { - transform: translateY(-100vh); - opacity: 0; - } -} - -/* 响应式背景调整 */ - -/* 平板端背景 */ -@media (min-width: 768px) and (max-width: 1024px) { - body::after { - background-size: 250px 120px; - } -} - -/* 电脑端背景 */ -@media (min-width: 1024px) { - body { - background-size: 300% 300%; - } - - body::after { - background-size: 300px 150px; - animation-duration: 25s; - } -} - -/* 手机端背景优化 */ -@media (max-width: 767px) { - body { - background-size: 200% 200%; - animation-duration: 10s; - } - - body::before { - background: - radial-gradient(circle at 30% 70%, rgba(129, 199, 132, 0.08) 0%, transparent 40%), - radial-gradient(circle at 70% 30%, rgba(165, 214, 167, 0.08) 0%, transparent 40%); - } - - body::after { - background-size: 150px 80px; - animation-duration: 15s; - } -} - -/* 超小屏幕背景 */ -@media (max-width: 479px) { - body { - background: linear-gradient( - 135deg, - #f1f8e9 0%, - #dcedc8 50%, - #c8e6c8 100% - ); - background-size: 150% 150%; - } - - body::after { - background-size: 120px 60px; - } -} - -/* 深色模式支持 */ -@media (prefers-color-scheme: dark) { - body { - background: linear-gradient( - 135deg, - #1b2e1b 0%, - #2e4a2e 25%, - #3e5e3e 50%, - #4e6e4e 75%, - #5e7e5e 100% - ); - } - - body::before { - background: - radial-gradient(circle at 20% 80%, rgba(129, 199, 132, 0.05) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(165, 214, 167, 0.05) 0%, transparent 50%); - } -} - -/* 减少动画效果(用户偏好) */ -@media (prefers-reduced-motion: reduce) { - body, - body::before, - body::after { - animation: none; - } - - body { - background: linear-gradient(135deg, #f1f8e9 0%, #dcedc8 50%, #c8e6c8 100%); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/style.css deleted file mode 100755 index d48fa7b8..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/style.css +++ /dev/null @@ -1,357 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #2e7d32; - overflow-x: hidden; -} - -/* 容器布局 */ -.container { - min-height: 100vh; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - padding: 20px; - position: relative; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - z-index: 10; -} - -.title { - font-size: 3rem; - font-weight: 700; - color: #2e7d32; - text-shadow: - 0 0 10px rgba(129, 199, 132, 0.8), - 0 0 20px rgba(129, 199, 132, 0.6), - 0 0 30px rgba(129, 199, 132, 0.4); - margin-bottom: 10px; - animation: titleGlow 3s ease-in-out infinite alternate; -} - -.subtitle { - font-size: 1.2rem; - color: #388e3c; - opacity: 0.9; - text-shadow: 0 0 5px rgba(102, 187, 106, 0.5); -} - -/* 主内容区域 */ -.main-content { - width: 100%; - max-width: 800px; - z-index: 10; -} - -/* 一言容器 */ -.quote-container { - background: linear-gradient(135deg, rgba(129, 199, 132, 0.1), rgba(165, 214, 167, 0.05)); - border: 2px solid rgba(102, 187, 106, 0.3); - border-radius: 20px; - padding: 40px; - margin-bottom: 30px; - backdrop-filter: blur(10px); - box-shadow: - 0 8px 32px rgba(102, 187, 106, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.1); - position: relative; - overflow: hidden; -} - -.quote-container::before { - content: ''; - position: absolute; - top: -2px; - left: -2px; - right: -2px; - bottom: -2px; - background: linear-gradient(45deg, #81c784, #a5d6a7, #81c784, #a5d6a7); - border-radius: 22px; - z-index: -1; - animation: borderGlow 4s linear infinite; -} - -/* 加载状态 */ -.loading { - display: none; - text-align: center; - color: #2e7d32; -} - -.loading.show { - display: block; -} - -.loading-spinner { - width: 40px; - height: 40px; - border: 4px solid rgba(102, 187, 106, 0.3); - border-top: 4px solid #2e7d32; - border-radius: 50%; - margin: 0 auto 15px; - animation: spin 1s linear infinite; -} - -/* 一言显示 */ -.quote-display { - display: block; - text-align: center; -} - -.quote-display.hide { - display: none; -} - -.quote-text { - font-size: 1.8rem; - line-height: 1.8; - color: #2e7d32; - margin-bottom: 20px; - text-shadow: 0 1px 2px rgba(102, 187, 106, 0.1); - font-weight: 500; -} - -.quote-index { - font-size: 0.9rem; - color: #388e3c; - opacity: 0.8; -} - -/* 错误信息 */ -.error-message { - display: none; - text-align: center; - color: #66bb6a; -} - -.error-message.show { - display: block; -} - -.error-icon { - font-size: 2rem; - margin-bottom: 10px; -} - -.error-text { - font-size: 1.1rem; - line-height: 1.5; -} - -/* 控制按钮 */ -.controls { - text-align: center; -} - -.refresh-btn { - background: linear-gradient(135deg, #81c784, #a5d6a7); - border: none; - border-radius: 50px; - padding: 15px 30px; - font-size: 1.1rem; - font-weight: 600; - color: #2e7d32; - cursor: pointer; - display: inline-flex; - align-items: center; - gap: 10px; - transition: all 0.3s ease; - box-shadow: - 0 4px 15px rgba(102, 187, 106, 0.3), - inset 0 1px 0 rgba(255, 255, 255, 0.3); - position: relative; - overflow: hidden; -} - -.refresh-btn:hover { - transform: translateY(-2px); - box-shadow: - 0 6px 20px rgba(102, 187, 106, 0.4), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.refresh-btn:active { - transform: translateY(0); -} - -.refresh-btn:disabled { - opacity: 0.6; - cursor: not-allowed; - transform: none; -} - -.btn-icon { - font-size: 1.2rem; - transition: transform 0.3s ease; -} - -.refresh-btn:hover .btn-icon { - transform: rotate(180deg); -} - -/* 底部 */ -.footer { - margin-top: 40px; - text-align: center; - color: #388e3c; - opacity: 0.8; - font-size: 0.9rem; -} - -/* 动画效果 */ -@keyframes titleGlow { - 0% { - text-shadow: - 0 0 10px rgba(129, 199, 132, 0.8), - 0 0 20px rgba(129, 199, 132, 0.6), - 0 0 30px rgba(129, 199, 132, 0.4); - } - 100% { - text-shadow: - 0 0 15px rgba(129, 199, 132, 1), - 0 0 25px rgba(129, 199, 132, 0.8), - 0 0 35px rgba(129, 199, 132, 0.6); - } -} - -@keyframes borderGlow { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 30px; - } - - .title { - font-size: 3.5rem; - } - - .subtitle { - font-size: 1.3rem; - } - - .quote-container { - padding: 50px; - } - - .quote-text { - font-size: 2rem; - } -} - -/* 电脑端适配 (1024px+) */ -@media (min-width: 1024px) { - .container { - padding: 40px; - } - - .title { - font-size: 4rem; - } - - .subtitle { - font-size: 1.4rem; - } - - .quote-container { - padding: 60px; - max-width: 900px; - } - - .quote-text { - font-size: 2.2rem; - line-height: 1.9; - } - - .refresh-btn { - padding: 18px 36px; - font-size: 1.2rem; - } -} - -/* 手机端适配 (小于768px) */ -@media (max-width: 767px) { - .container { - padding: 15px; - } - - .header { - margin-bottom: 30px; - } - - .title { - font-size: 2.5rem; - } - - .subtitle { - font-size: 1rem; - } - - .quote-container { - padding: 25px; - border-radius: 15px; - } - - .quote-text { - font-size: 1.4rem; - line-height: 1.6; - } - - .refresh-btn { - padding: 12px 24px; - font-size: 1rem; - } - - .footer { - margin-top: 30px; - font-size: 0.8rem; - } -} - -/* 超小屏幕适配 (小于480px) */ -@media (max-width: 479px) { - .title { - font-size: 2rem; - } - - .quote-container { - padding: 20px; - } - - .quote-text { - font-size: 1.2rem; - } - - .refresh-btn { - padding: 10px 20px; - font-size: 0.9rem; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/index.html deleted file mode 100755 index b0d4f467..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/index.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - 随机一言 - 金色光辉 - - - - -
-
-

随机一言

-

每一句话都是心灵的光芒

-
- -
-
-
-
-

正在获取一言...

-
- -
-
- 点击下方按钮获取一言 -
-
-
- -
-
⚠️
-
-
-
- -
- -
-
- -
-

愿每一句话都能温暖你的心

-
-
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/js/script.js deleted file mode 100755 index d15eeb6e..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/js/script.js +++ /dev/null @@ -1,222 +0,0 @@ -// 随机一言 JavaScript 功能实现 - -class HitokotoApp { - constructor() { - // API接口列表 - this.apiEndpoints = [ - "https://60s.api.shumengya.top" - ]; - - this.currentEndpointIndex = 0; - this.isLoading = false; - - // DOM 元素 - this.elements = { - loading: document.getElementById('loading'), - quoteDisplay: document.getElementById('quoteDisplay'), - quoteText: document.getElementById('quoteText'), - quoteIndex: document.getElementById('quoteIndex'), - errorMessage: document.getElementById('errorMessage'), - errorText: document.getElementById('errorText'), - refreshBtn: document.getElementById('refreshBtn') - }; - - this.init(); - } - - // 初始化应用 - init() { - this.bindEvents(); - this.hideAllStates(); - this.showQuoteDisplay(); - } - - // 绑定事件 - bindEvents() { - this.elements.refreshBtn.addEventListener('click', () => { - this.fetchHitokoto(); - }); - - // 键盘快捷键支持 - document.addEventListener('keydown', (e) => { - if (e.code === 'Space' && !this.isLoading) { - e.preventDefault(); - this.fetchHitokoto(); - } - }); - } - - // 隐藏所有状态 - hideAllStates() { - this.elements.loading.classList.remove('show'); - this.elements.quoteDisplay.classList.remove('hide'); - this.elements.errorMessage.classList.remove('show'); - } - - // 显示加载状态 - showLoading() { - this.hideAllStates(); - this.elements.loading.classList.add('show'); - this.elements.quoteDisplay.classList.add('hide'); - this.elements.refreshBtn.disabled = true; - this.isLoading = true; - } - - // 显示一言内容 - showQuoteDisplay() { - this.hideAllStates(); - this.elements.quoteDisplay.classList.remove('hide'); - this.elements.refreshBtn.disabled = false; - this.isLoading = false; - } - - // 显示错误信息 - showError(message) { - this.hideAllStates(); - this.elements.errorMessage.classList.add('show'); - this.elements.errorText.textContent = message; - this.elements.refreshBtn.disabled = false; - this.isLoading = false; - } - - // 获取一言数据 - async fetchHitokoto() { - if (this.isLoading) return; - - this.showLoading(); - - // 尝试所有API接口 - for (let i = 0; i < this.apiEndpoints.length; i++) { - const endpointIndex = (this.currentEndpointIndex + i) % this.apiEndpoints.length; - const endpoint = this.apiEndpoints[endpointIndex]; - - try { - const result = await this.tryFetchFromEndpoint(endpoint); - if (result.success) { - this.currentEndpointIndex = endpointIndex; - this.displayHitokoto(result.data); - return; - } - } catch (error) { - console.warn(`接口 ${endpoint} 请求失败:`, error.message); - continue; - } - } - - // 所有接口都失败 - this.showError('所有接口都无法访问,请检查网络连接或稍后重试'); - } - - // 尝试从指定接口获取数据 - async tryFetchFromEndpoint(endpoint) { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 - - try { - // 移除URL中的encoding=text参数,确保返回JSON格式 - const response = await fetch(`${endpoint}/v2/hitokoto`, { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - signal: controller.signal - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - // 验证返回数据格式 - if (data.code === 200 && data.data && data.data.hitokoto) { - return { - success: true, - data: data.data - }; - } else { - throw new Error('返回数据格式不正确'); - } - - } catch (error) { - clearTimeout(timeoutId); - - if (error.name === 'AbortError') { - throw new Error('请求超时'); - } - - throw error; - } - } - - // 显示一言内容 - displayHitokoto(data) { - // 更新一言文本 - this.elements.quoteText.textContent = data.hitokoto; - - // 更新序号信息 - if (data.index) { - this.elements.quoteIndex.textContent = `第 ${data.index} 条`; - } else { - this.elements.quoteIndex.textContent = ''; - } - - // 添加淡入动画效果 - this.elements.quoteText.style.opacity = '0'; - this.elements.quoteIndex.style.opacity = '0'; - - setTimeout(() => { - this.elements.quoteText.style.transition = 'opacity 0.5s ease'; - this.elements.quoteIndex.style.transition = 'opacity 0.5s ease'; - this.elements.quoteText.style.opacity = '1'; - this.elements.quoteIndex.style.opacity = '1'; - }, 100); - - this.showQuoteDisplay(); - - // 控制台输出调试信息 - console.log('一言获取成功:', { - content: data.hitokoto, - index: data.index, - endpoint: this.apiEndpoints[this.currentEndpointIndex] - }); - } - - // 获取随机接口(用于负载均衡) - getRandomEndpoint() { - const randomIndex = Math.floor(Math.random() * this.apiEndpoints.length); - return this.apiEndpoints[randomIndex]; - } -} - -// 页面加载完成后初始化应用 -document.addEventListener('DOMContentLoaded', () => { - const app = new HitokotoApp(); - - // 添加全局错误处理 - window.addEventListener('error', (event) => { - console.error('页面发生错误:', event.error); - }); - - window.addEventListener('unhandledrejection', (event) => { - console.error('未处理的Promise拒绝:', event.reason); - }); - - // 页面可见性变化时的处理 - document.addEventListener('visibilitychange', () => { - if (!document.hidden && !app.isLoading) { - // 页面重新可见时,可以选择刷新内容 - console.log('页面重新可见'); - } - }); - - console.log('随机一言应用初始化完成'); -}); - -// 导出应用类(如果需要在其他地方使用) -if (typeof module !== 'undefined' && module.exports) { - module.exports = HitokotoApp; -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/返回接口.json deleted file mode 100755 index f983c75c..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/返回接口.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "index": 2862, - "hitokoto": "你带上罪恶之冠,即使背负上所有罪恶和孤独,绝不让你受伤" - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html deleted file mode 100755 index 66b58879..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - 每日笑话 - - - -
-

加载中...

- -
- - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/background.css deleted file mode 100755 index 4cb97210..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/background.css +++ /dev/null @@ -1,107 +0,0 @@ -/* background.css - 动态渐变背景 */ -body { - background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab); - background-size: 400% 400%; - animation: gradient 15s ease infinite; -} - -@keyframes gradient { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} -:root { - --bg-yellow: #FFFDE7; /* 浅黄 */ - --bg-blue: #E3F2FD; /* 淡蓝 */ -} - -body { - background: linear-gradient(180deg, var(--bg-yellow) 0%, var(--bg-blue) 100%); - background-attachment: fixed; /* 固定背景,滚动时不移动 */ -} - -body { - margin: 0; - padding: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; - overflow: hidden; - transition: background-color 0.5s ease; -} - -/* Light Theme (Default) */ -[data-theme="light"] { - background: linear-gradient(to bottom, #87CEEB, #B0E0E6); -} - -/* Dark Theme */ -[data-theme="dark"] { - background: linear-gradient(to bottom, #232526, #414345); -} -[data-theme="dark"] .snowflake { - color: #999; -} - -/* Winter Theme */ -[data-theme="winter"] { - background: linear-gradient(to bottom, #a1c4fd, #c2e9fb); -} -[data-theme="winter"] .background-bottom { - position: fixed; - bottom: 0; - left: 0; - width: 100%; - height: 100px; - background: linear-gradient(to top, white, rgba(255, 255, 255, 0)); - z-index: -1; - border-radius: 50% 50% 0 0 / 20px; - box-shadow: 0 -10px 20px rgba(255, 255, 255, 0.5); -} - - -#snowflake-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; - z-index: 0; -} - -.snowflake { - position: absolute; - top: -10%; - color: white; - font-size: 20px; - user-select: none; - animation: fall linear infinite; -} - -@keyframes fall { - to { - transform: translateY(105vh) rotate(360deg); - } -} - -#frost-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: url('https://www.transparenttextures.com/patterns/ice-age.png') repeat; - opacity: 0; - pointer-events: none; - transition: opacity 0.5s ease-in-out; - z-index: 100; -} - -#frost-overlay.is-frosted { - opacity: 0.3; -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/style.css deleted file mode 100755 index ce4fa9f6..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/style.css +++ /dev/null @@ -1,217 +0,0 @@ -:root { - --primary-color-light: #4A90E2; - --text-color-light: #333; - --card-bg-light: rgba(255, 255, 255, 0.85); - - --primary-color-dark: #5271C4; - --text-color-dark: #E0E0E0; - --card-bg-dark: rgba(40, 40, 40, 0.85); - - --primary-color-winter: #6A82FB; - --text-color-winter: #2c3e50; - --card-bg-winter: rgba(255, 255, 255, 0.7); -} - -.container { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - min-height: 100vh; - padding: 20px; - box-sizing: border-box; - text-align: center; - position: relative; - z-index: 1; -} - -.top-nav { - position: absolute; - top: 20px; - right: 20px; - background: rgba(255, 255, 255, 0.3); - padding: 5px; - border-radius: 50px; - backdrop-filter: blur(5px); -} - -.theme-switcher { - display: flex; - gap: 5px; -} - -.theme-btn { - background: transparent; - border: 2px solid transparent; - border-radius: 50%; - width: 40px; - height: 40px; - font-size: 1.5em; - cursor: pointer; - transition: transform 0.2s, border-color 0.2s; -} -.theme-btn:hover { - transform: scale(1.1); -} -.theme-btn.active { - border-color: white; -} - -.title { - font-family: 'ZCOOL KuaiLe', cursive; - font-size: 3em; - margin-bottom: 20px; - transition: color 0.5s ease; -} - -.joke-stream { - width: 100%; - max-width: 500px; - display: flex; - flex-direction: column; - gap: 25px; -} - -.joke-card { - border-radius: 20px; - padding: 30px 40px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15); - width: 100%; - max-width: 500px; - min-height: 150px; - display: flex; - justify-content: center; - align-items: center; - position: relative; - backdrop-filter: blur(8px); - border: 1px solid rgba(255, 255, 255, 0.2); - transition: background-color 0.5s ease, border-color 0.5s ease; -} - -#joke-text { - font-size: 1.5em; - line-height: 1.6; - transition: opacity 0.3s, color 0.5s ease; -} - -/* --- Theming --- */ - -/* Light Theme */ -[data-theme="light"] .title { color: white; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.2); } -[data-theme="light"] .joke-card { background-color: var(--card-bg-light); } -[data-theme="light"] #joke-text { color: var(--text-color-light); } -[data-theme="light"] #new-joke-btn { background-color: var(--primary-color-light); box-shadow: 0 4px 15px rgba(74, 144, 226, 0.4); } -[data-theme="light"] footer { color: rgba(255, 255, 255, 0.8); } - -/* Dark Theme */ -[data-theme="dark"] .title { color: #EAEAEA; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); } -[data-theme="dark"] .joke-card { background-color: var(--card-bg-dark); border-color: rgba(255, 255, 255, 0.1); } -[data-theme="dark"] #joke-text { color: var(--text-color-dark); } -[data-theme="dark"] #new-joke-btn { background-color: var(--primary-color-dark); box-shadow: 0 4px 15px rgba(82, 113, 196, 0.4); } -[data-theme="dark"] footer { color: rgba(200, 200, 200, 0.7); } - -/* Winter Theme */ -[data-theme="winter"] .title { color: #1e3a5f; text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.7); } -[data-theme="winter"] .joke-card { - background-color: var(--card-bg-winter); - border-color: rgba(255, 255, 255, 0.8); - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1), inset 0 0 15px rgba(255, 255, 255, 0.5); -} -[data-theme="winter"] #joke-text { color: var(--text-color-winter); } -[data-theme="winter"] #new-joke-btn { background-color: var(--primary-color-winter); box-shadow: 0 4px 15px rgba(106, 130, 251, 0.4); } -[data-theme="winter"] footer { color: #1e3a5f; } - - -.controls { - margin-top: 30px; -} - -#new-joke-btn { - color: white; - font-size: 1.2em; - font-weight: bold; - padding: 15px 35px; - border: none; - border-radius: 50px; - cursor: pointer; - transition: transform 0.2s ease, box-shadow 0.2s ease, background-color 0.5s ease; -} - -#new-joke-btn:hover { - transform: translateY(-3px); -} - -#new-joke-btn:active { - transform: translateY(1px); -} - -.interactions { - margin-top: 25px; - display: flex; - gap: 20px; -} - -.interaction-btn { - background: rgba(255, 255, 255, 0.7); - border: 1px solid rgba(255, 255, 255, 0.9); - border-radius: 50%; - width: 50px; - height: 50px; - font-size: 1.5em; - cursor: pointer; - transition: transform 0.2s, background-color 0.2s; -} - -.interaction-btn:hover { - transform: scale(1.1); - background: white; -} - -footer { - position: absolute; - bottom: 10px; - font-size: 0.9em; - transition: color 0.5s ease; -} - -/* Loader */ -#loader { - position: absolute; - transition: color 0.5s ease; -} -[data-theme="light"] #loader { color: var(--primary-color-light); } -[data-theme="dark"] #loader { color: var(--primary-color-dark); } -[data-theme="winter"] #loader { color: var(--primary-color-winter); } - -.snowflake-loader { - font-size: 40px; - display: inline-block; - animation: spin 1.5s linear infinite; -} -.snowflake-loader::before { - content: '❄'; -} -@keyframes spin { - to { transform: rotate(360deg); } -} - -.hidden { - display: none; -} - -/* Responsive */ -@media (max-width: 600px) { - .title { - font-size: 2.5em; - } - .joke-card { - padding: 25px; - } - #joke-text { - font-size: 1.2em; - } - .top-nav { - top: 10px; - right: 10px; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/index.html deleted file mode 100755 index 9801ca05..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/index.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - 随机冷笑话 - - - - - -
-
-
- - - -
-
-

冷笑话生成器

-
- -
- -

点击下面的按钮,来点冷笑话吧!

-
- -
- -
- -
- - - - -
-
- -
-

© 2024 冷笑话工坊

-
- - - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/js/script.js deleted file mode 100755 index c9912df1..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/js/script.js +++ /dev/null @@ -1,117 +0,0 @@ -document.addEventListener('DOMContentLoaded', () => { - const jokeTextElem = document.getElementById('joke-text'); - const newJokeBtn = document.getElementById('new-joke-btn'); - const snowflakeContainer = document.getElementById('snowflake-container'); - const frostOverlay = document.getElementById('frost-overlay'); - const windSound = document.getElementById('wind-sound'); - const snowSound = document.getElementById('snow-sound'); - const loader = document.getElementById('loader'); - const themeBtns = document.querySelectorAll('.theme-btn'); - - const apiEndpoints = [ - 'https://60s.api.shumengya.top/v2/dad-joke', - ]; - let currentApiIndex = 0; - - async function fetchJoke() { - jokeTextElem.classList.add('hidden'); - loader.classList.remove('hidden'); - - try { - const response = await fetch(apiEndpoints[currentApiIndex]); - if (!response.ok) throw new Error('Network response was not ok'); - - const data = await response.json(); - if (data.code === 200 && data.data.content) { - updateJokeText(data.data.content); - if (document.body.dataset.theme === 'winter' && Math.random() < 0.3) { - triggerFrostEffect(); - } - } else { - throw new Error('API returned invalid data'); - } - } catch (error) { - console.error('Fetch error:', error); - currentApiIndex = (currentApiIndex + 1) % apiEndpoints.length; - if (currentApiIndex !== 0) { - fetchJoke(); - } else { - jokeTextElem.textContent = '冰箱坏了,暂时没有冷笑话...'; - } - } finally { - loader.classList.add('hidden'); - jokeTextElem.classList.remove('hidden'); - } - } - - function updateJokeText(text) { - jokeTextElem.textContent = ''; - let i = 0; - const typing = setInterval(() => { - if (i < text.length) { - jokeTextElem.textContent += text.charAt(i); - i++; - } else { - clearInterval(typing); - } - }, 50); - } - - function createSnowflakes() { - const snowflakeCount = document.body.dataset.theme === 'dark' ? 50 : 30; - snowflakeContainer.innerHTML = ''; - for (let i = 0; i < snowflakeCount; i++) { - const snowflake = document.createElement('div'); - snowflake.className = 'snowflake'; - snowflake.textContent = '❄️'; - - snowflake.style.left = `${Math.random() * 100}vw`; - snowflake.style.fontSize = `${Math.random() * 15 + 10}px`; - snowflake.style.opacity = Math.random() * 0.5 + 0.3; - - const duration = Math.random() * 10 + 8; - const delay = Math.random() * 10; - - snowflake.style.animation = `fall ${duration}s linear ${delay}s infinite`; - - snowflakeContainer.appendChild(snowflake); - } - } - - function triggerFrostEffect() { - frostOverlay.classList.add('is-frosted'); - windSound.play().catch(e => console.error("Audio play failed:", e)); - setTimeout(() => { - frostOverlay.classList.remove('is-frosted'); - }, 2000); - } - - function setTheme(theme) { - document.body.dataset.theme = theme; - localStorage.setItem('joke-theme', theme); - - themeBtns.forEach(btn => { - btn.classList.toggle('active', btn.dataset.themeTarget === theme); - }); - - if (theme === 'winter') { - snowSound.play().catch(e => console.error("Audio play failed:", e)); - } - - // Recreate snowflakes for theme-specific density - createSnowflakes(); - } - - themeBtns.forEach(btn => { - btn.addEventListener('click', () => { - setTheme(btn.dataset.themeTarget); - }); - }); - - newJokeBtn.addEventListener('click', fetchJoke); - - // Initial setup - const savedTheme = localStorage.getItem('joke-theme') || 'light'; - setTheme(savedTheme); - fetchJoke(); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/接口集合.json deleted file mode 100755 index 37dc3082..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/接口集合.json +++ /dev/null @@ -1 +0,0 @@ -["https://60s.api.shumengya.top"] \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/返回接口.json deleted file mode 100755 index 3cb69b8d..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/返回接口.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "index": 121, - "content": "这个世界上谁最懂猪?蜘蛛(知猪)人。" - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/background.css deleted file mode 100755 index 022ce6d9..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/background.css +++ /dev/null @@ -1,90 +0,0 @@ -body { - background-color: #1a1a1a; - color: #e0e0e0; - font-family: 'Courier New', Courier, monospace; - overflow: hidden; - margin: 0; - padding: 0; -} - -#bg-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -2; - overflow: hidden; - transition: transform 0.2s ease-out; -} - -.floating-emoji { - position: absolute; - user-select: none; - opacity: 0; - animation-iteration-count: infinite; - animation-timing-function: linear; -} - -@keyframes float-top-to-bottom { - 0% { transform: translateY(-10vh) rotate(0deg); opacity: 0; } - 10%, 90% { opacity: 0.7; } - 100% { transform: translateY(110vh) rotate(360deg); opacity: 0; } -} - -@keyframes float-bottom-to-top { - 0% { transform: translateY(110vh) rotate(0deg); opacity: 0; } - 10%, 90% { opacity: 0.7; } - 100% { transform: translateY(-10vh) rotate(360deg); opacity: 0; } -} - -@keyframes float-left-to-right { - 0% { transform: translateX(-10vw) rotate(0deg); opacity: 0; } - 10%, 90% { opacity: 0.7; } - 100% { transform: translateX(110vw) rotate(360deg); opacity: 0; } -} - -@keyframes float-right-to-left { - 0% { transform: translateX(110vw) rotate(0deg); opacity: 0; } - 10%, 90% { opacity: 0.7; } - 100% { transform: translateX(-10vw) rotate(360deg); opacity: 0; } -} - -.text-fragment { - position: absolute; - font-size: 24px; - color: rgba(255, 0, 255, 0.4); - opacity: 0; - animation: float-fragment 15s linear infinite, fade-in-out 15s linear infinite; - user-select: none; -} - -@keyframes float-fragment { - 0% { transform: translate(0, 0) rotate(0deg); } - 25% { transform: translate(20px, 40px) rotate(15deg); } - 50% { transform: translate(-30px, -10px) rotate(-10deg); } - 75% { transform: translate(10px, -30px) rotate(5deg); } - 100% { transform: translate(0, 0) rotate(0deg); } -} - -@keyframes fade-in-out { - 0%, 100% { opacity: 0; } - 10%, 90% { opacity: 0.4; } -} - -.screen-crack { - position: absolute; - width: 200px; - height: 200px; - background-image: url('data:image/svg+xml;utf8,'); - opacity: 0; - animation: flicker-crack 25s steps(1, end) infinite; -} - -@keyframes flicker-crack { - 0%, 100% { opacity: 0; } - 50% { opacity: 0.3; } - 51% { opacity: 0; } - 75% { opacity: 0.2; } - 76% { opacity: 0; } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/style.css deleted file mode 100755 index 1441da73..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/style.css +++ /dev/null @@ -1,235 +0,0 @@ -.container { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - min-height: 100vh; - padding: 20px; - box-sizing: border-box; - position: relative; - z-index: 1; -} - -.content-card { - background: rgba(20, 20, 20, 0.7); - border: none; - padding: 40px; - max-width: 600px; - width: 100%; - text-align: center; - backdrop-filter: blur(5px); - position: relative; - clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%); -} - -.body-animated .content-card { - animation: tremble 0.4s infinite, glitch-shadow 1.5s steps(1, end) infinite; -} - -@keyframes tremble { - 0% { clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%); } - 25% { clip-path: polygon(2% 5%, 98% 2%, 99% 100%, 1% 98%); } - 50% { clip-path: polygon(3% 4%, 96% 1%, 100% 96%, 2% 100%); } - 75% { clip-path: polygon(1% 6%, 97% 3%, 98% 95%, 0% 99%); } - 100% { clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%); } -} - -@keyframes glitch-shadow { - 0% { - box-shadow: - 0 0 8px rgba(255, 0, 255, 0.5), - inset 0 0 8px rgba(255, 0, 255, 0.4); - } - 33% { - box-shadow: - 0 0 8px rgba(0, 255, 255, 0.5), - inset 0 0 8px rgba(0, 255, 255, 0.4); - } - 66% { - box-shadow: - 0 0 8px rgba(0, 255, 0, 0.5), - inset 0 0 8px rgba(0, 255, 0, 0.4); - } - 100% { - box-shadow: - 0 0 8px rgba(255, 0, 255, 0.5), - inset 0 0 8px rgba(255, 0, 255, 0.4); - } -} - -#literature-text { - font-size: 1.2em; - line-height: 1.8; - min-height: 100px; - color: #e0e0e0; - text-shadow: 0 0 5px rgba(0, 255, 135, 0.5); - animation: text-flicker 15s linear infinite; -} - -.body-animated #literature-text { - animation: text-flicker 15s linear infinite, text-shadow-glitch 2s steps(1, end) infinite; -} - -@keyframes text-flicker { - 0%, 100% { opacity: 1; } - 50.0% { opacity: 0.95; } - 50.5% { opacity: 1; } -} - -@keyframes text-shadow-glitch { - 0% { - text-shadow: - 1px 0 0 rgba(255,0,255,0.5), - -1px 0 0 rgba(0,255,255,0.5); - } - 10% { - text-shadow: - -1px 0 0 rgba(255,0,255,0.5), - 1px 0 0 rgba(0,255,255,0.5); - } - 11%, 100% { - text-shadow: none; - } -} - -.controls { - margin-top: 30px; - display: flex; - align-items: center; - gap: 20px; -} - -#new-literature-btn { - background-color: #ff00ff; - color: #fff; - border: none; - padding: 12px 25px; - font-size: 1em; - cursor: pointer; - border-radius: 5px; - text-transform: uppercase; - font-weight: bold; - transition: transform 0.2s, box-shadow 0.2s; - box-shadow: 0 0 10px #ff00ff, 0 0 20px #ff00ff; -} - -#new-literature-btn:hover { - transform: scale(1.05); - box-shadow: 0 0 15px #ff00ff, 0 0 30px #ff00ff; -} - -#new-literature-btn:active { - transform: scale(0.95); -} - -/* Animation Toggle Switch */ -.switch-container { - display: flex; - align-items: center; - gap: 10px; - color: #aaa; -} - -.switch { - position: relative; - display: inline-block; - width: 50px; - height: 24px; -} - -.switch input { - opacity: 0; - width: 0; - height: 0; -} - -.slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: #ccc; - transition: .4s; -} - -.slider:before { - position: absolute; - content: ""; - height: 16px; - width: 16px; - left: 4px; - bottom: 4px; - background-color: white; - transition: .4s; -} - -input:checked + .slider { - background-color: #ff00ff; -} - -input:checked + .slider:before { - transform: translateX(26px); -} - -.slider.round { - border-radius: 34px; -} - -.slider.round:before { - border-radius: 50%; -} - -/* Glitch Overlay & Animations */ -#glitch-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - pointer-events: none; -} - -.body-animated #glitch-overlay { - animation: color-shift 15s steps(1, end) infinite; -} - -@keyframes color-shift { - 0%, 100% { background: transparent; } - 10% { background: rgba(255, 0, 0, 0.05); } - 10.1% { background: transparent; } - 20% { background: rgba(0, 255, 0, 0.05); } - 20.1% { background: transparent; } - 30% { background: rgba(0, 0, 255, 0.05); } - 30.1% { background: transparent; } -} - -.flicker-block { - position: absolute; - background: rgba(255, 255, 255, 0.1); - opacity: 0; -} - -.body-animated .flicker-block { - animation: flicker 3s infinite; -} - -@keyframes flicker { - 0%, 100% { opacity: 0; } - 50% { opacity: 1; } -} - -/* Responsive Design */ -@media (max-width: 768px) { - .content-card { - padding: 20px; - } - #literature-text { - font-size: 1em; - } - .controls { - flex-direction: column; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/index.html deleted file mode 100755 index c852d74c..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/index.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - 随机发病文学 - - - - -
-
-
- -
-
-

正在加载发病文学...

-
- -
- -
- - -
-
-
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/js/script.js deleted file mode 100755 index 765be465..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/js/script.js +++ /dev/null @@ -1,147 +0,0 @@ -document.addEventListener('DOMContentLoaded', () => { - const literatureTextElem = document.getElementById('literature-text'); - const newLiteratureBtn = document.getElementById('new-literature-btn'); - const animationToggle = document.getElementById('animation-toggle'); - const bgContainer = document.getElementById('bg-container'); - const body = document.body; - - const apiEndpoints = [ - 'https://60s.api.shumengya.top/v2/fabing', - // Add fallback APIs here if available - ]; - - let currentApiIndex = 0; - - async function fetchLiterature() { - literatureTextElem.textContent = '正在卖力发疯中...'; - literatureTextElem.style.opacity = '0.5'; - - try { - const response = await fetch(apiEndpoints[currentApiIndex]); - if (!response.ok) { - throw new Error('Network response was not ok'); - } - const data = await response.json(); - if (data.code === 200) { - literatureTextElem.textContent = data.data.saying; - } else { - throw new Error('API returned an error'); - } - } catch (error) { - console.error('Fetch error:', error); - currentApiIndex = (currentApiIndex + 1) % apiEndpoints.length; - if (currentApiIndex !== 0) { - fetchLiterature(); // Retry with the next API - } else { - literatureTextElem.textContent = '疯不起来了,请稍后再试。'; - } - } finally { - literatureTextElem.style.opacity = '1'; - } - } - - function createFloatingEmojis() { - const existingEmojis = bgContainer.querySelectorAll('.floating-emoji'); - existingEmojis.forEach(e => e.remove()); - - const emojis = ['🤯', '😵', '🤪', '🥴', '🤡', '👹', '👻', '💀', '💥', '🔥', '🌪️', '😵‍💫']; - const animationNames = ['float-top-to-bottom', 'float-bottom-to-top', 'float-left-to-right', 'float-right-to-left']; - const emojiCount = 25; - - for (let i = 0; i < emojiCount; i++) { - const emojiEl = document.createElement('div'); - emojiEl.className = 'floating-emoji'; - emojiEl.textContent = emojis[Math.floor(Math.random() * emojis.length)]; - - const animationName = animationNames[Math.floor(Math.random() * animationNames.length)]; - emojiEl.style.animationName = animationName; - emojiEl.style.animationDuration = `${Math.random() * 10 + 15}s`; // 15-25 seconds - emojiEl.style.animationDelay = `${Math.random() * 20}s`; - emojiEl.style.fontSize = `${Math.random() * 20 + 20}px`; - - // Set initial position based on animation direction - if (animationName.includes('top') || animationName.includes('bottom')) { // Vertical movement - emojiEl.style.left = `${Math.random() * 100}vw`; - } else { // Horizontal movement - emojiEl.style.top = `${Math.random() * 100}vh`; - } - - bgContainer.appendChild(emojiEl); - } - } - - function createFragments() { - const existingFragments = bgContainer.querySelectorAll('.text-fragment'); - existingFragments.forEach(f => f.remove()); - - const fragments = ['我', '疯', '了', '?', '!', '…', '救命', '为什么', '好烦', '啊啊啊']; - for (let i = 0; i < 20; i++) { - const frag = document.createElement('div'); - frag.className = 'text-fragment'; - frag.textContent = fragments[Math.floor(Math.random() * fragments.length)]; - frag.style.top = `${Math.random() * 100}%`; - frag.style.left = `${Math.random() * 100}%`; - frag.style.animationDelay = `${Math.random() * 15}s`; - frag.style.fontSize = `${Math.random() * 12 + 12}px`; - bgContainer.appendChild(frag); - } - } - - function createCracks() { - for (let i = 0; i < 2; i++) { - const crack = document.createElement('div'); - crack.className = 'screen-crack'; - crack.style.top = `${Math.random() * 80}%`; - crack.style.left = `${Math.random() * 80}%`; - crack.style.transform = `rotate(${Math.random() * 360}deg)`; - crack.style.animationDelay = `${Math.random() * 25}s`; - bgContainer.appendChild(crack); - } - } - - function createFlickerBlocks() { - const glitchOverlay = document.getElementById('glitch-overlay'); - for (let i = 0; i < 3; i++) { - const block = document.createElement('div'); - block.className = 'flicker-block'; - block.style.width = `${Math.random() * 100 + 50}px`; - block.style.height = `${Math.random() * 100 + 50}px`; - block.style.top = `${Math.random() * 90}%`; - block.style.left = `${Math.random() * 90}%`; - block.style.animationDuration = `${Math.random() * 2 + 2}s`; - block.style.animationDelay = `${Math.random() * 3}s`; - glitchOverlay.appendChild(block); - } - } - - function toggleAnimations() { - if (animationToggle.checked) { - body.classList.add('body-animated'); - } else { - body.classList.remove('body-animated'); - } - } - - document.addEventListener('mousemove', (e) => { - if (!animationToggle.checked) return; - const x = (window.innerWidth / 2) - e.pageX; - const y = (window.innerHeight / 2) - e.pageY; - bgContainer.style.transform = `translateX(${x / 50}px) translateY(${y / 50}px)`; - }); - - newLiteratureBtn.addEventListener('click', fetchLiterature); - animationToggle.addEventListener('change', toggleAnimations); - - // Initial setup - createFloatingEmojis(); - createFragments(); - createCracks(); - createFlickerBlocks(); - toggleAnimations(); - fetchLiterature(); - - window.addEventListener('resize', () => { - createFloatingEmojis(); - createFragments(); - }); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/接口集合.json deleted file mode 100755 index 37dc3082..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/接口集合.json +++ /dev/null @@ -1 +0,0 @@ -["https://60s.api.shumengya.top"] \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/返回接口.json deleted file mode 100755 index b06376f6..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/返回接口.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "index": 347, - "duanzi": "我不想读书,主要是因为家里牛啊,猪啊羊啊都没人喂。" - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌.html new file mode 100644 index 00000000..22a66b68 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌.html @@ -0,0 +1,56 @@ + + + + +随机唱歌 + + + + + +
+ +

🎤 随机唱歌

+ +
+
+
加载中...
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/css/style.css deleted file mode 100755 index 5c5b82b4..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/css/style.css +++ /dev/null @@ -1,251 +0,0 @@ -/* 随机唱歌音频 - 淡绿色清新风格样式 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - color: #2d5016; - line-height: 1.6; - overflow-x: hidden; -} - -.container { - max-width: 900px; - margin: 0 auto; - padding: 20px; -} - -/* 头部 */ -.header { - text-align: center; - margin-bottom: 20px; - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 24px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 2rem; - color: #2d5016; - margin-bottom: 10px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - gap: 12px; -} - -.header p { - color: #5a7c65; - font-size: 1rem; -} - -/* 用户卡片 */ -.user-card { - display: flex; - align-items: center; - justify-content: center; - gap: 15px; - background: rgba(255, 255, 255, 0.9); - padding: 16px; - border-radius: 15px; - box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); - margin-bottom: 15px; - text-align: center; -} - -.avatar { - width: 56px; - height: 56px; - border-radius: 50%; - object-fit: cover; - border: 3px solid rgba(129, 199, 132, 0.5); -} - -.user-info { - display: flex; - flex-direction: column; -} - -.nickname { - font-weight: 700; - font-size: 1.1rem; - color: #2d5016; -} - -.meta { - color: #5a7c65; - font-size: 0.9rem; -} - -/* 歌曲信息 */ -.song-card { - background: rgba(255, 255, 255, 0.9); - padding: 16px; - border-radius: 15px; - box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); - margin-bottom: 15px; - text-align: center; -} - -.song-title { - font-size: 1.2rem; - font-weight: 700; - margin-bottom: 8px; - color: #1b5e20; -} - -.song-meta { - color: #5a7c65; - font-size: 0.95rem; - margin-bottom: 10px; -} - -/* 歌词 */ -.lyrics { - background: rgba(129, 199, 132, 0.1); - border-radius: 12px; - padding: 12px; - max-height: 220px; - overflow: auto; -} - -.lyrics p { - margin-bottom: 6px; -} - -/* 音频播放器卡片 */ -.audio-card { - background: rgba(255, 255, 255, 0.9); - padding: 16px; - border-radius: 15px; - box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); - margin-bottom: 15px; -} - -.audio-actions { - display: flex; - flex-direction: column; - gap: 12px; - align-items: center; - margin-top: 10px; -} - -.btn { - background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); - color: white; - border: none; - padding: 10px 18px; - border-radius: 10px; - font-size: 0.95rem; - font-weight: 600; - cursor: pointer; - transition: all 0.25s ease; - box-shadow: 0 4px 12px rgba(129, 199, 132, 0.35); - text-decoration: none; -} - -.btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 18px rgba(129, 199, 132, 0.45); -} - -.info { - color: #5a7c65; - font-size: 0.9rem; -} - -/* 加载与错误 */ -.loading, .error { - text-align: center; - padding: 30px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.spinner { - width: 36px; - height: 36px; - border: 4px solid #e8f5e8; - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 18px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 动画 */ -.fade-in { - animation: fadeIn 0.5s ease-in-out; -} - -@keyframes fadeIn { - from { opacity: 0; transform: translateY(10px); } - to { opacity: 1; transform: translateY(0); } -} - -/* 平板端适配 */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { padding: 16px; } - .header h1 { font-size: 1.8rem; } -} - -/* 手机端优先优化 */ -@media (max-width: 767px) { - .container { padding: 12px; } - .header { padding: 18px; } - .header h1 { font-size: 1.6rem; gap: 8px; } - - .user-card { - padding: 16px; - flex-direction: column; - text-align: center; - } - - .avatar { - width: 80px; - height: 80px; - margin-bottom: 8px; - } - - .song-card, .audio-card { - padding: 16px; - } - - .lyrics { - max-height: 180px; - text-align: left; - padding: 16px; - } - - .audio-actions { - flex-direction: column; - gap: 15px; - align-items: center; - } - - .info { - text-align: center; - line-height: 1.8; - } - - .btn { - width: 100%; - max-width: 200px; - text-align: center; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/index.html deleted file mode 100755 index 79f8f821..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/index.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - 随机唱歌音频 - 60s API 集合 - - - - - -
-
-

- 🎵 随机唱歌音频 -

-

数据来自官方/权威源头,以确保稳定与实时 · 支持本地数据回退

-
- - -
-
-

正在加载中,请稍候…

-
- - - - -
- -
- 用户头像 - -
- - -
-
-
-
-
-
-
- - -
- -
- -
- ❤ 喜欢:- - · ⏱ 时长:--:-- - · 🗓 发布:- - · 🔗 查看原帖 -
-
-
-
-
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/js/script.js deleted file mode 100755 index ed079964..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/js/script.js +++ /dev/null @@ -1,252 +0,0 @@ -// 随机唱歌音频 页面脚本 -(function () { - 'use strict'; - - const API = { - endpoints: [], - currentIndex: 0, - params: { - encoding: 'json' - }, - localFallback: '返回接口.json', - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/changya`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.api.shumengya.top/v2/changya']; - } - }, - // 获取当前接口URL - getCurrentUrl() { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v)); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } - }; - - // DOM 元素引用 - const els = { - loading: null, - error: null, - container: null, - avatar: null, - nickname: null, - gender: null, - songTitle: null, - songMeta: null, - lyrics: null, - audio: null, - likeCount: null, - publishTime: null, - link: null, - refreshBtn: null, - }; - - function initDom() { - els.loading = document.getElementById('loading'); - els.error = document.getElementById('error'); - els.container = document.getElementById('content'); - - els.avatar = document.getElementById('avatar'); - els.nickname = document.getElementById('nickname'); - els.gender = document.getElementById('gender'); - els.songTitle = document.getElementById('song-title'); - els.songMeta = document.getElementById('song-meta'); - els.lyrics = document.getElementById('lyrics'); - - els.audio = document.getElementById('audio'); - els.likeCount = document.getElementById('like-count'); - els.publishTime = document.getElementById('publish-time'); - els.link = document.getElementById('link'); - els.refreshBtn = document.getElementById('refresh-btn'); - } - - function showLoading() { - els.loading.style.display = 'block'; - els.error.style.display = 'none'; - els.container.style.display = 'none'; - } - - function showError(msg) { - els.loading.style.display = 'none'; - els.error.style.display = 'block'; - els.container.style.display = 'none'; - els.error.querySelector('p').textContent = msg || '获取数据失败,请稍后重试'; - } - - function showContent() { - els.loading.style.display = 'none'; - els.error.style.display = 'none'; - els.container.style.display = 'block'; - } - - function formatDuration(ms) { - if (!ms && ms !== 0) return ''; - const totalSeconds = Math.floor(ms / 1000); - const m = Math.floor(totalSeconds / 60).toString().padStart(2, '0'); - const s = (totalSeconds % 60).toString().padStart(2, '0'); - return `${m}:${s}`; - } - - function safeText(text) { - const div = document.createElement('div'); - div.textContent = text == null ? '' : String(text); - return div.innerHTML; - } - - async function fetchFromAPI() { - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const resp = await fetch(url, { - cache: 'no-store', - timeout: 10000 // 10秒超时 - }); - - if (!resp.ok) { - throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); - } - - const data = await resp.json(); - - if (data && data.code === 200) { - console.log(`接口 ${i + 1} 请求成功`); - return data; - } - - throw new Error(data && data.message ? data.message : '接口返回异常'); - - } catch (e) { - console.warn(`接口 ${i + 1} 失败:`, e.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了 - console.warn('所有远程接口都失败,尝试本地数据'); - return null; - } - } - } - - async function fetchFromLocal() { - try { - const resp = await fetch(API.localFallback + `?t=${Date.now()}`); - if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`); - const data = await resp.json(); - return data; - } catch (e) { - console.error('读取本地返回接口.json失败:', e); - return null; - } - } - - function render(data) { - const d = data?.data || {}; - const user = d.user || {}; - const song = d.song || {}; - const audio = d.audio || {}; - - // 用户信息 - els.avatar.src = user.avatar_url || ''; - els.avatar.alt = (user.nickname || '用户') + ' 头像'; - els.nickname.textContent = user.nickname || '未知用户'; - els.gender.textContent = user.gender === 'female' ? '女' : user.gender === 'male' ? '男' : '未知'; - - // 歌曲信息 - els.songTitle.textContent = song.name || '未知歌曲'; - els.songMeta.textContent = song.singer ? `演唱:${song.singer}` : ''; - - els.lyrics.innerHTML = ''; - if (Array.isArray(song.lyrics)) { - const frag = document.createDocumentFragment(); - song.lyrics.forEach(line => { - const p = document.createElement('p'); - p.innerHTML = safeText(line); - frag.appendChild(p); - }); - els.lyrics.appendChild(frag); - } - - // 音频 - els.audio.src = audio.url || ''; - els.audio.preload = 'none'; - - // 其他信息 - els.likeCount.textContent = typeof audio.like_count === 'number' ? audio.like_count : '-'; - const publish = audio.publish || (audio.publish_at ? new Date(audio.publish_at).toLocaleString() : ''); - els.publishTime.textContent = publish; - els.link.href = audio.link || '#'; - els.link.target = '_blank'; - - // 时长信息 - const durationEl = document.getElementById('duration'); - durationEl.textContent = formatDuration(audio.duration); - - showContent(); - } - - async function load() { - showLoading(); - try { - // 先尝试远程API - const data = await fetchFromAPI(); - if (data) { - render(data); - return; - } - - // 远程API失败,尝试本地数据 - const localData = await fetchFromLocal(); - if (localData) { - render(localData); - return; - } - - // 都失败了 - showError('获取数据失败,请稍后重试'); - } catch (e) { - console.error('加载数据时发生错误:', e); - showError('获取数据失败,请稍后重试'); - } - } - - function bindEvents() { - if (els.refreshBtn) { - els.refreshBtn.addEventListener('click', load); - } - // 快捷键 Ctrl+R 刷新(不拦截浏览器默认刷新) - } - - document.addEventListener('DOMContentLoaded', () => { - initDom(); - bindEvents(); - load(); - }); -})(); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/返回接口.json deleted file mode 100755 index b52bbe66..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/返回接口.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "user": { - "nickname": "𝑮𝑺_迷鹿_", - "gender": "female", - "avatar_url": "http://img-cdn.api.singduck.cn/user-img/6afbebcfae6144478c150d0c1d0d5899.jpg" - }, - "song": { - "name": "恶作剧", - "singer": "王蓝茵", - "lyrics": [ - "我想我会开始想念你", - "可是我刚刚才遇见了你", - "我怀疑这奇遇只是个恶作剧", - "我想我已慢慢喜欢你", - "因为我拥有爱情的勇气", - "我任性投入你给的恶作剧", - "你给的恶作剧" - ] - }, - "audio": { - "url": "http://audio-cdn.api.singduck.cn/ugc/220929_965696173_b822a290c553.wav?auth_key=1755845643-0-0-4029539b73e17337dcac49cc4e0ecfcc", - "duration": 35050, - "like_count": 955, - "link": "https://m.api.singduck.cn/user-piece/toGZlBfZbukck2sHb", - "publish": "2022/09/29 18:33:51", - "publish_at": 1664447631000 - } - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/background.css deleted file mode 100755 index 25ad9632..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/background.css +++ /dev/null @@ -1,36 +0,0 @@ -body { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; - margin: 0; - min-height: 100vh; - overflow-x: hidden; - transition: background 0.5s ease; -} - -/* Hand-drawn Comic Theme Background - FRESH GREEN VERSION */ -body.theme-comic { - background: linear-gradient(-45deg, #c8e6c9, #dcedc8, #f1f8e9, #e8f5e8); - background-size: 400% 400%; - animation: gradientBG 15s ease infinite; -} - -@keyframes gradientBG { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* Placeholder for Emoji Theme Background */ -body.theme-emoji { - background-color: #fffde7; -} - -/* Placeholder for Retro TV Theme Background */ -body.theme-retro { - background-color: #3d2b1f; -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/style.css deleted file mode 100755 index ca721728..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/style.css +++ /dev/null @@ -1,200 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Zhi+Mang+Xing&display=swap'); - -/* --- General & Theme Switcher --- */ -.container { - max-width: 600px; - margin: 0 auto; - padding: 20px; - text-align: center; -} - -.theme-switcher { - position: fixed; - top: 15px; - right: 15px; - display: flex; - gap: 5px; - background: rgba(255, 255, 255, 0.8); - padding: 5px; - border-radius: 20px; - box-shadow: 0 2px 10px rgba(0,0,0,0.1); - z-index: 100; -} - -.theme-icon { - width: 30px; - height: 30px; - border-radius: 50%; - display: flex; - justify-content: center; - align-items: center; - cursor: pointer; - transition: all 0.2s ease; - border: 2px solid transparent; -} -.theme-icon.active { - border-color: #66bb6a; - transform: scale(1.1); -} - -/* --- Comic Theme Styles --- */ -.theme-comic header h1 { - font-family: 'Zhi Mang Xing', cursive; - font-size: 4em; - color: #2e7d32; /* Fresh Green */ - text-shadow: 2px 2px 0 #fff; - margin: 0.2em 0; -} - -.theme-comic .divider { - height: 3px; - background: linear-gradient(90deg, #81c784, #a5d6a7, #c8e6c9, #66bb6a); - border-radius: 3px; - margin: 20px auto; - width: 80%; -} - -.theme-comic .joke-card { - background: rgba(248, 255, 248, 0.9); /* Light green tinted white */ - backdrop-filter: blur(5px); - border-radius: 15px; - padding: 40px; - min-height: 200px; - box-shadow: 0 8px 25px rgba(102, 187, 106, 0.15); - display: flex; - justify-content: center; - align-items: center; - position: relative; - margin-bottom: 20px; - transform: rotate(-1deg); - transition: transform 0.2s ease; - border: 1px solid rgba(129, 199, 132, 0.3); -} -.theme-comic .joke-card:hover { - transform: rotate(1deg) scale(1.02); -} - -.theme-comic .joke-text { - font-family: 'Zhi Mang Xing', cursive; - font-size: 2em; - line-height: 1.6; - color: #1b5e20; -} - -.theme-comic .new-joke-btn { - background: linear-gradient(135deg, #66bb6a, #81c784); /* Fresh Green Gradient */ - color: white; - font-family: 'Zhi Mang Xing', cursive; - font-size: 2.5em; - border: none; - border-radius: 50px; - padding: 10px 30px; - cursor: pointer; - box-shadow: 0 5px 0 #388e3c; /* Darker Green */ - transition: all 0.1s ease-in-out; -} -.theme-comic .new-joke-btn:active { - transform: translateY(5px); - box-shadow: none; -} - -/* --- Loading Animation --- */ -.loading-container { display: none; } -.loading-container.visible { display: block; } -.loading-anim { - height: 60px; - width: 80px; - margin: 0 auto 10px; -} -.book { - transform-style: preserve-3d; - transform: rotateY(-30deg); - animation: flip 3s infinite; -} -.book, .book-page { - width: 40px; - height: 55px; - position: absolute; - left: 50%; - top: 50%; - margin-left: -20px; - margin-top: -27.5px; -} -.book-page { - background: #a5d6a7; - border: 1px solid #66bb6a; - border-radius: 3px; - transform-origin: left; -} -.book-page:nth-child(1) { animation: flip-page 3s infinite; } -.book-page:nth-child(2) { animation: flip-page 3s -1s infinite; } -.book-page:nth-child(3) { animation: flip-page 3s -2s infinite; } - -@keyframes flip { 50% { transform: rotateY(30deg); } } -@keyframes flip-page { 30%, 100% { transform: rotateY(180deg); } } - -/* --- Feedback Buttons & Animations --- */ -.feedback-buttons { - display: flex; - justify-content: center; - gap: 15px; - margin-bottom: 30px; -} -.feedback-btn { - background: none; - border: none; - font-size: 2em; - cursor: pointer; - transition: transform 0.2s ease; -} -.feedback-btn:hover { transform: scale(1.2); } - -#animation-container { - position: fixed; - top: 0; left: 0; width: 100%; height: 100%; - pointer-events: none; z-index: 999; -} -.confetti, .snowflake { - position: absolute; - animation-timing-function: linear; - animation-iteration-count: infinite; -} -.confetti { - width: 10px; height: 10px; - animation-name: fall; -} -.snowflake { - font-size: 20px; color: #fff; - animation-name: fall; -} -@keyframes fall { - from { transform: translateY(-10vh) rotate(0deg); } - to { transform: translateY(110vh) rotate(360deg); } -} - -.joke-card.absurd { - animation: absurd-flash 0.5s 2; -} -@keyframes absurd-flash { - 0%, 100% { border: 2px solid transparent; } - 50% { border: 5px solid red; } -} - -/* --- General Joke Text Visibility --- */ -.joke-text { - opacity: 0; - transform: scale(0.9); - transition: opacity 0.4s ease, transform 0.4s ease; -} -.joke-text.visible { - opacity: 1; - transform: scale(1); -} - -/* --- Responsive --- */ -@media (max-width: 600px) { - .theme-comic header h1 { font-size: 3em; } - .theme-comic .joke-card { padding: 25px; transform: rotate(0); } - .theme-comic .joke-card:hover { transform: rotate(0); } - .theme-comic .joke-text { font-size: 1.5em; } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/index.html deleted file mode 100755 index 3c636665..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/index.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - 段子游乐场 - - - - - -
-
✏️
-
- -
-
-

段子游乐场

-
-
- -
-
-
-
-
-
-
-
-
-
-

段子菌正在翻笑话库...

-
-

-
- - - - -
-
- - -
- - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/js/script.js deleted file mode 100755 index 0dc8b1f9..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/js/script.js +++ /dev/null @@ -1,122 +0,0 @@ -document.addEventListener('DOMContentLoaded', () => { - // Elements - const body = document.body; - const jokeTextElem = document.getElementById('joke-text'); - const newJokeBtn = document.getElementById('new-joke-btn'); - const loadingContainer = document.querySelector('.loading-container'); - const animationContainer = document.getElementById('animation-container'); - const jokeCard = document.getElementById('joke-card'); - - // API - const apiBaseUrls = ["https://60s.api.shumengya.top"]; - const apiPath = "/v2/duanzi"; - let currentApiIndex = 0; - - // --- Core Functions --- - const showLoading = (isLoading) => { - loadingContainer.classList.toggle('visible', isLoading); - if (isLoading) jokeTextElem.classList.remove('visible'); - }; - - const displayJoke = (joke) => { - jokeTextElem.textContent = joke; - showLoading(false); - setTimeout(() => jokeTextElem.classList.add('visible'), 50); - }; - - const fetchJoke = async () => { - showLoading(true); - try { - const url = apiBaseUrls[currentApiIndex] + apiPath; - const response = await fetch(url, { timeout: 5000 }); - if (!response.ok) throw new Error('Network response was not ok'); - - const data = await response.json(); - if (data.code === 200 && data.data && data.data.duanzi) { - displayJoke(data.data.duanzi); - } else { - throw new Error('Invalid data format'); - } - } catch (error) { - console.error(`API error with ${apiBaseUrls[currentApiIndex]}:`, error); - currentApiIndex = (currentApiIndex + 1) % apiBaseUrls.length; - if (currentApiIndex !== 0) { - fetchJoke(); // Try next API - } else { - displayJoke('段子菌迷路了!点击‘再来一个’让它重新找路~'); - } - } - }; - - // --- Theme Switcher --- - const themeSwitcher = document.querySelector('.theme-switcher'); - themeSwitcher.addEventListener('click', (e) => { - if (e.target.classList.contains('theme-icon')) { - const theme = e.target.dataset.theme; - body.className = theme; // Set body class to the selected theme - - // Update active icon - themeSwitcher.querySelectorAll('.theme-icon').forEach(icon => icon.classList.remove('active')); - e.target.classList.add('active'); - - alert(`主题已切换!部分主题(如表情包、复古电视)将在后续阶段实现。`); - } - }); - // Set initial active theme icon - themeSwitcher.querySelector(`[data-theme="${body.className}"]`).classList.add('active'); - - - // --- Feedback Buttons & Animations --- - const btnLol = document.getElementById('btn-lol'); - const btnCold = document.getElementById('btn-cold'); - const btnSeen = document.getElementById('btn-seen'); - const btnAbsurd = document.getElementById('btn-absurd'); - const soundLol = document.getElementById('sound-lol'); - const soundCold = document.getElementById('sound-cold'); - - btnLol.addEventListener('click', () => { - soundLol.play(); - createParticles(20, 'confetti'); - }); - - btnCold.addEventListener('click', () => { - soundCold.play(); - createParticles(15, 'snowflake'); - }); - - btnSeen.addEventListener('click', () => { - displayJoke("原来你也听过!那再给你换个新鲜的~"); - setTimeout(fetchJoke, 1500); - }); - - btnAbsurd.addEventListener('click', () => { - jokeCard.classList.add('absurd'); - setTimeout(() => jokeCard.classList.remove('absurd'), 1000); - }); - - function createParticles(count, type) { - animationContainer.innerHTML = ''; // Clear previous - const colors = ['#ffca28', '#ff7043', '#29b6f6', '#66bb6a']; - for (let i = 0; i < count; i++) { - const particle = document.createElement('div'); - particle.classList.add(type); - if (type === 'confetti') { - particle.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)]; - } else { - particle.textContent = '❄️'; - } - particle.style.left = `${Math.random() * 100}vw`; - const duration = Math.random() * 3 + 2; // 2-5 seconds - const delay = Math.random() * -duration; // Start at different times - particle.style.animationDuration = `${duration}s`; - particle.style.animationDelay = `${delay}s`; - animationContainer.appendChild(particle); - } - } - - // --- Event Listeners --- - newJokeBtn.addEventListener('click', fetchJoke); - - // --- Initial Load --- - fetchJoke(); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/接口集合.json deleted file mode 100755 index 37dc3082..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/接口集合.json +++ /dev/null @@ -1 +0,0 @@ -["https://60s.api.shumengya.top"] \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/返回接口.json deleted file mode 100755 index b06376f6..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/返回接口.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "index": 347, - "duanzi": "我不想读书,主要是因为家里牛啊,猪啊羊啊都没人喂。" - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机段子.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机段子.html new file mode 100644 index 00000000..031df30b --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机段子.html @@ -0,0 +1,56 @@ + + + + +随机段子 + + + + + +
+ +

😂 随机段子

+ +
+
+
加载中...
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/css/style.css deleted file mode 100644 index c218a495..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/css/style.css +++ /dev/null @@ -1,163 +0,0 @@ -/* 随机答案之书 - 淡绿色清新风格样式(与随机唱歌音频一致) */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - color: #2d5016; - line-height: 1.6; - overflow-x: hidden; -} - -.container { - max-width: 900px; - margin: 0 auto; - padding: 20px; -} - -/* 头部 */ -.header { - text-align: center; - margin-bottom: 20px; - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 24px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 2rem; - color: #2d5016; - margin-bottom: 10px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - gap: 12px; -} - -.header p { - color: #5a7c65; - font-size: 1rem; -} - -/* 按钮 */ -.btn { - background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); - color: white; - border: none; - padding: 10px 18px; - border-radius: 10px; - font-size: 0.95rem; - font-weight: 600; - cursor: pointer; - transition: all 0.25s ease; - box-shadow: 0 4px 12px rgba(129, 199, 132, 0.35); - text-decoration: none; -} - -.btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 18px rgba(129, 199, 132, 0.45); -} - -/* 加载与错误 */ -.loading, .error { - text-align: center; - padding: 30px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.spinner { - width: 36px; - height: 36px; - border: 4px solid #e8f5e8; - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 18px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 动画 */ -.fade-in { - animation: fadeIn 0.5s ease-in-out; -} - -@keyframes fadeIn { - from { opacity: 0; transform: translateY(10px); } - to { opacity: 1; transform: translateY(0); } -} - -/* 答案卡片 */ -.answer-card { - background: rgba(255, 255, 255, 0.9); - padding: 16px; - border-radius: 15px; - box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); - margin-bottom: 15px; - text-align: center; -} - -.answer-text { - font-size: 1.4rem; - font-weight: 700; - margin-bottom: 8px; - color: #1b5e20; - word-break: break-word; -} - -.answer-en { - color: #5a7c65; - font-size: 1rem; - margin-bottom: 10px; -} - -.meta { - color: #5a7c65; - font-size: 0.95rem; -} - -.actions { - display: flex; - gap: 12px; - align-items: center; - justify-content: center; - margin-top: 12px; -} - -/* 手机端优先优化 */ -@media (max-width: 767px) { - .container { padding: 12px; } - .header { padding: 18px; } - .header h1 { font-size: 1.6rem; gap: 8px; } - - .answer-card { padding: 16px; } - .answer-text { font-size: 1.3rem; } - .answer-en { font-size: 0.95rem; } - - .actions { - flex-direction: column; - gap: 15px; - } - - .btn { - width: 100%; - max-width: 220px; - text-align: center; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/index.html deleted file mode 100644 index aedfd38c..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - 📘真理之道 - - - - - -
-
-

📘真理之道

-

当你踌躇不定,犹豫不决时,不妨来这里看看吧

-
- - -
-
-

正在加载中,请稍候…

-
- - - - -
-
-
-
- -
编号:-
-
- - -
-
-
-
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/js/script.js deleted file mode 100644 index 3f27cd9f..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/js/script.js +++ /dev/null @@ -1,224 +0,0 @@ -// 随机答案之书 页面脚本 -(function () { - 'use strict'; - - const API = { - endpoints: [], - currentIndex: 0, - params: { - encoding: 'json' - }, - localFallback: '返回接口.json', - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/answer`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.api.shumengya.top/v2/answer']; - } - }, - // 获取当前接口URL - getCurrentUrl() { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v)); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } - }; - - // DOM 元素引用 - const els = { - loading: null, - error: null, - container: null, - answer: null, - answerEn: null, - indexEl: null, - refreshBtn: null, - copyBtn: null, - }; - - function initDom() { - els.loading = document.getElementById('loading'); - els.error = document.getElementById('error'); - els.container = document.getElementById('content'); - - els.answer = document.getElementById('answer'); - els.answerEn = document.getElementById('answer-en'); - els.indexEl = document.getElementById('index'); - els.refreshBtn = document.getElementById('refresh-btn'); - els.copyBtn = document.getElementById('copy-btn'); - } - - function showLoading() { - els.loading.style.display = 'block'; - els.error.style.display = 'none'; - els.container.style.display = 'none'; - } - - function showError(msg) { - els.loading.style.display = 'none'; - els.error.style.display = 'block'; - els.container.style.display = 'none'; - els.error.querySelector('p').textContent = msg || '获取数据失败,请稍后重试'; - } - - function showContent() { - els.loading.style.display = 'none'; - els.error.style.display = 'none'; - els.container.style.display = 'block'; - } - - function safeText(text) { - const div = document.createElement('div'); - div.textContent = text == null ? '' : String(text); - return div.innerHTML; - } - - async function fetchFromAPI() { - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const resp = await fetch(url, { - cache: 'no-store', - timeout: 10000 // 10秒超时(兼容同目录页面风格) - }); - - if (!resp.ok) { - throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); - } - - const data = await resp.json(); - - if (data && data.code === 200) { - console.log(`接口 ${i + 1} 请求成功`); - return data; - } - - throw new Error(data && data.message ? data.message : '接口返回异常'); - - } catch (e) { - console.warn(`接口 ${i + 1} 失败:`, e.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了 - console.warn('所有远程接口都失败,尝试本地数据'); - return null; - } - } - } - - async function fetchFromLocal() { - try { - const resp = await fetch(API.localFallback + `?t=${Date.now()}`); - if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`); - const data = await resp.json(); - return data; - } catch (e) { - console.error('读取本地返回接口.json失败:', e); - return null; - } - } - - function render(data) { - const d = data?.data || {}; - - const cn = d.answer || ''; - const en = d.answer_en || ''; - const idx = d.index != null ? d.index : d.id != null ? d.id : '-'; - - els.answer.innerHTML = safeText(cn || '-'); - - if (en) { - els.answerEn.style.display = 'block'; - els.answerEn.innerHTML = safeText(en); - } else { - els.answerEn.style.display = 'none'; - els.answerEn.innerHTML = ''; - } - - els.indexEl.textContent = idx; - showContent(); - } - - async function load() { - showLoading(); - try { - // 先尝试远程API - const data = await fetchFromAPI(); - if (data) { - render(data); - return; - } - - // 远程API失败,尝试本地数据 - const localData = await fetchFromLocal(); - if (localData) { - render(localData); - return; - } - - // 都失败了 - showError('获取数据失败,请稍后重试'); - } catch (e) { - console.error('加载数据时发生错误:', e); - showError('获取数据失败,请稍后重试'); - } - } - - function bindEvents() { - if (els.refreshBtn) { - els.refreshBtn.addEventListener('click', load); - } - if (els.copyBtn) { - els.copyBtn.addEventListener('click', async () => { - const textParts = []; - const cn = els.answer?.textContent?.trim(); - const en = els.answerEn?.textContent?.trim(); - if (cn) textParts.push(cn); - if (en) textParts.push(en); - const finalText = textParts.join('\n'); - try { - await navigator.clipboard.writeText(finalText); - const old = els.copyBtn.textContent; - els.copyBtn.textContent = '已复制'; - setTimeout(() => { els.copyBtn.textContent = old; }, 1200); - } catch (e) { - alert('复制失败,请手动选择文本复制'); - } - }); - } - } - - document.addEventListener('DOMContentLoaded', () => { - initDom(); - bindEvents(); - load(); - }); -})(); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/接口集合.json deleted file mode 100644 index 8ec2d2ec..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/返回接口.json deleted file mode 100644 index c3053e9b..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/返回接口.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "id": "63", - "answer": "那不值得纠结", - "answer_en": "It's not worth worrying about", - "index": 62 - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/background.css deleted file mode 100755 index 3390a76c..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/background.css +++ /dev/null @@ -1,26 +0,0 @@ -body { - background: linear-gradient(-45deg, #f1f8e9, #e8f5e8, #c8e6c9, #dcedc8); - background-size: 400% 400%; - animation: gradientBG 20s ease infinite; - color: #2e7d32; - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - margin: 0; - padding: 0; - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - overflow-x: hidden; -} - -@keyframes gradientBG { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/style.css deleted file mode 100755 index 5c6c9ad1..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/style.css +++ /dev/null @@ -1,342 +0,0 @@ -.container { - text-align: center; - padding: 20px; - max-width: 600px; - width: 100%; - box-sizing: border-box; -} - -header h1 { - font-size: 2.8em; - color: #2e7d32; - text-shadow: 0 0 10px #81c784, 0 0 20px #a5d6a7; - margin-bottom: 0.2em; -} - -header p { - font-size: 1.2em; - color: #388e3c; - margin-bottom: 40px; -} - -.crystal-ball-container { - perspective: 1000px; - margin-bottom: 40px; -} - -.crystal-ball { - width: 200px; - height: 200px; - background: radial-gradient(circle at 30% 30%, rgba(255, 255, 255, 0.6), rgba(200, 230, 201, 0.3)); - border-radius: 50%; - margin: 0 auto; - position: relative; - box-shadow: 0 0 30px #81c784, 0 0 60px #66bb6a, inset 0 0 20px rgba(220, 255, 220, 0.3); - animation: float 6s ease-in-out infinite; - transform-style: preserve-3d; -} - -.reflection { - width: 80px; - height: 40px; - background: rgba(255, 255, 255, 0.3); - border-radius: 50%; - position: absolute; - top: 20px; - left: 40px; - transform: rotate(-30deg); - filter: blur(5px); -} - -.swirl { - position: absolute; - top: 50%; - left: 50%; - width: 120%; - height: 120%; - background: linear-gradient(45deg, rgba(200, 230, 201, 0.2), rgba(129, 199, 132, 0.3)); - border-radius: 50%; - animation: swirl 10s linear infinite; - transform: translate(-50%, -50%); -} - -@keyframes float { - 0%, 100% { transform: translateY(0); } - 50% { transform: translateY(-20px); } -} - -@keyframes swirl { - from { transform: translate(-50%, -50%) rotate(0deg); } - to { transform: translate(-50%, -50%) rotate(360deg); } -} - -.fortune-card { - background: rgba(248, 255, 248, 0.8); - border-radius: 15px; - padding: 30px; - margin-bottom: 30px; - min-height: 120px; - display: flex; - justify-content: center; - align-items: center; - backdrop-filter: blur(10px); - border: 1px solid rgba(129, 199, 132, 0.3); - box-shadow: 0 8px 32px 0 rgba(102, 187, 106, 0.2); - transition: opacity 0.5s ease-in-out; -} - -.fortune-content { - opacity: 0; - transition: opacity 0.5s ease-in-out; -} - -.fortune-content.visible { - opacity: 1; -} - -#luck-desc { - font-size: 2em; - color: #2e7d32; - margin: 0 0 10px; -} - -#luck-tip { - font-size: 1.1em; - color: #388e3c; - margin: 0; - padding-bottom: 20px; /* Add some space before the new details */ -} - -.fortune-details { - display: flex; - justify-content: space-around; - margin-top: 20px; - padding-top: 20px; - border-top: 1px solid rgba(255, 255, 255, 0.2); -} - -.detail-item { - text-align: center; -} - -.detail-item h3 { - font-size: 0.9em; - color: #66bb6a; - margin: 0 0 5px; - font-weight: normal; -} - -.detail-item p { - font-size: 1.2em; - margin: 0; - font-weight: bold; -} - -#lucky-color { - display: inline-block; - width: 24px; - height: 24px; - border-radius: 50%; - border: 2px solid white; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); - /* Remove the text content */ - font-size: 0; -} - -/* Tarot Card Styles */ -.tarot-container { - margin-top: 40px; - margin-bottom: 40px; -} - -.tarot-container h2 { - font-size: 1.5em; - color: #2e7d32; - text-shadow: 0 0 8px #81c784; - margin-bottom: 20px; -} - -.tarot-card-container { - width: 180px; - height: 280px; - perspective: 1000px; - margin: 0 auto; - cursor: pointer; -} - -.tarot-card-inner { - position: relative; - width: 100%; - height: 100%; - transition: transform 0.8s; - transform-style: preserve-3d; -} - -.tarot-card-container.flipped .tarot-card-inner { - transform: rotateY(180deg); -} - -.tarot-card-front, -.tarot-card-back { - position: absolute; - width: 100%; - height: 100%; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - border-radius: 10px; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); -} - -.tarot-card-back { - background: linear-gradient(135deg, #66bb6a, #388e3c); - border: 2px solid #81c784; - display: flex; - justify-content: center; - align-items: center; - font-size: 3em; - color: #c8e6c9; -} - -.tarot-card-back::after { - content: '✧'; /* A simple star symbol */ - text-shadow: 0 0 10px #e8f5e8; -} - -.tarot-card-front { - background: linear-gradient(135deg, #4caf50, #66bb6a); - border: 2px solid #81c784; - color: white; - transform: rotateY(180deg); - padding: 20px; - box-sizing: border-box; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -#tarot-name { - font-size: 1.4em; - color: #e8f5e8; - margin: 0 0 10px; -} - -#tarot-interpretation { - font-size: 0.9em; - text-align: center; - margin: 0; -} - -/* Side Decorations */ -.side-decor { - position: fixed; - top: 0; - bottom: 0; - width: 15vw; - height: 100vh; - pointer-events: none; - z-index: 0; -} - -.left-decor { - left: 0; -} - -.right-decor { - right: 0; -} - -.decor-symbol { - position: absolute; - color: rgba(129, 199, 132, 0.5); - text-shadow: 0 0 10px rgba(200, 230, 201, 0.7); - animation: floatSymbol 20s infinite ease-in-out; -} - -@keyframes floatSymbol { - 0%, 100% { - transform: translateY(0) rotate(0deg); - opacity: 0; - } - 25%, 75% { - opacity: 0.8; - } - 50% { - transform: translateY(-20vh) rotate(180deg); - opacity: 0.3; - } -} - -#get-fortune-btn { - background: linear-gradient(45deg, #66bb6a, #4caf50); - color: white; - border: none; - border-radius: 50px; - padding: 15px 30px; - font-size: 1.1em; - cursor: pointer; - transition: transform 0.2s, box-shadow 0.2s; - box-shadow: 0 0 15px #81c784; -} - -#get-fortune-btn:hover { - transform: scale(1.05); - box-shadow: 0 0 25px #a5d6a7; -} - -#get-fortune-btn:active { - transform: scale(0.98); -} - -.loading-spinner { - border: 4px solid rgba(129, 199, 132, 0.3); - border-left-color: #66bb6a; - border-radius: 50%; - width: 40px; - height: 40px; - animation: spin 1s linear infinite; - display: none; /* Hidden by default */ -} - -.loading-spinner.visible { - display: block; -} - -@keyframes spin { - to { transform: rotate(360deg); } -} - -footer { - margin-top: 40px; - color: rgba(46, 125, 50, 0.7); -} - -/* Responsive Design */ -@media (max-width: 768px) { - header h1 { - font-size: 2.2em; - } - .crystal-ball { - width: 150px; - height: 150px; - } - .fortune-card { - padding: 20px; - } - .fortune-details { - flex-direction: column; - gap: 15px; - } - - .tarot-card-container { - width: 150px; - height: 233px; - } -} - -/* Hide side decor on smaller screens */ -@media (max-width: 1200px) { - .side-decor { - display: none; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/index.html deleted file mode 100755 index fb64a251..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/index.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - 水晶球占卜 - - - - -
-
-
-

水晶球占卜

-

洞察你今日的运势

-
-
-
-
-
-
-
-
-
-
-
-

-

-
-
-

今日咒语

-

-
-
-

幸运色

-

-
-
-

幸运数字

-

-
-
-
-
- - -
-

每日塔罗指引

-
-
-
- -
-
-

-

-
-
-
-
- - -
-
-

仅供娱乐,祝您好运

-
-
-
- - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/js/script.js deleted file mode 100755 index 5637b31c..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/js/script.js +++ /dev/null @@ -1,170 +0,0 @@ -document.addEventListener('DOMContentLoaded', () => { - const getFortuneBtn = document.getElementById('get-fortune-btn'); - const fortuneCard = document.getElementById('fortune-card'); - const fortuneContent = fortuneCard.querySelector('.fortune-content'); - const luckDescElem = document.getElementById('luck-desc'); - const luckTipElem = document.getElementById('luck-tip'); - const fortuneSummaryElem = document.getElementById('fortune-summary'); - const luckyColorElem = document.getElementById('lucky-color'); - const luckyNumberElem = document.getElementById('lucky-number'); - const loadingSpinner = fortuneCard.querySelector('.loading-spinner'); - const tarotCardContainer = document.getElementById('tarot-card'); - const tarotNameElem = document.getElementById('tarot-name'); - const tarotInterpretationElem = document.getElementById('tarot-interpretation'); - - const apiBaseUrls = [ - "https://60s.api.shumengya.top", - ]; - const apiPath = "/v2/luck"; - - const mantras = [ - "顺其自然,皆是美好。", - "相信直觉,它知道方向。", - "每一次呼吸都是新的开始。", - "心怀感恩,好运自来。", - "拥抱变化,发现惊喜。", - "你的能量,超乎想象。", - "保持微笑,宇宙会回应你。" - ]; - - const tarotDeck = [ - { name: "愚者", interpretation: "新的开始,无限的潜力,天真和自由。勇敢地迈出第一步。" }, - { name: "魔术师", interpretation: "创造力,意志力,显化。你拥有实现目标所需的一切资源。" }, - { name: "女祭司", interpretation: "直觉,潜意识,神秘。倾听你内心的声音,智慧在你之内。" }, - { name: "皇后", interpretation: "丰饶,母性,创造。享受生活的美好,与自然和谐相处。" }, - { name: "皇帝", interpretation: "权威,结构,控制。建立秩序和纪律,掌控你的生活。" }, - { name: "教皇", interpretation: "传统,信仰,灵性指导。寻求智慧和知识,遵循传统。" }, - { name: "恋人", interpretation: "爱,和谐,选择。做出与你内心价值观一致的决定。" }, - { name: "战车", interpretation: "胜利,决心,控制。以坚定的意志力克服障碍,勇往直前。" }, - { name: "力量", interpretation: "勇气,内在力量,同情。用温柔和耐心驯服内心的野兽。" }, - { name: "隐士", interpretation: "内省,孤独,寻求真理。花时间独处,向内寻求答案。" }, - { name: "命运之轮", interpretation: "变化,命运,转折点。生活总在变化,顺应潮流。" }, - { name: "正义", interpretation: "公平,真理,因果。为你的行为负责,寻求平衡。" }, - { name: "倒吊人", interpretation: "新的视角,顺从,牺牲。放手,从不同的角度看问题。" }, - { name: "死神", interpretation: "结束,转变,新生。一个周期的结束是另一个周期的开始。" }, - { name: "节制", interpretation: "平衡,和谐,耐心。融合对立的力量,找到中间道路。" }, - { name: "恶魔", interpretation: "束缚,物质主义,诱惑。认识到你的束缚,并寻求解放。" }, - { name: "塔", interpretation: "突变,启示,解放。旧的结构正在崩塌,为新的结构让路。" }, - { name: "星星", interpretation: "希望,灵感,平静。在黑暗之后,总有希望的曙光。" }, - { name: "月亮", interpretation: "幻觉,恐惧,潜意识。面对你的恐惧,相信你的直觉。" }, - { name: "太阳", interpretation: "成功,喜悦,活力。拥抱光明,享受生活的乐趣。" }, - { name: "审判", interpretation: "觉醒,重生,评估。一个反思和更新的时刻。" }, - { name: "世界", interpretation: "完成,整合,成就。一个旅程的成功结束,庆祝你的成就。" } - ]; - - let currentApiIndex = 0; - - const showLoading = (isLoading) => { - if (isLoading) { - fortuneContent.classList.remove('visible'); - loadingSpinner.classList.add('visible'); - } else { - loadingSpinner.classList.remove('visible'); - setTimeout(() => { - fortuneContent.classList.add('visible'); - }, 100); - } - }; - - const fetchFortune = async () => { - showLoading(true); - tarotCardContainer.classList.remove('flipped'); // Reset card on new fetch - - try { - const url = apiBaseUrls[currentApiIndex] + apiPath; - const response = await fetch(url, { timeout: 5000 }); - if (!response.ok) { - throw new Error('Network response was not ok'); - } - const data = await response.json(); - - if (data.code === 200 && data.data) { - updateFortune(data.data); - drawTarotCard(); // Draw a tarot card on success - } else { - throw new Error('Invalid data format'); - } - } catch (error) { - console.error(`API error with ${apiBaseUrls[currentApiIndex]}:`, error); - currentApiIndex = (currentApiIndex + 1) % apiBaseUrls.length; - if (currentApiIndex !== 0) { - fetchFortune(); // Try next API - } else { - displayError(); - } - } - }; - - const updateFortune = (data) => { - luckDescElem.textContent = data.luck_desc || '运势'; - luckTipElem.textContent = data.luck_tip || '今日运势平平,保持好心情。'; - - // Generate and display additional details - fortuneSummaryElem.textContent = mantras[Math.floor(Math.random() * mantras.length)]; - luckyColorElem.style.backgroundColor = `#${Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')}`; - luckyNumberElem.textContent = Math.floor(Math.random() * 100); - - showLoading(false); - }; - - const displayError = () => { - luckDescElem.textContent = '占卜失败'; - luckTipElem.textContent = '无法连接到星辰之力,请稍后再试。'; - fortuneSummaryElem.textContent = '---'; - luckyColorElem.style.backgroundColor = 'transparent'; - luckyNumberElem.textContent = '-'; - showLoading(false); - tarotNameElem.textContent = '指引中断'; - tarotInterpretationElem.textContent = '星辰之力暂时无法连接。'; - tarotCardContainer.classList.add('flipped'); // Show error on card - }; - - const drawTarotCard = () => { - const card = tarotDeck[Math.floor(Math.random() * tarotDeck.length)]; - tarotNameElem.textContent = card.name; - tarotInterpretationElem.textContent = card.interpretation; - - // Flip the card after a short delay to allow the main content to appear - setTimeout(() => { - tarotCardContainer.classList.add('flipped'); - }, 500); - }; - - const createSideDecorations = () => { - const leftContainer = document.querySelector('.left-decor'); - const rightContainer = document.querySelector('.right-decor'); - if (!leftContainer || !rightContainer) return; - - const symbols = ['✧', '✦', '☾', '✶', '✵', '✩', '✨']; - const symbolCount = 15; // Number of symbols per side - - const createSymbols = (container) => { - for (let i = 0; i < symbolCount; i++) { - const symbol = document.createElement('span'); - symbol.classList.add('decor-symbol'); - symbol.textContent = symbols[Math.floor(Math.random() * symbols.length)]; - - // Randomize properties for a more natural look - symbol.style.top = `${Math.random() * 90}vh`; - symbol.style.left = `${Math.random() * 80}%`; - symbol.style.fontSize = `${Math.random() * 20 + 10}px`; - symbol.style.animationDelay = `${Math.random() * 20}s`; - symbol.style.animationDuration = `${Math.random() * 20 + 15}s`; // Duration between 15s and 35s - - container.appendChild(symbol); - } - }; - - createSymbols(leftContainer); - createSymbols(rightContainer); - }; - - getFortuneBtn.addEventListener('click', fetchFortune); - tarotCardContainer.addEventListener('click', () => { - tarotCardContainer.classList.toggle('flipped'); - }); - - // Initial actions on page load - fetchFortune(); - createSideDecorations(); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/返回接口.json deleted file mode 100755 index caa75793..00000000 --- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/返回接口.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "luck_desc": "恋愛運", - "luck_rank": 21, - "luck_tip": "闪亮的邂逅之日!顺其自然吧", - "luck_tip_index": 19 - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/css/style.css deleted file mode 100755 index cfc307ed..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/css/style.css +++ /dev/null @@ -1,330 +0,0 @@ -/* Epic Games 免费游戏 - 淡绿色清新风格样式 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - color: #2d5016; - line-height: 1.6; - overflow-x: hidden; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部 */ -.header { - text-align: center; - margin-bottom: 30px; - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 24px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 2.2rem; - color: #2d5016; - margin-bottom: 10px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - gap: 12px; -} - -.header p { - color: #5a7c65; - font-size: 1rem; -} - -/* 统计信息 */ -.stats { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 15px; - margin-bottom: 25px; -} - -.stat-card { - background: rgba(255, 255, 255, 0.9); - padding: 16px; - border-radius: 15px; - text-align: center; - box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); -} - -.stat-number { - font-size: 1.8rem; - font-weight: 700; - color: #1b5e20; - margin-bottom: 5px; -} - -.stat-label { - color: #5a7c65; - font-size: 0.9rem; -} - -/* 游戏网格 */ -.games-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); - gap: 20px; - margin-bottom: 20px; -} - -/* 游戏卡片 */ -.game-card { - background: rgba(255, 255, 255, 0.95); - border-radius: 18px; - overflow: hidden; - box-shadow: 0 6px 25px rgba(45, 80, 22, 0.1); - transition: all 0.3s ease; - position: relative; -} - -.game-card:hover { - transform: translateY(-5px); - box-shadow: 0 12px 35px rgba(45, 80, 22, 0.15); -} - -.game-cover { - width: 100%; - height: 180px; - object-fit: cover; - border-radius: 0; -} - -.game-info { - padding: 18px; -} - -.game-title { - font-size: 1.1rem; - font-weight: 700; - color: #1b5e20; - margin-bottom: 8px; - line-height: 1.3; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.game-description { - color: #5a7c65; - font-size: 0.9rem; - margin-bottom: 12px; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; - line-height: 1.4; -} - -.game-meta { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 12px; -} - -.game-price { - font-size: 1rem; - font-weight: 600; -} - -.original-price { - color: #81c784; - text-decoration: line-through; -} - -.free-price { - color: #2e7d32; - font-weight: 700; -} - -.game-seller { - color: #5a7c65; - font-size: 0.85rem; -} - -.game-dates { - background: rgba(129, 199, 132, 0.1); - padding: 10px; - border-radius: 10px; - margin-bottom: 12px; - font-size: 0.85rem; - color: #2d5016; -} - -.free-period { - display: flex; - justify-content: space-between; - margin-bottom: 4px; -} - -.game-actions { - display: flex; - gap: 10px; -} - -.btn { - flex: 1; - background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); - color: white; - border: none; - padding: 10px 16px; - border-radius: 10px; - font-size: 0.9rem; - font-weight: 600; - cursor: pointer; - transition: all 0.25s ease; - box-shadow: 0 4px 12px rgba(129, 199, 132, 0.35); - text-decoration: none; - text-align: center; - display: inline-block; -} - -.btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 18px rgba(129, 199, 132, 0.45); -} - -.btn-secondary { - background: linear-gradient(135deg, #a5d6a7 0%, #81c784 100%); -} - -/* 状态标签 */ -.status-badge { - position: absolute; - top: 12px; - right: 12px; - padding: 6px 12px; - border-radius: 20px; - font-size: 0.8rem; - font-weight: 600; - color: white; - text-shadow: 0 1px 2px rgba(0,0,0,0.2); -} - -.status-free { - background: linear-gradient(135deg, #4caf50 0%, #2e7d32 100%); -} - -.status-upcoming { - background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%); -} - -/* 加载与错误 */ -.loading, .error { - text-align: center; - padding: 40px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #e8f5e8; - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 动画 */ -.fade-in { - animation: fadeIn 0.6s ease-in-out; -} - -@keyframes fadeIn { - from { opacity: 0; transform: translateY(20px); } - to { opacity: 1; transform: translateY(0); } -} - -/* 平板端适配 */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { padding: 16px; } - .header h1 { font-size: 2rem; } - .games-grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); } -} - -/* 手机端优化 */ -@media (max-width: 767px) { - .container { padding: 12px; } - .header { padding: 18px; } - .header h1 { font-size: 1.8rem; gap: 8px; } - - .stats { - display: flex; - flex-direction: row; - justify-content: space-between; - gap: 8px; - } - - .stat-card { - padding: 10px 8px; - flex: 1; - min-width: 0; - } - .stat-number { font-size: 1.4rem; } - .stat-label { font-size: 0.75rem; } - - .games-grid { - grid-template-columns: 1fr; - gap: 16px; - } - - .game-card { margin: 0 4px; } - .game-cover { height: 160px; } - .game-info { padding: 14px; } - - .game-actions { - flex-direction: column; - } - - .btn { - width: 100%; - padding: 12px; - } -} - -/* 小屏手机优化 */ -@media (max-width: 480px) { - .stats { - grid-template-columns: 1fr; - } - - .game-meta { - flex-direction: column; - align-items: flex-start; - gap: 6px; - } -} - -/* 高分辨率显示器优化 */ -@media (min-width: 1400px) { - .games-grid { - grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/index.html b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/index.html deleted file mode 100755 index 55b0509a..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - Epic Games 免费游戏 - 60s API 集合 - - - - - -
-
-

- 🎮 Epic Games 免费游戏 -

-
- - -
-
-

正在加载游戏数据,请稍候…

-
- - - - -
- -
-
-
0
-
总游戏数
-
-
-
0
-
当前免费
-
-
-
0
-
即将免费
-
-
- - -
- -
- - -
- -
-
-
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/js/script.js deleted file mode 100755 index c56e2e4c..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/js/script.js +++ /dev/null @@ -1,266 +0,0 @@ -// Epic Games 免费游戏 页面脚本 -(function () { - 'use strict'; - - const API = { - endpoints: [], - currentIndex: 0, - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/epic`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.api.shumengya.top/v2/epic']; - } - }, - // 获取当前接口URL - getCurrentUrl(encoding) { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - if (encoding) url.searchParams.set('encoding', encoding); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } - }; - - // DOM 元素引用 - const els = { - loading: null, - error: null, - container: null, - gamesGrid: null, - totalGames: null, - freeNow: null, - upcoming: null, - refreshBtn: null, - }; - - function initDom() { - els.loading = document.getElementById('loading'); - els.error = document.getElementById('error'); - els.container = document.getElementById('content'); - els.gamesGrid = document.getElementById('games-grid'); - els.totalGames = document.getElementById('total-games'); - els.freeNow = document.getElementById('free-now'); - els.upcoming = document.getElementById('upcoming'); - els.refreshBtn = document.getElementById('refresh-btn'); - } - - function showLoading() { - els.loading.style.display = 'block'; - els.error.style.display = 'none'; - els.container.style.display = 'none'; - } - - function showError(msg) { - els.loading.style.display = 'none'; - els.error.style.display = 'block'; - els.container.style.display = 'none'; - els.error.querySelector('p').textContent = msg || '获取数据失败,请稍后重试'; - } - - function showContent() { - els.loading.style.display = 'none'; - els.error.style.display = 'none'; - els.container.style.display = 'block'; - } - - function safeText(text) { - const div = document.createElement('div'); - div.textContent = text == null ? '' : String(text); - return div.innerHTML; - } - - function formatDate(dateStr) { - if (!dateStr) return ''; - try { - const date = new Date(dateStr); - return date.toLocaleDateString('zh-CN', { - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit' - }); - } catch (e) { - return dateStr; - } - } - - async function fetchData(preferLocal = false) { - if (preferLocal) { - try { - const res = await fetch('./返回接口.json', { cache: 'no-store' }); - const json = await res.json(); - return json; - } catch (e) { - throw new Error('本地数据加载失败'); - } - } - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const res = await fetch(url, { - cache: 'no-store', - timeout: 10000 // 10秒超时 - }); - - if (!res.ok) { - throw new Error(`HTTP ${res.status}: ${res.statusText}`); - } - - const json = await res.json(); - - if (json && json.code === 200) { - console.log(`接口 ${i + 1} 请求成功`); - return json; - } - - throw new Error(json && json.message ? json.message : '接口返回异常'); - - } catch (e) { - console.warn(`接口 ${i + 1} 失败:`, e.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了,尝试本地数据 - console.warn('所有远程接口都失败,尝试本地数据'); - try { - const res = await fetch('./返回接口.json', { cache: 'no-store' }); - const json = await res.json(); - return json; - } catch (e2) { - throw new Error('所有接口和本地数据都无法访问'); - } - } - } - } - - function createGameCard(game) { - const isFree = game.is_free_now; - const statusClass = isFree ? 'status-free' : 'status-upcoming'; - const statusText = isFree ? '限时免费' : '即将免费'; - - return ` -
-
${statusText}
- ${safeText(game.title)} 封面 -
-

${safeText(game.title)}

-

${safeText(game.description)}

- -
-
- ${safeText(game.original_price_desc)} - 免费 -
-
${safeText(game.seller)}
-
- -
-
- 开始:${formatDate(game.free_start)} - 结束:${formatDate(game.free_end)} -
-
- - -
-
- `; - } - - function updateStats(games) { - const total = games.length; - const freeNow = games.filter(game => game.is_free_now).length; - const upcoming = total - freeNow; - - els.totalGames.textContent = total; - els.freeNow.textContent = freeNow; - els.upcoming.textContent = upcoming; - } - - function renderGames(games) { - if (!Array.isArray(games) || games.length === 0) { - els.gamesGrid.innerHTML = '
暂无游戏数据
'; - return; - } - - // 按状态排序:免费的在前 - const sortedGames = [...games].sort((a, b) => { - if (a.is_free_now && !b.is_free_now) return -1; - if (!a.is_free_now && b.is_free_now) return 1; - return 0; - }); - - const html = sortedGames.map(game => createGameCard(game)).join(''); - els.gamesGrid.innerHTML = html; - - updateStats(games); - } - - function render(data) { - const games = data?.data || []; - renderGames(games); - showContent(); - } - - async function load() { - showLoading(); - - // 初始化API接口列表 - await API.init(); - - try { - const data = await fetchData(false); - render(data); - } catch (e) { - console.error('数据获取失败:', e); - showError(e.message || '获取数据失败,请稍后重试'); - } - } - - function bindEvents() { - if (els.refreshBtn) { - els.refreshBtn.addEventListener('click', load); - } - - // 快捷键 Ctrl+R 刷新(不拦截浏览器默认刷新) - document.addEventListener('keydown', (e) => { - if (e.ctrlKey && e.key === 'r' && !e.defaultPrevented) { - // 不阻止默认行为,让浏览器正常刷新 - } - }); - } - - document.addEventListener('DOMContentLoaded', () => { - initDom(); - bindEvents(); - load(); - }); -})(); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/返回接口.json deleted file mode 100755 index be3aa159..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/返回接口.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "id": "9aa227e2ba294bb1a95c95fde892eb31", - "title": "《Totally Reliable Delivery Service》 Standard Edition", - "cover": "https://cdn1.epicgames.com/52b90f9a982a404781b189f6a7903226/offer/EGS_TotallyReliableDeliveryService_WereFiveGames_S1-2560x1440-47e6e9562d62705a75ea7b7096d0b8dc.jpg", - "original_price": 52, - "original_price_desc": "¥52.00", - "description": "穿好护腰护具,发动货车,送货的时间到啦!在一个高度互动的沙盒世界中,与最多三位好友一起随意地完成送货。货物已试投,这就是我们靠谱快递(Totally Reliable Delivery Service)的品质保证!", - "seller": "Infogrames LLC", - "is_free_now": true, - "free_start": "2025/08/14 23:00:00", - "free_start_at": 1755183600000, - "free_end": "2025/08/21 23:00:00", - "free_end_at": 1755788400000, - "link": "https://store.epicgames.com/store/zh-CN/p/totally-reliable-delivery-service/home" - }, - { - "id": "8ea3500dc38e4f429702bf889c172d3d", - "title": "Hidden Folks", - "cover": "https://cdn1.epicgames.com/spt-assets/7bfd56b0586348dcb139945d9e59f988/hidden-folks-1b7hh.png", - "original_price": 47, - "original_price_desc": "¥47.00", - "description": "Search for hidden folks in hand-drawn, interactive, miniature landscapes. Unfurl tent flaps, cut through bushes, slam doors, and poke some crocodiles! Rooooaaaarrrr!!!!!", - "seller": "Adriaan de Jongh", - "is_free_now": true, - "free_start": "2025/08/14 23:00:00", - "free_start_at": 1755183600000, - "free_end": "2025/08/21 23:00:00", - "free_end_at": 1755788400000, - "link": "https://store.epicgames.com/store/zh-CN/p/hidden-folks-239d16" - }, - { - "id": "4cbb6c3704d240f19c3dd5f5cb2b0cb4", - "title": "Kamaeru", - "cover": "https://cdn1.epicgames.com/spt-assets/44313cfbb62b4df5801d0c8d541c2624/kamaeru-40asc.png", - "original_price": 62, - "original_price_desc": "¥62.00", - "description": "Foster a sanctuary for frogs and restore the biodiversity of the wetlands in Kamaeru, a cozy frog collecting game, where you take pictures of frogs, play mini-games and decorate your habitat. Hop right to it!", - "seller": "Armor Games Studios", - "is_free_now": false, - "free_start": "2025/08/21 23:00:00", - "free_start_at": 1755788400000, - "free_end": "2025/08/28 23:00:00", - "free_end_at": 1756393200000, - "link": "https://store.epicgames.com/store/zh-CN/p/kamaeru-0c301e" - }, - { - "id": "0d9a533f0e684cc18620a8f408e8e72c", - "title": "Strange Horticulture", - "cover": "https://cdn1.epicgames.com/spt-assets/15e8e3eba65a4763a815d6eae1d763b2/strange-horticulture-offer-2wghv.png", - "original_price": 45, - "original_price_desc": "¥45.00", - "description": "款神秘学解谜游戏,你将扮演当地植物商店的店主,寻找并识别新的植物,悠闲撸猫,与女巫团体交谈,或加入异教。收集各种强大的植物,用它们来影响故事走向,揭开昂德米尔镇的黑暗谜团。", - "seller": "Iceberg Interactive", - "is_free_now": false, - "free_start": "2025/08/21 23:00:00", - "free_start_at": 1755788400000, - "free_end": "2025/08/28 23:00:00", - "free_end_at": 1756393200000, - "link": "https://store.epicgames.com/store/zh-CN/p/strange-horticulture-360e80" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/IP查询.html b/InfoGenie-frontend/public/60sapi/实用功能/IP查询.html new file mode 100644 index 00000000..ad92f4b4 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/IP查询.html @@ -0,0 +1,60 @@ + + + + +IP查询 + + + + + +
+ +

🌐 IP查询

+ +
+
+
加载中...
+
+ + + diff --git a/InfoGenie-frontend/public/60sapi/实用功能/Whois查询.html b/InfoGenie-frontend/public/60sapi/实用功能/Whois查询.html new file mode 100644 index 00000000..04de0935 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/Whois查询.html @@ -0,0 +1,64 @@ + + + + +Whois查询 + + + + + +
+ +

🔍 Whois查询

+
+
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/二维码生成.html b/InfoGenie-frontend/public/60sapi/实用功能/二维码生成.html new file mode 100644 index 00000000..6f343f36 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/二维码生成.html @@ -0,0 +1,64 @@ + + + + +二维码生成 + + + + + +
+ +

📱 二维码生成

+
+
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/今日油价.html b/InfoGenie-frontend/public/60sapi/实用功能/今日油价.html new file mode 100644 index 00000000..237ea807 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/今日油价.html @@ -0,0 +1,52 @@ + + + + +今日油价 + + + + + +
+ +

⛽ 今日油价

+ +
+
+
加载中...
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/今日金价.html b/InfoGenie-frontend/public/60sapi/实用功能/今日金价.html new file mode 100644 index 00000000..19f5d984 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/今日金价.html @@ -0,0 +1,53 @@ + + + + +今日金价 + + + + + +
+ +

🥇 今日金价

+ +
+
+
加载中...
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/background.css deleted file mode 100755 index 4096b50d..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/background.css +++ /dev/null @@ -1,233 +0,0 @@ -/* 动态背景样式 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: linear-gradient(135deg, #f0f8e8 0%, #e8f5e8 50%, #d4f4dd 100%); - z-index: -2; -} - -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 20% 80%, rgba(144, 238, 144, 0.2) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(173, 255, 173, 0.2) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(152, 251, 152, 0.2) 0%, transparent 50%); - z-index: -1; - animation: backgroundMove 20s ease-in-out infinite; -} - -@keyframes backgroundMove { - 0%, 100% { - background: - radial-gradient(circle at 20% 80%, rgba(144, 238, 144, 0.2) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(173, 255, 173, 0.2) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(152, 251, 152, 0.2) 0%, transparent 50%); - } - 25% { - background: - radial-gradient(circle at 60% 30%, rgba(144, 238, 144, 0.2) 0%, transparent 50%), - radial-gradient(circle at 30% 70%, rgba(173, 255, 173, 0.2) 0%, transparent 50%), - radial-gradient(circle at 80% 80%, rgba(152, 251, 152, 0.2) 0%, transparent 50%); - } - 50% { - background: - radial-gradient(circle at 80% 60%, rgba(144, 238, 144, 0.2) 0%, transparent 50%), - radial-gradient(circle at 20% 30%, rgba(173, 255, 173, 0.2) 0%, transparent 50%), - radial-gradient(circle at 60% 70%, rgba(152, 251, 152, 0.2) 0%, transparent 50%); - } - 75% { - background: - radial-gradient(circle at 40% 90%, rgba(144, 238, 144, 0.2) 0%, transparent 50%), - radial-gradient(circle at 70% 10%, rgba(173, 255, 173, 0.2) 0%, transparent 50%), - radial-gradient(circle at 20% 60%, rgba(152, 251, 152, 0.2) 0%, transparent 50%); - } -} - -/* 浮动粒子效果 */ -.particles { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; - z-index: -1; -} - -.particle { - position: absolute; - width: 4px; - height: 4px; - background: rgba(255, 255, 255, 0.5); - border-radius: 50%; - animation: float 15s infinite linear; -} - -.particle:nth-child(1) { - left: 10%; - animation-delay: 0s; - animation-duration: 12s; -} - -.particle:nth-child(2) { - left: 20%; - animation-delay: 2s; - animation-duration: 18s; -} - -.particle:nth-child(3) { - left: 30%; - animation-delay: 4s; - animation-duration: 15s; -} - -.particle:nth-child(4) { - left: 40%; - animation-delay: 6s; - animation-duration: 20s; -} - -.particle:nth-child(5) { - left: 50%; - animation-delay: 8s; - animation-duration: 14s; -} - -.particle:nth-child(6) { - left: 60%; - animation-delay: 10s; - animation-duration: 16s; -} - -.particle:nth-child(7) { - left: 70%; - animation-delay: 12s; - animation-duration: 22s; -} - -.particle:nth-child(8) { - left: 80%; - animation-delay: 14s; - animation-duration: 13s; -} - -.particle:nth-child(9) { - left: 90%; - animation-delay: 16s; - animation-duration: 19s; -} - -.particle:nth-child(10) { - left: 15%; - animation-delay: 18s; - animation-duration: 17s; -} - -@keyframes float { - 0% { - transform: translateY(100vh) rotate(0deg); - opacity: 0; - } - 10% { - opacity: 1; - } - 90% { - opacity: 1; - } - 100% { - transform: translateY(-100px) rotate(360deg); - opacity: 0; - } -} - -/* 网格背景效果 */ -.grid-background { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - linear-gradient(rgba(255, 255, 255, 0.1) 1px, transparent 1px), - linear-gradient(90deg, rgba(255, 255, 255, 0.1) 1px, transparent 1px); - background-size: 50px 50px; - z-index: -1; - opacity: 0.3; - animation: gridMove 30s linear infinite; -} - -@keyframes gridMove { - 0% { - transform: translate(0, 0); - } - 100% { - transform: translate(50px, 50px); - } -} - -/* 光晕效果 */ -.glow-effect { - position: fixed; - top: 50%; - left: 50%; - width: 300px; - height: 300px; - background: radial-gradient(circle, rgba(74, 144, 226, 0.2) 0%, transparent 70%); - border-radius: 50%; - transform: translate(-50%, -50%); - z-index: -1; - animation: pulse 4s ease-in-out infinite; -} - -@keyframes pulse { - 0%, 100% { - transform: translate(-50%, -50%) scale(1); - opacity: 0.5; - } - 50% { - transform: translate(-50%, -50%) scale(1.2); - opacity: 0.8; - } -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - .grid-background { - background-size: 30px 30px; - } - - .glow-effect { - width: 200px; - height: 200px; - } - - .particle { - width: 3px; - height: 3px; - } -} - -@media (max-width: 480px) { - .grid-background { - background-size: 20px 20px; - } - - .glow-effect { - width: 150px; - height: 150px; - } - - .particle { - width: 2px; - height: 2px; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/style.css deleted file mode 100755 index 879b6b3f..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/style.css +++ /dev/null @@ -1,461 +0,0 @@ -/* 全局样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - line-height: 1.6; - color: #333; - min-height: 100vh; - overflow-x: hidden; - /* 隐藏滚动条但保留滚动功能 */ - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* IE and Edge */ -} - -/* 隐藏 Webkit 浏览器的滚动条 */ -body::-webkit-scrollbar, -html::-webkit-scrollbar, -*::-webkit-scrollbar { - display: none; -} - -/* 全局隐藏滚动条但保留滚动功能 */ -html { - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* IE and Edge */ -} - -/* 容器样式 */ -.container { - min-height: 100vh; - display: flex; - flex-direction: column; - position: relative; - z-index: 1; -} - -/* 头部样式 */ -.header { - text-align: center; - padding: 3rem 2rem 2rem; - background: linear-gradient(135deg, rgba(144, 238, 144, 0.15), rgba(152, 251, 152, 0.15)); - backdrop-filter: blur(10px); - border-bottom: 1px solid rgba(255, 255, 255, 0.2); -} - -.header h1 { - font-size: 2.5rem; - font-weight: 700; - background: linear-gradient(135deg, #228B22, #32CD32); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - margin-bottom: 0.5rem; - text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); -} - -.header h1 i { - margin-right: 0.5rem; - background: linear-gradient(135deg, #228B22, #32CD32); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.subtitle { - font-size: 1.1rem; - color: #666; - font-weight: 300; -} - -/* 主要内容区域 */ -.main-content { - flex: 1; - padding: 2rem; - max-width: 800px; - margin: 0 auto; - width: 100%; -} - -/* 查询按钮区域 */ -.query-section { - text-align: center; - margin-bottom: 2rem; -} - -.query-btn { - background: linear-gradient(135deg, #228B22, #32CD32); - color: white; - border: none; - padding: 1rem 2rem; - font-size: 1.1rem; - font-weight: 600; - border-radius: 50px; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(34, 139, 34, 0.3); - display: inline-flex; - align-items: center; - gap: 0.5rem; - min-width: 200px; - justify-content: center; -} - -.query-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(34, 139, 34, 0.4); - background: linear-gradient(135deg, #1e7e1e, #2eb82e); -} - -.query-btn:active { - transform: translateY(0); -} - -.query-btn:disabled { - opacity: 0.6; - cursor: not-allowed; - transform: none; -} - -/* 加载动画 */ -.loading { - text-align: center; - padding: 2rem; -} - -.spinner { - width: 50px; - height: 50px; - border: 4px solid #f3f3f3; - border-top: 4px solid #4a90e2; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 1rem; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading p { - color: #666; - font-size: 1rem; -} - -/* IP信息卡片 */ -.ip-info { - animation: fadeInUp 0.6s ease; -} - -@keyframes fadeInUp { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.ip-card { - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(10px); - border-radius: 20px; - padding: 2rem; - margin-bottom: 2rem; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); - border: 1px solid rgba(255, 255, 255, 0.2); -} - -.ip-header { - display: flex; - align-items: center; - gap: 0.5rem; - margin-bottom: 1.5rem; - padding-bottom: 1rem; - border-bottom: 2px solid #f0f0f0; -} - -.ip-header i { - font-size: 1.5rem; - color: #4a90e2; -} - -.ip-header h2 { - font-size: 1.5rem; - font-weight: 600; - color: #333; -} - -.ip-display { - display: flex; - align-items: center; - justify-content: center; - gap: 1rem; - margin-bottom: 1.5rem; - padding: 1.5rem; - background: linear-gradient(135deg, rgba(74, 144, 226, 0.1), rgba(80, 200, 120, 0.1)); - border-radius: 15px; - border: 2px solid rgba(74, 144, 226, 0.2); -} - -.ip-address { - font-size: 2rem; - font-weight: 700; - font-family: 'Courier New', monospace; - color: #2c3e50; - background: linear-gradient(135deg, #4a90e2, #50c878); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); -} - -.copy-btn { - background: #4a90e2; - color: white; - border: none; - padding: 0.5rem; - border-radius: 8px; - cursor: pointer; - transition: all 0.3s ease; - font-size: 1rem; - width: 40px; - height: 40px; - display: flex; - align-items: center; - justify-content: center; -} - -.copy-btn:hover { - background: #3a7bc8; - transform: scale(1.1); -} - -.ip-details { - display: grid; - gap: 1rem; -} - -.detail-item { - display: flex; - align-items: center; - gap: 0.5rem; - padding: 0.75rem; - background: rgba(248, 249, 250, 0.8); - border-radius: 10px; - transition: all 0.3s ease; -} - -.detail-item:hover { - background: rgba(74, 144, 226, 0.1); - transform: translateX(5px); -} - -.detail-item i { - color: #4a90e2; - width: 20px; - text-align: center; -} - -.detail-item .label { - font-weight: 600; - color: #555; - min-width: 80px; -} - -.detail-item .value { - color: #333; - font-weight: 500; -} - -/* IP地址说明区域 */ -.ip-explanation { - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(10px); - border-radius: 20px; - padding: 2rem; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); - border: 1px solid rgba(255, 255, 255, 0.2); -} - -.ip-explanation h3 { - display: flex; - align-items: center; - gap: 0.5rem; - margin-bottom: 1rem; - font-size: 1.3rem; - color: #333; -} - -.ip-explanation h3 i { - color: #4a90e2; -} - -.ip-explanation p { - color: #666; - line-height: 1.8; - margin-bottom: 1.5rem; -} - -.features { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: 1rem; -} - -.feature-item { - display: flex; - align-items: flex-start; - gap: 1rem; - padding: 1rem; - background: rgba(248, 249, 250, 0.8); - border-radius: 12px; - transition: all 0.3s ease; -} - -.feature-item:hover { - background: rgba(74, 144, 226, 0.1); - transform: translateY(-2px); -} - -.feature-item i { - color: #4a90e2; - font-size: 1.5rem; - margin-top: 0.2rem; -} - -.feature-item h4 { - font-size: 1rem; - font-weight: 600; - color: #333; - margin-bottom: 0.3rem; -} - -.feature-item p { - font-size: 0.9rem; - color: #666; - line-height: 1.5; - margin: 0; -} - -/* 错误信息 */ -.error-message { - text-align: center; - padding: 2rem; - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(10px); - border-radius: 20px; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); - border: 1px solid rgba(255, 99, 99, 0.3); - animation: fadeInUp 0.6s ease; -} - -.error-message i { - font-size: 3rem; - color: #ff6b6b; - margin-bottom: 1rem; -} - -.error-message p { - color: #666; - font-size: 1.1rem; - margin-bottom: 1.5rem; -} - -.retry-btn { - background: #ff6b6b; - color: white; - border: none; - padding: 0.75rem 1.5rem; - font-size: 1rem; - font-weight: 600; - border-radius: 25px; - cursor: pointer; - transition: all 0.3s ease; -} - -.retry-btn:hover { - background: #ff5252; - transform: translateY(-2px); - box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3); -} - -/* 页脚 */ -.footer { - text-align: center; - padding: 2rem; - background: rgba(248, 249, 250, 0.8); - backdrop-filter: blur(10px); - border-top: 1px solid rgba(255, 255, 255, 0.2); - color: #666; - font-size: 0.9rem; -} - -/* 响应式设计 */ -@media (max-width: 768px) { - .header { - padding: 2rem 1rem 1.5rem; - } - - .header h1 { - font-size: 2rem; - } - - .main-content { - padding: 1rem; - } - - .ip-card, .ip-explanation { - padding: 1.5rem; - } - - .ip-address { - font-size: 1.5rem; - } - - .ip-display { - flex-direction: column; - gap: 1rem; - } - - .features { - grid-template-columns: 1fr; - } - - .detail-item { - flex-direction: column; - align-items: flex-start; - gap: 0.3rem; - } - - .detail-item .label { - min-width: auto; - } -} - -@media (max-width: 480px) { - .header h1 { - font-size: 1.8rem; - } - - .query-btn { - padding: 0.875rem 1.5rem; - font-size: 1rem; - min-width: 180px; - } - - .ip-address { - font-size: 1.3rem; - } - - .ip-card, .ip-explanation { - padding: 1rem; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/index.html b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/index.html deleted file mode 100755 index 41638692..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - 公网IP地址查询 - - - - - -
- -
-

公网IP地址查询

-

快速获取您的公网IP地址信息

-
- - -
- -
- -
- - - - - - - - - -
- - -
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/js/script.js deleted file mode 100755 index 4cbc83d2..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/js/script.js +++ /dev/null @@ -1,343 +0,0 @@ -// 公网IP地址查询应用 -class IPQueryApp { - constructor() { - this.apiEndpoint = 'https://60s.api.shumengya.top/v2/ip'; - this.init(); - } - - // 初始化应用 - init() { - this.bindEvents(); - this.createParticles(); - this.createBackgroundElements(); - console.log('IP查询应用初始化完成'); - } - - // 绑定事件 - bindEvents() { - const queryBtn = document.getElementById('queryBtn'); - const retryBtn = document.getElementById('retryBtn'); - const copyBtn = document.getElementById('copyBtn'); - - if (queryBtn) { - queryBtn.addEventListener('click', () => this.queryIP()); - } - - if (retryBtn) { - retryBtn.addEventListener('click', () => this.queryIP()); - } - - if (copyBtn) { - copyBtn.addEventListener('click', () => this.copyIP()); - } - - // 页面加载完成后自动查询一次 - document.addEventListener('DOMContentLoaded', () => { - setTimeout(() => this.queryIP(), 500); - }); - } - - // 创建浮动粒子 - createParticles() { - const particlesContainer = document.createElement('div'); - particlesContainer.className = 'particles'; - document.body.appendChild(particlesContainer); - - for (let i = 0; i < 10; i++) { - const particle = document.createElement('div'); - particle.className = 'particle'; - particlesContainer.appendChild(particle); - } - } - - // 创建背景元素 - createBackgroundElements() { - // 创建网格背景 - const gridBackground = document.createElement('div'); - gridBackground.className = 'grid-background'; - document.body.appendChild(gridBackground); - - // 创建光晕效果 - const glowEffect = document.createElement('div'); - glowEffect.className = 'glow-effect'; - document.body.appendChild(glowEffect); - } - - // 显示加载状态 - showLoading() { - const loading = document.getElementById('loading'); - const ipInfo = document.getElementById('ipInfo'); - const errorMessage = document.getElementById('errorMessage'); - const queryBtn = document.getElementById('queryBtn'); - - if (loading) loading.style.display = 'block'; - if (ipInfo) ipInfo.style.display = 'none'; - if (errorMessage) errorMessage.style.display = 'none'; - if (queryBtn) { - queryBtn.disabled = true; - queryBtn.innerHTML = ' 查询中...'; - } - } - - // 隐藏加载状态 - hideLoading() { - const loading = document.getElementById('loading'); - const queryBtn = document.getElementById('queryBtn'); - - if (loading) loading.style.display = 'none'; - if (queryBtn) { - queryBtn.disabled = false; - queryBtn.innerHTML = ' 查询我的IP'; - } - } - - // 显示错误信息 - showError(message) { - const errorMessage = document.getElementById('error-message'); - const ipInfo = document.getElementById('ip-info'); - - if (errorMessage) { - errorMessage.style.display = 'block'; - const errorText = errorMessage.querySelector('p'); - if (errorText) errorText.textContent = message || '获取IP信息失败,请稍后重试'; - } - if (ipInfo) ipInfo.style.display = 'none'; - - this.hideLoading(); - } - - // 查询IP地址 - async queryIP() { - try { - this.showLoading(); - console.log('开始查询IP地址...'); - - const response = await fetch(this.apiEndpoint, { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - } - }); - - console.log('API响应状态:', response.status); - - if (!response.ok) { - throw new Error(`HTTP错误: ${response.status}`); - } - - const data = await response.json(); - console.log('API返回数据:', data); - - if (data.code === 200 && data.data) { - this.displayIPInfo(data.data); - } else { - throw new Error(data.message || '获取IP信息失败'); - } - - } catch (error) { - console.error('查询IP失败:', error); - this.showError(error.message); - } - } - - // 显示IP信息 - displayIPInfo(data) { - const ipInfo = document.getElementById('ip-info'); - const errorMessage = document.getElementById('error-message'); - - // 更新IP地址显示 - const ipAddressElement = document.getElementById('ip-address'); - if (ipAddressElement && data.ip) { - ipAddressElement.textContent = data.ip; - } - - // 更新查询时间 - const queryTimeElement = document.getElementById('query-time'); - if (queryTimeElement) { - const now = new Date(); - queryTimeElement.textContent = now.toLocaleString('zh-CN'); - } - - // 更新详细信息 - 只显示API提供的数据 - if (data.location) this.updateDetailItem('location', data.location); - else this.hideDetailItem('location'); - - if (data.isp) this.updateDetailItem('isp', data.isp); - else this.hideDetailItem('isp'); - - if (data.country) this.updateDetailItem('country', data.country); - else this.hideDetailItem('country'); - - if (data.region) this.updateDetailItem('region', data.region); - else this.hideDetailItem('region'); - - if (data.city) this.updateDetailItem('city', data.city); - else this.hideDetailItem('city'); - - if (data.timezone) this.updateDetailItem('timezone', data.timezone); - else this.hideDetailItem('timezone'); - - // 显示IP信息,隐藏错误信息 - if (ipInfo) ipInfo.style.display = 'block'; - if (errorMessage) errorMessage.style.display = 'none'; - - this.hideLoading(); - console.log('IP信息显示完成'); - } - - // 更新详细信息项 - updateDetailItem(id, value) { - const element = document.getElementById(id); - if (element) { - element.textContent = value; - // 显示对应的详细信息行 - const detailRow = element.closest('.detail-item'); - if (detailRow) { - detailRow.style.display = 'flex'; - } - } - } - - // 隐藏详细信息项 - hideDetailItem(id) { - const element = document.getElementById(id); - if (element) { - // 隐藏整个详细信息行 - const detailRow = element.closest('.detail-item'); - if (detailRow) { - detailRow.style.display = 'none'; - } - } - } - - // 复制IP地址 - async copyIP() { - const ipAddressElement = document.getElementById('ip-address'); - const copyBtn = document.getElementById('copyBtn'); - - if (!ipAddressElement || !ipAddressElement.textContent) { - this.showToast('没有可复制的IP地址', 'error'); - return; - } - - try { - await navigator.clipboard.writeText(ipAddressElement.textContent); - - // 更新按钮状态 - if (copyBtn) { - const originalHTML = copyBtn.innerHTML; - copyBtn.innerHTML = ''; - copyBtn.style.background = '#50c878'; - - setTimeout(() => { - copyBtn.innerHTML = originalHTML; - copyBtn.style.background = '#4a90e2'; - }, 1500); - } - - this.showToast('IP地址已复制到剪贴板', 'success'); - console.log('IP地址已复制:', ipAddressElement.textContent); - - } catch (error) { - console.error('复制失败:', error); - this.showToast('复制失败,请手动选择复制', 'error'); - } - } - - // 显示提示消息 - showToast(message, type = 'info') { - // 移除已存在的toast - const existingToast = document.querySelector('.toast'); - if (existingToast) { - existingToast.remove(); - } - - // 创建新的toast - const toast = document.createElement('div'); - toast.className = `toast toast-${type}`; - toast.innerHTML = ` - - ${message} - `; - - // 添加toast样式 - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: ${type === 'success' ? '#50c878' : type === 'error' ? '#ff6b6b' : '#4a90e2'}; - color: white; - padding: 1rem 1.5rem; - border-radius: 10px; - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); - z-index: 1000; - display: flex; - align-items: center; - gap: 0.5rem; - font-weight: 500; - animation: slideInRight 0.3s ease; - max-width: 300px; - `; - - // 添加动画样式 - const style = document.createElement('style'); - style.textContent = ` - @keyframes slideInRight { - from { - transform: translateX(100%); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } - } - @keyframes slideOutRight { - from { - transform: translateX(0); - opacity: 1; - } - to { - transform: translateX(100%); - opacity: 0; - } - } - `; - document.head.appendChild(style); - - document.body.appendChild(toast); - - // 3秒后自动移除 - setTimeout(() => { - toast.style.animation = 'slideOutRight 0.3s ease'; - setTimeout(() => { - if (toast.parentNode) { - toast.remove(); - } - if (style.parentNode) { - style.remove(); - } - }, 300); - }, 3000); - } - - // 格式化时间 - formatTime(timestamp) { - const date = new Date(timestamp); - return date.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit' - }); - } -} - -// 初始化应用 -const app = new IPQueryApp(); - -// 导出到全局作用域(用于调试) -window.IPQueryApp = app; \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/接口集合.json deleted file mode 100755 index 5f95c7b9..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top/v2/ip" -] \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/返回接口.json deleted file mode 100755 index ca6fcb11..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/返回接口.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "ip": "2401:b60:16:83::" - } -} - -// 注意:此API只返回IP地址,不包含以下信息: -// - location (位置信息) -// - isp (网络服务商) -// - country (国家) -// - region (地区) -// - city (城市) -// - timezone (时区) -// -// 如需这些信息,需要使用其他API服务 \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/background.css deleted file mode 100755 index 2b5c219b..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/background.css +++ /dev/null @@ -1,590 +0,0 @@ -/* 全局滚动条隐藏样式 */ -html, body { - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* IE/Edge */ -} - -html::-webkit-scrollbar, -body::-webkit-scrollbar, -*::-webkit-scrollbar { - display: none; /* Webkit浏览器 */ -} - -/* 农历主题背景样式 - 淡黄绿色到淡绿色清新渐变 */ -body { - background: linear-gradient(135deg, - #f0f8e8 0%, /* 淡黄绿色 */ - #e8f5e8 20%, /* 浅绿色 */ - #d4f4dd 40%, /* 淡绿色 */ - #c8f2d4 60%, /* 清新绿色 */ - #b8f0c8 80%, /* 柔和绿色 */ - #e8f5e8 100% /* 浅绿色 */ - ); - background-size: 400% 400%; - animation: gentleShift 30s ease infinite; - background-attachment: fixed; - min-height: 100vh; - position: relative; - /* 隐藏滚动条但保留滚动功能 */ - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* IE/Edge */ -} - -@keyframes gentleShift { - 0% { background-position: 0% 50%; } - 25% { background-position: 100% 50%; } - 50% { background-position: 100% 100%; } - 75% { background-position: 0% 100%; } - 100% { background-position: 0% 50%; } -} - -/* 动态颜色调节系统 - 绿色主题版本 */ -.adaptive-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 20% 30%, rgba(200, 242, 212, 0.3) 0%, transparent 50%), - radial-gradient(circle at 80% 70%, rgba(184, 240, 200, 0.25) 0%, transparent 50%), - linear-gradient(45deg, rgba(232, 245, 232, 0.2) 0%, rgba(212, 244, 221, 0.3) 100%); - pointer-events: none; - z-index: 1; - animation: adaptiveShift 60s ease infinite; -} - -@keyframes adaptiveShift { - 0% { - background: - radial-gradient(circle at 20% 30%, rgba(232, 245, 232, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 70%, rgba(212, 244, 221, 0.15) 0%, transparent 50%), - linear-gradient(45deg, rgba(240, 248, 232, 0.1) 0%, rgba(232, 245, 232, 0.2) 100%); - } - 25% { - background: - radial-gradient(circle at 70% 20%, rgba(200, 242, 212, 0.2) 0%, transparent 50%), - radial-gradient(circle at 30% 80%, rgba(184, 240, 200, 0.1) 0%, transparent 50%), - linear-gradient(135deg, rgba(212, 244, 221, 0.15) 0%, rgba(200, 242, 212, 0.25) 100%); - } - 50% { - background: - radial-gradient(circle at 50% 50%, rgba(220, 246, 228, 0.15) 0%, transparent 50%), - radial-gradient(circle at 10% 90%, rgba(232, 245, 232, 0.12) 0%, transparent 50%), - linear-gradient(225deg, rgba(240, 248, 232, 0.12) 0%, rgba(212, 244, 221, 0.22) 100%); - } - 75% { - background: - radial-gradient(circle at 90% 60%, rgba(184, 240, 200, 0.18) 0%, transparent 50%), - radial-gradient(circle at 40% 10%, rgba(240, 248, 232, 0.08) 0%, transparent 50%), - linear-gradient(315deg, rgba(232, 245, 232, 0.1) 0%, rgba(200, 242, 212, 0.2) 100%); - } - 100% { - background: - radial-gradient(circle at 20% 30%, rgba(232, 245, 232, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 70%, rgba(212, 244, 221, 0.15) 0%, transparent 50%), - linear-gradient(45deg, rgba(240, 248, 232, 0.1) 0%, rgba(232, 245, 232, 0.2) 100%); - } -} - -/* 高清稻穗贴图层 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - /* 主稻穗束 - 高清细节 */ - radial-gradient(ellipse 1.5px 12px at 50% 45%, #DAA520 0%, #B8860B 30%, transparent 80%), - radial-gradient(ellipse 1px 10px at 48% 50%, #FFD700 0%, #DAA520 40%, transparent 75%), - radial-gradient(ellipse 1.2px 11px at 52% 48%, #FFCC00 0%, #B8860B 35%, transparent 78%), - radial-gradient(ellipse 0.8px 9px at 49% 52%, #F4A460 0%, #DAA520 45%, transparent 70%), - radial-gradient(ellipse 1.3px 13px at 51% 46%, #DEB887 0%, #B8860B 38%, transparent 82%), - - /* 次级稻穗 */ - radial-gradient(ellipse 1px 8px at 30% 35%, #FFD700 0%, #DAA520 50%, transparent 75%), - radial-gradient(ellipse 0.9px 7px at 32% 38%, #FFCC00 0%, #B8860B 45%, transparent 70%), - radial-gradient(ellipse 1.1px 9px at 28% 36%, #DEB887 0%, #DAA520 40%, transparent 78%), - - radial-gradient(ellipse 1px 8px at 70% 65%, #FFD700 0%, #DAA520 50%, transparent 75%), - radial-gradient(ellipse 0.8px 7px at 72% 68%, #F4A460 0%, #B8860B 45%, transparent 70%), - radial-gradient(ellipse 1.2px 9px at 68% 66%, #FFCC00 0%, #DAA520 40%, transparent 78%), - - /* 散落稻粒 */ - radial-gradient(ellipse 0.5px 4px at 20% 80%, #FFD700 0%, transparent 60%), - radial-gradient(ellipse 0.6px 5px at 80% 20%, #FFCC00 0%, transparent 65%), - radial-gradient(ellipse 0.4px 3px at 15% 25%, #DEB887 0%, transparent 55%), - radial-gradient(ellipse 0.7px 6px at 85% 75%, #DAA520 0%, transparent 70%), - - /* 稻穗茎秆 - 更细致 */ - linear-gradient(88deg, transparent 49%, #9ACD32 49.5%, #8FBC8F 50%, #9ACD32 50.5%, transparent 51%), - linear-gradient(92deg, transparent 49%, #8FBC8F 49.5%, #228B22 50%, #8FBC8F 50.5%, transparent 51%), - linear-gradient(85deg, transparent 49%, #32CD32 49.5%, #9ACD32 50%, #32CD32 50.5%, transparent 51%); - - background-size: - 25px 25px, 24px 24px, 26px 26px, 23px 23px, 27px 27px, - 20px 20px, 19px 19px, 21px 21px, - 22px 22px, 18px 18px, 23px 23px, - 15px 15px, 16px 16px, 14px 14px, 17px 17px, - 80px 80px, 85px 85px, 75px 75px; - - background-position: - 0 0, 12px 12px, 6px 18px, 18px 6px, 3px 21px, - 40px 40px, 52px 48px, 35px 55px, - 120px 120px, 135px 115px, 110px 130px, - 200px 200px, 220px 180px, 180px 220px, 240px 160px, - 0 0, 40px 40px, 20px 60px; - - opacity: 0.25; - pointer-events: none; - z-index: -2; - animation: wheatSway 20s ease-in-out infinite; -} - -@keyframes wheatSway { - 0%, 100% { - transform: translateX(0) rotate(0deg); - } - 25% { - transform: translateX(5px) rotate(0.5deg); - } - 50% { - transform: translateX(-3px) rotate(-0.3deg); - } - 75% { - transform: translateX(2px) rotate(0.2deg); - } -} - -/* 大型稻穗背景层 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - /* 主稻穗茎秆 - 右侧大型 */ - linear-gradient(85deg, transparent 45%, #9ACD32 47%, #8FBC8F 48%, #228B22 49%, #8FBC8F 50%, #9ACD32 51%, transparent 53%), - linear-gradient(87deg, transparent 46%, #32CD32 47.5%, #9ACD32 48.5%, #8FBC8F 49.5%, #9ACD32 50.5%, #32CD32 51.5%, transparent 54%), - - /* 主稻穗穗头 - 大型椭圆稻粒群 */ - radial-gradient(ellipse 8px 25px at 75% 15%, #FFD700 0%, #DAA520 30%, #B8860B 60%, transparent 85%), - radial-gradient(ellipse 7px 23px at 77% 18%, #FFCC00 0%, #DAA520 35%, transparent 80%), - radial-gradient(ellipse 9px 27px at 73% 12%, #F4A460 0%, #B8860B 40%, transparent 88%), - radial-gradient(ellipse 6px 22px at 79% 20%, #DEB887 0%, #DAA520 45%, transparent 75%), - radial-gradient(ellipse 8px 24px at 75% 16%, #FFD700 0%, #B8860B 38%, transparent 82%), - - /* 稻穗分支 */ - radial-gradient(ellipse 5px 18px at 72% 25%, #FFCC00 0%, #DAA520 50%, transparent 75%), - radial-gradient(ellipse 4px 16px at 78% 28%, #F4A460 0%, #B8860B 45%, transparent 70%), - radial-gradient(ellipse 6px 20px at 70% 22%, #DEB887 0%, #DAA520 40%, transparent 78%), - radial-gradient(ellipse 5px 17px at 80% 30%, #FFD700 0%, #B8860B 42%, transparent 76%), - - /* 左侧稻穗茎秆 */ - linear-gradient(95deg, transparent 15%, #9ACD32 17%, #8FBC8F 18%, #228B22 19%, #8FBC8F 20%, #9ACD32 21%, transparent 23%), - - /* 左侧稻穗穗头 */ - radial-gradient(ellipse 6px 20px at 25% 25%, #FFD700 0%, #DAA520 30%, transparent 80%), - radial-gradient(ellipse 5px 18px at 27% 28%, #FFCC00 0%, #B8860B 35%, transparent 75%), - radial-gradient(ellipse 7px 22px at 23% 22%, #F4A460 0%, #DAA520 40%, transparent 85%), - - /* 麦田远景效果 */ - linear-gradient(180deg, transparent 70%, rgba(255, 215, 0, 0.1) 75%, rgba(218, 165, 32, 0.15) 85%, rgba(255, 215, 0, 0.2) 95%, rgba(255, 215, 0, 0.25) 100%), - - /* 散落稻粒 */ - radial-gradient(ellipse 2px 8px at 60% 40%, #FFD700 0%, transparent 60%), - radial-gradient(ellipse 1.5px 6px at 40% 60%, #FFCC00 0%, transparent 65%), - radial-gradient(ellipse 2.5px 10px at 85% 50%, #DEB887 0%, transparent 70%), - radial-gradient(ellipse 1.8px 7px at 15% 80%, #DAA520 0%, transparent 68%); - - background-size: - /* 主茎秆 */ - 100vw 80vh, 100vw 82vh, - /* 主穗头 */ - 50vw 60vh, 48vw 58vh, 52vw 62vh, 46vw 56vh, 50vw 60vh, - /* 分支 */ - 40vw 50vh, 38vw 48vh, 42vw 52vh, 36vw 46vh, - /* 左侧茎秆 */ - 100vw 70vh, - /* 左侧穗头 */ - 35vw 45vh, 33vw 43vh, 37vw 47vh, - /* 麦田远景 */ - 100vw 100vh, - /* 散落稻粒 */ - 20vw 20vh, 25vw 25vh, 30vw 30vh, 22vw 22vh; - - background-position: - /* 主茎秆 */ - 70% 20%, 72% 18%, - /* 主穗头 */ - 60% 0%, 62% 2%, 58% -2%, 64% 4%, 60% 1%, - /* 分支 */ - 65% 15%, 67% 17%, 63% 13%, 69% 19%, - /* 左侧茎秆 */ - 20% 30%, - /* 左侧穗头 */ - 15% 20%, 17% 22%, 13% 18%, - /* 麦田远景 */ - 0% 0%, - /* 散落稻粒 */ - 30% 50%, 50% 70%, 80% 40%, 10% 80%; - - background-repeat: no-repeat; - opacity: 0.4; - pointer-events: none; - z-index: -1; - animation: wheatSway 25s ease-in-out infinite; -} - -@keyframes spiralRotate { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} - -/* 流星效果容器 */ -.meteor-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; - z-index: -1; - overflow: hidden; -} - -/* 流星轨迹 */ -.meteor { - position: absolute; - width: 2px; - height: 2px; - background: radial-gradient(circle, #FFD700 0%, #FFA500 50%, transparent 100%); - border-radius: 50%; - box-shadow: - 0 0 10px #FFD700, - 0 0 20px #FFA500, - 0 0 30px #FF8C00; - animation: meteorFall linear infinite; -} - -/* 流星尾迹 */ -.meteor::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100px; - height: 1px; - background: linear-gradient(90deg, - #FFD700 0%, - #FFA500 30%, - #FF8C00 60%, - transparent 100%); - transform-origin: 0 50%; - transform: rotate(-45deg); - opacity: 0.8; -} - -@keyframes meteorFall { - 0% { - transform: translateX(-100px) translateY(-100px); - opacity: 0; - } - 10% { - opacity: 1; - } - 90% { - opacity: 1; - } - 100% { - transform: translateX(calc(100vw + 100px)) translateY(calc(100vh + 100px)); - opacity: 0; - } -} - -/* 多个流星的不同轨迹 */ -.meteor:nth-child(1) { - top: 10%; - left: -100px; - animation-duration: 8s; - animation-delay: 0s; -} - -.meteor:nth-child(2) { - top: 20%; - left: -100px; - animation-duration: 12s; - animation-delay: 2s; -} - -.meteor:nth-child(3) { - top: 30%; - left: -100px; - animation-duration: 10s; - animation-delay: 4s; -} - -.meteor:nth-child(4) { - top: 50%; - left: -100px; - animation-duration: 15s; - animation-delay: 6s; -} - -.meteor:nth-child(5) { - top: 70%; - left: -100px; - animation-duration: 9s; - animation-delay: 8s; -} - -.meteor:nth-child(6) { - top: 80%; - left: -100px; - animation-duration: 11s; - animation-delay: 10s; -} - -/* 金色粒子效果 */ -.golden-particles { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; - z-index: -1; -} - -.particle { - position: absolute; - width: 3px; - height: 3px; - background: radial-gradient(circle, #FFD700 0%, #FFA500 70%, transparent 100%); - border-radius: 50%; - animation: particleFloat linear infinite; -} - -@keyframes particleFloat { - 0% { - transform: translateY(100vh) rotate(0deg); - opacity: 0; - } - 10% { - opacity: 1; - } - 90% { - opacity: 1; - } - 100% { - transform: translateY(-100px) rotate(360deg); - opacity: 0; - } -} - -/* 粒子的不同位置和动画时长 */ -.particle:nth-child(1) { left: 10%; animation-duration: 20s; animation-delay: 0s; } -.particle:nth-child(2) { left: 20%; animation-duration: 25s; animation-delay: 2s; } -.particle:nth-child(3) { left: 30%; animation-duration: 18s; animation-delay: 4s; } -.particle:nth-child(4) { left: 40%; animation-duration: 22s; animation-delay: 6s; } -.particle:nth-child(5) { left: 50%; animation-duration: 24s; animation-delay: 8s; } -.particle:nth-child(6) { left: 60%; animation-duration: 19s; animation-delay: 10s; } -.particle:nth-child(7) { left: 70%; animation-duration: 21s; animation-delay: 12s; } -.particle:nth-child(8) { left: 80%; animation-duration: 23s; animation-delay: 14s; } -.particle:nth-child(9) { left: 90%; animation-duration: 26s; animation-delay: 16s; } - -/* 响应式设计 */ -@media (max-width: 768px) { - .meteor { - width: 1px; - height: 1px; - } - - .meteor::before { - width: 50px; - } - - .particle { - width: 2px; - height: 2px; - } - - body::before { - background-size: - 30px 30px, 25px 25px, 35px 35px, 28px 28px, 32px 32px, - 40px 40px, 45px 45px; - } - - body::after { - background-size: 200px 200px, 150px 150px, 100px 100px; - } -} - -/* 麦穗飘舞特效 */ -.wheat-floating { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; - z-index: 2; - overflow: hidden; -} - -/* 移动设备性能优化 */ -@media (max-width: 768px) { - .wheat-floating { - display: none; - } - - .golden-particles { - display: none; - } - - .meteor-container { - display: none; - } - - .adaptive-overlay { - animation: none; - background: rgba(255, 255, 255, 0.1); - } -} - -.wheat-particle { - position: absolute; - width: 8px; - height: 20px; - background: linear-gradient(180deg, - #FFD700 0%, - #DAA520 50%, - #B8860B 100% - ); - border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%; - opacity: 0.7; - animation: wheatFloat 15s linear infinite; -} - -.wheat-particle::before { - content: ''; - position: absolute; - top: -3px; - left: 50%; - transform: translateX(-50%); - width: 2px; - height: 8px; - background: #8B7355; - border-radius: 1px; -} - -.wheat-particle::after { - content: ''; - position: absolute; - top: 2px; - left: 1px; - width: 2px; - height: 4px; - background: #FFEC8C; - border-radius: 50%; - box-shadow: - 3px 2px 0 #FFEC8C, - 1px 6px 0 #FFEC8C, - 4px 8px 0 #FFEC8C; -} - -@keyframes wheatFloat { - 0% { - transform: translateY(-100vh) translateX(0) rotate(0deg); - opacity: 0; - } - 10% { - opacity: 0.7; - } - 90% { - opacity: 0.7; - } - 100% { - transform: translateY(100vh) translateX(50px) rotate(360deg); - opacity: 0; - } -} - -/* 不同大小和速度的麦穗 */ -.wheat-particle:nth-child(1) { - left: 10%; - animation-duration: 12s; - animation-delay: 0s; - transform: scale(0.8); -} - -.wheat-particle:nth-child(2) { - left: 25%; - animation-duration: 18s; - animation-delay: 2s; - transform: scale(1.2); -} - -.wheat-particle:nth-child(3) { - left: 40%; - animation-duration: 15s; - animation-delay: 4s; - transform: scale(0.9); -} - -.wheat-particle:nth-child(4) { - left: 60%; - animation-duration: 20s; - animation-delay: 1s; - transform: scale(1.1); -} - -.wheat-particle:nth-child(5) { - left: 75%; - animation-duration: 14s; - animation-delay: 3s; - transform: scale(0.7); -} - -.wheat-particle:nth-child(6) { - left: 90%; - animation-duration: 16s; - animation-delay: 5s; - transform: scale(1.0); -} - -.wheat-particle:nth-child(7) { - left: 5%; - animation-duration: 22s; - animation-delay: 6s; - transform: scale(0.6); -} - -.wheat-particle:nth-child(8) { - left: 35%; - animation-duration: 13s; - animation-delay: 2.5s; - transform: scale(1.3); -} - -/* 减少动画偏好设置 */ -@media (prefers-reduced-motion: reduce) { - * { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - } - - .meteor, - .particle { - display: none; - } -} diff --git a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/style.css deleted file mode 100755 index e6daabe3..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/style.css +++ /dev/null @@ -1,1268 +0,0 @@ -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #1a1a1a; - overflow-x: hidden; -} - -/* 结果容器 - 优化可读性版本 */ -.result-container { - background: rgba(255, 255, 255, 0.85); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - border: 1px solid rgba(0, 0, 0, 0.1); - border-radius: 25px; - padding: 40px; - margin-top: 40px; - box-shadow: - 0 8px 32px 0 rgba(0, 0, 0, 0.1), - inset 0 1px 0 rgba(255, 255, 255, 0.8); -} - -/* 移除过度的文字颜色动画,保持稳定的可读性 */ - -/* 容器 */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - animation: containerFadeIn 1s ease-out; -} - -@keyframes containerFadeIn { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 玻璃拟态基础样式 - 动态调节版本 */ -.glass-morphism { - background: rgba(255, 255, 255, 0.15); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.15), - inset 0 1px 0 rgba(255, 255, 255, 0.3); - border-radius: 20px; - animation: glassColorShift 25s ease infinite; -} - -@keyframes glassColorShift { - 0% { - background: rgba(255, 255, 255, 0.15); - border-color: rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.15), - inset 0 1px 0 rgba(255, 255, 255, 0.3); - } - 25% { - background: rgba(255, 255, 255, 0.25); - border-color: rgba(255, 255, 255, 0.35); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.25), - inset 0 1px 0 rgba(255, 255, 255, 0.5); - } - 50% { - background: rgba(255, 255, 255, 0.18); - border-color: rgba(255, 255, 255, 0.25); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.18), - inset 0 1px 0 rgba(255, 255, 255, 0.35); - } - 75% { - background: rgba(255, 255, 255, 0.22); - border-color: rgba(255, 255, 255, 0.3); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.4); - } - 100% { - background: rgba(255, 255, 255, 0.15); - border-color: rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.15), - inset 0 1px 0 rgba(255, 255, 255, 0.3); - } -} - -/* 头部 - 优化可读性版本 */ -.header { - text-align: center; - margin-bottom: 40px; - background: rgba(255, 255, 255, 0.85); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - padding: 40px 30px; - border-radius: 25px; - border: 1px solid rgba(0, 0, 0, 0.1); - box-shadow: - 0 8px 32px 0 rgba(0, 0, 0, 0.1), - inset 0 1px 0 rgba(255, 255, 255, 0.8); - position: relative; - overflow: hidden; -} - -@keyframes headerColorShift { - 0% { - background: rgba(255, 255, 255, 0.1); - border-color: rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.4); - } - 25% { - background: rgba(255, 255, 255, 0.2); - border-color: rgba(255, 255, 255, 0.35); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.3), - inset 0 1px 0 rgba(255, 255, 255, 0.6); - } - 50% { - background: rgba(255, 255, 255, 0.15); - border-color: rgba(255, 255, 255, 0.25); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.22), - inset 0 1px 0 rgba(255, 255, 255, 0.45); - } - 75% { - background: rgba(255, 255, 255, 0.18); - border-color: rgba(255, 255, 255, 0.3); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.25), - inset 0 1px 0 rgba(255, 255, 255, 0.5); - } - 100% { - background: rgba(255, 255, 255, 0.1); - border-color: rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.4); - } -} - -.header::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, - transparent, - rgba(255, 255, 255, 0.1), - transparent - ); - animation: headerShimmer 6s ease-in-out infinite; -} - -@keyframes headerShimmer { - 0% { left: -100%; } - 50% { left: 100%; } - 100% { left: 100%; } -} - -.header-icon { - font-size: 4em; - margin-bottom: 15px; - animation: iconFloat 3s ease-in-out infinite; - text-shadow: 0 0 20px rgba(255, 255, 255, 0.5); -} - -@keyframes iconFloat { - 0%, 100% { - transform: translateY(0) scale(1); - filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.3)); - } - 50% { - transform: translateY(-10px) scale(1.05); - filter: drop-shadow(0 5px 15px rgba(255, 255, 255, 0.5)); - } -} - -.title { - font-size: 3.2em; - font-weight: 800; - color: #1a1a1a; - margin-bottom: 10px; - text-shadow: 1px 1px 3px rgba(255, 255, 255, 0.8); - letter-spacing: 2px; -} - -/* 移除标题颜色动画,保持稳定的可读性 */ - -.subtitle { - font-size: 1.3em; - color: #555555; - margin-bottom: 30px; - font-weight: 600; - text-shadow: 0 1px 2px rgba(255, 255, 255, 0.8); -} - -/* 移除副标题颜色动画,保持稳定的可读性 */ - -/* 日期选择器 */ -.date-selector { - display: flex; - align-items: flex-end; - justify-content: center; - gap: 20px; - margin-bottom: 25px; - flex-wrap: wrap; -} - -.input-group { - display: flex; - flex-direction: column; - gap: 8px; - min-width: 200px; -} - -.input-label { - display: flex; - align-items: center; - gap: 8px; - color: #2c2c2c; - font-weight: 600; - font-size: 1em; - text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.8); -} - -/* 移除标签颜色动画,保持稳定的可读性 */ - -.label-icon { - font-size: 1.2em; -} - -.date-input { - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 15px; - padding: 12px 16px; - color: #1a1a1a; - font-size: 1em; - font-weight: 500; - transition: all 0.3s ease; - box-shadow: - 0 4px 15px rgba(0, 0, 0, 0.1), - inset 0 1px 0 rgba(255, 255, 255, 0.8); -} - -/* 移除输入框颜色动画,保持稳定的可读性 */ - -.date-input:focus { - outline: none; - border-color: #228B22; - background: rgba(255, 255, 255, 0.95); - box-shadow: - 0 6px 20px rgba(34, 139, 34, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.8), - 0 0 0 3px rgba(34, 139, 34, 0.1); - transform: translateY(-2px); -} - -.date-input::-webkit-calendar-picker-indicator { - filter: invert(1); - opacity: 0.8; - cursor: pointer; -} - -.query-btn { - background: linear-gradient(135deg, #228B22 0%, #32CD32 100%); - backdrop-filter: blur(15px); - -webkit-backdrop-filter: blur(15px); - color: #ffffff; - border: 1px solid rgba(34, 139, 34, 0.3); - padding: 12px 28px; - border-radius: 20px; - cursor: pointer; - font-size: 1em; - font-weight: 600; - transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); - display: flex; - align-items: center; - gap: 8px; - position: relative; - overflow: hidden; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); - box-shadow: - 0 4px 15px rgba(34, 139, 34, 0.3), - inset 0 1px 0 rgba(255, 255, 255, 0.2); -} - -/* 移除按钮颜色动画,保持稳定的可读性 */ - -.query-btn::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, - transparent, - rgba(255, 255, 255, 0.2), - transparent - ); - transition: left 0.6s ease; -} - -.query-btn:hover::before { - left: 100%; -} - -.query-btn:hover { - background: linear-gradient(135deg, #1e7e1e, #2eb82e); - border-color: rgba(34, 139, 34, 0.5); - transform: translateY(-2px); - box-shadow: - 0 8px 25px rgba(34, 139, 34, 0.4), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.btn-icon { - font-size: 1.2em; - transition: transform 0.3s ease; -} - -.query-btn:hover .btn-icon { - transform: scale(1.1) rotate(5deg); -} - -.update-time { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - color: #1a252f; - font-size: 1em; - padding: 10px 20px; - background: rgba(255, 255, 255, 0.08); - backdrop-filter: blur(8px); - -webkit-backdrop-filter: blur(8px); - border-radius: 20px; - border: 1px solid rgba(255, 255, 255, 0.15); - display: inline-flex; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); - font-weight: 600; -} - -.time-icon { - font-size: 1.2em; - animation: clockTick 2s infinite; -} - -@keyframes clockTick { - 0%, 50% { transform: rotate(0deg); } - 25% { transform: rotate(15deg); } - 75% { transform: rotate(-15deg); } -} - -/* 玻璃拟态加载动画 */ -.loading { - text-align: center; - padding: 60px 40px; - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(25px); - -webkit-backdrop-filter: blur(25px); - border-radius: 25px; - margin-bottom: 25px; - border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.loading-content { - display: flex; - flex-direction: column; - align-items: center; - gap: 25px; -} - -.glass-spinner { - width: 60px; - height: 60px; - border: 4px solid rgba(255, 255, 255, 0.1); - border-top: 4px solid rgba(255, 255, 255, 0.8); - border-radius: 50%; - animation: glassSpinnerRotate 1.5s linear infinite; - position: relative; - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -.glass-spinner::before { - content: ''; - position: absolute; - top: -4px; - left: -4px; - right: -4px; - bottom: -4px; - border: 2px solid rgba(255, 255, 255, 0.05); - border-top: 2px solid rgba(255, 255, 255, 0.3); - border-radius: 50%; - animation: glassSpinnerRotate 2s linear infinite reverse; -} - -@keyframes glassSpinnerRotate { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading-text { - display: flex; - flex-direction: column; - align-items: center; - gap: 15px; -} - -.loading-emoji { - font-size: 2.5em; - animation: mysticalPulse 2s ease-in-out infinite alternate; - filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.5)); -} - -@keyframes mysticalPulse { - 0% { - transform: scale(1); - filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.5)); - } - 100% { - transform: scale(1.1); - filter: drop-shadow(0 0 20px rgba(255, 255, 255, 0.8)); - } -} - -.loading-text p { - font-size: 1.2em; - color: #1a1a1a; - font-weight: 600; - margin: 0; - text-shadow: 0 1px 3px rgba(255, 255, 255, 0.8); -} - -.loading-dots { - display: flex; - gap: 8px; -} - -.loading-dots span { - width: 10px; - height: 10px; - background: #4a4a4a; - border-radius: 50%; - animation: glassDotsFloat 1.4s ease-in-out infinite both; - backdrop-filter: blur(2px); - -webkit-backdrop-filter: blur(2px); - box-shadow: 0 2px 8px rgba(255, 255, 255, 0.3); -} - -.loading-dots span:nth-child(1) { animation-delay: -0.32s; } -.loading-dots span:nth-child(2) { animation-delay: -0.16s; } -.loading-dots span:nth-child(3) { animation-delay: 0s; } - -@keyframes glassDotsFloat { - 0%, 80%, 100% { - transform: scale(0.8); - opacity: 0.5; - } - 40% { - transform: scale(1.2); - opacity: 1; - } -} - -/* 农历信息展示 */ -.lunar-info { - display: grid; - gap: 25px; - animation: infoFadeIn 0.8s ease-out; -} - -@keyframes infoFadeIn { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.info-card { - background: rgba(255, 255, 255, 0.12); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 20px; - padding: 30px; - position: relative; - overflow: hidden; - transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.15), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.info-card::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 3px; - background: linear-gradient(90deg, - rgba(255, 255, 255, 0.3), - rgba(255, 255, 255, 0.6), - rgba(255, 255, 255, 0.3) - ); - transform: scaleX(0); - transition: transform 0.4s ease; -} - -.info-card:hover::before { - transform: scaleX(1); -} - -.info-card:hover { - transform: translateY(-5px); - background: rgba(255, 255, 255, 0.15); - border-color: rgba(255, 255, 255, 0.3); - box-shadow: - 0 12px 40px 0 rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.4); -} - -.card-header { - display: flex; - align-items: center; - gap: 15px; - margin-bottom: 20px; -} - -.card-icon { - font-size: 2.5em; - animation: cardIconFloat 3s ease-in-out infinite; -} - -@keyframes cardIconFloat { - 0%, 100% { transform: translateY(0) rotate(0deg); } - 50% { transform: translateY(-5px) rotate(5deg); } -} - -.card-title { - font-size: 1.5em; - font-weight: 700; - color: #0a0f14; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6); -} - -.card-content { - display: grid; - gap: 15px; -} - -.info-item { - display: flex; - align-items: center; - gap: 12px; - padding: 15px; - background: rgba(255, 255, 255, 0.08); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); - border-radius: 15px; - border: 1px solid rgba(255, 255, 255, 0.15); - transition: all 0.3s ease; -} - -.info-item:hover { - background: rgba(255, 255, 255, 0.12); - transform: scale(1.02); -} - -.item-icon { - font-size: 1.3em; - min-width: 30px; - text-align: center; -} - -.item-label { - font-weight: 600; - color: #1a252f; - min-width: 80px; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); -} - -.item-value { - font-weight: 700; - color: #0a0f14; - font-size: 1.1em; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); -} - -/* 错误信息 */ -.error-message { - text-align: center; - padding: 60px 40px; - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(25px); - -webkit-backdrop-filter: blur(25px); - border-radius: 25px; - border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.error-content { - display: flex; - flex-direction: column; - align-items: center; - gap: 25px; -} - -.error-icon { - font-size: 4em; - animation: errorFloat 2s ease-in-out infinite alternate; - filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.3)); -} - -@keyframes errorFloat { - 0% { transform: translateY(0) rotate(-5deg); } - 100% { transform: translateY(-10px) rotate(5deg); } -} - -.error-content h3 { - font-size: 1.6em; - color: #0a0f14; - margin: 0; - font-weight: 700; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6); -} - -.error-content p { - color: #1a252f; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); - font-size: 1.1em; - margin: 0; - line-height: 1.6; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} - -.retry-btn { - background: rgba(255, 255, 255, 0.15); - backdrop-filter: blur(15px); - -webkit-backdrop-filter: blur(15px); - color: #0a0f14; - border: 1px solid rgba(255, 255, 255, 0.3); - padding: 12px 25px; - border-radius: 20px; - cursor: pointer; - font-size: 1em; - font-weight: 600; - transition: all 0.4s ease; - display: inline-flex; - align-items: center; - gap: 8px; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6); - box-shadow: - 0 4px 15px rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.retry-btn:hover { - background: rgba(255, 255, 255, 0.2); - border-color: rgba(255, 255, 255, 0.4); - transform: translateY(-2px); - box-shadow: - 0 6px 20px rgba(31, 38, 135, 0.3), - inset 0 1px 0 rgba(255, 255, 255, 0.4); -} - -.retry-btn span { - font-size: 1.1em; - transition: transform 0.3s ease; -} - -.retry-btn:hover span { - transform: rotate(180deg); -} - -/* 功能提示 */ -.feature-tips { - margin-top: 40px; -} - -.tip-card { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 20px; - padding: 30px; - text-align: center; - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.15), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.tip-icon { - font-size: 3em; - margin-bottom: 15px; - animation: tipBlink 3s ease-in-out infinite; -} - -@keyframes tipBlink { - 0%, 100% { opacity: 1; transform: scale(1); } - 50% { opacity: 0.7; transform: scale(1.05); } -} - -.tip-card h3 { - font-size: 1.4em; - font-weight: 700; - color: #0a0f14; - margin-bottom: 20px; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6); -} - -.tip-card ul { - list-style: none; - display: grid; - gap: 12px; - text-align: left; -} - -.tip-card li { - color: #1a252f; - font-size: 1em; - padding: 10px 15px; - background: rgba(255, 255, 255, 0.08); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); - border-radius: 10px; - border: 1px solid rgba(255, 255, 255, 0.15); - transition: all 0.3s ease; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); -} - -.tip-card li:hover { - background: rgba(255, 255, 255, 0.12); - transform: translateX(5px); -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 25px; - } - - .header { - padding: 35px 25px; - } - - .header-icon { - font-size: 3.5em; - } - - .title { - font-size: 2.8em; - letter-spacing: 1.5px; - } - - .subtitle { - font-size: 1.2em; - } - - .date-selector { - gap: 15px; - } - - .input-group { - min-width: 180px; - } - - .lunar-info { - grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); - gap: 20px; - } - - .info-card { - padding: 25px; - } -} - -/* 电脑端适配 (1025px+) */ -@media (min-width: 1025px) { - .container { - padding: 40px; - } - - .header { - padding: 50px 40px; - margin-bottom: 50px; - } - - .header-icon { - font-size: 4.5em; - } - - .title { - font-size: 3.8em; - letter-spacing: 3px; - } - - .subtitle { - font-size: 1.4em; - } - - .date-selector { - gap: 25px; - } - - .input-group { - min-width: 220px; - } - - .date-input { - padding: 14px 18px; - font-size: 1.05em; - } - - .query-btn { - padding: 14px 32px; - font-size: 1.05em; - } - - .lunar-info { - grid-template-columns: repeat(auto-fit, minmax(500px, 1fr)); - gap: 30px; - } - - .info-card { - padding: 35px; - } - - .card-title { - font-size: 1.6em; - } - - .item-label { - min-width: 100px; - } - - .item-value { - font-size: 1.15em; - } - - /* 电脑端特殊效果 */ - .info-card:hover { - transform: translateY(-8px) scale(1.02); - } -} - -/* 手机端适配 (767px以下) - 优化手机端体验 */ -@media (max-width: 767px) { - .container { - padding: 15px; - margin: 10px auto; - max-width: 95%; - } - - .header { - padding: 25px 15px; - margin-bottom: 25px; - border-radius: 20px; - } - - .header-icon { - font-size: 2.8em; - } - - .title { - font-size: 2.2em; - letter-spacing: 1px; - margin-bottom: 8px; - } - - .subtitle { - font-size: 1em; - margin-bottom: 20px; - } - - .date-selector { - flex-direction: column; - gap: 15px; - align-items: center; - padding: 0 5px; - } - - .input-group { - width: 100%; - max-width: 300px; - min-width: auto; - } - - .date-input { - padding: 14px 16px; - font-size: 16px; /* 防止iOS缩放 */ - border-radius: 12px; - } - - .query-btn { - padding: 14px 24px; - font-size: 16px; - width: 100%; - max-width: 200px; - justify-content: center; - border-radius: 15px; - margin-top: 10px; - } - - .update-time { - font-size: 0.9em; - padding: 8px 16px; - } - - .info-card { - padding: 20px; - border-radius: 15px; - } - - .card-header { - gap: 12px; - margin-bottom: 15px; - } - - .card-icon { - font-size: 2em; - } - - .card-title { - font-size: 1.3em; - } - - .info-item { - padding: 12px; - flex-direction: column; - align-items: flex-start; - gap: 8px; - } - - .item-icon { - font-size: 1.2em; - } - - .item-label { - min-width: auto; - font-size: 0.95em; - margin-bottom: 8px; - } - - .item-value { - font-size: 1em; - } - - .tip-card { - padding: 20px; - } - - .tip-card ul { - gap: 10px; - } - - .tip-card li { - padding: 8px 12px; - font-size: 0.9em; - } - - /* 手机端性能优化 - 减少动画 */ - .title { - animation: none; - } - - .subtitle { - animation: none; - } - - .input-label { - animation: none; - } - - .date-input { - animation: none; - } - - .query-btn { - animation: none; - } - - .card-icon { - animation: none; - } - - .tip-icon { - animation: none; - } -} - -/* 超小屏幕适配 (480px以下) */ -@media (max-width: 480px) { - .container { - padding: 12px; - } - - .header { - padding: 20px 15px; - margin-bottom: 20px; - } - - .header-icon { - font-size: 2.5em; - } - - .title { - font-size: 1.9em; - letter-spacing: 0.5px; - } - - .subtitle { - font-size: 0.95em; - } - - .date-selector { - gap: 12px; - } - - .input-group { - max-width: 280px; - } - - .date-input { - padding: 8px 12px; - font-size: 0.9em; - } - - .query-btn { - padding: 8px 20px; - font-size: 0.9em; - max-width: 180px; - } - - .update-time { - font-size: 0.85em; - padding: 6px 12px; - flex-direction: column; - gap: 4px; - } - - .lunar-info { - gap: 15px; - } - - .info-card { - padding: 18px 15px; - border-radius: 12px; - } - - .card-header { - gap: 10px; - margin-bottom: 12px; - } - - .card-icon { - font-size: 1.8em; - } - - .card-title { - font-size: 1.2em; - } - - .info-item { - padding: 10px; - gap: 6px; - } - - .item-icon { - font-size: 1.1em; - } - - .item-label { - font-size: 0.85em; - } - - .item-value { - font-size: 0.95em; - } - - .tip-card { - padding: 15px; - } - - .tip-icon { - font-size: 2.5em; - } - - .tip-card h3 { - font-size: 1.2em; - } - - .tip-card li { - padding: 6px 10px; - font-size: 0.85em; - } - - /* 超小屏幕性能优化 */ - .info-card { - transition: transform 0.2s ease, background 0.2s ease; - } - - .info-card::before { - display: none; - } - - /* 禁用复杂动画以提升性能 */ - .title { - animation: none; - } - - .subtitle { - animation: none; - } - - .input-label { - animation: none; - } - - .date-input { - animation: none; - } - - .query-btn { - animation: none; - } - - .card-icon { - animation: none; - } - - .tip-icon { - animation: none; - } - - .loading-content { - gap: 15px; - } - - .loading-emoji { - font-size: 2em; - } - - .error-icon { - font-size: 3em; - } -} - -/* 时辰宜忌特殊样式 */ -.hours-card { - grid-column: 1 / -1; /* 占满整行 */ -} - -.hours-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 15px; - margin-top: 15px; -} - -.hour-item { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 12px; - padding: 12px; - transition: all 0.3s ease; -} - -.hour-item:hover { - background: rgba(255, 255, 255, 0.15); - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); -} - -.hour-name { - font-size: 14px; - font-weight: 600; - color: #2c3e50; - text-align: center; - margin-bottom: 8px; - padding: 4px 8px; - background: rgba(255, 255, 255, 0.8); - border-radius: 6px; - text-shadow: 0 1px 2px rgba(255, 255, 255, 0.5); - border: 1px solid rgba(255, 255, 255, 0.9); -} - -.hour-content { - font-size: 12px; - line-height: 1.4; -} - -.hour-recommends, -.hour-avoids { - margin: 4px 0; -} - -.hour-label { - font-weight: 600; - color: #1a1a1a; - margin-right: 4px; -} - -.hour-recommends .hour-label { - color: #4ade80; -} - -.hour-avoids .hour-label { - color: #f87171; -} - -.hour-text { - color: #2c2c2c; -} - -/* 时辰宜忌响应式优化 */ -@media (max-width: 768px) { - .hours-grid { - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: 10px; - } - - .hour-item { - padding: 8px; - } - - .hour-name { - font-size: 12px; - margin-bottom: 6px; - } - - .hour-content { - font-size: 11px; - } -} diff --git a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/index.html b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/index.html deleted file mode 100755 index 0d00e02d..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/index.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - 🌙农历信息查询 - - - - - -
- - -
-
-
-
-
-
-
-
- - -
-
-
-
-
-
-
-
-
-
-
- - -
-
-
-
-
-
-
-
-
-
- -
-
-

🌙农历信息查询

-

传统文化 · 时光转换 · 节气查询

- -
-
- - -
- -
- -
- - 等待查询... -
-
- - - - - - - - - - - diff --git a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/js/script.js deleted file mode 100755 index f2ec21cd..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/js/script.js +++ /dev/null @@ -1,475 +0,0 @@ -// API接口列表 -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top", -]; - -// 当前使用的API索引 -let currentApiIndex = 0; - -// DOM元素 -const loadingElement = document.getElementById('loading'); -const lunarInfoElement = document.getElementById('lunarInfo'); -const errorMessageElement = document.getElementById('errorMessage'); -const updateTimeElement = document.getElementById('updateTime'); -const dateInput = document.getElementById('dateInput'); -const queryBtn = document.getElementById('queryBtn'); - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', function() { - initializePage(); -}); - -// 初始化页面 -function initializePage() { - // 设置默认日期为今天 - const today = new Date(); - const dateString = today.toISOString().split('T')[0]; - dateInput.value = dateString; - - // 绑定事件 - queryBtn.addEventListener('click', queryLunarInfo); - dateInput.addEventListener('change', queryLunarInfo); - - // 自动查询当天信息 - queryLunarInfo(); -} - -// 查询农历信息 -async function queryLunarInfo() { - const selectedDate = dateInput.value; - if (!selectedDate) { - showError('请选择查询日期'); - return; - } - - showLoading(); - hideError(); - hideLunarInfo(); - - try { - const data = await fetchLunarData(selectedDate); - displayLunarInfo(data.data); - updateQueryTime(); - } catch (error) { - console.error('查询失败:', error); - showError('查询农历信息失败,请稍后重试'); - } - - hideLoading(); -} - -// 获取农历数据 -async function fetchLunarData(date) { - for (let i = 0; i < API_ENDPOINTS.length; i++) { - const apiUrl = API_ENDPOINTS[currentApiIndex]; - - try { - const response = await fetch(`${apiUrl}/v2/lunar?date=${date}`, { - method: 'GET', - headers: { - 'Accept': 'application/json', - }, - timeout: 10000 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - return data; - } else { - throw new Error('数据格式错误'); - } - } catch (error) { - console.error(`API ${apiUrl} 请求失败:`, error); - currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; - - if (i === API_ENDPOINTS.length - 1) { - throw new Error('所有API接口都无法访问'); - } - } - } -} - -// 显示农历信息 -function displayLunarInfo(lunarData) { - lunarInfoElement.innerHTML = ` -
-
-
📅
-
公历信息
-
-
-
-
🗓️
-
公历日期
-
${lunarData.solar.year}年${String(lunarData.solar.month).padStart(2, '0')}月${String(lunarData.solar.day).padStart(2, '0')}日
-
-
-
🌍
-
星期
-
${lunarData.solar.week_desc}
-
-
-
🍂
-
季节
-
${lunarData.solar.season_name_desc}
-
-
-
-
星座
-
${lunarData.constellation.name}
-
-
-
- -
-
-
🌙
-
农历信息
-
-
-
-
🏮
-
农历日期
-
${lunarData.lunar.desc_short}
-
-
-
🐲
-
生肖年
-
${lunarData.zodiac.year}年
-
-
-
☯️
-
天干地支
-
${lunarData.sixty_cycle.year.name}
-
-
-
🌙
-
月相
-
${lunarData.phase.name}
-
-
-
- -
-
-
🌾
-
节气节日
-
-
-
-
🌱
-
当前节气
-
${lunarData.term.stage ? lunarData.term.stage.name : '无节气'}
-
-
-
🎉
-
法定假日
-
${lunarData.legal_holiday ? lunarData.legal_holiday.name : '无假日'}
-
-
-
🎊
-
传统节日
-
${lunarData.festival.both_desc || '无特殊节日'}
-
-
-
📊
-
一年第几天
-
第${lunarData.stats.day_of_year}天
-
-
-
- -
-
-
-
时辰干支
-
-
-
-
🕐
-
当前时辰
-
${lunarData.lunar.hour_desc}
-
-
-
☯️
-
时辰干支
-
${lunarData.sixty_cycle.hour.name}
-
-
-
🐾
-
时辰生肖
-
${lunarData.zodiac.hour}
-
-
-
🎵
-
纳音
-
${lunarData.nayin.hour}
-
-
-
- -
-
-
📖
-
黄历宜忌
-
-
-
-
-
-
${formatTabooText(lunarData.taboo.day.recommends)}
-
-
-
-
-
${formatTabooText(lunarData.taboo.day.avoids)}
-
-
-
🕐
-
时辰宜
-
${formatTabooText(lunarData.taboo.hour.recommends)}
-
-
-
🚫
-
时辰忌
-
${formatTabooText(lunarData.taboo.hour.avoids)}
-
-
-
- -
-
-
🌟
-
运势财运
-
-
-
-
🍀
-
今日运势
-
${lunarData.fortune.today_luck}
-
-
-
💼
-
事业运
-
${lunarData.fortune.career}
-
-
-
💰
-
财运
-
${lunarData.fortune.money}
-
-
-
💖
-
感情运
-
${lunarData.fortune.love}
-
-
-
- -
-
-
📈
-
年度统计
-
-
-
-
📊
-
年度进度
-
${lunarData.stats.percents_formatted.year}
-
-
-
📅
-
本月进度
-
${lunarData.stats.percents_formatted.month}
-
- -
- -
-
- - - ${generateHourlyTaboo(lunarData.taboo.hours)} - `; - - showLunarInfo(); -} - -// 格式化宜忌文本 -function formatTabooText(text) { - if (!text) return '无'; - return text.replace(/\./g, '、'); -} - -// 生成十二时辰宜忌 -function generateHourlyTaboo(hours) { - if (!hours || hours.length === 0) return ''; - - const hourCards = hours.map(hour => ` -
-
${hour.hour}
-
-
- 宜: - ${formatTabooText(hour.recommends) || '无'} -
-
- 忌: - ${formatTabooText(hour.avoids) || '无'} -
-
-
- `).join(''); - - return ` -
-
-
-
十二时辰宜忌
-
-
-
- ${hourCards} -
-
-
- `; -} - -// 更新查询时间 -function updateQueryTime() { - const now = new Date(); - const timeStr = now.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit' - }); - updateTimeElement.textContent = `查询时间: ${timeStr}`; - - // 添加成功提示 - showSuccessMessage('🌙 农历信息已更新'); -} - -// 显示成功消息 -function showSuccessMessage(message) { - // 移除之前的提示 - const existingToast = document.querySelector('.success-toast'); - if (existingToast) { - existingToast.remove(); - } - - const toast = document.createElement('div'); - toast.className = 'success-toast'; - toast.textContent = message; - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: rgba(255, 255, 255, 0.2); - backdrop-filter: blur(15px); - -webkit-backdrop-filter: blur(15px); - color: #1a1a1a; - padding: 12px 20px; - border-radius: 25px; - border: 1px solid rgba(255, 255, 255, 0.3); - box-shadow: 0 8px 32px rgba(31, 38, 135, 0.2); - z-index: 1000; - font-weight: 600; - font-size: 0.9em; - animation: glassToastSlide 0.5s ease-out; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); - `; - - document.body.appendChild(toast); - - // 3秒后自动移除 - setTimeout(() => { - toast.style.animation = 'glassToastSlideOut 0.5s ease-in forwards'; - setTimeout(() => toast.remove(), 500); - }, 3000); -} - -// 显示加载状态 -function showLoading() { - loadingElement.style.display = 'block'; -} - -// 隐藏加载状态 -function hideLoading() { - loadingElement.style.display = 'none'; -} - -// 显示农历信息 -function showLunarInfo() { - lunarInfoElement.style.display = 'block'; -} - -// 隐藏农历信息 -function hideLunarInfo() { - lunarInfoElement.style.display = 'none'; -} - -// 显示错误信息 -function showError(message = '查询失败,请稍后重试') { - errorMessageElement.style.display = 'block'; - const errorContent = errorMessageElement.querySelector('.error-content p'); - if (errorContent) { - errorContent.textContent = message; - } -} - -// 隐藏错误信息 -function hideError() { - errorMessageElement.style.display = 'none'; -} - -// 添加CSS动画到页面 -if (!document.querySelector('#toast-styles')) { - const style = document.createElement('style'); - style.id = 'toast-styles'; - style.textContent = ` - @keyframes glassToastSlide { - from { - opacity: 0; - transform: translateX(100px) scale(0.8); - } - to { - opacity: 1; - transform: translateX(0) scale(1); - } - } - - @keyframes glassToastSlideOut { - from { - opacity: 1; - transform: translateX(0) scale(1); - } - to { - opacity: 0; - transform: translateX(100px) scale(0.8); - } - } - `; - document.head.appendChild(style); -} - -// 键盘快捷键支持 -document.addEventListener('keydown', function(e) { - if (e.key === 'Enter') { - e.preventDefault(); - queryLunarInfo(); - } - - if (e.key === 'r' && (e.ctrlKey || e.metaKey)) { - e.preventDefault(); - queryLunarInfo(); - } -}); diff --git a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/返回接口.json deleted file mode 100755 index 2d37ac73..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/返回接口.json +++ /dev/null @@ -1,647 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "solar": { - "year": 2025, - "month": 9, - "day": 1, - "hour": 17, - "minute": 58, - "second": 47, - "full": "2025-09-01", - "full_with_time": "2025-09-01 17:58:47", - "week": 1, - "week_desc": "星期一", - "week_desc_short": "一", - "season": 3, - "season_desc": "三季度", - "season_desc_short": "三", - "season_name": "秋", - "season_name_desc": "秋天", - "is_leap_year": false - }, - "lunar": { - "year": "乙巳", - "month": "七", - "day": "初十", - "hour": "酉", - "full_with_hour": "农历乙巳年七月初十酉时", - "desc_short": "农历乙巳年七月初十", - "year_desc": "农历乙巳年", - "month_desc": "七月", - "day_desc": "初十", - "hour_desc": "酉时", - "is_leap_month": false - }, - "stats": { - "day_of_year": 244, - "week_of_year": 36, - "week_of_month": 1, - "percents": { - "year": 0.665753424657534, - "month": 0.0333333333333333, - "week": 0.142857142857143, - "day": 0.749161909722222 - }, - "percents_formatted": { - "year": "66.58%", - "month": "3.33%", - "week": "14.29%", - "day": "74.92%" - } - }, - "term": { - "today": null, - "stage": { - "name": "处暑", - "position": 10, - "is_jie": false, - "is_qi": true - } - }, - "zodiac": { - "year": "蛇", - "month": "鸡", - "day": "鸡", - "hour": "鸡" - }, - "sixty_cycle": { - "year": { - "heaven_stem": "乙", - "earth_branch": "巳", - "name": "乙巳年", - "name_short": "乙巳" - }, - "month": { - "heaven_stem": "乙", - "earth_branch": "酉", - "name": "乙酉月", - "name_short": "乙酉" - }, - "day": { - "heaven_stem": "癸", - "earth_branch": "酉", - "name": "癸酉日", - "name_short": "癸酉" - }, - "hour": { - "heaven_stem": "辛", - "earth_branch": "酉", - "name": "辛酉时", - "name_short": "辛酉" - } - }, - "legal_holiday": null, - "festival": { - "solar": null, - "lunar": null, - "both_desc": null - }, - "phase": { - "name": "宵月", - "position": 10 - }, - "constellation": { - "name": "处女座", - "name_short": "处女" - }, - "taboo": { - "day": { - "recommends": "解除.祭祀.祈福.求嗣.修造.动土.竖柱.上梁.安床.纳畜.盖屋.合脊.起基.入殓.破土.安葬", - "avoids": "出火.嫁娶.开光.进人口.出行.词讼.开市.入宅.移徙.赴任" - }, - "hour": { - "hour": "酉时", - "hour_short": "酉", - "avoids": "乘船.造桥", - "recommends": "嫁娶.出行.移徙.入宅.开市.赴任.祈福.安床.开仓.盖屋.修造.求财" - }, - "hours": [ - { - "hour": "酉时", - "hour_short": "酉", - "recommends": "嫁娶.出行.移徙.入宅.开市.赴任.祈福.安床.开仓.盖屋.修造.求财", - "avoids": "乘船.造桥" - }, - { - "hour": "戌时", - "hour_short": "戌", - "recommends": "嫁娶.移徙.安葬.进人口.求财", - "avoids": "出行.赴任.祈福.祭祀.开光.斋醮" - }, - { - "hour": "亥时", - "hour_short": "亥", - "recommends": "嫁娶.移徙.交易.入宅.开市.安葬.求嗣.求财", - "avoids": "出行.赴任.动土.祈福.祭祀.修造.开光.斋醮" - }, - { - "hour": "子时", - "hour_short": "子", - "recommends": "嫁娶.交易.入宅.开市.祈福.安葬.求嗣.求财", - "avoids": "出行.移徙.赴任.词讼.修造" - }, - { - "hour": "丑时", - "hour_short": "丑", - "recommends": "嫁娶.祈福.安葬.祭祀.酬神.求财", - "avoids": "出行.赴任.动土.修造" - }, - { - "hour": "寅时", - "hour_short": "寅", - "recommends": "嫁娶.出行.交易.开市.赴任.祈福.安床.祭祀.求嗣.求财", - "avoids": "盖屋.入殓.上梁" - }, - { - "hour": "卯时", - "hour_short": "卯", - "recommends": "嫁娶.交易.入宅.开市.祈福.安床.安葬.求嗣.求财", - "avoids": "出行.赴任.修造" - }, - { - "hour": "辰时", - "hour_short": "辰", - "recommends": "", - "avoids": "诸事不宜" - }, - { - "hour": "巳时", - "hour_short": "巳", - "recommends": "嫁娶.出行.移徙.入宅.开市.祈福.安床.盖屋.祭祀.作灶", - "avoids": "安葬.修造.开光" - }, - { - "hour": "午时", - "hour_short": "午", - "recommends": "嫁娶.出行.交易.开市.祈福.安床.求嗣.求财", - "avoids": "赴任.动土.词讼.修造" - }, - { - "hour": "未时", - "hour_short": "未", - "recommends": "嫁娶.入宅.祈福.安葬.祭祀.修造.酬神.求财", - "avoids": "出行.赴任" - }, - { - "hour": "申时", - "hour_short": "申", - "recommends": "嫁娶.出行.开市.赴任.安葬.求财", - "avoids": "祈福.祭祀.酬神.斋醮" - } - ] - }, - "julian_day": 2460919.5, - "nayin": { - "year": "覆灯火", - "month": "泉中水", - "day": "剑锋金", - "hour": "石榴木" - }, - "baizi": { - "year_baizi": "性格温和,为人正直诚信。", - "day_baizi": "性格温和,为人正直诚信。" - }, - "fortune": { - "today_luck": "今日学习运好,适合进修", - "career": "领导能力突出,升职有望", - "money": "偏财运不错,可小试投资", - "love": "感情需要沟通,避免误会" - }, - "constants": { - "legal_holiday_list": [ - { - "name": "元旦节", - "date": "2025-01-01", - "start": "2025-01-01", - "end": "2025-01-01" - }, - { - "name": "春节", - "date": "2025-01-29", - "start": "2025-01-26", - "end": "2025-02-08" - }, - { - "name": "清明节", - "date": "2025-04-04", - "start": "2025-04-04", - "end": "2025-04-06" - }, - { - "name": "劳动节", - "date": "2025-05-01", - "start": "2025-04-27", - "end": "2025-05-05" - }, - { - "name": "端午节", - "date": "2025-05-31", - "start": "2025-05-31", - "end": "2025-06-02" - }, - { - "name": "国庆中秋", - "date": "2025-10-01", - "start": "2025-09-28", - "end": "2025-10-11" - } - ], - "phase_list": [ - { - "name": "朔月", - "lunar_day": 1 - }, - { - "name": "既朔月", - "lunar_day": 2 - }, - { - "name": "蛾眉新月", - "lunar_day": 3 - }, - { - "name": "蛾眉新月", - "lunar_day": 4 - }, - { - "name": "蛾眉月", - "lunar_day": 5 - }, - { - "name": "夕月", - "lunar_day": 6 - }, - { - "name": "上弦月", - "lunar_day": 7 - }, - { - "name": "上弦月", - "lunar_day": 8 - }, - { - "name": "九夜月", - "lunar_day": 9 - }, - { - "name": "宵月", - "lunar_day": 10 - }, - { - "name": "宵月", - "lunar_day": 11 - }, - { - "name": "宵月", - "lunar_day": 12 - }, - { - "name": "渐盈凸月", - "lunar_day": 13 - }, - { - "name": "小望月", - "lunar_day": 14 - }, - { - "name": "望月", - "lunar_day": 15 - }, - { - "name": "既望月", - "lunar_day": 16 - }, - { - "name": "立待月", - "lunar_day": 17 - }, - { - "name": "居待月", - "lunar_day": 18 - }, - { - "name": "寝待月", - "lunar_day": 19 - }, - { - "name": "更待月", - "lunar_day": 20 - }, - { - "name": "渐亏凸月", - "lunar_day": 21 - }, - { - "name": "下弦月", - "lunar_day": 22 - }, - { - "name": "下弦月", - "lunar_day": 23 - }, - { - "name": "有明月", - "lunar_day": 24 - }, - { - "name": "有明月", - "lunar_day": 25 - }, - { - "name": "蛾眉残月", - "lunar_day": 26 - }, - { - "name": "蛾眉残月", - "lunar_day": 27 - }, - { - "name": "残月", - "lunar_day": 28 - }, - { - "name": "晓月", - "lunar_day": 29 - }, - { - "name": "晦月", - "lunar_day": 30 - } - ], - "zodiac_list": [ - "鼠", - "牛", - "虎", - "兔", - "龙", - "蛇", - "马", - "羊", - "猴", - "鸡", - "狗", - "猪" - ], - "constellation_list": [ - { - "name": "白羊", - "desc": "白羊座", - "start": "3月21日", - "end": "4月19日", - "range": "3月21日~4月19日", - "start_month": 3, - "start_day": 21, - "end_month": 4, - "end_day": 19 - }, - { - "name": "金牛", - "desc": "金牛座", - "start": "4月20日", - "end": "5月20日", - "range": "4月20日~5月20日", - "start_month": 4, - "start_day": 20, - "end_month": 5, - "end_day": 20 - }, - { - "name": "双子", - "desc": "双子座", - "start": "5月21日", - "end": "6月21日", - "range": "5月21日~6月21日", - "start_month": 5, - "start_day": 21, - "end_month": 6, - "end_day": 21 - }, - { - "name": "巨蟹", - "desc": "巨蟹座", - "start": "6月22日", - "end": "7月22日", - "range": "6月22日~7月22日", - "start_month": 6, - "start_day": 22, - "end_month": 7, - "end_day": 22 - }, - { - "name": "狮子", - "desc": "狮子座", - "start": "7月23日", - "end": "8月22日", - "range": "7月23日~8月22日", - "start_month": 7, - "start_day": 23, - "end_month": 8, - "end_day": 22 - }, - { - "name": "处女", - "desc": "处女座", - "start": "8月23日", - "end": "9月22日", - "range": "8月23日~9月22日", - "start_month": 8, - "start_day": 23, - "end_month": 9, - "end_day": 22 - }, - { - "name": "天秤", - "desc": "天秤座", - "start": "9月23日", - "end": "10月23日", - "range": "9月23日~10月23日", - "start_month": 9, - "start_day": 23, - "end_month": 10, - "end_day": 23 - }, - { - "name": "天蝎", - "desc": "天蝎座", - "start": "10月24日", - "end": "11月22日", - "range": "10月24日~11月22日", - "start_month": 10, - "start_day": 24, - "end_month": 11, - "end_day": 22 - }, - { - "name": "射手", - "desc": "射手座", - "start": "11月23日", - "end": "12月21日", - "range": "11月23日~12月21日", - "start_month": 11, - "start_day": 23, - "end_month": 12, - "end_day": 21 - }, - { - "name": "摩羯", - "desc": "摩羯座", - "start": "12月22日", - "end": "1月19日", - "range": "12月22日~1月19日", - "start_month": 12, - "start_day": 22, - "end_month": 1, - "end_day": 19 - }, - { - "name": "水瓶", - "desc": "水瓶座", - "start": "1月20日", - "end": "2月18日", - "range": "1月20日~2月18日", - "start_month": 1, - "start_day": 20, - "end_month": 2, - "end_day": 18 - }, - { - "name": "双鱼", - "desc": "双鱼座", - "start": "2月19日", - "end": "3月20日", - "range": "2月19日~3月20日", - "start_month": 2, - "start_day": 19, - "end_month": 3, - "end_day": 20 - } - ], - "heaven_stems": [ - "甲", - "乙", - "丙", - "丁", - "戊", - "己", - "庚", - "辛", - "壬", - "癸" - ], - "earth_branches": [ - "子", - "丑", - "寅", - "卯", - "辰", - "巳", - "午", - "未", - "申", - "酉", - "戌", - "亥" - ], - "solar_terms": [ - { - "name": "立春", - "desc": "春季开始" - }, - { - "name": "雨水", - "desc": "降雨增多" - }, - { - "name": "惊蛰", - "desc": "春雷乍响" - }, - { - "name": "春分", - "desc": "昼夜等长" - }, - { - "name": "清明", - "desc": "天清地明" - }, - { - "name": "谷雨", - "desc": "雨生百谷" - }, - { - "name": "立夏", - "desc": "夏季开始" - }, - { - "name": "小满", - "desc": "麦粒渐满" - }, - { - "name": "芒种", - "desc": "麦类收割" - }, - { - "name": "夏至", - "desc": "白昼最长" - }, - { - "name": "小暑", - "desc": "天气渐热" - }, - { - "name": "大暑", - "desc": "一年最热" - }, - { - "name": "立秋", - "desc": "秋季开始" - }, - { - "name": "处暑", - "desc": "暑热结束" - }, - { - "name": "白露", - "desc": "露水增多" - }, - { - "name": "秋分", - "desc": "昼夜等长" - }, - { - "name": "寒露", - "desc": "露水渐凉" - }, - { - "name": "霜降", - "desc": "开始降霜" - }, - { - "name": "立冬", - "desc": "冬季开始" - }, - { - "name": "小雪", - "desc": "开始降雪" - }, - { - "name": "大雪", - "desc": "降雪增多" - }, - { - "name": "冬至", - "desc": "白昼最短" - }, - { - "name": "小寒", - "desc": "天气渐冷" - }, - { - "name": "大寒", - "desc": "一年最冷" - } - ] - } - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/化学元素查询.html b/InfoGenie-frontend/public/60sapi/实用功能/化学元素查询.html new file mode 100644 index 00000000..b45701b7 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/化学元素查询.html @@ -0,0 +1,64 @@ + + + + +化学元素查询 + + + + + +
+ +

⚗️ 化学元素查询

+
+
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/哈希工具.html b/InfoGenie-frontend/public/60sapi/实用功能/哈希工具.html new file mode 100644 index 00000000..f73c07ea --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/哈希工具.html @@ -0,0 +1,64 @@ + + + + +哈希工具 + + + + + +
+ +

🗜️ 哈希工具

+
+
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/css/style.css deleted file mode 100755 index 5fc74cac..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/css/style.css +++ /dev/null @@ -1,577 +0,0 @@ -/* Reset and Base Styles */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - background: linear-gradient(135deg, #f0f8e8 0%, #e8f5e8 50%, #d4f4dd 100%); - min-height: 100vh; - color: #333; - overflow-x: hidden; - /* 隐藏滚动条但保留滚动功能 */ - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* IE and Edge */ -} - -/* 隐藏 Webkit 浏览器的滚动条 */ -body::-webkit-scrollbar, -html::-webkit-scrollbar, -*::-webkit-scrollbar { - display: none; -} - -/* 全局隐藏滚动条但保留滚动功能 */ -html { - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* IE and Edge */ -} - -.container { - max-width: 1400px; - margin: 0 auto; - padding: 20px; - position: relative; -} - -/* Header Styles */ -.header { - text-align: center; - margin-bottom: 40px; - position: relative; - z-index: 2; -} - -.header-content { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(20px); - border-radius: 24px; - padding: 40px; - border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); - position: relative; - overflow: hidden; -} - -.header-content::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: linear-gradient(45deg, rgba(255, 255, 255, 0.1) 0%, transparent 50%, rgba(255, 255, 255, 0.1) 100%); - animation: shimmer 3s ease-in-out infinite; -} - -@keyframes shimmer { - 0%, 100% { transform: translateX(-100%); } - 50% { transform: translateX(100%); } -} - -.logo { - display: flex; - align-items: center; - justify-content: center; - gap: 15px; - margin-bottom: 15px; -} - -.logo i { - font-size: 48px; - background: linear-gradient(45deg, #228B22, #32CD32); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - animation: pulse 2s ease-in-out infinite; -} - -@keyframes pulse { - 0%, 100% { transform: scale(1); } - 50% { transform: scale(1.1); } -} - -.logo h1 { - font-size: 42px; - font-weight: 700; - color: white; - text-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); -} - -.subtitle { - font-size: 18px; - color: rgba(255, 255, 255, 0.9); - font-weight: 400; - letter-spacing: 0.5px; -} - -/* Floating Shapes */ -.header-decoration { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - pointer-events: none; - z-index: 1; -} - -.floating-shapes { - position: relative; - width: 100%; - height: 100%; -} - -.shape { - position: absolute; - border-radius: 50%; - background: linear-gradient(45deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05)); - animation: float 6s ease-in-out infinite; -} - -.shape-1 { - width: 80px; - height: 80px; - top: 10%; - left: 10%; - animation-delay: 0s; -} - -.shape-2 { - width: 60px; - height: 60px; - top: 20%; - right: 15%; - animation-delay: 2s; -} - -.shape-3 { - width: 100px; - height: 100px; - bottom: 15%; - left: 20%; - animation-delay: 4s; -} - -@keyframes float { - 0%, 100% { transform: translateY(0px) rotate(0deg); } - 33% { transform: translateY(-20px) rotate(120deg); } - 66% { transform: translateY(10px) rotate(240deg); } -} - -/* Input Section */ -.input-section { - margin-bottom: 40px; -} - -.input-card { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(20px); - border-radius: 20px; - padding: 30px; - box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); - border: 1px solid rgba(255, 255, 255, 0.3); - transition: all 0.3s ease; -} - -.input-card:hover { - transform: translateY(-5px); - box-shadow: 0 30px 60px rgba(0, 0, 0, 0.15); -} - -.card-header { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 20px; -} - -.card-header i { - font-size: 24px; - color: #228B22; -} - -.card-header h2 { - font-size: 24px; - font-weight: 600; - color: #333; -} - -.input-wrapper { - position: relative; -} - -#inputText { - width: 100%; - padding: 20px; - border: 2px solid #e1e5e9; - border-radius: 12px; - font-size: 16px; - font-family: inherit; - resize: vertical; - transition: all 0.3s ease; - background: rgba(255, 255, 255, 0.8); - backdrop-filter: blur(10px); -} - -#inputText:focus { - outline: none; - border-color: #228B22; - box-shadow: 0 0 0 3px rgba(34, 139, 34, 0.1); - background: rgba(255, 255, 255, 0.95); -} - -.input-actions { - display: flex; - gap: 15px; - margin-top: 20px; - justify-content: flex-end; -} - -/* Button Styles */ -.btn { - padding: 12px 24px; - border: none; - border-radius: 10px; - font-size: 16px; - font-weight: 500; - cursor: pointer; - transition: all 0.3s ease; - display: flex; - align-items: center; - gap: 8px; - text-decoration: none; - position: relative; - overflow: hidden; -} - -.btn::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); - transition: left 0.5s; -} - -.btn:hover::before { - left: 100%; -} - -.btn-primary { - background: linear-gradient(135deg, #228B22 0%, #32CD32 100%); - color: white; - box-shadow: 0 4px 15px rgba(34, 139, 34, 0.3); -} - -.btn-primary:hover { - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(34, 139, 34, 0.4); -} - -.btn-secondary { - background: rgba(255, 255, 255, 0.8); - color: #666; - border: 1px solid #e1e5e9; -} - -.btn-secondary:hover { - background: rgba(255, 255, 255, 0.95); - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); -} - -/* Results Section */ -.results-section { - opacity: 0; - transform: translateY(30px); - transition: all 0.5s ease; -} - -.results-section.show { - opacity: 1; - transform: translateY(0); -} - -.results-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); - gap: 30px; -} - -.result-card { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(20px); - border-radius: 20px; - padding: 30px; - box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); - border: 1px solid rgba(255, 255, 255, 0.3); - transition: all 0.3s ease; - position: relative; - overflow: hidden; -} - -.result-card::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 4px; - background: linear-gradient(90deg, #228B22, #32CD32, #90EE90, #98FB98); -} - -.result-card:hover { - transform: translateY(-5px); - box-shadow: 0 30px 60px rgba(0, 0, 0, 0.15); -} - -.result-card .card-header h3 { - font-size: 20px; - font-weight: 600; - color: #333; -} - -.result-items { - display: flex; - flex-direction: column; - gap: 20px; -} - -.result-item { - position: relative; -} - -.result-item label { - display: block; - font-size: 14px; - font-weight: 500; - color: #666; - margin-bottom: 8px; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.result-value { - display: flex; - align-items: center; - background: rgba(248, 250, 252, 0.8); - border: 1px solid #e1e5e9; - border-radius: 8px; - padding: 12px 16px; - font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; - font-size: 14px; - word-break: break-all; - position: relative; - transition: all 0.3s ease; -} - -.result-value:hover { - background: rgba(248, 250, 252, 0.95); - border-color: #228B22; -} - -.result-value .placeholder { - color: #999; - font-style: italic; -} - -.copy-btn { - background: none; - border: none; - color: #228B22; - cursor: pointer; - padding: 8px; - border-radius: 6px; - transition: all 0.3s ease; - margin-left: auto; - flex-shrink: 0; -} - -.copy-btn:hover { - background: rgba(34, 139, 34, 0.1); - color: #1e7e1e; -} - -/* Loading Overlay */ -.loading-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.5); - backdrop-filter: blur(5px); - display: flex; - align-items: center; - justify-content: center; - z-index: 1000; - opacity: 0; - visibility: hidden; - transition: all 0.3s ease; -} - -.loading-overlay.show { - opacity: 1; - visibility: visible; -} - -.loading-spinner { - text-align: center; - color: white; -} - -.spinner { - width: 50px; - height: 50px; - border: 4px solid rgba(255, 255, 255, 0.3); - border-top: 4px solid white; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* Toast Notification */ -.toast { - position: fixed; - bottom: 30px; - right: 30px; - background: linear-gradient(135deg, #228B22, #32CD32); - color: white; - padding: 16px 24px; - border-radius: 12px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); - display: flex; - align-items: center; - gap: 10px; - transform: translateX(400px); - transition: all 0.3s ease; - z-index: 1001; -} - -.toast.show { - transform: translateX(0); -} - -.toast i { - font-size: 18px; -} - -/* Responsive Design */ -@media (max-width: 768px) { - .container { - padding: 15px; - } - - .header-content { - padding: 30px 20px; - } - - .logo h1 { - font-size: 32px; - } - - .logo i { - font-size: 36px; - } - - .results-grid { - grid-template-columns: 1fr; - gap: 20px; - } - - .input-actions { - flex-direction: column; - } - - .btn { - justify-content: center; - } - - .toast { - bottom: 20px; - right: 20px; - left: 20px; - transform: translateY(100px); - } - - .toast.show { - transform: translateY(0); - } -} - -@media (max-width: 480px) { - .input-card, - .result-card { - padding: 20px; - } - - .card-header h2, - .card-header h3 { - font-size: 18px; - } - - .result-value { - font-size: 12px; - padding: 10px 12px; - } -} - -/* Animation Classes */ -.fade-in { - animation: fadeIn 0.5s ease-in-out; -} - -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.slide-in { - animation: slideIn 0.3s ease-out; -} - -@keyframes slideIn { - from { - transform: translateX(-20px); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } -} - -/* Custom Scrollbar */ -::-webkit-scrollbar { - width: 8px; -} - -::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.1); - border-radius: 4px; -} - -::-webkit-scrollbar-thumb { - background: rgba(255, 255, 255, 0.3); - border-radius: 4px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(255, 255, 255, 0.5); -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/index.html b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/index.html deleted file mode 100755 index b7453c4e..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/index.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - 多功能哈希工具 - Hash Toolkit - - - - - -
- -
-
- -

多功能哈希、编码与压缩工具

-
-
-
-
-
-
-
-
-
- - -
- -
-
-
- -

输入内容

-
-
- -
- - -
-
-
-
- - -
-
- -
-
- -

哈希算法

-
-
-
- -
- 等待处理... - -
-
-
- -
- 等待处理... - -
-
-
- -
- 等待处理... - -
-
-
- -
- 等待处理... - -
-
-
-
- - -
-
- -

编码转换

-
-
-
- -
- 等待处理... - -
-
-
- -
- 等待处理... - -
-
-
- -
- 等待处理... - -
-
-
- -
- 等待处理... - -
-
-
-
- - -
-
- -

压缩算法

-
-
-
- -
- 等待处理... - -
-
-
- -
- 等待处理... - -
-
-
- -
- 等待处理... - -
-
-
-
-
-
-
- - -
-
-
-

正在处理中...

-
-
- - -
- - 复制成功! -
-
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/js/script.js deleted file mode 100755 index c9f81d84..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/js/script.js +++ /dev/null @@ -1,394 +0,0 @@ -// API配置 -const API_BASE_URL = 'https://60s.api.shumengya.top/v2/hash'; - -// DOM元素 -const elements = { - inputText: document.getElementById('inputText'), - processBtn: document.getElementById('processBtn'), - clearBtn: document.getElementById('clearBtn'), - resultsSection: document.getElementById('resultsSection'), - loadingOverlay: document.getElementById('loadingOverlay'), - toast: document.getElementById('toast'), - toastMessage: document.getElementById('toastMessage') -}; - -// 结果元素映射 -const resultElements = { - md5: document.getElementById('md5Result'), - sha1: document.getElementById('sha1Result'), - sha256: document.getElementById('sha256Result'), - sha512: document.getElementById('sha512Result'), - base64Encode: document.getElementById('base64EncodeResult'), - base64Decode: document.getElementById('base64DecodeResult'), - urlEncode: document.getElementById('urlEncodeResult'), - urlDecode: document.getElementById('urlDecodeResult'), - gzipCompress: document.getElementById('gzipCompressResult'), - deflateCompress: document.getElementById('deflateCompressResult'), - brotliCompress: document.getElementById('brotliCompressResult') -}; - -// 初始化 -document.addEventListener('DOMContentLoaded', function() { - initializeEventListeners(); - addInputAnimation(); -}); - -// 事件监听器初始化 -function initializeEventListeners() { - // 处理按钮点击 - elements.processBtn.addEventListener('click', handleProcess); - - // 清空按钮点击 - elements.clearBtn.addEventListener('click', handleClear); - - // 输入框回车键 - elements.inputText.addEventListener('keydown', function(e) { - if (e.ctrlKey && e.key === 'Enter') { - handleProcess(); - } - }); - - // 复制按钮事件委托 - document.addEventListener('click', function(e) { - if (e.target.closest('.copy-btn')) { - const copyBtn = e.target.closest('.copy-btn'); - const targetId = copyBtn.getAttribute('data-target'); - const targetElement = document.getElementById(targetId); - const textContent = targetElement.textContent.trim(); - - if (textContent && textContent !== '等待处理...' && textContent !== '处理失败') { - copyToClipboard(textContent); - } - } - }); - - // 输入框实时验证 - elements.inputText.addEventListener('input', function() { - const hasContent = this.value.trim().length > 0; - elements.processBtn.disabled = !hasContent; - - if (hasContent) { - elements.processBtn.classList.remove('disabled'); - } else { - elements.processBtn.classList.add('disabled'); - } - }); -} - -// 添加输入动画效果 -function addInputAnimation() { - elements.inputText.addEventListener('focus', function() { - this.parentElement.classList.add('focused'); - }); - - elements.inputText.addEventListener('blur', function() { - this.parentElement.classList.remove('focused'); - }); -} - -// 处理主要功能 -async function handleProcess() { - const inputValue = elements.inputText.value.trim(); - - if (!inputValue) { - showToast('请输入要处理的内容', 'error'); - return; - } - - // 显示加载状态 - showLoading(true); - resetResults(); - - try { - // 调用API - const response = await fetch(`${API_BASE_URL}?content=${encodeURIComponent(inputValue)}`); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - displayResults(data.data); - showResultsSection(); - showToast('处理完成!', 'success'); - } else { - throw new Error(data.message || '处理失败'); - } - - } catch (error) { - console.error('处理错误:', error); - showToast(`处理失败: ${error.message}`, 'error'); - displayError(); - } finally { - showLoading(false); - } -} - -// 显示结果 -function displayResults(data) { - try { - // 哈希结果 - updateResultElement('md5', data.md5 || '不可用'); - - // SHA系列 - if (data.sha) { - updateResultElement('sha1', data.sha.sha1 || '不可用'); - updateResultElement('sha256', data.sha.sha256 || '不可用'); - updateResultElement('sha512', data.sha.sha512 || '不可用'); - } - - // Base64编码 - if (data.base64) { - updateResultElement('base64Encode', data.base64.encoded || '不可用'); - // BASE64解码:只有当输入本身是BASE64格式时才显示解码结果 - let base64DecodeResult = data.base64.decoded; - if (!base64DecodeResult) { - // 检查输入是否为有效的BASE64格式 - const inputValue = elements.inputText.value.trim(); - const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/; - if (base64Regex.test(inputValue) && inputValue.length % 4 === 0) { - try { - base64DecodeResult = atob(inputValue); - } catch (e) { - base64DecodeResult = '解码失败'; - } - } else { - base64DecodeResult = '输入非BASE64格式'; - } - } - updateResultElement('base64Decode', base64DecodeResult || '不可用'); - } - - // URL编码 - if (data.url) { - updateResultElement('urlEncode', data.url.encoded || '不可用'); - updateResultElement('urlDecode', data.url.decoded || '不可用'); - } - - // 压缩结果(仅显示压缩,不显示解压) - if (data.gzip) { - updateResultElement('gzipCompress', data.gzip.encoded || '不可用'); - } - - if (data.deflate) { - updateResultElement('deflateCompress', data.deflate.encoded || '不可用'); - } - - if (data.brotli) { - updateResultElement('brotliCompress', data.brotli.encoded || '不可用'); - } - - } catch (error) { - console.error('显示结果时出错:', error); - showToast('显示结果时出错', 'error'); - } -} - -// 更新单个结果元素 -function updateResultElement(key, value) { - const element = resultElements[key]; - if (element) { - const textSpan = element.querySelector('span') || element; - textSpan.textContent = value; - textSpan.classList.remove('placeholder'); - - // 添加动画效果 - element.classList.add('slide-in'); - setTimeout(() => { - element.classList.remove('slide-in'); - }, 300); - } -} - -// 重置结果 -function resetResults() { - Object.values(resultElements).forEach(element => { - if (element) { - const textSpan = element.querySelector('span') || element; - textSpan.textContent = '等待处理...'; - textSpan.classList.add('placeholder'); - } - }); -} - -// 显示错误状态 -function displayError() { - Object.values(resultElements).forEach(element => { - if (element) { - const textSpan = element.querySelector('span') || element; - textSpan.textContent = '处理失败'; - textSpan.classList.add('placeholder'); - } - }); -} - -// 显示结果区域 -function showResultsSection() { - elements.resultsSection.classList.add('show'); - - // 平滑滚动到结果区域 - setTimeout(() => { - elements.resultsSection.scrollIntoView({ - behavior: 'smooth', - block: 'start' - }); - }, 100); -} - -// 清空功能 -function handleClear() { - elements.inputText.value = ''; - elements.inputText.focus(); - elements.resultsSection.classList.remove('show'); - resetResults(); - elements.processBtn.disabled = true; - elements.processBtn.classList.add('disabled'); - - showToast('内容已清空', 'info'); -} - -// 复制到剪贴板 -async function copyToClipboard(text) { - try { - if (navigator.clipboard && window.isSecureContext) { - await navigator.clipboard.writeText(text); - } else { - // 降级方案 - const textArea = document.createElement('textarea'); - textArea.value = text; - textArea.style.position = 'fixed'; - textArea.style.left = '-999999px'; - textArea.style.top = '-999999px'; - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - document.execCommand('copy'); - textArea.remove(); - } - - showToast('复制成功!', 'success'); - } catch (error) { - console.error('复制失败:', error); - showToast('复制失败,请手动复制', 'error'); - } -} - -// 显示/隐藏加载状态 -function showLoading(show) { - if (show) { - elements.loadingOverlay.classList.add('show'); - elements.processBtn.disabled = true; - elements.processBtn.innerHTML = ' 处理中...'; - } else { - elements.loadingOverlay.classList.remove('show'); - elements.processBtn.disabled = false; - elements.processBtn.innerHTML = ' 开始处理'; - } -} - -// 显示提示消息 -function showToast(message, type = 'success') { - elements.toastMessage.textContent = message; - - // 设置图标和样式 - const icon = elements.toast.querySelector('i'); - icon.className = getToastIcon(type); - - elements.toast.className = `toast ${type}`; - elements.toast.classList.add('show'); - - // 自动隐藏 - setTimeout(() => { - elements.toast.classList.remove('show'); - }, 3000); -} - -// 获取提示图标 -function getToastIcon(type) { - const icons = { - success: 'fas fa-check-circle', - error: 'fas fa-exclamation-circle', - info: 'fas fa-info-circle', - warning: 'fas fa-exclamation-triangle' - }; - return icons[type] || icons.success; -} - -// 工具函数:防抖 -function debounce(func, wait) { - let timeout; - return function executedFunction(...args) { - const later = () => { - clearTimeout(timeout); - func(...args); - }; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; -} - -// 工具函数:节流 -function throttle(func, limit) { - let inThrottle; - return function() { - const args = arguments; - const context = this; - if (!inThrottle) { - func.apply(context, args); - inThrottle = true; - setTimeout(() => inThrottle = false, limit); - } - } -} - -// 添加键盘快捷键支持 -document.addEventListener('keydown', function(e) { - // Ctrl+Enter 处理 - if (e.ctrlKey && e.key === 'Enter') { - e.preventDefault(); - if (!elements.processBtn.disabled) { - handleProcess(); - } - } - - // Escape 清空 - if (e.key === 'Escape') { - handleClear(); - } -}); - -// 页面可见性变化处理 -document.addEventListener('visibilitychange', function() { - if (document.hidden) { - // 页面隐藏时的处理 - console.log('页面已隐藏'); - } else { - // 页面显示时的处理 - console.log('页面已显示'); - } -}); - -// 错误处理 -window.addEventListener('error', function(e) { - console.error('全局错误:', e.error); - showToast('发生未知错误,请刷新页面重试', 'error'); -}); - -// 未处理的Promise拒绝 -window.addEventListener('unhandledrejection', function(e) { - console.error('未处理的Promise拒绝:', e.reason); - showToast('网络请求失败,请检查网络连接', 'error'); -}); - -// 导出函数供测试使用 -if (typeof module !== 'undefined' && module.exports) { - module.exports = { - handleProcess, - copyToClipboard, - showToast, - debounce, - throttle - }; -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/返回接口.json deleted file mode 100755 index b6d97895..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/返回接口.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "source": "hello", - "md5": "5d41402abc4b2a76b9719d911017c592", - "sha": { - "sha1": "aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d", - "sha256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824", - "sha512": "9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043" - }, - "base64": { - "encoded": "aGVsbG8=", - "decoded": "" - }, - "url": { - "encoded": "hello", - "decoded": "hello" - }, - "gzip": { - "encoded": "1f8b0800000000000003cb48cdc9c9070086a6103605000000", - "decoded": "" - }, - "deflate": { - "encoded": "789ccb48cdc9c90700062c0215", - "decoded": "" - }, - "brotli": { - "encoded": "0b028068656c6c6f03", - "decoded": "" - } - } -} - -注意:实际API返回的字段名是 encoded/decoded,不是 encode/decode \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译.html b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译.html new file mode 100644 index 00000000..7d0d9ad4 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译.html @@ -0,0 +1,67 @@ + + + + +在线翻译 + + + + + +
+ +

🌍 在线翻译

+
+
+
+ + + +
+
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/background.css b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/background.css deleted file mode 100755 index ae4bac38..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/background.css +++ /dev/null @@ -1,137 +0,0 @@ -/* 背景样式文件 */ - -/* 页面主背景 */ -body { - background: linear-gradient(135deg, #e8f5e8 0%, #f0fdf4 25%, #dcfce7 50%, #f0fdf4 75%, #e8f5e8 100%); - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; - background-attachment: fixed; -} - -/* 背景动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 容器背景 */ -.container { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(10px); - border-radius: 20px; - border: 1px solid rgba(255, 255, 255, 0.2); -} - -/* 翻译框背景 */ -.translate-box { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(20px); - border: 1px solid rgba(116, 198, 157, 0.3); -} - -/* 输入框背景 */ -#input-text { - background: rgba(255, 255, 255, 0.9); -} - -#input-text:focus { - background: rgba(255, 255, 255, 1); -} - -/* 输出框背景 */ -.output-text { - background: #f8fffe; -} - -/* 按钮背景 */ -.translate-btn { - background: linear-gradient(135deg, #74c69d, #52b788); -} - -.translate-btn:hover { - background: linear-gradient(135deg, #52b788, #40916c); -} - -.translate-btn:disabled { - background: #b7e4c7; -} - -.swap-btn { - background: #74c69d; -} - -.swap-btn:hover { - background: #52b788; -} - -/* 语言选择器背景 */ -.lang-select { - background: white; -} - -.lang-select:focus { - background: rgba(255, 255, 255, 1); -} - -/* 发音信息背景 */ -.pronounce-item { - background: rgba(116, 198, 157, 0.1); -} - -/* 清除和复制按钮背景 */ -.clear-btn:hover, -.copy-btn:hover { - background: rgba(116, 198, 157, 0.1); -} - -/* 提示消息背景 */ -.toast { - background: #52b788; -} - -.toast.error { - background: #e74c3c; -} - -/* 响应式背景调整 */ -@media (max-width: 767px) { - body { - background-size: 200% 200%; - animation-duration: 10s; - } - - .container { - background: rgba(255, 255, 255, 0.05); - backdrop-filter: blur(5px); - } - - .translate-box { - background: rgba(255, 255, 255, 0.98); - backdrop-filter: blur(15px); - } -} - -@media (max-width: 480px) { - body { - background-size: 150% 150%; - animation-duration: 8s; - } - - .container { - background: transparent; - backdrop-filter: none; - border: none; - } - - .translate-box { - background: rgba(255, 255, 255, 0.99); - backdrop-filter: blur(10px); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/index.html b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/index.html deleted file mode 100755 index a6e02825..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/index.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - 在线翻译 - 支持109种语言 - - - - -
-
-

在线机器翻译

-

支持109种语言互译

-
- -
-
-
-
- - -
- - - -
- - -
-
- -
-
-
- - -
- -
- 0/5000 -
-
- -
-
- - -
-
翻译结果将显示在这里...
-
-
-
-
-
-
- -
- -
-
-
- -
-

数据来源于有道翻译,与其网页端同步

-
-
- -
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/script.js b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/script.js deleted file mode 100755 index af5222af..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/script.js +++ /dev/null @@ -1,452 +0,0 @@ -// 全局变量 -let supportedLanguages = {}; -let isTranslating = false; - -// DOM元素 -const elements = { - fromLang: null, - toLang: null, - inputText: null, - outputText: null, - translateBtn: null, - swapBtn: null, - clearBtn: null, - copyBtn: null, - charCount: null, - detectedLang: null, - targetLang: null, - pronounceSection: null -}; - -// 初始化 -document.addEventListener('DOMContentLoaded', function() { - initializeElements(); - loadSupportedLanguages(); - bindEvents(); - updateCharCount(); -}); - -// 初始化DOM元素 -function initializeElements() { - elements.fromLang = document.getElementById('from-lang'); - elements.toLang = document.getElementById('to-lang'); - elements.inputText = document.getElementById('input-text'); - elements.outputText = document.getElementById('output-text'); - elements.translateBtn = document.getElementById('translate-btn'); - elements.swapBtn = document.getElementById('swap-btn'); - elements.clearBtn = document.getElementById('clear-btn'); - elements.copyBtn = document.getElementById('copy-btn'); - elements.charCount = document.getElementById('char-count'); - elements.detectedLang = document.getElementById('detected-lang'); - elements.targetLang = document.getElementById('target-lang'); - elements.pronounceSection = document.getElementById('pronounce-section'); -} - -// 加载支持的语言列表 -async function loadSupportedLanguages() { - try { - const response = await fetch('https://60s.viki.moe/v2/fanyi/langs'); - const data = await response.json(); - - if (data.code === 200 && data.data && Array.isArray(data.data)) { - // 转换数组格式为对象格式 - supportedLanguages = {}; - supportedLanguages['auto'] = '自动检测'; - data.data.forEach(lang => { - supportedLanguages[lang.code] = lang.label; - }); - populateLanguageSelectors(); - } else { - throw new Error('获取语言列表失败'); - } - } catch (error) { - console.error('加载语言列表失败:', error); - showToast('加载语言列表失败,请刷新页面重试', 'error'); - // 使用默认语言列表 - useDefaultLanguages(); - } -} - -// 使用默认语言列表(备用方案) -function useDefaultLanguages() { - supportedLanguages = { - 'auto': '自动检测', - 'zh-CHS': '中文', - 'en': '英语', - 'ja': '日语', - 'ko': '韩语', - 'fr': '法语', - 'de': '德语', - 'es': '西班牙语', - 'ru': '俄语', - 'th': '泰语', - 'ar': '阿拉伯语', - 'pt': '葡萄牙语', - 'it': '意大利语' - }; - populateLanguageSelectors(); -} - -// 填充语言选择器 -function populateLanguageSelectors() { - const fromSelect = elements.fromLang; - const toSelect = elements.toLang; - - // 清空现有选项 - fromSelect.innerHTML = ''; - toSelect.innerHTML = ''; - - // 添加语言选项 - Object.entries(supportedLanguages).forEach(([code, name]) => { - const fromOption = new Option(name, code); - const toOption = new Option(name, code); - - fromSelect.appendChild(fromOption); - toSelect.appendChild(toOption); - }); - - // 设置默认值 - fromSelect.value = 'auto'; - toSelect.value = 'en'; - - // 如果没有auto选项,则设置为中文 - if (!supportedLanguages['auto']) { - fromSelect.value = 'zh-CHS'; - } -} - -// 绑定事件 -function bindEvents() { - // 输入框事件 - elements.inputText.addEventListener('input', function() { - updateCharCount(); - clearOutput(); - }); - - elements.inputText.addEventListener('keydown', function(e) { - if (e.ctrlKey && e.key === 'Enter') { - translateText(); - } - }); - - // 按钮事件 - elements.translateBtn.addEventListener('click', translateText); - elements.swapBtn.addEventListener('click', swapLanguages); - elements.clearBtn.addEventListener('click', clearInput); - elements.copyBtn.addEventListener('click', copyOutput); - - // 语言选择器事件 - elements.fromLang.addEventListener('change', function() { - clearOutput(); - updateLanguageLabels(); - }); - - elements.toLang.addEventListener('change', function() { - clearOutput(); - updateLanguageLabels(); - }); -} - -// 更新字符计数 -function updateCharCount() { - const text = elements.inputText.value; - const count = text.length; - elements.charCount.textContent = `${count}/5000`; - - if (count > 5000) { - elements.charCount.style.color = '#e74c3c'; - } else { - elements.charCount.style.color = '#74c69d'; - } -} - -// 更新语言标签 -function updateLanguageLabels() { - const fromLang = elements.fromLang.value; - const toLang = elements.toLang.value; - - elements.detectedLang.textContent = supportedLanguages[fromLang] || '未知语言'; - elements.targetLang.textContent = supportedLanguages[toLang] || '未知语言'; -} - -// 翻译文本 -async function translateText() { - const text = elements.inputText.value.trim(); - - if (!text) { - showToast('请输入要翻译的文本', 'error'); - return; - } - - if (text.length > 5000) { - showToast('文本长度不能超过5000字符', 'error'); - return; - } - - if (isTranslating) { - return; - } - - setTranslating(true); - - try { - const fromLang = elements.fromLang.value; - const toLang = elements.toLang.value; - - // 构建请求URL - const params = new URLSearchParams({ - text: text, - from: fromLang, - to: toLang - }); - - const response = await fetch(`https://60s.viki.moe/v2/fanyi?${params}`); - const data = await response.json(); - - if (data.code === 200 && data.data) { - displayTranslationResult(data.data); - } else { - throw new Error(data.msg || '翻译失败'); - } - } catch (error) { - console.error('翻译失败:', error); - showToast('翻译失败: ' + error.message, 'error'); - elements.outputText.textContent = '翻译失败,请重试'; - } finally { - setTranslating(false); - } -} - -// 显示翻译结果 -function displayTranslationResult(data) { - // 显示翻译结果 - const translation = data.target ? data.target.text : ''; - elements.outputText.textContent = translation; - - // 更新检测到的语言 - if (data.source && data.source.type_desc) { - elements.detectedLang.textContent = `检测: ${data.source.type_desc}`; - } - - // 显示发音信息 - displayPronunciation(data); - - // 如果翻译结果为空 - if (!translation) { - elements.outputText.textContent = '未获取到翻译结果'; - } -} - -// 显示发音信息 -function displayPronunciation(data) { - const pronounceSection = elements.pronounceSection; - if (!pronounceSection) { - return; - } - pronounceSection.innerHTML = ''; - - // 原文发音 - if (data.source && data.source.pronounce) { - const sourcePhoneticDiv = document.createElement('div'); - sourcePhoneticDiv.className = 'pronounce-item show'; - sourcePhoneticDiv.textContent = `原文发音: [${data.source.pronounce}]`; - pronounceSection.appendChild(sourcePhoneticDiv); - } - - // 译文发音 - if (data.target && data.target.pronounce) { - const targetPhoneticDiv = document.createElement('div'); - targetPhoneticDiv.className = 'pronounce-item show'; - targetPhoneticDiv.textContent = `译文发音: [${data.target.pronounce}]`; - pronounceSection.appendChild(targetPhoneticDiv); - } -} - -// 设置翻译状态 -function setTranslating(translating) { - isTranslating = translating; - elements.translateBtn.disabled = translating; - - if (translating) { - elements.translateBtn.classList.add('loading'); - } else { - elements.translateBtn.classList.remove('loading'); - } -} - -// 交换语言 -function swapLanguages() { - const fromValue = elements.fromLang.value; - const toValue = elements.toLang.value; - - // 不能交换自动检测 - if (fromValue === 'auto') { - showToast('自动检测语言无法交换', 'error'); - return; - } - - elements.fromLang.value = toValue; - elements.toLang.value = fromValue; - - // 交换文本内容 - const inputText = elements.inputText.value; - const outputText = elements.outputText.textContent; - - if (outputText && outputText !== '翻译结果将在这里显示...' && outputText !== '翻译失败,请重试' && outputText !== '未获取到翻译结果') { - elements.inputText.value = outputText; - elements.outputText.textContent = inputText; - } - - updateCharCount(); - updateLanguageLabels(); - clearPronunciation(); -} - -// 清空输入 -function clearInput() { - elements.inputText.value = ''; - updateCharCount(); - clearOutput(); -} - -// 清空输出 -function clearOutput() { - elements.outputText.textContent = '翻译结果将在这里显示...'; - clearPronunciation(); -} - -// 清空发音信息 -function clearPronunciation() { - if (elements.pronounceSection) { - elements.pronounceSection.innerHTML = ''; - } -} - -// 复制输出 -function copyOutput() { - const text = elements.outputText.textContent; - - if (!text || text === '翻译结果将在这里显示...' || text === '翻译失败,请重试' || text === '未获取到翻译结果') { - showToast('没有可复制的内容', 'error'); - return; - } - - // 使用现代API复制 - if (navigator.clipboard) { - navigator.clipboard.writeText(text).then(() => { - showToast('已复制到剪贴板'); - }).catch(() => { - fallbackCopy(text); - }); - } else { - fallbackCopy(text); - } -} - -// 备用复制方法 -function fallbackCopy(text) { - const textArea = document.createElement('textarea'); - textArea.value = text; - textArea.style.position = 'fixed'; - textArea.style.opacity = '0'; - document.body.appendChild(textArea); - textArea.select(); - - try { - document.execCommand('copy'); - showToast('已复制到剪贴板'); - } catch (err) { - showToast('复制失败,请手动复制', 'error'); - } - - document.body.removeChild(textArea); -} - -// 显示提示消息 -function showToast(message, type = 'success') { - // 移除现有的toast - const existingToast = document.querySelector('.toast'); - if (existingToast) { - existingToast.remove(); - } - - const toast = document.createElement('div'); - toast.className = `toast ${type}`; - toast.textContent = message; - - document.body.appendChild(toast); - - // 显示toast - setTimeout(() => { - toast.classList.add('show'); - }, 100); - - // 自动隐藏 - setTimeout(() => { - toast.classList.remove('show'); - setTimeout(() => { - if (toast.parentNode) { - toast.parentNode.removeChild(toast); - } - }, 300); - }, 3000); -} - -// 工具函数:防抖 -function debounce(func, wait) { - let timeout; - return function executedFunction(...args) { - const later = () => { - clearTimeout(timeout); - func(...args); - }; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; -} - -// 添加键盘快捷键支持 -document.addEventListener('keydown', function(e) { - // Ctrl+Enter 翻译 - if (e.ctrlKey && e.key === 'Enter') { - e.preventDefault(); - translateText(); - } - - // Ctrl+Shift+C 复制结果 - if (e.ctrlKey && e.shiftKey && e.key === 'C') { - e.preventDefault(); - copyOutput(); - } - - // Ctrl+Shift+X 清空输入 - if (e.ctrlKey && e.shiftKey && e.key === 'X') { - e.preventDefault(); - clearInput(); - } - - // Ctrl+Shift+S 交换语言 - if (e.ctrlKey && e.shiftKey && e.key === 'S') { - e.preventDefault(); - swapLanguages(); - } -}); - -// 页面可见性变化时的处理 -document.addEventListener('visibilitychange', function() { - if (document.hidden) { - // 页面隐藏时暂停翻译请求 - if (isTranslating) { - setTranslating(false); - } - } -}); - -// 错误处理 -window.addEventListener('error', function(e) { - console.error('页面错误:', e.error); -}); - -window.addEventListener('unhandledrejection', function(e) { - console.error('未处理的Promise拒绝:', e.reason); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/styles.css b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/styles.css deleted file mode 100755 index 36f661d7..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/styles.css +++ /dev/null @@ -1,441 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: #2d5a3d; - min-height: 100vh; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; -} - -.header h1 { - font-size: 2.5rem; - color: #1a4d2e; - margin-bottom: 10px; - font-weight: 700; -} - -.subtitle { - font-size: 1.1rem; - color: #4a7c59; - opacity: 0.9; -} - -/* 主要内容区域 */ -.main-content { - flex: 1; - display: flex; - justify-content: center; - align-items: flex-start; -} - -.translate-box { - width: 100%; - max-width: 900px; - border-radius: 20px; - padding: 30px; - box-shadow: 0 10px 30px rgba(26, 77, 46, 0.1); -} - -/* 语言选择器 */ -.language-selector { - display: flex; - align-items: center; - gap: 20px; - margin-bottom: 25px; - justify-content: center; -} - -.lang-group { - display: flex; - flex-direction: column; - gap: 8px; - flex: 1; - max-width: 200px; -} - -.lang-group label { - font-size: 0.9rem; - color: #2d5a3d; - font-weight: 500; -} - -.lang-select { - padding: 12px 16px; - border: 2px solid #74c69d; - border-radius: 12px; - color: #2d5a3d; - font-size: 1rem; - cursor: pointer; - transition: all 0.3s ease; -} - -.lang-select:focus { - outline: none; - border-color: #52b788; - box-shadow: 0 0 0 3px rgba(116, 198, 157, 0.2); -} - -.lang-select:hover { - border-color: #52b788; -} - -.swap-btn { - border: none; - border-radius: 50%; - width: 45px; - height: 45px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: all 0.3s ease; - color: white; - margin-top: 25px; -} - -.swap-btn:hover { - transform: rotate(180deg); -} - -/* 文本区域 */ -.text-areas { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 20px; - margin-bottom: 25px; -} - -.input-section, -.output-section { - display: flex; - flex-direction: column; -} - -.textarea-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 10px; - padding: 0 5px; -} - -.detected-lang, -.target-lang { - font-size: 0.9rem; - color: #4a7c59; - font-weight: 500; -} - -.clear-btn, -.copy-btn { - background: none; - border: none; - color: #74c69d; - cursor: pointer; - padding: 5px; - border-radius: 6px; - transition: all 0.3s ease; -} - -.clear-btn:hover, -.copy-btn:hover { - color: #52b788; -} - -#input-text { - width: 100%; - height: 200px; - padding: 16px; - border: 2px solid #74c69d; - border-radius: 12px; - font-size: 1rem; - color: #2d5a3d; - resize: vertical; - transition: all 0.3s ease; - font-family: inherit; -} - -#input-text:focus { - outline: none; - border-color: #52b788; - box-shadow: 0 0 0 3px rgba(116, 198, 157, 0.2); -} - -#input-text::placeholder { - color: #74c69d; - opacity: 0.7; -} - -.output-text { - width: 100%; - height: 200px; - padding: 16px; - border: 2px solid #b7e4c7; - border-radius: 12px; - font-size: 1rem; - color: #2d5a3d; - overflow-y: auto; - line-height: 1.6; -} - -.char-count { - text-align: right; - font-size: 0.8rem; - color: #74c69d; - margin-top: 5px; -} - -.pronounce-section { - margin-top: 10px; - display: flex; - flex-direction: column; - gap: 5px; -} - -.pronounce-item { - font-size: 0.9rem; - color: #4a7c59; - font-style: italic; - padding: 5px 10px; - border-radius: 8px; - display: none; -} - -.pronounce-item.show { - display: block; -} - -/* 操作按钮 */ -.action-buttons { - display: flex; - justify-content: center; -} - -.translate-btn { - color: white; - border: none; - padding: 15px 40px; - border-radius: 25px; - font-size: 1.1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - position: relative; - overflow: hidden; - min-width: 120px; - display: flex; - align-items: center; - justify-content: center; - gap: 10px; -} - -.translate-btn:hover { - transform: translateY(-2px); - box-shadow: 0 8px 20px rgba(116, 198, 157, 0.3); -} - -.translate-btn:active { - transform: translateY(0); -} - -.translate-btn:disabled { - cursor: not-allowed; - transform: none; - box-shadow: none; -} - -.loading-spinner { - width: 20px; - height: 20px; - border: 2px solid rgba(255, 255, 255, 0.3); - border-top: 2px solid white; - border-radius: 50%; - animation: spin 1s linear infinite; - display: none; -} - -.translate-btn.loading .btn-text { - display: none; -} - -.translate-btn.loading .loading-spinner { - display: block; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 页脚 */ -.footer { - text-align: center; - margin-top: 30px; - padding: 20px; - color: #4a7c59; - font-size: 0.9rem; - opacity: 0.8; -} - -/* 提示消息 */ -.toast { - position: fixed; - top: 20px; - right: 20px; - color: white; - padding: 12px 20px; - border-radius: 8px; - font-size: 0.9rem; - transform: translateX(100%); - transition: transform 0.3s ease; - z-index: 1000; - box-shadow: 0 4px 12px rgba(82, 183, 136, 0.3); -} - -.toast.show { - transform: translateX(0); -} - -.toast.error { - box-shadow: 0 4px 12px rgba(231, 76, 60, 0.3); -} - -/* 平板适配 (768px - 1024px) */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2.2rem; - } - - .translate-box { - padding: 25px; - } - - .language-selector { - gap: 15px; - } - - .text-areas { - gap: 15px; - } - - #input-text, - .output-text { - height: 180px; - } -} - -/* 手机端适配 (最大768px) */ -@media (max-width: 767px) { - .container { - padding: 10px; - } - - .header h1 { - font-size: 1.8rem; - } - - .subtitle { - font-size: 1rem; - } - - .translate-box { - padding: 20px 15px; - border-radius: 15px; - } - - .language-selector { - flex-direction: column; - gap: 15px; - align-items: stretch; - } - - .lang-group { - max-width: none; - } - - .swap-btn { - align-self: center; - margin-top: 0; - order: 2; - } - - .text-areas { - grid-template-columns: 1fr; - gap: 20px; - } - - #input-text, - .output-text { - height: 150px; - font-size: 0.95rem; - } - - .translate-btn { - padding: 12px 30px; - font-size: 1rem; - width: 100%; - max-width: 200px; - } - - .toast { - right: 10px; - left: 10px; - transform: translateY(-100%); - } - - .toast.show { - transform: translateY(0); - } -} - -/* 超小屏幕适配 (最大480px) */ -@media (max-width: 480px) { - .header h1 { - font-size: 1.6rem; - } - - .translate-box { - padding: 15px 10px; - } - - .lang-select { - padding: 10px 12px; - font-size: 0.9rem; - } - - #input-text, - .output-text { - height: 120px; - padding: 12px; - font-size: 0.9rem; - } - - .translate-btn { - padding: 10px 25px; - font-size: 0.95rem; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/在线翻译支持语言列表接口.json b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/在线翻译支持语言列表接口.json deleted file mode 100755 index 30242e4a..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/在线翻译支持语言列表接口.json +++ /dev/null @@ -1,551 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "code": "sq", - "label": "阿尔巴尼亚语", - "alphabet": "A" - }, - { - "code": "ga", - "label": "爱尔兰语", - "alphabet": "A" - }, - { - "code": "et", - "label": "爱沙尼亚语", - "alphabet": "A" - }, - { - "code": "ar", - "label": "阿拉伯语", - "alphabet": "A" - }, - { - "code": "am", - "label": "阿姆哈拉语", - "alphabet": "A" - }, - { - "code": "az", - "label": "阿塞拜疆语", - "alphabet": "A" - }, - { - "code": "be", - "label": "白俄罗斯语", - "alphabet": "B" - }, - { - "code": "bg", - "label": "保加利亚语", - "alphabet": "B" - }, - { - "code": "eu", - "label": "巴斯克语", - "alphabet": "B" - }, - { - "code": "is", - "label": "冰岛语", - "alphabet": "B" - }, - { - "code": "pl", - "label": "波兰语", - "alphabet": "B" - }, - { - "code": "bs-Latn", - "label": "波斯尼亚语(拉丁语)", - "alphabet": "B" - }, - { - "code": "fa", - "label": "波斯语", - "alphabet": "B" - }, - { - "code": "da", - "label": "丹麦语", - "alphabet": "D" - }, - { - "code": "de", - "label": "德语", - "alphabet": "D" - }, - { - "code": "ru", - "label": "俄语", - "alphabet": "E" - }, - { - "code": "fr", - "label": "法语", - "alphabet": "F" - }, - { - "code": "tl", - "label": "菲律宾语", - "alphabet": "F" - }, - { - "code": "fi", - "label": "芬兰语", - "alphabet": "F" - }, - { - "code": "fy", - "label": "弗里斯兰语", - "alphabet": "F" - }, - { - "code": "km", - "label": "高棉语", - "alphabet": "G" - }, - { - "code": "ka", - "label": "格鲁吉亚语", - "alphabet": "G" - }, - { - "code": "gu", - "label": "古吉拉特语", - "alphabet": "G" - }, - { - "code": "ko", - "label": "韩语", - "alphabet": "H" - }, - { - "code": "ht", - "label": "海地语", - "alphabet": "H" - }, - { - "code": "ha", - "label": "豪萨语", - "alphabet": "H" - }, - { - "code": "kk", - "label": "哈萨克语", - "alphabet": "H" - }, - { - "code": "nl", - "label": "荷兰语", - "alphabet": "H" - }, - { - "code": "gl", - "label": "加利西亚语", - "alphabet": "J" - }, - { - "code": "ca", - "label": "加泰罗尼亚语", - "alphabet": "J" - }, - { - "code": "cs", - "label": "捷克语", - "alphabet": "J" - }, - { - "code": "ky", - "label": "吉尔吉斯斯坦语", - "alphabet": "J" - }, - { - "code": "kn", - "label": "卡纳达语", - "alphabet": "K" - }, - { - "code": "tlh", - "label": "克林贡语", - "alphabet": "K" - }, - { - "code": "hr", - "label": "克罗地亚语", - "alphabet": "K" - }, - { - "code": "otq", - "label": "克洛塔罗乙巳语", - "alphabet": "K" - }, - { - "code": "co", - "label": "科西嘉语", - "alphabet": "K" - }, - { - "code": "ku", - "label": "库尔德语", - "alphabet": "K" - }, - { - "code": "la", - "label": "拉丁语", - "alphabet": "L" - }, - { - "code": "lo", - "label": "老挝语", - "alphabet": "L" - }, - { - "code": "lv", - "label": "拉脱维亚语", - "alphabet": "L" - }, - { - "code": "lt", - "label": "立陶宛语", - "alphabet": "L" - }, - { - "code": "ro", - "label": "罗马尼亚语", - "alphabet": "L" - }, - { - "code": "lb", - "label": "卢森堡语", - "alphabet": "L" - }, - { - "code": "mg", - "label": "马尔加什语", - "alphabet": "M" - }, - { - "code": "mt", - "label": "马耳他语", - "alphabet": "M" - }, - { - "code": "mr", - "label": "马拉地语", - "alphabet": "M" - }, - { - "code": "ms", - "label": "马来语", - "alphabet": "M" - }, - { - "code": "ml", - "label": "马拉雅拉姆语", - "alphabet": "M" - }, - { - "code": "mi", - "label": "毛利语", - "alphabet": "M" - }, - { - "code": "mk", - "label": "马其顿语", - "alphabet": "M" - }, - { - "code": "mn", - "label": "蒙古语", - "alphabet": "M" - }, - { - "code": "bn", - "label": "孟加拉语", - "alphabet": "M" - }, - { - "code": "my", - "label": "缅甸语", - "alphabet": "M" - }, - { - "code": "mww", - "label": "苗族昂山土语", - "alphabet": "M" - }, - { - "code": "hmn", - "label": "苗族语", - "alphabet": "M" - }, - { - "code": "xh", - "label": "南非科萨语", - "alphabet": "N" - }, - { - "code": "zu", - "label": "南非祖鲁语", - "alphabet": "N" - }, - { - "code": "ne", - "label": "尼泊尔语", - "alphabet": "N" - }, - { - "code": "no", - "label": "挪威语", - "alphabet": "N" - }, - { - "code": "pa", - "label": "旁遮普语", - "alphabet": "P" - }, - { - "code": "ps", - "label": "普什图语", - "alphabet": "P" - }, - { - "code": "pt", - "label": "葡萄牙语", - "alphabet": "P" - }, - { - "code": "ny", - "label": "齐切瓦语", - "alphabet": "Q" - }, - { - "code": "ja", - "label": "日语", - "alphabet": "R" - }, - { - "code": "sv", - "label": "瑞典语", - "alphabet": "R" - }, - { - "code": "sr-Latn", - "label": "塞尔维亚语(拉丁语)", - "alphabet": "S" - }, - { - "code": "sr-Cyrl", - "label": "塞尔维亚语(西里尔)", - "alphabet": "S" - }, - { - "code": "st", - "label": "塞索托语", - "alphabet": "S" - }, - { - "code": "sm", - "label": "萨摩亚语", - "alphabet": "S" - }, - { - "code": "si", - "label": "僧伽罗语", - "alphabet": "S" - }, - { - "code": "eo", - "label": "世界语", - "alphabet": "S" - }, - { - "code": "sk", - "label": "斯洛伐克语", - "alphabet": "S" - }, - { - "code": "sl", - "label": "斯洛语尼亚语", - "alphabet": "S" - }, - { - "code": "sw", - "label": "斯瓦希里语", - "alphabet": "S" - }, - { - "code": "gd", - "label": "苏格兰盖尔语", - "alphabet": "S" - }, - { - "code": "so", - "label": "索马里语", - "alphabet": "S" - }, - { - "code": "ceb", - "label": "宿务语", - "alphabet": "S" - }, - { - "code": "te", - "label": "泰卢固语", - "alphabet": "T" - }, - { - "code": "ta", - "label": "泰米尔语", - "alphabet": "T" - }, - { - "code": "th", - "label": "泰语", - "alphabet": "T" - }, - { - "code": "tg", - "label": "塔吉克语", - "alphabet": "T" - }, - { - "code": "tr", - "label": "土耳其语", - "alphabet": "T" - }, - { - "code": "cy", - "label": "威尔士语", - "alphabet": "W" - }, - { - "code": "zh-lzh", - "label": "文言文", - "alphabet": "W" - }, - { - "code": "ur", - "label": "乌尔都语", - "alphabet": "W" - }, - { - "code": "uk", - "label": "乌克兰语", - "alphabet": "W" - }, - { - "code": "uz", - "label": "乌兹别克语", - "alphabet": "W" - }, - { - "code": "haw", - "label": "夏威夷语", - "alphabet": "X" - }, - { - "code": "es", - "label": "西班牙语", - "alphabet": "X" - }, - { - "code": "he", - "label": "希伯来语", - "alphabet": "X" - }, - { - "code": "el", - "label": "希腊语", - "alphabet": "X" - }, - { - "code": "sd", - "label": "信德语", - "alphabet": "X" - }, - { - "code": "hu", - "label": "匈牙利语", - "alphabet": "X" - }, - { - "code": "sn", - "label": "修纳语", - "alphabet": "X" - }, - { - "code": "en", - "label": "英语", - "alphabet": "Y" - }, - { - "code": "hy", - "label": "亚美尼亚语", - "alphabet": "Y" - }, - { - "code": "ig", - "label": "伊博语", - "alphabet": "Y" - }, - { - "code": "it", - "label": "意大利语", - "alphabet": "Y" - }, - { - "code": "yi", - "label": "意第绪语", - "alphabet": "Y" - }, - { - "code": "hi", - "label": "印地语", - "alphabet": "Y" - }, - { - "code": "id", - "label": "印度尼西亚语", - "alphabet": "Y" - }, - { - "code": "su", - "label": "印尼巽他语", - "alphabet": "Y" - }, - { - "code": "jw", - "label": "印尼爪哇语", - "alphabet": "Y" - }, - { - "code": "yua", - "label": "尤卡坦玛雅语", - "alphabet": "Y" - }, - { - "code": "yo", - "label": "约鲁巴语", - "alphabet": "Y" - }, - { - "code": "vi", - "label": "越南语", - "alphabet": "Y" - }, - { - "code": "zh-CHS", - "label": "中文", - "alphabet": "Z" - }, - { - "code": "zh-CHT", - "label": "中文(繁体)", - "alphabet": "Z" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/返回接口.json deleted file mode 100755 index cc373914..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/返回接口.json +++ /dev/null @@ -1 +0,0 @@ -{"code":200,"message":"所有数据均来自官方,确保稳定与实时,用户群: 595941841,开源地址: https://github.com/vikiboss/60s","data":{"source":{"text":"こんにちは","type":"ja","type_desc":"日语","pronounce":"Konnitiha"},"target":{"text":"你好","type":"zh-CHS","type_desc":"中文","pronounce":"nĭhăo"}}} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/天气预报.html b/InfoGenie-frontend/public/60sapi/实用功能/天气预报.html new file mode 100644 index 00000000..0180b780 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/天气预报.html @@ -0,0 +1,64 @@ + + + + +天气预报 + + + + + +
+ +

⛅ 天气预报

+
+
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/background.css deleted file mode 100755 index a81f4d67..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/background.css +++ /dev/null @@ -1,145 +0,0 @@ -/* 背景样式文件 */ -body { - background: linear-gradient(135deg, #e8f5e8 0%, #d4f1d4 25%, #c8ecc8 50%, #b8e6b8 75%, #a8d5ba 100%); - background-attachment: fixed; - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; - position: relative; - overflow-x: hidden; -} - -/* 背景渐变动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(168, 213, 186, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(107, 183, 123, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(200, 236, 200, 0.1) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 浮动装饰圆点 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(168, 213, 186, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(107, 183, 123, 0.2), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(200, 236, 200, 0.4), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(168, 213, 186, 0.2), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(107, 183, 123, 0.3), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: float 20s linear infinite; - pointer-events: none; - z-index: -1; -} - -@keyframes float { - 0% { - transform: translateY(0px); - } - 50% { - transform: translateY(-10px); - } - 100% { - transform: translateY(0px); - } -} - -/* 云朵装饰效果 */ -.container::before { - content: ''; - position: absolute; - top: -50px; - right: -50px; - width: 200px; - height: 100px; - background: rgba(255, 255, 255, 0.1); - border-radius: 50px; - box-shadow: - -30px 20px 0 rgba(255, 255, 255, 0.08), - 30px 40px 0 rgba(255, 255, 255, 0.06); - animation: cloudFloat 25s ease-in-out infinite; - pointer-events: none; - z-index: -1; -} - -.container::after { - content: ''; - position: absolute; - bottom: -30px; - left: -30px; - width: 150px; - height: 80px; - background: rgba(255, 255, 255, 0.08); - border-radius: 40px; - box-shadow: - 20px 15px 0 rgba(255, 255, 255, 0.06), - -20px 25px 0 rgba(255, 255, 255, 0.04); - animation: cloudFloat 30s ease-in-out infinite reverse; - pointer-events: none; - z-index: -1; -} - -@keyframes cloudFloat { - 0%, 100% { - transform: translateX(0px) translateY(0px); - } - 25% { - transform: translateX(20px) translateY(-10px); - } - 50% { - transform: translateX(-10px) translateY(-20px); - } - 75% { - transform: translateX(15px) translateY(-5px); - } -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - body::after { - background-size: 150px 75px; - } - - .container::before, - .container::after { - display: none; - } -} - -@media (max-width: 480px) { - body { - background: linear-gradient(135deg, #e8f5e8 0%, #d4f1d4 50%, #a8d5ba 100%); - animation: none; - } - - body::before, - body::after { - display: none; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/style.css deleted file mode 100755 index 5b15eec1..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/style.css +++ /dev/null @@ -1,412 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Microsoft YaHei', Arial, sans-serif; - line-height: 1.6; - color: #333; - min-height: 100vh; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; -} - -.header h1 { - color: #2d5a3d; - font-size: 2.5rem; - font-weight: 300; - margin-bottom: 10px; -} - -/* 搜索区域 */ -.search-section { - margin-bottom: 30px; -} - -.search-box { - display: flex; - justify-content: center; - gap: 10px; - max-width: 500px; - margin: 0 auto; -} - -#cityInput { - flex: 1; - padding: 12px 16px; - border: 2px solid #a8d5ba; - border-radius: 25px; - font-size: 16px; - outline: none; - transition: all 0.3s ease; - background: rgba(255, 255, 255, 0.9); -} - -#cityInput:focus { - border-color: #6bb77b; - box-shadow: 0 0 10px rgba(107, 183, 123, 0.3); -} - -#searchBtn { - padding: 12px 24px; - background: linear-gradient(135deg, #6bb77b, #5a9f6a); - color: white; - border: none; - border-radius: 25px; - font-size: 16px; - cursor: pointer; - transition: all 0.3s ease; - white-space: nowrap; -} - -#searchBtn:hover { - background: linear-gradient(135deg, #5a9f6a, #4a8759); - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(107, 183, 123, 0.4); -} - -/* 加载动画 */ -.loading { - text-align: center; - padding: 40px; -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #e8f5e8; - border-top: 4px solid #6bb77b; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 天气容器 */ -.weather-container { - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); - backdrop-filter: blur(10px); - border: 1px solid rgba(168, 213, 186, 0.3); -} - -/* 位置信息 */ -.location-info { - text-align: center; - margin-bottom: 30px; - padding-bottom: 20px; - border-bottom: 2px solid #e8f5e8; -} - -.location-info h2 { - color: #2d5a3d; - font-size: 2rem; - margin-bottom: 5px; -} - -.location-info p { - color: #666; - font-size: 14px; -} - -/* 当前天气 */ -.current-weather { - margin-bottom: 30px; -} - -.weather-main { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 25px; -} - -.temperature { - font-size: 4rem; - font-weight: 300; - color: #2d5a3d; -} - -.unit { - font-size: 2rem; - color: #6bb77b; -} - -.weather-desc p:first-child { - font-size: 1.5rem; - color: #2d5a3d; - margin-bottom: 5px; -} - -.weather-desc p:last-child { - color: #666; - font-size: 14px; -} - -/* 更新时间 */ -.update-time { - text-align: center; - margin-top: 30px; - padding-top: 20px; - border-top: 1px solid #e8f5e8; - color: #666; - font-size: 14px; -} - -/* 错误信息 */ -.error-message { - text-align: center; - padding: 40px; - background: rgba(255, 107, 107, 0.1); - border-radius: 15px; - border: 1px solid rgba(255, 107, 107, 0.2); - color: #d63031; -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 25px; - } - - .header h1 { - font-size: 2.2rem; - } - - .temperature { - font-size: 3.5rem; - } - - .index-grid { - grid-template-columns: repeat(2, 1fr); - } -} - -/* 电脑端适配 (1024px+) */ -@media (min-width: 1024px) { - .container { - padding: 40px; - } - - .weather-container { - padding: 40px; - } - - .weather-main { - justify-content: space-around; - } - - .index-grid { - grid-template-columns: repeat(3, 1fr); - } - - .search-box { - max-width: 600px; - } -} - -/* 手机端适配 (768px以下) */ -@media (max-width: 767px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2rem; - } - - .search-box { - flex-direction: column; - gap: 15px; - } - - #searchBtn { - padding: 14px 24px; - } - - .weather-container { - padding: 20px; - margin: 0 -5px; - } - - .weather-main { - flex-direction: column; - text-align: center; - gap: 20px; - } - - .temperature { - font-size: 3rem; - } - - .index-grid { - grid-template-columns: 1fr; - gap: 15px; - } - - .index-item { - padding: 15px; - } - - .index-icon { - font-size: 1.5rem; - width: 40px; - margin-right: 12px; - } -} - -/* 超小屏幕适配 (480px以下) */ -@media (max-width: 480px) { - .container { - padding: 10px; - } - - .header h1 { - font-size: 1.8rem; - } - - .weather-container { - padding: 15px; - border-radius: 15px; - } - - .temperature { - font-size: 2.5rem; - } -} - -/* 预报区域样式 */ -.forecast-section { - margin-top: 30px; - padding: 20px; - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - backdrop-filter: blur(10px); - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); -} - -.forecast-section h3 { - color: #2d5a3d; - font-size: 1.5rem; - margin-bottom: 20px; - text-align: center; -} - -.forecast-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 15px; -} - -.forecast-item { - background: rgba(255, 255, 255, 0.8); - border-radius: 15px; - padding: 15px; - text-align: center; - border: 1px solid rgba(168, 213, 186, 0.3); - transition: all 0.3s ease; -} - -.forecast-item:hover { - transform: translateY(-5px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); -} - -.forecast-date { - font-weight: bold; - color: #2d5a3d; - margin-bottom: 10px; - font-size: 1.1rem; -} - -.forecast-weather { - margin-bottom: 10px; -} - -.weather-day { - color: #666; - font-size: 0.9rem; -} - -.weather-night { - color: #888; - font-size: 0.85rem; -} - -.forecast-temp { - margin-bottom: 10px; - display: flex; - justify-content: center; - gap: 10px; -} - -.temp-high { - color: #ff6b6b; - font-weight: bold; - font-size: 1.2rem; -} - -.temp-low { - color: #4ecdc4; - font-size: 1rem; -} - -.forecast-wind { - color: #666; - font-size: 0.85rem; - margin-bottom: 5px; -} - -.forecast-humidity { - color: #888; - font-size: 0.8rem; -} - -/* 预报区域响应式设计 */ -@media (max-width: 768px) { - .forecast-grid { - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: 10px; - } - - .forecast-item { - padding: 12px; - } - - .forecast-date { - font-size: 1rem; - } - - .temp-high { - font-size: 1.1rem; - } -} - -@media (max-width: 480px) { - .forecast-section { - padding: 15px; - } - - .forecast-grid { - grid-template-columns: repeat(2, 1fr); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/index.html b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/index.html deleted file mode 100755 index cb04b615..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/index.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - 天气预报 - - - - -
-
-

天气预报

-
- -
- -
- - - - - - -
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/js/script.js deleted file mode 100755 index 375275cc..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/js/script.js +++ /dev/null @@ -1,260 +0,0 @@ -// 天气查询应用 -class WeatherApp { - constructor() { - this.apiEndpoints = [ - "https://60s.api.shumengya.top/v2/weather/forecast", - "https://60s-cf.viki.moe/v2/weather/forecast" - ]; - this.currentEndpointIndex = 0; - this.init(); - } - - init() { - this.bindEvents(); - // 页面加载时自动查询北京天气 - this.searchWeather('北京'); - } - - bindEvents() { - const searchBtn = document.getElementById('searchBtn'); - const cityInput = document.getElementById('cityInput'); - - searchBtn.addEventListener('click', () => { - const city = cityInput.value.trim(); - if (city) { - this.searchWeather(city); - } else { - this.showError('请输入城市名称'); - } - }); - - cityInput.addEventListener('keypress', (e) => { - if (e.key === 'Enter') { - const city = cityInput.value.trim(); - if (city) { - this.searchWeather(city); - } else { - this.showError('请输入城市名称'); - } - } - }); - - // 防止输入框为空时查询 - cityInput.addEventListener('input', () => { - const searchBtn = document.getElementById('searchBtn'); - searchBtn.disabled = !cityInput.value.trim(); - }); - } - - async searchWeather(city) { - this.showLoading(); - - for (let i = 0; i < this.apiEndpoints.length; i++) { - try { - const endpoint = this.apiEndpoints[this.currentEndpointIndex]; - const response = await this.fetchWeatherData(endpoint, city); - - if (response && response.code === 200) { - this.displayWeatherData(response.data); - return; - } - } catch (error) { - console.warn(`API ${this.apiEndpoints[this.currentEndpointIndex]} 请求失败:`, error); - } - - // 切换到下一个API端点 - this.currentEndpointIndex = (this.currentEndpointIndex + 1) % this.apiEndpoints.length; - } - - // 所有API都失败了 - this.showError('获取天气信息失败,请检查网络连接或稍后重试'); - } - - async fetchWeatherData(endpoint, city) { - const url = `${endpoint}?query=${encodeURIComponent(city)}`; - - const response = await fetch(url, { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - timeout: 10000 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - - return await response.json(); - } - - displayWeatherData(data) { - const { location, daily_forecast, hourly_forecast } = data; - - // 显示位置信息 - document.getElementById('locationName').textContent = location.name || '未知位置'; - document.getElementById('locationDetail').textContent = - `${location.province || ''} ${location.city || ''} ${location.county || ''}`.trim(); - - // 使用第一天的预报数据作为当前天气(今天的天气) - const todayWeather = daily_forecast && daily_forecast[0]; - - if (todayWeather) { - // 显示当前天气(使用今天的最高温度) - document.getElementById('temperature').textContent = todayWeather.max_temperature; - document.getElementById('weatherCondition').textContent = - `${todayWeather.day_condition} 转 ${todayWeather.night_condition}`; - - // 体感温度(使用温度范围) - document.getElementById('feelsLike').textContent = - `温度范围 ${todayWeather.min_temperature}°C - ${todayWeather.max_temperature}°C`; - } else { - // 如果没有日预报数据,尝试使用小时预报数据 - const currentHour = hourly_forecast && hourly_forecast[0]; - if (currentHour) { - document.getElementById('temperature').textContent = currentHour.temperature; - document.getElementById('weatherCondition').textContent = currentHour.condition; - document.getElementById('feelsLike').textContent = - `风向: ${currentHour.wind_direction} ${currentHour.wind_power}`; - } - } - - // 显示更新时间(使用当前时间) - document.getElementById('updateTime').textContent = - `${this.formatDate(new Date())} (基于预报数据)`; - - // 显示天气预报 - this.displayForecast(daily_forecast || []); - - this.showWeatherContainer(); - } - - displayForecast(forecast) { - const forecastGrid = document.getElementById('forecastGrid'); - forecastGrid.innerHTML = ''; - - if (!forecast || forecast.length === 0) { - forecastGrid.innerHTML = '
暂无预报数据
'; - return; - } - - forecast.forEach((day, index) => { - const forecastItem = document.createElement('div'); - forecastItem.className = 'forecast-item'; - - // 格式化日期显示 - const dateStr = day.date || ''; - const dateDesc = this.formatDateDesc(dateStr); - - forecastItem.innerHTML = ` -
${dateDesc}
-
-
${day.day_condition || '未知'}
-
${day.night_condition || '未知'}
-
-
- ${day.max_temperature || '--'}° - ${day.min_temperature || '--'}° -
-
-
${day.day_wind_direction || ''} ${day.day_wind_power || ''}
-
-
空气质量: ${day.air_quality || '未知'}
- `; - - forecastGrid.appendChild(forecastItem); - }); - } - - // 华氏度转摄氏度 - fahrenheitToCelsius(fahrenheit) { - const celsius = (fahrenheit - 32) * 5 / 9; - return Math.round(celsius * 10) / 10; // 保留一位小数 - } - - // 格式化时间 - formatDate(date) { - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - - return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; - } - - // 格式化日期描述 - formatDateDesc(dateStr) { - if (!dateStr) return '未知日期'; - - try { - const date = new Date(dateStr); - const today = new Date(); - const tomorrow = new Date(today); - tomorrow.setDate(today.getDate() + 1); - - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - - // 判断是今天、明天还是其他日期 - if (date.toDateString() === today.toDateString()) { - return `今天 ${month}-${day}`; - } else if (date.toDateString() === tomorrow.toDateString()) { - return `明天 ${month}-${day}`; - } else { - const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; - const weekday = weekdays[date.getDay()]; - return `${weekday} ${month}-${day}`; - } - } catch (error) { - return dateStr; - } - } - - showLoading() { - document.getElementById('loading').style.display = 'block'; - document.getElementById('weatherContainer').style.display = 'none'; - document.getElementById('errorMessage').style.display = 'none'; - } - - showWeatherContainer() { - document.getElementById('loading').style.display = 'none'; - document.getElementById('weatherContainer').style.display = 'block'; - document.getElementById('errorMessage').style.display = 'none'; - } - - showError(message) { - document.getElementById('loading').style.display = 'none'; - document.getElementById('weatherContainer').style.display = 'none'; - const errorElement = document.getElementById('errorMessage'); - errorElement.style.display = 'block'; - errorElement.querySelector('p').textContent = message; - } -} - -// 页面加载完成后初始化应用 -document.addEventListener('DOMContentLoaded', () => { - new WeatherApp(); -}); - -// 添加页面可见性检测,当页面重新可见时刷新数据 -document.addEventListener('visibilitychange', () => { - if (!document.hidden) { - const cityInput = document.getElementById('cityInput'); - const city = cityInput.value.trim() || '北京'; - // 延迟1秒刷新,避免频繁请求 - setTimeout(() => { - if (window.weatherApp) { - window.weatherApp.searchWeather(city); - } - }, 1000); - } -}); - -// 将应用实例暴露到全局,方便调试和其他功能调用 -window.weatherApp = null; -document.addEventListener('DOMContentLoaded', () => { - window.weatherApp = new WeatherApp(); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/返回接口.json deleted file mode 100755 index aaf8f58d..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/返回接口.json +++ /dev/null @@ -1 +0,0 @@ -{"code":200,"message":"获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841","data":{"location":{"name":"北京北京","province":"北京省","city":"北京市","county":""},"hourly_forecast":[{"datetime":"2025-09-16 21:00","temperature":20,"condition":"多云","condition_code":"01","wind_direction":"东北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/01.png"},{"datetime":"2025-09-16 22:00","temperature":19,"condition":"多云","condition_code":"01","wind_direction":"东北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/01.png"},{"datetime":"2025-09-16 23:00","temperature":19,"condition":"晴","condition_code":"00","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-17 00:00","temperature":17,"condition":"晴","condition_code":"00","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-17 01:00","temperature":17,"condition":"晴","condition_code":"00","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-17 02:00","temperature":16,"condition":"晴","condition_code":"00","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-17 03:00","temperature":15,"condition":"晴","condition_code":"00","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-17 04:00","temperature":14,"condition":"多云","condition_code":"01","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/01.png"},{"datetime":"2025-09-17 05:00","temperature":14,"condition":"多云","condition_code":"01","wind_direction":"东北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/01.png"},{"datetime":"2025-09-17 06:00","temperature":15,"condition":"多云","condition_code":"01","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/01.png"},{"datetime":"2025-09-17 07:00","temperature":17,"condition":"多云","condition_code":"01","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/01.png"},{"datetime":"2025-09-17 08:00","temperature":18,"condition":"多云","condition_code":"01","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/01.png"},{"datetime":"2025-09-17 09:00","temperature":20,"condition":"多云","condition_code":"01","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/01.png"},{"datetime":"2025-09-17 10:00","temperature":21,"condition":"多云","condition_code":"01","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/01.png"},{"datetime":"2025-09-17 11:00","temperature":23,"condition":"晴","condition_code":"00","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-17 12:00","temperature":24,"condition":"晴","condition_code":"00","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-17 13:00","temperature":25,"condition":"晴","condition_code":"00","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-17 14:00","temperature":25,"condition":"晴","condition_code":"00","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-17 15:00","temperature":24,"condition":"晴","condition_code":"00","wind_direction":"东北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-17 16:00","temperature":23,"condition":"晴","condition_code":"00","wind_direction":"东风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-17 17:00","temperature":21,"condition":"晴","condition_code":"00","wind_direction":"东南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-17 18:00","temperature":20,"condition":"晴","condition_code":"00","wind_direction":"南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-17 19:00","temperature":18,"condition":"晴","condition_code":"00","wind_direction":"南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-17 20:00","temperature":17,"condition":"晴","condition_code":"00","wind_direction":"西南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-17 21:00","temperature":16,"condition":"晴","condition_code":"00","wind_direction":"西南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-17 22:00","temperature":15,"condition":"晴","condition_code":"00","wind_direction":"西风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-17 23:00","temperature":14,"condition":"晴","condition_code":"00","wind_direction":"西风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-18 00:00","temperature":14,"condition":"晴","condition_code":"00","wind_direction":"西风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-18 01:00","temperature":14,"condition":"晴","condition_code":"00","wind_direction":"西北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-18 02:00","temperature":14,"condition":"晴","condition_code":"00","wind_direction":"西北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-18 03:00","temperature":14,"condition":"晴","condition_code":"00","wind_direction":"西南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-18 04:00","temperature":13,"condition":"晴","condition_code":"00","wind_direction":"东南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-18 05:00","temperature":13,"condition":"晴","condition_code":"00","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-18 06:00","temperature":14,"condition":"晴","condition_code":"00","wind_direction":"东南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 07:00","temperature":15,"condition":"晴","condition_code":"00","wind_direction":"西南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 08:00","temperature":17,"condition":"晴","condition_code":"00","wind_direction":"北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 09:00","temperature":19,"condition":"晴","condition_code":"00","wind_direction":"西风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 10:00","temperature":21,"condition":"晴","condition_code":"00","wind_direction":"东南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 11:00","temperature":24,"condition":"晴","condition_code":"00","wind_direction":"东北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 12:00","temperature":24,"condition":"晴","condition_code":"00","wind_direction":"东北风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 13:00","temperature":24,"condition":"晴","condition_code":"00","wind_direction":"东风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 14:00","temperature":25,"condition":"晴","condition_code":"00","wind_direction":"东南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 15:00","temperature":25,"condition":"晴","condition_code":"00","wind_direction":"东南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 16:00","temperature":25,"condition":"晴","condition_code":"00","wind_direction":"南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 17:00","temperature":25,"condition":"晴","condition_code":"00","wind_direction":"南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 18:00","temperature":24,"condition":"晴","condition_code":"00","wind_direction":"南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png"},{"datetime":"2025-09-18 19:00","temperature":22,"condition":"晴","condition_code":"00","wind_direction":"南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"datetime":"2025-09-18 20:00","temperature":21,"condition":"晴","condition_code":"00","wind_direction":"南风","wind_power":"1-3","weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"}],"daily_forecast":[{"date":"2025-09-15","day_condition":"小雨","day_condition_code":"07","night_condition":"雷阵雨","night_condition_code":"04","max_temperature":24,"min_temperature":19,"day_wind_direction":"西北风","day_wind_power":"3-4","night_wind_direction":"北风","night_wind_power":"1-3","aqi":10,"aqi_level":1,"air_quality":"优","day_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/07.png","night_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/04.png"},{"date":"2025-09-16","day_condition":"阴","day_condition_code":"02","night_condition":"多云","night_condition_code":"01","max_temperature":25,"min_temperature":13,"day_wind_direction":"北风","day_wind_power":"3-4","night_wind_direction":"东北风","night_wind_power":"1-3","aqi":14,"aqi_level":1,"air_quality":"优","day_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/02.png","night_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/01.png"},{"date":"2025-09-17","day_condition":"晴","day_condition_code":"00","night_condition":"晴","night_condition_code":"00","max_temperature":26,"min_temperature":13,"day_wind_direction":"北风","day_wind_power":"1-3","night_wind_direction":"西风","night_wind_power":"1-3","aqi":34,"aqi_level":1,"air_quality":"优","day_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png","night_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/00.png"},{"date":"2025-09-18","day_condition":"晴","day_condition_code":"00","night_condition":"多云","night_condition_code":"01","max_temperature":26,"min_temperature":15,"day_wind_direction":"南风","day_wind_power":"1-3","night_wind_direction":"西南风","night_wind_power":"1-3","aqi":63,"aqi_level":2,"air_quality":"良","day_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/00.png","night_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/01.png"},{"date":"2025-09-19","day_condition":"多云","day_condition_code":"01","night_condition":"多云","night_condition_code":"01","max_temperature":24,"min_temperature":17,"day_wind_direction":"西南风","day_wind_power":"1-3","night_wind_direction":"西南风","night_wind_power":"1-3","aqi":42,"aqi_level":1,"air_quality":"优","day_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/01.png","night_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/01.png"},{"date":"2025-09-20","day_condition":"多云","day_condition_code":"01","night_condition":"多云","night_condition_code":"01","max_temperature":24,"min_temperature":16,"day_wind_direction":"西南风","day_wind_power":"1-3","night_wind_direction":"北风","night_wind_power":"1-3","aqi":48,"aqi_level":1,"air_quality":"优","day_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/01.png","night_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/01.png"},{"date":"2025-09-21","day_condition":"多云","day_condition_code":"01","night_condition":"多云","night_condition_code":"01","max_temperature":25,"min_temperature":17,"day_wind_direction":"东北风","day_wind_power":"1-3","night_wind_direction":"东北风","night_wind_power":"1-3","aqi":55,"aqi_level":2,"air_quality":"良","day_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/baitian/01.png","night_weather_icon":"https://mat1.gtimg.com/qqcdn/xw/tianqi/smallIcon/heiye/01.png"}],"sunrise_sunset":[{"sunrise":"2025-09-16 05:56:00","sunrise_at":1757973360000,"sunrise_desc":"05:56","sunset":"2025-09-16 18:23:00","sunset_at":1758018180000,"sunset_desc":"18:23"},{"sunrise":"2025-09-17 05:57:00","sunrise_at":1758059820000,"sunrise_desc":"05:57","sunset":"2025-09-17 18:21:00","sunset_at":1758104460000,"sunset_desc":"18:21"},{"sunrise":"2025-09-18 05:58:00","sunrise_at":1758146280000,"sunrise_desc":"05:58","sunset":"2025-09-18 18:19:00","sunset_at":1758190740000,"sunset_desc":"18:19"},{"sunrise":"2025-09-19 05:58:00","sunrise_at":1758232680000,"sunrise_desc":"05:58","sunset":"2025-09-19 18:18:00","sunset_at":1758277080000,"sunset_desc":"18:18"},{"sunrise":"2025-09-20 05:59:00","sunrise_at":1758319140000,"sunrise_desc":"05:59","sunset":"2025-09-20 18:16:00","sunset_at":1758363360000,"sunset_desc":"18:16"},{"sunrise":"2025-09-21 06:00:00","sunrise_at":1758405600000,"sunrise_desc":"06:00","sunset":"2025-09-21 18:14:00","sunset_at":1758449640000,"sunset_desc":"18:14"},{"sunrise":"2025-09-22 06:01:00","sunrise_at":1758492060000,"sunrise_desc":"06:01","sunset":"2025-09-22 18:13:00","sunset_at":1758535980000,"sunset_desc":"18:13"}]}} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/实时天气.html b/InfoGenie-frontend/public/60sapi/实用功能/实时天气.html new file mode 100644 index 00000000..8e3db0aa --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/实时天气.html @@ -0,0 +1,64 @@ + + + + +实时天气 + + + + + +
+ +

🌤️ 实时天气

+
+
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/background.css b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/background.css deleted file mode 100755 index d52321e6..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/background.css +++ /dev/null @@ -1,202 +0,0 @@ -/* 背景样式文件 - 独立管理背景相关CSS */ - -/* 主体背景 */ -body { - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc8 50%, #f0f4c3 100%); - background-attachment: fixed; - background-size: cover; - position: relative; -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(120, 219, 226, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(168, 230, 207, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(220, 237, 200, 0.1) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 动态背景效果 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.05) 50%, transparent 70%), - linear-gradient(-45deg, transparent 30%, rgba(168, 230, 207, 0.05) 50%, transparent 70%); - background-size: 200px 200px; - animation: backgroundMove 20s linear infinite; - pointer-events: none; - z-index: -1; -} - -/* 背景动画 */ -@keyframes backgroundMove { - 0% { - background-position: 0 0, 0 0; - } - 100% { - background-position: 200px 200px, -200px -200px; - } -} - -/* 容器背景 */ -.container { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(5px); - border-radius: 20px; - border: 1px solid rgba(255, 255, 255, 0.2); -} - -/* 卡片背景增强 */ -.weather-card { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(15px); - border: 1px solid rgba(168, 230, 207, 0.3); - box-shadow: - 0 10px 30px rgba(0, 0, 0, 0.1), - 0 1px 8px rgba(168, 230, 207, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.8); -} - -/* 当前天气区域背景 */ -.current-weather { - background: linear-gradient(135deg, - rgba(168, 230, 207, 0.8) 0%, - rgba(220, 237, 200, 0.8) 50%, - rgba(240, 244, 195, 0.8) 100%); - backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.3); - box-shadow: - 0 4px 15px rgba(39, 174, 96, 0.1), - inset 0 1px 0 rgba(255, 255, 255, 0.6); -} - -/* 详情项背景 */ -.detail-item { - background: linear-gradient(135deg, - rgba(168, 230, 207, 0.1) 0%, - rgba(255, 255, 255, 0.1) 100%); - backdrop-filter: blur(5px); - border: 1px solid rgba(168, 230, 207, 0.2); - box-shadow: 0 2px 8px rgba(39, 174, 96, 0.05); -} - -/* 生活指数项背景 */ -.index-item { - background: linear-gradient(135deg, - rgba(168, 230, 207, 0.05) 0%, - rgba(255, 255, 255, 0.1) 100%); - backdrop-filter: blur(5px); - border: 1px solid rgba(168, 230, 207, 0.15); - box-shadow: 0 2px 10px rgba(39, 174, 96, 0.05); -} - -.index-item:hover { - background: linear-gradient(135deg, - rgba(168, 230, 207, 0.1) 0%, - rgba(255, 255, 255, 0.15) 100%); - box-shadow: 0 5px 20px rgba(39, 174, 96, 0.1); -} - -/* 输入框背景 */ -#cityInput { - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(10px); - border: 2px solid rgba(168, 230, 207, 0.6); - box-shadow: 0 2px 10px rgba(39, 174, 96, 0.1); -} - -#cityInput:focus { - background: rgba(255, 255, 255, 0.95); - box-shadow: - 0 0 15px rgba(39, 174, 96, 0.2), - 0 2px 10px rgba(39, 174, 96, 0.1); -} - -/* 按钮背景 */ -#searchBtn { - background: linear-gradient(135deg, - #27ae60 0%, - #2ecc71 50%, - #58d68d 100%); - box-shadow: - 0 4px 15px rgba(39, 174, 96, 0.3), - inset 0 1px 0 rgba(255, 255, 255, 0.2); -} - -#searchBtn:hover { - background: linear-gradient(135deg, - #229954 0%, - #27ae60 50%, - #52c370 100%); - box-shadow: - 0 6px 20px rgba(39, 174, 96, 0.4), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -/* 错误消息背景 */ -.error-message { - background: linear-gradient(135deg, - rgba(231, 76, 60, 0.1) 0%, - rgba(255, 255, 255, 0.1) 100%); - backdrop-filter: blur(10px); - border: 1px solid rgba(231, 76, 60, 0.2); - box-shadow: 0 4px 15px rgba(231, 76, 60, 0.1); -} - -/* 加载状态背景 */ -.loading { - background: rgba(255, 255, 255, 0.8); - backdrop-filter: blur(10px); - border-radius: 15px; - border: 1px solid rgba(168, 230, 207, 0.3); - box-shadow: 0 4px 15px rgba(39, 174, 96, 0.1); -} - -/* 移动端背景优化 */ -@media (max-width: 767px) { - body::after { - background-size: 100px 100px; - animation-duration: 15s; - } - - .container { - background: rgba(255, 255, 255, 0.05); - backdrop-filter: blur(3px); - } - - .weather-card { - backdrop-filter: blur(10px); - } -} - -/* 高性能设备背景增强 */ -@media (min-width: 1024px) { - body::before { - background-image: - radial-gradient(circle at 20% 80%, rgba(120, 219, 226, 0.15) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(168, 230, 207, 0.15) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(220, 237, 200, 0.15) 0%, transparent 50%), - radial-gradient(circle at 60% 70%, rgba(240, 244, 195, 0.1) 0%, transparent 50%); - } - - .weather-card { - backdrop-filter: blur(20px); - } - - .current-weather { - backdrop-filter: blur(15px); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/index.html b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/index.html deleted file mode 100755 index 50672d90..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/index.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - 实时天气查询 - - - - -
-
-

实时天气

- -
- -
-
正在加载天气数据...
- - - - -
-
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/script.js b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/script.js deleted file mode 100755 index c1a3055f..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/script.js +++ /dev/null @@ -1,354 +0,0 @@ -// 天气应用主要功能 -class WeatherApp { - constructor() { - this.apiUrl = 'https://60s.api.shumengya.top/v2/weather'; - this.init(); - } - - init() { - this.bindEvents(); - this.loadWeather('北京'); // 默认加载北京天气 - } - - bindEvents() { - const searchBtn = document.getElementById('searchBtn'); - const cityInput = document.getElementById('cityInput'); - - // 搜索按钮点击事件 - searchBtn.addEventListener('click', () => { - const city = cityInput.value.trim(); - if (city) { - this.loadWeather(city); - } - }); - - // 输入框回车事件 - cityInput.addEventListener('keypress', (e) => { - if (e.key === 'Enter') { - const city = cityInput.value.trim(); - if (city) { - this.loadWeather(city); - } - } - }); - } - - async loadWeather(city) { - this.showLoading(); - - try { - const response = await fetch(`${this.apiUrl}?query=${encodeURIComponent(city)}`); - - if (!response.ok) { - throw new Error(`HTTP错误: ${response.status}`); - } - - const data = await response.json(); - console.log('完整API响应:', data); // 调试日志 - - if (data.code === 200 && data.data) { - this.displayWeather(data.data); - this.hideLoading(); - } else { - throw new Error(data.message || `API返回错误: code=${data.code}`); - } - } catch (error) { - console.error('获取天气数据失败:', error); - console.error('错误详情:', { - message: error.message, - stack: error.stack - }); - this.showError(error.message); - this.hideLoading(); - } - } - - showLoading() { - document.getElementById('loading').style.display = 'block'; - document.getElementById('weatherCard').style.display = 'none'; - document.getElementById('errorMessage').style.display = 'none'; - } - - hideLoading() { - document.getElementById('loading').style.display = 'none'; - } - - showError(message = '获取天气数据失败,请检查网络连接或稍后重试') { - const errorElement = document.getElementById('errorMessage'); - const errorText = errorElement.querySelector('p'); - - if (errorText) { - errorText.textContent = message; - } - - errorElement.style.display = 'block'; - document.getElementById('weatherCard').style.display = 'none'; - } - - displayWeather(data) { - console.log('API返回数据:', data); // 调试日志 - - // 根据实际API结构解构数据 - const location = data.location || {}; - const realtime = data.realtime || {}; - const air_quality = realtime.air_quality || {}; - const life_indices = realtime.life_indices || []; - - // 显示位置信息 - const locationName = location.formatted || location.city || location.name || '未知位置'; - document.getElementById('locationName').textContent = locationName; - - const updateTime = realtime.updated || '未知时间'; - document.getElementById('updateTime').textContent = `更新时间: ${updateTime}`; - - // 显示当前天气 - const temperature = realtime.temperature !== undefined ? realtime.temperature : '--'; - document.getElementById('temperature').textContent = `${temperature}°C`; - - const condition = realtime.weather || realtime.weather_desc || '未知'; - document.getElementById('weatherDesc').textContent = condition; - document.getElementById('weatherIcon').textContent = this.getWeatherIcon(condition); - - // 显示天气详情 - const feelsLike = realtime.temperature_feels_like !== undefined ? realtime.temperature_feels_like : temperature; - document.getElementById('feelsLike').textContent = `${feelsLike}°C`; - - const humidity = realtime.humidity !== undefined ? realtime.humidity : '--'; - document.getElementById('humidity').textContent = `${humidity}%`; - - const windDirection = realtime.wind_direction || '--'; - document.getElementById('windDirection').textContent = windDirection; - - const windPower = realtime.wind_power || realtime.wind_strength || '--'; - document.getElementById('windStrength').textContent = windPower; - - const pressure = realtime.pressure !== undefined ? realtime.pressure : '--'; - document.getElementById('pressure').textContent = `${pressure} hPa`; - - document.getElementById('visibility').textContent = '--'; // API中没有能见度数据 - - const aqi = air_quality.aqi !== undefined ? air_quality.aqi : '--'; - document.getElementById('aqi').textContent = `AQI ${aqi}`; - - const pm25 = air_quality.pm25 !== undefined ? air_quality.pm25 : '--'; - document.getElementById('pm25').textContent = `${pm25} μg/m³`; - - // 显示生活指数 - if (life_indices && life_indices.length > 0) { - this.displayLifeIndex(life_indices); - } else { - // 如果没有生活指数数据,重置显示 - this.resetLifeIndex(); - } - - // 显示天气卡片 - document.getElementById('weatherCard').style.display = 'block'; - } - - displayLifeIndex(lifeIndices) { - const indexMap = { - comfort: { level: 'comfortLevel', desc: 'comfortDesc' }, - clothes: { level: 'clothingLevel', desc: 'clothingDesc' }, - umbrella: { level: 'umbrellaLevel', desc: 'umbrellaDesc' }, - ultraviolet: { level: 'uvLevel', desc: 'uvDesc' }, - carwash: { level: 'carWashLevel', desc: 'carWashDesc' }, - tourism: { level: 'travelLevel', desc: 'travelDesc' }, - sports: { level: 'sportLevel', desc: 'sportDesc' } - }; - - // 重置所有指数显示 - this.resetLifeIndex(); - - // 根据新的API数据结构更新生活指数 - if (Array.isArray(lifeIndices)) { - lifeIndices.forEach(index => { - if (index && index.key && indexMap[index.key]) { - const { level, desc } = indexMap[index.key]; - const levelElement = document.getElementById(level); - const descElement = document.getElementById(desc); - - if (levelElement) levelElement.textContent = index.level || '--'; - if (descElement) descElement.textContent = index.description || '--'; - } - }); - } - } - - resetLifeIndex() { - const indexMap = { - comfort: { level: 'comfortLevel', desc: 'comfortDesc' }, - clothes: { level: 'clothingLevel', desc: 'clothingDesc' }, - umbrella: { level: 'umbrellaLevel', desc: 'umbrellaDesc' }, - ultraviolet: { level: 'uvLevel', desc: 'uvDesc' }, - carwash: { level: 'carWashLevel', desc: 'carWashDesc' }, - tourism: { level: 'travelLevel', desc: 'travelDesc' }, - sports: { level: 'sportLevel', desc: 'sportDesc' } - }; - - Object.values(indexMap).forEach(({ level, desc }) => { - const levelElement = document.getElementById(level); - const descElement = document.getElementById(desc); - - if (levelElement) levelElement.textContent = '--'; - if (descElement) descElement.textContent = '--'; - }); - } - - getWeatherIcon(weather) { - const iconMap = { - '晴': '☀️', - '多云': '⛅', - '阴': '☁️', - '小雨': '🌦️', - '中雨': '🌧️', - '大雨': '⛈️', - '雷阵雨': '⛈️', - '雪': '❄️', - '小雪': '🌨️', - '中雪': '❄️', - '大雪': '❄️', - '雾': '🌫️', - '霾': '😷', - '沙尘暴': '🌪️' - }; - - // 查找匹配的天气图标 - for (const [key, icon] of Object.entries(iconMap)) { - if (weather.includes(key)) { - return icon; - } - } - - // 默认图标 - return '🌤️'; - } - - // 获取空气质量等级颜色 - getAQIColor(aqi) { - if (aqi <= 50) return '#00e400'; - if (aqi <= 100) return '#ffff00'; - if (aqi <= 150) return '#ff7e00'; - if (aqi <= 200) return '#ff0000'; - if (aqi <= 300) return '#8f3f97'; - return '#7e0023'; - } - - // 格式化时间 - formatTime(timeString) { - try { - const date = new Date(timeString); - return date.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit' - }); - } catch (error) { - return timeString; - } - } -} - -// 页面加载完成后初始化应用 -document.addEventListener('DOMContentLoaded', () => { - new WeatherApp(); -}); - -// 添加一些实用的工具函数 -const utils = { - // 防抖函数 - debounce(func, wait) { - let timeout; - return function executedFunction(...args) { - const later = () => { - clearTimeout(timeout); - func(...args); - }; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; - }, - - // 节流函数 - throttle(func, limit) { - let inThrottle; - return function() { - const args = arguments; - const context = this; - if (!inThrottle) { - func.apply(context, args); - inThrottle = true; - setTimeout(() => inThrottle = false, limit); - } - }; - }, - - // 检查网络状态 - checkNetworkStatus() { - return navigator.onLine; - }, - - // 显示提示消息 - showToast(message, type = 'info') { - const toast = document.createElement('div'); - toast.className = `toast toast-${type}`; - toast.textContent = message; - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - padding: 12px 20px; - background: ${type === 'error' ? '#e74c3c' : '#27ae60'}; - color: white; - border-radius: 8px; - z-index: 1000; - animation: slideIn 0.3s ease; - `; - - document.body.appendChild(toast); - - setTimeout(() => { - toast.style.animation = 'slideOut 0.3s ease'; - setTimeout(() => { - document.body.removeChild(toast); - }, 300); - }, 3000); - } -}; - -// 添加CSS动画 -const style = document.createElement('style'); -style.textContent = ` - @keyframes slideIn { - from { - transform: translateX(100%); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } - } - - @keyframes slideOut { - from { - transform: translateX(0); - opacity: 1; - } - to { - transform: translateX(100%); - opacity: 0; - } - } -`; -document.head.appendChild(style); - -// 网络状态监听 -window.addEventListener('online', () => { - utils.showToast('网络连接已恢复', 'success'); -}); - -window.addEventListener('offline', () => { - utils.showToast('网络连接已断开', 'error'); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/styles.css b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/styles.css deleted file mode 100755 index 48d72491..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/styles.css +++ /dev/null @@ -1,442 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #2c3e50; - min-height: 100vh; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; -} - -.header h1 { - font-size: 2.5rem; - color: #27ae60; - margin-bottom: 20px; - font-weight: 300; - text-shadow: 0 2px 4px rgba(39, 174, 96, 0.1); -} - -.search-box { - display: flex; - justify-content: center; - gap: 10px; - margin-bottom: 20px; -} - -#cityInput { - padding: 12px 16px; - border: 2px solid #a8e6cf; - border-radius: 25px; - font-size: 16px; - outline: none; - background: rgba(255, 255, 255, 0.9); - transition: all 0.3s ease; - min-width: 200px; -} - -#cityInput:focus { - border-color: #27ae60; - box-shadow: 0 0 10px rgba(39, 174, 96, 0.2); -} - -#searchBtn { - padding: 12px 24px; - background: linear-gradient(135deg, #27ae60, #2ecc71); - color: white; - border: none; - border-radius: 25px; - font-size: 16px; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(39, 174, 96, 0.3); -} - -#searchBtn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(39, 174, 96, 0.4); -} - -#searchBtn:active { - transform: translateY(0); -} - -/* 主要内容区域 */ -.main-content { - display: flex; - justify-content: center; - align-items: flex-start; -} - -.loading { - text-align: center; - font-size: 18px; - color: #27ae60; - padding: 40px; -} - -.weather-card { - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - padding: 30px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); - backdrop-filter: blur(10px); - border: 1px solid rgba(168, 230, 207, 0.3); - width: 100%; - max-width: 800px; -} - -/* 位置信息 */ -.location-info { - text-align: center; - margin-bottom: 30px; - padding-bottom: 20px; - border-bottom: 2px solid #a8e6cf; -} - -.location-info h2 { - font-size: 2rem; - color: #27ae60; - margin-bottom: 10px; -} - -.location-info p { - color: #7f8c8d; - font-size: 14px; -} - -/* 当前天气 */ -.current-weather { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 30px; - padding: 20px; - background: linear-gradient(135deg, #a8e6cf, #dcedc8); - border-radius: 15px; -} - -.temperature-section { - display: flex; - flex-direction: column; - align-items: flex-start; -} - -.temperature { - font-size: 3.5rem; - font-weight: 300; - color: #27ae60; - line-height: 1; -} - -.weather-desc { - font-size: 1.2rem; - color: #2c3e50; - margin-top: 5px; -} - -.weather-icon { - font-size: 4rem; - opacity: 0.8; -} - -/* 天气详情 */ -.weather-details { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); - gap: 15px; - margin-bottom: 30px; -} - -.detail-item { - display: flex; - justify-content: space-between; - align-items: center; - padding: 15px; - background: rgba(168, 230, 207, 0.1); - border-radius: 10px; - border-left: 4px solid #27ae60; -} - -.detail-item .label { - color: #7f8c8d; - font-size: 14px; -} - -.detail-item .value { - color: #2c3e50; - font-weight: 500; - font-size: 16px; -} - -/* 生活指数 */ -.life-index h3 { - color: #27ae60; - margin-bottom: 20px; - font-size: 1.5rem; - text-align: center; -} - -.index-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: 20px; -} - -.index-item { - display: flex; - align-items: flex-start; - padding: 20px; - background: rgba(168, 230, 207, 0.05); - border-radius: 15px; - border: 1px solid rgba(168, 230, 207, 0.2); - transition: all 0.3s ease; -} - -.index-item:hover { - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(39, 174, 96, 0.1); -} - -.index-icon { - font-size: 2rem; - margin-right: 15px; - opacity: 0.8; -} - -.index-content { - flex: 1; -} - -.index-title { - font-weight: 500; - color: #2c3e50; - margin-bottom: 5px; -} - -.index-level { - color: #27ae60; - font-weight: 600; - margin-bottom: 5px; -} - -.index-desc { - color: #7f8c8d; - font-size: 14px; - line-height: 1.4; -} - -.error-message { - text-align: center; - padding: 40px; - color: #e74c3c; - background: rgba(231, 76, 60, 0.1); - border-radius: 15px; - border: 1px solid rgba(231, 76, 60, 0.2); -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 25px; - } - - .header h1 { - font-size: 2.8rem; - } - - .search-box { - max-width: 500px; - margin: 0 auto 20px; - } - - .weather-details { - grid-template-columns: repeat(2, 1fr); - } - - .index-grid { - grid-template-columns: repeat(2, 1fr); - } - - .current-weather { - padding: 25px; - } - - .temperature { - font-size: 4rem; - } -} - -/* 电脑端适配 (1024px+) */ -@media (min-width: 1024px) { - .container { - padding: 40px; - } - - .header h1 { - font-size: 3.2rem; - } - - .search-box { - max-width: 600px; - margin: 0 auto 30px; - } - - .weather-card { - padding: 40px; - } - - .weather-details { - grid-template-columns: repeat(4, 1fr); - } - - .index-grid { - grid-template-columns: repeat(3, 1fr); - } - - .current-weather { - padding: 30px; - } - - .temperature { - font-size: 4.5rem; - } - - .index-item { - padding: 25px; - } -} - -/* 手机端适配 (优先优化) */ -@media (max-width: 767px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2rem; - margin-bottom: 15px; - } - - .search-box { - flex-direction: column; - align-items: center; - gap: 15px; - } - - #cityInput { - width: 100%; - max-width: 300px; - font-size: 16px; - } - - #searchBtn { - width: 100%; - max-width: 300px; - padding: 14px 24px; - } - - .weather-card { - padding: 20px; - margin: 0; - } - - .current-weather { - flex-direction: column; - text-align: center; - gap: 20px; - padding: 20px; - } - - .temperature { - font-size: 3rem; - } - - .weather-icon { - font-size: 3rem; - } - - .weather-details { - grid-template-columns: 1fr; - gap: 10px; - } - - .detail-item { - padding: 12px; - } - - .index-grid { - grid-template-columns: 1fr; - gap: 15px; - } - - .index-item { - padding: 15px; - } - - .index-icon { - font-size: 1.5rem; - margin-right: 10px; - } - - .life-index h3 { - font-size: 1.3rem; - margin-bottom: 15px; - } - - .location-info h2 { - font-size: 1.5rem; - } -} - -/* 超小屏幕适配 */ -@media (max-width: 480px) { - .container { - padding: 10px; - } - - .header h1 { - font-size: 1.8rem; - } - - .weather-card { - padding: 15px; - } - - .temperature { - font-size: 2.5rem; - } - - .current-weather { - padding: 15px; - } - - .detail-item { - padding: 10px; - font-size: 14px; - } - - .index-item { - padding: 12px; - } - - .index-desc { - font-size: 13px; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/返回接口.json deleted file mode 100755 index b4bb104b..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/返回接口.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "location": { - "province": "北京", - "city": "北京", - "town": "北京", - "formatted": "北京", - "location_id": "101010100", - "detail_url": "http://www.weather.com.cn/weather/101010100.shtml", - "is_province": true, - "is_city": false, - "is_town": false, - "area_code": "10", - "zip_code": "100000" - }, - "realtime": { - "weather": "晴转雷阵雨", - "weather_desc": "未知", - "weather_code": "d0", - "temperature": 999, - "temperature_feels_like": 75.6, - "humidity": 63, - "wind_direction": "南风", - "wind_strength": "3-4级转\u003C3级", - "wind_speed": "1km/h", - "pressure": 1006, - "visibility": "21km", - "aqi": 41, - "pm25": 41, - "rainfall": 0, - "rainfall_24h": 0, - "updated": "2025-09-08 08:00:00", - "updated_at": "20:30", - "life_index": { - "comfort": { - "level": "舒适", - "desc": "白天温度宜人,风力不大。" - }, - "clothing": { - "level": "舒适", - "desc": "建议穿长袖衬衫单裤等服装。" - }, - "umbrella": { - "level": "带伞", - "desc": "有降水,短时间出行不必带伞。" - }, - "uv": { - "level": "最弱", - "desc": "辐射弱,涂擦SPF8-12防晒护肤品。" - }, - "car_wash": { - "level": "不宜", - "desc": "有雨,雨水和泥水会弄脏爱车。" - }, - "travel": { - "level": "一般", - "desc": "可能有雷暴,外出请尽量避开降雨时段。" - }, - "sport": { - "level": "较不宜", - "desc": "有降水,推荐您在室内进行休闲运动。" - } - } - } - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测.html b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测.html new file mode 100644 index 00000000..cc0e72f5 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测.html @@ -0,0 +1,64 @@ + + + + +密码强度检测 + + + + + +
+ +

🔐 密码强度检测

+
+
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/css/style.css deleted file mode 100755 index 23f4dd41..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/css/style.css +++ /dev/null @@ -1,893 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -/* 隐藏滚动条但保留滚动功能 */ -html { - scrollbar-width: none; - -ms-overflow-style: none; -} - -body::-webkit-scrollbar, -html::-webkit-scrollbar, -*::-webkit-scrollbar { - display: none; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: #2c3e50; - min-height: 100vh; - overflow-x: hidden; - background: linear-gradient(135deg, #f0f8e8 0%, #e8f5e8 50%, #d4f4dd 100%); - scrollbar-width: none; - -ms-overflow-style: none; -} - -/* 容器布局 */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - padding: 40px 20px; - background: linear-gradient(135deg, #228B22 0%, #32CD32 100%); - border-radius: 20px; - box-shadow: 0 10px 30px rgba(34, 139, 34, 0.3); - color: white; -} - -.header h1 { - font-size: 2.8rem; - font-weight: 700; - margin-bottom: 15px; - text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); -} - -.subtitle { - font-size: 1.2rem; - opacity: 0.9; - font-weight: 400; -} - -/* 主内容区域 */ -.main-content { - flex: 1; - display: flex; - flex-direction: column; - gap: 30px; -} - -/* 输入容器 */ -.input-container { - background: #ffffff; - border-radius: 20px; - padding: 40px; - box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1); - border: 1px solid #e8ecf4; -} - -.input-group { - margin-bottom: 30px; -} - -.input-label { - display: block; - font-size: 1.1rem; - font-weight: 600; - color: #2c3e50; - margin-bottom: 15px; -} - -.password-input-wrapper { - position: relative; - margin-bottom: 15px; -} - -.password-input { - width: 100%; - padding: 18px 60px 18px 20px; - border: 2px solid #e8ecf4; - border-radius: 12px; - font-size: 1.1rem; - font-family: 'Courier New', monospace; - background: #f8fafc; - transition: all 0.3s ease; - letter-spacing: 1px; -} - -.password-input:focus { - outline: none; - border-color: #228B22; - background: #ffffff; - box-shadow: 0 0 0 4px rgba(34, 139, 34, 0.1); -} - -.password-input::placeholder { - color: #94a3b8; - letter-spacing: normal; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; -} - -.toggle-visibility { - position: absolute; - right: 15px; - top: 50%; - transform: translateY(-50%); - background: none; - border: none; - cursor: pointer; - padding: 8px; - border-radius: 6px; - color: #64748b; - transition: all 0.3s ease; -} - -.toggle-visibility:hover { - background: #f1f5f9; - color: #475569; -} - -.input-hint { - display: flex; - align-items: center; - gap: 8px; - color: #64748b; - font-size: 0.9rem; -} - -.hint-icon { - font-size: 1rem; -} - -/* 检测按钮 */ -.check-btn { - width: 100%; - background: linear-gradient(135deg, #228B22 0%, #32CD32 100%); - color: white; - border: none; - padding: 18px 32px; - border-radius: 12px; - font-size: 1.1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 20px rgba(34, 139, 34, 0.3); - display: flex; - align-items: center; - justify-content: center; - gap: 10px; - position: relative; - overflow: hidden; -} - -.check-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 25px rgba(34, 139, 34, 0.4); -} - -.check-btn:active { - transform: translateY(0); -} - -.check-btn:disabled { - opacity: 0.7; - cursor: not-allowed; - transform: none; -} - -.btn-icon { - font-size: 1.2rem; -} - -/* 结果容器 */ -.result-container { - background: #ffffff; - border-radius: 20px; - padding: 40px; - box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1); - border: 1px solid #e8ecf4; - animation: slideIn 0.5s ease-out; -} - -@keyframes slideIn { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 强度概览 */ -.strength-overview { - margin-bottom: 40px; - padding: 30px; - background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%); - border-radius: 16px; - border: 1px solid #e2e8f0; -} - -.strength-score { - display: flex; - align-items: center; - gap: 30px; - margin-bottom: 25px; -} - -.score-circle { - width: 120px; - height: 120px; - border-radius: 50%; - background: conic-gradient(from 0deg, #e2e8f0 0deg, #e2e8f0 360deg); - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - position: relative; - transition: all 0.5s ease; -} - -.score-circle::before { - content: ''; - position: absolute; - width: 90px; - height: 90px; - background: white; - border-radius: 50%; - z-index: 1; -} - -.score-value { - font-size: 2.5rem; - font-weight: 700; - color: #2c3e50; - z-index: 2; - position: relative; -} - -.score-label { - font-size: 0.9rem; - color: #64748b; - z-index: 2; - position: relative; -} - -.strength-info { - flex: 1; -} - -.strength-level { - font-size: 2rem; - font-weight: 700; - margin-bottom: 8px; - color: #2c3e50; -} - -.strength-description { - font-size: 1.1rem; - color: #64748b; - line-height: 1.5; -} - -.strength-bar { - margin-top: 20px; -} - -.bar-background { - width: 100%; - height: 12px; - background: #e2e8f0; - border-radius: 6px; - overflow: hidden; - margin-bottom: 10px; -} - -.bar-fill { - height: 100%; - background: linear-gradient(90deg, #90EE90, #98FB98, #32CD32, #228B22); - border-radius: 6px; - width: 0%; - transition: width 0.8s ease; -} - -.bar-labels { - display: flex; - justify-content: space-between; - font-size: 0.85rem; - color: #64748b; -} - -/* 详细信息网格 */ -.details-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: 25px; - margin-bottom: 30px; -} - -.detail-card { - background: #f8fafc; - border-radius: 16px; - padding: 25px; - border: 1px solid #e2e8f0; - transition: all 0.3s ease; -} - -.detail-card:hover { - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); -} - -.card-header { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 20px; -} - -.card-icon { - font-size: 1.5rem; -} - -.card-header h3 { - font-size: 1.3rem; - font-weight: 600; - color: #2c3e50; -} - -.card-content { - display: flex; - flex-direction: column; - gap: 15px; -} - -.info-row { - display: flex; - justify-content: space-between; - align-items: center; - padding: 12px 0; - border-bottom: 1px solid #e2e8f0; -} - -.info-row:last-child { - border-bottom: none; -} - -.info-label { - font-weight: 500; - color: #64748b; -} - -.info-value { - font-weight: 600; - color: #2c3e50; -} - -/* 字符类型分析 */ -.character-types { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 12px; - margin-bottom: 20px; -} - -.char-type { - display: flex; - align-items: center; - gap: 8px; - padding: 10px 12px; - background: white; - border-radius: 8px; - border: 1px solid #e2e8f0; - font-size: 0.9rem; -} - -.char-type.has-type { - background: #f0f8e8; - border-color: #d4f4dd; - color: #1e7e1e; -} - -.char-type.has-type .type-icon { - color: #228B22; -} - -.type-icon { - font-size: 1rem; -} - -.character-issues { - display: flex; - flex-direction: column; - gap: 8px; -} - -.issue-item { - display: flex; - align-items: center; - gap: 8px; - padding: 8px 12px; - background: #fef2f2; - border: 1px solid #fecaca; - border-radius: 8px; - color: #dc2626; - font-size: 0.9rem; -} - -.issue-item.hidden { - display: none; -} - -.issue-icon { - font-size: 1rem; -} - -/* 建议和提示区域 */ -.recommendations-section { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); - gap: 25px; -} - -.recommendations-card, -.security-tips-card { - background: #f8fafc; - border-radius: 16px; - padding: 25px; - border: 1px solid #e2e8f0; -} - -.recommendations-list { - list-style: none; - display: flex; - flex-direction: column; - gap: 12px; -} - -.recommendations-list li { - display: flex; - align-items: flex-start; - gap: 10px; - padding: 12px 16px; - background: white; - border-radius: 10px; - border: 1px solid #e2e8f0; - color: #2c3e50; - line-height: 1.5; -} - -.recommendations-list li::before { - content: '💡'; - font-size: 1rem; - margin-top: 2px; - flex-shrink: 0; -} - -.tips-container { - display: flex; - flex-direction: column; - gap: 12px; -} - -.tip-item { - display: flex; - align-items: flex-start; - gap: 12px; - padding: 12px 16px; - background: white; - border-radius: 10px; - border: 1px solid #e2e8f0; - color: #2c3e50; - line-height: 1.5; -} - -.tip-icon { - font-size: 1rem; - margin-top: 2px; - flex-shrink: 0; -} - -/* 错误容器 */ -.error-container { - background: #ffffff; - border-radius: 20px; - padding: 50px 40px; - text-align: center; - box-shadow: 0 10px 40px rgba(239, 68, 68, 0.1); - border: 1px solid #fecaca; -} - -.error-icon { - font-size: 4rem; - margin-bottom: 20px; -} - -.error-container h3 { - color: #dc2626; - margin-bottom: 15px; - font-size: 1.5rem; - font-weight: 600; -} - -.error-container p { - color: #64748b; - margin-bottom: 25px; - font-size: 1.1rem; -} - -.retry-btn { - background: #dc2626; - color: white; - border: none; - padding: 14px 28px; - border-radius: 10px; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - font-size: 1rem; -} - -.retry-btn:hover { - background: #b91c1c; - transform: translateY(-1px); -} - -/* 页脚 */ -.footer { - text-align: center; - padding: 40px 20px; - color: #64748b; - margin-top: 40px; -} - -.footer p { - margin-bottom: 8px; - font-size: 1rem; -} - -.footer-note { - font-size: 0.9rem; - opacity: 0.8; -} - -/* 提示框 */ -.toast { - position: fixed; - top: 20px; - right: 20px; - background: #228B22; - color: white; - padding: 16px 24px; - border-radius: 10px; - box-shadow: 0 4px 20px rgba(34, 139, 34, 0.3); - z-index: 1000; - animation: toastSlide 0.3s ease-out; - font-weight: 500; -} - -@keyframes toastSlide { - from { - transform: translateX(100%); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } -} - -/* 强度等级颜色 */ -.strength-weak { - color: #dc2626 !important; -} - -.strength-medium { - color: #f59e0b !important; -} - -.strength-strong { - color: #228B22 !important; -} - -.strength-very-strong { - color: #1e7e1e !important; -} - -/* 分数圆圈颜色 */ -.score-weak { - background: conic-gradient(from 0deg, #dc2626 0deg, #dc2626 var(--score-deg), #e2e8f0 var(--score-deg), #e2e8f0 360deg) !important; -} - -.score-medium { - background: conic-gradient(from 0deg, #f59e0b 0deg, #f59e0b var(--score-deg), #e2e8f0 var(--score-deg), #e2e8f0 360deg) !important; -} - -.score-strong { - background: conic-gradient(from 0deg, #228B22 0deg, #228B22 var(--score-deg), #e2e8f0 var(--score-deg), #e2e8f0 360deg) !important; -} - -.score-very-strong { - background: conic-gradient(from 0deg, #1e7e1e 0deg, #1e7e1e var(--score-deg), #e2e8f0 var(--score-deg), #e2e8f0 360deg) !important; -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - max-width: 900px; - padding: 25px; - } - - .header h1 { - font-size: 2.4rem; - } - - .input-container, - .result-container { - padding: 30px; - } - - .details-grid { - grid-template-columns: 1fr; - } - - .recommendations-section { - grid-template-columns: 1fr; - } - - .strength-score { - flex-direction: column; - text-align: center; - gap: 20px; - } -} - -/* 手机端适配 (最大767px) */ -@media (max-width: 767px) { - .container { - padding: 15px; - max-width: 100%; - } - - .header { - padding: 25px 15px; - margin-bottom: 25px; - } - - .header h1 { - font-size: 2rem; - } - - .subtitle { - font-size: 1rem; - } - - .input-container, - .result-container { - padding: 25px; - border-radius: 15px; - } - - .main-content { - gap: 20px; - } - - .password-input { - padding: 16px 50px 16px 16px; - font-size: 1rem; - } - - .check-btn { - padding: 16px 28px; - font-size: 1rem; - } - - .strength-overview { - padding: 20px; - margin-bottom: 25px; - } - - .strength-score { - flex-direction: column; - text-align: center; - gap: 20px; - } - - .score-circle { - width: 100px; - height: 100px; - } - - .score-circle::before { - width: 75px; - height: 75px; - } - - .score-value { - font-size: 2rem; - } - - .strength-level { - font-size: 1.6rem; - } - - .details-grid { - grid-template-columns: 1fr; - gap: 20px; - } - - .detail-card { - padding: 20px; - } - - .character-types { - grid-template-columns: 1fr; - } - - .recommendations-section { - grid-template-columns: 1fr; - gap: 20px; - } - - .recommendations-card, - .security-tips-card { - padding: 20px; - } - - .toast { - right: 15px; - left: 15px; - top: 15px; - text-align: center; - } -} - -/* 小屏手机适配 (最大480px) */ -@media (max-width: 480px) { - .container { - padding: 10px; - } - - .header { - padding: 20px 10px; - margin-bottom: 20px; - } - - .header h1 { - font-size: 1.8rem; - } - - .input-container, - .result-container { - padding: 20px; - } - - .password-input { - padding: 14px 45px 14px 14px; - font-size: 0.95rem; - } - - .check-btn { - padding: 14px 24px; - } - - .detail-card { - padding: 15px; - } - - .card-header h3 { - font-size: 1.1rem; - } -} - -/* 触摸设备优化 */ -@media (hover: none) and (pointer: coarse) { - .check-btn, - .retry-btn, - .toggle-visibility { - min-height: 44px; - } - - .toggle-visibility { - padding: 12px; - } -} - -/* 高对比度模式支持 */ -@media (prefers-contrast: high) { - .input-container, - .result-container, - .detail-card { - border: 2px solid #2c3e50; - } - - .password-input { - border: 2px solid #2c3e50; - } -} - -/* 减少动画模式支持 */ -@media (prefers-reduced-motion: reduce) { - * { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - } -} - -/* 深色模式支持 */ -@media (prefers-color-scheme: dark) { - body { - background: #0f172a; - color: #e2e8f0; - } - - .input-container, - .result-container, - .detail-card, - .recommendations-card, - .security-tips-card { - background: #1e293b; - border-color: #334155; - } - - .password-input { - background: #334155; - border-color: #475569; - color: #e2e8f0; - } - - .password-input:focus { - background: #1e293b; - border-color: #667eea; - } - - .strength-overview { - background: #1e293b; - border-color: #334155; - } - - .char-type, - .recommendations-list li, - .tip-item { - background: #334155; - border-color: #475569; - color: #e2e8f0; - } -} - -/* 打印样式 */ -@media print { - .header { - background: none !important; - color: black !important; - box-shadow: none !important; - } - - .check-btn, - .retry-btn, - .toggle-visibility, - .toast { - display: none !important; - } - - .input-container, - .result-container { - box-shadow: none !important; - border: 1px solid #ccc !important; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/index.html b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/index.html deleted file mode 100755 index f4f5fac7..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/index.html +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - - 🔒 密码强度检测器 - - - - - - -
-
-

🔒 密码强度检测器

-

实时分析密码安全性,保护您的数字生活

-
- -
- -
-
- -
- - -
-
- 💡 - 输入密码后将实时显示安全性分析结果 -
-
- - -
- - - - - - -
- -
-

🔒 保护您的数字安全,从强密码开始

- -
-
- - - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/js/script.js deleted file mode 100755 index c60d37f4..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/js/script.js +++ /dev/null @@ -1,516 +0,0 @@ -/** - * 密码强度检测器 - * 提供密码强度分析和安全建议 - */ -class PasswordStrengthChecker { - constructor() { - this.apiUrl = 'https://60s.api.shumengya.top/v2/password/check'; - this.isChecking = false; - this.currentPassword = ''; - this.init(); - } - - /** - * 初始化应用 - */ - init() { - this.bindEvents(); - this.setupFormValidation(); - this.hideResultContainer(); - this.hideErrorContainer(); - console.log('密码强度检测器初始化完成'); - } - - /** - * 绑定事件监听器 - */ - bindEvents() { - // 密码输入框事件 - const passwordInput = document.getElementById('passwordInput'); - if (passwordInput) { - passwordInput.addEventListener('input', this.handlePasswordInput.bind(this)); - passwordInput.addEventListener('keypress', this.handleKeyPress.bind(this)); - } - - // 显示/隐藏密码按钮 - const toggleBtn = document.getElementById('toggleVisibility'); - if (toggleBtn) { - toggleBtn.addEventListener('click', this.togglePasswordVisibility.bind(this)); - } - - // 检测按钮 - const checkBtn = document.getElementById('checkBtn'); - if (checkBtn) { - checkBtn.addEventListener('click', this.handleCheckPassword.bind(this)); - } - - // 重试按钮 - const retryBtn = document.getElementById('retryBtn'); - if (retryBtn) { - retryBtn.addEventListener('click', this.handleRetry.bind(this)); - } - } - - /** - * 设置表单验证 - */ - setupFormValidation() { - const form = document.querySelector('.input-container'); - if (form) { - form.addEventListener('submit', (e) => { - e.preventDefault(); - this.handleCheckPassword(); - }); - } - } - - /** - * 处理密码输入 - */ - handlePasswordInput(event) { - const password = event.target.value; - this.currentPassword = password; - - // 更新按钮状态 - this.updateCheckButtonState(); - - // 如果密码为空,隐藏结果 - if (!password.trim()) { - this.hideResultContainer(); - this.hideErrorContainer(); - } - } - - /** - * 处理键盘事件 - */ - handleKeyPress(event) { - if (event.key === 'Enter' && !this.isChecking) { - event.preventDefault(); - this.handleCheckPassword(); - } - } - - /** - * 切换密码可见性 - */ - togglePasswordVisibility() { - const passwordInput = document.getElementById('passwordInput'); - const toggleBtn = document.getElementById('toggleVisibility'); - - if (passwordInput && toggleBtn) { - const isPassword = passwordInput.type === 'password'; - passwordInput.type = isPassword ? 'text' : 'password'; - toggleBtn.innerHTML = isPassword ? '🙈' : '👁️'; - toggleBtn.title = isPassword ? '隐藏密码' : '显示密码'; - } - } - - /** - * 更新检测按钮状态 - */ - updateCheckButtonState() { - const checkBtn = document.getElementById('checkBtn'); - const hasPassword = this.currentPassword.trim().length > 0; - - if (checkBtn) { - checkBtn.disabled = !hasPassword || this.isChecking; - - if (this.isChecking) { - checkBtn.innerHTML = '检测中...'; - } else if (hasPassword) { - checkBtn.innerHTML = '🔍检测密码强度'; - } else { - checkBtn.innerHTML = '🔍请输入密码'; - } - } - } - - /** - * 处理密码检测 - */ - async handleCheckPassword() { - const password = this.currentPassword.trim(); - - if (!password) { - this.showToast('请输入要检测的密码', 'error'); - return; - } - - if (this.isChecking) { - return; - } - - try { - this.setLoadingState(true); - this.hideErrorContainer(); - - const result = await this.checkPasswordStrength(password); - - if (result.code === 200 && result.data) { - this.displayResults(result.data); - this.showResultContainer(); - this.showToast('密码强度检测完成', 'success'); - } else { - throw new Error(result.message || '检测失败'); - } - } catch (error) { - console.error('密码检测错误:', error); - this.showError(error.message || '检测服务暂时不可用,请稍后重试'); - } finally { - this.setLoadingState(false); - } - } - - /** - * 调用API检测密码强度 - */ - async checkPasswordStrength(password) { - const url = new URL(this.apiUrl); - url.searchParams.append('password', password); - url.searchParams.append('encoding', 'utf-8'); - - const response = await fetch(url.toString(), { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - } - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - return await response.json(); - } - - /** - * 显示检测结果 - */ - displayResults(data) { - this.updateStrengthOverview(data); - this.updateDetailedInfo(data); - this.updateRecommendations(data); - } - - /** - * 更新强度概览 - */ - updateStrengthOverview(data) { - // 更新分数圆圈 - const scoreCircle = document.getElementById('scoreCircle'); - const scoreValue = document.getElementById('scoreValue'); - const strengthLevel = document.getElementById('strengthLevel'); - const strengthDescription = document.getElementById('strengthDescription'); - const barFill = document.getElementById('strengthBar'); - - if (scoreValue) { - scoreValue.textContent = data.score || 0; - } - - if (strengthLevel) { - strengthLevel.textContent = this.getStrengthText(data.strength); - const strengthClass = this.getStrengthClass(data.strength); - strengthLevel.className = `strength-level strength-${strengthClass}`; - } - - if (strengthDescription) { - strengthDescription.textContent = this.getStrengthDescription(data.strength); - } - - // 更新分数圆圈 - if (scoreCircle) { - const percentage = (data.score / 100) * 360; - scoreCircle.style.setProperty('--score-deg', `${percentage}deg`); - // 将中文强度转换为CSS类名 - const strengthClass = this.getStrengthClass(data.strength); - scoreCircle.className = `score-circle score-${strengthClass}`; - } - - // 更新强度条 - if (barFill) { - setTimeout(() => { - barFill.style.width = `${data.score}%`; - }, 100); - } - } - - /** - * 更新详细信息 - */ - updateDetailedInfo(data) { - // 基本信息 - this.updateElement('passwordLength', data.length || 0); - this.updateElement('entropyValue', data.entropy ? data.entropy.toFixed(2) : '0.00'); - this.updateElement('crackTime', data.time_to_crack || '未知'); - - // 字符类型分析 - this.updateCharacterAnalysis(data.character_analysis || {}); - } - - /** - * 更新字符类型分析 - */ - updateCharacterAnalysis(analysis) { - const types = { - 'has_lowercase': { element: 'hasLowercase', label: '小写字母', icon: '🔤' }, - 'has_uppercase': { element: 'hasUppercase', label: '大写字母', icon: '🔠' }, - 'has_numbers': { element: 'hasNumbers', label: '数字', icon: '🔢' }, - 'has_symbols': { element: 'hasSymbols', label: '特殊符号', icon: '🔣' } - }; - - Object.keys(types).forEach(key => { - const element = document.getElementById(types[key].element); - if (element) { - const hasType = analysis[key] || false; - element.className = `char-type ${hasType ? 'has-type' : ''}`; - element.innerHTML = ` - ${hasType ? '✅' : '❌'} - ${types[key].label} - `; - } - }); - - // 更新字符种类数量 - this.updateElement('characterVariety', analysis.character_variety || 0); - - // 更新问题提示 - this.updateCharacterIssues(analysis); - } - - /** - * 更新字符问题提示 - */ - updateCharacterIssues(analysis) { - const issues = [ - { id: 'hasRepeated', condition: analysis.has_repeated, text: '包含重复字符' }, - { id: 'hasSequential', condition: analysis.has_sequential, text: '包含连续字符' } - ]; - - issues.forEach(issue => { - const element = document.getElementById(issue.id); - if (element) { - if (issue.condition) { - element.style.display = 'flex'; - element.innerHTML = ` - ⚠️ - ${issue.text} - `; - } else { - element.style.display = 'none'; - } - } - }); - } - - /** - * 更新建议和提示 - */ - updateRecommendations(data) { - // 更新建议列表 - const recommendationsList = document.getElementById('recommendationsList'); - if (recommendationsList && data.recommendations) { - recommendationsList.innerHTML = ''; - data.recommendations.forEach(recommendation => { - const li = document.createElement('li'); - li.textContent = recommendation; - recommendationsList.appendChild(li); - }); - } - - // 更新安全提示 - const tipsContainer = document.getElementById('securityTips'); - if (tipsContainer && data.security_tips) { - tipsContainer.innerHTML = ''; - data.security_tips.forEach((tip, index) => { - const tipElement = document.createElement('div'); - tipElement.className = 'tip-item'; - tipElement.innerHTML = ` - ${this.getTipIcon(index)} - ${tip} - `; - tipsContainer.appendChild(tipElement); - }); - } - } - - /** - * 获取提示图标 - */ - getTipIcon(index) { - const icons = ['🛡️', '🔐', '⚡', '🎯', '💡', '🔄']; - return icons[index % icons.length]; - } - - /** - * 获取强度文本 - */ - getStrengthText(strength) { - // API直接返回中文强度,无需映射 - return strength || '未知'; - } - - /** - * 获取强度CSS类名 - */ - getStrengthClass(strength) { - const classMap = { - '弱': 'weak', - '中等': 'medium', - '强': 'strong', - '非常强': 'very-strong' - }; - return classMap[strength] || 'unknown'; - } - - /** - * 获取强度描述 - */ - getStrengthDescription(strength) { - const descriptions = { - '弱': '密码强度较弱,建议增加复杂度', - '中等': '密码强度中等,可以进一步优化', - '强': '密码强度良好,安全性较高', - '非常强': '密码强度非常好,安全性很高' - }; - return descriptions[strength] || '无法评估密码强度'; - } - - /** - * 设置加载状态 - */ - setLoadingState(loading) { - this.isChecking = loading; - this.updateCheckButtonState(); - - const passwordInput = document.getElementById('passwordInput'); - if (passwordInput) { - passwordInput.disabled = loading; - } - } - - /** - * 显示结果容器 - */ - showResultContainer() { - const container = document.getElementById('resultContainer'); - if (container) { - container.style.display = 'block'; - container.scrollIntoView({ behavior: 'smooth', block: 'start' }); - } - } - - /** - * 隐藏结果容器 - */ - hideResultContainer() { - const container = document.getElementById('resultContainer'); - if (container) { - container.style.display = 'none'; - } - } - - /** - * 显示错误 - */ - showError(message) { - const errorContainer = document.getElementById('errorContainer'); - const errorMessage = document.getElementById('errorMessage'); - - if (errorContainer && errorMessage) { - errorMessage.textContent = message; - errorContainer.style.display = 'block'; - this.hideResultContainer(); - errorContainer.scrollIntoView({ behavior: 'smooth', block: 'start' }); - } - } - - /** - * 隐藏错误容器 - */ - hideErrorContainer() { - const container = document.getElementById('errorContainer'); - if (container) { - container.style.display = 'none'; - } - } - - /** - * 处理重试 - */ - handleRetry() { - this.hideErrorContainer(); - const passwordInput = document.getElementById('passwordInput'); - if (passwordInput) { - passwordInput.focus(); - } - } - - /** - * 更新元素内容 - */ - updateElement(id, content) { - const element = document.getElementById(id); - if (element) { - element.textContent = content; - } - } - - /** - * 显示提示消息 - */ - showToast(message, type = 'success') { - const toast = document.getElementById('toast'); - const toastMessage = document.getElementById('toastMessage'); - - if (toast && toastMessage) { - toastMessage.textContent = message; - toast.className = `toast toast-${type}`; - toast.style.display = 'block'; - - // 3秒后自动隐藏 - setTimeout(() => { - toast.style.display = 'none'; - }, 3000); - } - } -} - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', () => { - try { - window.passwordChecker = new PasswordStrengthChecker(); - console.log('密码强度检测器已启动'); - } catch (error) { - console.error('初始化失败:', error); - } -}); - -// 页面可见性变化处理 -document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'visible' && window.passwordChecker) { - console.log('页面重新激活'); - } -}); - -// 全局错误处理 -window.addEventListener('error', (event) => { - console.error('全局错误:', event.error); - if (window.passwordChecker) { - window.passwordChecker.showToast('发生了意外错误,请刷新页面重试', 'error'); - } -}); - -// 网络状态监听 -window.addEventListener('online', () => { - if (window.passwordChecker) { - window.passwordChecker.showToast('网络连接已恢复', 'success'); - } -}); - -window.addEventListener('offline', () => { - if (window.passwordChecker) { - window.passwordChecker.showToast('网络连接已断开', 'error'); - } -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/返回接口.json deleted file mode 100755 index ccba32e5..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/返回接口.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "password": "adasdasdasdadasd", - "length": 16, - "score": 68, - "strength": "中等", - "entropy": 75.21, - "time_to_crack": "数百万年", - "character_analysis": { - "has_lowercase": true, - "has_uppercase": false, - "has_numbers": false, - "has_symbols": false, - "has_repeated": false, - "has_sequential": true, - "character_variety": 26 - }, - "recommendations": [ - "建议包含大写字母", - "建议包含数字", - "建议包含特殊符号", - "避免使用连续序列字符" - ], - "security_tips": [ - "使用密码管理器生成和存储复杂密码", - "为不同账户使用不同的密码", - "定期更换重要账户的密码", - "启用双因素认证(2FA)增强安全性", - "避免在公共场合输入密码", - "不要将密码保存在浏览器中(除非使用可信的密码管理器)", - "避免使用个人信息作为密码", - "长密码比复杂密码更安全" - ] - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/歌词搜索.html b/InfoGenie-frontend/public/60sapi/实用功能/歌词搜索.html new file mode 100644 index 00000000..20c54ac7 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/歌词搜索.html @@ -0,0 +1,64 @@ + + + + +歌词搜索 + + + + + +
+ +

🎵 歌词搜索

+
+
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/background.css deleted file mode 100755 index 7a42aa54..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/background.css +++ /dev/null @@ -1,132 +0,0 @@ -/* 背景样式文件 - 独立分离便于迁移 */ - -/* 主背景渐变 */ -body { - background: linear-gradient(135deg, - #e8f5e8 0%, - #f1f8e9 25%, - #e8f5e8 50%, - #c8e6c9 75%, - #e8f5e8 100%); - background-size: 400% 400%; - animation: backgroundShift 15s ease-in-out infinite; - position: relative; -} - -/* 背景动画 */ -@keyframes backgroundShift { - 0%, 100% { - background-position: 0% 50%; - } - 25% { - background-position: 100% 50%; - } - 50% { - background-position: 50% 100%; - } - 75% { - background-position: 50% 0%; - } -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 20%, rgba(76, 175, 80, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 80%, rgba(129, 199, 132, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 60%, rgba(165, 214, 167, 0.08) 0%, transparent 50%); - pointer-events: none; - z-index: -1; - animation: floatingBubbles 20s ease-in-out infinite; -} - -@keyframes floatingBubbles { - 0%, 100% { - transform: translateY(0px) rotate(0deg); - opacity: 1; - } - 33% { - transform: translateY(-20px) rotate(120deg); - opacity: 0.8; - } - 66% { - transform: translateY(10px) rotate(240deg); - opacity: 0.9; - } -} - -/* 背景粒子效果 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.2), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.2), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(129, 199, 132, 0.3), transparent); - background-repeat: repeat; - background-size: 200px 100px; - pointer-events: none; - z-index: -1; - animation: particleFloat 25s linear infinite; -} - -@keyframes particleFloat { - 0% { - transform: translateY(0px); - } - 100% { - transform: translateY(-100px); - } -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - body::after { - background-size: 150px 75px; - animation-duration: 20s; - } - - body::before { - animation-duration: 15s; - } -} - -@media (max-width: 480px) { - body::after { - background-size: 100px 50px; - animation-duration: 15s; - } - - body::before { - animation-duration: 12s; - } - - body { - animation-duration: 12s; - } -} - -/* 高性能模式 - 减少动画 */ -@media (prefers-reduced-motion: reduce) { - body, - body::before, - body::after { - animation: none; - } - - body { - background: linear-gradient(135deg, #e8f5e8 0%, #f1f8e9 50%, #c8e6c9 100%); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/style.css deleted file mode 100755 index cb6f2b71..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/style.css +++ /dev/null @@ -1,468 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - line-height: 1.6; - color: #2d5a3d; - min-height: 100vh; - overflow-x: hidden; -} - -/* 容器样式 */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; - display: flex; - flex-direction: column; - position: relative; - z-index: 1; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - padding: 40px 20px; - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(20px); - border-radius: 20px; - box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1); - border: 1px solid rgba(76, 175, 80, 0.2); - position: relative; - overflow: hidden; -} - -.header::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 4px; - background: linear-gradient(90deg, transparent, #4caf50, transparent); - animation: headerGlow 3s ease-in-out infinite; -} - -@keyframes headerGlow { - 0% { left: -100%; } - 50% { left: 100%; } - 100% { left: 100%; } -} - -.header h1 { - font-size: 2.5rem; - font-weight: 700; - background: linear-gradient(135deg, #4caf50, #81c784, #4caf50); - background-size: 200% 200%; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - margin-bottom: 10px; - animation: titleGradient 4s ease-in-out infinite; -} - -@keyframes titleGradient { - 0%, 100% { background-position: 0% 50%; } - 50% { background-position: 100% 50%; } -} - -.header p { - font-size: 1.1rem; - color: #66bb6a; - opacity: 0.9; -} - -/* 主要内容区域 */ -.main { - flex: 1; - display: grid; - grid-template-columns: 1fr 1fr; - gap: 40px; - align-items: start; -} - -/* 表单容器 */ -.form-container { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(20px); - padding: 35px; - border-radius: 20px; - box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1); - border: 1px solid rgba(76, 175, 80, 0.2); - transition: all 0.3s ease; -} - -.form-container:hover { - transform: translateY(-5px); - box-shadow: 0 12px 40px rgba(76, 175, 80, 0.15); -} - -/* 表单样式 */ -.qr-form { - display: flex; - flex-direction: column; - gap: 25px; -} - -.input-group { - display: flex; - flex-direction: column; - gap: 8px; -} - -.input-group label { - font-weight: 600; - color: #2d5a3d; - font-size: 0.95rem; -} - -textarea, select { - padding: 12px 16px; - border: 2px solid rgba(76, 175, 80, 0.3); - border-radius: 12px; - font-size: 1rem; - background: rgba(255, 255, 255, 0.9); - transition: all 0.3s ease; - resize: vertical; -} - -textarea { - min-height: 100px; - font-family: inherit; -} - -textarea:focus, select:focus { - outline: none; - border-color: #4caf50; - box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1); - background: rgba(255, 255, 255, 1); -} - -.options-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: 20px; -} - -/* 按钮样式 */ -.generate-btn { - padding: 15px 30px; - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; - border: none; - border-radius: 12px; - font-size: 1.1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - position: relative; - overflow: hidden; - letter-spacing: 0.5px; -} - -.generate-btn::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); - transition: left 0.5s ease; -} - -.generate-btn:hover::before { - left: 100%; -} - -.generate-btn:hover { - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(76, 175, 80, 0.3); -} - -.generate-btn:active { - transform: translateY(0); -} - -.generate-btn.loading .btn-text { - display: none; -} - -.generate-btn.loading .btn-loading { - display: inline; -} - -.btn-loading { - display: none; -} - -/* 结果容器 */ -.result-container { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(20px); - padding: 35px; - border-radius: 20px; - box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1); - border: 1px solid rgba(76, 175, 80, 0.2); - min-height: 400px; - display: flex; - align-items: center; - justify-content: center; - transition: all 0.3s ease; -} - -/* 加载动画 */ -.loading { - text-align: center; - color: #4caf50; -} - -.loading-spinner { - width: 50px; - height: 50px; - border: 4px solid rgba(76, 175, 80, 0.2); - border-top: 4px solid #4caf50; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 错误样式 */ -.error { - text-align: center; - color: #d32f2f; -} - -.error-icon { - font-size: 3rem; - margin-bottom: 15px; -} - -.error-message { - font-size: 1.1rem; - margin-bottom: 20px; - color: #666; -} - -.retry-btn { - padding: 10px 20px; - background: #4caf50; - color: white; - border: none; - border-radius: 8px; - cursor: pointer; - transition: all 0.3s ease; -} - -.retry-btn:hover { - background: #45a049; - transform: translateY(-1px); -} - -/* 结果显示 */ -.result { - width: 100%; - text-align: center; -} - -.qr-display { - margin-bottom: 25px; -} - -.qr-display img { - max-width: 100%; - height: auto; - border-radius: 12px; - box-shadow: 0 4px 20px rgba(76, 175, 80, 0.2); - transition: all 0.3s ease; -} - -.qr-display img:hover { - transform: scale(1.05); - box-shadow: 0 8px 30px rgba(76, 175, 80, 0.3); -} - -.result-info { - display: flex; - flex-direction: column; - gap: 20px; -} - -.result-text { - font-size: 1rem; - color: #666; - word-break: break-all; - background: rgba(76, 175, 80, 0.1); - padding: 12px; - border-radius: 8px; - border-left: 4px solid #4caf50; -} - -.result-actions { - display: flex; - gap: 10px; - justify-content: center; - flex-wrap: wrap; -} - -.download-btn, .copy-btn, .new-btn { - padding: 10px 16px; - border: none; - border-radius: 8px; - cursor: pointer; - font-size: 0.9rem; - font-weight: 500; - transition: all 0.3s ease; -} - -.download-btn { - background: #4caf50; - color: white; -} - -.copy-btn { - background: #2196f3; - color: white; -} - -.new-btn { - background: #ff9800; - color: white; -} - -.download-btn:hover, .copy-btn:hover, .new-btn:hover { - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); -} - -/* 隐藏类 */ -.hidden { - display: none !important; -} - -/* 页脚样式 */ -.footer { - text-align: center; - margin-top: 40px; - padding: 25px; - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(15px); - border-radius: 15px; - color: #66bb6a; - font-size: 0.9rem; - border: 1px solid rgba(76, 175, 80, 0.1); -} - -/* 平板端适配 (768px - 1024px) */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - max-width: 95%; - padding: 15px; - } - - .main { - gap: 30px; - } - - .header h1 { - font-size: 2.2rem; - } - - .form-container, .result-container { - padding: 25px; - } - - .options-grid { - grid-template-columns: repeat(2, 1fr); - } -} - -/* 手机端适配 (最大768px) */ -@media (max-width: 768px) { - .container { - padding: 10px; - } - - .header { - margin-bottom: 25px; - padding: 25px 15px; - } - - .header h1 { - font-size: 1.8rem; - } - - .header p { - font-size: 1rem; - } - - .main { - grid-template-columns: 1fr; - gap: 25px; - } - - .form-container, .result-container { - padding: 20px; - } - - .options-grid { - grid-template-columns: 1fr; - gap: 15px; - } - - .result-actions { - flex-direction: column; - align-items: center; - } - - .download-btn, .copy-btn, .new-btn { - width: 100%; - max-width: 200px; - } -} - -/* 小屏手机适配 (最大480px) */ -@media (max-width: 480px) { - .container { - padding: 8px; - } - - .header { - padding: 20px 10px; - margin-bottom: 20px; - } - - .header h1 { - font-size: 1.6rem; - } - - .form-container, .result-container { - padding: 15px; - border-radius: 15px; - } - - .generate-btn { - padding: 12px 20px; - font-size: 1rem; - } - - textarea { - min-height: 80px; - } - - .qr-display img { - max-width: 90%; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/index.html b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/index.html deleted file mode 100755 index d2aeae8b..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/index.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - 二维码生成器 - - - - -
-
-

🔗 二维码生成器

-

快速生成高质量二维码

-
- -
-
-
-
- - -
- -
-
- - -
- -
- - -
- -
- - -
-
- - -
-
- -
- - - - - -
-
- -
-

© 2024 二维码生成器 - 简单快捷的二维码生成工具

-
-
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/js/script.js deleted file mode 100755 index b10d7602..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/js/script.js +++ /dev/null @@ -1,453 +0,0 @@ -// 二维码生成器 JavaScript -class QRCodeGenerator { - constructor() { - this.apiEndpoints = []; - this.currentApiIndex = 0; - this.init(); - } - - // 初始化 - async init() { - await this.loadApiEndpoints(); - this.bindEvents(); - this.setupFormValidation(); - } - - // 加载API接口列表 - async loadApiEndpoints() { - try { - // 直接在代码中配置API接口,避免CORS问题 - this.apiEndpoints = [ - "https://60s.api.shumengya.top" - ]; - console.log('已加载API接口:', this.apiEndpoints); - } catch (error) { - console.error('加载API接口失败:', error); - this.showError('加载配置失败,请刷新页面重试'); - } - } - - // 绑定事件 - bindEvents() { - const form = document.getElementById('qrForm'); - const retryBtn = document.querySelector('.retry-btn'); - const downloadBtn = document.querySelector('.download-btn'); - const copyBtn = document.querySelector('.copy-btn'); - const newBtn = document.querySelector('.new-btn'); - const textArea = document.getElementById('text'); - - if (form) { - form.addEventListener('submit', (e) => this.handleSubmit(e)); - } - if (retryBtn) { - retryBtn.addEventListener('click', () => this.retryGeneration()); - } - if (downloadBtn) { - downloadBtn.addEventListener('click', () => this.downloadQRCode()); - } - if (copyBtn) { - copyBtn.addEventListener('click', () => this.copyImageLink()); - } - if (newBtn) { - newBtn.addEventListener('click', () => this.resetForm()); - } - if (textArea) { - textArea.addEventListener('input', () => this.updateCharCount()); - } - } - - // 设置表单验证 - setupFormValidation() { - const textArea = document.getElementById('text'); - const form = document.getElementById('qrForm'); - - textArea.addEventListener('blur', () => { - if (textArea.value.trim() === '') { - this.showFieldError(textArea, '请输入要生成二维码的内容'); - } else { - this.clearFieldError(textArea); - } - }); - } - - // 显示字段错误 - showFieldError(field, message) { - this.clearFieldError(field); - field.style.borderColor = '#d32f2f'; - const errorDiv = document.createElement('div'); - errorDiv.className = 'field-error'; - errorDiv.style.color = '#d32f2f'; - errorDiv.style.fontSize = '0.8rem'; - errorDiv.style.marginTop = '5px'; - errorDiv.textContent = message; - field.parentNode.appendChild(errorDiv); - } - - // 清除字段错误 - clearFieldError(field) { - field.style.borderColor = ''; - const errorDiv = field.parentNode.querySelector('.field-error'); - if (errorDiv) { - errorDiv.remove(); - } - } - - // 更新字符计数 - updateCharCount() { - const textArea = document.getElementById('text'); - const text = textArea.value; - const length = text.length; - - // 移除旧的计数显示 - const oldCounter = textArea.parentNode.querySelector('.char-counter'); - if (oldCounter) oldCounter.remove(); - - // 添加新的计数显示 - if (length > 0) { - const counter = document.createElement('div'); - counter.className = 'char-counter'; - counter.style.fontSize = '0.8rem'; - counter.style.color = '#666'; - counter.style.textAlign = 'right'; - counter.style.marginTop = '5px'; - counter.textContent = `${length} 个字符`; - textArea.parentNode.appendChild(counter); - } - } - - // 处理表单提交 - async handleSubmit(e) { - e.preventDefault(); - - const formData = new FormData(e.target); - const params = { - text: formData.get('text').trim(), - size: formData.get('size'), - level: formData.get('level'), - encoding: formData.get('encoding') - }; - - // 验证输入 - if (!params.text) { - this.showFieldError(document.getElementById('text'), '请输入要生成二维码的内容'); - return; - } - - this.showLoading(); - await this.generateQRCode(params); - } - - // 生成二维码 - async generateQRCode(params) { - let success = false; - let lastError = null; - - // 尝试所有API接口 - for (let i = 0; i < this.apiEndpoints.length; i++) { - const apiIndex = (this.currentApiIndex + i) % this.apiEndpoints.length; - const apiUrl = this.apiEndpoints[apiIndex]; - - try { - console.log(`尝试API ${apiIndex + 1}:`, apiUrl); - const result = await this.callAPI(apiUrl, params); - - if (result.success) { - this.currentApiIndex = apiIndex; // 记录成功的API - this.showResult(result.data, params); - success = true; - break; - } - } catch (error) { - console.warn(`API ${apiIndex + 1} 失败:`, error); - lastError = error; - } - } - - if (!success) { - this.showError(lastError?.message || '所有API接口都无法访问,请稍后重试'); - } - } - - // 调用API - async callAPI(baseUrl, params) { - const url = new URL('/v2/qrcode', baseUrl); - - // 添加查询参数 - Object.entries(params).forEach(([key, value]) => { - if (value !== null && value !== undefined && value !== '') { - url.searchParams.append(key, value); - } - }); - - console.log('请求URL:', url.toString()); - - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 - - try { - const response = await fetch(url.toString(), { - method: 'GET', - signal: controller.signal, - headers: { - 'Accept': 'application/json, image/*' - } - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - // 根据返回格式处理 - if (params.encoding === 'image' || !params.encoding) { - // 默认返回图片格式 - const contentType = response.headers.get('content-type'); - if (contentType && contentType.startsWith('image/')) { - const blob = await response.blob(); - const imageUrl = URL.createObjectURL(blob); - return { - success: true, - data: { - imageUrl: imageUrl, - text: params.text, - size: params.size, - level: params.level, - format: 'image' - } - }; - } else { - // 如果返回的不是图片,尝试解析JSON - const jsonData = await response.json(); - if (jsonData.code === 0 && jsonData.data && jsonData.data.data_uri) { - return { - success: true, - data: { - imageUrl: jsonData.data.data_uri, - text: params.text, - size: params.size, - level: params.level, - format: 'json', - base64: jsonData.data.base64, - mimeType: jsonData.data.mime_type - } - }; - } else { - throw new Error(jsonData.message || '生成失败'); - } - } - } else { - // JSON或text格式 - const jsonData = await response.json(); - if (jsonData.code === 0 && jsonData.data) { - return { - success: true, - data: { - imageUrl: jsonData.data.data_uri, - text: params.text, - size: params.size, - level: params.level, - format: params.encoding, - base64: jsonData.data.base64, - mimeType: jsonData.data.mime_type - } - }; - } else { - throw new Error(jsonData.message || '生成失败'); - } - } - } catch (error) { - clearTimeout(timeoutId); - if (error.name === 'AbortError') { - throw new Error('请求超时,请重试'); - } - throw error; - } - } - - // 显示加载状态 - showLoading() { - this.hideAllStates(); - document.getElementById('loading').classList.remove('hidden'); - - const btn = document.querySelector('.generate-btn'); - btn.classList.add('loading'); - btn.disabled = true; - } - - // 显示错误 - showError(message) { - this.hideAllStates(); - const errorDiv = document.getElementById('error'); - const errorMessage = errorDiv.querySelector('.error-message'); - errorMessage.textContent = message; - errorDiv.classList.remove('hidden'); - - this.resetButton(); - } - - // 显示结果 - showResult(data, params) { - this.hideAllStates(); - - const resultDiv = document.getElementById('result'); - const qrImage = document.getElementById('qrImage'); - const resultText = document.querySelector('.result-text'); - - qrImage.src = data.imageUrl; - qrImage.alt = `二维码: ${data.text}`; - - resultText.innerHTML = ` - 内容: ${this.escapeHtml(data.text)}
- 尺寸: ${data.size}x${data.size}
- 容错级别: ${data.level}
- 格式: ${data.format.toUpperCase()} - `; - - resultDiv.classList.remove('hidden'); - this.resetButton(); - - // 保存数据供下载使用 - this.currentQRData = data; - } - - // 隐藏所有状态 - hideAllStates() { - document.getElementById('loading').classList.add('hidden'); - document.getElementById('error').classList.add('hidden'); - document.getElementById('result').classList.add('hidden'); - } - - // 重置按钮状态 - resetButton() { - const btn = document.querySelector('.generate-btn'); - btn.classList.remove('loading'); - btn.disabled = false; - } - - // 重试生成 - async retryGeneration() { - const form = document.getElementById('qrForm'); - const formData = new FormData(form); - const params = { - text: formData.get('text').trim(), - size: formData.get('size'), - level: formData.get('level'), - encoding: formData.get('encoding') - }; - - this.showLoading(); - await this.generateQRCode(params); - } - - // 下载二维码 - downloadQRCode() { - if (!this.currentQRData) return; - - const link = document.createElement('a'); - link.href = this.currentQRData.imageUrl; - link.download = `qrcode_${Date.now()}.png`; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - - this.showToast('二维码已下载'); - } - - // 复制图片链接 - async copyImageLink() { - if (!this.currentQRData) return; - - try { - await navigator.clipboard.writeText(this.currentQRData.imageUrl); - this.showToast('链接已复制到剪贴板'); - } catch (error) { - console.error('复制失败:', error); - this.showToast('复制失败,请手动复制'); - } - } - - // 重置表单 - resetForm() { - document.getElementById('qrForm').reset(); - this.hideAllStates(); - this.currentQRData = null; - - // 清除字符计数 - const counter = document.querySelector('.char-counter'); - if (counter) counter.remove(); - - // 清除字段错误 - document.querySelectorAll('input, textarea, select').forEach(field => { - this.clearFieldError(field); - }); - - // 聚焦到文本框 - document.getElementById('text').focus(); - } - - // 显示提示消息 - showToast(message) { - // 移除旧的toast - const oldToast = document.querySelector('.toast'); - if (oldToast) oldToast.remove(); - - const toast = document.createElement('div'); - toast.className = 'toast'; - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: #4caf50; - color: white; - padding: 12px 20px; - border-radius: 8px; - box-shadow: 0 4px 12px rgba(0,0,0,0.2); - z-index: 1000; - animation: slideIn 0.3s ease; - `; - toast.textContent = message; - - document.body.appendChild(toast); - - setTimeout(() => { - toast.style.animation = 'slideOut 0.3s ease'; - setTimeout(() => toast.remove(), 300); - }, 3000); - } - - // HTML转义 - escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; - } -} - -// 添加CSS动画 -const style = document.createElement('style'); -style.textContent = ` - @keyframes slideIn { - from { transform: translateX(100%); opacity: 0; } - to { transform: translateX(0); opacity: 1; } - } - @keyframes slideOut { - from { transform: translateX(0); opacity: 1; } - to { transform: translateX(100%); opacity: 0; } - } -`; -document.head.appendChild(style); - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', () => { - new QRCodeGenerator(); -}); - -// 错误处理 -window.addEventListener('error', (e) => { - console.error('全局错误:', e.error); -}); - -window.addEventListener('unhandledrejection', (e) => { - console.error('未处理的Promise拒绝:', e.reason); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科.html b/InfoGenie-frontend/public/60sapi/实用功能/百度百科.html new file mode 100644 index 00000000..e0c35328 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/百度百科.html @@ -0,0 +1,64 @@ + + + + +百度百科 + + + + + +
+ +

📚 百度百科

+
+
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/background.css deleted file mode 100755 index e09e36f3..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/background.css +++ /dev/null @@ -1,192 +0,0 @@ -/* 彩虹渐变背景样式 */ - -/* 主背景渐变 */ -body { - background: linear-gradient( - 135deg, - rgba(255, 107, 107, 0.3) 0%, - rgba(255, 165, 0, 0.3) 14.28%, - rgba(255, 255, 0, 0.25) 28.56%, - rgba(50, 205, 50, 0.3) 42.84%, - rgba(0, 191, 255, 0.3) 57.12%, - rgba(65, 105, 225, 0.3) 71.4%, - rgba(147, 112, 219, 0.3) 85.68%, - rgba(255, 105, 180, 0.3) 100% - ); - background-size: 400% 400%; - animation: rainbowShift 20s ease infinite; - min-height: 100vh; -} - -/* 彩虹渐变动画 */ -@keyframes rainbowShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 半透明覆盖层,增强可读性 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(255, 255, 255, 0.4); - backdrop-filter: blur(2px); - z-index: -1; - pointer-events: none; -} - -/* 搜索按钮彩虹渐变 */ -.search-btn { - background: linear-gradient( - 45deg, - rgba(255, 107, 107, 0.8), - rgba(255, 165, 0, 0.8), - rgba(255, 255, 0, 0.7), - rgba(50, 205, 50, 0.8), - rgba(0, 191, 255, 0.8), - rgba(65, 105, 225, 0.8), - rgba(147, 112, 219, 0.8) - ); - background-size: 300% 300%; - animation: buttonRainbow 12s ease infinite; -} - -@keyframes buttonRainbow { - 0%, 100% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } -} - -/* 结果卡片边框彩虹渐变 */ -.result-card { - position: relative; - overflow: hidden; -} - -.result-card::before { - content: ''; - position: absolute; - top: -2px; - left: -2px; - right: -2px; - bottom: -2px; - background: linear-gradient( - 45deg, - rgba(255, 107, 107, 0.4), - rgba(255, 165, 0, 0.4), - rgba(255, 255, 0, 0.3), - rgba(50, 205, 50, 0.4), - rgba(0, 191, 255, 0.4), - rgba(65, 105, 225, 0.4), - rgba(147, 112, 219, 0.4), - rgba(255, 107, 107, 0.4) - ); - background-size: 400% 400%; - animation: borderRainbow 15s linear infinite; - border-radius: inherit; - z-index: -1; -} - -@keyframes borderRainbow { - 0% { - background-position: 0% 50%; - } - 100% { - background-position: 400% 50%; - } -} - -/* 加载动画彩虹效果 */ -.loading-spinner { - border: 4px solid rgba(255, 255, 255, 0.3); - border-top: 4px solid transparent; - border-image: linear-gradient( - 45deg, - #ff6b6b, - #ffa500, - #ffff00, - #32cd32, - #00bfff, - #4169e1, - #9370db - ) 1; - animation: spin 1s linear infinite, colorShift 3s ease infinite; -} - -@keyframes colorShift { - 0%, 100% { - filter: hue-rotate(0deg); - } - 50% { - filter: hue-rotate(180deg); - } -} - -/* 链接悬停彩虹效果 */ -.result-link:hover { - background: linear-gradient( - 90deg, - rgba(255, 107, 107, 0.7), - rgba(255, 165, 0, 0.7), - rgba(255, 255, 0, 0.6), - rgba(50, 205, 50, 0.7), - rgba(0, 191, 255, 0.7), - rgba(65, 105, 225, 0.7), - rgba(147, 112, 219, 0.7) - ); - background-size: 200% 200%; - animation: linkRainbow 3s ease infinite; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -@keyframes linkRainbow { - 0%, 100% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } -} - -/* 标题彩虹文字效果 */ -.title { - background: linear-gradient( - 90deg, - rgba(255, 107, 107, 0.8), - rgba(255, 165, 0, 0.8), - rgba(255, 255, 0, 0.7), - rgba(50, 205, 50, 0.8), - rgba(0, 191, 255, 0.8), - rgba(65, 105, 225, 0.8), - rgba(147, 112, 219, 0.8) - ); - background-size: 200% 200%; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - animation: titleRainbow 8s ease infinite; -} - -@keyframes titleRainbow { - 0%, 100% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/style.css deleted file mode 100755 index e1530ded..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/style.css +++ /dev/null @@ -1,530 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #333; - overflow-x: hidden; -} - -/* 容器布局 */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - padding: 20px 0; -} - -.title { - font-size: 2.5rem; - font-weight: 700; - margin-bottom: 10px; - text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1); -} - -.subtitle { - font-size: 1.1rem; - color: rgba(255, 255, 255, 0.9); - font-weight: 300; - text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2); -} - -/* 主内容区域 */ -.main { - flex: 1; - display: flex; - flex-direction: column; - gap: 30px; -} - -/* 搜索区域 */ -.search-section { - display: flex; - justify-content: center; - align-items: center; -} - -.search-container { - display: flex; - width: 100%; - max-width: 600px; - background: rgba(255, 255, 255, 0.95); - border-radius: 50px; - padding: 8px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); - backdrop-filter: blur(10px); - transition: all 0.3s ease; -} - -.search-container:focus-within { - transform: translateY(-2px); - box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3); -} - -.search-input { - flex: 1; - border: none; - outline: none; - padding: 15px 25px; - font-size: 1.1rem; - background: transparent; - color: #333; - border-radius: 50px; -} - -.search-input::placeholder { - color: #999; - font-weight: 300; -} - -.search-btn { - border: none; - outline: none; - padding: 15px 25px; - border-radius: 50px; - color: white; - font-size: 1rem; - font-weight: 600; - cursor: pointer; - display: flex; - align-items: center; - gap: 8px; - transition: all 0.3s ease; - min-width: 120px; - justify-content: center; -} - -.search-btn:hover { - transform: scale(1.05); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); -} - -.search-btn:active { - transform: scale(0.98); -} - -.search-icon { - font-size: 1.2rem; -} - -/* 结果区域 */ -.result-section { - flex: 1; - display: flex; - justify-content: center; - align-items: flex-start; - min-height: 400px; -} - -/* 加载动画 */ -.loading { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; - padding: 40px; - color: rgba(255, 255, 255, 0.9); -} - -.loading-spinner { - width: 50px; - height: 50px; - border-radius: 50%; - animation: spin 1s linear infinite; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 结果卡片 */ -.result-card { - width: 100%; - max-width: 800px; - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - padding: 30px; - box-shadow: 0 15px 40px rgba(0, 0, 0, 0.2); - backdrop-filter: blur(10px); - animation: slideUp 0.5s ease; -} - -@keyframes slideUp { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.result-header { - margin-bottom: 25px; - text-align: center; -} - -.result-title { - font-size: 2rem; - font-weight: 700; - color: #333; - margin-bottom: 10px; -} - -.result-description { - font-size: 1.1rem; - color: #666; - font-weight: 400; -} - -.result-content { - display: grid; - grid-template-columns: 1fr 2fr; - gap: 30px; - align-items: start; -} - -.result-image-container { - display: flex; - justify-content: center; -} - -.result-image { - width: 100%; - max-width: 250px; - height: auto; - border-radius: 15px; - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); - transition: transform 0.3s ease; -} - -.result-image:hover { - transform: scale(1.05); -} - -.result-text { - display: flex; - flex-direction: column; - gap: 20px; -} - -.result-abstract h3 { - font-size: 1.3rem; - color: #333; - margin-bottom: 10px; - font-weight: 600; -} - -.result-abstract p { - font-size: 1rem; - line-height: 1.8; - color: #555; - text-align: justify; -} - -.result-actions { - display: flex; - justify-content: flex-end; -} - -.result-link { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 12px 24px; - background: rgba(0, 123, 255, 0.1); - color: #007bff; - text-decoration: none; - border-radius: 25px; - font-weight: 600; - transition: all 0.3s ease; - border: 2px solid transparent; -} - -.result-link:hover { - background: rgba(0, 123, 255, 0.2); - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(0, 123, 255, 0.3); -} - -.link-icon { - font-size: 1.2rem; - transition: transform 0.3s ease; -} - -.result-link:hover .link-icon { - transform: translateX(5px); -} - -/* 错误消息 */ -.error-message { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; - padding: 40px; - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); - backdrop-filter: blur(10px); - text-align: center; - max-width: 500px; - width: 100%; -} - -.error-icon { - font-size: 3rem; -} - -.error-message h3 { - color: #e74c3c; - font-size: 1.5rem; - margin-bottom: 10px; -} - -.error-message p { - color: #666; - font-size: 1rem; - line-height: 1.6; -} - -.retry-btn { - padding: 12px 24px; - background: #e74c3c; - color: white; - border: none; - border-radius: 25px; - font-size: 1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; -} - -.retry-btn:hover { - background: #c0392b; - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(231, 76, 60, 0.3); -} - -/* 欢迎消息 */ -.welcome-message { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; - padding: 60px 40px; - background: rgba(255, 255, 255, 0.9); - border-radius: 20px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); - backdrop-filter: blur(10px); - text-align: center; - max-width: 600px; - width: 100%; -} - -.welcome-icon { - font-size: 4rem; - opacity: 0.8; -} - -.welcome-message h3 { - color: #333; - font-size: 1.8rem; - font-weight: 600; - margin-bottom: 10px; -} - -.welcome-message p { - color: #666; - font-size: 1.1rem; - line-height: 1.6; - max-width: 400px; -} - -/* 页脚 */ -.footer { - text-align: center; - padding: 20px 0; - margin-top: 40px; - color: rgba(255, 255, 255, 0.8); - font-size: 0.9rem; -} - -/* 平板端适配 (768px - 1024px) */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - padding: 15px; - } - - .title { - font-size: 2.2rem; - } - - .result-content { - grid-template-columns: 1fr 1.5fr; - gap: 25px; - } - - .result-card { - padding: 25px; - } -} - -/* 手机端适配 (最大768px) */ -@media (max-width: 768px) { - .container { - padding: 10px; - } - - .header { - margin-bottom: 30px; - padding: 15px 0; - } - - .title { - font-size: 1.8rem; - } - - .subtitle { - font-size: 1rem; - } - - .search-container { - max-width: 100%; - padding: 6px; - } - - .search-input { - padding: 12px 20px; - font-size: 1rem; - } - - .search-btn { - padding: 12px 20px; - min-width: 100px; - font-size: 0.9rem; - } - - .search-text { - display: none; - } - - .result-card { - padding: 20px; - border-radius: 15px; - } - - .result-title { - font-size: 1.5rem; - } - - .result-description { - font-size: 1rem; - } - - .result-content { - grid-template-columns: 1fr; - gap: 20px; - } - - .result-image { - max-width: 200px; - } - - .result-abstract h3 { - font-size: 1.2rem; - } - - .result-abstract p { - font-size: 0.95rem; - line-height: 1.7; - } - - .result-actions { - justify-content: center; - } - - .welcome-message { - padding: 40px 20px; - } - - .welcome-icon { - font-size: 3rem; - } - - .welcome-message h3 { - font-size: 1.5rem; - } - - .welcome-message p { - font-size: 1rem; - } - - .error-message { - padding: 30px 20px; - } - - .error-icon { - font-size: 2.5rem; - } - - .error-message h3 { - font-size: 1.3rem; - } -} - -/* 小屏手机适配 (最大480px) */ -@media (max-width: 480px) { - .title { - font-size: 1.6rem; - } - - .search-container { - flex-direction: column; - gap: 10px; - padding: 15px; - border-radius: 20px; - } - - .search-input { - border-radius: 15px; - text-align: center; - } - - .search-btn { - border-radius: 15px; - justify-content: center; - } - - .search-text { - display: inline; - } - - .result-card { - padding: 15px; - } - - .result-title { - font-size: 1.3rem; - } - - .result-image { - max-width: 150px; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/index.html b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/index.html deleted file mode 100755 index c7da921e..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/index.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - 百度百科词条查询 - - - - -
-
-

百度百科词条查询

-

探索知识的彩虹世界

-
- -
-
-
- - -
-
- -
- - - - - - -
-
📚
-

欢迎使用百度百科词条查询

-

在上方搜索框中输入您想了解的词条,开始探索知识的海洋

-
-
-
- -
-

数据来源:百度百科

-
-
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/js/script.js deleted file mode 100755 index 4d659a5d..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/js/script.js +++ /dev/null @@ -1,320 +0,0 @@ -// 百度百科词条查询应用 -class BaikeApp { - constructor() { - // API接口列表 - this.apiEndpoints = [ - 'https://60s.api.shumengya.top', - ]; - - this.currentApiIndex = 0; - this.isLoading = false; - - this.initElements(); - this.bindEvents(); - } - - // 初始化DOM元素 - initElements() { - this.searchInput = document.getElementById('searchInput'); - this.searchBtn = document.getElementById('searchBtn'); - this.resultSection = document.getElementById('resultSection'); - this.loading = document.getElementById('loading'); - this.resultCard = document.getElementById('resultCard'); - this.errorMessage = document.getElementById('errorMessage'); - this.welcomeMessage = document.getElementById('welcomeMessage'); - this.retryBtn = document.getElementById('retryBtn'); - - // 结果显示元素 - this.resultTitle = document.getElementById('resultTitle'); - this.resultDescription = document.getElementById('resultDescription'); - this.resultImage = document.getElementById('resultImage'); - this.resultAbstract = document.getElementById('resultAbstract'); - this.resultLink = document.getElementById('resultLink'); - this.errorText = document.getElementById('errorText'); - } - - // 绑定事件 - bindEvents() { - // 搜索按钮点击事件 - this.searchBtn.addEventListener('click', () => { - this.handleSearch(); - }); - - // 输入框回车事件 - this.searchInput.addEventListener('keypress', (e) => { - if (e.key === 'Enter') { - this.handleSearch(); - } - }); - - // 重试按钮事件 - this.retryBtn.addEventListener('click', () => { - this.handleSearch(); - }); - - // 输入框焦点事件 - this.searchInput.addEventListener('focus', () => { - this.searchInput.select(); - }); - } - - // 处理搜索 - async handleSearch() { - const query = this.searchInput.value.trim(); - - if (!query) { - this.showError('请输入要查询的词条'); - this.searchInput.focus(); - return; - } - - if (this.isLoading) { - return; - } - - await this.searchBaike(query); - } - - // 搜索百科词条 - async searchBaike(query) { - this.showLoading(); - this.isLoading = true; - - // 重置API索引 - this.currentApiIndex = 0; - - const success = await this.tryApiCall(query); - - if (!success) { - this.showError('所有API接口都无法访问,请稍后重试'); - } - - this.isLoading = false; - } - - // 尝试API调用 - async tryApiCall(query) { - for (let i = 0; i < this.apiEndpoints.length; i++) { - const endpoint = this.apiEndpoints[this.currentApiIndex]; - - try { - const result = await this.callApi(endpoint, query); - if (result) { - this.showResult(result); - return true; - } - } catch (error) { - console.warn(`API ${endpoint} 调用失败:`, error.message); - } - - // 切换到下一个API - this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length; - } - - return false; - } - - // 调用API - async callApi(endpoint, query) { - const url = `${endpoint}/v2/baike?word=${encodeURIComponent(query)}`; - - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 - - try { - const response = await fetch(url, { - method: 'GET', - signal: controller.signal, - headers: { - 'Accept': 'application/json', - } - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - return data.data; - } else { - throw new Error(data.message || '未找到相关词条'); - } - - } catch (error) { - clearTimeout(timeoutId); - - if (error.name === 'AbortError') { - throw new Error('请求超时'); - } - - throw error; - } - } - - // 显示加载状态 - showLoading() { - this.hideAllSections(); - this.loading.style.display = 'flex'; - } - - // 显示搜索结果 - showResult(data) { - this.hideAllSections(); - - // 填充数据 - this.resultTitle.textContent = data.title || '未知标题'; - this.resultDescription.textContent = data.description || '暂无描述'; - this.resultAbstract.textContent = data.abstract || '暂无摘要信息'; - - // 处理图片 - if (data.cover) { - this.resultImage.src = data.cover; - this.resultImage.style.display = 'block'; - this.resultImage.onerror = () => { - this.resultImage.style.display = 'none'; - }; - } else { - this.resultImage.style.display = 'none'; - } - - // 处理链接 - if (data.link) { - this.resultLink.href = data.link; - this.resultLink.style.display = 'inline-flex'; - } else { - this.resultLink.style.display = 'none'; - } - - this.resultCard.style.display = 'block'; - - // 滚动到结果区域 - this.resultCard.scrollIntoView({ - behavior: 'smooth', - block: 'start' - }); - } - - // 显示错误信息 - showError(message) { - this.hideAllSections(); - this.errorText.textContent = message; - this.errorMessage.style.display = 'flex'; - } - - // 隐藏所有区域 - hideAllSections() { - this.loading.style.display = 'none'; - this.resultCard.style.display = 'none'; - this.errorMessage.style.display = 'none'; - this.welcomeMessage.style.display = 'none'; - } - - // 显示欢迎信息 - showWelcome() { - this.hideAllSections(); - this.welcomeMessage.style.display = 'flex'; - } -} - -// 工具函数 -class Utils { - // 防抖函数 - static debounce(func, wait) { - let timeout; - return function executedFunction(...args) { - const later = () => { - clearTimeout(timeout); - func(...args); - }; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; - } - - // 节流函数 - static throttle(func, limit) { - let inThrottle; - return function() { - const args = arguments; - const context = this; - if (!inThrottle) { - func.apply(context, args); - inThrottle = true; - setTimeout(() => inThrottle = false, limit); - } - }; - } - - // 格式化文本长度 - static truncateText(text, maxLength) { - if (text.length <= maxLength) { - return text; - } - return text.substring(0, maxLength) + '...'; - } - - // 检查是否为移动设备 - static isMobile() { - return window.innerWidth <= 768; - } -} - -// 页面加载完成后初始化应用 -document.addEventListener('DOMContentLoaded', () => { - // 初始化应用 - const app = new BaikeApp(); - - // 添加页面可见性变化监听 - document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'visible') { - // 页面重新可见时,聚焦搜索框 - if (!app.isLoading) { - app.searchInput.focus(); - } - } - }); - - // 添加窗口大小变化监听 - window.addEventListener('resize', Utils.throttle(() => { - // 响应式调整 - if (Utils.isMobile()) { - // 移动端特殊处理 - document.body.classList.add('mobile'); - } else { - document.body.classList.remove('mobile'); - } - }, 250)); - - // 初始检查设备类型 - if (Utils.isMobile()) { - document.body.classList.add('mobile'); - } - - // 页面加载完成后聚焦搜索框 - setTimeout(() => { - app.searchInput.focus(); - }, 500); - - // 添加键盘快捷键支持 - document.addEventListener('keydown', (e) => { - // Ctrl/Cmd + K 聚焦搜索框 - if ((e.ctrlKey || e.metaKey) && e.key === 'k') { - e.preventDefault(); - app.searchInput.focus(); - app.searchInput.select(); - } - - // ESC 清空搜索框 - if (e.key === 'Escape') { - app.searchInput.value = ''; - app.showWelcome(); - app.searchInput.focus(); - } - }); - - console.log('百度百科词条查询应用已初始化'); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/返回接口.json deleted file mode 100755 index 16d43ede..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/返回接口.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "title": "西游记", - "description": "明代吴承恩创作的章回体长篇神魔小说", - "abstract": "《西游记》又名《西游释厄传》,是中国古代第一部浪漫主义章回体长篇神魔小说。最早的《西游记》版本是明代万历二十年金陵世德堂《新刻出像官板大字西游记》,未署作者姓名。鲁迅、董作宾等人根据《淮安府志》“吴承恩《西游记》”的记载予以最终论定“吴承恩原著”。该小说主要讲述了孙悟空出世,并寻菩提祖师学艺及大闹天宫后,与猪八戒、沙僧和白龙马一同护送唐僧西天取经,于路上历经险阻,降妖除魔,渡过了九九八十一难,成功...", - "cover": "https://bkimg.cdn.bcebos.com/pic/b7fd5266d01609248d763e43db0735fae6cd3412?x-bce-process=image/format,f_auto", - "has_other": true, - "link": "http://baike.baidu.com/subview/2583/5315045.htm" - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析.html b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析.html new file mode 100644 index 00000000..66fce57a --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析.html @@ -0,0 +1,67 @@ + + + + +身体健康分析 + + + + + +
+ +

🏥 身体健康分析

+
+
+
+ + + +
+
+
+ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/background.css b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/background.css deleted file mode 100755 index 0daba4b5..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/background.css +++ /dev/null @@ -1,243 +0,0 @@ -/* 背景样式文件 - 独立管理背景相关样式 */ - -/* 主体背景 */ -body { - background: linear-gradient(135deg, #e8f5e8 0%, #f0f8f0 25%, #e1f5e1 50%, #f5f9f5 75%, #e8f5e8 100%); - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; - position: relative; - overflow-x: hidden; -} - -/* 背景动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 装饰性背景元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(144, 238, 144, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(152, 251, 152, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(173, 255, 173, 0.08) 0%, transparent 50%); - pointer-events: none; - z-index: -2; -} - -/* 浮动装饰圆点 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.3), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(200, 230, 201, 0.3), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(76, 175, 80, 0.2), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: floatDots 20s linear infinite; - pointer-events: none; - z-index: -1; -} - -@keyframes floatDots { - 0% { - transform: translateY(0px); - } - 100% { - transform: translateY(-100px); - } -} - -/* 容器背景增强 */ -.container { - background: rgba(255, 255, 255, 0.02); - backdrop-filter: blur(10px); - border-radius: 20px; - position: relative; -} - -/* 表单区域背景 */ -.form-section { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(20px); - border: 1px solid rgba(144, 238, 144, 0.3); - position: relative; - overflow: hidden; -} - -.form-section::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient(45deg, transparent, rgba(144, 238, 144, 0.05), transparent); - animation: shimmer 3s ease-in-out infinite; - pointer-events: none; -} - -@keyframes shimmer { - 0% { - transform: translateX(-100%) translateY(-100%) rotate(45deg); - } - 50% { - transform: translateX(100%) translateY(100%) rotate(45deg); - } - 100% { - transform: translateX(-100%) translateY(-100%) rotate(45deg); - } -} - -/* 结果卡片背景 */ -.basic-info-card, -.bmi-card, -.weight-card, -.metabolism-card, -.body-fat-card, -.measurements-card, -.advice-card { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(15px); - border: 1px solid rgba(144, 238, 144, 0.2); - position: relative; - overflow: hidden; -} - -/* 卡片悬停背景效果 */ -.basic-info-card:hover, -.bmi-card:hover, -.weight-card:hover, -.metabolism-card:hover, -.body-fat-card:hover, -.measurements-card:hover, -.advice-card:hover { - background: rgba(255, 255, 255, 0.98); - border-color: rgba(76, 175, 80, 0.4); -} - -/* 免责声明卡片背景 */ -.disclaimer-card { - background: rgba(255, 243, 205, 0.95); - backdrop-filter: blur(15px); - border: 1px solid rgba(255, 234, 167, 0.5); -} - -/* 错误区域背景 */ -.error-content { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(20px); - border: 1px solid rgba(220, 53, 69, 0.2); -} - -/* 输入框背景 */ -.form-input, -.form-select { - background: rgba(248, 255, 248, 0.9); - backdrop-filter: blur(10px); -} - -.form-input:focus, -.form-select:focus { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(15px); -} - -/* 信息项背景 */ -.info-item { - background: rgba(248, 255, 248, 0.8); - backdrop-filter: blur(5px); -} - -/* BMI分类背景 */ -.bmi-category { - background: rgba(232, 245, 232, 0.9); - backdrop-filter: blur(10px); -} - -/* 健康建议列表项背景 */ -.health-tips li { - background: rgba(248, 255, 248, 0.8); - backdrop-filter: blur(5px); -} - -/* 按钮背景增强 */ -.submit-btn { - position: relative; - overflow: hidden; -} - -.submit-btn::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); - transition: left 0.5s; -} - -.submit-btn:hover::before { - left: 100%; -} - -/* 重置按钮背景 */ -.reset-btn { - background: rgba(232, 245, 232, 0.9); - backdrop-filter: blur(10px); -} - -.reset-btn:hover { - background: rgba(212, 237, 218, 0.95); -} - -/* 响应式背景调整 */ -@media (max-width: 767px) { - body::after { - background-size: 150px 75px; - animation-duration: 15s; - } - - .form-section::before { - animation-duration: 2s; - } -} - -@media (min-width: 768px) and (max-width: 1024px) { - body::after { - background-size: 180px 90px; - animation-duration: 18s; - } -} - -@media (min-width: 1024px) { - body::after { - background-size: 220px 110px; - animation-duration: 25s; - } - - .container { - background: rgba(255, 255, 255, 0.05); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/index.html b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/index.html deleted file mode 100755 index a60fb0a5..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/index.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - 身体健康分析 - - - - -
-
-

身体健康分析

-

通过身高、体重、年龄、性别多维度分析身体健康状态

-
- -
-
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- - -
-
- - - - -
- -
- -
-
- - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/script.js b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/script.js deleted file mode 100755 index d7b7cb49..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/script.js +++ /dev/null @@ -1,515 +0,0 @@ -// 身体健康分析 JavaScript 功能 - -// DOM 元素获取 -const healthForm = document.getElementById('healthForm'); -const analyzeBtn = document.getElementById('analyzeBtn'); -const btnText = analyzeBtn.querySelector('.btn-text'); -const loadingSpinner = analyzeBtn.querySelector('.loading-spinner'); -const resultSection = document.getElementById('resultSection'); -const errorSection = document.getElementById('errorSection'); -const resetBtn = document.getElementById('resetBtn'); -const retryBtn = document.getElementById('retryBtn'); - -// API 配置 -const API_BASE_URL = 'https://60s.api.shumengya.top/v2/health'; - -// 表单验证规则 -const validationRules = { - height: { - min: 100, - max: 250, - message: '身高应在100-250cm之间' - }, - weight: { - min: 30, - max: 200, - message: '体重应在30-200kg之间' - }, - age: { - min: 1, - max: 120, - message: '年龄应在1-120岁之间' - } -}; - -// 初始化 -document.addEventListener('DOMContentLoaded', function() { - initializeEventListeners(); - setupFormValidation(); -}); - -// 事件监听器初始化 -function initializeEventListeners() { - healthForm.addEventListener('submit', handleFormSubmit); - resetBtn.addEventListener('click', resetForm); - retryBtn.addEventListener('click', retryAnalysis); - - // 输入框实时验证 - const inputs = healthForm.querySelectorAll('input, select'); - inputs.forEach(input => { - input.addEventListener('blur', validateField); - input.addEventListener('input', clearFieldError); - }); -} - -// 表单验证设置 -function setupFormValidation() { - const inputs = healthForm.querySelectorAll('input[type="number"]'); - inputs.forEach(input => { - input.addEventListener('input', function() { - // 移除非数字字符 - this.value = this.value.replace(/[^0-9.]/g, ''); - - // 防止多个小数点 - const parts = this.value.split('.'); - if (parts.length > 2) { - this.value = parts[0] + '.' + parts.slice(1).join(''); - } - }); - }); -} - -// 表单提交处理 -async function handleFormSubmit(event) { - event.preventDefault(); - - if (!validateForm()) { - return; - } - - const formData = getFormData(); - - try { - setLoadingState(true); - hideAllSections(); - - const result = await callHealthAPI(formData); - displayResults(result); - - } catch (error) { - console.error('分析失败:', error); - displayError(error.message || '分析失败,请稍后重试'); - } finally { - setLoadingState(false); - } -} - -// 获取表单数据 -function getFormData() { - return { - height: parseInt(document.getElementById('height').value), - weight: parseInt(document.getElementById('weight').value), - age: parseInt(document.getElementById('age').value), - gender: document.getElementById('gender').value - }; -} - -// 表单验证 -function validateForm() { - let isValid = true; - const inputs = healthForm.querySelectorAll('input, select'); - - inputs.forEach(input => { - if (!validateField({ target: input })) { - isValid = false; - } - }); - - return isValid; -} - -// 单个字段验证 -function validateField(event) { - const field = event.target; - const value = field.value.trim(); - const fieldName = field.name; - - // 清除之前的错误状态 - clearFieldError(event); - - // 必填验证 - if (!value) { - showFieldError(field, '此字段为必填项'); - return false; - } - - // 数值范围验证 - if (validationRules[fieldName]) { - const numValue = parseFloat(value); - const rule = validationRules[fieldName]; - - if (numValue < rule.min || numValue > rule.max) { - showFieldError(field, rule.message); - return false; - } - } - - return true; -} - -// 显示字段错误 -function showFieldError(field, message) { - field.classList.add('error'); - - // 移除已存在的错误消息 - const existingError = field.parentNode.querySelector('.error-message'); - if (existingError) { - existingError.remove(); - } - - // 添加错误消息 - const errorDiv = document.createElement('div'); - errorDiv.className = 'error-message'; - errorDiv.textContent = message; - errorDiv.style.color = '#dc3545'; - errorDiv.style.fontSize = '0.875rem'; - errorDiv.style.marginTop = '5px'; - - field.parentNode.appendChild(errorDiv); -} - -// 清除字段错误 -function clearFieldError(event) { - const field = event.target; - field.classList.remove('error'); - - const errorMessage = field.parentNode.querySelector('.error-message'); - if (errorMessage) { - errorMessage.remove(); - } -} - -// 调用健康分析API -async function callHealthAPI(data) { - const params = new URLSearchParams({ - height: data.height, - weight: data.weight, - age: data.age, - gender: data.gender - }); - - const response = await fetch(`${API_BASE_URL}?${params}`); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const result = await response.json(); - - if (result.code !== 200) { - throw new Error(result.message || '分析失败'); - } - - return result.data; -} - -// 显示分析结果 -function displayResults(data) { - // 基本信息 - displayBasicInfo(data.basic_info); - - // BMI 分析 - displayBMIInfo(data.bmi); - - // 体重评估 - displayWeightAssessment(data.weight_assessment); - - // 代谢分析 - displayMetabolism(data.metabolism); - - // 体脂分析 - displayBodyFat(data.body_fat); - - // 理想三围 - displayMeasurements(data.ideal_measurements); - - // 健康建议 - displayHealthAdvice(data.health_advice); - - // 免责声明 - displayDisclaimer(data.disclaimer); - - // 显示结果区域 - resultSection.style.display = 'block'; - resultSection.scrollIntoView({ behavior: 'smooth' }); -} - -// 显示基本信息 -function displayBasicInfo(basicInfo) { - const container = document.getElementById('basicInfo'); - container.innerHTML = ''; - - const infoItems = [ - { label: basicInfo.height_desc, value: basicInfo.height }, - { label: basicInfo.weight_desc, value: basicInfo.weight }, - { label: basicInfo.age_desc, value: basicInfo.age }, - { label: basicInfo.gender_desc, value: basicInfo.gender } - ]; - - infoItems.forEach(item => { - const itemDiv = createInfoItem(item.label, item.value); - container.appendChild(itemDiv); - }); -} - -// 显示BMI信息 -function displayBMIInfo(bmiData) { - const container = document.getElementById('bmiContent'); - container.innerHTML = ` -
${bmiData.value}
-
${bmiData.category}
-
- ${createInfoItem(bmiData.evaluation_desc, bmiData.evaluation).outerHTML} - ${createInfoItem(bmiData.risk_desc, bmiData.risk).outerHTML} -
- `; -} - -// 显示体重评估 -function displayWeightAssessment(weightData) { - const container = document.getElementById('weightContent'); - container.innerHTML = ''; - - const items = [ - { label: weightData.ideal_weight_range_desc, value: weightData.ideal_weight_range }, - { label: weightData.standard_weight_desc, value: weightData.standard_weight }, - { label: weightData.status_desc, value: weightData.status }, - { label: weightData.adjustment_desc, value: weightData.adjustment } - ]; - - const grid = document.createElement('div'); - grid.className = 'info-grid'; - - items.forEach(item => { - const itemDiv = createInfoItem(item.label, item.value); - grid.appendChild(itemDiv); - }); - - container.appendChild(grid); -} - -// 显示代谢分析 -function displayMetabolism(metabolismData) { - const container = document.getElementById('metabolismContent'); - container.innerHTML = ''; - - const items = [ - { label: metabolismData.bmr_desc, value: metabolismData.bmr }, - { label: metabolismData.tdee_desc, value: metabolismData.tdee }, - { label: metabolismData.recommended_calories_desc, value: metabolismData.recommended_calories }, - { label: metabolismData.weight_loss_calories_desc, value: metabolismData.weight_loss_calories }, - { label: metabolismData.weight_gain_calories_desc, value: metabolismData.weight_gain_calories } - ]; - - const grid = document.createElement('div'); - grid.className = 'info-grid'; - - items.forEach(item => { - const itemDiv = createInfoItem(item.label, item.value); - grid.appendChild(itemDiv); - }); - - container.appendChild(grid); -} - -// 显示体脂分析 -function displayBodyFat(bodyFatData) { - const container = document.getElementById('bodyFatContent'); - container.innerHTML = ''; - - const items = [ - { label: bodyFatData.percentage_desc, value: bodyFatData.percentage }, - { label: bodyFatData.category_desc, value: bodyFatData.category }, - { label: bodyFatData.fat_weight_desc, value: bodyFatData.fat_weight }, - { label: bodyFatData.lean_weight_desc, value: bodyFatData.lean_weight } - ]; - - const grid = document.createElement('div'); - grid.className = 'info-grid'; - - items.forEach(item => { - const itemDiv = createInfoItem(item.label, item.value); - grid.appendChild(itemDiv); - }); - - container.appendChild(grid); -} - -// 显示理想三围 -function displayMeasurements(measurementsData) { - const container = document.getElementById('measurementsContent'); - container.innerHTML = ''; - - const items = [ - { label: measurementsData.chest_desc, value: measurementsData.chest }, - { label: measurementsData.waist_desc, value: measurementsData.waist }, - { label: measurementsData.hip_desc, value: measurementsData.hip } - ]; - - const grid = document.createElement('div'); - grid.className = 'info-grid'; - - items.forEach(item => { - const itemDiv = createInfoItem(item.label, item.value); - grid.appendChild(itemDiv); - }); - - // 添加说明 - const note = document.createElement('p'); - note.style.marginTop = '15px'; - note.style.fontSize = '0.9rem'; - note.style.color = '#4a7c59'; - note.style.textAlign = 'center'; - note.textContent = measurementsData.note; - - container.appendChild(grid); - container.appendChild(note); -} - -// 显示健康建议 -function displayHealthAdvice(adviceData) { - const container = document.getElementById('adviceContent'); - container.innerHTML = ''; - - // 饮水量建议 - const waterDiv = createAdviceSection(adviceData.daily_water_intake_desc, adviceData.daily_water_intake); - container.appendChild(waterDiv); - - // 运动建议 - const exerciseDiv = createAdviceSection(adviceData.exercise_recommendation_desc, adviceData.exercise_recommendation); - container.appendChild(exerciseDiv); - - // 营养建议 - const nutritionDiv = createAdviceSection(adviceData.nutrition_advice_desc, adviceData.nutrition_advice); - container.appendChild(nutritionDiv); - - // 健康提示 - const tipsDiv = document.createElement('div'); - tipsDiv.innerHTML = ` -

${adviceData.health_tips_desc}

-
    - `; - - const tipsList = tipsDiv.querySelector('.health-tips'); - adviceData.health_tips.forEach(tip => { - const li = document.createElement('li'); - li.textContent = tip; - tipsList.appendChild(li); - }); - - container.appendChild(tipsDiv); -} - -// 创建建议区块 -function createAdviceSection(title, content) { - const div = document.createElement('div'); - div.style.marginBottom = '20px'; - div.innerHTML = ` -

    ${title}

    -

    ${content}

    - `; - return div; -} - -// 显示免责声明 -function displayDisclaimer(disclaimer) { - const container = document.getElementById('disclaimer'); - container.textContent = disclaimer; -} - -// 创建信息项 -function createInfoItem(label, value) { - const div = document.createElement('div'); - div.className = 'info-item'; - div.innerHTML = ` -
    ${label}
    -
    ${value}
    - `; - return div; -} - -// 显示错误信息 -function displayError(message) { - const errorMessage = document.getElementById('errorMessage'); - errorMessage.textContent = message; - errorSection.style.display = 'block'; - errorSection.scrollIntoView({ behavior: 'smooth' }); -} - -// 设置加载状态 -function setLoadingState(isLoading) { - if (isLoading) { - analyzeBtn.disabled = true; - btnText.style.display = 'none'; - loadingSpinner.style.display = 'block'; - } else { - analyzeBtn.disabled = false; - btnText.style.display = 'block'; - loadingSpinner.style.display = 'none'; - } -} - -// 隐藏所有结果区域 -function hideAllSections() { - resultSection.style.display = 'none'; - errorSection.style.display = 'none'; -} - -// 重置表单 -function resetForm() { - healthForm.reset(); - hideAllSections(); - - // 清除所有错误状态 - const errorInputs = healthForm.querySelectorAll('.error'); - errorInputs.forEach(input => { - input.classList.remove('error'); - }); - - const errorMessages = healthForm.querySelectorAll('.error-message'); - errorMessages.forEach(msg => msg.remove()); - - // 滚动到表单顶部 - healthForm.scrollIntoView({ behavior: 'smooth' }); -} - -// 重试分析 -function retryAnalysis() { - hideAllSections(); - healthForm.scrollIntoView({ behavior: 'smooth' }); -} - -// 工具函数:防抖 -function debounce(func, wait) { - let timeout; - return function executedFunction(...args) { - const later = () => { - clearTimeout(timeout); - func(...args); - }; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; -} - -// 添加CSS样式到错误输入框 -const style = document.createElement('style'); -style.textContent = ` - .form-input.error, - .form-select.error { - border-color: #dc3545 !important; - box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.1) !important; - } -`; -document.head.appendChild(style); - -// 页面可见性变化处理(用户切换标签页时暂停动画等) -document.addEventListener('visibilitychange', function() { - if (document.hidden) { - // 页面隐藏时的处理 - document.body.style.animationPlayState = 'paused'; - } else { - // 页面显示时的处理 - document.body.style.animationPlayState = 'running'; - } -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/styles.css b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/styles.css deleted file mode 100755 index 20780ffb..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/styles.css +++ /dev/null @@ -1,697 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: #2d5a3d; - min-height: 100vh; -} - -/* 容器布局 */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; - padding: 20px 0; -} - -.title { - font-size: 2.5rem; - font-weight: 700; - color: #1a4d2e; - margin-bottom: 10px; - text-shadow: 0 2px 4px rgba(26, 77, 46, 0.1); -} - -.subtitle { - font-size: 1.1rem; - color: #4a7c59; - font-weight: 400; -} - -/* 主内容区域 */ -.main-content { - flex: 1; - display: flex; - flex-direction: column; - gap: 30px; -} - -/* 表单区域 */ -.form-section { - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 32px rgba(26, 77, 46, 0.1); - border: 1px solid rgba(144, 238, 144, 0.3); -} - -.health-form { - display: grid; - gap: 20px; -} - -.form-group { - display: flex; - flex-direction: column; - gap: 8px; -} - -.form-label { - font-weight: 600; - color: #2d5a3d; - font-size: 1rem; -} - -.form-input, -.form-select { - padding: 15px 20px; - border: 2px solid #a8e6a3; - border-radius: 12px; - font-size: 1rem; - background: #f8fff8; - color: #2d5a3d; - transition: all 0.3s ease; -} - -.form-input:focus, -.form-select:focus { - outline: none; - border-color: #4caf50; - box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1); - background: #ffffff; -} - -.form-input::placeholder { - color: #81c784; -} - -/* 提交按钮 */ -.submit-btn { - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; - border: none; - padding: 18px 30px; - border-radius: 12px; - font-size: 1.1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - position: relative; - overflow: hidden; - margin-top: 10px; -} - -.submit-btn:hover { - background: linear-gradient(135deg, #45a049, #5cb85c); - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(76, 175, 80, 0.3); -} - -.submit-btn:active { - transform: translateY(0); -} - -.submit-btn:disabled { - background: #c8e6c9; - cursor: not-allowed; - transform: none; - box-shadow: none; -} - -/* 加载动画 */ -.loading-spinner { - width: 20px; - height: 20px; - border: 2px solid rgba(255, 255, 255, 0.3); - border-top: 2px solid white; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 结果区域 */ -.result-section { - animation: fadeInUp 0.6s ease-out; -} - -.result-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 25px; - flex-wrap: wrap; - gap: 15px; -} - -.result-title { - font-size: 2rem; - color: #1a4d2e; - font-weight: 700; -} - -.reset-btn { - background: #e8f5e8; - color: #2d5a3d; - border: 2px solid #a8e6a3; - padding: 10px 20px; - border-radius: 8px; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; -} - -.reset-btn:hover { - background: #d4edda; - border-color: #4caf50; -} - -/* 结果卡片 */ -.result-content { - display: grid; - gap: 20px; -} - -.basic-info-card, -.bmi-card, -.weight-card, -.metabolism-card, -.body-fat-card, -.measurements-card, -.advice-card, -.disclaimer-card { - background: rgba(255, 255, 255, 0.95); - border-radius: 16px; - padding: 25px; - box-shadow: 0 6px 20px rgba(26, 77, 46, 0.08); - border: 1px solid rgba(144, 238, 144, 0.2); - transition: transform 0.3s ease, box-shadow 0.3s ease; -} - -.basic-info-card:hover, -.bmi-card:hover, -.weight-card:hover, -.metabolism-card:hover, -.body-fat-card:hover, -.measurements-card:hover, -.advice-card:hover { - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(26, 77, 46, 0.12); -} - -.card-title { - font-size: 1.4rem; - color: #1a4d2e; - font-weight: 700; - margin-bottom: 15px; - border-bottom: 2px solid #e8f5e8; - padding-bottom: 10px; -} - -/* 信息网格 */ -.info-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 15px; -} - -.info-item { - background: #f8fff8; - padding: 15px; - border-radius: 10px; - border-left: 4px solid #4caf50; -} - -.info-label { - font-size: 0.9rem; - color: #4a7c59; - font-weight: 600; - margin-bottom: 5px; -} - -.info-value { - font-size: 1.2rem; - color: #2d5a3d; - font-weight: 700; -} - -/* BMI 特殊样式 */ -.bmi-value { - font-size: 2.5rem; - font-weight: 800; - color: #4caf50; - text-align: center; - margin: 15px 0; -} - -.bmi-category { - text-align: center; - font-size: 1.3rem; - font-weight: 600; - color: #2d5a3d; - background: #e8f5e8; - padding: 10px; - border-radius: 8px; - margin: 10px 0; -} - -/* 健康建议列表 */ -.health-tips { - list-style: none; - padding: 0; -} - -.health-tips li { - background: #f8fff8; - margin: 10px 0; - padding: 12px 15px; - border-radius: 8px; - border-left: 4px solid #81c784; - position: relative; -} - -.health-tips li::before { - content: "✓"; - color: #4caf50; - font-weight: bold; - margin-right: 10px; -} - -/* 免责声明 */ -.disclaimer { - background: #fff3cd; - border: 1px solid #ffeaa7; - color: #856404; - padding: 15px; - border-radius: 8px; - font-size: 0.95rem; - line-height: 1.5; - text-align: center; -} - -/* 错误区域 */ -.error-section { - text-align: center; - padding: 40px 20px; -} - -.error-content { - background: rgba(255, 255, 255, 0.95); - border-radius: 16px; - padding: 30px; - box-shadow: 0 6px 20px rgba(220, 53, 69, 0.1); - border: 1px solid rgba(220, 53, 69, 0.2); - max-width: 400px; - margin: 0 auto; -} - -.error-title { - color: #dc3545; - font-size: 1.5rem; - margin-bottom: 15px; -} - -.error-message { - color: #6c757d; - margin-bottom: 20px; -} - -.retry-btn { - background: #dc3545; - color: white; - border: none; - padding: 12px 24px; - border-radius: 8px; - font-weight: 600; - cursor: pointer; - transition: background 0.3s ease; -} - -.retry-btn:hover { - background: #c82333; -} - -/* 底部 */ -.footer { - text-align: center; - padding: 20px 0; - margin-top: 30px; - border-top: 1px solid rgba(144, 238, 144, 0.3); -} - -.footer-text { - color: #4a7c59; - font-size: 0.9rem; -} - -/* 动画效果 */ -@keyframes fadeInUp { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 30px; - } - - .title { - font-size: 2.8rem; - } - - .form-section { - padding: 35px; - } - - .health-form { - grid-template-columns: repeat(2, 1fr); - gap: 25px; - } - - .form-group:last-child { - grid-column: 1 / -1; - } - - .result-content { - grid-template-columns: repeat(2, 1fr); - } - - .advice-card, - .disclaimer-card { - grid-column: 1 / -1; - } -} - -/* 电脑端适配 (1024px+) */ -@media (min-width: 1024px) { - .container { - padding: 40px; - max-width: 1400px; - } - - .title { - font-size: 3.2rem; - } - - .main-content { - flex-direction: row; - gap: 40px; - align-items: flex-start; - } - - .form-section { - flex: 0 0 380px; - position: sticky; - top: 20px; - max-height: calc(100vh - 40px); - overflow-y: auto; - } - - .result-section, - .error-section { - flex: 1; - min-width: 0; - } - - /* 桌面端结果区域重新设计 - 使用更清晰的布局 */ - .result-content { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 25px; - grid-auto-rows: min-content; - } - - /* 基本信息卡片 - 占满第一行 */ - .basic-info-card { - grid-column: 1 / -1; - } - - /* 第二行:BMI、体重评估、代谢分析 */ - .bmi-card, - .weight-card, - .metabolism-card { - grid-column: span 1; - } - - /* 第三行:体脂分析和理想三围 */ - .body-fat-card { - grid-column: span 2; - } - - .measurements-card { - grid-column: span 1; - } - - /* 第四行:健康建议 - 占满整行 */ - .advice-card { - grid-column: 1 / -1; - } - - /* 第五行:免责声明 - 占满整行 */ - .disclaimer-card { - grid-column: 1 / -1; - } - - /* 基本信息网格优化 */ - .basic-info-card .info-grid { - grid-template-columns: repeat(4, 1fr); - gap: 20px; - } - - /* BMI卡片特殊布局 */ - .bmi-card { - display: flex; - flex-direction: column; - min-height: 280px; - } - - .bmi-card .bmi-content { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - text-align: center; - } - - .bmi-value { - font-size: 3rem; - margin: 20px 0; - } - - /* 体重评估卡片布局优化 */ - .weight-card { - display: flex; - flex-direction: column; - min-height: 280px; - } - - .weight-card .weight-content { - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; - } - - .weight-card .info-grid { - grid-template-columns: 1fr; - gap: 12px; - } - - /* 代谢分析卡片布局优化 */ - .metabolism-card { - display: flex; - flex-direction: column; - min-height: 280px; - } - - .metabolism-card .metabolism-content { - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; - } - - .metabolism-card .info-grid { - grid-template-columns: 1fr; - gap: 12px; - } - - /* 体脂分析卡片网格优化 */ - .body-fat-card .info-grid { - grid-template-columns: repeat(2, 1fr); - gap: 15px; - } - - /* 理想三围卡片网格优化 */ - .measurements-card { - display: flex; - flex-direction: column; - min-height: 200px; - } - - .measurements-card .measurements-content { - flex: 1; - display: flex; - flex-direction: column; - justify-content: center; - } - - .measurements-card .info-grid { - grid-template-columns: 1fr; - gap: 15px; - } - - /* 健康建议卡片布局优化 */ - .advice-card { - padding: 30px; - } - - .advice-card .advice-content { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 25px; - margin-bottom: 25px; - } - - .advice-card .health-tips { - grid-column: 1 / -1; - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 15px; - list-style: none; - padding: 0; - } - - /* 表单区域优化 */ - .health-form { - display: grid; - gap: 25px; - } - - .form-group { - margin-bottom: 0; - } - - .submit-btn { - margin-top: 20px; - padding: 20px 30px; - font-size: 1.2rem; - } -} - -/* 手机端适配 (最高优先级) */ -@media (max-width: 767px) { - .container { - padding: 15px; - } - - .header { - margin-bottom: 20px; - padding: 15px 0; - } - - .title { - font-size: 2rem; - } - - .subtitle { - font-size: 1rem; - } - - .form-section { - padding: 20px; - border-radius: 16px; - } - - .form-input, - .form-select { - padding: 12px 16px; - font-size: 16px; /* 防止iOS缩放 */ - } - - .submit-btn { - padding: 16px 24px; - font-size: 1rem; - } - - .result-header { - flex-direction: column; - align-items: stretch; - gap: 15px; - } - - .result-title { - font-size: 1.6rem; - text-align: center; - } - - .reset-btn { - align-self: center; - padding: 12px 24px; - } - - .basic-info-card, - .bmi-card, - .weight-card, - .metabolism-card, - .body-fat-card, - .measurements-card, - .advice-card, - .disclaimer-card { - padding: 20px; - border-radius: 12px; - } - - .card-title { - font-size: 1.2rem; - } - - .info-grid { - grid-template-columns: 1fr; - gap: 12px; - } - - .bmi-value { - font-size: 2rem; - } - - .bmi-category { - font-size: 1.1rem; - } - - .health-tips li { - padding: 10px 12px; - font-size: 0.95rem; - } - - .error-content { - padding: 25px 20px; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/返回接口.json deleted file mode 100755 index 934ab11b..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/返回接口.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "basic_info": { - "height": "176cm", - "height_desc": "身高", - "weight": "60kg", - "weight_desc": "体重", - "gender": "男性", - "gender_desc": "性别", - "age": "24岁", - "age_desc": "年龄" - }, - "bmi": { - "value": 19.37, - "value_desc": "BMI 值", - "category": "正常体重", - "category_desc": "BMI 分类", - "evaluation": "体重正常,保持良好", - "evaluation_desc": "BMI 评价", - "risk": "健康风险较低", - "risk_desc": "健康风险" - }, - "weight_assessment": { - "ideal_weight_range": "57.3-74.3kg", - "ideal_weight_range_desc": "理想体重范围", - "standard_weight": "71kg", - "standard_weight_desc": "标准体重", - "status": "体重正常", - "status_desc": "体重状态", - "adjustment": "保持当前体重", - "adjustment_desc": "调整建议" - }, - "metabolism": { - "bmr": "1601 卡路里/天", - "bmr_desc": "基础代谢率", - "tdee": "2561 卡路里/天", - "tdee_desc": "每日总消耗", - "recommended_calories": "2561 卡路里/天", - "recommended_calories_desc": "推荐卡路里摄入", - "weight_loss_calories": "2061 卡路里/天", - "weight_loss_calories_desc": "减重卡路里", - "weight_gain_calories": "2861 卡路里/天", - "weight_gain_calories_desc": "增重卡路里" - }, - "body_surface_area": { - "value": "1.74m²", - "value_desc": "体表面积", - "formula": "Du Bois 公式", - "formula_desc": "计算公式" - }, - "body_fat": { - "percentage": "12.6%", - "percentage_desc": "体脂率", - "category": "正常", - "category_desc": "体脂分类", - "fat_weight": "7.6kg", - "fat_weight_desc": "脂肪重量", - "lean_weight": "52.4kg", - "lean_weight_desc": "瘦体重" - }, - "health_advice": { - "daily_water_intake": "2000ml (约 8 杯水),运动时需额外补充 500-1000ml", - "daily_water_intake_desc": "每日饮水量", - "exercise_recommendation": "继续保持运动习惯,有氧运动和力量训练相结合效果更佳。年轻人可选择多样化的运动方式,建议每周运动 3-5 次", - "exercise_recommendation_desc": "运动建议", - "nutrition_advice": "保持均衡饮食,三大营养素合理搭配,定时定量进餐。年轻人新陈代谢较快,可适当增加能量摄入,男性可适当增加蛋白质摄入", - "nutrition_advice_desc": "营养建议", - "health_tips": [ - "保持充足睡眠,成年人建议每天 7-9 小时", - "定期体检有助于早期发现健康问题", - "保持良好心态,适当释放压力", - "年轻人要注意作息规律,合理安排工作与休息", - "长时间用眼后适当休息,保护视力", - "培养兴趣爱好,保持积极的生活态度", - "多饮水,成年人每天 1500-2000ml 为宜" - ], - "health_tips_desc": "健康提示" - }, - "ideal_measurements": { - "chest": "84cm", - "chest_desc": "胸围", - "waist": "74cm", - "waist_desc": "腰围", - "hip": "83cm", - "hip_desc": "臀围", - "note": "男性理想三围参考标准", - "note_desc": "说明" - }, - "disclaimer": "结果基于通用公式和统计数据,仅供参考,不能替代专业医疗建议。如有健康问题,请咨询医生。" - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/配色方案.html b/InfoGenie-frontend/public/60sapi/实用功能/配色方案.html new file mode 100644 index 00000000..bc62c780 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/配色方案.html @@ -0,0 +1,64 @@ + + + + +配色方案 + + + + + +
    + +

    🎨 配色方案

    +
    +
    +
    + +
    +
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/background.css b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/background.css deleted file mode 100755 index b2138067..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/background.css +++ /dev/null @@ -1,187 +0,0 @@ -/* 背景样式文件 - 单独管理所有背景相关样式 */ - -/* 主体背景 */ -body { - background: linear-gradient(135deg, #f0fff4 0%, #e6fffa 50%, #f0fff4 100%); - background-attachment: fixed; - position: relative; -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(104, 211, 145, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(72, 187, 120, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(56, 161, 105, 0.05) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 容器背景 */ -.container { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(10px); - border-radius: 20px; - border: 1px solid rgba(255, 255, 255, 0.2); -} - -/* 输入区域背景 */ -.input-section { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(20px); - border: 1px solid rgba(104, 211, 145, 0.2); - position: relative; - overflow: hidden; -} - -.input-section::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 3px; - background: linear-gradient(90deg, #48bb78, #68d391, #9ae6b4); -} - -/* 配色方案卡片背景 */ -.palette { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(15px); - border: 1px solid rgba(104, 211, 145, 0.15); - position: relative; - overflow: hidden; -} - -.palette::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 2px; - background: linear-gradient(90deg, transparent, #68d391, transparent); - opacity: 0; - transition: opacity 0.3s ease; -} - -.palette:hover::before { - opacity: 1; -} - -/* 颜色信息背景 */ -.color-info { - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(10px); - border: 1px solid rgba(104, 211, 145, 0.2); -} - -/* 颜色项背景 */ -.color-item { - background: rgba(255, 255, 255, 0.8); - backdrop-filter: blur(5px); - border: 1px solid rgba(104, 211, 145, 0.15); - position: relative; -} - -.color-item::after { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: linear-gradient(45deg, transparent 48%, rgba(104, 211, 145, 0.05) 50%, transparent 52%); - opacity: 0; - transition: opacity 0.3s ease; - pointer-events: none; -} - -.color-item:hover::after { - opacity: 1; -} - -/* 颜色详情背景 */ -.color-detail { - background: rgba(104, 211, 145, 0.08); - border: 1px solid rgba(104, 211, 145, 0.1); - position: relative; -} - -.color-detail::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, transparent 100%); - pointer-events: none; -} - -/* 按钮背景 */ -.generate-btn { - background: linear-gradient(135deg, #48bb78 0%, #68d391 50%, #9ae6b4 100%); - position: relative; - overflow: hidden; -} - -.generate-btn::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); - transition: left 0.5s ease; -} - -.generate-btn:hover::before { - left: 100%; -} - -/* 加载动画背景 */ -.loading { - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(10px); - border-radius: 12px; - border: 1px solid rgba(104, 211, 145, 0.2); -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - body { - background: linear-gradient(180deg, #f0fff4 0%, #e6fffa 100%); - } - - .container { - background: rgba(255, 255, 255, 0.05); - backdrop-filter: blur(5px); - } - - .input-section, - .palette, - .color-info { - backdrop-filter: blur(10px); - } -} - -@media (max-width: 480px) { - body::before { - background-image: - radial-gradient(circle at 50% 50%, rgba(104, 211, 145, 0.08) 0%, transparent 70%); - } - - .container { - background: transparent; - backdrop-filter: none; - border: none; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/index.html b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/index.html deleted file mode 100755 index f114803d..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/index.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - 配色方案生成器 - - - - -
    -
    -

    配色方案生成器

    -

    输入颜色值,获取专业的配色方案

    -
    - -
    -
    -
    - -
    - - -
    -
    - -
    - - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    - -
    -

    基于色彩理论的专业配色方案生成

    -
    -
    - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/script.js b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/script.js deleted file mode 100755 index 52c608cd..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/script.js +++ /dev/null @@ -1,315 +0,0 @@ -// 配色方案生成器 JavaScript -class ColorPaletteGenerator { - constructor() { - this.apiUrl = 'https://60s.api.shumengya.top/v2/color/palette'; - this.init(); - } - - init() { - this.bindEvents(); - this.loadDefaultPalette(); - } - - bindEvents() { - const colorInput = document.getElementById('colorInput'); - const colorPicker = document.getElementById('colorPicker'); - const generateBtn = document.getElementById('generateBtn'); - const formatSelect = document.getElementById('formatSelect'); - - // 颜色输入框事件 - colorInput.addEventListener('input', (e) => { - const color = e.target.value; - if (this.isValidColor(color)) { - colorPicker.value = color; - } - }); - - // 颜色选择器事件 - colorPicker.addEventListener('change', (e) => { - colorInput.value = e.target.value; - }); - - // 生成按钮事件 - generateBtn.addEventListener('click', () => { - this.generatePalette(); - }); - - // 回车键生成 - colorInput.addEventListener('keypress', (e) => { - if (e.key === 'Enter') { - this.generatePalette(); - } - }); - - // 格式选择事件 - formatSelect.addEventListener('change', () => { - const currentColor = colorInput.value; - if (currentColor && this.isValidColor(currentColor)) { - this.generatePalette(); - } - }); - } - - // 验证颜色格式 - isValidColor(color) { - const hexRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/; - return hexRegex.test(color); - } - - // 显示加载状态 - showLoading() { - const loading = document.getElementById('loading'); - const colorInfo = document.getElementById('colorInfo'); - const palettesContainer = document.getElementById('palettesContainer'); - - loading.style.display = 'block'; - colorInfo.style.display = 'none'; - palettesContainer.innerHTML = ''; - } - - // 隐藏加载状态 - hideLoading() { - const loading = document.getElementById('loading'); - loading.style.display = 'none'; - } - - // 生成配色方案 - async generatePalette() { - const colorInput = document.getElementById('colorInput'); - const formatSelect = document.getElementById('formatSelect'); - const color = colorInput.value.trim(); - const format = formatSelect.value; - - if (!color) { - this.showError('请输入颜色值'); - return; - } - - if (!this.isValidColor(color)) { - this.showError('请输入有效的十六进制颜色值(如:#33AAFF)'); - return; - } - - this.showLoading(); - - try { - const url = new URL(this.apiUrl); - url.searchParams.append('color', color); - url.searchParams.append('encoding', format); - - const response = await fetch(url); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200) { - this.displayResults(data.data); - } else { - throw new Error(data.message || '获取配色方案失败'); - } - } catch (error) { - console.error('Error:', error); - this.showError('获取配色方案失败,请检查网络连接或稍后重试'); - } finally { - this.hideLoading(); - } - } - - // 显示错误信息 - showError(message) { - const palettesContainer = document.getElementById('palettesContainer'); - palettesContainer.innerHTML = ` -
    -

    ❌ ${message}

    -
    - `; - } - - // 显示结果 - displayResults(data) { - this.displayColorInfo(data.input); - this.displayPalettes(data.palettes); - } - - // 显示颜色信息 - displayColorInfo(inputData) { - const colorInfo = document.getElementById('colorInfo'); - const colorPreview = document.getElementById('colorPreview'); - const colorDetails = document.getElementById('colorDetails'); - - colorPreview.style.backgroundColor = inputData.hex; - - colorDetails.innerHTML = ` -
    - HEX - ${inputData.hex} -
    -
    - RGB - rgb(${inputData.rgb.r}, ${inputData.rgb.g}, ${inputData.rgb.b}) -
    -
    - HSL - hsl(${inputData.hsl.h}°, ${inputData.hsl.s}%, ${inputData.hsl.l}%) -
    -
    - 色系 - ${inputData.name} -
    - `; - - colorInfo.style.display = 'block'; - } - - // 显示配色方案 - displayPalettes(palettes) { - const palettesContainer = document.getElementById('palettesContainer'); - - palettesContainer.innerHTML = palettes.map(palette => ` -
    -
    -

    ${palette.name}

    -

    ${palette.description}

    -
    -
    - ${palette.colors.map(color => ` -
    -
    -
    -
    ${color.name}
    -
    ${color.hex}
    -
    ${color.role} • ${color.theory}
    -
    - `).join('')} -
    -
    - `).join(''); - } - - // 加载默认配色方案 - async loadDefaultPalette() { - const colorInput = document.getElementById('colorInput'); - const defaultColor = colorInput.value; - - if (defaultColor && this.isValidColor(defaultColor)) { - await this.generatePalette(); - } - } -} - -// 复制到剪贴板功能 -function copyToClipboard(text) { - if (navigator.clipboard && window.isSecureContext) { - navigator.clipboard.writeText(text).then(() => { - showToast(`已复制 ${text} 到剪贴板`); - }).catch(err => { - console.error('复制失败:', err); - fallbackCopyTextToClipboard(text); - }); - } else { - fallbackCopyTextToClipboard(text); - } -} - -// 备用复制方法 -function fallbackCopyTextToClipboard(text) { - const textArea = document.createElement('textarea'); - textArea.value = text; - textArea.style.position = 'fixed'; - textArea.style.left = '-999999px'; - textArea.style.top = '-999999px'; - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - - try { - document.execCommand('copy'); - showToast(`已复制 ${text} 到剪贴板`); - } catch (err) { - console.error('复制失败:', err); - showToast('复制失败,请手动复制'); - } - - document.body.removeChild(textArea); -} - -// 显示提示信息 -function showToast(message) { - // 移除已存在的toast - const existingToast = document.querySelector('.toast'); - if (existingToast) { - existingToast.remove(); - } - - const toast = document.createElement('div'); - toast.className = 'toast'; - toast.textContent = message; - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: rgba(45, 90, 39, 0.95); - color: white; - padding: 12px 20px; - border-radius: 8px; - font-size: 14px; - font-weight: 500; - z-index: 10000; - box-shadow: 0 4px 12px rgba(45, 90, 39, 0.3); - transform: translateX(100%); - transition: transform 0.3s ease; - backdrop-filter: blur(10px); - `; - - document.body.appendChild(toast); - - // 动画显示 - setTimeout(() => { - toast.style.transform = 'translateX(0)'; - }, 100); - - // 3秒后隐藏 - setTimeout(() => { - toast.style.transform = 'translateX(100%)'; - setTimeout(() => { - if (toast.parentNode) { - toast.parentNode.removeChild(toast); - } - }, 300); - }, 3000); -} - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', () => { - new ColorPaletteGenerator(); -}); - -// 添加移动端优化 -if ('ontouchstart' in window) { - // 移动端触摸优化 - document.addEventListener('touchstart', function() {}, {passive: true}); - - // 防止双击缩放 - let lastTouchEnd = 0; - document.addEventListener('touchend', function (event) { - const now = (new Date()).getTime(); - if (now - lastTouchEnd <= 300) { - event.preventDefault(); - } - lastTouchEnd = now; - }, false); -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/styles.css b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/styles.css deleted file mode 100755 index f4dd9b67..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/styles.css +++ /dev/null @@ -1,422 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: #2d3748; - min-height: 100vh; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - padding: 30px 0; -} - -.header h1 { - font-size: 2.5rem; - color: #2d5a27; - margin-bottom: 10px; - font-weight: 700; -} - -.subtitle { - font-size: 1.1rem; - color: #68d391; - font-weight: 400; -} - -/* 主内容区域 */ -.main-content { - flex: 1; - display: flex; - flex-direction: column; - gap: 30px; -} - -/* 输入区域 */ -.input-section { - background: rgba(255, 255, 255, 0.9); - padding: 30px; - border-radius: 16px; - box-shadow: 0 4px 20px rgba(45, 90, 39, 0.1); - border: 1px solid rgba(104, 211, 145, 0.2); -} - -.color-input-group { - margin-bottom: 20px; -} - -.color-input-group label, -.format-select label { - display: block; - margin-bottom: 8px; - font-weight: 600; - color: #2d5a27; - font-size: 0.95rem; -} - -.input-wrapper { - display: flex; - gap: 10px; - align-items: center; -} - -#colorInput { - flex: 1; - padding: 12px 16px; - border: 2px solid #e2e8f0; - border-radius: 8px; - font-size: 1rem; - transition: all 0.3s ease; - background: white; -} - -#colorInput:focus { - outline: none; - border-color: #68d391; - box-shadow: 0 0 0 3px rgba(104, 211, 145, 0.1); -} - -#colorPicker { - width: 50px; - height: 44px; - border: 2px solid #e2e8f0; - border-radius: 8px; - cursor: pointer; - background: none; -} - -.format-select { - margin-bottom: 25px; -} - -#formatSelect { - width: 100%; - padding: 12px 16px; - border: 2px solid #e2e8f0; - border-radius: 8px; - font-size: 1rem; - background: white; - cursor: pointer; - transition: all 0.3s ease; -} - -#formatSelect:focus { - outline: none; - border-color: #68d391; - box-shadow: 0 0 0 3px rgba(104, 211, 145, 0.1); -} - -.generate-btn { - width: 100%; - padding: 14px 24px; - background: linear-gradient(135deg, #48bb78, #68d391); - color: white; - border: none; - border-radius: 8px; - font-size: 1.1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 12px rgba(72, 187, 120, 0.3); -} - -.generate-btn:hover { - background: linear-gradient(135deg, #38a169, #48bb78); - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(72, 187, 120, 0.4); -} - -.generate-btn:active { - transform: translateY(0); -} - -/* 结果区域 */ -.result-section { - min-height: 200px; -} - -.loading { - text-align: center; - padding: 40px; -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #e2e8f0; - border-top: 4px solid #68d391; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading p { - color: #68d391; - font-weight: 500; -} - -/* 颜色信息 */ -.color-info { - background: rgba(255, 255, 255, 0.9); - padding: 25px; - border-radius: 12px; - margin-bottom: 25px; - box-shadow: 0 2px 10px rgba(45, 90, 39, 0.1); - border: 1px solid rgba(104, 211, 145, 0.2); -} - -.color-info h3 { - color: #2d5a27; - margin-bottom: 15px; - font-size: 1.3rem; -} - -.color-preview { - width: 100%; - height: 60px; - border-radius: 8px; - margin-bottom: 15px; - border: 2px solid rgba(104, 211, 145, 0.3); -} - -.color-details { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); - gap: 15px; -} - -.color-detail { - text-align: center; - padding: 10px; - background: rgba(104, 211, 145, 0.1); - border-radius: 6px; -} - -.color-detail strong { - display: block; - color: #2d5a27; - font-size: 0.9rem; - margin-bottom: 5px; -} - -.color-detail span { - color: #4a5568; - font-size: 0.95rem; -} - -/* 配色方案容器 */ -.palettes-container { - display: grid; - gap: 25px; -} - -.palette { - background: rgba(255, 255, 255, 0.9); - border-radius: 12px; - padding: 25px; - box-shadow: 0 4px 15px rgba(45, 90, 39, 0.1); - border: 1px solid rgba(104, 211, 145, 0.2); - transition: transform 0.3s ease, box-shadow 0.3s ease; -} - -.palette:hover { - transform: translateY(-3px); - box-shadow: 0 8px 25px rgba(45, 90, 39, 0.15); -} - -.palette-header { - margin-bottom: 20px; -} - -.palette-name { - font-size: 1.4rem; - color: #2d5a27; - margin-bottom: 8px; - font-weight: 600; -} - -.palette-description { - color: #68d391; - font-size: 0.95rem; - line-height: 1.5; -} - -.colors-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 15px; -} - -.color-item { - background: white; - border-radius: 8px; - padding: 15px; - border: 1px solid rgba(104, 211, 145, 0.2); - transition: all 0.3s ease; -} - -.color-item:hover { - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(45, 90, 39, 0.1); -} - -.color-swatch { - width: 100%; - height: 50px; - border-radius: 6px; - margin-bottom: 10px; - border: 1px solid rgba(0, 0, 0, 0.1); - cursor: pointer; - position: relative; - overflow: hidden; -} - -.color-swatch::after { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: linear-gradient(45deg, transparent 45%, rgba(255,255,255,0.1) 50%, transparent 55%); - opacity: 0; - transition: opacity 0.3s ease; -} - -.color-swatch:hover::after { - opacity: 1; -} - -.color-name { - font-weight: 600; - color: #2d5a27; - margin-bottom: 5px; - font-size: 0.9rem; -} - -.color-hex { - font-family: 'Courier New', monospace; - color: #4a5568; - font-size: 0.85rem; - margin-bottom: 3px; -} - -.color-role { - font-size: 0.8rem; - color: #68d391; - font-style: italic; -} - -/* 底部 */ -.footer { - text-align: center; - padding: 30px 0; - margin-top: 40px; - color: #68d391; - font-size: 0.9rem; -} - -/* 平板端适配 */ -@media (max-width: 1024px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2.2rem; - } - - .colors-grid { - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); - } -} - -/* 手机端适配 */ -@media (max-width: 768px) { - .container { - padding: 10px; - } - - .header { - margin-bottom: 25px; - padding: 20px 0; - } - - .header h1 { - font-size: 1.8rem; - } - - .subtitle { - font-size: 1rem; - } - - .input-section { - padding: 20px; - } - - .input-wrapper { - flex-direction: column; - align-items: stretch; - } - - #colorPicker { - width: 100%; - height: 44px; - } - - .colors-grid { - grid-template-columns: 1fr; - } - - .color-details { - grid-template-columns: repeat(2, 1fr); - } - - .palette { - padding: 20px; - } - - .palette-name { - font-size: 1.2rem; - } -} - -@media (max-width: 480px) { - .header h1 { - font-size: 1.6rem; - } - - .input-section { - padding: 15px; - } - - .palette { - padding: 15px; - } - - .color-details { - grid-template-columns: 1fr; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/返回接口.json deleted file mode 100755 index 39f73207..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/返回接口.json +++ /dev/null @@ -1,273 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "input": { - "hex": "#DE4F99", - "rgb": { - "r": 222, - "g": 79, - "b": 153 - }, - "hsl": { - "h": 329, - "s": 68, - "l": 59 - }, - "name": "红色系" - }, - "palettes": [ - { - "name": "单色配色", - "description": "基于同一色相,通过调整明度和饱和度创建的和谐配色方案,适合营造统一、专业的视觉效果", - "colors": [ - { - "hex": "#DE4F99", - "name": "主色", - "role": "primary", - "theory": "基础色相" - }, - { - "hex": "#7C184C", - "name": "深色变体", - "role": "dark", - "theory": "降低明度" - }, - { - "hex": "#EEA5CB", - "name": "浅色变体", - "role": "light", - "theory": "提高明度" - }, - { - "hex": "#C96498", - "name": "柔和变体", - "role": "muted", - "theory": "降低饱和度" - }, - { - "hex": "#ED4099", - "name": "鲜艳变体", - "role": "vibrant", - "theory": "提高饱和度" - } - ] - }, - { - "name": "互补配色", - "description": "使用色轮上相对的颜色,创造强烈对比和视觉冲击力,适用于需要突出重点的设计", - "colors": [ - { - "hex": "#DE4F99", - "name": "主色", - "role": "primary", - "theory": "基础色相" - }, - { - "hex": "#4FDE94", - "name": "互补色", - "role": "complementary", - "theory": "色轮对面 +180°" - }, - { - "hex": "#F2BAD7", - "name": "主色浅调", - "role": "primary-light", - "theory": "主色提高明度" - }, - { - "hex": "#BAF2D5", - "name": "互补色浅调", - "role": "complementary-light", - "theory": "互补色提高明度" - } - ] - }, - { - "name": "邻近配色", - "description": "使用色轮上相邻的颜色,创造自然和谐的渐变效果,常见于自然景观中", - "colors": [ - { - "hex": "#DB4FDE", - "name": "邻近色1", - "role": "analogous-1", - "theory": "色相 -30°" - }, - { - "hex": "#DE4F99", - "name": "主色", - "role": "primary", - "theory": "基础色相" - }, - { - "hex": "#DE4F52", - "name": "邻近色2", - "role": "analogous-2", - "theory": "色相 +30°" - }, - { - "hex": "#DE944F", - "name": "邻近色3", - "role": "analogous-3", - "theory": "色相 +60°" - } - ] - }, - { - "name": "三角配色", - "description": "在色轮上形成等边三角形的三种颜色,提供丰富对比的同时保持和谐平衡", - "colors": [ - { - "hex": "#DE4F99", - "name": "主色", - "role": "primary", - "theory": "基础色相" - }, - { - "hex": "#99DE4F", - "name": "三角色1", - "role": "triadic-1", - "theory": "色相 +120°" - }, - { - "hex": "#4F99DE", - "name": "三角色2", - "role": "triadic-2", - "theory": "色相 +240°" - } - ] - }, - { - "name": "分裂互补配色", - "description": "使用互补色两侧的颜色,比纯互补配色更柔和,同时保持强烈的视觉对比", - "colors": [ - { - "hex": "#DE4F99", - "name": "主色", - "role": "primary", - "theory": "基础色相" - }, - { - "hex": "#52DE4F", - "name": "分裂互补色1", - "role": "split-comp-1", - "theory": "互补色 -30°" - }, - { - "hex": "#4FDEDB", - "name": "分裂互补色2", - "role": "split-comp-2", - "theory": "互补色 +30°" - } - ] - }, - { - "name": "四边形配色", - "description": "在色轮上形成正方形的四种颜色,提供最丰富的颜色变化,适合复杂的设计项目", - "colors": [ - { - "hex": "#DE4F99", - "name": "主色", - "role": "primary", - "theory": "基础色相" - }, - { - "hex": "#DEDB4F", - "name": "四边形色1", - "role": "square-1", - "theory": "色相 +90°" - }, - { - "hex": "#4FDE94", - "name": "四边形色2", - "role": "square-2", - "theory": "色相 +180°" - }, - { - "hex": "#4F52DE", - "name": "四边形色3", - "role": "square-3", - "theory": "色相 +270°" - } - ] - }, - { - "name": "Web 设计配色", - "description": "专为 Web 界面设计优化的配色方案,考虑了可访问性和用户体验", - "colors": [ - { - "hex": "#DE4F99", - "name": "品牌主色", - "role": "brand-primary", - "theory": "品牌识别色" - }, - { - "hex": "#982F65", - "name": "按钮悬停", - "role": "hover-state", - "theory": "主色加深变体" - }, - { - "hex": "#F6E9F0", - "name": "背景浅色", - "role": "background", - "theory": "高明度低饱和度" - }, - { - "hex": "#1BDE7A", - "name": "强调色", - "role": "accent", - "theory": "互补色系强调" - }, - { - "hex": "#6B7280", - "name": "文本辅助", - "role": "text-secondary", - "theory": "中性灰色文本" - } - ] - }, - { - "name": "暖色调配色", - "description": "基于暖色系的配色方案,营造温暖、活力和友好的氛围,适合餐饮、儿童产品等", - "colors": [ - { - "hex": "#DE4F99", - "name": "主暖色", - "role": "warm-primary", - "theory": "暖色系基调" - }, - { - "hex": "#DE4FC8", - "name": "暖色变体1", - "role": "warm-variant-1", - "theory": "暖色范围内调整" - }, - { - "hex": "#DE4F5E", - "name": "暖色变体2", - "role": "warm-variant-2", - "theory": "暖色范围内调整" - }, - { - "hex": "#EEA5CB", - "name": "暖色浅调", - "role": "warm-tint", - "theory": "提高明度的暖色" - } - ] - } - ], - "metadata": { - "color_theory": "基于色彩理论生成的专业配色方案", - "total_palettes": 8, - "applications": [ - "Web 设计", - "UI/UX", - "品牌设计", - "室内设计", - "服装搭配" - ] - } - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/background.css deleted file mode 100755 index ead6699d..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/background.css +++ /dev/null @@ -1,232 +0,0 @@ -/* 高维度背景特效样式 - 神秘高级风格 */ - -/* 背景容器 */ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 1; - overflow: hidden; - pointer-events: none; - background: radial-gradient(ellipse at center, - rgba(15, 0, 30, 0.95) 0%, - rgba(5, 0, 15, 0.98) 50%, - rgba(0, 0, 0, 1) 100%); -} - -/* 几何网格层 */ -.geometric-grid { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - linear-gradient(rgba(138, 43, 226, 0.1) 1px, transparent 1px), - linear-gradient(90deg, rgba(138, 43, 226, 0.1) 1px, transparent 1px), - linear-gradient(rgba(75, 0, 130, 0.05) 1px, transparent 1px), - linear-gradient(90deg, rgba(75, 0, 130, 0.05) 1px, transparent 1px); - background-size: 100px 100px, 100px 100px, 20px 20px, 20px 20px; - animation: gridPulse 8s ease-in-out infinite; -} - -@keyframes gridPulse { - 0%, 100% { opacity: 0.3; transform: scale(1); } - 50% { opacity: 0.6; transform: scale(1.02); } -} - -/* 神经网络效果 */ -.neural-network { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 20% 30%, rgba(138, 43, 226, 0.15) 2px, transparent 2px), - radial-gradient(circle at 80% 20%, rgba(75, 0, 130, 0.12) 1px, transparent 1px), - radial-gradient(circle at 40% 70%, rgba(147, 0, 211, 0.1) 1.5px, transparent 1.5px), - radial-gradient(circle at 90% 80%, rgba(138, 43, 226, 0.08) 1px, transparent 1px), - radial-gradient(circle at 10% 90%, rgba(75, 0, 130, 0.1) 2px, transparent 2px); - background-size: 200px 200px, 150px 150px, 300px 300px, 180px 180px, 250px 250px; - animation: neuralFlow 15s linear infinite; -} - -@keyframes neuralFlow { - 0% { transform: translate(0, 0) rotate(0deg); } - 25% { transform: translate(-10px, -5px) rotate(90deg); } - 50% { transform: translate(-5px, -10px) rotate(180deg); } - 75% { transform: translate(5px, -5px) rotate(270deg); } - 100% { transform: translate(0, 0) rotate(360deg); } -} - -/* 粒子系统 */ -.particle-system { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle, rgba(138, 43, 226, 0.4) 1px, transparent 1px), - radial-gradient(circle, rgba(75, 0, 130, 0.3) 0.5px, transparent 0.5px), - radial-gradient(circle, rgba(147, 0, 211, 0.2) 0.8px, transparent 0.8px); - background-size: 80px 80px, 120px 120px, 160px 160px; - background-position: 0 0, 40px 40px, 80px 80px; - animation: particleFloat 20s ease-in-out infinite; -} - -@keyframes particleFloat { - 0%, 100% { transform: translateY(0px) translateX(0px); } - 25% { transform: translateY(-20px) translateX(10px); } - 50% { transform: translateY(-10px) translateX(-15px); } - 75% { transform: translateY(-30px) translateX(5px); } -} - -/* 扫描线效果 */ -.scan-lines { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: repeating-linear-gradient( - 0deg, - transparent 0px, - transparent 2px, - rgba(138, 43, 226, 0.03) 2px, - rgba(138, 43, 226, 0.03) 4px - ); - animation: scanMove 3s linear infinite; -} - -@keyframes scanMove { - 0% { transform: translateY(-100%); } - 100% { transform: translateY(100%); } -} - -/* 全息投影效果 */ -.holographic-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - linear-gradient(45deg, - transparent 30%, - rgba(138, 43, 226, 0.05) 50%, - transparent 70%), - linear-gradient(-45deg, - transparent 30%, - rgba(75, 0, 130, 0.03) 50%, - transparent 70%); - background-size: 200px 200px, 150px 150px; - animation: holographicShift 12s ease-in-out infinite; -} - -@keyframes holographicShift { - 0%, 100% { - background-position: 0% 0%, 100% 100%; - opacity: 0.7; - } - 50% { - background-position: 100% 100%, 0% 0%; - opacity: 1; - } -} - -/* 数据流效果 */ -.data-stream { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - linear-gradient(90deg, - transparent 0%, - rgba(138, 43, 226, 0.1) 50%, - transparent 100%); - background-size: 300px 100%; - animation: dataFlow 8s linear infinite; -} - -@keyframes dataFlow { - 0% { transform: translateX(-100%); } - 100% { transform: translateX(100%); } -} - -/* 量子波动效果 */ -.quantum-waves { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(ellipse 200px 100px at 50% 0%, - rgba(138, 43, 226, 0.1) 0%, - transparent 50%), - radial-gradient(ellipse 300px 150px at 50% 100%, - rgba(75, 0, 130, 0.08) 0%, - transparent 50%); - animation: quantumPulse 10s ease-in-out infinite; -} - -@keyframes quantumPulse { - 0%, 100% { - transform: scale(1) rotate(0deg); - opacity: 0.5; - } - 50% { - transform: scale(1.1) rotate(180deg); - opacity: 0.8; - } -} - -/* 响应式优化 */ -@media (max-width: 768px) { - .geometric-grid { - background-size: 50px 50px, 50px 50px, 10px 10px, 10px 10px; - } - - .neural-network { - background-size: 100px 100px, 75px 75px, 150px 150px, 90px 90px, 125px 125px; - } - - .particle-system { - background-size: 40px 40px, 60px 60px, 80px 80px; - } -} - -/* 减少动画偏好 */ -@media (prefers-reduced-motion: reduce) { - .geometric-grid, - .neural-network, - .particle-system, - .scan-lines, - .holographic-overlay, - .data-stream, - .quantum-waves { - animation: none; - } -} - -/* 高对比度模式 */ -@media (prefers-contrast: high) { - .background-container { - background: radial-gradient(ellipse at center, - rgba(25, 0, 50, 0.95) 0%, - rgba(10, 0, 25, 0.98) 50%, - rgba(0, 0, 0, 1) 100%); - } - - .geometric-grid { - background-image: - linear-gradient(rgba(200, 100, 255, 0.2) 1px, transparent 1px), - linear-gradient(90deg, rgba(200, 100, 255, 0.2) 1px, transparent 1px); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/style.css deleted file mode 100755 index 22b7392a..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/style.css +++ /dev/null @@ -1,1159 +0,0 @@ -/* 全局样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -/* 根变量定义 */ -:root { - /* 神秘色彩系统 */ - --primary-dark: #0a0a0a; - --secondary-dark: #1a1a1a; - --accent-dark: #2a2a2a; - --border-dark: #333333; - - /* 神秘绿色系统 */ - --neon-green: #00ff88; - --dark-green: #004d2a; - --light-green: #66ffaa; - --glow-green: rgba(0, 255, 136, 0.3); - - /* 高级紫色系统 */ - --neon-purple: #8a2be2; - --dark-purple: #4a0e4e; - --light-purple: #b347d9; - --glow-purple: rgba(138, 43, 226, 0.3); - - /* 文字颜色 */ - --text-primary: #ffffff; - --text-secondary: #cccccc; - --text-muted: #888888; - --text-accent: var(--neon-green); - - /* 间距系统 */ - --spacing-xs: 0.5rem; - --spacing-sm: 1rem; - --spacing-md: 1.5rem; - --spacing-lg: 2rem; - --spacing-xl: 3rem; - - /* 字体系统 */ - --font-primary: 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - --font-mono: 'SF Mono', 'Monaco', 'Cascadia Code', 'Roboto Mono', monospace; - - /* 阴影系统 */ - --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3); - --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.4); - --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.5); - --shadow-glow: 0 0 20px var(--glow-green); - --shadow-purple-glow: 0 0 20px var(--glow-purple); - - /* 边框半径 */ - --radius-sm: 4px; - --radius-md: 8px; - --radius-lg: 12px; - --radius-xl: 16px; - - /* 过渡效果 */ - --transition-fast: 0.2s ease; - --transition-normal: 0.3s ease; - --transition-slow: 0.5s ease; -} - -/* 基础样式 */ -body { - font-family: var(--font-primary); - background: var(--primary-dark); - color: var(--text-primary); - line-height: 1.6; - overflow-x: hidden; - min-height: 100vh; - position: relative; -} - -/* 主容器 */ -.main-container { - position: relative; - z-index: 10; - min-height: 100vh; - display: flex; - flex-direction: column; - max-width: 1400px; - margin: 0 auto; - padding: var(--spacing-lg); -} - -/* 头部样式 */ -.header { - margin-bottom: var(--spacing-xl); - position: relative; -} - -.header-content { - display: flex; - justify-content: space-between; - align-items: center; - padding: var(--spacing-lg); - background: linear-gradient(135deg, var(--secondary-dark), var(--accent-dark)); - border: 1px solid var(--border-dark); - border-radius: var(--radius-xl); - backdrop-filter: blur(10px); - position: relative; - overflow: hidden; -} - -.header-content::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, var(--glow-green), transparent); - animation: scanLine 3s infinite; -} - -@keyframes scanLine { - 0% { left: -100%; } - 100% { left: 100%; } -} - -.logo-section { - display: flex; - align-items: center; - gap: var(--spacing-md); -} - -.logo-icon { - font-size: 2.5rem; - color: var(--neon-green); - filter: drop-shadow(0 0 10px var(--glow-green)); - animation: pulse 2s infinite; -} - -@keyframes pulse { - 0%, 100% { transform: scale(1); } - 50% { transform: scale(1.1); } -} - -.title { - font-size: 2.5rem; - font-weight: 700; - background: linear-gradient(45deg, var(--neon-green), var(--light-green)); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - text-shadow: 0 0 20px var(--glow-green); -} - -.subtitle { - font-size: 1rem; - color: var(--text-secondary); - font-family: var(--font-mono); - opacity: 0.8; -} - -.status-indicator { - display: flex; - align-items: center; - gap: var(--spacing-xs); - padding: var(--spacing-sm) var(--spacing-md); - background: rgba(0, 255, 136, 0.1); - border: 1px solid var(--neon-green); - border-radius: var(--radius-lg); - backdrop-filter: blur(5px); -} - -.pulse-dot { - width: 8px; - height: 8px; - background: var(--neon-green); - border-radius: 50%; - animation: pulseGlow 1.5s infinite; -} - -@keyframes pulseGlow { - 0%, 100% { - opacity: 1; - box-shadow: 0 0 5px var(--glow-green); - } - 50% { - opacity: 0.5; - box-shadow: 0 0 15px var(--glow-green); - } -} - -.status-text { - font-size: 0.9rem; - color: var(--neon-green); - font-family: var(--font-mono); -} - -/* 查询区域 */ -.query-section { - margin-bottom: var(--spacing-xl); -} - -.input-container { - display: flex; - gap: var(--spacing-md); - align-items: stretch; -} - -.input-wrapper { - flex: 1; - position: relative; - background: var(--secondary-dark); - border-radius: var(--radius-lg); - overflow: hidden; -} - -.input-icon { - position: absolute; - left: var(--spacing-md); - top: 50%; - transform: translateY(-50%); - color: var(--text-muted); - font-size: 1.2rem; - z-index: 2; - transition: var(--transition-normal); -} - -.url-input { - width: 100%; - padding: var(--spacing-md) var(--spacing-md) var(--spacing-md) 3.5rem; - background: transparent; - border: 2px solid var(--border-dark); - border-radius: var(--radius-lg); - color: var(--text-primary); - font-size: 1.1rem; - font-family: var(--font-mono); - transition: var(--transition-normal); - position: relative; - z-index: 1; -} - -.url-input:focus { - outline: none; - border-color: var(--neon-green); - box-shadow: var(--shadow-glow); -} - -.url-input:focus + .input-border { - opacity: 1; - animation: borderGlow 2s infinite; -} - -.url-input:focus ~ .input-icon { - color: var(--neon-green); -} - -.input-border { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - border: 2px solid var(--neon-green); - border-radius: var(--radius-lg); - opacity: 0; - pointer-events: none; - transition: var(--transition-normal); -} - -@keyframes borderGlow { - 0%, 100% { box-shadow: 0 0 5px var(--glow-green); } - 50% { box-shadow: 0 0 20px var(--glow-green); } -} - -.analyze-btn { - position: relative; - padding: var(--spacing-md) var(--spacing-xl); - background: linear-gradient(135deg, var(--dark-green), var(--neon-green)); - border: none; - border-radius: var(--radius-lg); - color: var(--primary-dark); - font-size: 1.1rem; - font-weight: 600; - cursor: pointer; - overflow: hidden; - transition: var(--transition-normal); - min-width: 150px; -} - -.analyze-btn:hover { - transform: translateY(-2px); - box-shadow: var(--shadow-glow); -} - -.analyze-btn:active { - transform: translateY(0); -} - -.btn-text { - position: relative; - z-index: 2; -} - -.btn-effects { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - pointer-events: none; -} - -.ripple { - position: absolute; - top: 50%; - left: 50%; - width: 0; - height: 0; - background: rgba(255, 255, 255, 0.3); - border-radius: 50%; - transform: translate(-50%, -50%); - transition: var(--transition-fast); -} - -.analyze-btn:active .ripple { - width: 200px; - height: 200px; -} - -/* 加载状态 */ -.loading-container { - display: flex; - justify-content: center; - align-items: center; - padding: var(--spacing-xl); - margin: var(--spacing-xl) 0; -} - -.loading-content { - text-align: center; - display: flex; - flex-direction: column; - align-items: center; - gap: var(--spacing-lg); -} - -.scanner { - position: relative; - width: 200px; - height: 200px; - border: 2px solid var(--border-dark); - border-radius: var(--radius-lg); - background: var(--secondary-dark); - overflow: hidden; -} - -.scanner-line { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 2px; - background: linear-gradient(90deg, transparent, var(--neon-green), transparent); - animation: scannerMove 2s infinite; -} - -@keyframes scannerMove { - 0% { top: 0; } - 100% { top: calc(100% - 2px); } -} - -.scanner-grid { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - display: grid; - grid-template-columns: repeat(4, 1fr); - gap: 1px; -} - -.grid-line { - background: var(--border-dark); - opacity: 0.3; - animation: gridPulse 1.5s infinite; -} - -.grid-line:nth-child(1) { animation-delay: 0s; } -.grid-line:nth-child(2) { animation-delay: 0.2s; } -.grid-line:nth-child(3) { animation-delay: 0.4s; } -.grid-line:nth-child(4) { animation-delay: 0.6s; } - -@keyframes gridPulse { - 0%, 100% { opacity: 0.3; } - 50% { opacity: 0.8; background: var(--glow-green); } -} - -.loading-text { - display: flex; - flex-direction: column; - gap: var(--spacing-xs); -} - -.loading-title { - font-size: 1.5rem; - font-weight: 600; - color: var(--neon-green); -} - -.loading-subtitle { - font-size: 1rem; - color: var(--text-secondary); - font-family: var(--font-mono); -} - -/* 结果展示区域 */ -.results-section { - margin-bottom: var(--spacing-xl); -} - -.results-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: var(--spacing-lg); - padding: var(--spacing-md); - background: var(--secondary-dark); - border-radius: var(--radius-lg); - border: 1px solid var(--border-dark); -} - -.results-title { - display: flex; - align-items: center; - gap: var(--spacing-sm); - font-size: 1.5rem; - font-weight: 600; - color: var(--neon-green); -} - -.results-actions { - display: flex; - gap: var(--spacing-sm); -} - -.action-btn { - display: flex; - align-items: center; - gap: var(--spacing-xs); - padding: var(--spacing-sm) var(--spacing-md); - background: var(--accent-dark); - border: 1px solid var(--border-dark); - border-radius: var(--radius-md); - color: var(--text-secondary); - font-size: 0.9rem; - cursor: pointer; - transition: var(--transition-normal); -} - -.action-btn:hover { - background: var(--border-dark); - color: var(--text-primary); - border-color: var(--neon-green); -} - -/* OG卡片 */ -.og-card { - background: var(--secondary-dark); - border: 1px solid var(--border-dark); - border-radius: var(--radius-xl); - overflow: hidden; - box-shadow: var(--shadow-lg); -} - -.info-section { - padding: var(--spacing-lg); - border-bottom: 1px solid var(--border-dark); -} - -.info-section:last-child { - border-bottom: none; -} - -.section-header { - display: flex; - align-items: center; - gap: var(--spacing-sm); - margin-bottom: var(--spacing-md); - font-size: 1.2rem; - font-weight: 600; - color: var(--text-accent); -} - -.info-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: var(--spacing-md); -} - -.info-item { - display: flex; - flex-direction: column; - gap: var(--spacing-xs); -} - -.info-item label { - font-size: 0.9rem; - color: var(--text-muted); - font-family: var(--font-mono); - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.info-value { - padding: var(--spacing-sm); - background: var(--accent-dark); - border: 1px solid var(--border-dark); - border-radius: var(--radius-md); - color: var(--text-primary); - font-family: var(--font-mono); - word-break: break-all; - transition: var(--transition-normal); -} - -.info-value:hover { - border-color: var(--neon-green); - box-shadow: 0 0 10px var(--glow-green); -} - -.url-value { - color: var(--light-green); - cursor: pointer; -} - -.url-value:hover { - color: var(--neon-green); -} - -/* 媒体预览 */ -.media-preview { - margin-bottom: var(--spacing-md); - border-radius: var(--radius-lg); - overflow: hidden; - background: var(--accent-dark); - border: 1px solid var(--border-dark); - min-height: 200px; - display: flex; - align-items: center; - justify-content: center; -} - -.media-preview img { - max-width: 100%; - max-height: 300px; - object-fit: contain; - border-radius: var(--radius-md); -} - -.no-media { - display: flex; - flex-direction: column; - align-items: center; - gap: var(--spacing-sm); - color: var(--text-muted); - font-size: 1.1rem; -} - -.no-media i { - font-size: 2rem; - opacity: 0.5; -} - -.media-details { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: var(--spacing-md); -} - -/* 错误状态 */ -.error-container { - display: flex; - justify-content: center; - align-items: center; - padding: var(--spacing-xl); - margin: var(--spacing-xl) 0; -} - -.error-content { - text-align: center; - padding: var(--spacing-xl); - background: var(--secondary-dark); - border: 2px solid #ff4444; - border-radius: var(--radius-xl); - max-width: 500px; - box-shadow: 0 0 20px rgba(255, 68, 68, 0.3); -} - -.error-icon { - font-size: 3rem; - color: #ff4444; - margin-bottom: var(--spacing-md); - animation: shake 0.5s infinite; -} - -@keyframes shake { - 0%, 100% { transform: translateX(0); } - 25% { transform: translateX(-5px); } - 75% { transform: translateX(5px); } -} - -.error-title { - font-size: 1.5rem; - font-weight: 600; - color: #ff4444; - margin-bottom: var(--spacing-sm); -} - -.error-message { - color: var(--text-secondary); - margin-bottom: var(--spacing-lg); - font-family: var(--font-mono); -} - -.retry-btn { - display: inline-flex; - align-items: center; - gap: var(--spacing-xs); - padding: var(--spacing-sm) var(--spacing-lg); - background: #ff4444; - border: none; - border-radius: var(--radius-md); - color: white; - font-weight: 600; - cursor: pointer; - transition: var(--transition-normal); -} - -.retry-btn:hover { - background: #ff6666; - transform: translateY(-2px); -} - -/* Tip 消息样式 */ -.tip-container { - position: fixed; - bottom: 2rem; - left: 2rem; - z-index: 999; - opacity: 0; - transform: translateY(20px); - transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94); - pointer-events: none; -} - -.tip-container.active { - opacity: 1; - transform: translateY(0); - pointer-events: auto; -} - -.tip-content { - background: linear-gradient(135deg, - rgba(138, 43, 226, 0.1) 0%, - rgba(75, 0, 130, 0.1) 100%); - border: 1px solid rgba(138, 43, 226, 0.3); - border-radius: var(--radius-lg); - padding: var(--spacing-md); - backdrop-filter: blur(10px); - box-shadow: - 0 8px 32px rgba(0, 0, 0, 0.3), - 0 0 20px rgba(138, 43, 226, 0.1), - inset 0 1px 0 rgba(255, 255, 255, 0.1); - display: flex; - align-items: center; - gap: var(--spacing-sm); - min-width: 300px; - max-width: 400px; -} - -.tip-icon { - font-size: 1.2rem; - color: var(--neon-purple); - flex-shrink: 0; -} - -.tip-text { - color: var(--text-secondary); - font-size: 0.9rem; - line-height: 1.4; -} - -/* 提示消息 */ -.toast-container { - position: fixed; - top: var(--spacing-lg); - right: var(--spacing-lg); - z-index: 1000; - transform: translateX(100%); - transition: var(--transition-normal); -} - -.toast-container.show { - transform: translateX(0); -} - -.toast-content { - display: flex; - align-items: center; - gap: var(--spacing-sm); - padding: var(--spacing-md) var(--spacing-lg); - background: var(--secondary-dark); - border: 1px solid var(--neon-green); - border-radius: var(--radius-lg); - color: var(--text-primary); - box-shadow: var(--shadow-glow); - backdrop-filter: blur(10px); -} - -.toast-icon { - font-size: 1.2rem; - color: var(--neon-green); -} - -.toast-message { - font-family: var(--font-mono); - font-size: 0.9rem; -} - -/* 页脚 */ -.footer { - margin-top: auto; - padding: var(--spacing-lg); - border-top: 1px solid var(--border-dark); - background: var(--secondary-dark); - border-radius: var(--radius-lg); -} - -.footer-content { - display: flex; - justify-content: space-between; - align-items: center; - text-align: center; -} - -.footer-text { - display: flex; - align-items: center; - gap: var(--spacing-xs); - color: var(--text-muted); - font-size: 0.9rem; - font-family: var(--font-mono); -} - -.footer-links { - display: flex; - align-items: center; - gap: var(--spacing-sm); - font-size: 0.8rem; - color: var(--text-muted); -} - -.footer-link { - cursor: pointer; - transition: var(--transition-normal); -} - -.footer-link:hover { - color: var(--neon-green); -} - -.footer-divider { - opacity: 0.5; -} - -/* 响应式设计 */ - -/* 平板设备 */ -@media (max-width: 1024px) { - .main-container { - padding: var(--spacing-md); - } - - .header-content { - flex-direction: column; - gap: var(--spacing-md); - text-align: center; - } - - .title { - font-size: 2rem; - } - - .input-container { - flex-direction: column; - } - - .analyze-btn { - width: 100%; - } - - .info-grid { - grid-template-columns: 1fr; - } - - .results-header { - flex-direction: column; - gap: var(--spacing-md); - } - - .footer-content { - flex-direction: column; - gap: var(--spacing-sm); - } -} - -/* 交互动画增强 */ -.input-glow { - position: absolute; - top: -2px; - left: -2px; - right: -2px; - bottom: -2px; - background: linear-gradient(45deg, - var(--neon-green), - var(--light-green), - var(--neon-purple)); - border-radius: inherit; - z-index: -1; - opacity: 0; - animation: glowPulse 2s ease-in-out; -} - -@keyframes glowPulse { - 0%, 100% { opacity: 0; transform: scale(1); } - 50% { opacity: 0.6; transform: scale(1.02); } -} - -.input-container.shake { - animation: inputShake 0.6s ease-in-out; -} - -@keyframes inputShake { - 0%, 100% { transform: translateX(0); } - 10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); } - 20%, 40%, 60%, 80% { transform: translateX(5px); } -} - -.analyze-btn.flash, -.action-btn.flash { - animation: buttonFlash 0.3s ease-in-out; -} - -@keyframes buttonFlash { - 0%, 100% { background: linear-gradient(135deg, var(--dark-green), var(--neon-green)); } - 50% { background: var(--neon-purple); box-shadow: 0 0 20px var(--glow-purple); } -} - -.og-card.animate-in { - animation: cardSlideIn 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards; -} - -@keyframes cardSlideIn { - 0% { - opacity: 0; - transform: translateY(30px) scale(0.95); - } - 100% { - opacity: 1; - transform: translateY(0) scale(1); - } -} - -.header.animate-in { - animation: headerFadeIn 1s ease-out forwards; -} - -@keyframes headerFadeIn { - 0% { - opacity: 0; - transform: translateY(-20px); - } - 100% { - opacity: 1; - transform: translateY(0); - } -} - -.query-section.animate-in { - animation: sectionSlideUp 0.8s ease-out 0.2s forwards; - opacity: 0; -} - -@keyframes sectionSlideUp { - 0% { - opacity: 0; - transform: translateY(40px); - } - 100% { - opacity: 1; - transform: translateY(0); - } -} - -@keyframes fadeInUp { - 0% { - opacity: 0; - transform: translateY(20px); - } - 100% { - opacity: 1; - transform: translateY(0); - } -} - -@keyframes fadeOutDown { - 0% { - opacity: 1; - transform: translateY(0); - } - 100% { - opacity: 0; - transform: translateY(20px); - } -} - -/* 高级悬浮效果 */ -.og-card:hover { - transform: translateY(-5px) scale(1.02); - box-shadow: - 0 10px 30px var(--glow-purple), - 0 0 20px rgba(138, 43, 226, 0.1), - inset 0 1px 0 rgba(255, 255, 255, 0.1); -} - -.analyze-btn:hover:not(:disabled) { - transform: translateY(-3px); - box-shadow: - 0 8px 25px var(--glow-green), - 0 0 15px rgba(0, 255, 136, 0.2); -} - -.action-btn:hover:not(:disabled) { - transform: translateY(-1px); - box-shadow: 0 5px 15px var(--glow-purple); -} - -/* 图片加载动画 */ -.media-preview img { - transition: all 0.3s ease; -} - -.media-preview img:hover { - transform: scale(1.05); - box-shadow: 0 8px 25px var(--glow-green); -} - -.image-placeholder { - background: linear-gradient(135deg, - var(--glow-green) 0%, - var(--glow-purple) 100%); - border: 2px dashed rgba(138, 43, 226, 0.3); - display: none; - align-items: center; - justify-content: center; - min-height: 200px; - border-radius: var(--radius-lg); - color: var(--text-secondary); - font-size: 0.9rem; -} - -/* 手机设备 */ -@media (max-width: 768px) { - .main-container { - padding: var(--spacing-sm); - } - - .header-content { - padding: var(--spacing-md); - } - - .title { - font-size: 1.8rem; - } - - .subtitle { - font-size: 0.9rem; - } - - .logo-icon { - font-size: 2rem; - } - - .url-input { - font-size: 16px; /* 防止iOS缩放 */ - padding: var(--spacing-sm) var(--spacing-sm) var(--spacing-sm) 3rem; - } - - .input-icon { - left: var(--spacing-sm); - font-size: 1rem; - } - - .analyze-btn { - padding: var(--spacing-sm) var(--spacing-md); - font-size: 1rem; - } - - .scanner { - width: 150px; - height: 150px; - } - - .loading-title { - font-size: 1.3rem; - } - - .loading-subtitle { - font-size: 0.9rem; - } - - .results-title { - font-size: 1.3rem; - } - - .action-btn { - font-size: 0.8rem; - padding: var(--spacing-xs) var(--spacing-sm); - } - - .info-section { - padding: var(--spacing-md); - } - - .section-header { - font-size: 1.1rem; - } - - .media-details { - grid-template-columns: 1fr; - } - - .toast-container { - top: var(--spacing-sm); - right: var(--spacing-sm); - left: var(--spacing-sm); - transform: translateY(-100%); - } - - .toast-container.show { - transform: translateY(0); - } - - .footer-text { - font-size: 0.8rem; - } - - .footer-links { - font-size: 0.7rem; - } - - /* 移动设备上禁用部分悬浮效果 */ - .og-card:hover { - transform: none; - } - - .media-preview img:hover { - transform: none; - } -} - -/* 小屏手机设备 */ -@media (max-width: 480px) { - .main-container { - padding: var(--spacing-xs); - } - - .title { - font-size: 1.5rem; - } - - .logo-section { - flex-direction: column; - gap: var(--spacing-sm); - } - - .scanner { - width: 120px; - height: 120px; - } - - .error-content { - padding: var(--spacing-md); - } - - .error-icon { - font-size: 2.5rem; - } - - .error-title { - font-size: 1.3rem; - } -} - -/* 高分辨率屏幕优化 */ -@media (min-width: 1440px) { - .main-container { - max-width: 1600px; - } - - .title { - font-size: 3rem; - } - - .url-input { - font-size: 1.2rem; - } - - .analyze-btn { - font-size: 1.2rem; - padding: var(--spacing-lg) var(--spacing-xl); - } -} - -/* 深色模式优化 */ -@media (prefers-color-scheme: dark) { - :root { - --primary-dark: #000000; - --secondary-dark: #111111; - --accent-dark: #222222; - } -} - -/* 减少动画偏好 */ -@media (prefers-reduced-motion: reduce) { - * { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - } -} - -/* 打印样式 */ -@media print { - .background-container, - .header, - .query-section, - .loading-container, - .error-container, - .toast-container, - .footer { - display: none; - } - - .results-section { - margin: 0; - padding: 0; - } - - .og-card { - border: 1px solid #000; - box-shadow: none; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/index.html b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/index.html deleted file mode 100755 index 14ef75e5..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/index.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - 链接OG信息查询 - 神秘解析器 - - - - - - - -
    -
    -
    -
    -
    - - -
    - -
    -
    -
    - -

    OG 解析器

    - 链接元数据神秘解析 -
    -
    -
    - 系统就绪 -
    -
    -
    - - -
    -
    -
    - - -
    -
    - -
    -
    - - - - - - - - - -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    - -
    - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/js/script.js deleted file mode 100755 index 8a14386a..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/js/script.js +++ /dev/null @@ -1,617 +0,0 @@ -// 链接OG信息查询 - JavaScript功能代码 -// 神秘高级风格的交互体验 - -class OGAnalyzer { - constructor() { - this.apiUrl = 'https://60s.api.shumengya.top/v2/og'; - this.isAnalyzing = false; - this.currentUrl = ''; - this.animationFrameId = null; - - this.init(); - } - - init() { - this.bindEvents(); - this.createBackgroundEffects(); - this.initializeAnimations(); - this.showWelcomeMessage(); - this.initPageAnimations(); - } - - // 初始化页面动画 - initPageAnimations() { - // 延迟添加动画类,确保CSS已加载 - setTimeout(() => { - const header = document.querySelector('.header'); - const querySection = document.querySelector('.query-section'); - - if (header) header.classList.add('animate-in'); - if (querySection) querySection.classList.add('animate-in'); - }, 100); - } - - bindEvents() { - const urlInput = document.getElementById('url-input'); - const analyzeBtn = document.getElementById('analyze-btn'); - const copyBtn = document.getElementById('copy-btn'); - const clearBtn = document.getElementById('clear-btn'); - - // 输入框事件 - urlInput.addEventListener('input', (e) => this.handleUrlInput(e)); - urlInput.addEventListener('keypress', (e) => { - if (e.key === 'Enter' && !this.isAnalyzing) { - this.analyzeUrl(); - } - }); - urlInput.addEventListener('focus', () => this.handleInputFocus()); - urlInput.addEventListener('blur', () => this.handleInputBlur()); - - // 按钮事件 - analyzeBtn.addEventListener('click', () => this.analyzeUrl()); - copyBtn.addEventListener('click', () => this.copyResults()); - clearBtn.addEventListener('click', () => this.clearResults()); - - // 键盘快捷键 - document.addEventListener('keydown', (e) => this.handleKeyboard(e)); - } - - handleUrlInput(e) { - const url = e.target.value.trim(); - const analyzeBtn = document.getElementById('analyze-btn'); - - if (this.isValidUrl(url)) { - analyzeBtn.classList.add('ready'); - e.target.classList.remove('error'); - } else { - analyzeBtn.classList.remove('ready'); - if (url.length > 0) { - e.target.classList.add('error'); - } else { - e.target.classList.remove('error'); - } - } - } - - handleInputFocus() { - const inputContainer = document.querySelector('.input-container'); - inputContainer.classList.add('focused'); - this.createInputGlow(); - } - - handleInputBlur() { - const inputContainer = document.querySelector('.input-container'); - inputContainer.classList.remove('focused'); - } - - handleKeyboard(e) { - // Ctrl/Cmd + Enter 快速分析 - if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') { - e.preventDefault(); - if (!this.isAnalyzing) { - this.analyzeUrl(); - } - } - - // Escape 清除结果 - if (e.key === 'Escape') { - this.clearResults(); - } - } - - isValidUrl(string) { - try { - const url = new URL(string); - return url.protocol === 'http:' || url.protocol === 'https:'; - } catch (_) { - return false; - } - } - - async analyzeUrl() { - const urlInput = document.getElementById('url-input'); - const url = urlInput.value.trim(); - - if (!this.isValidUrl(url)) { - this.showError('请输入有效的URL地址'); - this.shakeInput(); - return; - } - - if (this.isAnalyzing) { - return; - } - - this.currentUrl = url; - this.isAnalyzing = true; - this.startTime = Date.now(); // 记录开始时间 - this.showLoading(); - this.hideError(); - this.hideResults(); - - try { - const response = await fetch(`${this.apiUrl}?url=${encodeURIComponent(url)}`); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - await this.displayResults(data.data); - this.showSuccessMessage('分析完成!'); - - // 添加按钮闪烁效果 - const analyzeBtn = document.getElementById('analyze-btn'); - analyzeBtn.classList.add('flash'); - setTimeout(() => { - analyzeBtn.classList.remove('flash'); - }, 300); - } else { - throw new Error(data.message || '获取OG信息失败'); - } - } catch (error) { - console.error('分析失败:', error); - this.showError(`分析失败: ${error.message}`); - } finally { - this.isAnalyzing = false; - this.hideLoading(); - } - } - - showLoading() { - const loadingElement = document.getElementById('loading'); - const analyzeBtn = document.getElementById('analyze-btn'); - - loadingElement.classList.add('active'); - analyzeBtn.disabled = true; - analyzeBtn.textContent = '分析中...'; - - this.startScannerAnimation(); - } - - hideLoading() { - const loadingElement = document.getElementById('loading'); - const analyzeBtn = document.getElementById('analyze-btn'); - - loadingElement.classList.remove('active'); - analyzeBtn.disabled = false; - analyzeBtn.textContent = '开始分析'; - - this.stopScannerAnimation(); - } - - async displayResults(data) { - const resultsElement = document.getElementById('results'); - const ogCard = document.getElementById('og-card'); - - // 检查是否有有效数据 - 放宽检查条件,只要有任何非空字段就显示 - const hasValidData = Object.values(data).some(value => { - if (value === null || value === undefined) return false; - if (typeof value === 'string') return value.trim() !== ''; - return true; // 其他类型的值都认为是有效的 - }); - - if (!hasValidData) { - this.showError('该链接暂无可获取的OG信息,请检查链接是否正确或稍后重试'); - return; - } - - // 基础信息 - 只显示有数据的字段 - this.updateElementWithVisibility('og-title', data.title, '标题'); - this.updateElementWithVisibility('og-description', data.description, '描述'); - this.updateElement('og-url', data.url || this.currentUrl); // URL始终显示 - this.updateElementWithVisibility('og-site-name', data.site_name, '网站名称'); - this.updateElement('og-type', data.type || 'website'); // 类型始终显示 - - // 媒体信息 - this.updateImageElementWithVisibility('og-image', data.image); - this.updateElementWithVisibility('og-image-alt', data.image_alt, '图片描述'); - - // 技术信息 - this.updateElementWithVisibility('og-locale', data.locale, '语言'); - this.updateElementWithVisibility('og-updated-time', this.formatDate(data.updated_time), '更新时间'); - this.updateElement('response-time', `${Date.now() - this.startTime}ms`); // 响应时间始终显示 - - // 显示结果 - resultsElement.style.display = 'block'; - resultsElement.classList.add('active'); - - // 添加动画效果 - await this.animateResults(); - - // 启用操作按钮 - document.getElementById('copy-btn').disabled = false; - document.getElementById('clear-btn').disabled = false; - } - - updateElement(id, content) { - const element = document.getElementById(id); - if (element) { - element.textContent = content; - } - } - - updateElementWithVisibility(id, content, fieldName) { - const element = document.getElementById(id); - if (!element) return; - - const parentItem = element.closest('.info-item'); - if (!parentItem) return; - - if (content && content.trim() !== '') { - element.textContent = content; - parentItem.style.display = 'block'; - } else { - parentItem.style.display = 'none'; - } - } - - updateImageElement(id, imageSrc) { - const element = document.getElementById(id); - if (element && imageSrc) { - element.src = imageSrc; - element.style.display = 'block'; - element.onerror = () => { - element.style.display = 'none'; - const placeholder = element.nextElementSibling; - if (placeholder && placeholder.classList.contains('image-placeholder')) { - placeholder.style.display = 'flex'; - } - }; - } else if (element) { - element.style.display = 'none'; - const placeholder = element.nextElementSibling; - if (placeholder && placeholder.classList.contains('image-placeholder')) { - placeholder.style.display = 'flex'; - } - } - } - - updateImageElementWithVisibility(id, imageSrc) { - const element = document.getElementById(id); - const mediaSection = document.querySelector('.media-info'); - const mediaPreview = document.getElementById('media-preview'); - - if (imageSrc && imageSrc.trim() !== '') { - element.textContent = imageSrc; - if (mediaSection) mediaSection.style.display = 'block'; - - if (mediaPreview) { - mediaPreview.innerHTML = ` - OG Image - - `; - } - } else { - if (mediaSection) mediaSection.style.display = 'none'; - } - } - - formatDate(timestamp) { - if (!timestamp) return '未知'; - try { - const date = new Date(timestamp); - return date.toLocaleString('zh-CN'); - } catch (e) { - return '格式错误'; - } - } - - async animateResults() { - const cards = document.querySelectorAll('.info-card'); - - for (let i = 0; i < cards.length; i++) { - setTimeout(() => { - cards[i].classList.add('animate-in'); - }, i * 100); - } - - // 等待动画完成 - await new Promise(resolve => setTimeout(resolve, cards.length * 100 + 300)); - } - - showError(message) { - const errorElement = document.getElementById('error-message'); - const errorText = errorElement.querySelector('.error-text'); - const inputContainer = document.querySelector('.input-container'); - - errorText.textContent = message; - errorElement.classList.add('active'); - - // 添加震动效果 - if (inputContainer) { - inputContainer.classList.add('shake'); - setTimeout(() => { - inputContainer.classList.remove('shake'); - }, 600); - } - - // 自动隐藏错误信息 - setTimeout(() => { - this.hideError(); - }, 5000); - } - - hideError() { - const errorElement = document.getElementById('error-message'); - errorElement.classList.remove('active'); - } - - hideResults() { - const resultsElement = document.getElementById('results'); - resultsElement.style.display = 'none'; - resultsElement.classList.remove('active'); - - // 重置动画状态 - const cards = document.querySelectorAll('.info-card'); - cards.forEach(card => card.classList.remove('animate-in')); - } - - showSuccessMessage(message) { - const tipElement = document.getElementById('tip-message'); - const tipText = tipElement.querySelector('.tip-text'); - - tipText.textContent = message; - tipElement.classList.add('active'); - - setTimeout(() => { - tipElement.classList.remove('active'); - }, 3000); - } - - shakeInput() { - const inputContainer = document.querySelector('.input-container'); - inputContainer.classList.add('shake'); - - setTimeout(() => { - inputContainer.classList.remove('shake'); - }, 600); - } - - copyResults() { - const ogData = { - title: document.getElementById('og-title').textContent, - description: document.getElementById('og-description').textContent, - url: document.getElementById('og-url').textContent, - site_name: document.getElementById('og-site-name').textContent, - type: document.getElementById('og-type').textContent, - image: document.getElementById('og-image').src, - locale: document.getElementById('og-locale').textContent - }; - - const jsonString = JSON.stringify(ogData, null, 2); - - navigator.clipboard.writeText(jsonString).then(() => { - this.showSuccessMessage('结果已复制到剪贴板!'); - this.flashCopyButton(); - }).catch(err => { - console.error('复制失败:', err); - this.showError('复制失败,请手动选择内容'); - }); - } - - flashCopyButton() { - const copyBtn = document.getElementById('copy-btn'); - copyBtn.classList.add('flash'); - - setTimeout(() => { - copyBtn.classList.remove('flash'); - }, 300); - } - - clearResults() { - const urlInput = document.getElementById('url-input'); - const resultsElement = document.getElementById('results'); - const errorElement = document.getElementById('error-message'); - - urlInput.value = ''; - urlInput.classList.remove('error'); - resultsElement.style.display = 'none'; - resultsElement.classList.remove('active'); - errorElement.classList.remove('active'); - - document.getElementById('analyze-btn').classList.remove('ready'); - document.getElementById('copy-btn').disabled = true; - document.getElementById('clear-btn').disabled = true; - - this.currentUrl = ''; - - // 重置所有字段的显示状态 - const infoItems = document.querySelectorAll('.info-item'); - infoItems.forEach(item => item.style.display = 'block'); - - const mediaSection = document.querySelector('.media-info'); - if (mediaSection) mediaSection.style.display = 'block'; - - // 重置动画状态 - const cards = document.querySelectorAll('.info-card'); - cards.forEach(card => card.classList.remove('animate-in')); - - this.showSuccessMessage('已清除所有内容'); - } - - createBackgroundEffects() { - const container = document.querySelector('.background-container'); - - // 创建各种背景效果层 - const effects = [ - 'geometric-grid', - 'neural-network', - 'particle-system', - 'scan-lines', - 'holographic-overlay', - 'data-stream', - 'quantum-waves' - ]; - - effects.forEach(effectClass => { - const layer = document.createElement('div'); - layer.className = effectClass; - container.appendChild(layer); - }); - } - - createInputGlow() { - const inputContainer = document.querySelector('.input-container'); - - // 创建光晕效果 - const glow = document.createElement('div'); - glow.className = 'input-glow'; - inputContainer.appendChild(glow); - - setTimeout(() => { - if (glow.parentNode) { - glow.remove(); - } - }, 2000); - } - - startScannerAnimation() { - const scanner = document.querySelector('.scanner'); - if (scanner) { - scanner.classList.add('active'); - } - } - - stopScannerAnimation() { - const scanner = document.querySelector('.scanner'); - if (scanner) { - scanner.classList.remove('active'); - } - } - - initializeAnimations() { - // 初始化页面动画 - const header = document.querySelector('.header'); - const querySection = document.querySelector('.query-section'); - - setTimeout(() => { - header.classList.add('animate-in'); - }, 100); - - setTimeout(() => { - querySection.classList.add('animate-in'); - }, 300); - } - - showWelcomeMessage() { - const tips = [ - '支持分析网页的标题、描述、图片等元信息', - '可以预览社交媒体分享时的显示效果', - '检测网页的SEO优化情况', - '分析Open Graph协议标签' - ]; - - setTimeout(() => { - this.showSuccessMessage('欢迎使用链接OG信息分析器!'); - }, 1000); - - // 显示提示信息 - this.showTips(tips); - } - - // 显示提示信息 - showTips(tips) { - const tipElement = document.getElementById('tip-message'); - const tipText = tipElement.querySelector('.tip-text'); - - let currentTip = 0; - - const showNextTip = () => { - tipText.textContent = tips[currentTip]; - tipElement.classList.add('active'); - tipElement.style.animation = 'fadeInUp 0.5s ease-out'; - - setTimeout(() => { - tipElement.style.animation = 'fadeOutDown 0.5s ease-in'; - setTimeout(() => { - tipElement.classList.remove('active'); - currentTip = (currentTip + 1) % tips.length; - }, 500); - }, 3000); - }; - - // 首次显示 - setTimeout(showNextTip, 2000); - - // 每8秒显示一次 - setInterval(showNextTip, 8000); - } -} - -// 工具函数 -function debounce(func, wait) { - let timeout; - return function executedFunction(...args) { - const later = () => { - clearTimeout(timeout); - func(...args); - }; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; -} - -function throttle(func, limit) { - let inThrottle; - return function() { - const args = arguments; - const context = this; - if (!inThrottle) { - func.apply(context, args); - inThrottle = true; - setTimeout(() => inThrottle = false, limit); - } - } -} - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', () => { - // 检查必要的DOM元素 - const requiredElements = [ - 'url-input', 'analyze-btn', 'copy-btn', 'clear-btn', - 'loading', 'results', 'error-message', 'tip-message' - ]; - - const missingElements = requiredElements.filter(id => !document.getElementById(id)); - - if (missingElements.length > 0) { - console.error('缺少必要的DOM元素:', missingElements); - return; - } - - // 初始化应用 - window.ogAnalyzer = new OGAnalyzer(); - - // 添加全局错误处理 - window.addEventListener('error', (e) => { - console.error('全局错误:', e.error); - if (window.ogAnalyzer) { - window.ogAnalyzer.showError('发生未知错误,请刷新页面重试'); - } - }); - - // 添加网络状态监听 - window.addEventListener('online', () => { - if (window.ogAnalyzer) { - window.ogAnalyzer.showSuccessMessage('网络连接已恢复'); - } - }); - - window.addEventListener('offline', () => { - if (window.ogAnalyzer) { - window.ogAnalyzer.showError('网络连接已断开'); - } - }); -}); - -// 导出给其他模块使用 -if (typeof module !== 'undefined' && module.exports) { - module.exports = { OGAnalyzer, debounce, throttle }; -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/返回接口.json deleted file mode 100755 index 8d9efe77..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/返回接口.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "code": 200, - "message": "success", - "data": { - "url": "https://example.com", - "title": "示例网站标题", - "description": "这是一个示例网站的描述信息,用于展示OG标签解析功能。", - "image": "https://example.com/og-image.jpg", - "site_name": "示例网站", - "type": "website", - "locale": "zh_CN", - "author": "网站作者", - "keywords": "示例,网站,OG标签,元数据", - "favicon": "https://example.com/favicon.ico", - "canonical_url": "https://example.com", - "robots": "index,follow", - "viewport": "width=device-width, initial-scale=1.0", - "charset": "UTF-8", - "language": "zh-CN", - "published_time": "2024-01-01T00:00:00Z", - "modified_time": "2024-01-15T12:30:00Z", - "section": "技术", - "tags": ["前端", "元数据", "SEO"], - "twitter": { - "card": "summary_large_image", - "site": "@example", - "creator": "@author", - "title": "Twitter标题", - "description": "Twitter描述", - "image": "https://example.com/twitter-image.jpg" - }, - "facebook": { - "app_id": "123456789", - "admins": "987654321" - }, - "structured_data": { - "@context": "https://schema.org", - "@type": "WebPage", - "name": "示例网页", - "description": "示例网页描述", - "url": "https://example.com" - }, - "meta_tags": { - "generator": "WordPress 6.0", - "theme-color": "#000000", - "msapplication-TileColor": "#ffffff", - "apple-mobile-web-app-capable": "yes", - "apple-mobile-web-app-status-bar-style": "default" - }, - "performance": { - "load_time": 1.25, - "page_size": "2.3MB", - "requests_count": 45 - }, - "seo_score": { - "overall": 85, - "title_score": 90, - "description_score": 80, - "image_score": 85, - "structure_score": 88 - } - }, - "timestamp": "2024-01-15T12:30:45Z", - "request_id": "req_123456789", - "processing_time": 0.85 -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成.html b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成.html new file mode 100644 index 00000000..8d92f4f2 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成.html @@ -0,0 +1,50 @@ + + + + +随机密码生成 + + + + + +
    + +

    🔒 随机密码生成

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/background.css deleted file mode 100755 index fec4d821..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/background.css +++ /dev/null @@ -1,252 +0,0 @@ -/* 背景样式文件 */ - -/* 主背景渐变 */ -body { - background: linear-gradient(135deg, #e8f5e8 0%, #f0f9f0 25%, #f8fdf8 50%, #e8f5e8 75%, #f0f9f0 100%); - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; - position: relative; - overflow-x: hidden; -} - -/* 背景渐变动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 装饰性背景元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(45, 90, 61, 0.08) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(76, 175, 80, 0.05) 0%, transparent 50%); - pointer-events: none; - z-index: -2; -} - -/* 浮动装饰圆点 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(45, 90, 61, 0.2), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(76, 175, 80, 0.4), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(45, 90, 61, 0.3), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(76, 175, 80, 0.2), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: floatDots 20s linear infinite; - pointer-events: none; - z-index: -1; - opacity: 0.6; -} - -/* 圆点浮动动画 */ -@keyframes floatDots { - 0% { - transform: translateY(0px) translateX(0px); - } - 33% { - transform: translateY(-10px) translateX(5px); - } - 66% { - transform: translateY(5px) translateX(-5px); - } - 100% { - transform: translateY(0px) translateX(0px); - } -} - -/* 网格背景(可选,默认隐藏) */ -.grid-background { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - linear-gradient(rgba(76, 175, 80, 0.03) 1px, transparent 1px), - linear-gradient(90deg, rgba(76, 175, 80, 0.03) 1px, transparent 1px); - background-size: 50px 50px; - pointer-events: none; - z-index: -3; - opacity: 0; - transition: opacity 0.3s ease; -} - -.grid-background.active { - opacity: 1; -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - body::after { - background-size: 150px 75px; - animation-duration: 25s; - } - - body::before { - background-image: - radial-gradient(circle at 30% 70%, rgba(76, 175, 80, 0.08) 0%, transparent 50%), - radial-gradient(circle at 70% 30%, rgba(45, 90, 61, 0.06) 0%, transparent 50%); - } -} - -@media (max-width: 480px) { - body { - animation-duration: 20s; - } - - body::after { - background-size: 100px 50px; - opacity: 0.4; - } -} - -/* 高对比度模式下的背景调整 */ -@media (prefers-contrast: high) { - body { - background: #f8fdf8; - animation: none; - } - - body::before, - body::after { - display: none; - } -} - -/* 减少动画模式下的背景调整 */ -@media (prefers-reduced-motion: reduce) { - body { - animation: none; - background: linear-gradient(135deg, #e8f5e8 0%, #f0f9f0 50%, #f8fdf8 100%); - } - - body::after { - animation: none; - } - - @keyframes gradientShift { - 0%, 100% { - background-position: 0% 50%; - } - } - - @keyframes floatDots { - 0%, 100% { - transform: translateY(0px) translateX(0px); - } - } -} - -/* 深色模式支持 */ -@media (prefers-color-scheme: dark) { - body { - background: linear-gradient(135deg, #1a2e1a 0%, #2d4a2d 25%, #1f3a1f 50%, #1a2e1a 75%, #2d4a2d 100%); - } - - body::before { - background-image: - radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.15) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(144, 238, 144, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(76, 175, 80, 0.08) 0%, transparent 50%); - } - - body::after { - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(144, 238, 144, 0.4), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(76, 175, 80, 0.3), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(144, 238, 144, 0.5), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.4), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(144, 238, 144, 0.3), transparent); - } -} - -/* 打印样式 */ -@media print { - body { - background: white !important; - animation: none !important; - } - - body::before, - body::after { - display: none !important; - } -} - -/* 特殊效果:鼠标悬停时的背景变化 */ -@media (hover: hover) { - .container:hover { - position: relative; - } - - .container:hover::before { - content: ''; - position: absolute; - top: -20px; - left: -20px; - right: -20px; - bottom: -20px; - background: radial-gradient(circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(76, 175, 80, 0.05) 0%, transparent 50%); - border-radius: 30px; - pointer-events: none; - z-index: -1; - transition: opacity 0.3s ease; - } -} - -/* 季节性主题变化(可通过JavaScript控制) */ -.theme-spring body { - background: linear-gradient(135deg, #e8f5e8 0%, #f0f9f0 25%, #e1f5e1 50%, #f8fdf8 75%, #e8f5e8 100%); -} - -.theme-summer body { - background: linear-gradient(135deg, #f0f9f0 0%, #e8f5e8 25%, #f8fdf8 50%, #e1f5e1 75%, #f0f9f0 100%); -} - -.theme-autumn body { - background: linear-gradient(135deg, #f5f0e8 0%, #f9f5f0 25%, #fdf8f0 50%, #f5f0e8 75%, #f9f5f0 100%); -} - -.theme-winter body { - background: linear-gradient(135deg, #f0f5f8 0%, #f5f9fc 25%, #f8fbfd 50%, #f0f5f8 75%, #f5f9fc 100%); -} - -/* 性能优化:GPU加速 */ -body, -body::before, -body::after { - will-change: transform; - transform: translateZ(0); -} - -/* 无障碍支持:为屏幕阅读器隐藏装饰元素 */ -body::before, -body::after { - speak: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/style.css deleted file mode 100755 index bb7703c7..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/style.css +++ /dev/null @@ -1,647 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: #2d5a3d; - min-height: 100vh; - overflow-x: hidden; -} - -/* 容器布局 */ -.container { - max-width: 800px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - padding: 30px 20px; - background: linear-gradient(135deg, #e8f5e8 0%, #f0f9f0 100%); - border-radius: 20px; - box-shadow: 0 4px 20px rgba(45, 90, 61, 0.1); -} - -.header h1 { - font-size: 2.5rem; - font-weight: 700; - color: #2d5a3d; - margin-bottom: 10px; - text-shadow: 0 2px 4px rgba(45, 90, 61, 0.1); -} - -.subtitle { - font-size: 1.1rem; - color: #5a8a6b; - font-weight: 400; -} - -/* 主内容区域 */ -.main-content { - flex: 1; - display: flex; - flex-direction: column; - gap: 30px; -} - -/* 表单容器 */ -.form-container { - background: #ffffff; - border-radius: 16px; - padding: 30px; - box-shadow: 0 8px 32px rgba(45, 90, 61, 0.1); - border: 1px solid #e8f5e8; -} - -.password-form { - display: flex; - flex-direction: column; - gap: 25px; -} - -/* 表单组样式 */ -.form-group { - display: flex; - flex-direction: column; - gap: 12px; -} - -.form-group label { - font-weight: 600; - color: #2d5a3d; - font-size: 1rem; -} - -.section-title { - font-size: 1.1rem; - color: #2d5a3d; - font-weight: 600; - margin-bottom: 8px; -} - -/* 长度控制 */ -.length-control { - display: flex; - align-items: center; - gap: 15px; - padding: 15px; - background: #f8fdf8; - border-radius: 12px; - border: 2px solid #e8f5e8; -} - -.length-slider { - flex: 1; - height: 6px; - background: #e8f5e8; - border-radius: 3px; - outline: none; - -webkit-appearance: none; -} - -.length-slider::-webkit-slider-thumb { - -webkit-appearance: none; - width: 20px; - height: 20px; - background: linear-gradient(135deg, #4caf50, #45a049); - border-radius: 50%; - cursor: pointer; - box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3); -} - -.length-slider::-moz-range-thumb { - width: 20px; - height: 20px; - background: linear-gradient(135deg, #4caf50, #45a049); - border-radius: 50%; - cursor: pointer; - border: none; - box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3); -} - -.length-display { - min-width: 40px; - text-align: center; - font-weight: 700; - font-size: 1.2rem; - color: #2d5a3d; - background: #ffffff; - padding: 8px 12px; - border-radius: 8px; - border: 2px solid #e8f5e8; -} - -/* 复选框组 */ -.checkbox-group { - display: flex; - flex-direction: column; - gap: 12px; -} - -.checkbox-item { - display: flex; - align-items: center; - gap: 12px; - padding: 12px 16px; - background: #f8fdf8; - border-radius: 10px; - border: 2px solid #e8f5e8; - transition: all 0.3s ease; - cursor: pointer; -} - -.checkbox-item:hover { - background: #f0f9f0; - border-color: #d4edda; - transform: translateY(-1px); -} - -.checkbox-item input[type="checkbox"] { - width: 18px; - height: 18px; - accent-color: #4caf50; - cursor: pointer; -} - -.checkbox-item label { - flex: 1; - cursor: pointer; - font-weight: 500; - color: #2d5a3d; - margin: 0; -} - -/* 生成按钮 */ -.generate-btn { - background: linear-gradient(135deg, #4caf50, #45a049); - color: white; - border: none; - padding: 16px 32px; - border-radius: 12px; - font-size: 1.1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 16px rgba(76, 175, 80, 0.3); - position: relative; - overflow: hidden; -} - -.generate-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(76, 175, 80, 0.4); -} - -.generate-btn:active { - transform: translateY(0); -} - -.generate-btn:disabled { - opacity: 0.7; - cursor: not-allowed; - transform: none; -} - -/* 结果容器 */ -.result-container { - background: #ffffff; - border-radius: 16px; - padding: 30px; - box-shadow: 0 8px 32px rgba(45, 90, 61, 0.1); - border: 1px solid #e8f5e8; - animation: slideIn 0.5s ease-out; -} - -@keyframes slideIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.result-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 20px; -} - -.result-header h3 { - color: #2d5a3d; - font-size: 1.3rem; - font-weight: 600; -} - -.copy-btn { - background: #4caf50; - color: white; - border: none; - padding: 10px; - border-radius: 8px; - cursor: pointer; - transition: all 0.3s ease; - display: flex; - align-items: center; - justify-content: center; -} - -.copy-btn:hover { - background: #45a049; - transform: scale(1.05); -} - -/* 密码显示 */ -.password-display { - margin-bottom: 25px; -} - -.password-input { - width: 100%; - padding: 16px 20px; - border: 2px solid #e8f5e8; - border-radius: 12px; - font-family: 'Courier New', monospace; - font-size: 1.1rem; - font-weight: 600; - color: #2d5a3d; - background: #f8fdf8; - text-align: center; - letter-spacing: 1px; - word-break: break-all; -} - -.password-input:focus { - outline: none; - border-color: #4caf50; - box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1); -} - -/* 密码信息 */ -.password-info { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: 15px; - margin-bottom: 25px; -} - -.info-item { - display: flex; - flex-direction: column; - gap: 5px; - padding: 12px 16px; - background: #f8fdf8; - border-radius: 10px; - border: 1px solid #e8f5e8; -} - -.info-item.full-width { - grid-column: 1 / -1; -} - -.info-label { - font-size: 0.9rem; - color: #5a8a6b; - font-weight: 500; -} - -.info-value { - font-size: 1rem; - color: #2d5a3d; - font-weight: 600; -} - -.info-value.strength { - padding: 4px 8px; - border-radius: 6px; - text-align: center; - color: white; - font-weight: 700; -} - -.strength.weak { - background: #f44336; -} - -.strength.medium { - background: #ff9800; -} - -.strength.strong { - background: #4caf50; -} - -.strength.very-strong { - background: #2e7d32; -} - -/* 字符集显示 */ -.character-sets { - border-top: 1px solid #e8f5e8; - padding-top: 20px; -} - -.character-sets h4 { - color: #2d5a3d; - margin-bottom: 15px; - font-size: 1.1rem; -} - -.sets-list { - display: flex; - flex-wrap: wrap; - gap: 10px; -} - -.set-item { - background: #e8f5e8; - color: #2d5a3d; - padding: 6px 12px; - border-radius: 20px; - font-size: 0.9rem; - font-weight: 500; -} - -/* 错误容器 */ -.error-container { - background: #ffffff; - border-radius: 16px; - padding: 40px 30px; - text-align: center; - box-shadow: 0 8px 32px rgba(244, 67, 54, 0.1); - border: 1px solid #ffebee; -} - -.error-icon { - font-size: 3rem; - margin-bottom: 15px; -} - -.error-container h3 { - color: #d32f2f; - margin-bottom: 10px; - font-size: 1.3rem; -} - -.error-container p { - color: #666; - margin-bottom: 20px; -} - -.retry-btn { - background: #f44336; - color: white; - border: none; - padding: 12px 24px; - border-radius: 8px; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; -} - -.retry-btn:hover { - background: #d32f2f; - transform: translateY(-1px); -} - -/* 页脚 */ -.footer { - text-align: center; - padding: 30px 20px; - color: #5a8a6b; - font-size: 0.9rem; -} - -/* 提示框 */ -.toast { - position: fixed; - top: 20px; - right: 20px; - background: #4caf50; - color: white; - padding: 12px 20px; - border-radius: 8px; - box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3); - z-index: 1000; - animation: toastSlide 0.3s ease-out; -} - -@keyframes toastSlide { - from { - transform: translateX(100%); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - max-width: 700px; - padding: 25px; - } - - .header h1 { - font-size: 2.2rem; - } - - .form-container, - .result-container { - padding: 25px; - } - - .password-info { - grid-template-columns: repeat(2, 1fr); - } -} - -/* 手机端适配 (最大767px) */ -@media (max-width: 767px) { - .container { - padding: 15px; - max-width: 100%; - } - - .header { - padding: 20px 15px; - margin-bottom: 25px; - } - - .header h1 { - font-size: 1.8rem; - } - - .subtitle { - font-size: 1rem; - } - - .form-container, - .result-container { - padding: 20px; - border-radius: 12px; - } - - .password-form { - gap: 20px; - } - - .form-group { - gap: 10px; - } - - .length-control { - padding: 12px; - gap: 12px; - } - - .length-display { - min-width: 35px; - padding: 6px 10px; - font-size: 1.1rem; - } - - .checkbox-item { - padding: 10px 12px; - gap: 10px; - } - - .checkbox-item input[type="checkbox"] { - width: 16px; - height: 16px; - } - - .generate-btn { - padding: 14px 28px; - font-size: 1rem; - } - - .password-input { - padding: 14px 16px; - font-size: 1rem; - letter-spacing: 0.5px; - } - - .password-info { - grid-template-columns: 1fr; - gap: 12px; - } - - .info-item { - padding: 10px 12px; - } - - .result-header { - flex-direction: column; - gap: 15px; - align-items: stretch; - } - - .copy-btn { - align-self: center; - padding: 12px 20px; - border-radius: 10px; - } - - .toast { - right: 15px; - left: 15px; - top: 15px; - text-align: center; - } -} - -/* 小屏手机适配 (最大480px) */ -@media (max-width: 480px) { - .container { - padding: 10px; - } - - .header { - padding: 15px 10px; - margin-bottom: 20px; - } - - .header h1 { - font-size: 1.6rem; - } - - .form-container, - .result-container { - padding: 15px; - } - - .checkbox-item { - padding: 8px 10px; - } - - .generate-btn { - padding: 12px 24px; - } - - .password-input { - padding: 12px 14px; - font-size: 0.95rem; - } -} - -/* 触摸设备优化 */ -@media (hover: none) and (pointer: coarse) { - .checkbox-item, - .generate-btn, - .copy-btn, - .retry-btn { - min-height: 44px; - } - - .checkbox-item input[type="checkbox"] { - width: 20px; - height: 20px; - } - - .length-slider::-webkit-slider-thumb { - width: 24px; - height: 24px; - } -} - -/* 高对比度模式支持 */ -@media (prefers-contrast: high) { - .form-container, - .result-container { - border: 2px solid #2d5a3d; - } - - .checkbox-item { - border: 1px solid #2d5a3d; - } - - .password-input { - border: 2px solid #2d5a3d; - } -} - -/* 减少动画模式支持 */ -@media (prefers-reduced-motion: reduce) { - * { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/index.html b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/index.html deleted file mode 100755 index f64a925d..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - 随机密码生成器 - - - - -
    -
    -

    🔐 随机密码生成器

    -

    生成安全可靠的随机密码

    -
    - -
    -
    -
    -
    - -
    - - 16 -
    -
    - -
    - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    -
    - -
    - -
    -
    - - -
    -
    - - -
    -
    -
    - - -
    -
    - - - - -
    - -
    -

    安全密码生成工具

    -
    -
    - - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/js/script.js deleted file mode 100755 index 9dadfd98..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/js/script.js +++ /dev/null @@ -1,412 +0,0 @@ -class PasswordGenerator { - constructor() { - this.apiUrl = 'https://60s.api.shumengya.top/v2/password'; - this.loadStartTime = 0; - this.init(); - } - - init() { - this.bindEvents(); - this.updateLengthDisplay(); - this.preloadResources(); - } - - preloadResources() { - // 预连接API服务器 - const link = document.createElement('link'); - link.rel = 'preconnect'; - link.href = 'https://60s.api.shumengya.top'; - document.head.appendChild(link); - } - - bindEvents() { - // 长度滑块事件 - const lengthSlider = document.getElementById('length'); - lengthSlider.addEventListener('input', () => this.updateLengthDisplay()); - - // 生成按钮事件 - const generateBtn = document.getElementById('generateBtn'); - generateBtn.addEventListener('click', () => this.generatePassword()); - - // 复制按钮事件 - const copyBtn = document.getElementById('copyBtn'); - copyBtn.addEventListener('click', () => this.copyPassword()); - - // 重试按钮事件 - const retryBtn = document.getElementById('retryBtn'); - retryBtn.addEventListener('click', () => this.generatePassword()); - - // 复选框变化事件 - const checkboxes = document.querySelectorAll('input[type="checkbox"]'); - checkboxes.forEach(checkbox => { - checkbox.addEventListener('change', () => this.validateForm()); - }); - - // 键盘快捷键 - document.addEventListener('keydown', (e) => { - if (e.ctrlKey && e.key === 'Enter') { - e.preventDefault(); - this.generatePassword(); - } - if (e.ctrlKey && e.key === 'c' && document.activeElement.id === 'passwordResult') { - this.copyPassword(); - } - }); - } - - updateLengthDisplay() { - const lengthSlider = document.getElementById('length'); - const lengthDisplay = document.getElementById('lengthDisplay'); - lengthDisplay.textContent = lengthSlider.value; - } - - validateForm() { - const checkboxes = document.querySelectorAll('input[type="checkbox"]:checked'); - const generateBtn = document.getElementById('generateBtn'); - - // 至少需要选择一种字符类型 - const hasCharacterType = Array.from(checkboxes).some(cb => - ['numbers', 'uppercase', 'lowercase', 'symbols'].includes(cb.id) - ); - - generateBtn.disabled = !hasCharacterType; - - if (!hasCharacterType) { - this.showToast('请至少选择一种字符类型', 'warning'); - } - } - - async generatePassword() { - this.loadStartTime = Date.now(); - - try { - this.showLoading(true); - this.hideError(); - - const params = this.getFormParams(); - const password = await this.callAPI(params); - - if (password) { - this.displayPassword(password, params); - this.showToast('密码生成成功!', 'success'); - - const loadTime = Date.now() - this.loadStartTime; - console.log(`密码生成完成,耗时: ${loadTime}ms`); - } - } catch (error) { - console.error('生成密码失败:', error); - this.showError(error.message || '生成密码时发生错误,请重试'); - } finally { - this.showLoading(false); - } - } - - getFormParams() { - const length = document.getElementById('length').value; - const numbers = document.getElementById('numbers').checked; - const uppercase = document.getElementById('uppercase').checked; - const lowercase = document.getElementById('lowercase').checked; - const symbols = document.getElementById('symbols').checked; - const excludeSimilar = document.getElementById('excludeSimilar').checked; - const excludeAmbiguous = document.getElementById('excludeAmbiguous').checked; - - return { - length: parseInt(length), - numbers: numbers ? 'true' : 'false', - uppercase: uppercase ? 'true' : 'false', - lowercase: lowercase ? 'true' : 'false', - symbols: symbols ? 'true' : 'false', - exclude_similar: excludeSimilar ? 'true' : 'false', - exclude_ambiguous: excludeAmbiguous ? 'true' : 'false', - encoding: 'json' - }; - } - - async callAPI(params) { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 5000); - - try { - const url = new URL(this.apiUrl); - Object.keys(params).forEach(key => { - if (params[key] !== undefined && params[key] !== null) { - url.searchParams.append(key, params[key]); - } - }); - - const response = await fetch(url.toString(), { - method: 'GET', - signal: controller.signal, - headers: { - 'Accept': 'application/json', - 'User-Agent': 'PasswordGenerator/1.0' - } - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data && data.data.password) { - return data.data.password; - } else { - throw new Error(data.message || '服务器返回了无效的密码数据'); - } - } catch (error) { - clearTimeout(timeoutId); - - if (error.name === 'AbortError') { - throw new Error('请求超时,请检查网络连接后重试'); - } - - if (error.message.includes('Failed to fetch')) { - throw new Error('网络连接失败,请检查网络后重试'); - } - - throw error; - } - } - - displayPassword(password, params) { - // 显示结果容器 - const resultContainer = document.getElementById('resultContainer'); - const errorContainer = document.getElementById('errorContainer'); - - resultContainer.style.display = 'block'; - errorContainer.style.display = 'none'; - - // 设置密码 - const passwordInput = document.getElementById('passwordResult'); - passwordInput.value = password; - - // 计算并显示密码信息 - this.updatePasswordInfo(password, params); - - // 滚动到结果区域 - resultContainer.scrollIntoView({ behavior: 'smooth', block: 'start' }); - } - - updatePasswordInfo(password, params) { - // 基本信息 - document.getElementById('infoLength').textContent = password.length; - document.getElementById('infoEntropy').textContent = this.calculateEntropy(password).toFixed(1); - - // 密码强度 - const strength = this.calculateStrength(password); - const strengthElement = document.getElementById('infoStrength'); - strengthElement.textContent = strength.text; - strengthElement.className = `info-value strength ${strength.class}`; - - // 字符类型统计 - const stats = this.analyzeCharacters(password); - document.getElementById('infoNumbers').textContent = stats.numbers; - document.getElementById('infoUppercase').textContent = stats.uppercase; - document.getElementById('infoLowercase').textContent = stats.lowercase; - document.getElementById('infoSymbols').textContent = stats.symbols; - - // 使用的字符集 - this.updateCharacterSets(params); - - // 破解时间估算 - document.getElementById('infoCrackTime').textContent = this.estimateCrackTime(password); - } - - calculateEntropy(password) { - const charset = this.getCharsetSize(password); - return Math.log2(Math.pow(charset, password.length)); - } - - getCharsetSize(password) { - let size = 0; - if (/[0-9]/.test(password)) size += 10; - if (/[a-z]/.test(password)) size += 26; - if (/[A-Z]/.test(password)) size += 26; - if (/[^a-zA-Z0-9]/.test(password)) size += 32; - return size; - } - - calculateStrength(password) { - const entropy = this.calculateEntropy(password); - - if (entropy < 30) { - return { text: '弱', class: 'weak' }; - } else if (entropy < 50) { - return { text: '中等', class: 'medium' }; - } else if (entropy < 70) { - return { text: '强', class: 'strong' }; - } else { - return { text: '非常强', class: 'very-strong' }; - } - } - - analyzeCharacters(password) { - return { - numbers: (password.match(/[0-9]/g) || []).length, - uppercase: (password.match(/[A-Z]/g) || []).length, - lowercase: (password.match(/[a-z]/g) || []).length, - symbols: (password.match(/[^a-zA-Z0-9]/g) || []).length - }; - } - - updateCharacterSets(params) { - const setsList = document.getElementById('setsList'); - const sets = []; - - if (params.numbers === 'true') sets.push('数字 (0-9)'); - if (params.uppercase === 'true') sets.push('大写字母 (A-Z)'); - if (params.lowercase === 'true') sets.push('小写字母 (a-z)'); - if (params.symbols === 'true') sets.push('特殊字符 (!@#$...)'); - - setsList.innerHTML = sets.map(set => `${set}`).join(''); - } - - estimateCrackTime(password) { - const charset = this.getCharsetSize(password); - const combinations = Math.pow(charset, password.length); - const guessesPerSecond = 1e9; // 假设每秒10亿次尝试 - const secondsToCrack = combinations / (2 * guessesPerSecond); - - if (secondsToCrack < 60) { - return '不到1分钟'; - } else if (secondsToCrack < 3600) { - return `${Math.ceil(secondsToCrack / 60)}分钟`; - } else if (secondsToCrack < 86400) { - return `${Math.ceil(secondsToCrack / 3600)}小时`; - } else if (secondsToCrack < 31536000) { - return `${Math.ceil(secondsToCrack / 86400)}天`; - } else if (secondsToCrack < 31536000000) { - return `${Math.ceil(secondsToCrack / 31536000)}年`; - } else { - return '数千年以上'; - } - } - - async copyPassword() { - const passwordInput = document.getElementById('passwordResult'); - - try { - if (navigator.clipboard && window.isSecureContext) { - await navigator.clipboard.writeText(passwordInput.value); - } else { - // 降级方案 - passwordInput.select(); - passwordInput.setSelectionRange(0, 99999); - document.execCommand('copy'); - } - - this.showToast('密码已复制到剪贴板!', 'success'); - - // 复制按钮反馈 - const copyBtn = document.getElementById('copyBtn'); - const originalText = copyBtn.innerHTML; - copyBtn.innerHTML = '✓ 已复制'; - copyBtn.style.background = '#2e7d32'; - - setTimeout(() => { - copyBtn.innerHTML = originalText; - copyBtn.style.background = ''; - }, 2000); - - } catch (error) { - console.error('复制失败:', error); - this.showToast('复制失败,请手动选择密码', 'error'); - } - } - - showLoading(show) { - const generateBtn = document.getElementById('generateBtn'); - - if (show) { - generateBtn.disabled = true; - generateBtn.innerHTML = ' 生成中...'; - } else { - generateBtn.disabled = false; - generateBtn.innerHTML = '🔐 生成密码'; - } - } - - showError(message) { - const errorContainer = document.getElementById('errorContainer'); - const resultContainer = document.getElementById('resultContainer'); - const errorMessage = document.getElementById('errorMessage'); - - errorMessage.textContent = message; - errorContainer.style.display = 'block'; - resultContainer.style.display = 'none'; - - errorContainer.scrollIntoView({ behavior: 'smooth', block: 'start' }); - } - - hideError() { - const errorContainer = document.getElementById('errorContainer'); - errorContainer.style.display = 'none'; - } - - showToast(message, type = 'info') { - // 移除现有的toast - const existingToast = document.querySelector('.toast'); - if (existingToast) { - existingToast.remove(); - } - - const toast = document.createElement('div'); - toast.className = 'toast'; - toast.textContent = message; - - // 根据类型设置颜色 - const colors = { - success: '#4caf50', - error: '#f44336', - warning: '#ff9800', - info: '#2196f3' - }; - - toast.style.background = colors[type] || colors.info; - - document.body.appendChild(toast); - - // 3秒后自动移除 - setTimeout(() => { - if (toast.parentNode) { - toast.remove(); - } - }, 3000); - } -} - -// 添加旋转动画样式 -const style = document.createElement('style'); -style.textContent = ` - @keyframes spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } - } -`; -document.head.appendChild(style); - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', () => { - new PasswordGenerator(); -}); - -// 页面可见性变化时的处理 -document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'visible') { - // 页面重新可见时,可以进行一些刷新操作 - console.log('页面重新可见'); - } -}); - -// 错误处理 -window.addEventListener('error', (event) => { - console.error('全局错误:', event.error); -}); - -window.addEventListener('unhandledrejection', (event) => { - console.error('未处理的Promise拒绝:', event.reason); - event.preventDefault(); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/返回接口.json deleted file mode 100755 index e3d1344c..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/返回接口.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "password": "8mr2M7dZ6E3saj3F", - "length": 16, - "config": { - "include_numbers": true, - "include_symbols": false, - "include_lowercase": true, - "include_uppercase": true, - "exclude_similar": true, - "exclude_ambiguous": true - }, - "character_sets": { - "lowercase": "abcdefghjkmnpqrstuvwxyz", - "uppercase": "ABCDEFGHIJKMNPQRSTUVWXYZ", - "numbers": "23456789", - "symbols": "", - "used_sets": [ - "lowercase", - "uppercase", - "numbers" - ] - }, - "generation_info": { - "entropy": 92.5, - "strength": "极强", - "time_to_crack": "数百万年" - } - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色.html b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色.html new file mode 100644 index 00000000..3cb5449d --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色.html @@ -0,0 +1,55 @@ + + + + +随机颜色 + + + + + +
    + +

    🌈 随机颜色

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/background.css b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/background.css deleted file mode 100755 index 70003b94..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/background.css +++ /dev/null @@ -1,215 +0,0 @@ -/* 背景样式文件 - 独立管理背景相关样式 */ - -/* 主体背景 */ -body { - background: linear-gradient(135deg, #e8f5e8 0%, #f0fff0 50%, #e8f5e8 100%); - background-attachment: fixed; - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; -} - -/* 背景动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 容器背景装饰 */ -.container::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(144, 205, 144, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(45, 90, 39, 0.05) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(144, 205, 144, 0.08) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 输入区域背景 */ -.input-section { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); -} - -/* 结果区域背景 */ -.result-section { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); -} - -/* 格式组背景 */ -.format-group { - background: rgba(248, 255, 248, 0.8); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -/* 属性项背景 */ -.property-item { - background: rgba(248, 255, 248, 0.8); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -/* 调色板项背景 */ -.palette-item { - background: rgba(248, 255, 248, 0.8); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -/* 无障碍项背景 */ -.accessibility-item { - background: rgba(248, 255, 248, 0.8); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -/* 颜色预览背景 */ -.color-preview { - background: rgba(248, 255, 248, 0.6); - backdrop-filter: blur(8px); - -webkit-backdrop-filter: blur(8px); -} - -/* 输入框背景 */ -.input-group input, -.input-group select { - background: rgba(248, 255, 248, 0.9); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -.input-group input:focus, -.input-group select:focus { - background: rgba(255, 255, 255, 0.95); -} - -/* 格式组内部元素背景 */ -.format-group p { - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(3px); - -webkit-backdrop-filter: blur(3px); -} - -/* 手机端背景优化 */ -@media (max-width: 767px) { - body { - background: linear-gradient(180deg, #e8f5e8 0%, #f0fff0 50%, #e8f5e8 100%); - background-attachment: scroll; /* 手机端使用scroll避免性能问题 */ - } - - .container::before { - background-image: - radial-gradient(circle at 30% 70%, rgba(144, 205, 144, 0.08) 0%, transparent 40%), - radial-gradient(circle at 70% 30%, rgba(45, 90, 39, 0.04) 0%, transparent 40%); - } - - /* 减少手机端的模糊效果以提升性能 */ - .input-section, - .result-section { - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); - } - - .format-group, - .property-item, - .palette-item, - .accessibility-item { - backdrop-filter: blur(3px); - -webkit-backdrop-filter: blur(3px); - } -} - -/* 平板端背景优化 */ -@media (min-width: 768px) and (max-width: 1024px) { - .container::before { - background-image: - radial-gradient(circle at 25% 75%, rgba(144, 205, 144, 0.12) 0%, transparent 60%), - radial-gradient(circle at 75% 25%, rgba(45, 90, 39, 0.06) 0%, transparent 60%), - radial-gradient(circle at 50% 50%, rgba(144, 205, 144, 0.04) 0%, transparent 40%); - } -} - -/* 电脑端背景优化 */ -@media (min-width: 1025px) { - body { - background-size: 300% 300%; - animation-duration: 20s; - } - - .container::before { - background-image: - radial-gradient(circle at 15% 85%, rgba(144, 205, 144, 0.15) 0%, transparent 70%), - radial-gradient(circle at 85% 15%, rgba(45, 90, 39, 0.08) 0%, transparent 70%), - radial-gradient(circle at 35% 35%, rgba(144, 205, 144, 0.1) 0%, transparent 50%), - radial-gradient(circle at 65% 65%, rgba(45, 90, 39, 0.05) 0%, transparent 50%); - } - - /* 电脑端增强模糊效果 */ - .input-section, - .result-section { - backdrop-filter: blur(15px); - -webkit-backdrop-filter: blur(15px); - } - - .format-group, - .property-item, - .palette-item, - .accessibility-item { - backdrop-filter: blur(8px); - -webkit-backdrop-filter: blur(8px); - } -} - -/* 深色模式支持(如果用户系统设置为深色模式) */ -@media (prefers-color-scheme: dark) { - body { - background: linear-gradient(135deg, #1a2e1a 0%, #0f1f0f 50%, #1a2e1a 100%); - } - - .container::before { - background-image: - radial-gradient(circle at 20% 80%, rgba(144, 205, 144, 0.05) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(45, 90, 39, 0.03) 0%, transparent 50%); - } - - .input-section, - .result-section { - background: rgba(26, 46, 26, 0.9); - } - - .format-group, - .property-item, - .palette-item, - .accessibility-item, - .color-preview { - background: rgba(26, 46, 26, 0.6); - } - - .input-group input, - .input-group select { - background: rgba(26, 46, 26, 0.8); - color: #e8f5e8; - border-color: rgba(144, 205, 144, 0.3); - } - - .format-group p { - background: rgba(15, 31, 15, 0.8); - color: #e8f5e8; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/index.html b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/index.html deleted file mode 100755 index ba950f3a..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/index.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - 随机颜色/颜色转换工具 - - - - -
    -
    -

    随机颜色/颜色转换工具

    -

    获取随机颜色或转换指定颜色格式

    -
    - -
    -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - -
    -
    -
    -
    -

    颜色名称

    -

    #000000

    -
    -
    - -
    -
    -

    RGB

    -
    - 0 - 0 - 0 -
    -

    rgb(0, 0, 0)

    -
    - -
    -

    HSL

    -
    - - 0% - 0% -
    -

    hsl(0, 0%, 0%)

    -
    - -
    -

    HSV

    -
    - - 0% - 0% -
    -

    hsv(0, 0%, 0%)

    -
    - -
    -

    CMYK

    -
    - 0% - 0% - 0% - 0% -
    -

    cmyk(0%, 0%, 0%, 0%)

    -
    - -
    -

    LAB

    -
    - 0 - 0 - 0 -
    -

    lab(0, 0, 0)

    -
    -
    - -
    -
    - - 0 -
    -
    - - 0 -
    -
    - - 0 -
    -
    - - #000000 -
    -
    - -
    -

    配色方案

    -
    -
    - -
    - #000000 -
    -
    - -
    -
    -
    -
    -
    - #000000 - #000000 -
    -
    -
    - -
    -
    -
    -
    -
    - #000000 - #000000 -
    -
    -
    -
    - -
    -

    无障碍性

    -
    -
    - AA 普通文本: - -
    -
    - AA 大文本: - -
    -
    - AAA 普通文本: - -
    -
    - AAA 大文本: - -
    -
    -
    -
    - - - - -
    -
    - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/script.js b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/script.js deleted file mode 100755 index ff8f3d81..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/script.js +++ /dev/null @@ -1,426 +0,0 @@ -// 随机颜色/颜色转换工具 JavaScript - -class ColorTool { - constructor() { - this.apiUrl = 'https://60s.api.shumengya.top/v2/color'; - this.init(); - } - - init() { - this.bindEvents(); - this.hideResultSection(); - } - - bindEvents() { - const randomBtn = document.getElementById('randomBtn'); - const convertBtn = document.getElementById('convertBtn'); - const colorInput = document.getElementById('colorInput'); - - randomBtn.addEventListener('click', () => this.getRandomColor()); - convertBtn.addEventListener('click', () => this.convertColor()); - - // 回车键支持 - colorInput.addEventListener('keypress', (e) => { - if (e.key === 'Enter') { - this.convertColor(); - } - }); - } - - hideResultSection() { - const resultSection = document.querySelector('.result-section'); - resultSection.style.display = 'none'; - } - - showResultSection() { - const resultSection = document.querySelector('.result-section'); - resultSection.style.display = 'block'; - } - - showLoading() { - const loading = document.getElementById('loading'); - const error = document.getElementById('error'); - loading.style.display = 'block'; - error.style.display = 'none'; - this.hideResultSection(); - } - - hideLoading() { - const loading = document.getElementById('loading'); - loading.style.display = 'none'; - } - - showError(message) { - const error = document.getElementById('error'); - const errorMessage = document.getElementById('errorMessage'); - const loading = document.getElementById('loading'); - - loading.style.display = 'none'; - errorMessage.textContent = message; - error.style.display = 'block'; - this.hideResultSection(); - } - - hideError() { - const error = document.getElementById('error'); - error.style.display = 'none'; - } - - async getRandomColor() { - try { - this.showLoading(); - const encoding = document.getElementById('encodingSelect').value; - const url = `${this.apiUrl}?encoding=${encoding}`; - - const response = await fetch(url); - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - if (data.code === 200) { - this.displayColorData(data.data); - this.hideLoading(); - this.hideError(); - this.showResultSection(); - } else { - throw new Error(data.message || '获取颜色信息失败'); - } - } catch (error) { - console.error('获取随机颜色失败:', error); - this.showError(`获取随机颜色失败: ${error.message}`); - } - } - - async convertColor() { - const colorInput = document.getElementById('colorInput'); - const colorValue = colorInput.value.trim(); - - if (!colorValue) { - this.showError('请输入要转换的颜色值'); - return; - } - - // 简单的颜色格式验证 - if (!this.isValidColor(colorValue)) { - this.showError('请输入有效的颜色值(如 #33AAFF)'); - return; - } - - try { - this.showLoading(); - const encoding = document.getElementById('encodingSelect').value; - const url = `${this.apiUrl}?color=${encodeURIComponent(colorValue)}&encoding=${encoding}`; - - const response = await fetch(url); - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - if (data.code === 200) { - this.displayColorData(data.data); - this.hideLoading(); - this.hideError(); - this.showResultSection(); - } else { - throw new Error(data.message || '转换颜色失败'); - } - } catch (error) { - console.error('转换颜色失败:', error); - this.showError(`转换颜色失败: ${error.message}`); - } - } - - isValidColor(color) { - // 支持十六进制颜色格式 - const hexPattern = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/; - // 支持RGB格式 - const rgbPattern = /^rgb\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*\)$/; - // 支持HSL格式 - const hslPattern = /^hsl\(\s*\d+\s*,\s*\d+%\s*,\s*\d+%\s*\)$/; - - return hexPattern.test(color) || rgbPattern.test(color) || hslPattern.test(color); - } - - displayColorData(data) { - // 显示主要颜色信息 - this.updateColorDisplay(data); - - // 显示各种格式 - this.updateColorFormats(data); - - // 显示颜色属性 - this.updateColorProperties(data); - - // 显示配色方案 - this.updateColorPalette(data); - - // 显示无障碍性信息 - this.updateAccessibilityInfo(data); - } - - updateColorDisplay(data) { - const colorDisplay = document.getElementById('colorDisplay'); - const colorName = document.getElementById('colorName'); - const hexValue = document.getElementById('hexValue'); - - colorDisplay.style.backgroundColor = data.hex; - colorName.textContent = data.name || '未知颜色'; - hexValue.textContent = data.hex; - } - - updateColorFormats(data) { - // RGB - if (data.rgb) { - document.getElementById('rgbR').textContent = data.rgb.r; - document.getElementById('rgbG').textContent = data.rgb.g; - document.getElementById('rgbB').textContent = data.rgb.b; - document.getElementById('rgbString').textContent = data.rgb.string; - } - - // HSL - if (data.hsl) { - document.getElementById('hslH').textContent = data.hsl.h + '°'; - document.getElementById('hslS').textContent = data.hsl.s + '%'; - document.getElementById('hslL').textContent = data.hsl.l + '%'; - document.getElementById('hslString').textContent = data.hsl.string; - } - - // HSV - if (data.hsv) { - document.getElementById('hsvH').textContent = data.hsv.h + '°'; - document.getElementById('hsvS').textContent = data.hsv.s + '%'; - document.getElementById('hsvV').textContent = data.hsv.v + '%'; - document.getElementById('hsvString').textContent = data.hsv.string; - } - - // CMYK - if (data.cmyk) { - document.getElementById('cmykC').textContent = data.cmyk.c + '%'; - document.getElementById('cmykM').textContent = data.cmyk.m + '%'; - document.getElementById('cmykY').textContent = data.cmyk.y + '%'; - document.getElementById('cmykK').textContent = data.cmyk.k + '%'; - document.getElementById('cmykString').textContent = data.cmyk.string; - } - - // LAB - if (data.lab) { - document.getElementById('labL').textContent = data.lab.l; - document.getElementById('labA').textContent = data.lab.a; - document.getElementById('labB').textContent = data.lab.b; - document.getElementById('labString').textContent = data.lab.string; - } - } - - updateColorProperties(data) { - // 亮度 - if (data.brightness !== undefined) { - document.getElementById('brightness').textContent = data.brightness.toFixed(2); - } - - // 对比度 - if (data.contrast) { - document.getElementById('contrastWhite').textContent = data.contrast.white.toFixed(2); - document.getElementById('contrastBlack').textContent = data.contrast.black.toFixed(2); - } - - // 最佳文字颜色 - if (data.accessibility && data.accessibility.best_text_color) { - const bestTextColor = document.getElementById('bestTextColor'); - bestTextColor.textContent = data.accessibility.best_text_color; - bestTextColor.style.color = data.accessibility.best_text_color; - } - } - - updateColorPalette(data) { - // 互补色 - if (data.complementary) { - const complementary = document.getElementById('complementary'); - const complementaryHex = document.getElementById('complementaryHex'); - complementary.style.backgroundColor = data.complementary; - complementaryHex.textContent = data.complementary; - } - - // 类似色 - if (data.analogous && data.analogous.length >= 2) { - const analogous1 = document.getElementById('analogous1'); - const analogous2 = document.getElementById('analogous2'); - const analogous1Hex = document.getElementById('analogous1Hex'); - const analogous2Hex = document.getElementById('analogous2Hex'); - - analogous1.style.backgroundColor = data.analogous[0]; - analogous2.style.backgroundColor = data.analogous[1]; - analogous1Hex.textContent = data.analogous[0]; - analogous2Hex.textContent = data.analogous[1]; - } - - // 三角色 - if (data.triadic && data.triadic.length >= 2) { - const triadic1 = document.getElementById('triadic1'); - const triadic2 = document.getElementById('triadic2'); - const triadic1Hex = document.getElementById('triadic1Hex'); - const triadic2Hex = document.getElementById('triadic2Hex'); - - triadic1.style.backgroundColor = data.triadic[0]; - triadic2.style.backgroundColor = data.triadic[1]; - triadic1Hex.textContent = data.triadic[0]; - triadic2Hex.textContent = data.triadic[1]; - } - } - - updateAccessibilityInfo(data) { - if (data.accessibility) { - const aaNormal = document.getElementById('aaNormal'); - const aaLarge = document.getElementById('aaLarge'); - const aaaNormal = document.getElementById('aaaNormal'); - const aaaLarge = document.getElementById('aaaLarge'); - - this.updateAccessibilityStatus(aaNormal, data.accessibility.aa_normal); - this.updateAccessibilityStatus(aaLarge, data.accessibility.aa_large); - this.updateAccessibilityStatus(aaaNormal, data.accessibility.aaa_normal); - this.updateAccessibilityStatus(aaaLarge, data.accessibility.aaa_large); - } - } - - updateAccessibilityStatus(element, status) { - element.textContent = status ? '通过' : '未通过'; - element.className = 'status ' + (status ? 'pass' : 'fail'); - } - - // 复制颜色值到剪贴板 - copyToClipboard(text) { - if (navigator.clipboard) { - navigator.clipboard.writeText(text).then(() => { - this.showToast('已复制到剪贴板'); - }).catch(err => { - console.error('复制失败:', err); - this.fallbackCopyTextToClipboard(text); - }); - } else { - this.fallbackCopyTextToClipboard(text); - } - } - - fallbackCopyTextToClipboard(text) { - const textArea = document.createElement('textarea'); - textArea.value = text; - textArea.style.top = '0'; - textArea.style.left = '0'; - textArea.style.position = 'fixed'; - - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - - try { - const successful = document.execCommand('copy'); - if (successful) { - this.showToast('已复制到剪贴板'); - } else { - this.showToast('复制失败'); - } - } catch (err) { - console.error('复制失败:', err); - this.showToast('复制失败'); - } - - document.body.removeChild(textArea); - } - - showToast(message) { - // 创建简单的提示框 - const toast = document.createElement('div'); - toast.textContent = message; - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: #2d5a27; - color: white; - padding: 12px 20px; - border-radius: 8px; - z-index: 1000; - font-size: 14px; - box-shadow: 0 4px 12px rgba(0,0,0,0.15); - animation: slideIn 0.3s ease; - `; - - // 添加动画样式 - const style = document.createElement('style'); - style.textContent = ` - @keyframes slideIn { - from { transform: translateX(100%); opacity: 0; } - to { transform: translateX(0); opacity: 1; } - } - `; - document.head.appendChild(style); - - document.body.appendChild(toast); - - setTimeout(() => { - toast.style.animation = 'slideIn 0.3s ease reverse'; - setTimeout(() => { - document.body.removeChild(toast); - document.head.removeChild(style); - }, 300); - }, 2000); - } -} - -// 添加点击复制功能 -function addCopyListeners() { - const colorTool = window.colorTool; - - // 为所有颜色值添加点击复制功能 - document.addEventListener('click', (e) => { - const target = e.target; - - // 检查是否点击了颜色值相关元素 - if (target.id === 'hexValue' || - target.id === 'rgbString' || - target.id === 'hslString' || - target.id === 'hsvString' || - target.id === 'cmykString' || - target.id === 'labString' || - target.id === 'complementaryHex' || - target.id === 'analogous1Hex' || - target.id === 'analogous2Hex' || - target.id === 'triadic1Hex' || - target.id === 'triadic2Hex') { - - const text = target.textContent; - if (text && colorTool) { - colorTool.copyToClipboard(text); - } - } - }); -} - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', () => { - window.colorTool = new ColorTool(); - addCopyListeners(); - - // 添加复制提示 - const style = document.createElement('style'); - style.textContent = ` - #hexValue, #rgbString, #hslString, #hsvString, #cmykString, #labString, - #complementaryHex, #analogous1Hex, #analogous2Hex, #triadic1Hex, #triadic2Hex { - cursor: pointer; - transition: all 0.2s ease; - } - - #hexValue:hover, #rgbString:hover, #hslString:hover, #hsvString:hover, - #cmykString:hover, #labString:hover, #complementaryHex:hover, - #analogous1Hex:hover, #analogous2Hex:hover, #triadic1Hex:hover, #triadic2Hex:hover { - background: rgba(45, 90, 39, 0.1); - border-radius: 4px; - padding: 2px 4px; - margin: -2px -4px; - } - `; - document.head.appendChild(style); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/styles.css b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/styles.css deleted file mode 100755 index 5d990823..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/styles.css +++ /dev/null @@ -1,637 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: #2d3748; - min-height: 100vh; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; - padding: 20px 0; -} - -.header h1 { - font-size: 2rem; - color: #2d5a27; - margin-bottom: 10px; - font-weight: 600; -} - -.subtitle { - color: #4a5568; - font-size: 1rem; - opacity: 0.8; -} - -/* 主要内容区域 */ -.main-content { - display: flex; - flex-direction: column; - gap: 30px; -} - -/* 输入区域 */ -.input-section { - background: rgba(255, 255, 255, 0.9); - padding: 25px; - border-radius: 15px; - box-shadow: 0 4px 20px rgba(45, 90, 39, 0.1); - border: 1px solid rgba(144, 205, 144, 0.3); -} - -.input-group { - margin-bottom: 20px; -} - -.input-group label { - display: block; - margin-bottom: 8px; - font-weight: 500; - color: #2d5a27; - font-size: 0.95rem; -} - -.input-group input, -.input-group select { - width: 100%; - padding: 12px 15px; - border: 2px solid #90cd90; - border-radius: 10px; - font-size: 1rem; - transition: all 0.3s ease; - background: #f8fff8; -} - -.input-group input:focus, -.input-group select:focus { - outline: none; - border-color: #2d5a27; - box-shadow: 0 0 0 3px rgba(45, 90, 39, 0.1); - background: #ffffff; -} - -.button-group { - display: flex; - gap: 15px; - margin-top: 25px; -} - -.btn { - flex: 1; - padding: 15px 20px; - border: none; - border-radius: 10px; - font-size: 1rem; - font-weight: 500; - cursor: pointer; - transition: all 0.3s ease; - text-transform: none; -} - -.btn-primary { - background: linear-gradient(135deg, #2d5a27, #4a7c59); - color: white; -} - -.btn-primary:hover { - background: linear-gradient(135deg, #1e3a1a, #2d5a27); - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(45, 90, 39, 0.3); -} - -.btn-secondary { - background: linear-gradient(135deg, #90cd90, #a8d8a8); - color: #2d5a27; -} - -.btn-secondary:hover { - background: linear-gradient(135deg, #7bb87b, #90cd90); - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(144, 205, 144, 0.4); -} - -/* 结果展示区域 */ -.result-section { - background: rgba(255, 255, 255, 0.9); - padding: 25px; - border-radius: 15px; - box-shadow: 0 4px 20px rgba(45, 90, 39, 0.1); - border: 1px solid rgba(144, 205, 144, 0.3); -} - -/* 颜色预览 */ -.color-preview { - display: flex; - align-items: center; - gap: 20px; - margin-bottom: 30px; - padding: 20px; - background: #f8fff8; - border-radius: 12px; - border: 1px solid rgba(144, 205, 144, 0.2); -} - -.color-box { - width: 80px; - height: 80px; - border-radius: 12px; - border: 3px solid #ffffff; - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); - flex-shrink: 0; -} - -.color-info h3 { - color: #2d5a27; - margin-bottom: 5px; - font-size: 1.2rem; -} - -.color-info p { - color: #4a5568; - font-size: 1.1rem; - font-weight: 500; - font-family: 'Courier New', monospace; -} - -/* 颜色格式展示 */ -.color-formats { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 20px; - margin-bottom: 30px; -} - -.format-group { - background: #f8fff8; - padding: 15px; - border-radius: 10px; - border: 1px solid rgba(144, 205, 144, 0.2); -} - -.format-group h4 { - color: #2d5a27; - margin-bottom: 10px; - font-size: 1rem; - font-weight: 600; -} - -.format-values { - display: flex; - gap: 8px; - margin-bottom: 8px; - flex-wrap: wrap; -} - -.format-values span { - background: #90cd90; - color: #2d5a27; - padding: 4px 8px; - border-radius: 6px; - font-size: 0.85rem; - font-weight: 500; -} - -.format-group p { - font-family: 'Courier New', monospace; - color: #4a5568; - font-size: 0.9rem; - background: #ffffff; - padding: 8px; - border-radius: 6px; - border: 1px solid rgba(144, 205, 144, 0.2); -} - -/* 颜色属性 */ -.color-properties { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 15px; - margin-bottom: 30px; -} - -.property-item { - display: flex; - justify-content: space-between; - align-items: center; - background: #f8fff8; - padding: 12px 15px; - border-radius: 8px; - border: 1px solid rgba(144, 205, 144, 0.2); -} - -.property-item label { - color: #2d5a27; - font-weight: 500; - font-size: 0.9rem; -} - -.property-item span { - color: #4a5568; - font-weight: 600; - font-family: 'Courier New', monospace; -} - -/* 配色方案 */ -.color-palette { - margin-bottom: 30px; -} - -.color-palette h4 { - color: #2d5a27; - margin-bottom: 15px; - font-size: 1.1rem; - font-weight: 600; -} - -.palette-group { - display: flex; - flex-direction: column; - gap: 15px; -} - -.palette-item { - background: #f8fff8; - padding: 15px; - border-radius: 10px; - border: 1px solid rgba(144, 205, 144, 0.2); -} - -.palette-item label { - display: block; - color: #2d5a27; - font-weight: 500; - margin-bottom: 10px; - font-size: 0.95rem; -} - -.color-sample { - width: 40px; - height: 40px; - border-radius: 8px; - border: 2px solid #ffffff; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); - display: inline-block; - margin-right: 10px; -} - -.analogous-colors, -.triadic-colors { - display: flex; - gap: 10px; - margin-bottom: 8px; -} - -.analogous-hex, -.triadic-hex { - display: flex; - gap: 10px; - font-family: 'Courier New', monospace; - font-size: 0.85rem; - color: #4a5568; -} - -/* 无障碍性信息 */ -.accessibility-info h4 { - color: #2d5a27; - margin-bottom: 15px; - font-size: 1.1rem; - font-weight: 600; -} - -.accessibility-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 10px; -} - -.accessibility-item { - display: flex; - justify-content: space-between; - align-items: center; - background: #f8fff8; - padding: 10px 15px; - border-radius: 8px; - border: 1px solid rgba(144, 205, 144, 0.2); -} - -.accessibility-item span:first-child { - color: #2d5a27; - font-weight: 500; - font-size: 0.9rem; -} - -.status { - padding: 4px 8px; - border-radius: 6px; - font-size: 0.8rem; - font-weight: 600; -} - -.status.pass { - background: #90cd90; - color: #2d5a27; -} - -.status.fail { - background: #ffcccb; - color: #d32f2f; -} - -/* 加载和错误状态 */ -.loading, -.error { - text-align: center; - padding: 40px 20px; - border-radius: 12px; - margin: 20px 0; -} - -.loading { - background: rgba(144, 205, 144, 0.1); - border: 1px solid rgba(144, 205, 144, 0.3); -} - -.error { - background: rgba(255, 204, 203, 0.3); - border: 1px solid rgba(211, 47, 47, 0.3); -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid rgba(144, 205, 144, 0.3); - border-top: 4px solid #2d5a27; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 15px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading p { - color: #2d5a27; - font-weight: 500; -} - -.error p { - color: #d32f2f; - font-weight: 500; -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 30px; - } - - .header h1 { - font-size: 2.5rem; - } - - .main-content { - gap: 35px; - } - - .input-section, - .result-section { - padding: 30px; - } - - .color-preview { - gap: 25px; - } - - .color-box { - width: 100px; - height: 100px; - } - - .color-formats { - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - } - - .palette-group { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: 20px; - } -} - -/* 电脑端适配 (1025px+) */ -@media (min-width: 1025px) { - .container { - padding: 40px; - } - - .header h1 { - font-size: 3rem; - } - - .subtitle { - font-size: 1.1rem; - } - - .main-content { - gap: 40px; - } - - .input-section, - .result-section { - padding: 35px; - } - - .color-preview { - gap: 30px; - padding: 25px; - } - - .color-box { - width: 120px; - height: 120px; - } - - .color-info h3 { - font-size: 1.4rem; - } - - .color-info p { - font-size: 1.2rem; - } - - .color-formats { - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); - gap: 25px; - } - - .format-group { - padding: 20px; - } - - .palette-group { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 25px; - } - - .button-group { - max-width: 500px; - margin: 25px auto 0; - } - - .btn { - padding: 18px 25px; - font-size: 1.1rem; - } -} - -/* 手机端优化 (最高优先级) */ -@media (max-width: 767px) { - .container { - padding: 15px; - } - - .header { - margin-bottom: 25px; - padding: 15px 0; - } - - .header h1 { - font-size: 1.8rem; - } - - .subtitle { - font-size: 0.9rem; - } - - .main-content { - gap: 25px; - } - - .input-section, - .result-section { - padding: 20px; - border-radius: 12px; - } - - .input-group { - margin-bottom: 18px; - } - - .input-group input, - .input-group select { - padding: 14px 12px; - font-size: 16px; /* 防止iOS缩放 */ - } - - .button-group { - flex-direction: column; - gap: 12px; - margin-top: 20px; - } - - .btn { - padding: 16px 20px; - font-size: 1rem; - border-radius: 8px; - } - - .color-preview { - flex-direction: column; - text-align: center; - gap: 15px; - padding: 15px; - } - - .color-box { - width: 100px; - height: 100px; - margin: 0 auto; - } - - .color-formats { - grid-template-columns: 1fr; - gap: 15px; - } - - .format-group { - padding: 12px; - } - - .format-values { - justify-content: center; - } - - .color-properties { - grid-template-columns: 1fr; - gap: 12px; - } - - .property-item { - flex-direction: column; - gap: 5px; - text-align: center; - padding: 15px; - } - - .palette-group { - gap: 12px; - } - - .palette-item { - padding: 12px; - text-align: center; - } - - .analogous-colors, - .triadic-colors { - justify-content: center; - } - - .analogous-hex, - .triadic-hex { - justify-content: center; - flex-wrap: wrap; - } - - .accessibility-grid { - grid-template-columns: 1fr; - gap: 8px; - } - - .accessibility-item { - flex-direction: column; - gap: 5px; - text-align: center; - padding: 12px; - } - - .loading, - .error { - padding: 30px 15px; - margin: 15px 0; - } - - .spinner { - width: 35px; - height: 35px; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/返回接口.json deleted file mode 100755 index f1d44f5e..00000000 --- a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/返回接口.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "hex": "#A59619", - "name": "红色系", - "rgb": { - "r": 165, - "g": 150, - "b": 25, - "string": "rgb(165, 150, 25)" - }, - "hsl": { - "h": 54, - "s": 74, - "l": 37, - "string": "hsl(54, 74%, 37%)" - }, - "hsv": { - "h": 54, - "s": 85, - "v": 65, - "string": "hsv(54, 85%, 65%)" - }, - "cmyk": { - "c": 0, - "m": 9, - "y": 85, - "k": 35, - "string": "cmyk(0%, 9%, 85%, 35%)" - }, - "lab": { - "l": 62, - "a": -7, - "b": 61, - "string": "lab(62, -7, 61)" - }, - "brightness": 140.235, - "contrast": { - "white": 3.01, - "black": 6.98 - }, - "accessibility": { - "aa_normal": true, - "aa_large": true, - "aaa_normal": false, - "aaa_large": true, - "best_text_color": "#000000" - }, - "complementary": "#1926A4", - "analogous": [ - "#A45019", - "#6CA419" - ], - "triadic": [ - "#19A496", - "#9619A4" - ] - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/css/style.css b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/css/style.css deleted file mode 100755 index 868c5f16..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/css/style.css +++ /dev/null @@ -1,423 +0,0 @@ -/* 历史上的今天 - 手机端优先的响应式设计 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, - #e8f5e8 0%, /* 淡绿色 */ - #f0f8e8 25%, /* 浅绿黄 */ - #fff8dc 50%, /* 淡黄色 */ - #f5f5dc 75%, /* 米色 */ - #e8f5e8 100% /* 淡绿色 */ - ); - background-size: 400% 400%; - animation: freshGradientShift 20s ease infinite; - min-height: 100vh; - color: #2c3e50; - line-height: 1.6; - overflow-x: hidden; -} - -@keyframes freshGradientShift { - 0% { background-position: 0% 50%; } - 25% { background-position: 100% 50%; } - 50% { background-position: 100% 100%; } - 75% { background-position: 0% 100%; } - 100% { background-position: 0% 50%; } -} - -.container { - max-width: 100%; - margin: 0 auto; - padding: 10px; -} - -/* 头部样式 - 手机端优先 */ -.header { - text-align: center; - margin-bottom: 20px; - background: rgba(255, 255, 255, 0.9); - border-radius: 20px; - padding: 25px 20px; - box-shadow: 0 8px 32px rgba(46, 125, 50, 0.15); - backdrop-filter: blur(15px); - border: 1px solid rgba(139, 195, 74, 0.2); -} - -.header h1 { - font-size: 1.8rem; - color: #2c3e50; - margin-bottom: 8px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - gap: 10px; - flex-wrap: wrap; -} - -.header p { - color: #7f8c8d; - font-size: 0.9rem; - line-height: 1.4; -} - -/* 日期显示 */ -.date-section { - background: rgba(255, 255, 255, 0.9); - border-radius: 16px; - padding: 20px; - margin-bottom: 20px; - text-align: center; - box-shadow: 0 6px 24px rgba(76, 175, 80, 0.12); - border: 1px solid rgba(139, 195, 74, 0.2); -} - -.date-display h2 { - font-size: 1.4rem; - color: #2e7d32; - margin-bottom: 8px; - font-weight: 600; -} - -.date-display .date-text { - color: #558b2f; - font-size: 1rem; - font-weight: 500; -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 40px 20px; - background: rgba(255, 255, 255, 0.9); - border-radius: 16px; - box-shadow: 0 6px 24px rgba(76, 175, 80, 0.12); - border: 1px solid rgba(139, 195, 74, 0.2); -} - -.loading-spinner { - width: 40px; - height: 40px; - border: 3px solid rgba(139, 195, 74, 0.2); - border-top: 3px solid #689f38; - border-radius: 50%; - animation: spin 1.2s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 历史事件容器 */ -.events-container { - background: rgba(255, 255, 255, 0.9); - border-radius: 20px; - padding: 25px; - margin-bottom: 20px; - box-shadow: 0 8px 32px rgba(76, 175, 80, 0.15); - backdrop-filter: blur(15px); - border: 1px solid rgba(139, 195, 74, 0.2); -} - -/* 统计信息 */ -.stats { - display: grid; - grid-template-columns: repeat(4, 1fr); - gap: 12px; - margin-bottom: 25px; -} - -.stat-item { - background: rgba(139, 195, 74, 0.15); - border-radius: 12px; - padding: 16px 12px; - text-align: center; - border: 1px solid rgba(139, 195, 74, 0.2); - transition: all 0.3s ease; -} - -.stat-item:hover { - background: rgba(139, 195, 74, 0.2); - transform: translateY(-2px); -} - -.stat-number { - font-size: 1.5rem; - font-weight: 700; - color: #558b2f; - display: block; -} - -.stat-label { - color: #689f38; - font-size: 0.85rem; - margin-top: 4px; - font-weight: 500; -} - -/* 事件列表 */ -.events-list { - display: flex; - flex-direction: column; - gap: 12px; -} - -.event-card { - background: rgba(255, 255, 255, 0.95); - border-radius: 16px; - padding: 20px; - box-shadow: 0 4px 16px rgba(76, 175, 80, 0.1); - transition: all 0.3s ease; - border-left: 4px solid #81c784; - position: relative; - border: 1px solid rgba(139, 195, 74, 0.15); -} - -.event-card:hover { - transform: translateY(-3px); - box-shadow: 0 8px 24px rgba(76, 175, 80, 0.15); - border-left-color: #66bb6a; -} - -/* 事件类型标签 */ -.event-type { - position: absolute; - top: 10px; - right: 10px; - padding: 4px 8px; - border-radius: 12px; - font-size: 0.7rem; - font-weight: 600; - text-transform: uppercase; -} - -.event-type.birth { - background: #e8f5e8; - color: #2e7d32; -} - -.event-type.death { - background: #fff3e0; - color: #f57c00; -} - -.event-type.event { - background: #f1f8e9; - color: #558b2f; -} - -/* 事件年份 */ -.event-year { - font-size: 1.1rem; - font-weight: 700; - color: #558b2f; - margin-bottom: 10px; - display: flex; - align-items: center; - gap: 8px; -} - -.event-year::before { - content: "📅"; - font-size: 1rem; -} - -/* 事件标题 */ -.event-title { - font-size: 1rem; - font-weight: 600; - color: #2c3e50; - margin-bottom: 8px; - line-height: 1.4; -} - -/* 事件描述 */ -.event-description { - color: #7f8c8d; - font-size: 0.85rem; - line-height: 1.5; - margin-bottom: 10px; -} - -/* 链接按钮 */ -.event-link { - display: inline-flex; - align-items: center; - gap: 6px; - color: #558b2f; - text-decoration: none; - font-size: 0.85rem; - font-weight: 500; - padding: 8px 14px; - background: rgba(139, 195, 74, 0.15); - border-radius: 18px; - transition: all 0.3s ease; - border: 1px solid rgba(139, 195, 74, 0.2); -} - -.event-link:hover { - background: rgba(139, 195, 74, 0.25); - transform: translateX(2px); - color: #2e7d32; -} - -.event-link::after { - content: "🔗"; - font-size: 0.7rem; -} - -/* 错误提示 */ -.error { - background: #fed7d7; - color: #c53030; - padding: 15px; - border-radius: 12px; - text-align: center; - border: 1px solid #feb2b2; - margin: 15px 0; - font-size: 0.9rem; -} - -/* 隐藏类 */ -.hidden { - display: none; -} - -/* 淡入动画 */ -.fade-in { - animation: fadeIn 0.6s ease-in; -} - -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 平板端适配 (768px+) */ -@media (min-width: 768px) { - .container { - max-width: 750px; - padding: 20px; - } - - .header { - padding: 30px 25px; - } - - .header h1 { - font-size: 2.2rem; - } - - .header p { - font-size: 1rem; - } - - .date-info { - padding: 20px; - } - - .date-info h2 { - font-size: 1.5rem; - } - - .events-container { - padding: 25px; - } - - .stats { - gap: 15px; - } - - .event-card { - padding: 20px; - } - - .event-title { - font-size: 1.1rem; - } - - .event-description { - font-size: 0.9rem; - } -} - -/* 电脑端适配 (1024px+) */ -@media (min-width: 1024px) { - .container { - max-width: 1000px; - padding: 30px; - } - - .header { - padding: 40px 35px; - } - - .header h1 { - font-size: 2.5rem; - } - - .events-list { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 20px; - } - - .event-card { - padding: 25px; - } - - .event-title { - font-size: 1.2rem; - } - - .event-description { - font-size: 0.95rem; - } -} - -/* 大屏幕优化 (1200px+) */ -@media (min-width: 1200px) { - .container { - max-width: 1200px; - padding: 40px; - } - - .events-list { - grid-template-columns: repeat(3, 1fr); - gap: 25px; - } -} - -/* 滚动条样式 */ -::-webkit-scrollbar { - width: 8px; -} - -::-webkit-scrollbar-track { - background: rgba(139, 195, 74, 0.1); - border-radius: 4px; -} - -::-webkit-scrollbar-thumb { - background: rgba(139, 195, 74, 0.5); - border-radius: 4px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(139, 195, 74, 0.7); -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/index.html b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/index.html deleted file mode 100755 index ececc84d..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/index.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - 历史上的今天 - 60s API集合 - - - - - - - - - - - - - -
    - -
    -

    📚 历史上的今天

    -

    探索历史,了解今天在历史上发生的重要事件

    -
    - - -
    -
    - 加载中... -
    -
    - - -
    -
    -

    正在加载历史数据...

    -
    - - -
    - - - -
    -

    历史事件

    -
    -
    - -
    -
    -
    -
    - -
    - - - - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/js/script.js b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/js/script.js deleted file mode 100755 index a979d6a4..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/js/script.js +++ /dev/null @@ -1,295 +0,0 @@ -// 历史上的今天 - JavaScript 功能实现 - -// API 配置 -const API = { - endpoints: [], - currentIndex: 0, - encoding: 'utf-8', - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/today_in_history`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.api.shumengya.top/v2/today_in_history']; - } - }, - // 获取当前接口URL - getCurrentUrl() { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - url.searchParams.append('encoding', this.encoding); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } -}; - -// 事件类型映射 -const EVENT_TYPE_MAP = { - 'birth': { name: '诞生', icon: '🎂', color: '#27ae60' }, - 'death': { name: '逝世', icon: '🕊️', color: '#e67e22' }, - 'event': { name: '事件', icon: '📰', color: '#3498db' } -}; - -// DOM 元素 -let elements = {}; -let currentData = null; - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', function() { - initElements(); - loadTodayInHistory(); -}); - -// 初始化 DOM 元素 -function initElements() { - elements = { - loading: document.getElementById('loading'), - content: document.getElementById('history-content'), - dateInfo: document.getElementById('date-info'), - dateText: document.getElementById('date-text'), - totalEvents: document.getElementById('total-events'), - birthEvents: document.getElementById('birth-events'), - deathEvents: document.getElementById('death-events'), - otherEvents: document.getElementById('other-events'), - eventsList: document.getElementById('events-list') - }; -} - -// 加载历史上的今天数据 -async function loadTodayInHistory() { - try { - showLoading(true); - - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const response = await fetch(url, { - cache: 'no-store', - timeout: 10000 // 10秒超时 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - console.log('API响应数据:', data); - - if (data.code === 200 && data.data) { - console.log(`接口 ${i + 1} 请求成功`); - currentData = data.data; - displayHistoryData(data.data); - return; - } else { - throw new Error(data.message || '获取数据失败'); - } - - } catch (error) { - console.warn(`接口 ${i + 1} 失败:`, error.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了,抛出错误 - throw new Error('所有接口都无法访问'); - } - } - - } catch (error) { - console.error('加载历史数据失败:', error); - showError(`加载失败: ${error.message}`); - } finally { - showLoading(false); - } -} - -// 显示历史数据 -function displayHistoryData(data) { - if (!data || !data.items) { - showError('没有获取到历史数据'); - return; - } - - // 更新日期信息 - updateDateInfo(data); - - // 更新统计信息 - updateStats(data.items); - - // 显示事件列表 - renderEventsList(data.items); - - // 显示内容区域 - if (elements.content) { - elements.content.classList.add('fade-in'); - elements.content.style.display = 'block'; - } -} - -// 更新日期信息 -function updateDateInfo(data) { - if (elements.dateText && data.date) { - const today = new Date(); - const year = today.getFullYear(); - elements.dateText.textContent = `${year}年${data.month}月${data.day}日`; - } -} - -// 更新统计信息 -function updateStats(items) { - const stats = { - total: items.length, - birth: items.filter(item => item.event_type === 'birth').length, - death: items.filter(item => item.event_type === 'death').length, - event: items.filter(item => item.event_type === 'event').length - }; - - if (elements.totalEvents) { - elements.totalEvents.textContent = stats.total; - } - - if (elements.birthEvents) { - elements.birthEvents.textContent = stats.birth; - } - - if (elements.deathEvents) { - elements.deathEvents.textContent = stats.death; - } - - if (elements.otherEvents) { - elements.otherEvents.textContent = stats.event; - } -} - -// 渲染事件列表 -function renderEventsList(items) { - if (!elements.eventsList || !items) return; - - // 按年份排序(从今到古) - const sortedItems = [...items].sort((a, b) => { - return parseInt(b.year) - parseInt(a.year); - }); - - elements.eventsList.innerHTML = ''; - - sortedItems.forEach(item => { - const eventCard = createEventCard(item); - elements.eventsList.appendChild(eventCard); - }); -} - -// 创建事件卡片 -function createEventCard(item) { - const card = document.createElement('div'); - card.className = 'event-card'; - - const eventType = EVENT_TYPE_MAP[item.event_type] || EVENT_TYPE_MAP['event']; - - card.innerHTML = ` -
    ${eventType.name}
    -
    ${formatYear(item.year)}
    -
    ${escapeHtml(item.title)}
    -
    ${escapeHtml(item.description)}
    - ${item.link ? `了解更多` : ''} - `; - - return card; -} - -// 格式化年份显示 -function formatYear(year) { - const yearNum = parseInt(year); - if (yearNum < 0) { - return `公元前${Math.abs(yearNum)}年`; - } else if (yearNum < 1000) { - return `公元${yearNum}年`; - } else { - return `${yearNum}年`; - } -} - -// 显示加载状态 -function showLoading(show) { - if (elements.loading) { - elements.loading.style.display = show ? 'block' : 'none'; - } - - if (elements.content) { - elements.content.style.display = show ? 'none' : 'block'; - } -} - -// 显示错误信息 -function showError(message) { - if (elements.content) { - elements.content.innerHTML = ` -
    -

    😔 加载失败

    -

    ${escapeHtml(message)}

    - -
    - `; - elements.content.style.display = 'block'; - } -} - -// HTML 转义 -function escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} - -// 错误处理 -window.addEventListener('error', function(event) { - console.error('页面错误:', event.error); -}); - -// 网络状态监听 -window.addEventListener('online', function() { - console.log('网络已连接'); -}); - -window.addEventListener('offline', function() { - console.log('网络已断开'); - showError('网络连接已断开,请检查网络设置'); -}); - -// 导出全局方法 -window.TodayInHistory = { - loadTodayInHistory, - showError, - showLoading -}; \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/接口集合.json b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/返回接口.json b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/返回接口.json deleted file mode 100755 index 7efaf65b..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/返回接口.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "date": "8-19", - "month": 8, - "day": 19, - "items": [ - { - "title": "罗马帝国开国皇帝奥古斯都逝世", - "year": "14", - "description": "奥古斯都(拉丁文 Augustus的中译,复数型 Augusti)的原意为“神圣的”、“高贵的”,带有宗教与神学式的意味。", - "event_type": "death", - "link": "https://baike.baidu.com/item/%E5%A5%A5%E5%8F%A4%E6%96%AF%E9%83%BD/14291" - }, - { - "title": "近代概率论的奠基者帕斯卡逝世", - "year": "1662", - "description": "布莱士·帕斯卡(Blaise Pascal ,1623-1662)是法国数学家、物理学家、哲学家、散文家。", - "event_type": "death", - "link": "https://baike.baidu.com/item/%E5%B8%83%E8%8E%B1%E5%A3%AB%C2%B7%E5%B8%95%E6%96%AF%E5%8D%A1" - }, - { - "title": "瑞典国王古斯塔夫三世发动政变夺取权力", - "year": "1772", - "description": "古斯塔夫三世(Gustavus III,1746-1792)是瑞典历史上褒贬最多的国王(1771-1792)。阿道夫·弗里德里克国王的儿子和继承者。", - "event_type": "event", - "link": "https://baike.baidu.com/item/%E5%8F%A4%E6%96%AF%E5%A1%94%E5%A4%AB%E4%B8%89%E4%B8%96" - }, - { - "title": "美国飞机设计师奥维尔·莱特诞生", - "year": "1871", - "description": "奥威尔莱特(公元1871~公元1948)。 奥维尔·莱特1871年生于美国俄亥俄州代顿市。上过中学,但实际上未获得毕业文凭。", - "event_type": "birth", - "link": "https://baike.baidu.com/item/%E5%A5%A5%E7%BB%B4%E5%B0%94%C2%B7%E8%8E%B1%E7%89%B9" - }, - { - "title": "法国著名时装设计师、香奈儿品牌创始人加布里埃·香奈儿出生", - "year": "1883", - "description": "香奈儿儿时入读修女院学校学得一手针线活。后来她与许多上流社会男士有过交往。1910年,毅然放弃嫁入豪门做阔太太的她在巴黎开设了一家女装帽子店,从此开创了香奈儿时尚帝国。", - "event_type": "birth", - "link": "https://baike.baidu.com/item/%E5%8A%A0%E5%B8%83%E9%87%8C%E5%9F%83%C2%B7%E9%A6%99%E5%A5%88%E5%84%BF/9480318" - }, - { - "title": "美国宇航员斯托里·马斯格雷夫出生", - "year": "1935", - "description": "斯托里·马斯格雷夫(Franklin Story Musgrave,1935年8月19日-),美国宇航员,拥有医学、数学、文学等六个学位,入选美国国家航空航天局(NASA)科学家宇航员。", - "event_type": "birth", - "link": "https://baike.baidu.com/item/%E6%96%AF%E6%89%98%E9%87%8C%C2%B7%E9%A9%AC%E6%96%AF%E6%A0%BC%E9%9B%B7%E5%A4%AB" - }, - { - "title": "纳粹德国陆军元帅京特·冯·克鲁格畏罪自杀", - "year": "1944", - "description": "汉斯·京特·冯·克卢格(Günther·von·Kluge, 1882年10月30日-1944年8月19日),纳粹德国陆军元帅(1940.7.19),著名军事家、统帅。", - "event_type": "death", - "link": "https://baike.baidu.com/item/%E4%BA%AC%E7%89%B9%C2%B7%E5%86%AF%C2%B7%E5%85%8B%E9%B2%81%E6%A0%BC" - }, - { - "title": "美国第42任总统克林顿出生", - "year": "1946", - "description": "威廉·杰斐逊·克林顿,美国律师、政治家,美国民主党成员,曾任阿肯色州州长和第42任美国总统。克林顿基金会主席 。", - "event_type": "birth", - "link": "https://baike.baidu.com/item/%E5%A8%81%E5%BB%89%C2%B7%E6%9D%B0%E6%96%90%E9%80%8A%C2%B7%E5%85%8B%E6%9E%97%E9%A1%BF" - }, - { - "title": "美国演员马修·派瑞出生", - "year": "1969", - "description": "马修·派瑞(Matthew Perry,1969年8月19日—2023年10月28日),出生于美国马萨诸塞州普利茅斯,美国、加拿大籍男演员、编剧。", - "event_type": "birth", - "link": "https://baike.baidu.com/item/%E9%A9%AC%E4%BF%AE%C2%B7%E6%B4%BE%E7%91%9E" - }, - { - "title": "北回归线标志塔在广州落成", - "year": "1985", - "description": "北回归线标志塔,是标志地理学上北回归线经过地方的建筑物。", - "event_type": "event", - "link": "https://baike.baidu.com/item/%E5%8C%97%E5%9B%9E%E5%BD%92%E7%BA%BF%E6%A0%87%E5%BF%97%E5%A1%94" - }, - { - "title": "“八一九事件”,苏联八月政变", - "year": "1991", - "description": "八一九事件,又称“苏联政变”、“八月政变”,指1991年8月19日-8月21日在苏联发生的一次政变。", - "event_type": "event", - "link": "https://baike.baidu.com/item/%E5%85%AB%E4%B8%80%E4%B9%9D%E4%BA%8B%E4%BB%B6" - }, - { - "title": "量子化学家莱纳斯·卡尔·鲍林逝世", - "year": "1994", - "description": "莱纳斯·卡尔·鲍林(Linus Carl Pauling,1901年2月28日—1994年8月19日),出生于美国俄勒冈州波特兰,化学家、美国国家科学院院士、美国艺术与科学院院士,1954年诺贝尔化学奖获得者。", - "event_type": "death", - "link": "https://baike.baidu.com/item/%E8%8E%B1%E7%BA%B3%E6%96%AF%C2%B7%E5%8D%A1%E5%B0%94%C2%B7%E9%B2%8D%E6%9E%97" - }, - { - "title": "中国三江源自然保护区成立", - "year": "2000", - "description": "青海三江源国家级自然保护区位于青藏高原腹地,青海省南部,地理位置介于东经89°24′~102°23′,北纬31°39′~36°16′之间,青海三江源国家级自然保护区属湿地类型的自然保护区。", - "event_type": "event", - "link": "https://baike.baidu.com/item/%E4%B8%89%E6%B1%9F%E6%BA%90%E8%87%AA%E7%84%B6%E4%BF%9D%E6%8A%A4%E5%8C%BA" - } - ] - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/css/style.css b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/css/style.css deleted file mode 100755 index 9d2c3c38..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/css/style.css +++ /dev/null @@ -1,326 +0,0 @@ -/* 必应每日壁纸 - 淡绿色清新风格样式 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - color: #2d5016; - line-height: 1.6; - overflow-x: hidden; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 2.5rem; - color: #2d5016; - margin-bottom: 10px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - gap: 15px; -} - -.header p { - color: #5a7c65; - font-size: 1.1rem; -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 40px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #e8f5e8; - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 壁纸容器 */ -.wallpaper-container { - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); - margin-bottom: 20px; -} - -/* 壁纸信息 */ -.wallpaper-info { - text-align: center; - margin-bottom: 25px; -} - -.wallpaper-title { - font-size: 1.8rem; - font-weight: 700; - color: #2d5016; - margin-bottom: 10px; -} - -.wallpaper-date { - color: #5a7c65; - font-size: 1rem; - margin-bottom: 15px; -} - -.wallpaper-description { - color: #2d5016; - font-size: 1.1rem; - line-height: 1.6; - max-width: 800px; - margin: 0 auto; -} - -/* 壁纸图片 */ -.wallpaper-image { - position: relative; - border-radius: 15px; - overflow: hidden; - box-shadow: 0 10px 30px rgba(45, 80, 22, 0.15); - margin: 20px 0; -} - -.wallpaper-image img { - width: 100%; - height: auto; - display: block; - transition: transform 0.3s ease; -} - -.wallpaper-image:hover img { - transform: scale(1.02); -} - -/* 下载按钮 */ -.download-section { - text-align: center; - margin-top: 25px; -} - -.download-btn { - background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); - color: white; - border: none; - padding: 15px 30px; - border-radius: 25px; - font-size: 1.1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(129, 199, 132, 0.3); - text-decoration: none; - display: inline-flex; - align-items: center; - gap: 10px; -} - -.download-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(129, 199, 132, 0.4); -} - -.download-btn:active { - transform: translateY(0); -} - -/* 错误提示 */ -.error { - background: #fed7d7; - color: #c53030; - padding: 20px; - border-radius: 15px; - text-align: center; - border: 1px solid #feb2b2; - margin: 20px 0; -} - -/* 版权信息 */ -.copyright { - background: rgba(255, 255, 255, 0.7); - border-radius: 15px; - padding: 20px; - text-align: center; - color: #5a7c65; - font-size: 0.9rem; - margin-top: 20px; -} - -/* 响应式设计 */ - -/* 平板端 */ -@media (max-width: 768px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2rem; - flex-direction: column; - gap: 10px; - } - - .header { - padding: 20px; - } - - .wallpaper-container { - padding: 20px; - } - - .wallpaper-title { - font-size: 1.5rem; - } - - .wallpaper-description { - font-size: 1rem; - } -} - -/* 手机端 */ -@media (max-width: 480px) { - .container { - padding: 10px; - } - - .header { - padding: 15px; - margin-bottom: 20px; - } - - .header h1 { - font-size: 1.8rem; - } - - .wallpaper-container { - padding: 15px; - } - - .wallpaper-title { - font-size: 1.3rem; - } - - .wallpaper-description { - font-size: 0.95rem; - } - - .download-btn { - padding: 12px 25px; - font-size: 1rem; - width: 100%; - justify-content: center; - } - - .copyright { - padding: 15px; - font-size: 0.8rem; - } -} - -/* 大屏幕优化 */ -@media (min-width: 1200px) { - .container { - padding: 40px; - } - - .header { - padding: 40px; - } - - .wallpaper-container { - padding: 40px; - } - - .wallpaper-image { - max-height: 70vh; - overflow: hidden; - } - - .wallpaper-image img { - width: 100%; - height: 100%; - object-fit: cover; - } -} - -/* 特殊效果 */ -.fade-in { - animation: fadeIn 0.6s ease-in; -} - -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 图片加载效果 */ -.wallpaper-image img { - opacity: 0; - transition: opacity 0.3s ease; -} - -.wallpaper-image img.loaded { - opacity: 1; -} - -/* 滚动条样式 */ -::-webkit-scrollbar { - width: 8px; -} - -::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.1); -} - -::-webkit-scrollbar-thumb { - background: rgba(129, 199, 132, 0.5); - border-radius: 4px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(129, 199, 132, 0.7); -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/index.html b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/index.html deleted file mode 100755 index 39adad89..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/index.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - 必应每日壁纸 - - - - - - - - -
    - -
    -

    - 🖼️ - 必应每日壁纸 -

    -

    每天为您呈现精美的必应壁纸,发现世界之美

    -
    - - -
    -
    -

    正在加载今日壁纸...

    -
    - - -
    - -
    -
    - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/js/script.js b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/js/script.js deleted file mode 100755 index 25104e8e..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/js/script.js +++ /dev/null @@ -1,315 +0,0 @@ -// 必应每日壁纸 JavaScript 功能 - -// API配置 -const API = { - endpoints: [], - currentIndex: 0, - params: { - encoding: 'json' - }, - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/bing`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.api.shumengya.top/v2/bing']; - } - }, - // 获取当前接口URL - getCurrentUrl() { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - Object.keys(this.params).forEach(key => { - url.searchParams.append(key, this.params[key]); - }); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } -}; - -// DOM元素 -let elements = {}; - -// 初始化 -document.addEventListener('DOMContentLoaded', function() { - initElements(); - loadWallpaper(); -}); - -// 初始化DOM元素 -function initElements() { - elements = { - container: document.getElementById('wallpaper-content'), - loading: document.getElementById('loading') - }; -} - -// 加载壁纸数据 -async function loadWallpaper() { - try { - showLoading(true); - - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const response = await fetch(url, { - cache: 'no-store', - timeout: 10000 // 10秒超时 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - console.log('API响应数据:', data); - - // 检查数据有效性 - if (data && (data.code === 200 || data.data)) { - console.log(`接口 ${i + 1} 请求成功`); - displayWallpaper(data); - return; - } - - throw new Error(data && data.message ? data.message : '接口返回异常'); - - } catch (error) { - console.warn(`接口 ${i + 1} 失败:`, error.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了,抛出错误 - throw new Error('所有接口都无法访问'); - } - } - - } catch (error) { - console.error('加载壁纸失败:', error); - showError('加载壁纸失败,请稍后重试'); - } finally { - showLoading(false); - } -} - -// 显示壁纸 -function displayWallpaper(data) { - if (!data) { - showError('没有获取到壁纸数据'); - return; - } - - // 提取壁纸信息 - const wallpaperInfo = extractWallpaperInfo(data); - - if (!wallpaperInfo || !wallpaperInfo.imageUrl) { - showError('壁纸图片链接无效'); - return; - } - - // 生成HTML内容 - const html = generateWallpaperHTML(wallpaperInfo); - - // 显示内容 - elements.container.innerHTML = html; - elements.container.classList.add('fade-in'); - - // 绑定图片加载事件 - bindImageEvents(); -} - -// 提取壁纸信息 -function extractWallpaperInfo(data) { - // 根据API响应结构提取信息 - let imageUrl = ''; - let title = '必应每日壁纸'; - let description = ''; - let date = new Date().toLocaleDateString('zh-CN'); - let copyright = ''; - - // 处理新的API响应格式 - if (data.data) { - const wallpaperData = data.data; - title = wallpaperData.title || title; - description = wallpaperData.description || wallpaperData.main_text || ''; - copyright = wallpaperData.copyright || ''; - date = wallpaperData.update_date || date; - - // 提取图片URL,去除反引号 - if (wallpaperData.cover) { - imageUrl = wallpaperData.cover.replace(/`/g, '').trim(); - } - } - // 处理其他可能的API响应格式 - else if (data.url) { - imageUrl = data.url; - } else if (data.image_url) { - imageUrl = data.image_url; - } else if (data.images && data.images.length > 0) { - imageUrl = data.images[0].url || data.images[0].image_url; - title = data.images[0].title || title; - description = data.images[0].description || data.images[0].copyright || ''; - copyright = data.images[0].copyright || ''; - } - - // 如果是相对路径,转换为完整URL - if (imageUrl && imageUrl.startsWith('/')) { - imageUrl = 'https://www.bing.com' + imageUrl; - } - - // 确保图片URL有效 - if (!imageUrl || imageUrl === '') { - console.error('无法提取图片URL,原始数据:', data); - return null; - } - - return { - imageUrl, - title, - description: description || copyright, - date, - copyright - }; -} - -// 生成壁纸HTML -function generateWallpaperHTML(info) { - return ` -
    -
    -

    ${escapeHtml(info.title)}

    -
    ${info.date}
    - ${info.description ? `
    ${escapeHtml(info.description)}
    ` : ''} -
    - -
    - ${escapeHtml(info.title)} -
    - - -
    - - ${info.copyright ? ` - - ` : ''} - `; -} - -// 绑定图片事件 -function bindImageEvents() { - const images = elements.container.querySelectorAll('img'); - - images.forEach(img => { - img.addEventListener('load', function() { - this.classList.add('loaded'); - }); - - img.addEventListener('error', function() { - console.error('图片加载失败:', this.src); - this.parentElement.innerHTML = ` -
    -

    🖼️ 图片加载失败

    -

    请检查网络连接或稍后重试

    -
    - `; - }); - }); -} - -// 显示/隐藏加载状态 -function showLoading(show) { - if (elements.loading) { - elements.loading.style.display = show ? 'block' : 'none'; - } - if (elements.container) { - elements.container.style.display = show ? 'none' : 'block'; - } -} - -// 显示错误信息 -function showError(message) { - if (elements.container) { - elements.container.innerHTML = ` -
    -

    ⚠️ 加载失败

    -

    ${escapeHtml(message)}

    -

    请检查网络连接或稍后重试

    -
    - `; - elements.container.style.display = 'block'; - } -} - -// HTML转义 -function escapeHtml(text) { - if (!text) return ''; - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} - -// 格式化日期 -function formatDate(dateString) { - try { - const date = new Date(dateString); - return date.toLocaleDateString('zh-CN', { - year: 'numeric', - month: 'long', - day: 'numeric' - }); - } catch (error) { - return dateString; - } -} - -// 错误处理 -window.addEventListener('error', function(event) { - console.error('页面错误:', event.error); -}); - -// 网络状态监听 -window.addEventListener('online', function() { - console.log('网络已连接'); -}); - -window.addEventListener('offline', function() { - console.log('网络已断开'); - showError('网络连接已断开,请检查网络设置'); -}); - -// 导出函数供外部调用 -window.BingWallpaper = { - loadWallpaper, - showError, - showLoading -}; \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/接口集合.json b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/返回接口.json b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/返回接口.json deleted file mode 100755 index 122ff1ef..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/返回接口.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "title": "瑟沃格湖,瓦加尔岛,法罗群岛", - "headline": "海洋上方的湖泊", - "description": "大自然自有其奇妙之处,瑟沃格湖(Sørvágsvatn)便是其中最精彩的之一。世界湖泊日是探索法罗群岛(丹麦王国的一个自治行政区)这片视错觉的绝佳时机。这座位于沃格岛上的湖泊也被称为莱蒂斯湖(Leitisvatn),看似漂浮在海平面之上。实际上,它的海拔不到100英尺。索尔瓦格斯湖是法罗群岛最大的湖泊,面积约1.3平方英里,为Bøsdalafossur瀑布Bøsdalafossur提供水源,瀑布的湖水在那里奔腾而下,最终倾泻而入大海。", - "main_text": "该湖位于瓦加尔岛南部,通过Bøsdalafossur瀑布与大西洋相连,形成了壮丽的“悬湖”景观。", - "cover": "https://bing.com/th?id=OHR.FaroeLake_ZH-CN3977660997_1920x1080.jpg", - "cover_4k": "https://bing.com/th?id=OHR.FaroeLake_ZH-CN3977660997_UHD.jpg", - "copyright": "© Anton Petrus/Getty Images", - "update_date": "2025-08-27 13:24:37", - "update_date_at": 1756301077809 - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/css/style.css b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/css/style.css deleted file mode 100755 index 0cf52951..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/css/style.css +++ /dev/null @@ -1,327 +0,0 @@ -/* 每天60s读懂世界 - 清新风格样式 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - color: #2d5016; - line-height: 1.6; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 2.5rem; - color: #2d5016; - margin-bottom: 10px; - font-weight: 700; -} - -.header p { - color: #5a7c65; - font-size: 1.1rem; -} - -/* 控制面板 */ -.controls { - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - padding: 20px; - margin-bottom: 30px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.date-selector { - display: flex; - align-items: center; - gap: 15px; - margin-bottom: 20px; - flex-wrap: wrap; -} - -.date-selector label { - font-weight: 600; - color: #4a5568; -} - -.date-selector input { - padding: 10px 15px; - border: 2px solid #e2e8f0; - border-radius: 10px; - font-size: 1rem; - transition: all 0.3s ease; -} - -.date-selector input:focus { - outline: none; - border-color: #81c784; - box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.1); -} - -.btn { - background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); - color: white; - border: none; - padding: 12px 25px; - border-radius: 10px; - font-size: 1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(129, 199, 132, 0.3); -} - -.btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(129, 199, 132, 0.4); -} - -.btn:active { - transform: translateY(0); -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 40px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #e8f5e8; - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 内容区域 */ -.content { - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.news-header { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 25px; - flex-wrap: wrap; - gap: 15px; -} - -.news-date { - font-size: 1.5rem; - font-weight: 700; - color: #2d5016; -} - -.lunar-date { - color: #5a7c65; - font-size: 1rem; -} - -/* 新闻图片 */ -.news-image { - width: 100%; - max-width: 600px; - height: auto; - border-radius: 15px; - margin: 20px auto; - display: block; - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); -} - -/* 新闻列表 */ -.news-list { - margin: 25px 0; -} - -.news-item { - background: #f1f8e9; - border-left: 4px solid #81c784; - padding: 15px 20px; - margin-bottom: 15px; - border-radius: 0 10px 10px 0; - transition: all 0.3s ease; - position: relative; -} - -.news-item:hover { - background: #e8f5e8; - transform: translateX(5px); - box-shadow: 0 4px 15px rgba(45, 80, 22, 0.1); -} - -.news-item::before { - content: counter(news-counter); - counter-increment: news-counter; - position: absolute; - left: -15px; - top: 50%; - transform: translateY(-50%); - background: #81c784; - color: white; - width: 25px; - height: 25px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-size: 0.8rem; - font-weight: bold; -} - -.news-list { - counter-reset: news-counter; -} - -/* 每日一句 */ -.daily-tip { - background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%); - padding: 20px; - border-radius: 15px; - margin: 25px 0; - text-align: center; - font-style: italic; - font-size: 1.1rem; - color: #744210; - box-shadow: 0 5px 20px rgba(252, 182, 159, 0.3); -} - -/* 错误提示 */ -.error { - background: #fed7d7; - color: #c53030; - padding: 20px; - border-radius: 10px; - text-align: center; - border: 1px solid #feb2b2; -} - -/* 响应式设计 */ - -/* 平板端 */ -@media (max-width: 768px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2rem; - } - - .header { - padding: 20px; - } - - .content { - padding: 20px; - } - - .date-selector { - flex-direction: column; - align-items: stretch; - } - - .news-header { - flex-direction: column; - align-items: flex-start; - } -} - -/* 手机端 */ -@media (max-width: 480px) { - .container { - padding: 10px; - } - - .header { - padding: 15px; - margin-bottom: 20px; - } - - .header h1 { - font-size: 1.8rem; - } - - .controls { - padding: 15px; - } - - .content { - padding: 15px; - } - - .news-item { - padding: 12px 15px; - margin-left: 10px; - } - - .news-item::before { - left: -10px; - width: 20px; - height: 20px; - font-size: 0.7rem; - } - - .daily-tip { - padding: 15px; - font-size: 1rem; - } - - .btn { - width: 100%; - padding: 15px; - } -} - -/* 大屏幕优化 */ -@media (min-width: 1200px) { - .container { - padding: 40px; - } - - .header { - padding: 40px; - } - - .content { - padding: 40px; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/index.html b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/index.html deleted file mode 100755 index 93e57f27..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - 每天60秒读懂世界 | 最新资讯 - - - - - - - - - - - - - -
    - -
    -

    📰 每天60秒读懂世界

    -

    获取最新资讯,了解天下大事

    -
    - - - - -
    - -
    -
    -

    正在加载今日资讯...

    -
    -
    -
    - - -
    -

    Made with ❤️ | 数据来源:每天60秒读懂世界API

    -
    - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/js/script.js b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/js/script.js deleted file mode 100755 index 5e50e87f..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/js/script.js +++ /dev/null @@ -1,305 +0,0 @@ -// 每天60s读懂世界 - JavaScript功能实现 - -const API = { - endpoints: [], - currentIndex: 0, - params: { - encoding: 'json' - }, - localFallback: '返回接口.json', - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/60s`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.api.shumengya.top/v2/60s']; - } - }, - // 获取当前接口URL - getCurrentUrl() { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v)); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } -}; - -class NewsApp { - constructor() { - this.apiUrl = 'https://60s.viki.moe/v2/60s'; - this.init(); - } - - init() { - this.bindEvents(); - this.loadTodayNews(); - } - - bindEvents() { - // 移除了刷新按钮,不需要绑定事件 - } - - formatDate(date) { - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - return `${year}-${month}-${day}`; - } - - showLoading() { - const contentDiv = document.getElementById('content'); - if (contentDiv) { - contentDiv.innerHTML = ` -
    -
    -

    正在获取最新资讯...

    -
    - `; - } - } - - showError(message) { - const contentDiv = document.getElementById('content'); - if (contentDiv) { - contentDiv.innerHTML = ` -
    -

    😔 获取失败

    -

    ${message}

    -
    - `; - } - } - - async loadNews() { - try { - this.showLoading(); - - // 尝试从API获取数据 - let data = await this.fetchFromAPI(); - - // 如果API失败,尝试本地数据 - if (!data) { - data = await this.fetchFromLocal(); - } - - if (!data) { - throw new Error('无法获取数据,请检查网络连接或稍后重试'); - } - - if (data.code !== 200) { - throw new Error(data.message || '获取数据失败'); - } - - this.renderNews(data.data); - - } catch (error) { - console.error('获取新闻失败:', error); - this.showError(error.message || '网络连接失败,请检查网络后重试'); - } - } - - async fetchFromAPI() { - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const resp = await fetch(url, { - cache: 'no-store' - }); - - if (!resp.ok) { - throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); - } - - const data = await resp.json(); - - if (data && data.code === 200) { - console.log(`接口 ${i + 1} 请求成功`); - return data; - } - - throw new Error(data && data.message ? data.message : '接口返回异常'); - - } catch (e) { - console.warn(`接口 ${i + 1} 失败:`, e.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了 - console.warn('所有远程接口都失败,尝试本地数据'); - return null; - } - } - } - - async fetchFromLocal() { - try { - const resp = await fetch(API.localFallback + `?t=${Date.now()}`); - if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`); - const data = await resp.json(); - return data; - } catch (e) { - console.error('读取本地返回接口.json失败:', e); - return null; - } - } - - loadTodayNews() { - this.loadNews(); - } - - renderNews(newsData) { - const contentDiv = document.getElementById('content'); - if (!contentDiv || !newsData) return; - - const { - date, - day_of_week, - lunar_date, - news, - tip, - link - } = newsData; - - let newsListHtml = ''; - if (news && news.length > 0) { - newsListHtml = news.map(item => ` -
    - ${this.escapeHtml(item)} -
    - `).join(''); - } - - // 移除图片显示功能 - - const tipHtml = tip ? ` -
    - 💡 ${this.escapeHtml(tip)} -
    - ` : ''; - - const linkHtml = link ? ` - - ` : ''; - - contentDiv.innerHTML = ` -
    -
    -
    ${this.escapeHtml(date)} ${this.escapeHtml(day_of_week || '')}
    - ${lunar_date ? `
    ${this.escapeHtml(lunar_date)}
    ` : ''} -
    -
    - - ${tipHtml} - -
    -

    📰 今日要闻

    - ${newsListHtml} -
    - - ${linkHtml} - -
    -

    数据来源:每天60秒读懂世界

    -

    更新时间:${newsData.api_updated || '未知'}

    -
    - `; - } - - escapeHtml(text) { - if (typeof text !== 'string') return text; - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; - } -} - -// 页面加载完成后初始化应用 -document.addEventListener('DOMContentLoaded', function() { - window.newsApp = new NewsApp(); -}); - -// 添加一些实用功能 -function copyToClipboard(text) { - navigator.clipboard.writeText(text).then(() => { - showToast('已复制到剪贴板'); - }).catch(() => { - showToast('复制失败,请手动复制'); - }); -} - -function showToast(message) { - // 创建提示框 - const toast = document.createElement('div'); - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: #4a5568; - color: white; - padding: 12px 20px; - border-radius: 8px; - z-index: 1000; - font-size: 14px; - box-shadow: 0 4px 12px rgba(0,0,0,0.3); - animation: slideIn 0.3s ease; - `; - toast.textContent = message; - - // 添加动画样式 - const style = document.createElement('style'); - style.textContent = ` - @keyframes slideIn { - from { transform: translateX(100%); opacity: 0; } - to { transform: translateX(0); opacity: 1; } - } - `; - document.head.appendChild(style); - - document.body.appendChild(toast); - - // 3秒后自动移除 - setTimeout(() => { - toast.remove(); - style.remove(); - }, 3000); -} - -// 添加键盘快捷键支持 -document.addEventListener('keydown', function(e) { - // Ctrl/Cmd + R 刷新数据 - if ((e.ctrlKey || e.metaKey) && e.key === 'r') { - e.preventDefault(); - if (window.newsApp) { - window.newsApp.loadNews(); - } - } -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/接口集合.json b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/返回接口.json b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/返回接口.json deleted file mode 100755 index be3aa159..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/返回接口.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "id": "9aa227e2ba294bb1a95c95fde892eb31", - "title": "《Totally Reliable Delivery Service》 Standard Edition", - "cover": "https://cdn1.epicgames.com/52b90f9a982a404781b189f6a7903226/offer/EGS_TotallyReliableDeliveryService_WereFiveGames_S1-2560x1440-47e6e9562d62705a75ea7b7096d0b8dc.jpg", - "original_price": 52, - "original_price_desc": "¥52.00", - "description": "穿好护腰护具,发动货车,送货的时间到啦!在一个高度互动的沙盒世界中,与最多三位好友一起随意地完成送货。货物已试投,这就是我们靠谱快递(Totally Reliable Delivery Service)的品质保证!", - "seller": "Infogrames LLC", - "is_free_now": true, - "free_start": "2025/08/14 23:00:00", - "free_start_at": 1755183600000, - "free_end": "2025/08/21 23:00:00", - "free_end_at": 1755788400000, - "link": "https://store.epicgames.com/store/zh-CN/p/totally-reliable-delivery-service/home" - }, - { - "id": "8ea3500dc38e4f429702bf889c172d3d", - "title": "Hidden Folks", - "cover": "https://cdn1.epicgames.com/spt-assets/7bfd56b0586348dcb139945d9e59f988/hidden-folks-1b7hh.png", - "original_price": 47, - "original_price_desc": "¥47.00", - "description": "Search for hidden folks in hand-drawn, interactive, miniature landscapes. Unfurl tent flaps, cut through bushes, slam doors, and poke some crocodiles! Rooooaaaarrrr!!!!!", - "seller": "Adriaan de Jongh", - "is_free_now": true, - "free_start": "2025/08/14 23:00:00", - "free_start_at": 1755183600000, - "free_end": "2025/08/21 23:00:00", - "free_end_at": 1755788400000, - "link": "https://store.epicgames.com/store/zh-CN/p/hidden-folks-239d16" - }, - { - "id": "4cbb6c3704d240f19c3dd5f5cb2b0cb4", - "title": "Kamaeru", - "cover": "https://cdn1.epicgames.com/spt-assets/44313cfbb62b4df5801d0c8d541c2624/kamaeru-40asc.png", - "original_price": 62, - "original_price_desc": "¥62.00", - "description": "Foster a sanctuary for frogs and restore the biodiversity of the wetlands in Kamaeru, a cozy frog collecting game, where you take pictures of frogs, play mini-games and decorate your habitat. Hop right to it!", - "seller": "Armor Games Studios", - "is_free_now": false, - "free_start": "2025/08/21 23:00:00", - "free_start_at": 1755788400000, - "free_end": "2025/08/28 23:00:00", - "free_end_at": 1756393200000, - "link": "https://store.epicgames.com/store/zh-CN/p/kamaeru-0c301e" - }, - { - "id": "0d9a533f0e684cc18620a8f408e8e72c", - "title": "Strange Horticulture", - "cover": "https://cdn1.epicgames.com/spt-assets/15e8e3eba65a4763a815d6eae1d763b2/strange-horticulture-offer-2wghv.png", - "original_price": 45, - "original_price_desc": "¥45.00", - "description": "款神秘学解谜游戏,你将扮演当地植物商店的店主,寻找并识别新的植物,悠闲撸猫,与女巫团体交谈,或加入异教。收集各种强大的植物,用它们来影响故事走向,揭开昂德米尔镇的黑暗谜团。", - "seller": "Iceberg Interactive", - "is_free_now": false, - "free_start": "2025/08/21 23:00:00", - "free_start_at": 1755788400000, - "free_end": "2025/08/28 23:00:00", - "free_end_at": 1756393200000, - "link": "https://store.epicgames.com/store/zh-CN/p/strange-horticulture-360e80" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/css/style.css b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/css/style.css deleted file mode 100755 index 1a296e45..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/css/style.css +++ /dev/null @@ -1,474 +0,0 @@ -/* 每日国际汇率 - 淡绿色清新风格样式 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - color: #2d5016; - line-height: 1.6; - overflow-x: hidden; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 2.5rem; - color: #2d5016; - margin-bottom: 10px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - gap: 15px; -} - -.header p { - color: #5a7c65; - font-size: 1.1rem; -} - -/* 货币选择器 */ -.currency-selector { - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - padding: 20px; - margin-bottom: 20px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); - text-align: center; -} - -.currency-selector label { - display: block; - margin-bottom: 10px; - font-weight: 600; - color: #2d5016; -} - -.currency-selector select { - padding: 12px 20px; - border: 2px solid #c8e6c9; - border-radius: 25px; - background: white; - color: #2d5016; - font-size: 1rem; - min-width: 200px; - cursor: pointer; - transition: all 0.3s ease; -} - -.currency-selector select:focus { - outline: none; - border-color: #81c784; - box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.2); -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 40px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #e8f5e8; - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 汇率信息容器 */ -.exchange-info { - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 25px; - margin-bottom: 20px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.base-currency { - text-align: center; - margin-bottom: 20px; -} - -.base-currency h2 { - font-size: 1.8rem; - color: #2d5016; - margin-bottom: 10px; -} - -.update-time { - color: #5a7c65; - font-size: 0.9rem; -} - -/* 汇率网格 */ -.rates-grid { - display: grid; - grid-template-columns: repeat(8, 1fr); - gap: 10px; - margin-top: 20px; -} - -.rate-card { - background: rgba(255, 255, 255, 0.9); - border-radius: 10px; - padding: 12px; - box-shadow: 0 3px 10px rgba(45, 80, 22, 0.06); - transition: all 0.3s ease; - border: 1px solid rgba(200, 230, 201, 0.5); - text-align: center; -} - -.rate-card:hover { - transform: translateY(-1px); - box-shadow: 0 4px 15px rgba(45, 80, 22, 0.1); - border-color: #81c784; -} - -.currency-code { - font-size: 1rem; - font-weight: 700; - color: #2d5016; - margin-bottom: 6px; - display: flex; - align-items: center; - justify-content: center; - gap: 6px; -} - -.currency-flag { - font-size: 1.2rem; -} - -.exchange-rate { - font-size: 1.1rem; - font-weight: 600; - color: #388e3c; - margin-bottom: 4px; -} - -.currency-name { - color: #5a7c65; - font-size: 0.8rem; - line-height: 1.2; -} - -/* 搜索框 */ -.search-container { - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - padding: 20px; - margin-bottom: 20px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.search-input { - width: 100%; - padding: 12px 20px; - border: 2px solid #c8e6c9; - border-radius: 25px; - background: white; - color: #2d5016; - font-size: 1rem; - transition: all 0.3s ease; -} - -.search-input:focus { - outline: none; - border-color: #81c784; - box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.2); -} - -.search-input::placeholder { - color: #81c784; -} - -/* 错误提示 */ -.error { - background: #fed7d7; - color: #c53030; - padding: 20px; - border-radius: 15px; - text-align: center; - border: 1px solid #feb2b2; - margin: 20px 0; -} - -/* 统计信息 */ -.stats { - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - padding: 20px; - margin-bottom: 20px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); - text-align: center; -} - -.stats-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: 20px; - margin-top: 15px; -} - -.stat-item { - padding: 15px; - background: rgba(129, 199, 132, 0.1); - border-radius: 10px; -} - -.stat-number { - font-size: 1.5rem; - font-weight: 700; - color: #2d5016; -} - -.stat-label { - color: #5a7c65; - font-size: 0.9rem; - margin-top: 5px; -} - -/* 响应式设计 */ - -/* 平板端 */ -@media (max-width: 768px) and (min-width: 481px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2rem; - flex-direction: column; - gap: 10px; - } - - .header { - padding: 20px; - } - - .rates-grid { - grid-template-columns: repeat(6, 1fr); - gap: 8px; - } - - .rate-card { - padding: 10px; - } - - .currency-selector select { - min-width: 180px; - } -} - -/* 手机端 */ -@media (max-width: 480px) { - body { - overflow-x: hidden; - } - - .container { - padding: 8px; - margin: 8px; - max-width: calc(100vw - 16px); - width: calc(100vw - 16px); - } - - .header { - padding: 12px; - margin-bottom: 16px; - } - - .header h1 { - font-size: 1.6rem; - flex-direction: column; - gap: 8px; - } - - .header p { - font-size: 0.9rem; - } - - .rates-grid { - grid-template-columns: repeat(2, 1fr); - gap: 8px; - width: 100%; - overflow: hidden; - } - - .rate-card { - padding: 10px 6px; - border-radius: 8px; - min-width: 0; - width: 100%; - } - - .currency-code { - font-size: 0.8rem; - margin-bottom: 4px; - gap: 3px; - word-break: break-all; - } - - .currency-flag { - font-size: 0.9rem; - } - - .exchange-rate { - font-size: 0.85rem; - margin-bottom: 3px; - word-break: break-all; - } - - .currency-name { - font-size: 0.65rem; - line-height: 1.1; - word-break: break-all; - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - } - - .currency-selector { - padding: 12px; - margin-bottom: 16px; - } - - .currency-selector select { - width: 100%; - max-width: 100%; - padding: 10px 15px; - font-size: 0.9rem; - } - - .search-container { - padding: 12px; - margin-bottom: 16px; - } - - .search-input { - padding: 10px 15px; - font-size: 0.9rem; - width: 100%; - } - - .stats { - padding: 15px; - margin-bottom: 16px; - } - - .stats-grid { - grid-template-columns: repeat(2, 1fr); - gap: 10px; - } - - .stat-item { - padding: 12px; - } - - .stat-number { - font-size: 1.3rem; - } - - .stat-label { - font-size: 0.8rem; - } - - .exchange-info { - padding: 15px; - margin-bottom: 16px; - } - - .base-currency h2 { - font-size: 1.5rem; - } - - .update-time { - font-size: 0.8rem; - } -} - -/* 大屏幕优化 */ -@media (min-width: 1200px) { - .container { - padding: 40px; - } - - .header { - padding: 40px; - } -} - -/* 特殊效果 */ -.fade-in { - animation: fadeIn 0.6s ease-in; -} - -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 滚动条样式 */ -::-webkit-scrollbar { - width: 8px; -} - -::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.1); -} - -::-webkit-scrollbar-thumb { - background: rgba(129, 199, 132, 0.5); - border-radius: 4px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(129, 199, 132, 0.7); -} - -/* 隐藏类 */ -.hidden { - display: none; -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/index.html b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/index.html deleted file mode 100755 index d1bc7eb1..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/index.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - 每日国际汇率 - - - - - - - - -
    - -
    -

    - 💱 - 每日国际汇率 -

    -

    实时获取全球货币汇率信息,助您掌握汇率动态

    -
    - - -
    - - -
    - - -
    - -
    - - -
    -
    -

    正在加载汇率数据...

    -
    - - -
    - -
    -
    -

    基础货币

    -
    更新时间: --
    -
    - - -
    -

    汇率统计

    -
    -
    -
    --
    -
    货币总数
    -
    -
    -
    --
    -
    最后更新
    -
    -
    -
    - - -
    - -
    -
    -
    -
    - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/js/script.js b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/js/script.js deleted file mode 100755 index f815bd54..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/js/script.js +++ /dev/null @@ -1,520 +0,0 @@ -// 每日国际汇率 JavaScript 功能 - -// API配置 -const API = { - endpoints: [], - currentIndex: 0, - defaultCurrency: 'CNY', - localFallback: '返回接口.json', - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/exchange_rate`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.api.shumengya.top/v2/exchange_rate']; - } - }, - // 获取当前接口URL - getCurrentUrl(currency) { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - url.searchParams.append('currency', currency); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } -}; - -// 常用货币列表 -const POPULAR_CURRENCIES = [ - { code: 'CNY', name: '人民币', flag: '🇨🇳' }, - { code: 'USD', name: '美元', flag: '🇺🇸' }, - { code: 'EUR', name: '欧元', flag: '🇪🇺' }, - { code: 'JPY', name: '日元', flag: '🇯🇵' }, - { code: 'GBP', name: '英镑', flag: '🇬🇧' }, - { code: 'AUD', name: '澳元', flag: '🇦🇺' }, - { code: 'CAD', name: '加元', flag: '🇨🇦' }, - { code: 'CHF', name: '瑞士法郎', flag: '🇨🇭' }, - { code: 'HKD', name: '港币', flag: '🇭🇰' }, - { code: 'SGD', name: '新加坡元', flag: '🇸🇬' }, - { code: 'KRW', name: '韩元', flag: '🇰🇷' }, - { code: 'THB', name: '泰铢', flag: '🇹🇭' } -]; - -// 货币优先级排序 - 经济发达、交易频繁的国家货币优先 -const CURRENCY_PRIORITY = { - // 第一梯队:全球主要储备货币和交易货币 - 'USD': 1, // 美元 - 全球储备货币 - 'EUR': 2, // 欧元 - 欧盟统一货币 - 'JPY': 3, // 日元 - 亚洲主要货币 - 'GBP': 4, // 英镑 - 传统储备货币 - 'CNY': 5, // 人民币 - 中国货币 - - // 第二梯队:发达国家货币 - 'CHF': 10, // 瑞士法郎 - 避险货币 - 'CAD': 11, // 加拿大元 - 'AUD': 12, // 澳大利亚元 - 'NZD': 13, // 新西兰元 - 'SEK': 14, // 瑞典克朗 - 'NOK': 15, // 挪威克朗 - 'DKK': 16, // 丹麦克朗 - - // 第三梯队:亚洲发达经济体 - 'HKD': 20, // 港币 - 'SGD': 21, // 新加坡元 - 'KRW': 22, // 韩元 - 'TWD': 23, // 新台币 - - // 第四梯队:重要新兴市场货币 - 'RUB': 30, // 俄罗斯卢布 - 'INR': 31, // 印度卢比 - 'BRL': 32, // 巴西雷亚尔 - 'MXN': 33, // 墨西哥比索 - 'ZAR': 34, // 南非兰特 - 'TRY': 35, // 土耳其里拉 - - // 第五梯队:亚洲重要货币 - 'THB': 40, // 泰铢 - 'MYR': 41, // 马来西亚林吉特 - 'IDR': 42, // 印尼盾 - 'PHP': 43, // 菲律宾比索 - 'VND': 44, // 越南盾 - - // 第六梯队:中东石油国家货币 - 'SAR': 50, // 沙特里亚尔 - 'AED': 51, // 阿联酋迪拉姆 - 'QAR': 52, // 卡塔尔里亚尔 - 'KWD': 53, // 科威特第纳尔 - - // 第七梯队:欧洲其他货币 - 'PLN': 60, // 波兰兹罗提 - 'CZK': 61, // 捷克克朗 - 'HUF': 62, // 匈牙利福林 - 'RON': 63, // 罗马尼亚列伊 - 'BGN': 64, // 保加利亚列弗 - 'HRK': 65, // 克罗地亚库纳 - - // 第八梯队:拉美货币 - 'ARS': 70, // 阿根廷比索 - 'CLP': 71, // 智利比索 - 'COP': 72, // 哥伦比亚比索 - 'PEN': 73, // 秘鲁索尔 - 'UYU': 74, // 乌拉圭比索 - - // 其他货币默认优先级为 999 -}; - -// 货币名称映射 -const CURRENCY_NAMES = { - 'CNY': '人民币', 'USD': '美元', 'EUR': '欧元', 'JPY': '日元', 'GBP': '英镑', - 'AUD': '澳元', 'CAD': '加元', 'CHF': '瑞士法郎', 'HKD': '港币', 'SGD': '新加坡元', - 'KRW': '韩元', 'THB': '泰铢', 'AED': '阿联酋迪拉姆', 'AFN': '阿富汗尼', - 'ALL': '阿尔巴尼亚列克', 'AMD': '亚美尼亚德拉姆', 'ANG': '荷属安的列斯盾', - 'AOA': '安哥拉宽扎', 'ARS': '阿根廷比索', 'AWG': '阿鲁巴弗罗林', - 'AZN': '阿塞拜疆马纳特', 'BAM': '波黑马克', 'BBD': '巴巴多斯元', - 'BDT': '孟加拉塔卡', 'BGN': '保加利亚列弗', 'BHD': '巴林第纳尔', - 'BIF': '布隆迪法郎', 'BMD': '百慕大元', 'BND': '文莱元', 'BOB': '玻利维亚诺', - 'BRL': '巴西雷亚尔', 'BSD': '巴哈马元', 'BTN': '不丹努尔特鲁姆', - 'BWP': '博茨瓦纳普拉', 'BYN': '白俄罗斯卢布', 'BZD': '伯利兹元', - 'CDF': '刚果法郎', 'CLP': '智利比索', 'COP': '哥伦比亚比索', 'CRC': '哥斯达黎加科朗', - 'CUP': '古巴比索', 'CVE': '佛得角埃斯库多', 'CZK': '捷克克朗', 'DJF': '吉布提法郎', - 'DKK': '丹麦克朗', 'DOP': '多米尼加比索', 'DZD': '阿尔及利亚第纳尔', 'EGP': '埃及镑', - 'ERN': '厄立特里亚纳克法', 'ETB': '埃塞俄比亚比尔', 'FJD': '斐济元', 'FKP': '福克兰群岛镑', - 'FOK': '法罗群岛克朗', 'GEL': '格鲁吉亚拉里', 'GGP': '根西岛镑', 'GHS': '加纳塞地', - 'GIP': '直布罗陀镑', 'GMD': '冈比亚达拉西', 'GNF': '几内亚法郎', 'GTQ': '危地马拉格查尔', - 'GYD': '圭亚那元', 'HNL': '洪都拉斯伦皮拉', 'HRK': '克罗地亚库纳', 'HTG': '海地古德', - 'HUF': '匈牙利福林', 'IDR': '印尼盾', 'ILS': '以色列新谢克尔', 'IMP': '马恩岛镑', - 'INR': '印度卢比', 'IQD': '伊拉克第纳尔', 'IRR': '伊朗里亚尔', 'ISK': '冰岛克朗', - 'JEP': '泽西岛镑', 'JMD': '牙买加元', 'JOD': '约旦第纳尔', 'KES': '肯尼亚先令', - 'KGS': '吉尔吉斯斯坦索姆', 'KHR': '柬埔寨瑞尔', 'KID': '基里巴斯元', 'KMF': '科摩罗法郎', - 'KWD': '科威特第纳尔', 'KYD': '开曼群岛元', 'KZT': '哈萨克斯坦坚戈', 'LAK': '老挝基普', - 'LBP': '黎巴嫩镑', 'LKR': '斯里兰卡卢比', 'LRD': '利比里亚元', 'LSL': '莱索托洛蒂', - 'LYD': '利比亚第纳尔', 'MAD': '摩洛哥迪拉姆', 'MDL': '摩尔多瓦列伊', 'MGA': '马达加斯加阿里亚里', - 'MKD': '北马其顿第纳尔', 'MMK': '缅甸缅元', 'MNT': '蒙古图格里克', 'MOP': '澳门帕塔卡', - 'MRU': '毛里塔尼亚乌吉亚', 'MUR': '毛里求斯卢比', 'MVR': '马尔代夫拉菲亚', 'MWK': '马拉维克瓦查', - 'MXN': '墨西哥比索', 'MYR': '马来西亚林吉特', 'MZN': '莫桑比克梅蒂卡尔', 'NAD': '纳米比亚元', - 'NGN': '尼日利亚奈拉', 'NIO': '尼加拉瓜科多巴', 'NOK': '挪威克朗', 'NPR': '尼泊尔卢比', - 'NZD': '新西兰元', 'OMR': '阿曼里亚尔', 'PAB': '巴拿马巴波亚', 'PEN': '秘鲁索尔', - 'PGK': '巴布亚新几内亚基那', 'PHP': '菲律宾比索', 'PKR': '巴基斯坦卢比', 'PLN': '波兰兹罗提', - 'PYG': '巴拉圭瓜拉尼', 'QAR': '卡塔尔里亚尔', 'RON': '罗马尼亚列伊', 'RSD': '塞尔维亚第纳尔', - 'RUB': '俄罗斯卢布', 'RWF': '卢旺达法郎', 'SAR': '沙特里亚尔', 'SBD': '所罗门群岛元', - 'SCR': '塞舌尔卢比', 'SDG': '苏丹镑', 'SEK': '瑞典克朗', 'SHP': '圣赫勒拿镑', - 'SLE': '塞拉利昂利昂', 'SLL': '塞拉利昂利昂(旧)', 'SOS': '索马里先令', 'SRD': '苏里南元', - 'SSP': '南苏丹镑', 'STN': '圣多美和普林西比多布拉', 'SYP': '叙利亚镑', 'SZL': '斯威士兰里兰吉尼', - 'TJS': '塔吉克斯坦索莫尼', 'TMT': '土库曼斯坦马纳特', 'TND': '突尼斯第纳尔', 'TOP': '汤加潘加', - 'TRY': '土耳其里拉', 'TTD': '特立尼达和多巴哥元', 'TVD': '图瓦卢元', 'TWD': '新台币', - 'TZS': '坦桑尼亚先令', 'UAH': '乌克兰格里夫纳', 'UGX': '乌干达先令', 'UYU': '乌拉圭比索', - 'UZS': '乌兹别克斯坦苏姆', 'VES': '委内瑞拉玻利瓦尔', 'VND': '越南盾', 'VUV': '瓦努阿图瓦图', - 'WST': '萨摩亚塔拉', 'XAF': '中非法郎', 'XCD': '东加勒比元', 'XCG': '加勒比盾', - 'XDR': '特别提款权', 'XOF': '西非法郎', 'XPF': '太平洋法郎', 'YER': '也门里亚尔', - 'ZAR': '南非兰特', 'ZMW': '赞比亚克瓦查', 'ZWL': '津巴布韦元' -}; - -// 货币旗帜映射 -const CURRENCY_FLAGS = { - 'CNY': '🇨🇳', 'USD': '🇺🇸', 'EUR': '🇪🇺', 'JPY': '🇯🇵', 'GBP': '🇬🇧', - 'AUD': '🇦🇺', 'CAD': '🇨🇦', 'CHF': '🇨🇭', 'HKD': '🇭🇰', 'SGD': '🇸🇬', - 'KRW': '🇰🇷', 'THB': '🇹🇭', 'AED': '🇦🇪', 'AFN': '🇦🇫', 'ALL': '🇦🇱', - 'AMD': '🇦🇲', 'ANG': '🇳🇱', 'AOA': '🇦🇴', 'ARS': '🇦🇷', 'AWG': '🇦🇼', - 'AZN': '🇦🇿', 'BAM': '🇧🇦', 'BBD': '🇧🇧', 'BDT': '🇧🇩', 'BGN': '🇧🇬', - 'BHD': '🇧🇭', 'BIF': '🇧🇮', 'BMD': '🇧🇲', 'BND': '🇧🇳', 'BOB': '🇧🇴', - 'BRL': '🇧🇷', 'BSD': '🇧🇸', 'BTN': '🇧🇹', 'BWP': '🇧🇼', 'BYN': '🇧🇾', - 'BZD': '🇧🇿', 'CDF': '🇨🇩', 'CLP': '🇨🇱', 'COP': '🇨🇴', 'CRC': '🇨🇷', - 'CUP': '🇨🇺', 'CVE': '🇨🇻', 'CZK': '🇨🇿', 'DJF': '🇩🇯', 'DKK': '🇩🇰', - 'DOP': '🇩🇴', 'DZD': '🇩🇿', 'EGP': '🇪🇬', 'ERN': '🇪🇷', 'ETB': '🇪🇹', - 'FJD': '🇫🇯', 'FKP': '🇫🇰', 'FOK': '🇫🇴', 'GEL': '🇬🇪', 'GGP': '🇬🇬', - 'GHS': '🇬🇭', 'GIP': '🇬🇮', 'GMD': '🇬🇲', 'GNF': '🇬🇳', 'GTQ': '🇬🇹', - 'GYD': '🇬🇾', 'HNL': '🇭🇳', 'HRK': '🇭🇷', 'HTG': '🇭🇹', 'HUF': '🇭🇺', - 'IDR': '🇮🇩', 'ILS': '🇮🇱', 'IMP': '🇮🇲', 'INR': '🇮🇳', 'IQD': '🇮🇶', - 'IRR': '🇮🇷', 'ISK': '🇮🇸', 'JEP': '🇯🇪', 'JMD': '🇯🇲', 'JOD': '🇯🇴', - 'KES': '🇰🇪', 'KGS': '🇰🇬', 'KHR': '🇰🇭', 'KID': '🇰🇮', 'KMF': '🇰🇲', - 'KWD': '🇰🇼', 'KYD': '🇰🇾', 'KZT': '🇰🇿', 'LAK': '🇱🇦', 'LBP': '🇱🇧', - 'LKR': '🇱🇰', 'LRD': '🇱🇷', 'LSL': '🇱🇸', 'LYD': '🇱🇾', 'MAD': '🇲🇦', - 'MDL': '🇲🇩', 'MGA': '🇲🇬', 'MKD': '🇲🇰', 'MMK': '🇲🇲', 'MNT': '🇲🇳', - 'MOP': '🇲🇴', 'MRU': '🇲🇷', 'MUR': '🇲🇺', 'MVR': '🇲🇻', 'MWK': '🇲🇼', - 'MXN': '🇲🇽', 'MYR': '🇲🇾', 'MZN': '🇲🇿', 'NAD': '🇳🇦', 'NGN': '🇳🇬', - 'NIO': '🇳🇮', 'NOK': '🇳🇴', 'NPR': '🇳🇵', 'NZD': '🇳🇿', 'OMR': '🇴🇲', - 'PAB': '🇵🇦', 'PEN': '🇵🇪', 'PGK': '🇵🇬', 'PHP': '🇵🇭', 'PKR': '🇵🇰', - 'PLN': '🇵🇱', 'PYG': '🇵🇾', 'QAR': '🇶🇦', 'RON': '🇷🇴', 'RSD': '🇷🇸', - 'RUB': '🇷🇺', 'RWF': '🇷🇼', 'SAR': '🇸🇦', 'SBD': '🇸🇧', 'SCR': '🇸🇨', - 'SDG': '🇸🇩', 'SEK': '🇸🇪', 'SHP': '🇸🇭', 'SLE': '🇸🇱', 'SLL': '🇸🇱', - 'SOS': '🇸🇴', 'SRD': '🇸🇷', 'SSP': '🇸🇸', 'STN': '🇸🇹', 'SYP': '🇸🇾', - 'SZL': '🇸🇿', 'TJS': '🇹🇯', 'TMT': '🇹🇲', 'TND': '🇹🇳', 'TOP': '🇹🇴', - 'TRY': '🇹🇷', 'TTD': '🇹🇹', 'TVD': '🇹🇻', 'TWD': '🇹🇼', 'TZS': '🇹🇿', - 'UAH': '🇺🇦', 'UGX': '🇺🇬', 'UYU': '🇺🇾', 'UZS': '🇺🇿', 'VES': '🇻🇪', - 'VND': '🇻🇳', 'VUV': '🇻🇺', 'WST': '🇼🇸', 'XAF': '🌍', 'XCD': '🏝️', - 'XCG': '🏝️', 'XDR': '🌐', 'XOF': '🌍', 'XPF': '🌊', 'YER': '🇾🇪', - 'ZAR': '🇿🇦', 'ZMW': '🇿🇲', 'ZWL': '🇿🇼' -}; - -// DOM元素 -let elements = {}; -let currentRates = []; -let filteredRates = []; - -// 初始化 -document.addEventListener('DOMContentLoaded', function() { - initElements(); - initCurrencySelector(); - bindEvents(); - loadExchangeRates(); -}); - -// 初始化DOM元素 -function initElements() { - elements = { - currencySelect: document.getElementById('currency-select'), - searchInput: document.getElementById('search-input'), - loading: document.getElementById('loading'), - content: document.getElementById('exchange-content'), - baseCurrency: document.getElementById('base-currency'), - updateTime: document.getElementById('update-time'), - ratesGrid: document.getElementById('rates-grid'), - totalCurrencies: document.getElementById('total-currencies'), - lastUpdate: document.getElementById('last-update') - }; -} - -// 初始化货币选择器 -function initCurrencySelector() { - if (!elements.currencySelect) return; - - // 添加常用货币选项 - POPULAR_CURRENCIES.forEach(currency => { - const option = document.createElement('option'); - option.value = currency.code; - option.textContent = `${currency.flag} ${currency.code} - ${currency.name}`; - if (currency.code === API.defaultCurrency) { - option.selected = true; - } - elements.currencySelect.appendChild(option); - }); -} - -// 绑定事件 -function bindEvents() { - // 货币选择变化 - if (elements.currencySelect) { - elements.currencySelect.addEventListener('change', function() { - loadExchangeRates(this.value); - }); - } - - // 搜索功能 - if (elements.searchInput) { - elements.searchInput.addEventListener('input', function() { - filterRates(this.value); - }); - } -} - -// 加载汇率数据 -async function loadExchangeRates(currency = API.defaultCurrency) { - try { - showLoading(true); - - // 尝试从API获取数据 - const data = await fetchFromAPI(currency); - - if (data && data.code === 200 && data.data) { - currentRates = data.data.rates || []; - displayExchangeRates(data.data); - } else { - // 尝试从本地获取数据 - const localData = await fetchFromLocal(); - if (localData && localData.code === 200 && localData.data) { - currentRates = localData.data.rates || []; - displayExchangeRates(localData.data); - showError('使用本地数据,可能不是最新汇率'); - } else { - throw new Error('无法获取汇率数据'); - } - } - - } catch (error) { - console.error('加载汇率失败:', error); - showError('加载汇率数据失败,请稍后重试'); - } finally { - showLoading(false); - } -} - -// 从API获取数据 -async function fetchFromAPI(currency) { - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(currency); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const response = await fetch(url, { - cache: 'no-store' - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - if (data && data.code === 200) { - console.log(`接口 ${i + 1} 请求成功`); - return data; - } - - throw new Error(data && data.message ? data.message : '接口返回异常'); - - } catch (e) { - console.warn(`接口 ${i + 1} 失败:`, e.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了 - console.warn('所有远程接口都失败,尝试本地数据'); - return null; - } - } -} - -// 从本地获取数据 -async function fetchFromLocal() { - try { - const response = await fetch(API.localFallback + `?t=${Date.now()}`); - if (!response.ok) throw new Error(`本地文件HTTP ${response.status}`); - const data = await response.json(); - return data; - } catch (e) { - console.error('读取本地返回接口.json失败:', e); - return null; - } -} - -// 显示汇率数据 -function displayExchangeRates(data) { - if (!data || !data.rates) { - showError('没有获取到汇率数据'); - return; - } - - // 更新基础货币信息 - if (elements.baseCurrency) { - const baseCurrencyName = CURRENCY_NAMES[data.base_code] || data.base_code; - const baseCurrencyFlag = CURRENCY_FLAGS[data.base_code] || '💱'; - elements.baseCurrency.textContent = `${baseCurrencyFlag} ${data.base_code} - ${baseCurrencyName}`; - } - - // 更新时间信息 - if (elements.updateTime && data.updated) { - elements.updateTime.textContent = `更新时间: ${data.updated}`; - } - - // 更新统计信息 - updateStats(data); - - // 显示汇率列表 - filteredRates = data.rates; - renderRates(filteredRates); - - // 显示内容区域 - if (elements.content) { - elements.content.classList.add('fade-in'); - elements.content.style.display = 'block'; - } -} - -// 更新统计信息 -function updateStats(data) { - if (elements.totalCurrencies) { - elements.totalCurrencies.textContent = data.rates ? data.rates.length : 0; - } - - if (elements.lastUpdate && data.updated) { - elements.lastUpdate.textContent = data.updated; - } -} - -// 渲染汇率列表 -function renderRates(rates) { - if (!elements.ratesGrid || !rates) return; - - // 按优先级排序货币 - const sortedRates = [...rates].sort((a, b) => { - const priorityA = CURRENCY_PRIORITY[a.currency] || 999; - const priorityB = CURRENCY_PRIORITY[b.currency] || 999; - - // 优先级相同时按货币代码字母顺序排序 - if (priorityA === priorityB) { - return a.currency.localeCompare(b.currency); - } - - return priorityA - priorityB; - }); - - elements.ratesGrid.innerHTML = ''; - - sortedRates.forEach(rate => { - const rateCard = createRateCard(rate); - elements.ratesGrid.appendChild(rateCard); - }); -} - -// 创建汇率卡片 -function createRateCard(rate) { - const card = document.createElement('div'); - card.className = 'rate-card'; - - const currencyName = CURRENCY_NAMES[rate.currency] || rate.currency; - const currencyFlag = CURRENCY_FLAGS[rate.currency] || '💱'; - - card.innerHTML = ` -
    - ${currencyFlag} - ${rate.currency} -
    -
    ${formatRate(rate.rate)}
    -
    ${currencyName}
    - `; - - return card; -} - -// 格式化汇率 -function formatRate(rate) { - if (rate >= 1) { - return rate.toFixed(4); - } else if (rate >= 0.01) { - return rate.toFixed(6); - } else { - return rate.toFixed(8); - } -} - -// 过滤汇率数据 -function filterRates(searchTerm) { - if (!searchTerm.trim()) { - renderRates(currentRates); - return; - } - - const filtered = currentRates.filter(rate => { - const currencyName = CURRENCY_NAMES[rate.currency] || rate.currency; - return rate.currency.toLowerCase().includes(searchTerm.toLowerCase()) || - currencyName.toLowerCase().includes(searchTerm.toLowerCase()); - }); - - renderRates(filtered); -} - -// 显示/隐藏加载状态 -function showLoading(show) { - if (elements.loading) { - elements.loading.style.display = show ? 'block' : 'none'; - } - if (elements.content) { - elements.content.style.display = show ? 'none' : 'block'; - } -} - -// 显示错误信息 -function showError(message) { - if (elements.content) { - elements.content.innerHTML = ` -
    -

    ⚠️ 加载失败

    -

    ${escapeHtml(message)}

    -

    请检查网络连接或稍后重试

    -
    - `; - elements.content.style.display = 'block'; - } -} - -// HTML转义 -function escapeHtml(text) { - if (!text) return ''; - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} - -// 错误处理 -window.addEventListener('error', function(event) { - console.error('页面错误:', event.error); -}); - -// 网络状态监听 -window.addEventListener('online', function() { - console.log('网络已连接'); -}); - -window.addEventListener('offline', function() { - console.log('网络已断开'); - showError('网络连接已断开,请检查网络设置'); -}); - -// 导出函数供外部调用 -window.ExchangeRate = { - loadExchangeRates, - showError, - showLoading -}; \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/接口集合.json b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/返回接口.json b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/返回接口.json deleted file mode 100755 index b376d9c2..00000000 --- a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/返回接口.json +++ /dev/null @@ -1 +0,0 @@ -{"code":200,"message":"获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841","data":{"base_code":"CNY","updated":"2025/08/19 08:02:31","updated_at":1755561751000,"next_updated":"2025/08/20 08:11:41","next_updated_at":1755648701000,"rates":[{"currency":"CNY","rate":1},{"currency":"AED","rate":0.511124},{"currency":"AFN","rate":9.517171},{"currency":"ALL","rate":11.591448},{"currency":"AMD","rate":53.380737},{"currency":"ANG","rate":0.249125},{"currency":"AOA","rate":130.082117},{"currency":"ARS","rate":180.766035},{"currency":"AUD","rate":0.214039},{"currency":"AWG","rate":0.249125},{"currency":"AZN","rate":0.236907},{"currency":"BAM","rate":0.233194},{"currency":"BBD","rate":0.278352},{"currency":"BDT","rate":16.911823},{"currency":"BGN","rate":0.233216},{"currency":"BHD","rate":0.05233},{"currency":"BIF","rate":416.872549},{"currency":"BMD","rate":0.139176},{"currency":"BND","rate":0.178681},{"currency":"BOB","rate":0.962893},{"currency":"BRL","rate":0.752907},{"currency":"BSD","rate":0.139176},{"currency":"BTN","rate":12.167157},{"currency":"BWP","rate":1.952087},{"currency":"BYN","rate":0.44452},{"currency":"BZD","rate":0.278352},{"currency":"CAD","rate":0.19212},{"currency":"CDF","rate":404.961905},{"currency":"CHF","rate":0.112314},{"currency":"CLP","rate":134.245001},{"currency":"COP","rate":560.180139},{"currency":"CRC","rate":70.415535},{"currency":"CUP","rate":3.340225},{"currency":"CVE","rate":13.146924},{"currency":"CZK","rate":2.918414},{"currency":"DJF","rate":24.734508},{"currency":"DKK","rate":0.889716},{"currency":"DOP","rate":8.582359},{"currency":"DZD","rate":18.079862},{"currency":"EGP","rate":6.734271},{"currency":"ERN","rate":2.087641},{"currency":"ETB","rate":19.722171},{"currency":"EUR","rate":0.119223},{"currency":"FJD","rate":0.314391},{"currency":"FKP","rate":0.102914},{"currency":"FOK","rate":0.889734},{"currency":"GBP","rate":0.102909},{"currency":"GEL","rate":0.375537},{"currency":"GGP","rate":0.102914},{"currency":"GHS","rate":1.578239},{"currency":"GIP","rate":0.102914},{"currency":"GMD","rate":10.138575},{"currency":"GNF","rate":1210.235138},{"currency":"GTQ","rate":1.068254},{"currency":"GYD","rate":29.143934},{"currency":"HKD","rate":1.088795},{"currency":"HNL","rate":3.652528},{"currency":"HRK","rate":0.89834},{"currency":"HTG","rate":18.225889},{"currency":"HUF","rate":47.111579},{"currency":"IDR","rate":2251.38752},{"currency":"ILS","rate":0.471627},{"currency":"IMP","rate":0.102914},{"currency":"INR","rate":12.167163},{"currency":"IQD","rate":182.493562},{"currency":"IRR","rate":5947.331641},{"currency":"ISK","rate":17.059481},{"currency":"JEP","rate":0.102914},{"currency":"JMD","rate":22.284011},{"currency":"JOD","rate":0.098676},{"currency":"JPY","rate":20.560161},{"currency":"KES","rate":18.001838},{"currency":"KGS","rate":12.154697},{"currency":"KHR","rate":559.486842},{"currency":"KID","rate":0.213953},{"currency":"KMF","rate":58.657438},{"currency":"KRW","rate":193.082196},{"currency":"KWD","rate":0.042467},{"currency":"KYD","rate":0.11598},{"currency":"KZT","rate":75.044843},{"currency":"LAK","rate":3020.068103},{"currency":"LBP","rate":12456.256905},{"currency":"LKR","rate":41.92144},{"currency":"LRD","rate":27.931467},{"currency":"LSL","rate":2.453056},{"currency":"LYD","rate":0.753251},{"currency":"MAD","rate":1.256183},{"currency":"MDL","rate":2.318865},{"currency":"MGA","rate":616.246377},{"currency":"MKD","rate":7.330199},{"currency":"MMK","rate":292.821503},{"currency":"MNT","rate":496.284455},{"currency":"MOP","rate":1.121431},{"currency":"MRU","rate":5.575062},{"currency":"MUR","rate":6.322278},{"currency":"MVR","rate":2.152859},{"currency":"MWK","rate":242.759976},{"currency":"MXN","rate":2.615768},{"currency":"MYR","rate":0.587931},{"currency":"MZN","rate":8.897355},{"currency":"NAD","rate":2.453056},{"currency":"NGN","rate":213.548738},{"currency":"NIO","rate":5.126446},{"currency":"NOK","rate":1.418768},{"currency":"NPR","rate":19.467451},{"currency":"NZD","rate":0.234779},{"currency":"OMR","rate":0.053513},{"currency":"PAB","rate":0.139176},{"currency":"PEN","rate":0.494927},{"currency":"PGK","rate":0.582729},{"currency":"PHP","rate":7.93572},{"currency":"PKR","rate":39.46328},{"currency":"PLN","rate":0.506978},{"currency":"PYG","rate":1027.399127},{"currency":"QAR","rate":0.506601},{"currency":"RON","rate":0.603459},{"currency":"RSD","rate":13.970729},{"currency":"RUB","rate":11.172399},{"currency":"RWF","rate":202.11696},{"currency":"SAR","rate":0.52191},{"currency":"SBD","rate":1.166597},{"currency":"SCR","rate":2.048212},{"currency":"SDG","rate":62.256223},{"currency":"SEK","rate":1.330729},{"currency":"SGD","rate":0.178681},{"currency":"SHP","rate":0.102914},{"currency":"SLE","rate":3.233657},{"currency":"SLL","rate":3233.656465},{"currency":"SOS","rate":79.627341},{"currency":"SRD","rate":5.237221},{"currency":"SSP","rate":656.433807},{"currency":"STN","rate":2.921141},{"currency":"SYP","rate":1797.905083},{"currency":"SZL","rate":2.453056},{"currency":"THB","rate":4.522448},{"currency":"TJS","rate":1.304898},{"currency":"TMT","rate":0.487573},{"currency":"TND","rate":0.400111},{"currency":"TOP","rate":0.334775},{"currency":"TRY","rate":5.692494},{"currency":"TTD","rate":0.944407},{"currency":"TVD","rate":0.213953},{"currency":"TWD","rate":4.180337},{"currency":"TZS","rate":362.491953},{"currency":"UAH","rate":5.749996},{"currency":"UGX","rate":495.482314},{"currency":"USD","rate":0.139189},{"currency":"UYU","rate":5.574},{"currency":"UZS","rate":1755.559577},{"currency":"VES","rate":19.06244},{"currency":"VND","rate":3651.953637},{"currency":"VUV","rate":16.614981},{"currency":"WST","rate":0.37355},{"currency":"XAF","rate":78.209917},{"currency":"XCD","rate":0.375775},{"currency":"XCG","rate":0.249125},{"currency":"XDR","rate":0.101791},{"currency":"XOF","rate":78.209917},{"currency":"XPF","rate":14.227984},{"currency":"YER","rate":33.479791},{"currency":"ZAR","rate":2.453082},{"currency":"ZMW","rate":3.244378},{"currency":"ZWL","rate":3.727233}]}} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/background.css deleted file mode 100755 index 8ccdf2c6..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/background.css +++ /dev/null @@ -1,65 +0,0 @@ -/* 彩虹背景相关样式 */ -body { - background: linear-gradient( - 135deg, - #e8f5e8 0%, - #f1f8e9 25%, - #dcedc8 50%, - #c8e6c8 75%, - #e8f5e8 100% - ); - background-size: 200% 200%; - animation: gentleGradient 20s ease infinite; - background-attachment: fixed; - min-height: 100vh; - position: relative; -} - -@keyframes gentleGradient { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 淡雅绿色装饰层 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 20% 20%, rgba(129, 199, 132, 0.08) 0%, transparent 50%), - radial-gradient(circle at 80% 80%, rgba(165, 214, 167, 0.06) 0%, transparent 50%), - radial-gradient(circle at 40% 80%, rgba(200, 230, 201, 0.05) 0%, transparent 40%), - radial-gradient(circle at 60% 20%, rgba(220, 237, 200, 0.04) 0%, transparent 40%); - pointer-events: none; - z-index: -1; -} - -/* 淡雅绿色点缀 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 15% 15%, rgba(129, 199, 132, 0.3) 1px, transparent 1px), - radial-gradient(circle at 45% 25%, rgba(165, 214, 167, 0.25) 1px, transparent 1px), - radial-gradient(circle at 75% 35%, rgba(200, 230, 201, 0.2) 1px, transparent 1px), - radial-gradient(circle at 25% 65%, rgba(220, 237, 200, 0.15) 1px, transparent 1px), - radial-gradient(circle at 85% 75%, rgba(129, 199, 132, 0.2) 1px, transparent 1px); - background-size: 300px 300px, 400px 400px, 350px 350px, 450px 450px, 380px 380px; - pointer-events: none; - z-index: -1; - opacity: 0.4; -} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/style.css deleted file mode 100755 index 5c19dc4d..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/style.css +++ /dev/null @@ -1,860 +0,0 @@ -/* 背景样式 */ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; - background-color: #f8f9fa; -} - -.modern-gradient { - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 135deg, - rgba(129, 199, 132, 0.4) 0%, - rgba(165, 214, 167, 0.3) 25%, - rgba(200, 230, 201, 0.2) 50%, - rgba(220, 237, 200, 0.3) 75%, - rgba(232, 245, 233, 0.4) 100% - ); - animation: gradient-flow 20s ease-in-out infinite; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -.modern-gradient::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: radial-gradient( - circle at 30% 70%, - rgba(129, 199, 132, 0.5) 0%, - transparent 50% - ), radial-gradient( - circle at 70% 30%, - rgba(165, 214, 167, 0.4) 0%, - transparent 50% - ); - animation: pulse-effect 15s ease-in-out infinite alternate; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -@keyframes gradient-flow { - 0%, 100% { - transform: rotate(0deg) scale(1); - opacity: 0.8; - } - 25% { - transform: rotate(90deg) scale(1.1); - opacity: 0.6; - } - 50% { - transform: rotate(180deg) scale(0.9); - opacity: 0.9; - } - 75% { - transform: rotate(270deg) scale(1.05); - opacity: 0.7; - } -} - -@keyframes pulse-effect { - 0% { - transform: scale(1) rotate(0deg); - opacity: 0.5; - } - 50% { - transform: scale(1.2) rotate(180deg); - opacity: 0.8; - } - 100% { - transform: scale(1) rotate(360deg); - opacity: 0.6; - } -} - -/* 主样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; - color: #333; - background-color: #f8f9fa; - position: relative; - min-height: 100vh; -} - -.container { - max-width: 800px; - margin: 0 auto; - padding: 24px; - position: relative; - z-index: 1; - background-color: rgba(255, 255, 255, 0.85); - border-radius: 16px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08); - backdrop-filter: blur(10px); -} - -header, .header { - text-align: center; - margin-bottom: 28px; - padding-bottom: 20px; - border-bottom: 1px solid rgba(0, 0, 0, 0.06); -} - -.header-icon { - font-size: 3rem; - margin-bottom: 10px; - display: block; -} - -header h1, .title { - background: linear-gradient(135deg, #66bb6a, #81c784); - -webkit-background-clip: text; - background-clip: text; - color: transparent; - margin-bottom: 14px; - font-size: 2.4rem; - font-weight: 700; - letter-spacing: -0.5px; -} - -.subtitle { - color: #666; - font-size: 1.1rem; - margin-bottom: 20px; - font-weight: 400; -} - -.tab-container { - display: flex; - justify-content: center; - gap: 12px; - margin-bottom: 20px; - flex-wrap: wrap; -} - -.tab-btn { - background: linear-gradient(135deg, #f0f0f0, #e8e8e8); - border: none; - padding: 12px 20px; - border-radius: 25px; - cursor: pointer; - font-size: 0.95rem; - font-weight: 500; - color: #666; - transition: all 0.3s ease; - display: flex; - align-items: center; - gap: 6px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); -} - -.tab-btn:hover { - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); -} - -.tab-btn.active { - background: linear-gradient(135deg, #66bb6a, #81c784); - color: white; - box-shadow: 0 4px 16px rgba(102, 187, 106, 0.3); -} - -.tab-icon { - font-size: 1.1rem; -} - -.refresh-btn { - background: linear-gradient(135deg, #81c784, #a5d6a7); - border: none; - padding: 12px 24px; - border-radius: 25px; - color: white; - cursor: pointer; - font-size: 0.95rem; - font-weight: 500; - margin-top: 15px; - transition: all 0.3s ease; - display: inline-flex; - align-items: center; - gap: 8px; - box-shadow: 0 4px 12px rgba(129, 199, 132, 0.3); -} - -.refresh-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 16px rgba(129, 199, 132, 0.4); -} - -.btn-icon { - font-size: 1.1rem; -} - -.time-icon { - margin-right: 6px; -} - -.update-time { - color: #666; - font-size: 0.9rem; - background-color: rgba(0, 0, 0, 0.03); - padding: 8px 16px; - border-radius: 24px; - display: inline-block; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); -} - -.hot-list { - list-style: none; -} - -.hot-item { - padding: 20px; - margin-bottom: 16px; - border-radius: 12px; - background-color: white; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04); - transition: all 0.3s ease; - display: flex; - align-items: center; - border: 1px solid rgba(0, 0, 0, 0.03); -} - -.hot-item:hover { - transform: translateY(-3px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); - border-color: rgba(129, 199, 132, 0.3); -} - -.hot-rank { - font-size: 1.2rem; - font-weight: bold; - color: #66bb6a; - margin-right: 18px; - min-width: 38px; - text-align: center; - background-color: rgba(129, 199, 132, 0.1); - border-radius: 50%; - width: 38px; - height: 38px; - display: flex; - align-items: center; - justify-content: center; -} - -.hot-rank.top-1 { - background: linear-gradient(135deg, #66bb6a, #81c784); - color: white; -} - -.hot-rank.top-2 { - background: linear-gradient(135deg, #81c784, #a5d6a7); - color: white; -} - -.hot-rank.top-3 { - background: linear-gradient(135deg, #a5d6a7, #c8e6c9); - color: #333; -} - -.hot-content { - flex: 1; -} - -.hot-title { - font-size: 1.15rem; - margin-bottom: 8px; - color: #333; - text-decoration: none; - display: block; - line-height: 1.5; - font-weight: 500; - transition: color 0.2s ease; -} - -.hot-title:hover { - color: #66bb6a; - text-decoration: none; -} - -.loading { - text-align: center; - padding: 40px; - color: #666; - font-size: 1.1rem; - display: none; -} - -.loading-content { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; -} - -.rainbow-spinner { - width: 50px; - height: 50px; - border: 4px solid rgba(129, 199, 132, 0.2); - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading-text { - display: flex; - flex-direction: column; - align-items: center; - gap: 10px; -} - -.loading-emoji { - font-size: 2rem; - animation: bounce 1.5s ease-in-out infinite; -} - -@keyframes bounce { - 0%, 20%, 50%, 80%, 100% { - transform: translateY(0); - } - 40% { - transform: translateY(-10px); - } - 60% { - transform: translateY(-5px); - } -} - -.loading-dots { - display: flex; - gap: 4px; -} - -.loading-dots span { - width: 8px; - height: 8px; - background: #81c784; - border-radius: 50%; - animation: loadingDots 1.4s ease-in-out infinite both; -} - -.loading-dots span:nth-child(1) { animation-delay: -0.32s; } -.loading-dots span:nth-child(2) { animation-delay: -0.16s; } -.loading-dots span:nth-child(3) { animation-delay: 0s; } - -@keyframes loadingDots { - 0%, 80%, 100% { - transform: scale(0); - } - 40% { - transform: scale(1); - } -} - -.news-list { - margin-top: 20px; -} - -/* 新闻项目卡片 - 移动端优先设计 */ -.news-item { - background: white; - border-radius: 16px; - padding: 16px; - margin-bottom: 12px; - box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06); - transition: all 0.3s ease; - border: 1px solid rgba(0, 0, 0, 0.05); - display: flex; - gap: 12px; - position: relative; - overflow: hidden; -} - -.news-item:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1); - border-color: rgba(129, 199, 132, 0.3); -} - -/* 排名容器 */ -.news-rank-container { - flex-shrink: 0; - display: flex; - align-items: flex-start; - padding-top: 2px; -} - -.news-rank { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: 48px; - height: 48px; - border-radius: 12px; - background: linear-gradient(135deg, #f0f0f0, #e8e8e8); - color: #666; - font-weight: 600; - position: relative; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); -} - -.news-rank.rank-1 { - background: linear-gradient(135deg, #66bb6a, #81c784); - color: white; - box-shadow: 0 4px 12px rgba(102, 187, 106, 0.3); -} - -.news-rank.rank-2 { - background: linear-gradient(135deg, #81c784, #a5d6a7); - color: white; - box-shadow: 0 4px 12px rgba(129, 199, 132, 0.3); -} - -.news-rank.rank-3 { - background: linear-gradient(135deg, #a5d6a7, #c8e6c9); - color: #333; - box-shadow: 0 4px 12px rgba(165, 214, 167, 0.3); -} - -.rank-number { - font-size: 0.9rem; - font-weight: 700; - line-height: 1; -} - -.rank-emoji { - font-size: 0.7rem; - line-height: 1; - margin-top: 1px; -} - -/* 内容包装器 */ -.news-content-wrapper { - flex: 1; - min-width: 0; - display: flex; - flex-direction: column; - gap: 8px; -} - -/* 标题 */ -.news-title { - font-size: 1rem; - font-weight: 600; - color: #333; - line-height: 1.4; - margin: 0; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; - cursor: pointer; - transition: color 0.2s ease; -} - -.news-title:hover { - color: #66bb6a; -} - -/* 元信息行 */ -.news-meta-row { - display: flex; - justify-content: space-between; - align-items: center; - gap: 12px; - flex-wrap: wrap; -} - -.news-author, .news-time { - display: flex; - align-items: center; - gap: 4px; - color: #666; - font-size: 0.8rem; - flex: 1; - min-width: 0; -} - -.meta-icon { - font-size: 0.9rem; - flex-shrink: 0; -} - -.meta-text { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -/* 统计信息行 */ -.news-stats-row { - display: flex; - justify-content: space-between; - align-items: center; - gap: 12px; - margin-top: 4px; -} - -.news-score { - display: flex; - align-items: center; - gap: 4px; - background: linear-gradient(135deg, #81c784, #a5d6a7); - color: white; - padding: 4px 10px; - border-radius: 12px; - font-size: 0.75rem; - font-weight: 600; - box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); -} - -.heat-level { - font-size: 0.8rem; -} - -.score-text { - font-size: 0.75rem; -} - -.news-link { - display: flex; - align-items: center; - gap: 4px; - background: linear-gradient(135deg, #66bb6a, #81c784); - color: white; - text-decoration: none; - padding: 6px 12px; - border-radius: 12px; - font-size: 0.75rem; - font-weight: 600; - transition: all 0.3s ease; - box-shadow: 0 2px 6px rgba(102, 187, 106, 0.3); - flex-shrink: 0; -} - -.news-link:hover { - transform: translateY(-1px); - box-shadow: 0 4px 10px rgba(102, 187, 106, 0.4); - text-decoration: none; - color: white; -} - -.link-icon { - font-size: 0.8rem; -} - -.link-text { - font-size: 0.75rem; -} - -.error-message { - text-align: center; - padding: 40px; - background: white; - border-radius: 12px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04); -} - -.error-content { - display: flex; - flex-direction: column; - align-items: center; - gap: 16px; -} - -.error-icon { - font-size: 3rem; -} - -.error-content h3 { - color: #66bb6a; - margin: 0; - font-size: 1.3rem; -} - -.error-content p { - color: #666; - margin: 0; - font-size: 1rem; -} - -.retry-btn { - background: linear-gradient(135deg, #66bb6a, #81c784); - border: none; - padding: 12px 24px; - border-radius: 25px; - color: white; - cursor: pointer; - font-size: 0.95rem; - font-weight: 500; - transition: all 0.3s ease; - display: inline-flex; - align-items: center; - gap: 8px; - box-shadow: 0 4px 12px rgba(102, 187, 106, 0.3); -} - -.retry-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 16px rgba(102, 187, 106, 0.4); -} - -footer { - text-align: center; - margin-top: 30px; - padding-top: 20px; - border-top: 1px solid rgba(0, 0, 0, 0.06); - color: #666; - font-size: 0.9rem; -} - -/* 响应式设计 - 移动端优化 */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - max-width: 90%; - padding: 20px; - } - - header h1 { - font-size: 2.2rem; - } - - .hot-item { - padding: 18px; - } - - .hot-title { - font-size: 1.1rem; - } -} - -@media (max-width: 768px) { - body { - background-color: #f8f9fa; - } - - .container { - max-width: 95%; - margin: 12px auto; - padding: 8px; - border-radius: 12px; - } - - header, .header { - margin-bottom: 20px; - padding: 12px 0 16px 0; - } - - header h1, .title { - font-size: 1.6rem; - margin-bottom: 10px; - } - - .subtitle { - font-size: 0.85rem; - } - - .tab-container { - gap: 8px; - margin: 16px 0; - } - - .tab-btn { - padding: 8px 12px; - font-size: 0.8rem; - min-width: auto; - } - - .refresh-btn { - padding: 8px 10px; - font-size: 0.8rem; - } - - .update-time { - font-size: 0.85rem; - padding: 6px 12px; - } - - .hot-item { - padding: 16px; - margin-bottom: 12px; - border-radius: 10px; - flex-direction: row; - align-items: flex-start; - } - - .hot-rank { - font-size: 1.1rem; - margin-right: 14px; - min-width: 32px; - width: 32px; - height: 32px; - margin-top: 2px; - } - - .hot-title { - font-size: 1rem; - line-height: 1.5; - margin-bottom: 6px; - } - - .news-item { - padding: 12px; - margin-bottom: 10px; - gap: 10px; - } - - .news-rank { - width: 40px; - height: 40px; - } - - .rank-number { - font-size: 0.8rem; - } - - .rank-emoji { - font-size: 0.6rem; - } - - .news-title { - font-size: 0.9rem; - line-height: 1.3; - } - - .news-meta-row { - gap: 8px; - } - - .news-author, .news-time { - font-size: 0.75rem; - } - - .news-score { - padding: 3px 8px; - font-size: 0.7rem; - } - - .news-link { - padding: 5px 10px; - font-size: 0.7rem; - } - - .link-text { - font-size: 0.7rem; - } - - footer { - margin-top: 24px; - padding-top: 16px; - font-size: 0.85rem; - } -} - -@media (max-width: 480px) { - .container { - margin: 8px auto; - padding: 6px; - } - - header h1, .title { - font-size: 1.6rem; - } - - .hot-item { - padding: 14px; - margin-bottom: 10px; - } - - .hot-rank { - font-size: 1rem; - margin-right: 12px; - min-width: 30px; - width: 30px; - height: 30px; - } - - .hot-title { - font-size: 0.95rem; - } - - .news-item { - padding: 10px; - gap: 8px; - } - - .news-rank { - width: 36px; - height: 36px; - } - - .rank-number { - font-size: 0.75rem; - } - - .news-title { - font-size: 0.85rem; - } - - .news-meta-row { - flex-direction: column; - align-items: flex-start; - gap: 6px; - } - - .news-stats-row { - gap: 8px; - } - - .news-author, .news-time { - font-size: 0.7rem; - } - - .news-score { - font-size: 0.65rem; - } - - .news-link { - font-size: 0.65rem; - padding: 4px 8px; - } -} - -/* 减少动画以节省电池 */ -@media (prefers-reduced-motion: reduce) { - .modern-gradient, - .modern-gradient::before { - animation: none; - } - - .modern-gradient { - background: linear-gradient( - 135deg, - rgba(129, 199, 132, 0.3) 0%, - rgba(200, 230, 201, 0.2) 50%, - rgba(232, 245, 233, 0.25) 100% - ); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/index.html deleted file mode 100755 index 9c4b11cf..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/index.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - HackerNews 热门榜单 - - - - -
    -
    -

    HackerNews 热门榜单

    -

    全球技术社区 · 实时热门话题

    - -
    - - - -
    - -
    - 加载中... -
    - - -
    - -
    -
    -
    -
    -

    正在获取最新榜单...

    -
    - - - -
    -
    -
    -
    - -
    - -
    - - -
    - - - - diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/js/script.js b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/js/script.js deleted file mode 100755 index a944bfcd..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/js/script.js +++ /dev/null @@ -1,339 +0,0 @@ -// API接口列表 -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top", -]; - -// 当前使用的API索引 -let currentApiIndex = 0; -let currentType = 'top'; - -// DOM元素 -const loadingElement = document.getElementById('loading'); -const newsListElement = document.getElementById('newsList'); -const errorMessageElement = document.getElementById('errorMessage'); -const updateTimeElement = document.getElementById('updateTime'); -const refreshBtn = document.getElementById('refreshBtn'); -const tabBtns = document.querySelectorAll('.tab-btn'); - -// 页面加载完成后自动加载数据 -document.addEventListener('DOMContentLoaded', function() { - loadNewsList(); - initTabEvents(); -}); - -// 初始化标签事件 -function initTabEvents() { - tabBtns.forEach(btn => { - btn.addEventListener('click', function() { - const type = this.getAttribute('data-type'); - if (type !== currentType) { - currentType = type; - updateActiveTab(this); - loadNewsList(); - } - }); - }); -} - -// 更新活跃标签 -function updateActiveTab(activeBtn) { - tabBtns.forEach(btn => btn.classList.remove('active')); - activeBtn.classList.add('active'); -} - -// 刷新按钮点击事件 -refreshBtn.addEventListener('click', function() { - loadNewsList(); -}); - -// 加载新闻列表 -async function loadNewsList() { - showLoading(); - hideError(); - - try { - const data = await fetchData(); - displayNewsList(data.data); - updateRefreshTime(); - } catch (error) { - console.error('加载失败:', error); - showError(); - } - - hideLoading(); -} - -// 获取数据 -async function fetchData() { - for (let i = 0; i < API_ENDPOINTS.length; i++) { - const apiUrl = API_ENDPOINTS[currentApiIndex]; - - try { - const response = await fetch(`${apiUrl}/v2/hacker-news/${currentType}`, { - method: 'GET', - headers: { - 'Accept': 'application/json', - }, - timeout: 10000 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - return data; - } else { - throw new Error('数据格式错误'); - } - } catch (error) { - console.error(`API ${apiUrl} 请求失败:`, error); - currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; - - if (i === API_ENDPOINTS.length - 1) { - throw new Error('所有API接口都无法访问'); - } - } - } -} - -// 显示新闻列表 -function displayNewsList(newsData) { - newsListElement.innerHTML = ''; - - newsData.forEach((item, index) => { - const newsItem = createNewsItem(item, index + 1); - newsListElement.appendChild(newsItem); - }); -} - -// 创建新闻项目 -function createNewsItem(item, rank) { - const newsItem = document.createElement('div'); - newsItem.className = 'news-item'; - - const rankClass = rank <= 3 ? `news-rank rank-${rank}` : 'news-rank'; - const formattedScore = formatScore(item.score); - const formattedTime = formatTime(item.created); - - // 根据评分添加热度指示 - let heatLevel = ''; - if (item.score >= 1000) heatLevel = 'HOT'; - else if (item.score >= 500) heatLevel = 'WARM'; - else if (item.score >= 100) heatLevel = 'COOL'; - else heatLevel = 'NEW'; - - newsItem.innerHTML = ` -
    -
    - ${rank} -
    -
    -
    -

    ${escapeHtml(item.title)}

    -
    -
    - ${escapeHtml(item.author)} -
    -
    - ${formattedTime} -
    -
    -
    -
    - ${heatLevel} - ${formattedScore} 分 -
    - - 阅读全文 - -
    -
    - `; - - return newsItem; -} - -// 格式化评分 -function formatScore(score) { - if (score >= 1000) { - return (score / 1000).toFixed(1) + 'K'; - } else { - return score.toString(); - } -} - -// 格式化时间 -function formatTime(timeStr) { - try { - const date = new Date(timeStr); - const now = new Date(); - const diff = now - date; - const minutes = Math.floor(diff / (1000 * 60)); - const hours = Math.floor(minutes / 60); - const days = Math.floor(hours / 24); - - if (days > 0) { - return `${days}天前`; - } else if (hours > 0) { - return `${hours}小时前`; - } else if (minutes > 0) { - return `${minutes}分钟前`; - } else { - return '刚刚'; - } - } catch (error) { - return timeStr; - } -} - -// HTML转义 -function escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} - -// 更新刷新时间 -function updateRefreshTime() { - const now = new Date(); - const timeStr = now.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit' - }); - updateTimeElement.textContent = `最后更新: ${timeStr}`; - - // 添加成功提示 - showSuccessMessage('🌈 数据已更新'); -} - -// 显示成功消息 -function showSuccessMessage(message) { - // 移除之前的提示 - const existingToast = document.querySelector('.success-toast'); - if (existingToast) { - existingToast.remove(); - } - - const toast = document.createElement('div'); - toast.className = 'success-toast'; - toast.textContent = message; - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: linear-gradient(135deg, #ff6b6b, #4ecdc4, #45b7d1); - color: white; - padding: 12px 20px; - border-radius: 25px; - box-shadow: 0 4px 20px rgba(255, 107, 107, 0.3); - z-index: 1000; - font-weight: 600; - font-size: 0.9em; - animation: rainbowToastSlide 0.5s ease-out; - backdrop-filter: blur(10px); - `; - - document.body.appendChild(toast); - - // 3秒后自动移除 - setTimeout(() => { - toast.style.animation = 'rainbowToastSlideOut 0.5s ease-in forwards'; - setTimeout(() => toast.remove(), 500); - }, 3000); -} - -// 显示加载状态 -function showLoading() { - loadingElement.style.display = 'block'; - newsListElement.style.display = 'none'; -} - -// 隐藏加载状态 -function hideLoading() { - loadingElement.style.display = 'none'; - newsListElement.style.display = 'block'; -} - -// 显示错误信息 -function showError() { - errorMessageElement.style.display = 'block'; - newsListElement.style.display = 'none'; -} - -// 隐藏错误信息 -function hideError() { - errorMessageElement.style.display = 'none'; -} - -// 添加CSS动画到页面 -if (!document.querySelector('#toast-styles')) { - const style = document.createElement('style'); - style.id = 'toast-styles'; - style.textContent = ` - @keyframes rainbowToastSlide { - from { - opacity: 0; - transform: translateX(100px) scale(0.8); - } - to { - opacity: 1; - transform: translateX(0) scale(1); - } - } - - @keyframes rainbowToastSlideOut { - from { - opacity: 1; - transform: translateX(0) scale(1); - } - to { - opacity: 0; - transform: translateX(100px) scale(0.8); - } - } - - .success-toast { - background-size: 200% 200%; - animation: rainbowToastSlide 0.5s ease-out, toastRainbow 2s ease-in-out infinite !important; - } - - @keyframes toastRainbow { - 0%, 100% { background-position: 0% 50%; } - 50% { background-position: 100% 50%; } - } - `; - document.head.appendChild(style); -} - -// 自动刷新 (每5分钟) -setInterval(function() { - loadNewsList(); -}, 5 * 60 * 1000); - -// 键盘快捷键支持 -document.addEventListener('keydown', function(e) { - if (e.key === 'r' && (e.ctrlKey || e.metaKey)) { - e.preventDefault(); - loadNewsList(); - } - - // 数字键切换标签 - if (e.key >= '1' && e.key <= '3') { - e.preventDefault(); - const typeMap = { '1': 'top', '2': 'new', '3': 'best' }; - const targetType = typeMap[e.key]; - const targetBtn = document.querySelector(`[data-type="${targetType}"]`); - if (targetBtn && targetType !== currentType) { - currentType = targetType; - updateActiveTab(targetBtn); - loadNewsList(); - } - } -}); diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/接口集合.json b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/返回接口.json deleted file mode 100755 index d823f439..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/返回接口.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "id": 45087396, - "title": "We should have the ability to run any code we want on hardware we own", - "link": "https://hugotunius.se/2025/08/31/what-every-argument-about-sideloading-gets-wrong.html", - "score": 995, - "author": "K0nserv", - "created": "2025-08-31 21:46:26", - "created_at": 1756676786000 - }, - { - "id": 45053029, - "title": "Why countries trade with each other while fighting", - "link": "https://news.mit.edu/2025/why-countries-trade-each-other-while-fighting-mariya-grinberg-book-0828", - "score": 32, - "author": "LorenDB", - "created": "2025-08-28 14:58:28", - "created_at": 1756393108000 - }, - { - "id": 45086020, - "title": "Eternal Struggle", - "link": "https://yoavg.github.io/eternal/", - "score": 481, - "author": "yurivish", - "created": "2025-08-31 19:04:03", - "created_at": 1756667043000 - }, - { - "id": 45052960, - "title": "C++: Strongly Happens Before?", - "link": "https://nekrozqliphort.github.io/posts/happens-b4/", - "score": 16, - "author": "signa11", - "created": "2025-08-28 14:54:37", - "created_at": 1756392877000 - }, - { - "id": 45087971, - "title": "Nintendo Switch 2 Dock USB-C Compatibility", - "link": "https://www.lttlabs.com/blog/2025/08/30/nintendo-switch-2-dock", - "score": 192, - "author": "croes", - "created": "2025-08-31 23:21:46", - "created_at": 1756682506000 - }, - { - "id": 45082731, - "title": "“This telegram must be closely paraphrased before being communicated to anyone”", - "link": "https://history.stackexchange.com/questions/79371/this-telegram-must-be-closely-paraphrased-before-being-communicated-to-anyone", - "score": 645, - "author": "azeemba", - "created": "2025-08-31 12:39:47", - "created_at": 1756643987000 - }, - { - "id": 45089256, - "title": "What Is Complexity in Chess?", - "link": "https://lichess.org/@/Toadofsky/blog/what-is-complexity/pKo1swFh", - "score": 41, - "author": "fzliu", - "created": "2025-09-01 03:45:33", - "created_at": 1756698333000 - }, - { - "id": 45087815, - "title": "Lewis and Clark marked their trail with laxatives", - "link": "https://offbeatoregon.com/2501d1006d_biliousPills-686.077.html", - "score": 141, - "author": "toomuchtodo", - "created": "2025-08-31 22:54:26", - "created_at": 1756680866000 - }, - { - "id": 45083952, - "title": "Jujutsu for everyone", - "link": "https://jj-for-everyone.github.io/", - "score": 363, - "author": "Bogdanp", - "created": "2025-08-31 15:31:04", - "created_at": 1756654264000 - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/background.css deleted file mode 100755 index 894b8e82..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/background.css +++ /dev/null @@ -1,203 +0,0 @@ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; - background-color: #f0f7ff; -} - -/* 太阳元素 */ -.sun { - position: absolute; - top: 50px; - right: 35%; - width: 60px; - height: 60px; - background: radial-gradient(circle, #ffeb3b 30%, #ff9800 70%); - border-radius: 50%; - box-shadow: 0 0 40px rgba(255, 152, 0, 0.6); - z-index: 0; - animation: sun-pulse 8s ease-in-out infinite; -} - -/* 蓝色云元素 */ -.cloud { - position: absolute; - background: rgba(135, 206, 250, 0.8); - border-radius: 50px; - box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1); - z-index: -1; -} - -.cloud-1 { - top: 120px; - left: -150px; - width: 120px; - height: 40px; - animation: cloud-float 15s linear infinite; -} - -.cloud-2 { - top: 180px; - right: -150px; - width: 160px; - height: 50px; - animation: cloud-float 20s linear infinite reverse; -} - -.cloud-3 { - top: 60px; - left: -100px; - width: 100px; - height: 35px; - animation: cloud-float 12s linear infinite; -} - -/* 云朵的伪元素,创建更自然的形状 */ -.cloud::before, -.cloud::after { - content: ''; - position: absolute; - background: rgba(135, 206, 250, 0.8); - border-radius: 50%; -} - -.cloud::before { - width: 50px; - height: 50px; - top: -20px; - left: 15px; -} - -.cloud::after { - width: 60px; - height: 60px; - top: -30px; - right: 15px; -} - -@keyframes sun-pulse { - 0%, 100% { - transform: scale(1); - box-shadow: 0 0 40px rgba(255, 152, 0, 0.6); - } - 50% { - transform: scale(1.1); - box-shadow: 0 0 60px rgba(255, 152, 0, 0.8); - } -} - -@keyframes cloud-float { - 0% { - transform: translateX(-150px); - } - 100% { - transform: translateX(calc(100vw + 150px)); - } -} - -.modern-gradient { - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 135deg, - rgba(24, 144, 255, 0.6) 0%, - rgba(64, 169, 255, 0.5) 20%, - rgba(135, 208, 255, 0.4) 40%, - rgba(255, 175, 64, 0.4) 60%, - rgba(255, 122, 69, 0.5) 80%, - rgba(245, 85, 65, 0.6) 100% - ); - animation: gradient-flow 25s ease-in-out infinite; - border-radius: 40% 60% 60% 40% / 40% 40% 60% 60%; - filter: blur(30px); -} - -.modern-gradient::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: radial-gradient( - circle at 25% 65%, - rgba(24, 144, 255, 0.6) 0%, - transparent 60% - ), radial-gradient( - circle at 75% 35%, - rgba(245, 85, 65, 0.5) 0%, - transparent 60% - ); - animation: pulse-effect 18s ease-in-out infinite alternate; - border-radius: 40% 60% 60% 40% / 40% 40% 60% 60%; - filter: blur(20px); -} - -@keyframes gradient-flow { - 0%, 100% { - transform: rotate(0deg) scale(1); - opacity: 0.8; - } - 25% { - transform: rotate(90deg) scale(1.1); - opacity: 0.6; - } - 50% { - transform: rotate(180deg) scale(0.9); - opacity: 0.9; - } - 75% { - transform: rotate(270deg) scale(1.05); - opacity: 0.7; - } -} - -@keyframes pulse-effect { - 0% { - transform: scale(1) rotate(0deg); - opacity: 0.5; - } - 50% { - transform: scale(1.2) rotate(180deg); - opacity: 0.8; - } - 100% { - transform: scale(1) rotate(360deg); - opacity: 0.6; - } -} - -/* 手机端背景优化 */ -@media (max-width: 768px) { - .modern-gradient { - animation-duration: 25s; - } - - .modern-gradient::before { - animation-duration: 18s; - } -} - -/* 减少动画以节省电池 */ -@media (prefers-reduced-motion: reduce) { - .modern-gradient, - .modern-gradient::before { - animation: none; - } - - .modern-gradient { - background: linear-gradient( - 135deg, - rgba(64, 169, 255, 0.3) 0%, - rgba(255, 175, 64, 0.2) 50%, - rgba(255, 122, 69, 0.25) 100% - ); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/style.css deleted file mode 100755 index 69b0bab6..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/style.css +++ /dev/null @@ -1,352 +0,0 @@ -/* 背景样式 */ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; - background-color: #f8f9fa; -} - -.modern-gradient { - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 135deg, - rgba(64, 169, 255, 0.4) 0%, - rgba(120, 192, 255, 0.3) 25%, - rgba(255, 175, 64, 0.2) 50%, - rgba(255, 140, 50, 0.3) 75%, - rgba(255, 122, 69, 0.4) 100% - ); - animation: gradient-flow 20s ease-in-out infinite; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -.modern-gradient::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: radial-gradient( - circle at 30% 70%, - rgba(64, 169, 255, 0.5) 0%, - transparent 50% - ), radial-gradient( - circle at 70% 30%, - rgba(255, 140, 50, 0.4) 0%, - transparent 50% - ); - animation: pulse-effect 15s ease-in-out infinite alternate; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -@keyframes gradient-flow { - 0%, 100% { - transform: rotate(0deg) scale(1); - opacity: 0.8; - } - 25% { - transform: rotate(90deg) scale(1.1); - opacity: 0.6; - } - 50% { - transform: rotate(180deg) scale(0.9); - opacity: 0.9; - } - 75% { - transform: rotate(270deg) scale(1.05); - opacity: 0.7; - } -} - -@keyframes pulse-effect { - 0% { - transform: scale(1) rotate(0deg); - opacity: 0.5; - } - 50% { - transform: scale(1.2) rotate(180deg); - opacity: 0.8; - } - 100% { - transform: scale(1) rotate(360deg); - opacity: 0.6; - } -} - -/* 主样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; - color: #333; - background-color: #f0f7ff; - position: relative; - min-height: 100vh; -} - -.container { - max-width: 800px; - margin: 20px auto; - padding: 28px; - position: relative; - z-index: 1; - background-color: rgba(255, 255, 255, 0.8); - border-radius: 24px; - box-shadow: 0 15px 40px rgba(0, 0, 0, 0.1); - backdrop-filter: blur(15px); - border: 1px solid rgba(255, 255, 255, 0.6); -} - -header { - text-align: center; - margin-bottom: 32px; - padding-bottom: 24px; - border-bottom: 1px solid rgba(0, 0, 0, 0.04); -} - -header h1 { - background: linear-gradient(135deg, #1890ff, #ff7a45); - -webkit-background-clip: text; - background-clip: text; - color: transparent; - margin-bottom: 16px; - font-size: 2.6rem; - font-weight: 800; - letter-spacing: -0.5px; - text-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); -} - -.update-time { - color: #666; - font-size: 0.9rem; - background-color: rgba(255, 255, 255, 0.7); - padding: 10px 20px; - border-radius: 30px; - display: inline-block; - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05); - border: 1px solid rgba(255, 255, 255, 0.8); -} - -.hot-list { - list-style: none; -} - -.hot-item { - padding: 22px; - margin-bottom: 20px; - border-radius: 16px; - background-color: white; - box-shadow: 0 8px 20px rgba(0, 0, 0, 0.06); - transition: all 0.3s ease; - display: flex; - align-items: center; - border: 1px solid rgba(255, 255, 255, 0.8); -} - -.hot-item:hover { - transform: translateY(-3px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); - border-color: rgba(64, 169, 255, 0.3); -} - -.hot-rank { - font-size: 1.2rem; - font-weight: bold; - color: #4096ff; - margin-right: 18px; - min-width: 38px; - text-align: center; - background-color: rgba(64, 169, 255, 0.1); - border-radius: 50%; - width: 38px; - height: 38px; - display: flex; - align-items: center; - justify-content: center; -} - -.hot-rank.top-1 { - background: linear-gradient(135deg, #ff4d4f, #ff7a45); - color: white; -} - -.hot-rank.top-2 { - background: linear-gradient(135deg, #ff7a45, #ffa940); - color: white; -} - -.hot-rank.top-3 { - background: linear-gradient(135deg, #ffa940, #ffec3d); - color: white; -} - -.hot-content { - flex: 1; -} - -.hot-title { - font-size: 1.15rem; - margin-bottom: 8px; - color: #333; - text-decoration: none; - display: block; - line-height: 1.5; - font-weight: 500; - transition: color 0.2s ease; -} - -.hot-title:hover { - color: #4096ff; - text-decoration: none; -} - -.loading { - text-align: center; - padding: 40px; - color: #666; - font-size: 1.1rem; -} - -footer { - text-align: center; - margin-top: 30px; - padding-top: 20px; - border-top: 1px solid rgba(0, 0, 0, 0.06); - color: #666; - font-size: 0.9rem; -} - -/* 响应式设计 */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - max-width: 90%; - padding: 20px; - } - - header h1 { - font-size: 2.2rem; - } - - .hot-item { - padding: 18px; - } - - .hot-title { - font-size: 1.1rem; - } -} - -@media (max-width: 768px) { - body { - background-color: #f8f9fa; - } - - .container { - max-width: 95%; - margin: 12px auto; - padding: 16px; - border-radius: 12px; - } - - header { - margin-bottom: 20px; - padding-bottom: 16px; - } - - header h1 { - font-size: 1.8rem; - margin-bottom: 10px; - } - - .update-time { - font-size: 0.85rem; - padding: 6px 12px; - } - - .hot-item { - padding: 16px; - margin-bottom: 12px; - border-radius: 10px; - flex-direction: row; - align-items: flex-start; - } - - .hot-rank { - font-size: 1.1rem; - margin-right: 14px; - min-width: 32px; - width: 32px; - height: 32px; - margin-top: 2px; - } - - .hot-title { - font-size: 1rem; - line-height: 1.5; - margin-bottom: 6px; - } - - footer { - margin-top: 24px; - padding-top: 16px; - font-size: 0.85rem; - } -} - -@media (max-width: 480px) { - .container { - margin: 8px auto; - padding: 14px; - } - - header h1 { - font-size: 1.6rem; - } - - .hot-item { - padding: 14px; - margin-bottom: 10px; - } - - .hot-rank { - font-size: 1rem; - margin-right: 12px; - min-width: 30px; - width: 30px; - height: 30px; - } - - .hot-title { - font-size: 0.95rem; - } -} - -/* 减少动画以节省电池 */ -@media (prefers-reduced-motion: reduce) { - .modern-gradient, - .modern-gradient::before { - animation: none; - } - - .modern-gradient { - background: linear-gradient( - 135deg, - rgba(64, 169, 255, 0.3) 0%, - rgba(255, 175, 64, 0.2) 50%, - rgba(255, 122, 69, 0.25) 100% - ); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/index.html deleted file mode 100755 index f83e14c7..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/index.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - 哔哩哔哩热搜榜 - - - - -
    -
    -
    - -
    -
    -

    哔哩哔哩热搜榜

    -
    -
    - -
    -
    -
    加载中...
    -
    -
    - -
    -

    数据来源于哔哩哔哩热搜榜

    -
    -
    - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/js/main.js b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/js/main.js deleted file mode 100755 index 642848e0..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/js/main.js +++ /dev/null @@ -1,130 +0,0 @@ -// API接口列表 -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top/v2/bili" -]; - -// 当前使用的API索引 -let currentApiIndex = 0; - -// DOM元素 -const hotListElement = document.getElementById('hotList'); -const updateTimeElement = document.getElementById('updateTime'); - -// 格式化时间 -function formatDate(date) { - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - - return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; -} - -// 渲染热搜列表 -function renderHotList(data) { - hotListElement.innerHTML = ''; - - data.forEach((item, index) => { - const hotItem = document.createElement('div'); - hotItem.className = 'hot-item'; - - const rankClass = index < 3 ? `top-${index + 1}` : ''; - - hotItem.innerHTML = ` -
    ${index + 1}
    - - `; - - hotListElement.appendChild(hotItem); - }); - - // 更新时间 - updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`; -} - -// 显示加载状态 -function showLoading() { - hotListElement.innerHTML = '
    加载中...
    '; -} - -// 显示错误状态 -function showError(message) { - hotListElement.innerHTML = `
    ${message}
    `; -} - -// 获取哔哩哔哩热搜数据 -async function fetchBiliHotList() { - showLoading(); - - try { - const response = await fetch(API_ENDPOINTS[currentApiIndex]); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const result = await response.json(); - - if (result.code === 200 && result.data && Array.isArray(result.data)) { - if (result.data.length > 0) { - renderHotList(result.data); - } else { - showError('暂无热搜数据'); - } - } else { - throw new Error('数据格式错误或无数据'); - } - } catch (error) { - console.error('获取数据失败:', error); - - // 尝试切换到下一个API - const nextApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; - - if (nextApiIndex !== 0) { - // 还有其他API可以尝试 - currentApiIndex = nextApiIndex; - showError('获取数据失败,正在尝试其他接口...'); - - // 延迟后重试 - setTimeout(fetchBiliHotList, 2000); - } else { - // 所有API都尝试过了 - currentApiIndex = 0; - showError('所有接口都无法访问,请稍后再试'); - } - } -} - -// 手动刷新数据 -function refreshData() { - currentApiIndex = 0; // 重置API索引 - fetchBiliHotList(); -} - -// 页面加载完成后获取数据 -document.addEventListener('DOMContentLoaded', () => { - fetchBiliHotList(); - - // 每隔5分钟刷新一次数据 - setInterval(fetchBiliHotList, 5 * 60 * 1000); - - // 添加键盘快捷键支持(按R键刷新) - document.addEventListener('keydown', (event) => { - if (event.key === 'r' || event.key === 'R') { - event.preventDefault(); - refreshData(); - } - }); -}); - -// 页面可见性变化时的处理 -document.addEventListener('visibilitychange', () => { - if (!document.hidden) { - // 页面重新可见时刷新数据 - refreshData(); - } -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/接口集合.json b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/接口集合.json deleted file mode 100755 index 07ea2fd8..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/返回接口.json deleted file mode 100755 index e14dc7f1..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/返回接口.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "title": "18次阅兵76年逆袭路", - "link": "https://search.bilibili.com/all?keyword=18%E6%AC%A1%E9%98%85%E5%85%B576%E5%B9%B4%E9%80%86%E8%A2%AD%E8%B7%AF" - }, - { - "title": "80年前的今天日本签署投降书", - "link": "https://search.bilibili.com/all?keyword=80%E5%B9%B4%E5%89%8D%E7%9A%84%E4%BB%8A%E5%A4%A9%E6%97%A5%E6%9C%AC%E7%AD%BE%E7%BD%B2%E6%8A%95%E9%99%8D%E4%B9%A6" - }, - { - "title": "九三阅兵具体安排公布", - "link": "https://search.bilibili.com/all?keyword=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%85%B7%E4%BD%93%E5%AE%89%E6%8E%92%E5%85%AC%E5%B8%83" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/background.css deleted file mode 100755 index b8af5266..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/background.css +++ /dev/null @@ -1,107 +0,0 @@ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; -} - -.green-gradient { - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 135deg, - rgba(168, 230, 207, 0.3) 0%, - rgba(220, 237, 193, 0.2) 25%, - rgba(200, 245, 200, 0.1) 50%, - rgba(180, 235, 180, 0.2) 75%, - rgba(168, 230, 207, 0.3) 100% - ); - animation: green-flow 20s ease-in-out infinite; -} - -.green-gradient::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: radial-gradient( - circle at 30% 70%, - rgba(129, 199, 132, 0.3) 0%, - transparent 50% - ), radial-gradient( - circle at 70% 30%, - rgba(165, 214, 167, 0.25) 0%, - transparent 50% - ); - animation: green-pulse 15s ease-in-out infinite alternate; -} - -@keyframes green-flow { - 0%, 100% { - transform: rotate(0deg) scale(1); - opacity: 0.8; - } - 25% { - transform: rotate(90deg) scale(1.1); - opacity: 0.6; - } - 50% { - transform: rotate(180deg) scale(0.9); - opacity: 0.9; - } - 75% { - transform: rotate(270deg) scale(1.05); - opacity: 0.7; - } -} - -@keyframes green-pulse { - 0% { - transform: scale(1) rotate(0deg); - opacity: 0.5; - } - 50% { - transform: scale(1.2) rotate(180deg); - opacity: 0.8; - } - 100% { - transform: scale(1) rotate(360deg); - opacity: 0.6; - } -} - -/* 手机端背景优化 */ -@media (max-width: 768px) { - .green-gradient { - animation-duration: 25s; - } - - .green-gradient::before { - animation-duration: 18s; - } -} - -/* 减少动画以节省电池 */ -@media (prefers-reduced-motion: reduce) { - .green-gradient, - .green-gradient::before { - animation: none; - } - - .green-gradient { - background: linear-gradient( - 135deg, - rgba(76, 175, 80, 0.2) 0%, - rgba(165, 214, 167, 0.1) 50%, - rgba(200, 230, 201, 0.15) 100% - ); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/style.css deleted file mode 100755 index fb74134e..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/style.css +++ /dev/null @@ -1,571 +0,0 @@ -/* 背景样式 */ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; - background-color: #f8f9fa; -} - -.modern-gradient { - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 135deg, - rgba(168, 230, 207, 0.3) 0%, - rgba(220, 237, 193, 0.25) 25%, - rgba(200, 245, 200, 0.15) 50%, - rgba(180, 235, 180, 0.25) 75%, - rgba(168, 230, 207, 0.3) 100% - ); - animation: gradient-flow 20s ease-in-out infinite; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -.modern-gradient::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: radial-gradient( - circle at 30% 70%, - rgba(129, 199, 132, 0.4) 0%, - transparent 50% - ), radial-gradient( - circle at 70% 30%, - rgba(165, 214, 167, 0.3) 0%, - transparent 50% - ); - animation: pulse-effect 15s ease-in-out infinite alternate; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -@keyframes gradient-flow { - 0%, 100% { - transform: rotate(0deg) scale(1); - opacity: 0.8; - } - 25% { - transform: rotate(90deg) scale(1.1); - opacity: 0.6; - } - 50% { - transform: rotate(180deg) scale(0.9); - opacity: 0.9; - } - 75% { - transform: rotate(270deg) scale(1.05); - opacity: 0.7; - } -} - -@keyframes pulse-effect { - 0% { - transform: scale(1) rotate(0deg); - opacity: 0.5; - } - 50% { - transform: scale(1.2) rotate(180deg); - opacity: 0.8; - } - 100% { - transform: scale(1) rotate(360deg); - opacity: 0.6; - } -} - -/* 主样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; - color: #333; - background-color: #f8f9fa; - position: relative; - min-height: 100vh; -} - -/* 几何装饰样式 */ -.title-container { - display: flex; - align-items: center; - justify-content: center; - margin-bottom: 10px; -} - -.geometric-decoration { - font-size: 16px; - color: #81c784; - margin: 0 10px; - font-weight: normal; - letter-spacing: 3px; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - opacity: 0.6; -} - -.geometric-decoration.left { - transform: rotate(-10deg); -} - -.geometric-decoration.right { - transform: rotate(10deg); -} - -@keyframes float-effect { - 0% { - transform: translateY(0) rotate(-10deg); - } - 100% { - transform: translateY(-5px) rotate(-8deg); - } -} - -.update-time-container { - display: flex; - align-items: center; - justify-content: center; - margin-top: 10px; -} - -.time-decoration { - font-size: 14px; - color: #a5d6a7; - margin: 0 8px; - font-weight: normal; - letter-spacing: 2px; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - opacity: 0.5; -} - -@keyframes pulse { - 0% { - opacity: 0.5; - transform: scale(0.8); - } - 50% { - opacity: 1; - transform: scale(1.2); - } - 100% { - opacity: 0.5; - transform: scale(0.8); - } -} - -.geometric-header, .geometric-footer { - text-align: center; - color: #a5d6a7; - margin: 10px 0; - font-size: 14px; - letter-spacing: 2px; - opacity: 0.5; -} - -.geometric-header { - margin-bottom: 20px; -} - -.geometric-footer { - margin-top: 20px; -} - -.container { - max-width: 800px; - margin: 0 auto; - padding: 24px; - position: relative; - z-index: 1; - background-color: rgba(255, 255, 255, 0.85); - border-radius: 16px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08); - backdrop-filter: blur(10px); - border: 1px solid rgba(129, 199, 132, 0.2); - position: relative; -} - -.container::before, -.container::after { - content: ''; - position: absolute; - width: 30px; - height: 30px; - border-color: #a5d6a7; - opacity: 0.7; -} - -.container::before { - top: 10px; - left: 10px; - border-top: 3px solid; - border-left: 3px solid; - border-radius: 10px 0 0 0; -} - -.container::after { - bottom: 10px; - right: 10px; - border-bottom: 3px solid; - border-right: 3px solid; - border-radius: 0 0 10px 0; -} - -header { - text-align: center; - margin-bottom: 28px; - padding-bottom: 20px; - border-bottom: 1px solid rgba(0, 0, 0, 0.06); -} - -header h1 { - background: linear-gradient(135deg, #66bb6a, #81c784); - -webkit-background-clip: text; - background-clip: text; - color: transparent; - margin-bottom: 14px; - font-size: 2.4rem; - font-weight: 700; - letter-spacing: -0.5px; -} - -.update-time { - color: #666; - font-size: 0.9rem; - background-color: rgba(0, 0, 0, 0.03); - padding: 8px 16px; - border-radius: 24px; - display: inline-block; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); - position: relative; - border: 1px dashed rgba(129, 199, 132, 0.3); -} - -.update-time::before { - content: ''; - position: absolute; - top: -5px; - left: -5px; - right: -5px; - bottom: -5px; - border: 1px solid rgba(129, 199, 132, 0.3); - border-radius: 28px; - animation: pulse-border 2s infinite; - pointer-events: none; -} - -@keyframes pulse-border { - 0% { - transform: scale(1); - opacity: 0.7; - } - 50% { - transform: scale(1.05); - opacity: 0.3; - } - 100% { - transform: scale(1); - opacity: 0.7; - } -} - -.hot-list { - list-style: none; -} - -.hot-item { - padding: 20px; - margin-bottom: 16px; - border-radius: 12px; - background-color: white; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04); - transition: all 0.3s ease; - display: flex; - align-items: center; - border: 1px solid rgba(0, 0, 0, 0.03); - position: relative; - overflow: hidden; -} - -.hot-item::before { - content: '◆'; - position: absolute; - top: 5px; - right: 10px; - color: #a5d6a7; - opacity: 0.15; - font-size: 12px; -} - -.hot-item::after { - content: '◆'; - position: absolute; - bottom: 5px; - left: 10px; - color: #a5d6a7; - opacity: 0.15; - font-size: 12px; -} - -.even-item { - border-left: 2px solid #81c784; -} - -.odd-item { - border-right: 2px solid #81c784; -} - -.title-decoration { - color: #81c784; - font-weight: normal; - margin-right: 5px; - display: inline-block; - transform: translateY(1px); - opacity: 0.7; -} - -.source-icon, .time-icon { - color: #81c784; - font-size: 14px; - margin-right: 3px; - opacity: 0.6; -} - -.hot-title { - position: relative; - display: inline-flex; - align-items: center; -} - -.hot-stats { - display: flex; - flex-wrap: wrap; - gap: 8px; - margin-top: 8px; -} - -.hot-item:hover { - transform: translateY(-3px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); - border-color: rgba(129, 199, 132, 0.4); -} - -.hot-rank { - font-size: 1.2rem; - font-weight: bold; - color: #66bb6a; - margin-right: 18px; - min-width: 38px; - text-align: center; - background-color: rgba(129, 199, 132, 0.1); - border-radius: 50%; - width: 38px; - height: 38px; - display: flex; - align-items: center; - justify-content: center; -} - -.hot-rank.top-1 { - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; -} - -.hot-rank.top-2 { - background: linear-gradient(135deg, #66bb6a, #81c784); - color: white; -} - -.hot-rank.top-3 { - background: linear-gradient(135deg, #81c784, #a5d6a7); - color: white; -} - -.hot-content { - flex: 1; -} - -.hot-title { - font-size: 1.15rem; - margin-bottom: 8px; - color: #333; - text-decoration: none; - display: block; - line-height: 1.5; - font-weight: 500; - transition: color 0.2s ease; -} - -.hot-title:hover { - color: #66bb6a; - text-decoration: none; -} - -.loading { - text-align: center; - padding: 40px; - color: #666; - font-size: 1.1rem; -} - -footer { - text-align: center; - margin-top: 40px; - padding-top: 20px; - border-top: 1px solid rgba(0, 0, 0, 0.06); - color: #999; - font-size: 0.9rem; -} - -.footer-decoration { - display: flex; - justify-content: center; - margin: 10px 0; - gap: 15px; -} - -.geo-symbol { - color: #a5d6a7; - font-size: 14px; - opacity: 0.5; - transition: all 0.3s ease; -} - -.geo-symbol:hover { - opacity: 1; - transform: scale(1.2) rotate(15deg); -} - - - -/* 响应式设计 */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - max-width: 90%; - padding: 20px; - } - - header h1 { - font-size: 2.2rem; - } - - .hot-item { - padding: 18px; - } - - .hot-title { - font-size: 1.1rem; - } -} - -@media (max-width: 768px) { - body { - background-color: #f8f9fa; - } - - .container { - max-width: 95%; - margin: 12px auto; - padding: 16px; - border-radius: 12px; - } - - header { - margin-bottom: 20px; - padding-bottom: 16px; - } - - header h1 { - font-size: 1.8rem; - margin-bottom: 10px; - } - - .update-time { - font-size: 0.85rem; - padding: 6px 12px; - } - - .hot-item { - padding: 16px; - margin-bottom: 12px; - border-radius: 10px; - flex-direction: row; - align-items: flex-start; - } - - .hot-rank { - font-size: 1.1rem; - margin-right: 14px; - min-width: 32px; - width: 32px; - height: 32px; - margin-top: 2px; - } - - .hot-title { - font-size: 1rem; - line-height: 1.5; - margin-bottom: 6px; - } - - footer { - margin-top: 24px; - padding-top: 16px; - font-size: 0.85rem; - } -} - -@media (max-width: 480px) { - .container { - margin: 8px auto; - padding: 14px; - } - - header h1 { - font-size: 1.6rem; - } - - .hot-item { - padding: 14px; - margin-bottom: 10px; - } - - .hot-rank { - font-size: 1rem; - margin-right: 12px; - min-width: 30px; - width: 30px; - height: 30px; - } - - .hot-title { - font-size: 0.95rem; - } -} - -/* 减少动画以节省电池 */ -@media (prefers-reduced-motion: reduce) { - .modern-gradient, - .modern-gradient::before { - animation: none; - } - - .modern-gradient { - background: linear-gradient( - 135deg, - rgba(168, 230, 207, 0.25) 0%, - rgba(200, 245, 200, 0.15) 50%, - rgba(180, 235, 180, 0.2) 100% - ); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/index.html deleted file mode 100755 index 2292ab23..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - 头条热搜榜 - - - - -
    -
    -
    - -
    -
    -
    -
    ◢ ◣ ▲
    -

    头条热搜榜

    -
    ▼ ◥ ◤
    -
    -
    - -
    - -
    -
    - -
    -
    - ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ -
    -
    -
    加载中...
    -
    - -
    - -
    - -

    数据来源于头条热搜榜

    - -
    -
    - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/js/main.js b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/js/main.js deleted file mode 100755 index b3e41a34..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/js/main.js +++ /dev/null @@ -1,171 +0,0 @@ -// API接口列表 -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top/v2/toutiao", -]; - -// 当前使用的API索引 -let currentApiIndex = 0; - -// DOM元素 -const hotListElement = document.getElementById('hotList'); -const updateTimeElement = document.getElementById('updateTime'); - -// 格式化时间 -function formatDate(date) { - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - - return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; -} - -// 格式化数字 -function formatNumber(num) { - if (num >= 10000) { - return (num / 10000).toFixed(1) + '万'; - } - return num.toString(); -} - -// 渲染热搜列表 -function renderHotList(data) { - hotListElement.innerHTML = ''; - - // 几何装饰符号数组 - const geometricSymbols = ['◆', '■', '▲', '●', '★', '◈', '◇', '□', '△', '○']; - - data.forEach((item, index) => { - const hotItem = document.createElement('div'); - hotItem.className = 'hot-item'; - - const rankClass = index < 3 ? `top-${index + 1}` : ''; - - // 随机选择几何符号作为装饰 - const randomSymbol = geometricSymbols[index % geometricSymbols.length]; - - // 处理热度值显示 - const hotValueDisplay = item.hot_value ? - `
    ${randomSymbol} ${formatNumber(item.hot_value)} 热度
    ` : ''; - - // 处理标签显示 - const tagDisplay = item.tag ? - `
    ${randomSymbol} ${item.tag}
    ` : ''; - - hotItem.innerHTML = ` -
    ${index + 1}
    -
    - - ${randomSymbol} ${item.title} - -
    - ${hotValueDisplay} - ${tagDisplay} - ${item.source ? `
    ${randomSymbol} ${item.source}
    ` : ''} - ${item.time ? `
    ${randomSymbol} ${item.time}
    ` : ''} -
    -
    - `; - - hotListElement.appendChild(hotItem); - }); - - // 添加几何装饰到列表项 - const hotItems = document.querySelectorAll('.hot-item'); - hotItems.forEach((item, index) => { - // 为奇数和偶数项添加不同的装饰类 - if (index % 2 === 0) { - item.classList.add('even-item'); - } else { - item.classList.add('odd-item'); - } - }); - - // 更新时间 - updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`; -} - -// 显示加载状态 -function showLoading() { - hotListElement.innerHTML = '
    加载中...
    '; -} - -// 显示错误状态 -function showError(message) { - hotListElement.innerHTML = `
    ${message}
    `; -} - -// 获取头条热搜数据 -async function fetchToutiaoHotList() { - showLoading(); - - try { - const response = await fetch(API_ENDPOINTS[currentApiIndex]); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const result = await response.json(); - - if (result.code === 200 && result.data && Array.isArray(result.data)) { - if (result.data.length > 0) { - renderHotList(result.data); - } else { - showError('暂无热搜数据'); - } - } else { - throw new Error('数据格式错误或无数据'); - } - } catch (error) { - console.error('获取数据失败:', error); - - // 尝试切换到下一个API - const nextApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; - - if (nextApiIndex !== 0) { - // 还有其他API可以尝试 - currentApiIndex = nextApiIndex; - showError('获取数据失败,正在尝试其他接口...'); - - // 延迟后重试 - setTimeout(fetchToutiaoHotList, 2000); - } else { - // 所有API都尝试过了 - currentApiIndex = 0; - showError('所有接口都无法访问,请稍后再试'); - } - } -} - -// 手动刷新数据 -function refreshData() { - currentApiIndex = 0; // 重置API索引 - fetchToutiaoHotList(); -} - -// 页面加载完成后获取数据 -document.addEventListener('DOMContentLoaded', () => { - fetchToutiaoHotList(); - - // 每隔5分钟刷新一次数据 - setInterval(fetchToutiaoHotList, 5 * 60 * 1000); - - // 添加键盘快捷键支持(按R键刷新) - document.addEventListener('keydown', (event) => { - if (event.key === 'r' || event.key === 'R') { - event.preventDefault(); - refreshData(); - } - }); -}); - -// 页面可见性变化时的处理 -document.addEventListener('visibilitychange', () => { - if (!document.hidden) { - // 页面重新可见时刷新数据 - refreshData(); - } -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/接口集合.json b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/返回接口.json deleted file mode 100755 index 8960c5d1..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/返回接口.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "title": "九三阅兵具体安排公布", - "hot_value": 11821633, - "tag": "热", - "source": "头条新闻", - "time": "2小时前", - "link": "https://www.toutiao.com/article/7404567890123456789/" - }, - { - "title": "九月第一天", - "hot_value": 11327170, - "tag": "新", - "source": "今日头条", - "time": "1小时前", - "link": "https://www.toutiao.com/article/7404567890123456790/" - }, - { - "title": "遇见上合共享津彩", - "hot_value": 11222444, - "tag": "推荐", - "source": "头条资讯", - "time": "3小时前", - "link": "https://www.toutiao.com/article/7404567890123456791/" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/background.css deleted file mode 100755 index 77498383..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/background.css +++ /dev/null @@ -1,144 +0,0 @@ -/* 背景样式文件 - 独立管理所有背景相关样式 */ - -/* 页面主背景 */ -body { - background: linear-gradient(135deg, #f8fffe 0%, #f0f9f4 50%, #e8f5e8 100%); - background-attachment: fixed; - background-size: cover; - position: relative; -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(168, 230, 207, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(39, 174, 96, 0.08) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(46, 204, 113, 0.05) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 容器背景 */ -.container { - background: rgba(255, 255, 255, 0.7); - backdrop-filter: blur(10px); - border-radius: 20px; - margin-top: 20px; - margin-bottom: 20px; - box-shadow: 0 8px 32px rgba(39, 174, 96, 0.1); -} - -/* 头部背景 */ -.header { - background: linear-gradient(135deg, rgba(168, 230, 207, 0.2) 0%, rgba(39, 174, 96, 0.1) 100%); - border-radius: 20px 20px 0 0; - position: relative; - overflow: hidden; -} - -.header::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: radial-gradient(circle, rgba(39, 174, 96, 0.05) 0%, transparent 70%); - animation: float 6s ease-in-out infinite; -} - -@keyframes float { - 0%, 100% { - transform: translate(0, 0) rotate(0deg); - } - 50% { - transform: translate(-10px, -10px) rotate(180deg); - } -} - -/* 热点项目背景 */ -.hot-item { - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(5px); - position: relative; -} - -.hot-item::after { - content: ''; - position: absolute; - top: 0; - right: 0; - width: 60px; - height: 60px; - background: radial-gradient(circle, rgba(168, 230, 207, 0.1) 0%, transparent 70%); - border-radius: 50%; - transform: translate(30px, -30px); - pointer-events: none; -} - -/* 前三名特殊背景效果 */ -.hot-item:nth-child(1) { - background: linear-gradient(135deg, rgba(255, 215, 0, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%); -} - -.hot-item:nth-child(2) { - background: linear-gradient(135deg, rgba(192, 192, 192, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%); -} - -.hot-item:nth-child(3) { - background: linear-gradient(135deg, rgba(205, 127, 50, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%); -} - -/* 底部背景 */ -.footer { - background: linear-gradient(135deg, rgba(168, 230, 207, 0.1) 0%, rgba(39, 174, 96, 0.05) 100%); - border-radius: 0 0 20px 20px; -} - -/* 加载状态背景 */ -.loading { - background: rgba(255, 255, 255, 0.8); - border-radius: 12px; - backdrop-filter: blur(5px); -} - -/* 错误信息背景 */ -.error-message { - background: rgba(255, 255, 255, 0.9); - border: 1px solid rgba(231, 76, 60, 0.2); - border-radius: 12px; - backdrop-filter: blur(5px); -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - .container { - margin-top: 10px; - margin-bottom: 10px; - border-radius: 16px; - } - - .header { - border-radius: 16px 16px 0 0; - } - - .footer { - border-radius: 0 0 16px 16px; - } -} - -@media (min-width: 1025px) { - body::before { - background-image: - radial-gradient(circle at 15% 85%, rgba(168, 230, 207, 0.15) 0%, transparent 50%), - radial-gradient(circle at 85% 15%, rgba(39, 174, 96, 0.12) 0%, transparent 50%), - radial-gradient(circle at 50% 50%, rgba(46, 204, 113, 0.08) 0%, transparent 50%), - radial-gradient(circle at 25% 25%, rgba(168, 230, 207, 0.06) 0%, transparent 50%); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/index.html deleted file mode 100755 index ab9170bb..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - 小红书热点榜单 - - - - -
    -
    -

    小红书热点榜单

    -

    实时热门话题,发现精彩内容

    -
    - -
    -
    -
    -

    正在加载热点数据...

    -
    - - - - -
    - -
    -

    -
    -
    - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/script.js b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/script.js deleted file mode 100755 index 77460ed3..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/script.js +++ /dev/null @@ -1,180 +0,0 @@ -// 小红书热点榜单 JavaScript 逻辑 - -// DOM 元素 -const loadingEl = document.getElementById('loading'); -const errorEl = document.getElementById('error'); -const hotListEl = document.getElementById('hotList'); -const updateTimeEl = document.getElementById('updateTime'); - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', function() { - loadData(); -}); - -// 加载数据函数 -async function loadData() { - try { - showLoading(); - - // 从API接口获取数据 - const response = await fetch('https://60s.api.shumengya.top/v2/rednote'); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - renderHotList(data.data); - updateTime(); - showSuccess(); - } else { - throw new Error('数据格式错误'); - } - - } catch (error) { - console.error('加载数据失败:', error); - showError(); - } -} - -// 显示加载状态 -function showLoading() { - loadingEl.style.display = 'block'; - errorEl.style.display = 'none'; - hotListEl.style.display = 'none'; -} - -// 显示错误状态 -function showError() { - loadingEl.style.display = 'none'; - errorEl.style.display = 'block'; - hotListEl.style.display = 'none'; -} - -// 显示成功状态 -function showSuccess() { - loadingEl.style.display = 'none'; - errorEl.style.display = 'none'; - hotListEl.style.display = 'block'; -} - -// 渲染热点列表 -function renderHotList(hotData) { - hotListEl.innerHTML = ''; - - hotData.forEach((item, index) => { - const hotItem = createHotItem(item, index); - hotListEl.appendChild(hotItem); - }); -} - -// 创建热点项目元素 -function createHotItem(item, index) { - const itemEl = document.createElement('div'); - itemEl.className = 'hot-item'; - - // 添加点击事件 - itemEl.addEventListener('click', () => { - if (item.link) { - window.open(item.link, '_blank'); - } - }); - - // 构建HTML内容 - itemEl.innerHTML = ` -
    -
    ${item.rank}
    -
    - ${item.work_type_icon ? `${item.word_type}` : ''} - ${item.word_type && item.word_type !== '无' ? `${item.word_type}` : ''} -
    -
    -
    -

    ${escapeHtml(item.title)}

    -

    热度: ${item.score}

    -
    - `; - - return itemEl; -} - -// 获取类型样式类名 -function getTypeClass(wordType) { - switch (wordType) { - case '热': - return 'hot'; - case '新': - return 'new'; - default: - return 'default'; - } -} - -// HTML转义函数 -function escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} - -// 更新时间显示 -function updateTime() { - const now = new Date(); - const timeString = now.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit' - }); - updateTimeEl.textContent = `最后更新: ${timeString}`; -} - -// 添加页面可见性变化监听,当页面重新可见时刷新数据 -document.addEventListener('visibilitychange', function() { - if (!document.hidden) { - // 页面变为可见时,延迟1秒后刷新数据 - setTimeout(() => { - loadData(); - }, 1000); - } -}); - -// 添加网络状态监听 -window.addEventListener('online', function() { - // 网络恢复时自动重新加载 - setTimeout(() => { - loadData(); - }, 500); -}); - -// 添加错误处理 -window.addEventListener('error', function(e) { - console.error('页面错误:', e.error); -}); - -// 添加未处理的Promise拒绝监听 -window.addEventListener('unhandledrejection', function(e) { - console.error('未处理的Promise拒绝:', e.reason); - e.preventDefault(); -}); - -// 添加触摸设备的优化 -if ('ontouchstart' in window) { - // 为触摸设备添加触摸反馈 - document.addEventListener('touchstart', function() {}, { passive: true }); -} - -// 添加键盘导航支持 -document.addEventListener('keydown', function(e) { - if (e.key === 'F5' || (e.ctrlKey && e.key === 'r')) { - e.preventDefault(); - loadData(); - } -}); - -// 导出函数供全局使用 -window.loadData = loadData; \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/styles.css b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/styles.css deleted file mode 100755 index a925070e..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/styles.css +++ /dev/null @@ -1,299 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: #2c3e50; - overflow-x: hidden; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 16px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - text-align: center; - padding: 24px 0; - border-bottom: 2px solid #a8e6cf; - margin-bottom: 24px; -} - -.title { - font-size: 28px; - font-weight: 700; - color: #27ae60; - margin-bottom: 8px; - text-shadow: 0 2px 4px rgba(39, 174, 96, 0.1); -} - -.subtitle { - font-size: 14px; - color: #7f8c8d; - font-weight: 400; -} - -/* 主内容区域 */ -.main-content { - flex: 1; - position: relative; -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 60px 20px; - color: #27ae60; -} - -.loading-spinner { - width: 40px; - height: 40px; - border: 3px solid #a8e6cf; - border-top: 3px solid #27ae60; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 16px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 错误信息 */ -.error-message { - text-align: center; - padding: 40px 20px; - color: #e74c3c; -} - -.retry-btn { - background: #27ae60; - color: white; - border: none; - padding: 10px 20px; - border-radius: 20px; - cursor: pointer; - font-size: 14px; - margin-top: 16px; - transition: background 0.3s ease; -} - -.retry-btn:hover { - background: #219a52; -} - -/* 热点列表 */ -.hot-list { - display: grid; - gap: 12px; -} - -.hot-item { - background: #ffffff; - border: 1px solid #e8f5e8; - border-radius: 12px; - padding: 16px; - transition: all 0.3s ease; - box-shadow: 0 2px 8px rgba(39, 174, 96, 0.08); - position: relative; - overflow: hidden; -} - -.hot-item:hover { - transform: translateY(-2px); - box-shadow: 0 4px 16px rgba(39, 174, 96, 0.15); - border-color: #a8e6cf; -} - -.hot-item::before { - content: ''; - position: absolute; - left: 0; - top: 0; - width: 4px; - height: 100%; - background: linear-gradient(to bottom, #27ae60, #a8e6cf); -} - -.item-header { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 8px; -} - -.rank { - background: linear-gradient(135deg, #27ae60, #2ecc71); - color: white; - width: 28px; - height: 28px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-weight: 700; - font-size: 14px; - flex-shrink: 0; -} - -.rank.top3 { - background: linear-gradient(135deg, #f39c12, #e67e22); -} - -.word-type { - display: flex; - align-items: center; - gap: 4px; -} - -.type-icon { - width: 16px; - height: 16px; - object-fit: contain; -} - -.type-text { - font-size: 12px; - padding: 2px 8px; - border-radius: 10px; - font-weight: 500; -} - -.type-hot { - background: #ffe6e6; - color: #e74c3c; -} - -.type-new { - background: #e6f3ff; - color: #3498db; -} - -.item-content { - margin-bottom: 8px; -} - -.item-title { - font-size: 16px; - font-weight: 600; - color: #2c3e50; - line-height: 1.4; - margin-bottom: 4px; - cursor: pointer; - transition: color 0.3s ease; -} - -.item-title:hover { - color: #27ae60; -} - -.item-score { - font-size: 14px; - color: #7f8c8d; - font-weight: 500; -} - -/* 底部 */ -.footer { - text-align: center; - padding: 24px 0; - border-top: 1px solid #e8f5e8; - margin-top: 32px; -} - -.update-time { - font-size: 12px; - color: #95a5a6; -} - -/* 手机端优化 (默认) */ -@media (max-width: 768px) { - .container { - padding: 0 12px; - } - - .header { - padding: 20px 0; - } - - .title { - font-size: 24px; - } - - .subtitle { - font-size: 13px; - } - - .hot-item { - padding: 14px; - } - - .item-title { - font-size: 15px; - } - - .rank { - width: 26px; - height: 26px; - font-size: 13px; - } -} - -/* 平板端适配 */ -@media (min-width: 769px) and (max-width: 1024px) { - .container { - padding: 0 24px; - } - - .hot-list { - grid-template-columns: repeat(2, 1fr); - gap: 16px; - } - - .title { - font-size: 32px; - } -} - -/* 电脑端适配 */ -@media (min-width: 1025px) { - .container { - padding: 0 32px; - } - - .hot-list { - grid-template-columns: repeat(2, 1fr); - gap: 20px; - } - - .title { - font-size: 36px; - } - - .hot-item { - padding: 20px; - } - - .item-title { - font-size: 17px; - } -} - -/* 大屏幕优化 */ -@media (min-width: 1400px) { - .hot-list { - grid-template-columns: repeat(3, 1fr); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/返回接口.json deleted file mode 100755 index 60506d2b..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/返回接口.json +++ /dev/null @@ -1,166 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "rank": 1, - "title": "九三阅兵", - "score": "908.5w", - "word_type": "热", - "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5&type=51" - }, - { - "rank": 2, - "title": "我镜头下的中式建筑美学", - "score": "872.9w", - "word_type": "新", - "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%88%91%E9%95%9C%E5%A4%B4%E4%B8%8B%E7%9A%84%E4%B8%AD%E5%BC%8F%E5%BB%BA%E7%AD%91%E7%BE%8E%E5%AD%A6&type=51" - }, - { - "rank": 3, - "title": "原来人机感才是出片的秘诀", - "score": "754.4w", - "word_type": "无", - "work_type_icon": "", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%8E%9F%E6%9D%A5%E4%BA%BA%E6%9C%BA%E6%84%9F%E6%89%8D%E6%98%AF%E5%87%BA%E7%89%87%E7%9A%84%E7%A7%98%E8%AF%80&type=51" - }, - { - "rank": 4, - "title": "我的二十年航天路", - "score": "703.9w", - "word_type": "热", - "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%88%91%E7%9A%84%E4%BA%8C%E5%8D%81%E5%B9%B4%E8%88%AA%E5%A4%A9%E8%B7%AF&type=51" - }, - { - "rank": 5, - "title": "用横图的方式打开香格里拉", - "score": "458.5w", - "word_type": "新", - "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E7%94%A8%E6%A8%AA%E5%9B%BE%E7%9A%84%E6%96%B9%E5%BC%8F%E6%89%93%E5%BC%80%E9%A6%99%E6%A0%BC%E9%87%8C%E6%8B%89&type=51" - }, - { - "rank": 6, - "title": "我拍到了苏州丰收的景象", - "score": "392w", - "word_type": "无", - "work_type_icon": "", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%88%91%E6%8B%8D%E5%88%B0%E4%BA%86%E8%8B%8F%E5%B7%9E%E4%B8%B0%E6%94%B6%E7%9A%84%E6%99%AF%E8%B1%A1&type=51" - }, - { - "rank": 7, - "title": "我拍下了960万平方公里的中国", - "score": "390.7w", - "word_type": "热", - "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%88%91%E6%8B%8D%E4%B8%8B%E4%BA%86960%E4%B8%87%E5%B9%B3%E6%96%B9%E5%85%AC%E9%87%8C%E7%9A%84%E4%B8%AD%E5%9B%BD&type=51" - }, - { - "rank": 8, - "title": "12岁冰岛少年的川剧变脸梦", - "score": "389.7w", - "word_type": "热", - "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png", - "link": "https://www.xiaohongshu.com/search_result?keyword=12%E5%B2%81%E5%86%B0%E5%B2%9B%E5%B0%91%E5%B9%B4%E7%9A%84%E5%B7%9D%E5%89%A7%E5%8F%98%E8%84%B8%E6%A2%A6&type=51" - }, - { - "rank": 9, - "title": "人生总要去一次阿勒泰吧", - "score": "389.6w", - "word_type": "新", - "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%BA%BA%E7%94%9F%E6%80%BB%E8%A6%81%E5%8E%BB%E4%B8%80%E6%AC%A1%E9%98%BF%E5%8B%92%E6%B3%B0%E5%90%A7&type=51" - }, - { - "rank": 10, - "title": "普通人的10年绘画进步史", - "score": "389.4w", - "word_type": "无", - "work_type_icon": "", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%99%AE%E9%80%9A%E4%BA%BA%E7%9A%8410%E5%B9%B4%E7%BB%98%E7%94%BB%E8%BF%9B%E6%AD%A5%E5%8F%B2&type=51" - }, - { - "rank": 11, - "title": "过生日不要忘记反转镜头", - "score": "389.2w", - "word_type": "热", - "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E8%BF%87%E7%94%9F%E6%97%A5%E4%B8%8D%E8%A6%81%E5%BF%98%E8%AE%B0%E5%8F%8D%E8%BD%AC%E9%95%9C%E5%A4%B4&type=51" - }, - { - "rank": 12, - "title": "低卡又解馋的报恩零食", - "score": "389.2w", - "word_type": "无", - "work_type_icon": "", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%BD%8E%E5%8D%A1%E5%8F%88%E8%A7%A3%E9%A6%8B%E7%9A%84%E6%8A%A5%E6%81%A9%E9%9B%B6%E9%A3%9F&type=51" - }, - { - "rank": 13, - "title": "和爸妈去旅游 我是水印", - "score": "389w", - "word_type": "新", - "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%92%8C%E7%88%B8%E5%A6%88%E5%8E%BB%E6%97%85%E6%B8%B8%20%E6%88%91%E6%98%AF%E6%B0%B4%E5%8D%B0&type=51" - }, - { - "rank": 14, - "title": "一种很新的镜子拍谷法出现了", - "score": "389w", - "word_type": "热", - "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%B8%80%E7%A7%8D%E5%BE%88%E6%96%B0%E7%9A%84%E9%95%9C%E5%AD%90%E6%8B%8D%E8%B0%B7%E6%B3%95%E5%87%BA%E7%8E%B0%E4%BA%86&type=51" - }, - { - "rank": 15, - "title": "二次构图带来的故事感", - "score": "389w", - "word_type": "无", - "work_type_icon": "", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%BA%8C%E6%AC%A1%E6%9E%84%E5%9B%BE%E5%B8%A6%E6%9D%A5%E7%9A%84%E6%95%85%E4%BA%8B%E6%84%9F&type=51" - }, - { - "rank": 16, - "title": "当我在老动画片里找美妆灵感", - "score": "389w", - "word_type": "无", - "work_type_icon": "", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%BD%93%E6%88%91%E5%9C%A8%E8%80%81%E5%8A%A8%E7%94%BB%E7%89%87%E9%87%8C%E6%89%BE%E7%BE%8E%E5%A6%86%E7%81%B5%E6%84%9F&type=51" - }, - { - "rank": 17, - "title": "在蓝调时刻起舞告别夏天", - "score": "389w", - "word_type": "热", - "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%9C%A8%E8%93%9D%E8%B0%83%E6%97%B6%E5%88%BB%E8%B5%B7%E8%88%9E%E5%91%8A%E5%88%AB%E5%A4%8F%E5%A4%A9&type=51" - }, - { - "rank": 18, - "title": "人生建议:去看一次鱼灯巡游", - "score": "389w", - "word_type": "无", - "work_type_icon": "", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%BA%BA%E7%94%9F%E5%BB%BA%E8%AE%AE%EF%BC%9A%E5%8E%BB%E7%9C%8B%E4%B8%80%E6%AC%A1%E9%B1%BC%E7%81%AF%E5%B7%A1%E6%B8%B8&type=51" - }, - { - "rank": 19, - "title": "夜晚的树是大自然送给天空的星星", - "score": "389w", - "word_type": "新", - "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%A4%9C%E6%99%9A%E7%9A%84%E6%A0%91%E6%98%AF%E5%A4%A7%E8%87%AA%E7%84%B6%E9%80%81%E7%BB%99%E5%A4%A9%E7%A9%BA%E7%9A%84%E6%98%9F%E6%98%9F&type=51" - }, - { - "rank": 20, - "title": "欢迎收看老师开学的一天", - "score": "389w", - "word_type": "无", - "work_type_icon": "", - "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%AC%A2%E8%BF%8E%E6%94%B6%E7%9C%8B%E8%80%81%E5%B8%88%E5%BC%80%E5%AD%A6%E7%9A%84%E4%B8%80%E5%A4%A9&type=51" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/background.css deleted file mode 100755 index d7719878..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/background.css +++ /dev/null @@ -1,37 +0,0 @@ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; - background-color: #f8f9fa; -} - -.modern-gradient { - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 135deg, - rgba(230, 22, 45, 0.4) 0%, - rgba(245, 80, 80, 0.3) 25%, - rgba(250, 120, 110, 0.2) 50%, - rgba(255, 140, 140, 0.3) 75%, - rgba(255, 90, 90, 0.4) 100% - ); - animation: gradient-flow 20s ease-in-out infinite; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -@keyframes rainbow-rotate { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/style.css deleted file mode 100755 index c73ae589..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/style.css +++ /dev/null @@ -1,384 +0,0 @@ -/* 背景样式 */ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; - background-color: #f8f9fa; -} - -.modern-gradient { - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 135deg, - rgba(64, 169, 255, 0.4) 0%, - rgba(120, 192, 255, 0.3) 25%, - rgba(255, 175, 64, 0.2) 50%, - rgba(255, 140, 50, 0.3) 75%, - rgba(255, 122, 69, 0.4) 100% - ); - animation: gradient-flow 20s ease-in-out infinite; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -.modern-gradient::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: radial-gradient( - circle at 30% 70%, - rgba(64, 169, 255, 0.5) 0%, - transparent 50% - ), radial-gradient( - circle at 70% 30%, - rgba(255, 140, 50, 0.4) 0%, - transparent 50% - ); - animation: pulse-effect 15s ease-in-out infinite alternate; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -@keyframes gradient-flow { - 0%, 100% { - transform: rotate(0deg) scale(1); - opacity: 0.8; - } - 25% { - transform: rotate(90deg) scale(1.1); - opacity: 0.6; - } - 50% { - transform: rotate(180deg) scale(0.9); - opacity: 0.9; - } - 75% { - transform: rotate(270deg) scale(1.05); - opacity: 0.7; - } -} - -@keyframes pulse-effect { - 0% { - transform: scale(1) rotate(0deg); - opacity: 0.5; - } - 50% { - transform: scale(1.2) rotate(180deg); - opacity: 0.8; - } - 100% { - transform: scale(1) rotate(360deg); - opacity: 0.6; - } -} - -/* 主样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; - color: #333; - background-color: #f8f9fa; - position: relative; - min-height: 100vh; -} - -/* 微博Logo样式 */ -.title-container { - display: flex; - flex-direction: column; - align-items: center; - margin-bottom: 10px; -} - -.weibo-logo-container { - margin-top: 10px; -} - -.weibo-logo { - background-color: #e6162d; - color: white; - font-weight: bold; - padding: 4px 10px; - border-radius: 15px; - font-size: 16px; - display: inline-block; - box-shadow: 0 2px 5px rgba(0,0,0,0.2); -} - -/* Q版眨眼动画样式 */ -.qeye-container { - display: flex; - justify-content: center; - margin-bottom: 10px; -} - -.qeye { - width: 80px; - height: 48px; -} - -.container { - max-width: 800px; - margin: 0 auto; - padding: 24px; - position: relative; - z-index: 1; - background-color: rgba(255, 255, 255, 0.85); - border-radius: 16px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08); - backdrop-filter: blur(10px); -} - -header { - text-align: center; - margin-bottom: 28px; - padding-bottom: 20px; - border-bottom: 1px solid rgba(0, 0, 0, 0.06); -} - -header h1 { - background: linear-gradient(135deg, #4096ff, #ff7a45); - -webkit-background-clip: text; - background-clip: text; - color: transparent; - margin-bottom: 14px; - font-size: 2.4rem; - font-weight: 700; - letter-spacing: -0.5px; -} - -.update-time { - color: #666; - font-size: 0.9rem; - background-color: rgba(0, 0, 0, 0.03); - padding: 8px 16px; - border-radius: 24px; - display: inline-block; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); -} - -.hot-list { - list-style: none; -} - -.hot-item { - padding: 20px; - margin-bottom: 16px; - border-radius: 12px; - background-color: white; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04); - transition: all 0.3s ease; - display: flex; - align-items: center; - border: 1px solid rgba(0, 0, 0, 0.03); -} - -.hot-item:hover { - transform: translateY(-3px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); - border-color: rgba(64, 169, 255, 0.3); -} - -.hot-rank { - font-size: 1.2rem; - font-weight: bold; - color: #4096ff; - margin-right: 18px; - min-width: 38px; - text-align: center; - background-color: rgba(64, 169, 255, 0.1); - border-radius: 50%; - width: 38px; - height: 38px; - display: flex; - align-items: center; - justify-content: center; -} - -.hot-rank.top-1 { - background: linear-gradient(135deg, #ff4d4f, #ff7a45); - color: white; -} - -.hot-rank.top-2 { - background: linear-gradient(135deg, #ff7a45, #ffa940); - color: white; -} - -.hot-rank.top-3 { - background: linear-gradient(135deg, #ffa940, #ffec3d); - color: white; -} - -.hot-content { - flex: 1; -} - -.hot-title { - font-size: 1.15rem; - margin-bottom: 8px; - color: #333; - text-decoration: none; - display: block; - line-height: 1.5; - font-weight: 500; - transition: color 0.2s ease; -} - -.hot-title:hover { - color: #4096ff; - text-decoration: none; -} - -.loading { - text-align: center; - padding: 40px; - color: #666; - font-size: 1.1rem; -} - -footer { - text-align: center; - margin-top: 30px; - padding-top: 20px; - border-top: 1px solid rgba(0, 0, 0, 0.06); - color: #666; - font-size: 0.9rem; -} - -/* 响应式设计 */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - max-width: 90%; - padding: 20px; - } - - header h1 { - font-size: 2.2rem; - } - - .hot-item { - padding: 18px; - } - - .hot-title { - font-size: 1.1rem; - } -} - -@media (max-width: 768px) { - body { - background-color: #f8f9fa; - } - - .container { - max-width: 95%; - margin: 12px auto; - padding: 16px; - border-radius: 12px; - } - - header { - margin-bottom: 20px; - padding-bottom: 16px; - } - - header h1 { - font-size: 1.8rem; - margin-bottom: 10px; - } - - .update-time { - font-size: 0.85rem; - padding: 6px 12px; - } - - .hot-item { - padding: 16px; - margin-bottom: 12px; - border-radius: 10px; - flex-direction: row; - align-items: flex-start; - } - - .hot-rank { - font-size: 1.1rem; - margin-right: 14px; - min-width: 32px; - width: 32px; - height: 32px; - margin-top: 2px; - } - - .hot-title { - font-size: 1rem; - line-height: 1.5; - margin-bottom: 6px; - } - - footer { - margin-top: 24px; - padding-top: 16px; - font-size: 0.85rem; - } -} - -@media (max-width: 480px) { - .container { - margin: 8px auto; - padding: 14px; - } - - header h1 { - font-size: 1.6rem; - } - - .hot-item { - padding: 14px; - margin-bottom: 10px; - } - - .hot-rank { - font-size: 1rem; - margin-right: 12px; - min-width: 30px; - width: 30px; - height: 30px; - } - - .hot-title { - font-size: 0.95rem; - } -} - -/* 减少动画以节省电池 */ -@media (prefers-reduced-motion: reduce) { - .modern-gradient, - .modern-gradient::before { - animation: none; - } - - .modern-gradient { - background: linear-gradient( - 135deg, - rgba(64, 169, 255, 0.3) 0%, - rgba(255, 175, 64, 0.2) 50%, - rgba(255, 122, 69, 0.25) 100% - ); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/img/qeye.svg b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/img/qeye.svg deleted file mode 100755 index 43c4ca7d..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/img/qeye.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/index.html deleted file mode 100755 index ec6e1643..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/index.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - 微博热搜榜 - - - - -
    -
    -
    - -
    -
    -

    🌈 微博热搜榜 🌈

    -
    -
    - -
    -
    -
    加载中...
    -
    -
    - -
    -

    数据来源于微博热搜榜

    -
    -
    - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/js/main.js b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/js/main.js deleted file mode 100755 index bd14a76d..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/js/main.js +++ /dev/null @@ -1,91 +0,0 @@ -// API接口列表 -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top/v2/weibo", - "https://60s-cf.viki.moe/v2/weibo", -]; - -// 当前使用的API索引 -let currentApiIndex = 0; - -// DOM元素 -const hotListElement = document.getElementById('hotList'); -const updateTimeElement = document.getElementById('updateTime'); - -// 格式化时间 -function formatDate(date) { - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - - return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; -} - -// 渲染热搜列表 -function renderHotList(data) { - hotListElement.innerHTML = ''; - - data.forEach((item, index) => { - const hotItem = document.createElement('div'); - hotItem.className = 'hot-item'; - - const rankClass = index < 3 ? `top-${index + 1}` : ''; - - hotItem.innerHTML = ` -
    ${index + 1}
    -
    - ${item.title} - ${item.hot_value ? `
    ${item.hot_value}
    ` : ''} -
    - `; - - hotListElement.appendChild(hotItem); - }); - - // 更新时间 - updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`; -} - -// 获取微博热搜数据 -async function fetchWeiboHotList() { - try { - const response = await fetch(API_ENDPOINTS[currentApiIndex]); - - if (!response.ok) { - throw new Error('网络响应不正常'); - } - - const result = await response.json(); - - if (result.code === 200 && result.data) { - renderHotList(result.data); - } else { - throw new Error('数据格式错误'); - } - } catch (error) { - console.error('获取数据失败:', error); - - // 尝试切换到下一个API - currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; - - // 显示错误信息 - hotListElement.innerHTML = ` -
    - 正在尝试其他接口... -
    - `; - - // 延迟后重试 - setTimeout(fetchWeiboHotList, 2000); - } -} - -// 页面加载完成后获取数据 -document.addEventListener('DOMContentLoaded', () => { - fetchWeiboHotList(); - - // 每隔5分钟刷新一次数据 - setInterval(fetchWeiboHotList, 5 * 60 * 1000); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/返回接口.json deleted file mode 100755 index f51566ee..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/返回接口.json +++ /dev/null @@ -1,261 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "title": "00后男生0.6秒飞针采血惊呆患者", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=00%E5%90%8E%E7%94%B7%E7%94%9F0.6%E7%A7%92%E9%A3%9E%E9%92%88%E9%87%87%E8%A1%80%E6%83%8A%E5%91%86%E6%82%A3%E8%80%85" - }, - { - "title": "普京带3位副总理10多位部长到中国", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%99%AE%E4%BA%AC%E5%B8%A63%E4%BD%8D%E5%89%AF%E6%80%BB%E7%90%8610%E5%A4%9A%E4%BD%8D%E9%83%A8%E9%95%BF%E5%88%B0%E4%B8%AD%E5%9B%BD" - }, - { - "title": "始终高举上海精神旗帜", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%A7%8B%E7%BB%88%E9%AB%98%E4%B8%BE%E4%B8%8A%E6%B5%B7%E7%B2%BE%E7%A5%9E%E6%97%97%E5%B8%9C" - }, - { - "title": "女生苦练化妆1年的变化", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%A5%B3%E7%94%9F%E8%8B%A6%E7%BB%83%E5%8C%96%E5%A6%861%E5%B9%B4%E7%9A%84%E5%8F%98%E5%8C%96" - }, - { - "title": "香港1200架无人机重现日本投降矣", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%A6%99%E6%B8%AF1200%E6%9E%B6%E6%97%A0%E4%BA%BA%E6%9C%BA%E9%87%8D%E7%8E%B0%E6%97%A5%E6%9C%AC%E6%8A%95%E9%99%8D%E7%9F%A3" - }, - { - "title": "尚公主全阵容官宣", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%B0%9A%E5%85%AC%E4%B8%BB%E5%85%A8%E9%98%B5%E5%AE%B9%E5%AE%98%E5%AE%A3" - }, - { - "title": "真的可以永远相信刘宇舞台", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E7%9C%9F%E7%9A%84%E5%8F%AF%E4%BB%A5%E6%B0%B8%E8%BF%9C%E7%9B%B8%E4%BF%A1%E5%88%98%E5%AE%87%E8%88%9E%E5%8F%B0" - }, - { - "title": "九三阅兵徒步方队铿锵步伐", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%BE%92%E6%AD%A5%E6%96%B9%E9%98%9F%E9%93%BF%E9%94%B5%E6%AD%A5%E4%BC%90" - }, - { - "title": "唐朝诡事录", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%94%90%E6%9C%9D%E8%AF%A1%E4%BA%8B%E5%BD%95" - }, - { - "title": "抗战胜利80周年第3场记者招待会", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%8A%97%E6%88%98%E8%83%9C%E5%88%A980%E5%91%A8%E5%B9%B4%E7%AC%AC3%E5%9C%BA%E8%AE%B0%E8%80%85%E6%8B%9B%E5%BE%85%E4%BC%9A" - }, - { - "title": "王曼昱钱天一3比2蒯曼孙颖莎", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E7%8E%8B%E6%9B%BC%E6%98%B1%E9%92%B1%E5%A4%A9%E4%B8%803%E6%AF%942%E8%92%AF%E6%9B%BC%E5%AD%99%E9%A2%96%E8%8E%8E" - }, - { - "title": "张维伊对96岁的姥姥说长命百岁", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%BC%A0%E7%BB%B4%E4%BC%8A%E5%AF%B996%E5%B2%81%E7%9A%84%E5%A7%A5%E5%A7%A5%E8%AF%B4%E9%95%BF%E5%91%BD%E7%99%BE%E5%B2%81" - }, - { - "title": "孟子义李昀锐定妆照", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%AD%9F%E5%AD%90%E4%B9%89%E6%9D%8E%E6%98%80%E9%94%90%E5%AE%9A%E5%A6%86%E7%85%A7" - }, - { - "title": "以为张艺兴穿的蓝色抹胸", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E4%BB%A5%E4%B8%BA%E5%BC%A0%E8%89%BA%E5%85%B4%E7%A9%BF%E7%9A%84%E8%93%9D%E8%89%B2%E6%8A%B9%E8%83%B8" - }, - { - "title": "尚公主开机", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%B0%9A%E5%85%AC%E4%B8%BB%E5%BC%80%E6%9C%BA" - }, - { - "title": "心动的信号8", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%BF%83%E5%8A%A8%E7%9A%84%E4%BF%A1%E5%8F%B78" - }, - { - "title": "霍建华病娇疯批演爽了", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%9C%8D%E5%BB%BA%E5%8D%8E%E7%97%85%E5%A8%87%E7%96%AF%E6%89%B9%E6%BC%94%E7%88%BD%E4%BA%86" - }, - { - "title": "普京抵达天津", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%99%AE%E4%BA%AC%E6%8A%B5%E8%BE%BE%E5%A4%A9%E6%B4%A5" - }, - { - "title": "龚俊的体面只给旅游前几天", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%BE%9A%E4%BF%8A%E7%9A%84%E4%BD%93%E9%9D%A2%E5%8F%AA%E7%BB%99%E6%97%85%E6%B8%B8%E5%89%8D%E5%87%A0%E5%A4%A9" - }, - { - "title": "开学焦虑更严重的另有其人", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%BC%80%E5%AD%A6%E7%84%A6%E8%99%91%E6%9B%B4%E4%B8%A5%E9%87%8D%E7%9A%84%E5%8F%A6%E6%9C%89%E5%85%B6%E4%BA%BA" - }, - { - "title": "那英小发雷霆", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%82%A3%E8%8B%B1%E5%B0%8F%E5%8F%91%E9%9B%B7%E9%9C%86" - }, - { - "title": "居然有演员一句台词背1小时", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%B1%85%E7%84%B6%E6%9C%89%E6%BC%94%E5%91%98%E4%B8%80%E5%8F%A5%E5%8F%B0%E8%AF%8D%E8%83%8C1%E5%B0%8F%E6%97%B6" - }, - { - "title": "谁教魏哲鸣冷脸跳这些的", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%B0%81%E6%95%99%E9%AD%8F%E5%93%B2%E9%B8%A3%E5%86%B7%E8%84%B8%E8%B7%B3%E8%BF%99%E4%BA%9B%E7%9A%84" - }, - { - "title": "朱孝天爆冷出局", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%9C%B1%E5%AD%9D%E5%A4%A9%E7%88%86%E5%86%B7%E5%87%BA%E5%B1%80" - }, - { - "title": "俄军称掌握战略主动权", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E4%BF%84%E5%86%9B%E7%A7%B0%E6%8E%8C%E6%8F%A1%E6%88%98%E7%95%A5%E4%B8%BB%E5%8A%A8%E6%9D%83" - }, - { - "title": "谈恋爱3个月定律", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%B0%88%E6%81%8B%E7%88%B13%E4%B8%AA%E6%9C%88%E5%AE%9A%E5%BE%8B" - }, - { - "title": "沈腾说错了最怕人笨还不勤快", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%B2%88%E8%85%BE%E8%AF%B4%E9%94%99%E4%BA%86%E6%9C%80%E6%80%95%E4%BA%BA%E7%AC%A8%E8%BF%98%E4%B8%8D%E5%8B%A4%E5%BF%AB" - }, - { - "title": "王菲最新状态", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E7%8E%8B%E8%8F%B2%E6%9C%80%E6%96%B0%E7%8A%B6%E6%80%81" - }, - { - "title": "张紫宁转行当拉拉队经理人了", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%BC%A0%E7%B4%AB%E5%AE%81%E8%BD%AC%E8%A1%8C%E5%BD%93%E6%8B%89%E6%8B%89%E9%98%9F%E7%BB%8F%E7%90%86%E4%BA%BA%E4%BA%86" - }, - { - "title": "金价大涨两大原因", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%87%91%E4%BB%B7%E5%A4%A7%E6%B6%A8%E4%B8%A4%E5%A4%A7%E5%8E%9F%E5%9B%A0" - }, - { - "title": "陕西Shaanxi官方标准拼音", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%99%95%E8%A5%BFShaanxi%E5%AE%98%E6%96%B9%E6%A0%87%E5%87%86%E6%8B%BC%E9%9F%B3" - }, - { - "title": "边伯贤跳刀马刀马", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%BE%B9%E4%BC%AF%E8%B4%A4%E8%B7%B3%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC" - }, - { - "title": "冷冻太久的肉就不要再吃了", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%86%B7%E5%86%BB%E5%A4%AA%E4%B9%85%E7%9A%84%E8%82%89%E5%B0%B1%E4%B8%8D%E8%A6%81%E5%86%8D%E5%90%83%E4%BA%86" - }, - { - "title": "95后00后恋爱有代沟", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=95%E5%90%8E00%E5%90%8E%E6%81%8B%E7%88%B1%E6%9C%89%E4%BB%A3%E6%B2%9F" - }, - { - "title": "易烊千玺抢票", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA%E6%8A%A2%E7%A5%A8" - }, - { - "title": "孙闻被乒协处罚", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%AD%99%E9%97%BB%E8%A2%AB%E4%B9%92%E5%8D%8F%E5%A4%84%E7%BD%9A" - }, - { - "title": "这居然是白举纲", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%BF%99%E5%B1%85%E7%84%B6%E6%98%AF%E7%99%BD%E4%B8%BE%E7%BA%B2" - }, - { - "title": "纪凌尘出演孟子义新剧", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E7%BA%AA%E5%87%8C%E5%B0%98%E5%87%BA%E6%BC%94%E5%AD%9F%E5%AD%90%E4%B9%89%E6%96%B0%E5%89%A7" - }, - { - "title": "外卖员妈妈暴雨中将孩子托付派出所", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%A4%96%E5%8D%96%E5%91%98%E5%A6%88%E5%A6%88%E6%9A%B4%E9%9B%A8%E4%B8%AD%E5%B0%86%E5%AD%A9%E5%AD%90%E6%89%98%E4%BB%98%E6%B4%BE%E5%87%BA%E6%89%80" - }, - { - "title": "我点外卖没用上券就这样", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%88%91%E7%82%B9%E5%A4%96%E5%8D%96%E6%B2%A1%E7%94%A8%E4%B8%8A%E5%88%B8%E5%B0%B1%E8%BF%99%E6%A0%B7" - }, - { - "title": "孙颖莎小时候真来过新疆", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%AD%99%E9%A2%96%E8%8E%8E%E5%B0%8F%E6%97%B6%E5%80%99%E7%9C%9F%E6%9D%A5%E8%BF%87%E6%96%B0%E7%96%86" - }, - { - "title": "印尼首都交通瘫痪", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%8D%B0%E5%B0%BC%E9%A6%96%E9%83%BD%E4%BA%A4%E9%80%9A%E7%98%AB%E7%97%AA" - }, - { - "title": "停狗位停满了小狗", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%81%9C%E7%8B%97%E4%BD%8D%E5%81%9C%E6%BB%A1%E4%BA%86%E5%B0%8F%E7%8B%97" - }, - { - "title": "怪不得校服裤子屁股锃亮", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%80%AA%E4%B8%8D%E5%BE%97%E6%A0%A1%E6%9C%8D%E8%A3%A4%E5%AD%90%E5%B1%81%E8%82%A1%E9%94%83%E4%BA%AE" - }, - { - "title": "这一幕幕中国浪漫看得心暖暖", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%BF%99%E4%B8%80%E5%B9%95%E5%B9%95%E4%B8%AD%E5%9B%BD%E6%B5%AA%E6%BC%AB%E7%9C%8B%E5%BE%97%E5%BF%83%E6%9A%96%E6%9A%96" - }, - { - "title": "林书豪退役", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%9E%97%E4%B9%A6%E8%B1%AA%E9%80%80%E5%BD%B9" - }, - { - "title": "小猫咪舔毛把自己累睡着", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%B0%8F%E7%8C%AB%E5%92%AA%E8%88%94%E6%AF%9B%E6%8A%8A%E8%87%AA%E5%B7%B1%E7%B4%AF%E7%9D%A1%E7%9D%80" - }, - { - "title": "iPhone17国行预计涨价500元", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=iPhone17%E5%9B%BD%E8%A1%8C%E9%A2%84%E8%AE%A1%E6%B6%A8%E4%BB%B7500%E5%85%83" - }, - { - "title": "土耳其总统埃尔多安抵达天津", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%9C%9F%E8%80%B3%E5%85%B6%E6%80%BB%E7%BB%9F%E5%9F%83%E5%B0%94%E5%A4%9A%E5%AE%89%E6%8A%B5%E8%BE%BE%E5%A4%A9%E6%B4%A5" - }, - { - "title": "脱口秀和Ta的朋友们", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%84%B1%E5%8F%A3%E7%A7%80%E5%92%8CTa%E7%9A%84%E6%9C%8B%E5%8F%8B%E4%BB%AC" - }, - { - "title": "孟子义暮晚摇", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%AD%9F%E5%AD%90%E4%B9%89%E6%9A%AE%E6%99%9A%E6%91%87" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/api.js b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/api.js deleted file mode 100755 index e171569d..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/api.js +++ /dev/null @@ -1,180 +0,0 @@ -/** - * 懂车帝热搜API模块 - * 负责数据获取、验证和格式化 - */ -class CarHotTopicsAPI { - constructor() { - this.baseURL = 'https://60s.api.shumengya.top/v2/dongchedi'; - this.timeout = 10000; // 10秒超时 - this.retryCount = 3; - this.retryDelay = 1000; // 1秒重试延迟 - } - - /** - * 获取热搜数据 - * @param {string} encoding - 编码格式(可选) - * @returns {Promise} 热搜数据 - */ - async fetchHotTopics(encoding = '') { - const url = encoding ? `${this.baseURL}?encoding=${encodeURIComponent(encoding)}` : this.baseURL; - - for (let attempt = 1; attempt <= this.retryCount; attempt++) { - try { - console.log(`[API] 尝试获取数据 (${attempt}/${this.retryCount}): ${url}`); - - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), this.timeout); - - const response = await fetch(url, { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' - }, - signal: controller.signal - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - console.log('[API] 数据获取成功:', data); - - // 验证数据格式 - const validatedData = this.validateData(data); - return this.formatData(validatedData); - - } catch (error) { - console.error(`[API] 第${attempt}次请求失败:`, error.message); - - if (attempt === this.retryCount) { - throw new Error(`获取数据失败: ${error.message}`); - } - - // 等待后重试 - await this.delay(this.retryDelay * attempt); - } - } - } - - /** - * 验证API返回数据格式 - * @param {Object} data - API返回的原始数据 - * @returns {Object} 验证后的数据 - */ - validateData(data) { - if (!data || typeof data !== 'object') { - throw new Error('数据格式错误:响应不是有效的JSON对象'); - } - - if (data.code !== 200) { - throw new Error(`API错误:${data.message || '未知错误'}`); - } - - if (!Array.isArray(data.data)) { - throw new Error('数据格式错误:data字段不是数组'); - } - - // 验证每个热搜项目的必需字段 - data.data.forEach((item, index) => { - const requiredFields = ['rank', 'title', 'score', 'score_desc']; - const missingFields = requiredFields.filter(field => !(field in item)); - - if (missingFields.length > 0) { - console.warn(`[API] 第${index + 1}项数据缺少字段:`, missingFields); - } - }); - - return data; - } - - /** - * 格式化数据 - * @param {Object} data - 验证后的数据 - * @returns {Object} 格式化后的数据 - */ - formatData(data) { - const formattedTopics = data.data.map(item => ({ - rank: parseInt(item.rank) || 0, - title: String(item.title || '').trim(), - score: parseInt(item.score) || 0, - scoreDesc: String(item.score_desc || '').trim(), - // 添加一些计算字段 - isTop3: parseInt(item.rank) <= 3, - formattedScore: this.formatScore(item.score), - searchUrl: this.generateSearchUrl(item.title) - })); - - return { - code: data.code, - message: data.message, - data: formattedTopics, - updateTime: new Date().toLocaleString('zh-CN'), - total: formattedTopics.length - }; - } - - /** - * 格式化分数显示 - * @param {number} score - 原始分数 - * @returns {string} 格式化后的分数 - */ - formatScore(score) { - if (!score || isNaN(score)) return '0'; - - if (score >= 10000) { - return (score / 10000).toFixed(1) + 'w'; - } - - return score.toLocaleString(); - } - - /** - * 生成搜索URL - * @param {string} title - 热搜标题 - * @returns {string} 搜索URL - */ - generateSearchUrl(title) { - const encodedTitle = encodeURIComponent(title); - return `https://www.dongchedi.com/search?query=${encodedTitle}`; - } - - /** - * 延迟函数 - * @param {number} ms - 延迟毫秒数 - * @returns {Promise} Promise对象 - */ - delay(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - /** - * 获取API状态 - * @returns {Promise} API状态信息 - */ - async getAPIStatus() { - try { - const startTime = Date.now(); - await this.fetchHotTopics(); - const responseTime = Date.now() - startTime; - - return { - status: 'online', - responseTime: responseTime, - message: 'API服务正常' - }; - } catch (error) { - return { - status: 'offline', - responseTime: null, - message: error.message - }; - } - } -} - -// 导出API实例 -window.CarHotTopicsAPI = CarHotTopicsAPI; \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/app.js b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/app.js deleted file mode 100755 index 65a677a7..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/app.js +++ /dev/null @@ -1,313 +0,0 @@ -/** - * 懂车帝热搜应用主程序 - * 整合API和UI模块,管理应用生命周期 - */ -class CarHotTopicsApp { - constructor() { - this.api = null; - this.ui = null; - this.autoRefreshInterval = null; - this.autoRefreshDelay = 5 * 60 * 1000; // 5分钟自动刷新 - this.isInitialized = false; - - this.init(); - } - - /** - * 初始化应用 - */ - async init() { - try { - console.log('[App] 开始初始化懂车帝热搜应用...'); - - // 等待DOM加载完成 - if (document.readyState === 'loading') { - await new Promise(resolve => { - document.addEventListener('DOMContentLoaded', resolve); - }); - } - - // 检查必需的类是否存在 - if (!window.CarHotTopicsAPI || !window.UIManager) { - throw new Error('缺少必需的模块:CarHotTopicsAPI 或 UIManager'); - } - - // 初始化模块 - this.api = new window.CarHotTopicsAPI(); - this.ui = new window.UIManager(); - - // 检查必需的DOM元素 - this.checkRequiredElements(); - - // 绑定事件 - this.bindEvents(); - - // 首次加载数据 - await this.loadData(); - - // 设置自动刷新 - this.setupAutoRefresh(); - - // 设置页面可见性监听 - this.setupVisibilityListener(); - - this.isInitialized = true; - console.log('[App] 应用初始化完成'); - - } catch (error) { - console.error('[App] 初始化失败:', error); - this.handleInitError(error); - } - } - - /** - * 检查必需的DOM元素 - */ - checkRequiredElements() { - const requiredIds = ['loading', 'error', 'hotList', 'topicsContainer', 'refreshBtn']; - const missingElements = requiredIds.filter(id => !document.getElementById(id)); - - if (missingElements.length > 0) { - throw new Error(`缺少必需的DOM元素: ${missingElements.join(', ')}`); - } - } - - /** - * 绑定事件监听器 - */ - bindEvents() { - // 监听UI触发的刷新事件 - document.addEventListener('refreshData', () => { - this.handleManualRefresh(); - }); - - // 监听网络状态变化 - window.addEventListener('online', () => { - console.log('[App] 网络已连接,尝试刷新数据'); - this.ui.showToast('网络已连接'); - this.loadData(); - }); - - window.addEventListener('offline', () => { - console.log('[App] 网络已断开'); - this.ui.showToast('网络连接已断开'); - }); - - // 监听页面错误 - window.addEventListener('error', (event) => { - console.error('[App] 页面错误:', event.error); - }); - - // 监听未处理的Promise拒绝 - window.addEventListener('unhandledrejection', (event) => { - console.error('[App] 未处理的Promise拒绝:', event.reason); - event.preventDefault(); - }); - } - - /** - * 加载热搜数据 - * @param {boolean} showLoading - 是否显示加载状态 - */ - async loadData(showLoading = true) { - try { - if (showLoading) { - this.ui.showLoading(); - } - - console.log('[App] 开始加载热搜数据...'); - const data = await this.api.fetchHotTopics(); - - console.log('[App] 数据加载成功:', data); - this.ui.showHotList(data); - - // 重置自动刷新计时器 - this.resetAutoRefresh(); - - } catch (error) { - console.error('[App] 数据加载失败:', error); - this.ui.showError(error.message); - - // 如果是网络错误,延迟重试 - if (this.isNetworkError(error)) { - setTimeout(() => { - if (navigator.onLine) { - this.loadData(false); - } - }, 30000); // 30秒后重试 - } - } - } - - /** - * 处理手动刷新 - */ - async handleManualRefresh() { - console.log('[App] 手动刷新数据'); - await this.loadData(); - } - - /** - * 设置自动刷新 - */ - setupAutoRefresh() { - if (this.autoRefreshInterval) { - clearInterval(this.autoRefreshInterval); - } - - this.autoRefreshInterval = setInterval(() => { - if (document.visibilityState === 'visible' && navigator.onLine) { - console.log('[App] 自动刷新数据'); - this.loadData(false); - } - }, this.autoRefreshDelay); - - console.log(`[App] 自动刷新已设置,间隔: ${this.autoRefreshDelay / 1000}秒`); - } - - /** - * 重置自动刷新计时器 - */ - resetAutoRefresh() { - this.setupAutoRefresh(); - } - - /** - * 设置页面可见性监听 - */ - setupVisibilityListener() { - document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'visible') { - console.log('[App] 页面变为可见'); - - // 检查数据是否需要更新 - const currentData = this.ui.getCurrentData(); - if (currentData) { - const lastUpdate = new Date(currentData.updateTime); - const now = new Date(); - const timeDiff = now - lastUpdate; - - // 如果数据超过3分钟,自动刷新 - if (timeDiff > 3 * 60 * 1000) { - console.log('[App] 数据已过期,自动刷新'); - this.loadData(false); - } - } - } else { - console.log('[App] 页面变为隐藏'); - } - }); - } - - /** - * 判断是否为网络错误 - * @param {Error} error - 错误对象 - * @returns {boolean} 是否为网络错误 - */ - isNetworkError(error) { - const networkErrorMessages = [ - 'fetch', - 'network', - 'timeout', - 'connection', - 'offline' - ]; - - return networkErrorMessages.some(msg => - error.message.toLowerCase().includes(msg) - ); - } - - /** - * 处理初始化错误 - * @param {Error} error - 错误对象 - */ - handleInitError(error) { - // 显示基本错误信息 - const errorContainer = document.getElementById('error'); - if (errorContainer) { - errorContainer.style.display = 'flex'; - const errorMessage = errorContainer.querySelector('.error-message'); - if (errorMessage) { - errorMessage.textContent = `初始化失败: ${error.message}`; - } - } - - // 隐藏加载状态 - const loadingContainer = document.getElementById('loading'); - if (loadingContainer) { - loadingContainer.style.display = 'none'; - } - } - - /** - * 获取应用状态 - * @returns {Object} 应用状态信息 - */ - getStatus() { - return { - isInitialized: this.isInitialized, - hasData: !!this.ui?.getCurrentData(), - autoRefreshEnabled: !!this.autoRefreshInterval, - isOnline: navigator.onLine, - isVisible: document.visibilityState === 'visible' - }; - } - - /** - * 销毁应用 - */ - destroy() { - console.log('[App] 销毁应用'); - - if (this.autoRefreshInterval) { - clearInterval(this.autoRefreshInterval); - this.autoRefreshInterval = null; - } - - if (this.ui) { - this.ui.clearData(); - } - - this.isInitialized = false; - } -} - -// 全局错误处理 -window.addEventListener('error', (event) => { - console.error('[Global] JavaScript错误:', { - message: event.message, - filename: event.filename, - lineno: event.lineno, - colno: event.colno, - error: event.error - }); -}); - -window.addEventListener('unhandledrejection', (event) => { - console.error('[Global] 未处理的Promise拒绝:', event.reason); -}); - -// 应用启动 -let app; - -// 确保在DOM加载完成后启动应用 -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', () => { - app = new CarHotTopicsApp(); - }); -} else { - app = new CarHotTopicsApp(); -} - -// 导出应用实例(用于调试) -window.CarHotTopicsApp = CarHotTopicsApp; -window.app = app; - -// 调试信息 -console.log('[App] 懂车帝热搜应用脚本已加载'); -console.log('[Debug] 可用的全局对象:', { - CarHotTopicsAPI: !!window.CarHotTopicsAPI, - UIManager: !!window.UIManager, - CarHotTopicsApp: !!window.CarHotTopicsApp -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/background.css deleted file mode 100755 index ca247e00..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/background.css +++ /dev/null @@ -1,55 +0,0 @@ -/* 背景样式文件 */ -body { - background: linear-gradient(135deg, #e8f5e8 0%, #f0f8f0 25%, #f5f9f5 50%, #fafcfa 75%, #ffffff 100%); - background-attachment: fixed; - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; -} - -/* 背景动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 容器背景 */ -.container { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(10px); - border-radius: 20px; - margin-top: 20px; - margin-bottom: 20px; - box-shadow: 0 8px 32px rgba(139, 195, 74, 0.1); -} - -/* 移动端背景优化 */ -@media (max-width: 767px) { - body { - background-attachment: scroll; - } - - .container { - margin-top: 10px; - margin-bottom: 10px; - border-radius: 16px; - } -} - -/* 深色模式支持 */ -@media (prefers-color-scheme: dark) { - body { - background: linear-gradient(135deg, #1a2e1a 0%, #2d4a2d 25%, #3a5a3a 50%, #4a6a4a 75%, #5a7a5a 100%); - } - - .container { - background: rgba(0, 0, 0, 0.2); - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/index.html deleted file mode 100755 index 7ee397bf..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/index.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - 懂车帝热搜榜单 - - - - - -
    - -
    - - -
    - - -
    - -
    -
    -

    正在加载热搜数据...

    -
    - - - - - - -
    - - -
    - -
    -
    - - -
    - - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/styles.css b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/styles.css deleted file mode 100755 index c8285093..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/styles.css +++ /dev/null @@ -1,532 +0,0 @@ -/* 全局样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: #333; - min-height: 100vh; - overflow-x: hidden; -} - -/* 容器布局 */ -.container { - max-width: 1200px; - margin: 0 auto; - min-height: 100vh; - display: flex; - flex-direction: column; - padding: 0 16px; -} - -/* 头部样式 */ -.header { - display: flex; - justify-content: space-between; - align-items: center; - padding: 20px 0; - border-bottom: 1px solid rgba(139, 195, 74, 0.2); - margin-bottom: 20px; -} - -.logo { - display: flex; - align-items: center; - gap: 12px; -} - -.logo i { - font-size: 28px; - color: #8bc34a; - background: linear-gradient(135deg, #a5d6a7, #81c784); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.logo h1 { - font-size: 24px; - font-weight: 600; - color: #2e7d32; - margin: 0; -} - -.refresh-btn { - display: flex; - align-items: center; - gap: 8px; - padding: 10px 16px; - background: linear-gradient(135deg, #a5d6a7, #81c784); - color: white; - border: none; - border-radius: 20px; - cursor: pointer; - font-size: 14px; - font-weight: 500; - transition: all 0.3s ease; - box-shadow: 0 2px 8px rgba(139, 195, 74, 0.3); -} - -.refresh-btn:hover { - background: linear-gradient(135deg, #81c784, #66bb6a); - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(139, 195, 74, 0.4); -} - -.refresh-btn:active { - transform: translateY(0); -} - -.refresh-btn i { - font-size: 14px; -} - -.refresh-btn.loading i { - animation: spin 1s linear infinite; -} - -/* 主内容区域 */ -.main-content { - flex: 1; - position: relative; -} - -/* 加载状态 */ -.loading { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 60px 20px; - text-align: center; -} - -.loading-spinner { - width: 40px; - height: 40px; - border: 3px solid rgba(139, 195, 74, 0.2); - border-top: 3px solid #8bc34a; - border-radius: 50%; - animation: spin 1s linear infinite; - margin-bottom: 16px; -} - -.loading p { - color: #666; - font-size: 16px; -} - -/* 错误状态 */ -.error { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 60px 20px; - text-align: center; -} - -.error-icon i { - font-size: 48px; - color: #ff7043; - margin-bottom: 16px; -} - -.error-message { - color: #666; - font-size: 16px; - margin-bottom: 20px; -} - -.retry-btn { - padding: 10px 20px; - background: linear-gradient(135deg, #a5d6a7, #81c784); - color: white; - border: none; - border-radius: 20px; - cursor: pointer; - font-size: 14px; - transition: all 0.3s ease; -} - -.retry-btn:hover { - background: linear-gradient(135deg, #81c784, #66bb6a); -} - -/* 热搜列表 */ -.hot-list { - animation: fadeIn 0.5s ease-in; -} - -.list-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 20px; - padding-bottom: 12px; - border-bottom: 2px solid rgba(139, 195, 74, 0.2); -} - -.list-header h2 { - font-size: 20px; - font-weight: 600; - color: #2e7d32; - margin: 0; -} - -.update-time { - font-size: 12px; - color: #666; - background: rgba(139, 195, 74, 0.1); - padding: 4px 8px; - border-radius: 12px; -} - -.topics-container { - display: grid; - gap: 12px; -} - -/* 热搜项目 */ -.topic-item { - background: white; - border-radius: 12px; - padding: 16px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); - border: 1px solid rgba(139, 195, 74, 0.1); - transition: all 0.3s ease; - cursor: pointer; - position: relative; - overflow: hidden; -} - -.topic-item:hover { - transform: translateY(-2px); - box-shadow: 0 4px 16px rgba(139, 195, 74, 0.15); - border-color: rgba(139, 195, 74, 0.3); -} - -.topic-item::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 4px; - height: 100%; - background: linear-gradient(135deg, #a5d6a7, #81c784); - opacity: 0; - transition: opacity 0.3s ease; -} - -.topic-item:hover::before { - opacity: 1; -} - -.topic-header { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 8px; -} - -.rank-badge { - display: flex; - align-items: center; - justify-content: center; - width: 24px; - height: 24px; - border-radius: 50%; - font-size: 12px; - font-weight: 600; - color: white; - flex-shrink: 0; -} - -.rank-badge.top-3 { - background: linear-gradient(135deg, #ffb74d, #ff9800); - box-shadow: 0 2px 6px rgba(255, 152, 0, 0.3); -} - -.rank-badge.normal { - background: linear-gradient(135deg, #a5d6a7, #81c784); - box-shadow: 0 2px 6px rgba(139, 195, 74, 0.3); -} - -.topic-title { - font-size: 16px; - font-weight: 500; - color: #333; - line-height: 1.4; - flex: 1; - word-break: break-word; -} - -.topic-footer { - display: flex; - justify-content: space-between; - align-items: center; - margin-top: 12px; - padding-top: 8px; - border-top: 1px solid rgba(139, 195, 74, 0.1); -} - -.topic-score { - font-size: 14px; - font-weight: 600; - color: #8bc34a; -} - -.topic-actions { - display: flex; - gap: 8px; -} - -.action-btn { - padding: 4px 8px; - background: rgba(139, 195, 74, 0.1); - color: #8bc34a; - border: none; - border-radius: 6px; - cursor: pointer; - font-size: 12px; - transition: all 0.3s ease; -} - -.action-btn:hover { - background: rgba(139, 195, 74, 0.2); -} - -/* 底部样式 */ -.footer { - margin-top: 40px; - padding: 20px 0; - border-top: 1px solid rgba(139, 195, 74, 0.2); - text-align: center; -} - -.footer-content p { - margin: 4px 0; - font-size: 12px; - color: #666; -} - -.data-source { - font-weight: 500; -} - -/* 提示消息 */ -.toast { - position: fixed; - top: 20px; - left: 50%; - transform: translateX(-50%); - background: rgba(46, 125, 50, 0.9); - color: white; - padding: 12px 20px; - border-radius: 20px; - font-size: 14px; - z-index: 1000; - opacity: 0; - visibility: hidden; - transition: all 0.3s ease; - backdrop-filter: blur(10px); -} - -.toast.show { - opacity: 1; - visibility: visible; -} - -/* 动画效果 */ -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -@keyframes fadeIn { - 0% { - opacity: 0; - transform: translateY(20px); - } - 100% { - opacity: 1; - transform: translateY(0); - } -} - -/* 平板端适配 */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 0 24px; - } - - .topics-container { - grid-template-columns: repeat(2, 1fr); - gap: 16px; - } - - .topic-item { - padding: 18px; - } - - .logo h1 { - font-size: 26px; - } - - .topic-title { - font-size: 17px; - } -} - -/* 桌面端适配 */ -@media (min-width: 1025px) { - .container { - padding: 0 32px; - } - - .header { - padding: 24px 0; - } - - .topics-container { - grid-template-columns: repeat(3, 1fr); - gap: 20px; - } - - .topic-item { - padding: 20px; - } - - .logo h1 { - font-size: 28px; - } - - .topic-title { - font-size: 18px; - } - - .refresh-btn { - padding: 12px 20px; - font-size: 15px; - } -} - -/* 移动端优化 */ -@media (max-width: 767px) { - .container { - padding: 0 12px; - } - - .header { - padding: 16px 0; - margin-bottom: 16px; - } - - .logo h1 { - font-size: 20px; - } - - .logo i { - font-size: 24px; - } - - .refresh-btn { - padding: 8px 12px; - font-size: 13px; - } - - .refresh-btn span { - display: none; - } - - .topics-container { - grid-template-columns: 1fr; - gap: 10px; - } - - .topic-item { - padding: 14px; - } - - .topic-title { - font-size: 15px; - line-height: 1.3; - } - - .rank-badge { - width: 22px; - height: 22px; - font-size: 11px; - } - - .topic-score { - font-size: 13px; - } - - .action-btn { - padding: 3px 6px; - font-size: 11px; - } - - .list-header h2 { - font-size: 18px; - } - - .update-time { - font-size: 11px; - } - - .footer { - margin-top: 30px; - padding: 16px 0; - } - - .toast { - left: 12px; - right: 12px; - transform: none; - border-radius: 12px; - } -} - -/* 超小屏幕优化 */ -@media (max-width: 360px) { - .container { - padding: 0 8px; - } - - .topic-item { - padding: 12px; - } - - .topic-title { - font-size: 14px; - } - - .logo h1 { - font-size: 18px; - } -} - -/* 滚动条样式 */ -::-webkit-scrollbar { - width: 6px; -} - -::-webkit-scrollbar-track { - background: rgba(139, 195, 74, 0.1); - border-radius: 3px; -} - -::-webkit-scrollbar-thumb { - background: rgba(139, 195, 74, 0.5); - border-radius: 3px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(139, 195, 74, 0.7); -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/ui.js b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/ui.js deleted file mode 100755 index 9c8d15c3..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/ui.js +++ /dev/null @@ -1,410 +0,0 @@ -/** - * UI管理模块 - * 负责页面渲染、交互和状态管理 - */ -class UIManager { - constructor() { - this.elements = {}; - this.isLoading = false; - this.currentData = null; - this.touchStartY = 0; - this.pullThreshold = 80; - this.isPulling = false; - - this.initElements(); - this.bindEvents(); - } - - /** - * 初始化DOM元素引用 - */ - initElements() { - this.elements = { - loading: document.getElementById('loading'), - error: document.getElementById('error'), - hotList: document.getElementById('hotList'), - topicsContainer: document.getElementById('topicsContainer'), - refreshBtn: document.getElementById('refreshBtn'), - updateTime: document.getElementById('updateTime'), - toast: document.getElementById('toast') - }; - - // 检查必需元素 - const missingElements = Object.entries(this.elements) - .filter(([key, element]) => !element) - .map(([key]) => key); - - if (missingElements.length > 0) { - console.error('[UI] 缺少必需的DOM元素:', missingElements); - } - } - - /** - * 绑定事件监听器 - */ - bindEvents() { - // 刷新按钮点击事件 - if (this.elements.refreshBtn) { - this.elements.refreshBtn.addEventListener('click', () => { - this.handleRefresh(); - }); - } - - // 键盘快捷键 - document.addEventListener('keydown', (e) => { - if (e.key === 'F5' || (e.ctrlKey && e.key === 'r')) { - e.preventDefault(); - this.handleRefresh(); - } - }); - - // 移动端下拉刷新 - this.initPullToRefresh(); - - // 页面可见性变化 - document.addEventListener('visibilitychange', () => { - if (!document.hidden && this.currentData) { - // 页面重新可见时检查数据是否过期(5分钟) - const lastUpdate = new Date(this.currentData.updateTime); - const now = new Date(); - if (now - lastUpdate > 5 * 60 * 1000) { - this.handleRefresh(); - } - } - }); - } - - /** - * 初始化下拉刷新功能 - */ - initPullToRefresh() { - let startY = 0; - let currentY = 0; - let pullDistance = 0; - - document.addEventListener('touchstart', (e) => { - if (window.scrollY === 0) { - startY = e.touches[0].clientY; - this.isPulling = true; - } - }, { passive: true }); - - document.addEventListener('touchmove', (e) => { - if (!this.isPulling || this.isLoading) return; - - currentY = e.touches[0].clientY; - pullDistance = currentY - startY; - - if (pullDistance > 0 && window.scrollY === 0) { - e.preventDefault(); - - // 添加视觉反馈 - const progress = Math.min(pullDistance / this.pullThreshold, 1); - document.body.style.transform = `translateY(${pullDistance * 0.3}px)`; - document.body.style.opacity = 1 - progress * 0.1; - } - }, { passive: false }); - - document.addEventListener('touchend', () => { - if (this.isPulling) { - document.body.style.transform = ''; - document.body.style.opacity = ''; - - if (pullDistance > this.pullThreshold && !this.isLoading) { - this.handleRefresh(); - } - - this.isPulling = false; - pullDistance = 0; - } - }); - } - - /** - * 处理刷新操作 - */ - async handleRefresh() { - if (this.isLoading) return; - - this.showToast('正在刷新数据...'); - - // 触发自定义刷新事件 - const refreshEvent = new CustomEvent('refreshData'); - document.dispatchEvent(refreshEvent); - } - - /** - * 显示加载状态 - */ - showLoading() { - this.isLoading = true; - this.hideAllStates(); - if (this.elements.loading) { - this.elements.loading.style.display = 'flex'; - } - - // 刷新按钮加载状态 - if (this.elements.refreshBtn) { - this.elements.refreshBtn.classList.add('loading'); - this.elements.refreshBtn.disabled = true; - } - } - - /** - * 显示错误状态 - * @param {string} message - 错误消息 - */ - showError(message = '加载失败,请稍后重试') { - this.isLoading = false; - this.hideAllStates(); - - if (this.elements.error) { - this.elements.error.style.display = 'flex'; - const errorMessage = this.elements.error.querySelector('.error-message'); - if (errorMessage) { - errorMessage.textContent = message; - } - } - - this.resetRefreshButton(); - } - - /** - * 显示热搜列表 - * @param {Object} data - 热搜数据 - */ - showHotList(data) { - this.isLoading = false; - this.currentData = data; - this.hideAllStates(); - - if (this.elements.hotList) { - this.elements.hotList.style.display = 'block'; - } - - this.renderTopics(data.data); - this.updateTime(data.updateTime); - this.resetRefreshButton(); - - this.showToast(`已更新 ${data.total} 条热搜数据`); - } - - /** - * 隐藏所有状态 - */ - hideAllStates() { - ['loading', 'error', 'hotList'].forEach(state => { - if (this.elements[state]) { - this.elements[state].style.display = 'none'; - } - }); - } - - /** - * 重置刷新按钮状态 - */ - resetRefreshButton() { - if (this.elements.refreshBtn) { - this.elements.refreshBtn.classList.remove('loading'); - this.elements.refreshBtn.disabled = false; - } - } - - /** - * 渲染热搜话题列表 - * @param {Array} topics - 话题数组 - */ - renderTopics(topics) { - if (!this.elements.topicsContainer) return; - - this.elements.topicsContainer.innerHTML = ''; - - topics.forEach((topic, index) => { - const topicElement = this.createTopicElement(topic, index); - this.elements.topicsContainer.appendChild(topicElement); - }); - } - - /** - * 创建单个话题元素 - * @param {Object} topic - 话题数据 - * @param {number} index - 索引 - * @returns {HTMLElement} 话题元素 - */ - createTopicElement(topic, index) { - const item = document.createElement('div'); - item.className = 'topic-item'; - item.style.animationDelay = `${index * 0.1}s`; - - item.innerHTML = ` -
    -
    - ${topic.rank} -
    -
    ${this.escapeHtml(topic.title)}
    -
    - - `; - - this.bindTopicEvents(item, topic); - return item; - } - - /** - * 绑定话题元素事件 - * @param {HTMLElement} element - 话题元素 - * @param {Object} topic - 话题数据 - */ - bindTopicEvents(element, topic) { - // 点击整个项目跳转搜索 - element.addEventListener('click', (e) => { - if (!e.target.closest('.action-btn')) { - window.open(topic.searchUrl, '_blank'); - } - }); - - // 复制按钮 - const copyBtn = element.querySelector('.copy-btn'); - if (copyBtn) { - copyBtn.addEventListener('click', (e) => { - e.stopPropagation(); - this.copyToClipboard(topic.title); - }); - } - - // 搜索按钮 - const searchBtn = element.querySelector('.search-btn'); - if (searchBtn) { - searchBtn.addEventListener('click', (e) => { - e.stopPropagation(); - window.open(topic.searchUrl, '_blank'); - }); - } - - // 长按显示详情 - let longPressTimer; - element.addEventListener('touchstart', () => { - longPressTimer = setTimeout(() => { - this.showTopicDetails(topic); - }, 800); - }); - - element.addEventListener('touchend', () => { - clearTimeout(longPressTimer); - }); - - element.addEventListener('touchmove', () => { - clearTimeout(longPressTimer); - }); - } - - /** - * 显示话题详情 - * @param {Object} topic - 话题数据 - */ - showTopicDetails(topic) { - const details = ` - 标题: ${topic.title} - 排名: 第${topic.rank}名 - 热度: ${topic.scoreDesc} - 原始分数: ${topic.score.toLocaleString()} - `; - - this.showToast(details, 3000); - } - - /** - * 复制文本到剪贴板 - * @param {string} text - 要复制的文本 - */ - async copyToClipboard(text) { - try { - if (navigator.clipboard && window.isSecureContext) { - await navigator.clipboard.writeText(text); - } else { - // 降级方案 - const textArea = document.createElement('textarea'); - textArea.value = text; - textArea.style.position = 'fixed'; - textArea.style.opacity = '0'; - document.body.appendChild(textArea); - textArea.select(); - document.execCommand('copy'); - document.body.removeChild(textArea); - } - - this.showToast('已复制到剪贴板'); - } catch (error) { - console.error('[UI] 复制失败:', error); - this.showToast('复制失败'); - } - } - - /** - * 更新时间显示 - * @param {string} time - 更新时间 - */ - updateTime(time) { - if (this.elements.updateTime) { - this.elements.updateTime.textContent = `更新时间: ${time}`; - } - } - - /** - * 显示提示消息 - * @param {string} message - 消息内容 - * @param {number} duration - 显示时长(毫秒) - */ - showToast(message, duration = 2000) { - if (!this.elements.toast) return; - - this.elements.toast.textContent = message; - this.elements.toast.classList.add('show'); - - setTimeout(() => { - this.elements.toast.classList.remove('show'); - }, duration); - } - - /** - * HTML转义 - * @param {string} text - 原始文本 - * @returns {string} 转义后的文本 - */ - escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; - } - - /** - * 获取当前数据 - * @returns {Object|null} 当前数据 - */ - getCurrentData() { - return this.currentData; - } - - /** - * 清除当前数据 - */ - clearData() { - this.currentData = null; - if (this.elements.topicsContainer) { - this.elements.topicsContainer.innerHTML = ''; - } - } -} - -// 导出UI管理器 -window.UIManager = UIManager; \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/返回接口.json deleted file mode 100755 index 718f5881..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/返回接口.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "rank": 1, - "title": "吉利银河星耀6将于9月5日发布", - "score": 846099, - "score_desc": "84.6w" - }, - { - "rank": 2, - "title": "销售称Model Y L日均订单近万辆", - "score": 602350, - "score_desc": "60.2w" - }, - { - "rank": 3, - "title": "极氪9X将于9月底上市", - "score": 241114, - "score_desc": "24.1w" - }, - { - "rank": 4, - "title": "比亚迪“全家福”亮相齐鲁秋季车展", - "score": 239586, - "score_desc": "24.0w" - }, - { - "rank": 5, - "title": "新一代宝马X5内饰曝光", - "score": 209847, - "score_desc": "21.0w" - }, - { - "rank": 6, - "title": "LOL前职业选手PDD喜提理想MEGA", - "score": 204628, - "score_desc": "20.5w" - }, - { - "rank": 7, - "title": "零跑Lafa5伪装车曝光", - "score": 143127, - "score_desc": "14.3w" - }, - { - "rank": 8, - "title": "方程豹钛7将于9月9日上市", - "score": 135759, - "score_desc": "13.6w" - }, - { - "rank": 9, - "title": "零跑9月购车政策", - "score": 94419, - "score_desc": "9.4w" - }, - { - "rank": 10, - "title": "捷途X70L将于9月10日预售", - "score": 74292, - "score_desc": "7.4w" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/css/background.css deleted file mode 100755 index 84545b14..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/css/background.css +++ /dev/null @@ -1,48 +0,0 @@ -/* 背景相关样式 */ -body { - background: linear-gradient(135deg, #f1f8e9 0%, #dcedc8 25%, #c8e6c9 50%, #a8e6cf 75%, #81c784 100%); - background-attachment: fixed; - min-height: 100vh; - position: relative; -} - -/* 简化的背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.08) 0%, transparent 40%), - radial-gradient(circle at 80% 20%, rgba(129, 199, 132, 0.06) 0%, transparent 40%); - pointer-events: none; - z-index: -1; -} - -/* 简化的浮动装饰 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 30% 70%, rgba(76, 175, 80, 0.04) 1px, transparent 1px), - radial-gradient(circle at 70% 30%, rgba(129, 199, 132, 0.03) 1px, transparent 1px); - background-size: 120px 120px, 180px 180px; - animation: float 25s ease-in-out infinite alternate; - pointer-events: none; - z-index: -1; -} - -@keyframes float { - 0% { - transform: translateY(0px) rotate(0deg); - } - 100% { - transform: translateY(-10px) rotate(1deg); - } -} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/css/style.css deleted file mode 100755 index d74a625f..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/css/style.css +++ /dev/null @@ -1,661 +0,0 @@ -/* 背景样式 */ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; - background-color: #f8f9fa; -} - -.modern-gradient { - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 135deg, - rgba(76, 175, 80, 0.15) 0%, - rgba(129, 199, 132, 0.1) 25%, - rgba(165, 214, 167, 0.08) 50%, - rgba(200, 230, 201, 0.06) 75%, - rgba(232, 245, 233, 0.05) 100% - ); - animation: gradient-flow 30s ease-in-out infinite; - border-radius: 40% 60% 60% 40% / 40% 40% 60% 60%; -} - -.modern-gradient::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: radial-gradient( - circle at 30% 70%, - rgba(76, 175, 80, 0.1) 0%, - transparent 40% - ), radial-gradient( - circle at 70% 30%, - rgba(129, 199, 132, 0.08) 0%, - transparent 40% - ); - animation: pulse-effect 25s ease-in-out infinite alternate; - border-radius: 40% 60% 60% 40% / 40% 40% 60% 60%; -} - -@keyframes gradient-flow { - 0%, 100% { - transform: rotate(0deg) scale(1); - opacity: 0.8; - } - 25% { - transform: rotate(90deg) scale(1.1); - opacity: 0.6; - } - 50% { - transform: rotate(180deg) scale(0.9); - opacity: 0.9; - } - 75% { - transform: rotate(270deg) scale(1.05); - opacity: 0.7; - } -} - -@keyframes pulse-effect { - 0% { - transform: scale(1) rotate(0deg); - opacity: 0.5; - } - 50% { - transform: scale(1.2) rotate(180deg); - opacity: 0.8; - } - 100% { - transform: scale(1) rotate(360deg); - opacity: 0.6; - } -} - -/* 主样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; - color: #333; - background-color: #f8f9fa; - position: relative; - min-height: 100vh; -} - -.container { - max-width: 800px; - margin: 0 auto; - padding: 24px; - position: relative; - z-index: 1; - background-color: rgba(255, 255, 255, 0.9); - border-radius: 16px; - box-shadow: 0 8px 24px rgba(76, 175, 80, 0.08); - backdrop-filter: blur(12px); - border: 1px solid rgba(76, 175, 80, 0.1); -} - -header { - text-align: center; - margin-bottom: 28px; - padding-bottom: 20px; - border-bottom: 1px solid rgba(76, 175, 80, 0.15); -} - -header h1 { - background: linear-gradient(135deg, #2e7d32, #4caf50, #66bb6a); - -webkit-background-clip: text; - background-clip: text; - color: transparent; - margin-bottom: 14px; - font-size: 2.4rem; - font-weight: 700; - letter-spacing: -0.5px; -} - -.update-time { - color: #4caf50; - font-size: 0.9rem; - background-color: rgba(76, 175, 80, 0.08); - padding: 8px 16px; - border-radius: 24px; - display: inline-block; - box-shadow: 0 2px 8px rgba(76, 175, 80, 0.1); - border: 1px solid rgba(76, 175, 80, 0.15); -} - -.refresh-btn { - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; - border: none; - padding: 10px 20px; - border-radius: 24px; - font-size: 0.9rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - margin-top: 12px; - box-shadow: 0 4px 12px rgba(76, 175, 80, 0.25); - display: inline-flex; - align-items: center; - gap: 6px; -} - -.refresh-btn:hover { - background: linear-gradient(135deg, #388e3c, #4caf50); - transform: translateY(-2px); - box-shadow: 0 6px 16px rgba(76, 175, 80, 0.35); -} - -.refresh-btn:active { - transform: translateY(0); - box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3); -} - -.btn-icon { - font-size: 1rem; - animation: rotate 2s linear infinite paused; -} - -.refresh-btn:hover .btn-icon { - animation-play-state: running; -} - -@keyframes rotate { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } -} - -/* 热搜列表 - 移动端优先设计 */ -.hot-list { - list-style: none; -} - -.hot-item { - background: rgba(255, 255, 255, 0.95); - border-radius: 16px; - padding: 16px; - margin-bottom: 12px; - box-shadow: 0 2px 12px rgba(76, 175, 80, 0.08); - transition: all 0.3s ease; - border: 1px solid rgba(76, 175, 80, 0.1); - display: flex; - align-items: center; - gap: 12px; - position: relative; - overflow: hidden; -} - -.hot-item:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(76, 175, 80, 0.15); - border-color: rgba(76, 175, 80, 0.25); - background: rgba(255, 255, 255, 1); -} - -/* 排名容器 */ -.hot-rank-container { - flex-shrink: 0; - display: flex; - align-items: center; -} - -.hot-rank { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: 48px; - height: 48px; - border-radius: 12px; - background: linear-gradient(135deg, #f0f0f0, #e8e8e8); - color: #666; - font-weight: 600; - position: relative; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); -} - -.hot-rank.rank-1 { - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; - box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3); -} - -.hot-rank.rank-2 { - background: linear-gradient(135deg, #66bb6a, #81c784); - color: white; - box-shadow: 0 4px 12px rgba(102, 187, 106, 0.3); -} - -.hot-rank.rank-3 { - background: linear-gradient(135deg, #81c784, #a5d6a7); - color: #2e7d32; - box-shadow: 0 4px 12px rgba(129, 199, 132, 0.3); -} - -.rank-number { - font-size: 0.9rem; - font-weight: 700; - line-height: 1; -} - -.rank-emoji { - font-size: 0.7rem; - line-height: 1; - margin-top: 1px; -} - -/* 内容包装器 */ -.hot-content-wrapper { - flex: 1; - min-width: 0; - display: flex; - flex-direction: column; - justify-content: center; - gap: 8px; -} - -/* 标题 */ -.hot-title { - font-size: 1rem; - font-weight: 600; - color: #333; - line-height: 1.3; - margin: 0; - display: -webkit-box; - -webkit-line-clamp: 1; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; - cursor: pointer; - transition: color 0.2s ease; -} - -.hot-title:hover { - color: #4caf50; -} - -/* 底部行 */ -.hot-bottom-row { - display: flex; - align-items: center; - gap: 12px; - flex-wrap: nowrap; -} - -.hot-time { - display: flex; - align-items: center; - gap: 4px; - color: #666; - font-size: 0.8rem; - flex-shrink: 0; -} - -.meta-icon { - font-size: 0.9rem; - flex-shrink: 0; -} - -.meta-text { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.hot-value { - display: flex; - align-items: center; - gap: 4px; - background: linear-gradient(135deg, #81c784, #a5d6a7); - color: #2e7d32; - padding: 4px 10px; - border-radius: 12px; - font-size: 0.75rem; - font-weight: 600; - box-shadow: 0 2px 6px rgba(76, 175, 80, 0.15); - flex-shrink: 0; -} - -.heat-level { - font-size: 0.8rem; -} - -.value-text { - font-size: 0.75rem; -} - -/* 图片样式 */ -.hot-cover { - width: 80px; - height: 60px; - object-fit: cover; - border-radius: 8px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); - flex-shrink: 0; -} - -.hot-link { - display: flex; - align-items: center; - gap: 4px; - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; - text-decoration: none; - padding: 6px 12px; - border-radius: 12px; - font-size: 0.75rem; - font-weight: 600; - transition: all 0.3s ease; - box-shadow: 0 2px 6px rgba(76, 175, 80, 0.3); - flex-shrink: 0; -} - -.hot-link:hover { - transform: translateY(-1px); - box-shadow: 0 4px 10px rgba(76, 175, 80, 0.4); - text-decoration: none; - color: white; - background: linear-gradient(135deg, #388e3c, #4caf50); -} - -.link-icon { - font-size: 0.8rem; -} - -.link-text { - font-size: 0.75rem; -} - -.loading { - text-align: center; - padding: 40px; - color: #4caf50; - font-size: 1.1rem; -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid rgba(76, 175, 80, 0.2); - border-top: 4px solid #4caf50; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 16px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -footer { - text-align: center; - margin-top: 30px; - padding-top: 20px; - border-top: 1px solid rgba(76, 175, 80, 0.15); - color: #4caf50; - font-size: 0.9rem; -} - -/* 响应式设计 - 移动端优化 */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - max-width: 90%; - padding: 20px; - } - - header h1 { - font-size: 2.2rem; - } - - .hot-item { - padding: 18px; - gap: 14px; - } - - .hot-rank { - width: 52px; - height: 52px; - } - - .hot-title { - font-size: 1.1rem; - } -} - -@media (max-width: 768px) { - .container { - max-width: 95%; - margin: 12px auto; - padding: 8px; - border-radius: 12px; - } - - header { - margin-bottom: 20px; - padding: 12px 0 16px 0; - } - - header h1 { - font-size: 1.8rem; - margin-bottom: 10px; - } - - .update-time { - font-size: 0.85rem; - padding: 6px 12px; - } - - .hot-item { - padding: 12px; - margin-bottom: 10px; - gap: 10px; - } - - .hot-rank { - width: 40px; - height: 40px; - } - - .rank-number { - font-size: 0.8rem; - } - - .rank-emoji { - font-size: 0.6rem; - } - - .hot-title { - font-size: 0.9rem; - line-height: 1.3; - } - - .hot-meta-row { - gap: 8px; - } - - .hot-time { - font-size: 0.75rem; - } - - .hot-value { - padding: 3px 8px; - font-size: 0.7rem; - } - - .hot-cover { - width: 70px; - height: 50px; - } - - .hot-link { - padding: 5px 10px; - font-size: 0.7rem; - } - - .link-text { - font-size: 0.7rem; - } - - footer { - margin-top: 24px; - padding-top: 16px; - font-size: 0.85rem; - } -} - -@media (max-width: 480px) { - body { - overflow-x: hidden; - } - - .container { - margin: 8px; - padding: 8px; - max-width: calc(100vw - 16px); - width: calc(100vw - 16px); - } - - header { - padding: 12px 0 16px 0; - margin-bottom: 16px; - } - - header h1 { - font-size: 1.5rem; - margin-bottom: 8px; - } - - .update-time { - font-size: 0.8rem; - padding: 6px 12px; - } - - .refresh-btn { - font-size: 0.8rem; - padding: 8px 16px; - margin-top: 12px; - } - - .hot-item { - padding: 12px; - margin-bottom: 10px; - gap: 10px; - width: 100%; - min-width: 0; - } - - .hot-rank-container { - flex-shrink: 0; - } - - .hot-rank { - width: 36px; - height: 36px; - } - - .rank-number { - font-size: 0.75rem; - } - - .hot-content-wrapper { - flex: 1; - min-width: 0; - overflow: hidden; - } - - .hot-title { - font-size: 0.9rem; - line-height: 1.3; - word-break: break-all; - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - } - - .hot-bottom-row { - flex-wrap: wrap; - gap: 8px; - } - - .hot-time { - font-size: 0.7rem; - flex-shrink: 0; - } - - .hot-value { - font-size: 0.65rem; - padding: 3px 8px; - flex-shrink: 0; - } - - .hot-cover { - width: 60px; - height: 45px; - flex-shrink: 0; - } - - .hot-link { - font-size: 0.65rem; - padding: 4px 8px; - flex-shrink: 0; - } - - .link-text { - font-size: 0.65rem; - } - - .loading { - padding: 30px; - font-size: 1rem; - } - - .loading-content { - padding: 20px; - } - - .loading-text p { - font-size: 0.9rem; - } - - footer { - margin-top: 20px; - padding-top: 16px; - font-size: 0.8rem; - } -} - -/* 减少动画以节省电池 */ -@media (prefers-reduced-motion: reduce) { - .modern-gradient, - .modern-gradient::before { - animation: none; - } - - .modern-gradient { - background: linear-gradient( - 135deg, - rgba(64, 169, 255, 0.3) 0%, - rgba(255, 175, 64, 0.2) 50%, - rgba(255, 122, 69, 0.25) 100% - ); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/index.html deleted file mode 100755 index b4f51b94..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/index.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - 抖音热搜榜 - - - - -
    -
    -

    抖音热搜榜

    -

    实时热门话题 · 紧跟潮流趋势

    -
    - 加载中... -
    - -
    - -
    -
    -
    -
    - 🎭 -

    正在获取最新热搜...

    -
    - - - -
    -
    -
    -
    - -
    - -
    - - -
    - - - - diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/js/script.js b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/js/script.js deleted file mode 100755 index 606568d1..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/js/script.js +++ /dev/null @@ -1,330 +0,0 @@ -// 本地后端API接口 -const LOCAL_API_BASE = 'https://infogenie.api.shumengya.top/api/60s'; - -// API接口列表(备用) -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top", -]; - -// 当前使用的API索引 -let currentApiIndex = 0; -let useLocalApi = true; - -// DOM元素 -const loadingElement = document.getElementById('loading'); -const hotListElement = document.getElementById('hotList'); -const errorMessageElement = document.getElementById('errorMessage'); -const updateTimeElement = document.getElementById('updateTime'); -const refreshBtn = document.getElementById('refreshBtn'); - -// 页面加载完成后自动加载数据 -document.addEventListener('DOMContentLoaded', function() { - loadHotList(); -}); - -// 刷新按钮点击事件 -refreshBtn.addEventListener('click', function() { - loadHotList(); -}); - -// 加载热搜列表 -async function loadHotList() { - showLoading(); - hideError(); - - try { - const data = await fetchData(); - displayHotList(data.data); - updateRefreshTime(); - } catch (error) { - console.error('加载失败:', error); - showError(); - } - - hideLoading(); -} - -// 获取数据 -async function fetchData() { - // 优先尝试本地API - if (useLocalApi) { - try { - const response = await fetch(`${LOCAL_API_BASE}/douyin`, { - method: 'GET', - headers: { - 'Accept': 'application/json', - }, - timeout: 10000 - }); - - if (response.ok) { - const data = await response.json(); - if (data.code === 200 && data.data) { - return data; - } - } - } catch (error) { - console.warn('本地API请求失败,切换到外部API:', error); - useLocalApi = false; - } - } - - // 使用外部API作为备用 - for (let i = 0; i < API_ENDPOINTS.length; i++) { - const apiUrl = API_ENDPOINTS[currentApiIndex]; - - try { - const response = await fetch(`${apiUrl}/v2/douyin`, { - method: 'GET', - headers: { - 'Accept': 'application/json', - }, - timeout: 10000 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - return data; - } else { - throw new Error('数据格式错误'); - } - } catch (error) { - console.error(`API ${apiUrl} 请求失败:`, error); - currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; - - if (i === API_ENDPOINTS.length - 1) { - throw new Error('所有API接口都无法访问'); - } - } - } -} - -// 显示热搜列表 -function displayHotList(hotData) { - hotListElement.innerHTML = ''; - - hotData.forEach((item, index) => { - const hotItem = createHotItem(item, index + 1); - hotListElement.appendChild(hotItem); - }); -} - -// 创建热搜项目 -function createHotItem(item, rank) { - const hotItem = document.createElement('div'); - hotItem.className = 'hot-item'; - - // 排名样式类 - let rankClass = 'hot-rank'; - if (rank === 1) rankClass += ' rank-1'; - else if (rank === 2) rankClass += ' rank-2'; - else if (rank === 3) rankClass += ' rank-3'; - - const formattedHotValue = formatHotValue(item.hot_value); - const formattedTime = formatTime(item.event_time); - - // 根据排名添加特殊标识 - let rankEmoji = ''; - if (rank === 1) rankEmoji = '👑'; - else if (rank === 2) rankEmoji = '🥈'; - else if (rank === 3) rankEmoji = '🥉'; - else if (rank <= 10) rankEmoji = '🔥'; - - // 根据热度值添加火焰等级 - let fireLevel = ''; - if (item.hot_value >= 10000000) fireLevel = '🔥'; - else if (item.hot_value >= 5000000) fireLevel = '🔥'; - else fireLevel = '🔥'; - - hotItem.innerHTML = ` -
    -
    -
    ${rank}
    -
    ${rankEmoji}
    -
    -
    - ${escapeHtml(item.title)} -
    -
    ${escapeHtml(item.title)}
    -
    -
    - ${formattedTime} -
    -
    - ${fireLevel} - ${formattedHotValue} -
    - - 观看视频 - -
    -
    - `; - - return hotItem; -} - -// 格式化热度值 -function formatHotValue(value) { - if (value >= 100000000) { - return (value / 100000000).toFixed(1) + '亿'; - } else if (value >= 10000) { - return (value / 10000).toFixed(1) + '万'; - } else { - return value.toLocaleString(); - } -} - -// 格式化时间 -function formatTime(timeStr) { - try { - const formattedTime = timeStr.replace(/\//g, '-'); - const date = new Date(formattedTime); - const now = new Date(); - const diff = now - date; - const minutes = Math.floor(diff / (1000 * 60)); - const hours = Math.floor(minutes / 60); - const days = Math.floor(hours / 24); - - if (days > 0) { - return `${days}天前`; - } else if (hours > 0) { - return `${hours}小时前`; - } else if (minutes > 0) { - return `${minutes}分钟前`; - } else { - return '刚刚'; - } - } catch (error) { - return timeStr; - } -} - -// HTML转义 -function escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} - -// 图片加载错误处理 -function handleImageError(img) { - img.src = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiBmaWxsPSIjZjVmNWY1Ii8+CjxwYXRoIGQ9Ik00MCAyMEM0NCAyMCA0NyAyMyA0NyAyN1Y1M0M0NyA1NyA0NCA2MCA0MCA2MEgxNkMxMiA2MCA5IDU3IDkgNTNWMjdDOSAyMyAxMiAyMCAxNiAyMEg0MFoiIHN0cm9rZT0iI2NjY2NjYyIgc3Ryb2tlLXdpZHRoPSIyIi8+CjxjaXJjbGUgY3g9IjMzIiBjeT0iMzIiIHI9IjMiIGZpbGw9IiNjY2NjY2MiLz4KPHBhdGggZD0iTTEzIDQ4TDIzIDM4TDMzIDQ4TDQzIDM4TDUzIDQ4IiBzdHJva2U9IiNjY2NjY2MiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo='; - img.alt = '图片加载失败'; -} - -// 更新刷新时间 -function updateRefreshTime() { - const now = new Date(); - const timeStr = now.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit' - }); - updateTimeElement.textContent = `最后更新: ${timeStr}`; - - // 添加成功提示 - showSuccessMessage('🎉 数据已更新'); -} - -// 显示成功消息 -function showSuccessMessage(message) { - // 移除之前的提示 - const existingToast = document.querySelector('.success-toast'); - if (existingToast) { - existingToast.remove(); - } - - const toast = document.createElement('div'); - toast.className = 'success-toast'; - toast.textContent = message; - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; - padding: 12px 20px; - border-radius: 25px; - box-shadow: 0 4px 20px rgba(76, 175, 80, 0.3); - z-index: 1000; - font-weight: 600; - font-size: 0.9em; - animation: slideIn 0.3s ease-out; - backdrop-filter: blur(10px); - `; - - document.body.appendChild(toast); - - // 3秒后自动移除 - setTimeout(() => { - toast.style.animation = 'slideOut 0.3s ease-in forwards'; - setTimeout(() => toast.remove(), 300); - }, 3000); -} - -// 添加CSS动画到页面 -if (!document.querySelector('#toast-styles')) { - const style = document.createElement('style'); - style.id = 'toast-styles'; - style.textContent = ` - @keyframes slideIn { - from { - opacity: 0; - transform: translateX(100px); - } - to { - opacity: 1; - transform: translateX(0); - } - } - - @keyframes slideOut { - from { - opacity: 1; - transform: translateX(0); - } - to { - opacity: 0; - transform: translateX(100px); - } - } - `; - document.head.appendChild(style); -} - -// 显示加载状态 -function showLoading() { - loadingElement.style.display = 'block'; - hotListElement.style.display = 'none'; -} - -// 隐藏加载状态 -function hideLoading() { - loadingElement.style.display = 'none'; - hotListElement.style.display = 'block'; -} - -// 显示错误信息 -function showError() { - errorMessageElement.style.display = 'block'; - hotListElement.style.display = 'none'; -} - -// 隐藏错误信息 -function hideError() { - errorMessageElement.style.display = 'none'; -} - -// 自动刷新 (每5分钟) -setInterval(function() { - loadHotList(); -}, 5 * 60 * 1000); diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/接口集合.json b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/返回接口.json deleted file mode 100755 index 8dedd1fd..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/返回接口.json +++ /dev/null @@ -1,496 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "title": "九三阅兵具体安排公布", - "hot_value": 11821633, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oY1c972B7QzApGweaeQD3fGRo5aLIBrpCAuUSa~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=q01Se46GlLKYNv2klGKP1aM1cT0%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%85%B7%E4%BD%93%E5%AE%89%E6%8E%92%E5%85%AC%E5%B8%83", - "event_time": "2025/09/01 15:20:34", - "event_time_at": 1756711234, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "九月第一天", - "hot_value": 11327170, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oofTvDaDRCSs4hBFEFVJlAI9BBs0faZAc7IpGf~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=otkowVCSglk%2BS3tPrmBQFq6rIDw%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B9%9D%E6%9C%88%E7%AC%AC%E4%B8%80%E5%A4%A9", - "event_time": "2025/09/01 07:28:57", - "event_time_at": 1756682937, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "遇见上合共享津彩", - "hot_value": 11222444, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oIJeINhBDBAiHADD4gi9Ae0CGALg1BqWI7vg0i~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=K%2BaEx5p%2BDv%2B1h3RgNnH0Yb9WT%2B8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E9%81%87%E8%A7%81%E4%B8%8A%E5%90%88%E5%85%B1%E4%BA%AB%E6%B4%A5%E5%BD%A9", - "event_time": "2025/09/01 11:46:59", - "event_time_at": 1756698419, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "2025年开学第一课铭记与奋斗", - "hot_value": 11078403, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oA9NgVCRBABg7r70pQue8IzAUlfMaXf3hawOIB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=3xYeXsD6JpXLDOVp6gYRxrvKFaM%3D&from=3218412987", - "link": "https://www.douyin.com/search/2025%E5%B9%B4%E5%BC%80%E5%AD%A6%E7%AC%AC%E4%B8%80%E8%AF%BE%E9%93%AD%E8%AE%B0%E4%B8%8E%E5%A5%8B%E6%96%97", - "event_time": "2025/09/01 11:21:13", - "event_time_at": 1756696873, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "石宇奇首夺世锦赛男单冠军", - "hot_value": 10395092, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oAf9IAlEuyE3lFiogfBuQFl8gDFqAoAHtFDNkE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=tamoorhMGYhajvpmVNdX0TuUuZM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%9F%B3%E5%AE%87%E5%A5%87%E9%A6%96%E5%A4%BA%E4%B8%96%E9%94%A6%E8%B5%9B%E7%94%B7%E5%8D%95%E5%86%A0%E5%86%9B", - "event_time": "2025/09/01 07:47:03", - "event_time_at": 1756684023, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "告别信息裸奔 国家网络身份认证来了", - "hot_value": 10255200, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oskNjrEUQIN9BBRCfeiDTGPE0geX0q6eAAyLr2~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=FrZQSxERPOBd6ktV8K%2Bt%2F3LgJ4A%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%91%8A%E5%88%AB%E4%BF%A1%E6%81%AF%E8%A3%B8%E5%A5%94%20%E5%9B%BD%E5%AE%B6%E7%BD%91%E7%BB%9C%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E6%9D%A5%E4%BA%86", - "event_time": "2025/09/01 10:28:41", - "event_time_at": 1756693721, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "记录我的开学第一天", - "hot_value": 9133236, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/owTXhhk40MlJDQHi8P2B07AviaBqAL0VI9EQi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=pTEfiV%2FfsmGuQxNllsV8PqT0RYc%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%AE%B0%E5%BD%95%E6%88%91%E7%9A%84%E5%BC%80%E5%AD%A6%E7%AC%AC%E4%B8%80%E5%A4%A9", - "event_time": "2025/09/01 12:43:33", - "event_time_at": 1756701813, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "9月起这些新规开始施行", - "hot_value": 9105252, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oEE9BseGagtA7JRBmzYA1aRMoCMAeIxfLFY5gA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=YgH%2BJdVPmi76okIWTRoyEEZ3iDg%3D&from=3218412987", - "link": "https://www.douyin.com/search/9%E6%9C%88%E8%B5%B7%E8%BF%99%E4%BA%9B%E6%96%B0%E8%A7%84%E5%BC%80%E5%A7%8B%E6%96%BD%E8%A1%8C", - "event_time": "2025/09/01 11:48:01", - "event_time_at": 1756698481, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "李幼斌与李云龙跨时空对话", - "hot_value": 8998174, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oAarINBoAgRIPi9VTEMIfHeA11nDtF7hRDuGcA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=3x7yTXHYKiIcnNJjznvZjCw%2FW94%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%9D%8E%E5%B9%BC%E6%96%8C%E4%B8%8E%E6%9D%8E%E4%BA%91%E9%BE%99%E8%B7%A8%E6%97%B6%E7%A9%BA%E5%AF%B9%E8%AF%9D", - "event_time": "2025/09/01 12:01:05", - "event_time_at": 1756699265, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "幼儿园第一天开学哀嚎一片", - "hot_value": 8962824, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osbXMAQYgIwwpkDCfeiDpGaE0gb9MXfeAAuLV2~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=w1l8V4VvjuO%2BvOvuQkXiEuXYko0%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%B9%BC%E5%84%BF%E5%9B%AD%E7%AC%AC%E4%B8%80%E5%A4%A9%E5%BC%80%E5%AD%A6%E5%93%80%E5%9A%8E%E4%B8%80%E7%89%87", - "event_time": "2025/09/01 11:05:01", - "event_time_at": 1756695901, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "田汉把国歌歌词写烟盒上系谣传", - "hot_value": 8930615, - "cover": "https://p3-sign.douyinpic.com/tos-cn-i-0813c001/ogA2AoCCXZMEAGF9f9QAlSACKRgfsC2oAFtIgD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=7%2F8qsoQJd6TgpAEylOW1VyQrqeY%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%94%B0%E6%B1%89%E6%8A%8A%E5%9B%BD%E6%AD%8C%E6%AD%8C%E8%AF%8D%E5%86%99%E7%83%9F%E7%9B%92%E4%B8%8A%E7%B3%BB%E8%B0%A3%E4%BC%A0", - "event_time": "2025/09/01 13:51:28", - "event_time_at": 1756705888, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "苏超联赛积分榜", - "hot_value": 8838219, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o4vPLtWIQAaiggBRkQq5kw9ZlIVA0v1iDAILU~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=JJlPUPmWRzT3UPMenizW639pqVg%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%8B%8F%E8%B6%85%E8%81%94%E8%B5%9B%E7%A7%AF%E5%88%86%E6%A6%9C", - "event_time": "2025/08/31 22:01:53", - "event_time_at": 1756648913, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "一切正开始", - "hot_value": 8609507, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/o8wN0EuXoETsyMz0ADCFFaAsFFTQeQf9fAublW~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=5I8uLkfpNYrGArQm%2BXLBa81NhYY%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B8%80%E5%88%87%E6%AD%A3%E5%BC%80%E5%A7%8B", - "event_time": "2025/09/01 11:56:50", - "event_time_at": 1756699010, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "张玉宁为与球迷起冲突致歉", - "hot_value": 8511631, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oMfoIAFMN5GEWOzpBCDAQfaj7yRArCdByaEUfE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=59ipMtNxZ8W3R5NNAJamlSOEbPo%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%BC%A0%E7%8E%89%E5%AE%81%E4%B8%BA%E4%B8%8E%E7%90%83%E8%BF%B7%E8%B5%B7%E5%86%B2%E7%AA%81%E8%87%B4%E6%AD%89", - "event_time": "2025/09/01 07:53:39", - "event_time_at": 1756684419, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "这一口会很疯狂", - "hot_value": 8454971, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oUIozRIBqC0ahA7FimIAmFEBeqDFfZK3Qfo8PE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=ZBSuTMuu4678gSfReaVIfdK22J8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%BF%99%E4%B8%80%E5%8F%A3%E4%BC%9A%E5%BE%88%E7%96%AF%E7%8B%82", - "event_time": "2025/09/01 10:36:16", - "event_time_at": 1756694176, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "邓超鹿晗合唱超级英雄", - "hot_value": 8357197, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oUBPIdtyQx0j8THRZAmZbyATihavQHI0niLIP~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=%2F66dsj8evHN94wNNFCn%2Bfhagee0%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E9%82%93%E8%B6%85%E9%B9%BF%E6%99%97%E5%90%88%E5%94%B1%E8%B6%85%E7%BA%A7%E8%8B%B1%E9%9B%84", - "event_time": "2025/09/01 07:45:11", - "event_time_at": 1756683911, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "伊萨克加盟利物浦", - "hot_value": 7963081, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ocAw2yaT4I99iDIPh9I3LaIiLBTnBASvH0Q1a~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=v4Gq0Iz87wyZ6lEYYOnKmaeur%2FM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%BC%8A%E8%90%A8%E5%85%8B%E5%8A%A0%E7%9B%9F%E5%88%A9%E7%89%A9%E6%B5%A6", - "event_time": "2025/09/01 09:12:12", - "event_time_at": 1756689132, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "山东泰山6:0北京国安", - "hot_value": 7830358, - "cover": "https://p9-sign.douyinpic.com/tos-cn-p-0015/ogtA9BEEJZDJ9SgzBBLfFN0AflNDGoIAQ2I8A8~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=gu6O%2BhGDarr%2BHQe1P%2BHo9pUmBGU%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%B1%B1%E4%B8%9C%E6%B3%B0%E5%B1%B16%3A0%E5%8C%97%E4%BA%AC%E5%9B%BD%E5%AE%89", - "event_time": "2025/08/31 20:32:53", - "event_time_at": 1756643573, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "又到开学你包书皮了吗", - "hot_value": 7828995, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oUAwaPjCIiLAQI6ADQMAm06TBJxPJFAkCpIIi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=aUkYTtkfaUKbK2DhznXU69sg8SU%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%8F%88%E5%88%B0%E5%BC%80%E5%AD%A6%E4%BD%A0%E5%8C%85%E4%B9%A6%E7%9A%AE%E4%BA%86%E5%90%97", - "event_time": "2025/08/31 17:04:09", - "event_time_at": 1756631049, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "樊振东德甲首秀两连败", - "hot_value": 7754365, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osOdEdibznClYwP0AABAIZW1eg0gbBmAzjiJfl~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=AyWBGXt%2FFFSp0QBM%2Bd5%2F9B4GPvo%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%A8%8A%E6%8C%AF%E4%B8%9C%E5%BE%B7%E7%94%B2%E9%A6%96%E7%A7%80%E4%B8%A4%E8%BF%9E%E8%B4%A5", - "event_time": "2025/09/01 07:16:58", - "event_time_at": 1756682218, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "为什么说00后的童年含金量高", - "hot_value": 7735122, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ogOQEQsnAACDBICh7LeFWRGCjeZneIB9I3oVFy~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Htnqu7SupC%2FmvQpF2DDsLDh5FYA%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%AF%B400%E5%90%8E%E7%9A%84%E7%AB%A5%E5%B9%B4%E5%90%AB%E9%87%91%E9%87%8F%E9%AB%98", - "event_time": "2025/08/31 16:38:30", - "event_time_at": 1756629510, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "刘宇千年直拍", - "hot_value": 7734149, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/ostjBSmQ78E8estIXgFlHQxZQALRFfMepbTJWC~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=CPNw9h%2BpBB82qBykpuT11uMVFjo%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%88%98%E5%AE%87%E5%8D%83%E5%B9%B4%E7%9B%B4%E6%8B%8D", - "event_time": "2025/08/31 21:39:38", - "event_time_at": 1756647578, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "胡塞武装称将对以军袭击发起报复", - "hot_value": 7728698, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oseWgjCRBAfgft7c3QUm8JGApnYMaWdJdGj0SB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=fX6AvTWQvNrihcvEraPHjJIS9iY%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%83%A1%E5%A1%9E%E6%AD%A6%E8%A3%85%E7%A7%B0%E5%B0%86%E5%AF%B9%E4%BB%A5%E5%86%9B%E8%A2%AD%E5%87%BB%E5%8F%91%E8%B5%B7%E6%8A%A5%E5%A4%8D", - "event_time": "2025/09/01 09:40:13", - "event_time_at": 1756690813, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "手把手教你手机变车机", - "hot_value": 7725104, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o47qAXUjDQN6KLr9AjFSCq92ZBf4okAQEfgSAp~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=OoNNciUVTOwZbl17IUYBOjFyBJ4%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E6%89%8B%E6%9C%BA%E5%8F%98%E8%BD%A6%E6%9C%BA", - "event_time": "2025/09/01 11:15:15", - "event_time_at": 1756696515, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "莫迪与普京拥抱手拉手热聊", - "hot_value": 7723445, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oIaWAojVPLRUILGIyvvg1Sd1ZiLAKiCB6zQIX~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=u1IGnKz%2FAckLe%2BYFCQulFw0ioB8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%8E%AB%E8%BF%AA%E4%B8%8E%E6%99%AE%E4%BA%AC%E6%8B%A5%E6%8A%B1%E6%89%8B%E6%8B%89%E6%89%8B%E7%83%AD%E8%81%8A", - "event_time": "2025/09/01 15:38:27", - "event_time_at": 1756712307, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "原来猪猪侠搞抽象领先我20年", - "hot_value": 7706786, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oINGyAfS2oFpfAgF2kYxEJAqTbSeEcgotfxeHv~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=S1Ve0ORP5%2BrHumx%2FK7uJbfm8PbM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%8E%9F%E6%9D%A5%E7%8C%AA%E7%8C%AA%E4%BE%A0%E6%90%9E%E6%8A%BD%E8%B1%A1%E9%A2%86%E5%85%88%E6%88%9120%E5%B9%B4", - "event_time": "2025/09/01 10:52:59", - "event_time_at": 1756695179, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "北京国安就惨败道歉", - "hot_value": 7702358, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oYiXICjfn7uEi3AeK6W04BiXu3iBjigAAs9W0B~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=hgh%2Bfy4Ul82LWgXAL2hkIBMEpJM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%8C%97%E4%BA%AC%E5%9B%BD%E5%AE%89%E5%B0%B1%E6%83%A8%E8%B4%A5%E9%81%93%E6%AD%89", - "event_time": "2025/09/01 09:21:10", - "event_time_at": 1756689670, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "港姐冠军陈咏诗是博士生", - "hot_value": 7702059, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/okoRaMGvQBCI6KmVeBAAQ1eLEg1HK2foQuM7aB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=5Lattu1v38oeQ8xGdXiDLcK4fwM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%B8%AF%E5%A7%90%E5%86%A0%E5%86%9B%E9%99%88%E5%92%8F%E8%AF%97%E6%98%AF%E5%8D%9A%E5%A3%AB%E7%94%9F", - "event_time": "2025/09/01 10:47:23", - "event_time_at": 1756694843, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "王楚钦2:3徐瑛彬", - "hot_value": 7699514, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o00BTIi1ogMR8LBAiQdLmSaIPAuEyIQv1IP48~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=2%2BI5KkQpEugBkQcVCrSLgOtC088%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%8E%8B%E6%A5%9A%E9%92%A62%3A3%E5%BE%90%E7%91%9B%E5%BD%AC", - "event_time": "2025/08/31 21:21:08", - "event_time_at": 1756646468, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "王源 高音", - "hot_value": 7693290, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oYzDIaQiavwPRBUpanIkjAIWzwLCIgPkAyiOj~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=uXVN6xfkB3tz3iVo0DQuxqeaGk0%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%8E%8B%E6%BA%90%20%E9%AB%98%E9%9F%B3", - "event_time": "2025/08/31 20:30:04", - "event_time_at": 1756643404, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "俄乌在苏贾前线展开阵地争夺", - "hot_value": 7691808, - "cover": "https://p9-sign.douyinpic.com/tos-cn-p-0015/oo7iATIG8vA5hIIQBILB4oCgvygsUNzBS1aPi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=SNzQbbxAJqqtdIkck9kvtRUJnZg%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%BF%84%E4%B9%8C%E5%9C%A8%E8%8B%8F%E8%B4%BE%E5%89%8D%E7%BA%BF%E5%B1%95%E5%BC%80%E9%98%B5%E5%9C%B0%E4%BA%89%E5%A4%BA", - "event_time": "2025/09/01 12:56:05", - "event_time_at": 1756702565, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "范丞丞温柔版一个人的夜变装", - "hot_value": 7689433, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oAPLWIAoR3CsXgVBuIQIRiTDyS14gaLPwELAi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=yp9l95J9xlKf55IEP14P7sD7J%2F4%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%8C%83%E4%B8%9E%E4%B8%9E%E6%B8%A9%E6%9F%94%E7%89%88%E4%B8%80%E4%B8%AA%E4%BA%BA%E7%9A%84%E5%A4%9C%E5%8F%98%E8%A3%85", - "event_time": "2025/09/01 15:32:00", - "event_time_at": 1756711920, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "用美食致敬这场胜利", - "hot_value": 7681826, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oIFcUfHotAXxALhJEj2EK9SBNp0fQwKhAbCgQD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Dkuyg5REqCAMEIsp0Dr%2B%2BkAO%2BmQ%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%94%A8%E7%BE%8E%E9%A3%9F%E8%87%B4%E6%95%AC%E8%BF%99%E5%9C%BA%E8%83%9C%E5%88%A9", - "event_time": "2025/09/01 12:08:24", - "event_time_at": 1756699704, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "田曦薇猫猫本体藏不住了", - "hot_value": 7674729, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015c000-ce/oceyeLnbxAXFERxnPfLR2egAkYaXeRpHfhAQME~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=omEVZta%2FQeV%2FSBRNZ3%2BJF0iMXPQ%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%94%B0%E6%9B%A6%E8%96%87%E7%8C%AB%E7%8C%AB%E6%9C%AC%E4%BD%93%E8%97%8F%E4%B8%8D%E4%BD%8F%E4%BA%86", - "event_time": "2025/09/01 14:33:25", - "event_time_at": 1756708405, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "少年心气是不可再生之物", - "hot_value": 7673518, - "cover": "https://p3-sign.douyinpic.com/tos-cn-i-0813c001/oAUJIWFyAFCmtGpmAADAQis69JogkCFAA0Eqff~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=YHeldSJZXPEBMLF2i%2Bj%2Fc60oKsQ%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%B0%91%E5%B9%B4%E5%BF%83%E6%B0%94%E6%98%AF%E4%B8%8D%E5%8F%AF%E5%86%8D%E7%94%9F%E4%B9%8B%E7%89%A9", - "event_time": "2025/09/01 07:54:31", - "event_time_at": 1756684471, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "南通2:1战胜苏州", - "hot_value": 7670255, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/o4WAaBigTGBaeBgrqm5Kir0Af6DGO0IAF6IQPA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=uV2f%2FvbzU4Y9DfhXxnPBc3hOAxY%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%8D%97%E9%80%9A2%3A1%E6%88%98%E8%83%9C%E8%8B%8F%E5%B7%9E", - "event_time": "2025/08/31 18:02:42", - "event_time_at": 1756634562, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "起猛了差点以为入冬了", - "hot_value": 7669368, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/ogA5HPw1xiIwS2szhaBPMZvC1P0LAPPQAigEZ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=UQNTgz2vyL2UMvzVj2gzBmPbM2A%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%B5%B7%E7%8C%9B%E4%BA%86%E5%B7%AE%E7%82%B9%E4%BB%A5%E4%B8%BA%E5%85%A5%E5%86%AC%E4%BA%86", - "event_time": "2025/09/01 14:23:50", - "event_time_at": 1756707830, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "终于轮到我围观军训了", - "hot_value": 7655201, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/oobwIeLUf4O7iiazJOGAQLZO7DRgCDCBLhI2ez~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=WQn5PvdzvIerbF%2B1iNjF3b6itqQ%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%BB%88%E4%BA%8E%E8%BD%AE%E5%88%B0%E6%88%91%E5%9B%B4%E8%A7%82%E5%86%9B%E8%AE%AD%E4%BA%86", - "event_time": "2025/08/31 13:09:34", - "event_time_at": 1756616974, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "金铲铲陪伴是李现最长情的告白", - "hot_value": 7653496, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/oYPAKIM2vpBnPULXOmBbAEac6KzbOhSiILiLP~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=rsA7DcONzMySFGRNa4PMk6ftyBk%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E9%87%91%E9%93%B2%E9%93%B2%E9%99%AA%E4%BC%B4%E6%98%AF%E6%9D%8E%E7%8E%B0%E6%9C%80%E9%95%BF%E6%83%85%E7%9A%84%E5%91%8A%E7%99%BD", - "event_time": "2025/08/31 22:58:48", - "event_time_at": 1756652328, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "张予曦妈妈不介意女儿谈姐弟恋", - "hot_value": 7650811, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oEB5A1NsLFeadA9HQoED9TfmQ8jHgUPxACzjw9~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=KF3nedfpt5iPcUZ%2Fv9SyYI0ZSWg%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%BC%A0%E4%BA%88%E6%9B%A6%E5%A6%88%E5%A6%88%E4%B8%8D%E4%BB%8B%E6%84%8F%E5%A5%B3%E5%84%BF%E8%B0%88%E5%A7%90%E5%BC%9F%E6%81%8B", - "event_time": "2025/08/31 17:44:23", - "event_time_at": 1756633463, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "边伯贤也来刀马刀马了", - "hot_value": 7650164, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ogfBltLZDIGmRGCAseKAeaIBRnQH79gBGOb4kC~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=nLrGTCoyqEGU882IYRhJOStMdpg%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%BE%B9%E4%BC%AF%E8%B4%A4%E4%B9%9F%E6%9D%A5%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC%E4%BA%86", - "event_time": "2025/08/31 13:44:44", - "event_time_at": 1756619084, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "金靖演绎甜美女孩", - "hot_value": 7649913, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/o0cBcsRQjiGGFCOOArGzzeIfLBA7FEYojeKwGQ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=9BY7gGsW39uBcs06t%2BrXTCQ5J5k%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E9%87%91%E9%9D%96%E6%BC%94%E7%BB%8E%E7%94%9C%E7%BE%8E%E5%A5%B3%E5%AD%A9", - "event_time": "2025/08/31 19:00:32", - "event_time_at": 1756638032, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "一口气看日本如何造出反华体制", - "hot_value": 7648850, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oUoyIxcAADE55goYWdhBfFF4HACpRIpy9Xse6K~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=xjjRJGl0AzxkaEnOiVrzRx1hoZ8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B8%80%E5%8F%A3%E6%B0%94%E7%9C%8B%E6%97%A5%E6%9C%AC%E5%A6%82%E4%BD%95%E9%80%A0%E5%87%BA%E5%8F%8D%E5%8D%8E%E4%BD%93%E5%88%B6", - "event_time": "2025/08/30 21:50:31", - "event_time_at": 1756561831, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "张艺兴真空西装跳狼与美女", - "hot_value": 7646868, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/o4YKfLEIEEwo5stfDSFe0s2TFRjxXAAZDCE9Bl~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=gqBuLvszd8eew81uXP8rf7idtog%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%BC%A0%E8%89%BA%E5%85%B4%E7%9C%9F%E7%A9%BA%E8%A5%BF%E8%A3%85%E8%B7%B3%E7%8B%BC%E4%B8%8E%E7%BE%8E%E5%A5%B3", - "event_time": "2025/08/31 22:12:44", - "event_time_at": 1756649564, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "罗永浩对谈脱口秀新王何广智", - "hot_value": 7644688, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/okQ0qo1AKBQP3g981qQA1FEAzGDYjtFFdfYVeD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Mg24ss6tlv%2FY%2B%2B9PS5UdijEG1Dw%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%BD%97%E6%B0%B8%E6%B5%A9%E5%AF%B9%E8%B0%88%E8%84%B1%E5%8F%A3%E7%A7%80%E6%96%B0%E7%8E%8B%E4%BD%95%E5%B9%BF%E6%99%BA", - "event_time": "2025/09/01 13:56:14", - "event_time_at": 1756706174, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "周深的刀马刀马好可爱", - "hot_value": 7644052, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osAPL0laAbWHtEmVBUIKMQDypItTiF3HI0PQi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=qcK3K8uko38iBuRXDg4uCTaqEPc%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%91%A8%E6%B7%B1%E7%9A%84%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC%E5%A5%BD%E5%8F%AF%E7%88%B1", - "event_time": "2025/08/31 18:31:56", - "event_time_at": 1756636316, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "杜克一哥的对话太好哭了", - "hot_value": 7639907, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oofoeQ9VAPDsphKEAiFQbQwCAEwoQgBpLtBC0A~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=wulyNlwPrSoIJu1JKBdKpE142mA%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%9D%9C%E5%85%8B%E4%B8%80%E5%93%A5%E7%9A%84%E5%AF%B9%E8%AF%9D%E5%A4%AA%E5%A5%BD%E5%93%AD%E4%BA%86", - "event_time": "2025/08/30 21:17:58", - "event_time_at": 1756559878, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "外媒全景记录普京抵华现场", - "hot_value": 7637541, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oIGC9LxDIQ6QAI1fG1eEipfA2eZjiGInCHFFEJ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=HiKj%2FiLGiaN2D5GdS5OlAISbGHo%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%A4%96%E5%AA%92%E5%85%A8%E6%99%AF%E8%AE%B0%E5%BD%95%E6%99%AE%E4%BA%AC%E6%8A%B5%E5%8D%8E%E7%8E%B0%E5%9C%BA", - "event_time": "2025/09/01 11:59:34", - "event_time_at": 1756699174, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "赵丽颖工作室明兰代班营业", - "hot_value": 7635755, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015c000-ce/oIhHELPBeI6Ieb0A9OpCuWXh0CAAgiuniEweIw~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=xmQOeLdWN4FaeZjFBqtMQuctYv8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%B5%B5%E4%B8%BD%E9%A2%96%E5%B7%A5%E4%BD%9C%E5%AE%A4%E6%98%8E%E5%85%B0%E4%BB%A3%E7%8F%AD%E8%90%A5%E4%B8%9A", - "event_time": "2025/08/31 20:52:34", - "event_time_at": 1756644754, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/css/background.css deleted file mode 100644 index e84677ca..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/css/background.css +++ /dev/null @@ -1,79 +0,0 @@ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; - background: linear-gradient(180deg, #f0f9f2 0%, #f7fff8 55%, #eef7f1 100%); -} - -.floating-blob { - position: absolute; - width: 420px; - height: 420px; - border-radius: 55% 45% 60% 40% / 50% 50% 45% 55%; - filter: blur(0px); - opacity: 0.28; - background: radial-gradient(circle at 30% 30%, rgba(129, 199, 132, 0.6), rgba(129, 199, 132, 0)); - animation: drift 36s ease-in-out infinite; -} - -.blob-1 { - top: -120px; - left: -160px; - animation-delay: 0s; -} - -.blob-2 { - right: -120px; - bottom: -160px; - animation-delay: 8s; - background: radial-gradient(circle at 70% 70%, rgba(76, 175, 80, 0.5), rgba(76, 175, 80, 0)); -} - -.blob-3 { - top: 45%; - left: 55%; - animation-delay: 16s; - background: radial-gradient(circle at 40% 60%, rgba(165, 214, 167, 0.5), rgba(165, 214, 167, 0)); -} - -@keyframes drift { - 0% { - transform: translate3d(0, 0, 0) scale(1); - } - 33% { - transform: translate3d(30px, -40px, 0) scale(1.05); - } - 66% { - transform: translate3d(-25px, 30px, 0) scale(0.95); - } - 100% { - transform: translate3d(0, 0, 0) scale(1); - } -} - -@media (max-width: 768px) { - .floating-blob { - width: 260px; - height: 260px; - opacity: 0.22; - } - - .blob-1 { - top: -80px; - left: -120px; - } - - .blob-2 { - right: -140px; - bottom: -140px; - } - - .blob-3 { - top: 55%; - left: 48%; - } -} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/css/style.css deleted file mode 100644 index da392817..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/css/style.css +++ /dev/null @@ -1,432 +0,0 @@ -:root { - --primary-50: #f0f9f2; - --primary-100: #d8f3d8; - --primary-200: #bce5c1; - --primary-300: #a0d8a8; - --primary-400: #7fcf8e; - --primary-500: #66bb6a; - --primary-600: #5aa75f; - --primary-700: #4a8c50; - --primary-text: #103a2b; - --muted-text: #49705d; - --card-bg: rgba(255, 255, 255, 0.85); - --border-soft: rgba(102, 187, 106, 0.18); - --shadow-soft: 0 12px 40px rgba(48, 94, 60, 0.12); - --shadow-hover: 0 18px 50px rgba(48, 94, 60, 0.16); - color-scheme: light; -} - -* { - box-sizing: border-box; - margin: 0; - padding: 0; -} - -body { - font-family: "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif; - background: transparent; - color: var(--primary-text); - line-height: 1.6; - min-height: 100vh; - -webkit-font-smoothing: antialiased; -} - -.page { - position: relative; - margin: 0 auto; - width: min(100%, 960px); - padding: 20px 16px 72px; -} - -.page-header { - display: flex; - flex-direction: column; - gap: 16px; - padding: 20px 18px; - border-radius: 18px; - background: var(--card-bg); - box-shadow: var(--shadow-soft); - border: 1px solid var(--border-soft); - backdrop-filter: blur(18px); -} - -.title-block { - display: flex; - flex-direction: column; - gap: 6px; -} - -.label-pill { - align-self: flex-start; - padding: 4px 12px; - font-size: 0.82rem; - font-weight: 600; - color: var(--primary-700); - background: rgba(102, 187, 106, 0.15); - border-radius: 999px; - letter-spacing: 0.06em; -} - -.page-header h1 { - font-size: 1.6rem; - font-weight: 700; - line-height: 1.3; -} - -.meta-block { - display: flex; - flex-direction: column; - gap: 10px; -} - -.update-time { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 6px 12px; - font-size: 0.9rem; - color: var(--muted-text); - background: rgba(255, 255, 255, 0.7); - border-radius: 10px; - border: 1px solid rgba(102, 187, 106, 0.22); -} - -.refresh-button { - align-self: flex-start; - padding: 10px 18px; - font-size: 0.92rem; - font-weight: 600; - color: #fff; - background: linear-gradient(135deg, var(--primary-500), var(--primary-600)); - border: none; - border-radius: 999px; - cursor: pointer; - box-shadow: 0 10px 24px rgba(102, 187, 106, 0.35); - transition: transform 0.2s ease, box-shadow 0.2s ease; -} - -.refresh-button:active { - transform: scale(0.97); -} - -.summary-section { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 14px; - margin-top: 20px; -} - -.summary-card { - padding: 18px 16px; - background: var(--card-bg); - border-radius: 16px; - border: 1px solid var(--border-soft); - box-shadow: var(--shadow-soft); - backdrop-filter: blur(12px); - display: flex; - flex-direction: column; - gap: 8px; -} - -.card-label { - font-size: 0.92rem; - color: var(--muted-text); - letter-spacing: 0.04em; -} - -.card-value { - font-size: 1.4rem; - font-weight: 700; - display: flex; - align-items: baseline; - gap: 6px; - color: var(--primary-700); -} - -.card-value .unit { - font-size: 0.88rem; - font-weight: 500; - color: var(--muted-text); -} - -.list-section { - margin-top: 28px; - padding: 22px 18px 26px; - background: var(--card-bg); - border-radius: 20px; - border: 1px solid var(--border-soft); - box-shadow: var(--shadow-soft); - backdrop-filter: blur(16px); -} - -.section-header { - display: flex; - flex-direction: column; - gap: 6px; - margin-bottom: 20px; -} - -.section-header h2 { - font-size: 1.3rem; - font-weight: 700; -} - -.section-subtitle { - font-size: 0.88rem; - color: var(--muted-text); -} - -.movie-list { - display: flex; - flex-direction: column; - gap: 16px; -} - -.loading, -.error-message { - padding: 18px 16px; - text-align: center; - color: var(--muted-text); - background: rgba(255, 255, 255, 0.7); - border-radius: 14px; - border: 1px dashed rgba(102, 187, 106, 0.35); -} - -.movie-item { - display: grid; - grid-template-columns: auto 1fr; - gap: 14px; - padding: 16px; - border-radius: 18px; - background: rgba(255, 255, 255, 0.95); - border: 1px solid rgba(102, 187, 106, 0.18); - box-shadow: 0 12px 28px rgba(48, 94, 60, 0.08); - transition: transform 0.2s ease, box-shadow 0.2s ease; -} - -.movie-item:hover { - transform: translateY(-2px); - box-shadow: var(--shadow-hover); -} - -.movie-rank { - width: 46px; - height: 46px; - border-radius: 14px; - display: flex; - align-items: center; - justify-content: center; - font-weight: 700; - font-size: 1.1rem; - color: #fff; - background: var(--primary-500); -} - -.movie-rank.top-1 { - background: linear-gradient(135deg, #4caf50, #43a047); -} - -.movie-rank.top-2 { - background: linear-gradient(135deg, #66bb6a, #5aa75f); -} - -.movie-rank.top-3 { - background: linear-gradient(135deg, #81c784, #66bb6a); -} - -.movie-body { - display: flex; - flex-direction: column; - gap: 12px; -} - -.movie-heading { - display: flex; - flex-direction: column; - gap: 6px; -} - -.movie-title { - font-size: 1.1rem; - font-weight: 700; - color: var(--primary-text); -} - -.release-info { - font-size: 0.9rem; - color: var(--muted-text); -} - -.movie-stats { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 10px 14px; -} - -.stat { - display: flex; - flex-direction: column; - gap: 2px; -} - -.stat-label { - font-size: 0.83rem; - color: var(--muted-text); - letter-spacing: 0.02em; -} - -.stat-value { - font-size: 1rem; - font-weight: 600; - color: var(--primary-700); -} - -.progress-metrics { - display: flex; - flex-direction: column; - gap: 8px; - margin-top: 6px; -} - -.progress-group { - display: flex; - flex-direction: column; - gap: 4px; -} - -.progress-label { - display: flex; - justify-content: space-between; - font-size: 0.8rem; - color: var(--muted-text); -} - -.progress-bar { - width: 100%; - height: 6px; - border-radius: 6px; - background: rgba(102, 187, 106, 0.16); - overflow: hidden; -} - -.progress-bar span { - display: block; - height: 100%; - border-radius: inherit; - background: linear-gradient(135deg, rgba(102, 187, 106, 0.9), rgba(76, 175, 80, 0.85)); - width: 0; - transition: width 0.5s ease; -} - -/* Tablet */ -@media (min-width: 600px) { - .page { - padding: 28px 20px 84px; - } - - .page-header { - flex-direction: row; - align-items: center; - justify-content: space-between; - } - - .title-block h1 { - font-size: 1.8rem; - } - - .meta-block { - align-items: flex-end; - } - - .summary-section { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - - .movie-item { - grid-template-columns: 80px 1fr; - padding: 18px 20px; - } - - .movie-rank { - width: 54px; - height: 54px; - font-size: 1.25rem; - } - - .movie-heading { - flex-direction: row; - align-items: center; - justify-content: space-between; - } - - .release-info { - font-size: 0.88rem; - } - - .movie-stats { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - - .progress-metrics { - flex-direction: row; - gap: 16px; - } - - .progress-group { - flex: 1; - } -} - -/* Desktop */ -@media (min-width: 1024px) { - .page { - padding: 36px 24px 96px; - } - - .page-header { - padding: 26px 30px; - } - - .page-header h1 { - font-size: 2.1rem; - } - - .summary-card { - padding: 20px 22px; - } - - .card-value { - font-size: 1.6rem; - } - - .list-section { - padding: 28px 30px 34px; - } - - .movie-item { - grid-template-columns: 96px 1fr; - padding: 22px 26px; - border-radius: 20px; - } - - .movie-title { - font-size: 1.25rem; - } - - .movie-stats { - grid-template-columns: repeat(5, minmax(0, 1fr)); - } - - .progress-metrics { - gap: 18px; - } -} - -@media (prefers-reduced-motion: reduce) { - * { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - scroll-behavior: auto !important; - } -} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/index.html deleted file mode 100644 index f49ef244..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/index.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - 猫眼电影实时票房 - - - - -
    -
    -
    -
    -
    - -
    - - -
    -
    -

    实时大盘

    -

    - -- - -

    -
    -
    -

    综合票房

    -

    - -- - -

    -
    -
    -

    排片场次

    -

    --

    -
    -
    -

    观影人次

    -

    --

    -
    -
    - -
    -
    -

    影片实时表现

    - 数据每 5 秒同步一次 -
    -
    -
    正在加载实时票房...
    -
    -
    -
    - - - - diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/js/main.js b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/js/main.js deleted file mode 100644 index 8cfa5195..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/js/main.js +++ /dev/null @@ -1,297 +0,0 @@ -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top/v2/maoyan/realtime/movie" -]; - -const FALLBACK_ENDPOINT = "./返回接口.json"; -const REFRESH_INTERVAL = 5000; -const MAX_MOVIES_TO_RENDER = 40; - -const updateTimeEl = document.getElementById("updateTime"); -const refreshButton = document.getElementById("refreshButton"); -const summaryTitleEl = document.getElementById("summaryTitle"); -const totalBoxOfficeEl = document.getElementById("totalBoxOffice"); -const totalBoxOfficeUnitEl = document.getElementById("totalBoxOfficeUnit"); -const combinedBoxOfficeEl = document.getElementById("combinedBoxOffice"); -const combinedBoxOfficeUnitEl = document.getElementById("combinedBoxOfficeUnit"); -const showCountEl = document.getElementById("showCount"); -const viewCountEl = document.getElementById("viewCount"); -const movieListEl = document.getElementById("movieList"); - -let autoRefreshTimer = null; -let isLoading = false; - -function escapeHtml(value) { - if (value === undefined || value === null) { - return ""; - } - - return String(value) - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); -} - -function safeText(value) { - if (value === undefined || value === null || value === "") { - return "--"; - } - return escapeHtml(value); -} - -function parseRate(rateText) { - if (!rateText || typeof rateText !== "string") { - return { text: "--", ratio: 0 }; - } - - const trimmed = rateText.trim(); - const numeric = parseFloat(trimmed.replace(/[^0-9.]/g, "")); - let ratio = Number.isFinite(numeric) ? Math.max(0, Math.min(numeric, 100)) : 0; - - if (trimmed.startsWith("<")) { - ratio = Math.max(3, ratio); - } - - return { text: escapeHtml(trimmed), ratio }; -} - -function formatUpdateTime(data) { - if (data && typeof data.updated === "string" && data.updated.trim().length > 0) { - return data.updated.trim(); - } - - if (data && typeof data.updated_at === "number" && !Number.isNaN(data.updated_at)) { - return new Date(data.updated_at).toLocaleString("zh-CN", { - hour12: false - }); - } - - return new Date().toLocaleString("zh-CN", { hour12: false }); -} - -function renderSummary(data) { - summaryTitleEl.textContent = data?.title ? data.title : "实时大盘"; - totalBoxOfficeEl.textContent = data?.split_box_office ? data.split_box_office : "--"; - totalBoxOfficeUnitEl.textContent = data?.split_box_office_unit ? data.split_box_office_unit : ""; - combinedBoxOfficeEl.textContent = data?.box_office ? data.box_office : "--"; - combinedBoxOfficeUnitEl.textContent = data?.box_office_unit ? data.box_office_unit : ""; - showCountEl.textContent = data?.show_count_desc ? data.show_count_desc : "--"; - viewCountEl.textContent = data?.view_count_desc ? data.view_count_desc : "--"; -} - -function createStat(label, value) { - return ` -
    - ${label} - ${safeText(value)} -
    - `; -} - -function createMovieItem(movie, index) { - const item = document.createElement("article"); - item.className = "movie-item"; - - const topClass = index < 3 ? ` top-${index + 1}` : ""; - const name = safeText(movie?.movie_name || "未命名影片"); - const releaseInfo = movie?.release_info ? `
    ${safeText(movie.release_info)}
    ` : ""; - - const boxOfficeDesc = movie?.box_office_desc || (movie?.box_office ? `${movie.box_office}${movie.box_office_unit || ""}` : "--"); - const splitBoxOfficeDesc = movie?.split_box_office_desc || (movie?.split_box_office ? `${movie.split_box_office}${movie.split_box_office_unit || ""}` : "--"); - const totalBoxOfficeDesc = movie?.sum_box_desc ?? "--"; - const totalSplitBoxOfficeDesc = movie?.sum_split_box_desc ?? "--"; - - let showCountText = "--"; - if (movie?.show_count !== undefined && movie.show_count !== null && movie.show_count !== "") { - const numericShowCount = Number(movie.show_count); - showCountText = Number.isFinite(numericShowCount) - ? `${numericShowCount.toLocaleString("zh-CN")} 场` - : movie.show_count; - } - - const avgShowView = movie?.avg_show_view ?? "--"; - const avgSeatView = movie?.avg_seat_view ?? "--"; - - const boxRate = parseRate(movie?.box_office_rate); - const showRate = parseRate(movie?.show_count_rate); - - item.innerHTML = ` -
    ${index + 1}
    -
    -
    -
    -
    ${name}
    - ${releaseInfo} -
    -
    -
    - ${createStat("单日综合票房", boxOfficeDesc)} - ${createStat("单日分账票房", splitBoxOfficeDesc)} - ${createStat("累计综合票房", totalBoxOfficeDesc)} - ${createStat("累计分账票房", totalSplitBoxOfficeDesc)} - ${createStat("排片场次", showCountText)} - ${createStat("场均人次", avgShowView)} - ${createStat("上座率", avgSeatView)} -
    -
    -
    -
    - 综合票房占比 - ${boxRate.text} -
    -
    -
    -
    -
    - 排片占比 - ${showRate.text} -
    -
    -
    -
    -
    - `; - - const progressBars = item.querySelectorAll(".progress-bar span"); - if (progressBars[0]) { - progressBars[0].style.width = `${boxRate.ratio}%`; - } - if (progressBars[1]) { - progressBars[1].style.width = `${showRate.ratio}%`; - } - - return item; -} - -function renderMovieList(list) { - movieListEl.innerHTML = ""; - - if (!Array.isArray(list) || list.length === 0) { - const empty = document.createElement("div"); - empty.className = "error-message"; - empty.textContent = "暂时没有可展示的实时票房数据"; - movieListEl.appendChild(empty); - return; - } - - const sliced = list.slice(0, MAX_MOVIES_TO_RENDER); - sliced.forEach((movie, index) => { - movieListEl.appendChild(createMovieItem(movie, index)); - }); -} - -async function requestJson(url) { - const response = await fetch(url, { - cache: "no-store" - }); - - if (!response.ok) { - throw new Error(`请求失败: ${response.status}`); - } - - return response.json(); -} - -async function retrieveData() { - for (const endpoint of API_ENDPOINTS) { - try { - const result = await requestJson(endpoint); - if (result?.code === 200 && result?.data) { - return result.data; - } - } catch (error) { - console.warn("主接口请求失败", error); - } - } - - try { - const fallbackResult = await requestJson(FALLBACK_ENDPOINT); - if (fallbackResult?.data) { - return fallbackResult.data; - } - } catch (error) { - console.warn("本地示例数据读取失败", error); - } - - return null; -} - -async function loadData(isManual = false) { - if (isLoading) { - return; - } - - isLoading = true; - - if (isManual) { - refreshButton.disabled = true; - refreshButton.textContent = "刷新中..."; - } - - if (!movieListEl.children.length) { - movieListEl.innerHTML = '
    正在加载实时票房...
    '; - } - - try { - const data = await retrieveData(); - if (!data) { - throw new Error("无法获取数据"); - } - - renderSummary(data); - renderMovieList(Array.isArray(data.list) ? data.list : []); - updateTimeEl.textContent = `最近更新 ${formatUpdateTime(data)}`; - } catch (error) { - console.error("加载数据失败", error); - movieListEl.innerHTML = ""; - const err = document.createElement("div"); - err.className = "error-message"; - err.textContent = "数据获取暂时遇到问题,系统会稍后自动重试"; - movieListEl.appendChild(err); - updateTimeEl.textContent = "最近更新 --"; - renderSummary(null); - } finally { - if (isManual) { - refreshButton.disabled = false; - refreshButton.textContent = "手动刷新"; - } - isLoading = false; - } -} - -function startAutoRefresh() { - if (autoRefreshTimer) { - clearInterval(autoRefreshTimer); - } - autoRefreshTimer = setInterval(() => { - loadData(false); - }, REFRESH_INTERVAL); -} - -refreshButton.addEventListener("click", () => { - loadData(true); -}); - -document.addEventListener("visibilitychange", () => { - if (document.hidden) { - if (autoRefreshTimer) { - clearInterval(autoRefreshTimer); - autoRefreshTimer = null; - } - } else { - startAutoRefresh(); - loadData(false); - } -}); - -function init() { - loadData(false); - startAutoRefresh(); -} - -if (document.readyState === "loading") { - document.addEventListener("DOMContentLoaded", init); -} else { - init(); -} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/返回接口.json deleted file mode 100644 index 9651c7d3..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/返回接口.json +++ /dev/null @@ -1,1861 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "title": "实时大盘", - "show_count_desc": "35.4万", - "view_count_desc": "73.2万", - "split_box_office": "2669.5", - "split_box_office_unit": "万", - "box_office": "2669.5", - "box_office_unit": "万", - "update_gap_second": 5, - "updated": "2025-09-26 08:02:00", - "updated_at": 1758873720693, - "list": [ - { - "movie_id": 1207331, - "movie_name": "731", - "release_info": "上映9天", - "box_office": "1791.41", - "box_office_unit": "万", - "box_office_desc": "1791.41万", - "box_office_rate": "67.1%", - "split_box_office": "1686.17", - "split_box_office_unit": "万", - "split_box_office_desc": "1686.17万", - "split_box_office_rate": "67.2%", - "show_count": 206074, - "show_count_rate": "58.2%", - "avg_show_view": "2.4", - "avg_seat_view": "1.7%", - "sum_box_desc": "13.86亿", - "sum_split_box_desc": "12.59亿" - }, - { - "movie_id": 1505571, - "movie_name": "捕风追影", - "release_info": "上映42天", - "box_office": "226.43", - "box_office_unit": "万", - "box_office_desc": "226.43万", - "box_office_rate": "8.4%", - "split_box_office": "202.53", - "split_box_office_unit": "万", - "split_box_office_desc": "202.53万", - "split_box_office_rate": "8.0%", - "show_count": 44432, - "show_count_rate": "12.5%", - "avg_show_view": "1.4", - "avg_seat_view": "1.3%", - "sum_box_desc": "12.06亿", - "sum_split_box_desc": "10.71亿" - }, - { - "movie_id": 1531082, - "movie_name": "窗外是蓝星", - "release_info": "上映22天", - "box_office": "102.39", - "box_office_unit": "万", - "box_office_desc": "102.39万", - "box_office_rate": "3.8%", - "split_box_office": "100.65", - "split_box_office_unit": "万", - "split_box_office_desc": "100.65万", - "split_box_office_rate": "4.0%", - "show_count": 5681, - "show_count_rate": "1.6%", - "avg_show_view": "5.0", - "avg_seat_view": "4.7%", - "sum_box_desc": "3807.1万", - "sum_split_box_desc": "3634.0万" - }, - { - "movie_id": 1515448, - "movie_name": "浪浪山小妖怪", - "release_info": "上映56天", - "box_office": "88.95", - "box_office_unit": "万", - "box_office_desc": "88.95万", - "box_office_rate": "3.3%", - "split_box_office": "78.92", - "split_box_office_unit": "万", - "split_box_office_desc": "78.92万", - "split_box_office_rate": "3.1%", - "show_count": 28121, - "show_count_rate": "7.9%", - "avg_show_view": "0.9", - "avg_seat_view": "0.8%", - "sum_box_desc": "16.41亿", - "sum_split_box_desc": "14.66亿" - }, - { - "movie_id": 1522657, - "movie_name": "南京照相馆", - "release_info": "上映64天", - "box_office": "82.47", - "box_office_unit": "万", - "box_office_desc": "82.47万", - "box_office_rate": "3.0%", - "split_box_office": "77.50", - "split_box_office_unit": "万", - "split_box_office_desc": "77.50万", - "split_box_office_rate": "3.0%", - "show_count": 19778, - "show_count_rate": "5.5%", - "avg_show_view": "1.2", - "avg_seat_view": "1.2%", - "sum_box_desc": "30.03亿", - "sum_split_box_desc": "26.94亿" - }, - { - "movie_id": 1547369, - "movie_name": "红丝绸", - "release_info": "上映21天", - "box_office": "60.55", - "box_office_unit": "万", - "box_office_desc": "60.55万", - "box_office_rate": "2.2%", - "split_box_office": "60.35", - "split_box_office_unit": "万", - "split_box_office_desc": "60.35万", - "split_box_office_rate": "2.4%", - "show_count": 313, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "50.9", - "avg_seat_view": "46.8%", - "sum_box_desc": "1114.9万", - "sum_split_box_desc": "1095.2万" - }, - { - "movie_id": 1536837, - "movie_name": "营救飞虎", - "release_info": "上映24天", - "box_office": "35.54", - "box_office_unit": "万", - "box_office_desc": "35.54万", - "box_office_rate": "1.3%", - "split_box_office": "35.42", - "split_box_office_unit": "万", - "split_box_office_desc": "35.42万", - "split_box_office_rate": "1.4%", - "show_count": 257, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "32.9", - "avg_seat_view": "32.4%", - "sum_box_desc": "2456.3万", - "sum_split_box_desc": "2431.0万" - }, - { - "movie_id": 1298226, - "movie_name": "死神来了:血脉诅咒", - "release_info": "上映36天", - "box_office": "31.42", - "box_office_unit": "万", - "box_office_desc": "31.42万", - "box_office_rate": "1.1%", - "split_box_office": "27.59", - "split_box_office_unit": "万", - "split_box_office_desc": "27.59万", - "split_box_office_rate": "1.1%", - "show_count": 9723, - "show_count_rate": "2.7%", - "avg_show_view": "0.8", - "avg_seat_view": "0.8%", - "sum_box_desc": "1.91亿", - "sum_split_box_desc": "1.69亿" - }, - { - "movie_id": 1523743, - "movie_name": "坏蛋联盟2", - "release_info": "上映42天", - "box_office": "28.70", - "box_office_unit": "万", - "box_office_desc": "28.70万", - "box_office_rate": "1.0%", - "split_box_office": "27.49", - "split_box_office_unit": "万", - "split_box_office_desc": "27.49万", - "split_box_office_rate": "1.0%", - "show_count": 4622, - "show_count_rate": "1.3%", - "avg_show_view": "1.2", - "avg_seat_view": "1.3%", - "sum_box_desc": "1.98亿", - "sum_split_box_desc": "1.78亿" - }, - { - "movie_id": 1499675, - "movie_name": "毕正明的证明", - "release_info": "点映", - "box_office": "25.80", - "box_office_unit": "万", - "box_office_desc": "25.80万", - "box_office_rate": "0.9%", - "split_box_office": "25.59", - "split_box_office_unit": "万", - "split_box_office_desc": "25.59万", - "split_box_office_rate": "1.0%", - "show_count": 28, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "157.6", - "avg_seat_view": "100.0%", - "sum_box_desc": "25.8万", - "sum_split_box_desc": "25.5万" - }, - { - "movie_id": 1572273, - "movie_name": "山河为证", - "release_info": "上映43天", - "box_office": "24.89", - "box_office_unit": "万", - "box_office_desc": "24.89万", - "box_office_rate": "0.9%", - "split_box_office": "24.88", - "split_box_office_unit": "万", - "split_box_office_desc": "24.88万", - "split_box_office_rate": "0.9%", - "show_count": 126, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "44.3", - "avg_seat_view": "37.1%", - "sum_box_desc": "2904.6万", - "sum_split_box_desc": "2894.9万" - }, - { - "movie_id": 1250679, - "movie_name": "洛桑的家事", - "release_info": "上映16天", - "box_office": "20.09", - "box_office_unit": "万", - "box_office_desc": "20.09万", - "box_office_rate": "0.7%", - "split_box_office": "20.08", - "split_box_office_unit": "万", - "split_box_office_desc": "20.08万", - "split_box_office_rate": "0.8%", - "show_count": 167, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "22.4", - "avg_seat_view": "20.7%", - "sum_box_desc": "519.8万", - "sum_split_box_desc": "517.7万" - }, - { - "movie_id": 1542730, - "movie_name": "奇遇", - "release_info": "上映50天", - "box_office": "16.11", - "box_office_unit": "万", - "box_office_desc": "16.11万", - "box_office_rate": "0.6%", - "split_box_office": "13.96", - "split_box_office_unit": "万", - "split_box_office_desc": "13.96万", - "split_box_office_rate": "0.5%", - "show_count": 4473, - "show_count_rate": "1.2%", - "avg_show_view": "1.1", - "avg_seat_view": "1.3%", - "sum_box_desc": "1.86亿", - "sum_split_box_desc": "1.63亿" - }, - { - "movie_id": 1500636, - "movie_name": "罗小黑战记2", - "release_info": "上映71天", - "box_office": "15.94", - "box_office_unit": "万", - "box_office_desc": "15.94万", - "box_office_rate": "0.5%", - "split_box_office": "14.14", - "split_box_office_unit": "万", - "split_box_office_desc": "14.14万", - "split_box_office_rate": "0.5%", - "show_count": 3761, - "show_count_rate": "1.0%", - "avg_show_view": "1.1", - "avg_seat_view": "1.2%", - "sum_box_desc": "5.21亿", - "sum_split_box_desc": "4.64亿" - }, - { - "movie_id": 1489329, - "movie_name": "浪浪人生", - "release_info": "点映", - "box_office": "15.34", - "box_office_unit": "万", - "box_office_desc": "15.34万", - "box_office_rate": "0.5%", - "split_box_office": "15.34", - "split_box_office_unit": "万", - "split_box_office_desc": "15.34万", - "split_box_office_rate": "0.6%", - "show_count": 19, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "143.8", - "avg_seat_view": "84.7%", - "sum_box_desc": "69.2万", - "sum_split_box_desc": "66.7万" - }, - { - "movie_id": 1454962, - "movie_name": "F1:狂飙飞车", - "release_info": "上映92天", - "box_office": "13.84", - "box_office_unit": "万", - "box_office_desc": "13.84万", - "box_office_rate": "0.5%", - "split_box_office": "12.42", - "split_box_office_unit": "万", - "split_box_office_desc": "12.42万", - "split_box_office_rate": "0.4%", - "show_count": 979, - "show_count_rate": "0.2%", - "avg_show_view": "2.5", - "avg_seat_view": "1.5%", - "sum_box_desc": "4.41亿", - "sum_split_box_desc": "3.94亿" - }, - { - "movie_id": 1584781, - "movie_name": "生还", - "release_info": "上映24天", - "box_office": "12.97", - "box_office_unit": "万", - "box_office_desc": "12.97万", - "box_office_rate": "0.4%", - "split_box_office": "12.94", - "split_box_office_unit": "万", - "split_box_office_desc": "12.94万", - "split_box_office_rate": "0.5%", - "show_count": 115, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "29.4", - "avg_seat_view": "26.0%", - "sum_box_desc": "358.2万", - "sum_split_box_desc": "354.7万" - }, - { - "movie_id": 1552050, - "movie_name": "汉斯·季默与朋友们:沙漠之钻音乐会", - "release_info": "上映7天", - "box_office": "9.52", - "box_office_unit": "万", - "box_office_desc": "9.52万", - "box_office_rate": "0.3%", - "split_box_office": "8.50", - "split_box_office_unit": "万", - "split_box_office_desc": "8.50万", - "split_box_office_rate": "0.3%", - "show_count": 822, - "show_count_rate": "0.2%", - "avg_show_view": "2.4", - "avg_seat_view": "1.8%", - "sum_box_desc": "181.7万", - "sum_split_box_desc": "164.7万" - }, - { - "movie_id": 343898, - "movie_name": "东极岛", - "release_info": "上映50天", - "box_office": "9.05", - "box_office_unit": "万", - "box_office_desc": "9.05万", - "box_office_rate": "0.3%", - "split_box_office": "8.67", - "split_box_office_unit": "万", - "split_box_office_desc": "8.67万", - "split_box_office_rate": "0.3%", - "show_count": 1837, - "show_count_rate": "0.5%", - "avg_show_view": "1.3", - "avg_seat_view": "1.4%", - "sum_box_desc": "3.96亿", - "sum_split_box_desc": "3.54亿" - }, - { - "movie_id": 1520596, - "movie_name": "轻于鸿毛", - "release_info": "上映14天", - "box_office": "8.85", - "box_office_unit": "万", - "box_office_desc": "8.85万", - "box_office_rate": "0.3%", - "split_box_office": "8.14", - "split_box_office_unit": "万", - "split_box_office_desc": "8.14万", - "split_box_office_rate": "0.3%", - "show_count": 4420, - "show_count_rate": "1.2%", - "avg_show_view": "0.5", - "avg_seat_view": "0.6%", - "sum_box_desc": "1479.7万", - "sum_split_box_desc": "1325.2万" - }, - { - "movie_id": 431882, - "movie_name": "新三峡", - "release_info": "上映93天", - "box_office": "4.82", - "box_office_unit": "万", - "box_office_desc": "4.82万", - "box_office_rate": "0.1%", - "split_box_office": "4.82", - "split_box_office_unit": "万", - "split_box_office_desc": "4.82万", - "split_box_office_rate": "0.1%", - "show_count": 12, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "78.9", - "avg_seat_view": "38.8%", - "sum_box_desc": "893.9万", - "sum_split_box_desc": "891.7万" - }, - { - "movie_id": 1511555, - "movie_name": "有朵云像你", - "release_info": "上映29天", - "box_office": "4.78", - "box_office_unit": "万", - "box_office_desc": "4.78万", - "box_office_rate": "0.1%", - "split_box_office": "4.09", - "split_box_office_unit": "万", - "split_box_office_desc": "4.09万", - "split_box_office_rate": "0.1%", - "show_count": 2017, - "show_count_rate": "0.5%", - "avg_show_view": "0.7", - "avg_seat_view": "0.8%", - "sum_box_desc": "5131.8万", - "sum_split_box_desc": "4540.4万" - }, - { - "movie_id": 1489326, - "movie_name": "7天", - "release_info": "上映29天", - "box_office": "4.19", - "box_office_unit": "万", - "box_office_desc": "4.19万", - "box_office_rate": "0.1%", - "split_box_office": "4.01", - "split_box_office_unit": "万", - "split_box_office_desc": "4.01万", - "split_box_office_rate": "0.1%", - "show_count": 842, - "show_count_rate": "0.2%", - "avg_show_view": "1.3", - "avg_seat_view": "1.6%", - "sum_box_desc": "6214.2万", - "sum_split_box_desc": "5481.7万" - }, - { - "movie_id": 1538211, - "movie_name": "临时决斗", - "release_info": "上映8天", - "box_office": "4.04", - "box_office_unit": "万", - "box_office_desc": "4.04万", - "box_office_rate": "0.1%", - "split_box_office": "3.73", - "split_box_office_unit": "万", - "split_box_office_desc": "3.73万", - "split_box_office_rate": "0.1%", - "show_count": 1843, - "show_count_rate": "0.5%", - "avg_show_view": "0.6", - "avg_seat_view": "0.6%", - "sum_box_desc": "126.1万", - "sum_split_box_desc": "112.0万" - }, - { - "movie_id": 1523868, - "movie_name": "三国的星空第一部", - "release_info": "点映", - "box_office": "3.36", - "box_office_unit": "万", - "box_office_desc": "3.36万", - "box_office_rate": "0.1%", - "split_box_office": "3.19", - "split_box_office_unit": "万", - "split_box_office_desc": "3.19万", - "split_box_office_rate": "0.1%", - "show_count": 3, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "261.0", - "avg_seat_view": "94.6%", - "sum_box_desc": "13.8万", - "sum_split_box_desc": "13.6万" - }, - { - "movie_id": 1547424, - "movie_name": "关于约会的一切", - "release_info": "上映22天", - "box_office": "3.15", - "box_office_unit": "万", - "box_office_desc": "3.15万", - "box_office_rate": "0.1%", - "split_box_office": "2.83", - "split_box_office_unit": "万", - "split_box_office_desc": "2.83万", - "split_box_office_rate": "0.1%", - "show_count": 441, - "show_count_rate": "0.1%", - "avg_show_view": "1.6", - "avg_seat_view": "1.5%", - "sum_box_desc": "381.5万", - "sum_split_box_desc": "342.6万" - }, - { - "movie_id": 1593640, - "movie_name": "疯狂电脑城", - "release_info": "点映", - "box_office": "3.07", - "box_office_unit": "万", - "box_office_desc": "3.07万", - "box_office_rate": "0.1%", - "split_box_office": "3.01", - "split_box_office_unit": "万", - "split_box_office_desc": "3.01万", - "split_box_office_rate": "0.1%", - "show_count": 10, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "101.0", - "avg_seat_view": "98.9%", - "sum_box_desc": "3.0万", - "sum_split_box_desc": "3.0万" - }, - { - "movie_id": 1462786, - "movie_name": "爱心之拳", - "release_info": "上映29天", - "box_office": "2.84", - "box_office_unit": "万", - "box_office_desc": "2.84万", - "box_office_rate": "0.1%", - "split_box_office": "2.84", - "split_box_office_unit": "万", - "split_box_office_desc": "2.84万", - "split_box_office_rate": "0.1%", - "show_count": 14, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "101.5", - "avg_seat_view": "27.0%", - "sum_box_desc": "93.6万", - "sum_split_box_desc": "93.6万" - }, - { - "movie_id": 1575780, - "movie_name": "蛟龙行动(特别版)", - "release_info": "上映28天", - "box_office": "2.79", - "box_office_unit": "万", - "box_office_desc": "2.79万", - "box_office_rate": "0.1%", - "split_box_office": "2.69", - "split_box_office_unit": "万", - "split_box_office_desc": "2.69万", - "split_box_office_rate": "0.1%", - "show_count": 952, - "show_count_rate": "0.2%", - "avg_show_view": "0.7", - "avg_seat_view": "0.7%", - "sum_box_desc": "2463.4万", - "sum_split_box_desc": "2194.8万" - }, - { - "movie_id": 1591480, - "movie_name": "白马姐妹", - "release_info": "", - "box_office": "2.09", - "box_office_unit": "万", - "box_office_desc": "2.09万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "2.09", - "split_box_office_unit": "万", - "split_box_office_desc": "2.09万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "418.0", - "avg_seat_view": "65.7%", - "sum_box_desc": "2.0万", - "sum_split_box_desc": "2.0万" - }, - { - "movie_id": 1519217, - "movie_name": "坪石先生", - "release_info": "上映43天", - "box_office": "1.76", - "box_office_unit": "万", - "box_office_desc": "1.76万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "1.76", - "split_box_office_unit": "万", - "split_box_office_desc": "1.76万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 11, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "61.4", - "avg_seat_view": "84.2%", - "sum_box_desc": "233.0万", - "sum_split_box_desc": "228.0万" - }, - { - "movie_id": 1499719, - "movie_name": "只此青绿", - "release_info": "", - "box_office": "1.66", - "box_office_unit": "万", - "box_office_desc": "1.66万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "1.44", - "split_box_office_unit": "万", - "split_box_office_desc": "1.44万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 823, - "show_count_rate": "0.2%", - "avg_show_view": "0.7", - "avg_seat_view": "0.6%", - "sum_box_desc": "5318.8万", - "sum_split_box_desc": "4830.5万" - }, - { - "movie_id": 1496400, - "movie_name": "天大的事", - "release_info": "上映12天", - "box_office": "1.29", - "box_office_unit": "万", - "box_office_desc": "1.29万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "1.18", - "split_box_office_unit": "万", - "split_box_office_desc": "1.18万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 4936, - "show_count_rate": "1.3%", - "avg_show_view": "\u003C0.1", - "avg_seat_view": "0.0%", - "sum_box_desc": "31.4万", - "sum_split_box_desc": "28.4万" - }, - { - "movie_id": 1461072, - "movie_name": "长空之王", - "release_info": "", - "box_office": "1.15", - "box_office_unit": "万", - "box_office_desc": "1.15万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "1.09", - "split_box_office_unit": "万", - "split_box_office_desc": "1.09万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 70, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "4.4", - "avg_seat_view": "5.7%", - "sum_box_desc": "8.54亿", - "sum_split_box_desc": "7.85亿" - }, - { - "movie_id": 1522287, - "movie_name": "长安的荔枝", - "release_info": "上映71天", - "box_office": "1.10", - "box_office_unit": "万", - "box_office_desc": "1.10万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.97", - "split_box_office_unit": "万", - "split_box_office_desc": "0.97万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 397, - "show_count_rate": "0.1%", - "avg_show_view": "0.8", - "avg_seat_view": "1.0%", - "sum_box_desc": "6.90亿", - "sum_split_box_desc": "6.15亿" - }, - { - "movie_id": 1562636, - "movie_name": "爱的暂停键", - "release_info": "上映22天", - "box_office": "1.06", - "box_office_unit": "万", - "box_office_desc": "1.06万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.94", - "split_box_office_unit": "万", - "split_box_office_desc": "0.94万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 182, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.3", - "avg_seat_view": "1.5%", - "sum_box_desc": "140.4万", - "sum_split_box_desc": "125.1万" - }, - { - "movie_id": 1592162, - "movie_name": "地球脉动:万物有道", - "release_info": "上映15天", - "box_office": "0.97", - "box_office_unit": "万", - "box_office_desc": "0.97万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.88", - "split_box_office_unit": "万", - "split_box_office_desc": "0.88万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 288, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.8", - "avg_seat_view": "0.7%", - "sum_box_desc": "43.4万", - "sum_split_box_desc": "39.2万" - }, - { - "movie_id": 1498162, - "movie_name": "午夜怪谈2", - "release_info": "上映15天", - "box_office": "0.97", - "box_office_unit": "万", - "box_office_desc": "0.97万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.87", - "split_box_office_unit": "万", - "split_box_office_desc": "0.87万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1792, - "show_count_rate": "0.5%", - "avg_show_view": "0.2", - "avg_seat_view": "0.1%", - "sum_box_desc": "156.3万", - "sum_split_box_desc": "138.9万" - }, - { - "movie_id": 1288259, - "movie_name": "如果悲伤可以解释", - "release_info": "上映30天", - "box_office": "0.82", - "box_office_unit": "万", - "box_office_desc": "0.82万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.75", - "split_box_office_unit": "万", - "split_box_office_desc": "0.75万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "110.0", - "avg_seat_view": "70.5%", - "sum_box_desc": "8.6万", - "sum_split_box_desc": "8.1万" - }, - { - "movie_id": 1470241, - "movie_name": "以法之名", - "release_info": "", - "box_office": "0.54", - "box_office_unit": "万", - "box_office_desc": "0.54万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.54", - "split_box_office_unit": "万", - "split_box_office_desc": "0.54万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 9, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "25.1", - "avg_seat_view": "29.6%", - "sum_box_desc": "93.9万", - "sum_split_box_desc": "93.8万" - }, - { - "movie_id": 1435060, - "movie_name": "夏雨来", - "release_info": "上映42天", - "box_office": "0.50", - "box_office_unit": "万", - "box_office_desc": "0.50万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.45", - "split_box_office_unit": "万", - "split_box_office_desc": "0.45万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 207, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.8", - "avg_seat_view": "0.8%", - "sum_box_desc": "2784.3万", - "sum_split_box_desc": "2498.7万" - }, - { - "movie_id": 1395730, - "movie_name": "老墙", - "release_info": "", - "box_office": "0.49", - "box_office_unit": "万", - "box_office_desc": "0.49万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.49", - "split_box_office_unit": "万", - "split_box_office_desc": "0.49万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 10, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "16.5", - "avg_seat_view": "11.0%", - "sum_box_desc": "123.5万", - "sum_split_box_desc": "121.5万" - }, - { - "movie_id": 1573266, - "movie_name": "带你回家", - "release_info": "点映", - "box_office": "0.47", - "box_office_unit": "万", - "box_office_desc": "0.47万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.45", - "split_box_office_unit": "万", - "split_box_office_desc": "0.45万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "131.0", - "avg_seat_view": "100.0%", - "sum_box_desc": "1.9万", - "sum_split_box_desc": "1.8万" - }, - { - "movie_id": 1360592, - "movie_name": "当男人恋爱时", - "release_info": "", - "box_office": "0.43", - "box_office_unit": "万", - "box_office_desc": "0.43万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.37", - "split_box_office_unit": "万", - "split_box_office_desc": "0.37万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 403, - "show_count_rate": "0.1%", - "avg_show_view": "0.3", - "avg_seat_view": "0.2%", - "sum_box_desc": "2.64亿", - "sum_split_box_desc": "2.32亿" - }, - { - "movie_id": 1449451, - "movie_name": "人生一世", - "release_info": "展映", - "box_office": "0.36", - "box_office_unit": "万", - "box_office_desc": "0.36万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.34", - "split_box_office_unit": "万", - "split_box_office_desc": "0.34万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "68.0", - "avg_seat_view": "68.0%", - "sum_box_desc": "2.2万", - "sum_split_box_desc": "2.1万" - }, - { - "movie_id": 1530212, - "movie_name": "蔡伦传奇", - "release_info": "上映首日", - "box_office": "0.33", - "box_office_unit": "万", - "box_office_desc": "0.33万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.33", - "split_box_office_unit": "万", - "split_box_office_desc": "0.33万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "134.0", - "avg_seat_view": "76.5%", - "sum_box_desc": "3352", - "sum_split_box_desc": "3352" - }, - { - "movie_id": 1530145, - "movie_name": "蜗牛回忆录", - "release_info": "上映22天", - "box_office": "0.28", - "box_office_unit": "万", - "box_office_desc": "0.28万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.25", - "split_box_office_unit": "万", - "split_box_office_desc": "0.25万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 88, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.8", - "avg_seat_view": "0.8%", - "sum_box_desc": "73.8万", - "sum_split_box_desc": "66.4万" - }, - { - "movie_id": 1469373, - "movie_name": "逃离抢钱镇", - "release_info": "上映14天", - "box_office": "0.28", - "box_office_unit": "万", - "box_office_desc": "0.28万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.25", - "split_box_office_unit": "万", - "split_box_office_desc": "0.25万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 110, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.6", - "avg_seat_view": "0.7%", - "sum_box_desc": "38.5万", - "sum_split_box_desc": "34.5万" - }, - { - "movie_id": 1490948, - "movie_name": "聊斋:兰若寺", - "release_info": "上映77天", - "box_office": "0.26", - "box_office_unit": "万", - "box_office_desc": "0.26万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.23", - "split_box_office_unit": "万", - "split_box_office_desc": "0.23万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 99, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.8", - "avg_seat_view": "0.9%", - "sum_box_desc": "2.43亿", - "sum_split_box_desc": "2.15亿" - }, - { - "movie_id": 1518617, - "movie_name": "小鹿斑比:清算", - "release_info": "上映21天", - "box_office": "0.26", - "box_office_unit": "万", - "box_office_desc": "0.26万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.23", - "split_box_office_unit": "万", - "split_box_office_desc": "0.23万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 590, - "show_count_rate": "0.1%", - "avg_show_view": "0.1", - "avg_seat_view": "0.1%", - "sum_box_desc": "217.6万", - "sum_split_box_desc": "194.5万" - }, - { - "movie_id": 1524059, - "movie_name": "别把作文当回事儿", - "release_info": "上映15天", - "box_office": "0.25", - "box_office_unit": "万", - "box_office_desc": "0.25万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.23", - "split_box_office_unit": "万", - "split_box_office_desc": "0.23万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "33.5", - "avg_seat_view": "20.1%", - "sum_box_desc": "55.8万", - "sum_split_box_desc": "55.0万" - }, - { - "movie_id": 1427899, - "movie_name": "天宝", - "release_info": "上映79天", - "box_office": "0.23", - "box_office_unit": "万", - "box_office_desc": "0.23万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.23", - "split_box_office_unit": "万", - "split_box_office_desc": "0.23万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 3, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "21.3", - "avg_seat_view": "16.9%", - "sum_box_desc": "351.2万", - "sum_split_box_desc": "343.0万" - }, - { - "movie_id": 1593298, - "movie_name": "海洋之谜", - "release_info": "展映", - "box_office": "0.20", - "box_office_unit": "万", - "box_office_desc": "0.20万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.19", - "split_box_office_unit": "万", - "split_box_office_desc": "0.19万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "41.0", - "avg_seat_view": "12.0%", - "sum_box_desc": "6.4万", - "sum_split_box_desc": "6.0万" - }, - { - "movie_id": 1487834, - "movie_name": "熊孩子·探险熊兵", - "release_info": "上映14天", - "box_office": "0.17", - "box_office_unit": "万", - "box_office_desc": "0.17万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.16", - "split_box_office_unit": "万", - "split_box_office_desc": "0.16万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 651, - "show_count_rate": "0.1%", - "avg_show_view": "\u003C0.1", - "avg_seat_view": "0.0%", - "sum_box_desc": "172.8万", - "sum_split_box_desc": "165.3万" - }, - { - "movie_id": 1491476, - "movie_name": "超人", - "release_info": "上映78天", - "box_office": "0.13", - "box_office_unit": "万", - "box_office_desc": "0.13万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.12", - "split_box_office_unit": "万", - "split_box_office_desc": "0.12万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 44, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.5", - "avg_seat_view": "0.5%", - "sum_box_desc": "6392.8万", - "sum_split_box_desc": "5729.0万" - }, - { - "movie_id": 1527997, - "movie_name": "大别山久生", - "release_info": "上映17天", - "box_office": "0.12", - "box_office_unit": "万", - "box_office_desc": "0.12万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.12", - "split_box_office_unit": "万", - "split_box_office_desc": "0.12万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "25.5", - "avg_seat_view": "18.8%", - "sum_box_desc": "3.1万", - "sum_split_box_desc": "3.1万" - }, - { - "movie_id": 1528424, - "movie_name": "午夜凶镜", - "release_info": "上映29天", - "box_office": "0.12", - "box_office_unit": "万", - "box_office_desc": "0.12万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.11", - "split_box_office_unit": "万", - "split_box_office_desc": "0.11万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 292, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.1", - "avg_seat_view": "0.1%", - "sum_box_desc": "172.0万", - "sum_split_box_desc": "152.2万" - }, - { - "movie_id": 1289244, - "movie_name": "吉普赛女王", - "release_info": "展映", - "box_office": "0.09", - "box_office_unit": "万", - "box_office_desc": "0.09万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.08", - "split_box_office_unit": "万", - "split_box_office_desc": "0.08万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "20.0", - "avg_seat_view": "10.1%", - "sum_box_desc": "6553", - "sum_split_box_desc": "6117" - }, - { - "movie_id": 1509826, - "movie_name": "伊甸", - "release_info": "上映36天", - "box_office": "0.08", - "box_office_unit": "万", - "box_office_desc": "0.08万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.07", - "split_box_office_unit": "万", - "split_box_office_desc": "0.07万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 15, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.5", - "avg_seat_view": "1.7%", - "sum_box_desc": "235.0万", - "sum_split_box_desc": "208.4万" - }, - { - "movie_id": 1320548, - "movie_name": "家庭简史", - "release_info": "上映15天", - "box_office": "0.08", - "box_office_unit": "万", - "box_office_desc": "0.08万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.07", - "split_box_office_unit": "万", - "split_box_office_desc": "0.07万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 41, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.5", - "avg_seat_view": "0.7%", - "sum_box_desc": "29.9万", - "sum_split_box_desc": "28.8万" - }, - { - "movie_id": 1470975, - "movie_name": "这周五的游乐场", - "release_info": "上映8天", - "box_office": "0.08", - "box_office_unit": "万", - "box_office_desc": "0.08万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.07", - "split_box_office_unit": "万", - "split_box_office_desc": "0.07万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 17, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.3", - "avg_seat_view": "1.5%", - "sum_box_desc": "15.0万", - "sum_split_box_desc": "14.7万" - }, - { - "movie_id": 1593302, - "movie_name": "飓风", - "release_info": "展映", - "box_office": "0.07", - "box_office_unit": "万", - "box_office_desc": "0.07万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.07", - "split_box_office_unit": "万", - "split_box_office_desc": "0.07万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "15.0", - "avg_seat_view": "4.4%", - "sum_box_desc": "3.3万", - "sum_split_box_desc": "3.1万" - }, - { - "movie_id": 1487768, - "movie_name": "巴扎喜事", - "release_info": "上映36天", - "box_office": "0.07", - "box_office_unit": "万", - "box_office_desc": "0.07万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.07", - "split_box_office_unit": "万", - "split_box_office_desc": "0.07万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 22, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.8", - "avg_seat_view": "0.9%", - "sum_box_desc": "144.9万", - "sum_split_box_desc": "137.1万" - }, - { - "movie_id": 1568020, - "movie_name": "喜羊羊与灰太狼之异国破晓", - "release_info": "上映63天", - "box_office": "0.07", - "box_office_unit": "万", - "box_office_desc": "0.07万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.06", - "split_box_office_unit": "万", - "split_box_office_desc": "0.06万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 80, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.3", - "avg_seat_view": "0.2%", - "sum_box_desc": "6206.1万", - "sum_split_box_desc": "5555.4万" - }, - { - "movie_id": 1525122, - "movie_name": "康熙与路易十四", - "release_info": "", - "box_office": "0.06", - "box_office_unit": "万", - "box_office_desc": "0.06万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.05", - "split_box_office_unit": "万", - "split_box_office_desc": "0.05万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "10.0", - "avg_seat_view": "40.0%", - "sum_box_desc": "304.0万", - "sum_split_box_desc": "298.6万" - }, - { - "movie_id": 1250604, - "movie_name": "里斯本丸沉没", - "release_info": "", - "box_office": "0.05", - "box_office_unit": "万", - "box_office_desc": "0.05万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.05", - "split_box_office_unit": "万", - "split_box_office_desc": "0.05万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 30, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.5", - "avg_seat_view": "0.6%", - "sum_box_desc": "4763.2万", - "sum_split_box_desc": "4345.3万" - }, - { - "movie_id": 1432141, - "movie_name": "戏台", - "release_info": "上映64天", - "box_office": "0.05", - "box_office_unit": "万", - "box_office_desc": "0.05万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.04", - "split_box_office_unit": "万", - "split_box_office_desc": "0.04万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 24, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.6", - "avg_seat_view": "0.7%", - "sum_box_desc": "4.11亿", - "sum_split_box_desc": "3.66亿" - }, - { - "movie_id": 40308, - "movie_name": "玛丽和麦克斯", - "release_info": "上映50天", - "box_office": "0.04", - "box_office_unit": "万", - "box_office_desc": "0.04万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.04", - "split_box_office_unit": "万", - "split_box_office_desc": "0.04万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 10, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.3", - "avg_seat_view": "1.7%", - "sum_box_desc": "107.1万", - "sum_split_box_desc": "97.2万" - }, - { - "movie_id": 1451361, - "movie_name": "我们的那一年", - "release_info": "上映29天", - "box_office": "0.04", - "box_office_unit": "万", - "box_office_desc": "0.04万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.04", - "split_box_office_unit": "万", - "split_box_office_desc": "0.04万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "9.0", - "avg_seat_view": "4.0%", - "sum_box_desc": "1.5万", - "sum_split_box_desc": "1.5万" - }, - { - "movie_id": 1431675, - "movie_name": "赎梦", - "release_info": "上映35天", - "box_office": "0.04", - "box_office_unit": "万", - "box_office_desc": "0.04万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.03", - "split_box_office_unit": "万", - "split_box_office_desc": "0.03万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 53, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.2", - "avg_seat_view": "0.2%", - "sum_box_desc": "561.8万", - "sum_split_box_desc": "503.4万" - }, - { - "movie_id": 308316, - "movie_name": "蜡笔小新:大人王国的反击", - "release_info": "上映91天", - "box_office": "0.04", - "box_office_unit": "万", - "box_office_desc": "0.04万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.03", - "split_box_office_unit": "万", - "split_box_office_desc": "0.03万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 9, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.2", - "avg_seat_view": "1.2%", - "sum_box_desc": "6827.9万", - "sum_split_box_desc": "6120.8万" - }, - { - "movie_id": 122157, - "movie_name": "孩子王", - "release_info": "", - "box_office": "0.03", - "box_office_unit": "万", - "box_office_desc": "0.03万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.03", - "split_box_office_unit": "万", - "split_box_office_desc": "0.03万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "6.0", - "avg_seat_view": "6.0%", - "sum_box_desc": "1.1万", - "sum_split_box_desc": "1.0万" - }, - { - "movie_id": 1452520, - "movie_name": "一生交给党", - "release_info": "", - "box_office": "0.03", - "box_office_unit": "万", - "box_office_desc": "0.03万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.03", - "split_box_office_unit": "万", - "split_box_office_desc": "0.03万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 4, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "2.3", - "avg_seat_view": "2.0%", - "sum_box_desc": "675.7万", - "sum_split_box_desc": "671.2万" - }, - { - "movie_id": 1481712, - "movie_name": "寻找1999的月老", - "release_info": "上映29天", - "box_office": "0.02", - "box_office_unit": "万", - "box_office_desc": "0.02万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.02", - "split_box_office_unit": "万", - "split_box_office_desc": "0.02万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "2.0", - "avg_seat_view": "2.2%", - "sum_box_desc": "52.3万", - "sum_split_box_desc": "50.1万" - }, - { - "movie_id": 1552267, - "movie_name": "山庄·惊魂", - "release_info": "上映92天", - "box_office": "0.02", - "box_office_unit": "万", - "box_office_desc": "0.02万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.02", - "split_box_office_unit": "万", - "split_box_office_desc": "0.02万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 3, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.3", - "avg_seat_view": "1.2%", - "sum_box_desc": "201.5万", - "sum_split_box_desc": "177.2万" - }, - { - "movie_id": 1551836, - "movie_name": "麦克白", - "release_info": "上映56天", - "box_office": "0.02", - "box_office_unit": "万", - "box_office_desc": "0.02万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.02", - "split_box_office_unit": "万", - "split_box_office_desc": "0.02万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "7.0", - "avg_seat_view": "14.0%", - "sum_box_desc": "37.9万", - "sum_split_box_desc": "34.7万" - }, - { - "movie_id": 1302189, - "movie_name": "零卡社团", - "release_info": "展映", - "box_office": "0.02", - "box_office_unit": "万", - "box_office_desc": "0.02万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.02", - "split_box_office_unit": "万", - "split_box_office_desc": "0.02万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.5", - "avg_seat_view": "1.7%", - "sum_box_desc": "3.9万", - "sum_split_box_desc": "3.7万" - }, - { - "movie_id": 1547375, - "movie_name": "同甘共苦", - "release_info": "展映", - "box_office": "0.02", - "box_office_unit": "万", - "box_office_desc": "0.02万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 18, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.3", - "avg_seat_view": "0.2%", - "sum_box_desc": "31.8万", - "sum_split_box_desc": "28.4万" - }, - { - "movie_id": 1462651, - "movie_name": "我们终将要和世界握手言和", - "release_info": "上映17天", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "2.0", - "avg_seat_view": "1.6%", - "sum_box_desc": "3.4万", - "sum_split_box_desc": "3.3万" - }, - { - "movie_id": 1415196, - "movie_name": "无名", - "release_info": "", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 4, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.0", - "avg_seat_view": "1.3%", - "sum_box_desc": "9.43亿", - "sum_split_box_desc": "8.88亿" - }, - { - "movie_id": 1301793, - "movie_name": "掬水月在手", - "release_info": "", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "4.0", - "avg_seat_view": "4.0%", - "sum_box_desc": "790.8万", - "sum_split_box_desc": "728.3万" - }, - { - "movie_id": 1501764, - "movie_name": "威风锣鼓", - "release_info": "上映50天", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "4.0", - "avg_seat_view": "4.3%", - "sum_box_desc": "1.3万", - "sum_split_box_desc": "1.2万" - }, - { - "movie_id": 1187439, - "movie_name": "侏罗纪世界3", - "release_info": "", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "3.0", - "avg_seat_view": "2.7%", - "sum_box_desc": "10.59亿", - "sum_split_box_desc": "9.45亿" - }, - { - "movie_id": 1532831, - "movie_name": "潜艇总动员:冒险岛", - "release_info": "", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.5", - "avg_seat_view": "1.0%", - "sum_box_desc": "1053.3万", - "sum_split_box_desc": "1002.9万" - }, - { - "movie_id": 1566861, - "movie_name": "血色牢笼", - "release_info": "上映22天", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 8, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.4", - "avg_seat_view": "0.5%", - "sum_box_desc": "7.2万", - "sum_split_box_desc": "6.7万" - }, - { - "movie_id": 443609, - "movie_name": "圆梦餐厅", - "release_info": "上映50天", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "3.0", - "avg_seat_view": "3.3%", - "sum_box_desc": "7.1万", - "sum_split_box_desc": "6.8万" - }, - { - "movie_id": 1524039, - "movie_name": "潍遗灯火阑珊处", - "release_info": "上映8天", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "3.0", - "avg_seat_view": "6.2%", - "sum_box_desc": "673", - "sum_split_box_desc": "515" - }, - { - "movie_id": 1227946, - "movie_name": "甜蜜恰好也三十", - "release_info": "上映22天", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 6, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.3", - "avg_seat_view": "0.4%", - "sum_box_desc": "10.3万", - "sum_split_box_desc": "10.1万" - }, - { - "movie_id": 246386, - "movie_name": "小王子", - "release_info": "", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "2.0", - "avg_seat_view": "2.7%", - "sum_box_desc": "1.59亿", - "sum_split_box_desc": "1.59亿" - }, - { - "movie_id": 1583990, - "movie_name": "与世界的最后一眼相遇", - "release_info": "上映42天", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 4, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.5", - "avg_seat_view": "0.6%", - "sum_box_desc": "75.5万", - "sum_split_box_desc": "68.5万" - }, - { - "movie_id": 1581104, - "movie_name": "生死狙杀", - "release_info": "上映26天", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 18, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.1", - "avg_seat_view": "0.1%", - "sum_box_desc": "1849", - "sum_split_box_desc": "1635" - }, - { - "movie_id": 1547294, - "movie_name": "翡翠城巫师", - "release_info": "上映29天", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 7, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.3", - "avg_seat_view": "0.2%", - "sum_box_desc": "11.7万", - "sum_split_box_desc": "10.5万" - }, - { - "movie_id": 1475139, - "movie_name": "魔法鼠乐园·神秘魔法球", - "release_info": "上映28天", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 21, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "\u003C0.1", - "avg_seat_view": "0.1%", - "sum_box_desc": "25.8万", - "sum_split_box_desc": "22.9万" - }, - { - "movie_id": 78602, - "movie_name": "侏罗纪世界", - "release_info": "", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.0", - "avg_seat_view": "0.8%", - "sum_box_desc": "14.18亿", - "sum_split_box_desc": "14.18亿" - }, - { - "movie_id": 296020, - "movie_name": "开国大典", - "release_info": "", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.0", - "avg_seat_view": "1.0%", - "sum_box_desc": "4.4万", - "sum_split_box_desc": "4.4万" - }, - { - "movie_id": 246339, - "movie_name": "平原游击队", - "release_info": "展映", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.0", - "avg_seat_view": "2.6%", - "sum_box_desc": "952", - "sum_split_box_desc": "916" - }, - { - "movie_id": 1387874, - "movie_name": "大突围", - "release_info": "", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.0", - "avg_seat_view": "0.6%", - "sum_box_desc": "1330.9万", - "sum_split_box_desc": "1313.2万" - } - ] - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/css/background.css deleted file mode 100644 index 13a58f4c..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/css/background.css +++ /dev/null @@ -1,79 +0,0 @@ -.background-layer { - position: fixed; - inset: 0; - overflow: hidden; - z-index: -1; - background: linear-gradient(180deg, #e8f5e8 0%, #f0f8e8 55%, #e8f5e8 100%); -} - -.aurora { - position: absolute; - width: 480px; - height: 480px; - border-radius: 58% 42% 53% 47% / 52% 46% 54% 48%; - filter: blur(0px); - opacity: 0.28; - background: radial-gradient(circle at 40% 40%, rgba(168, 230, 207, 0.4), rgba(168, 230, 207, 0)); - animation: float 32s ease-in-out infinite; -} - -.aurora-1 { - top: -160px; - left: -140px; - animation-delay: 0s; -} - -.aurora-2 { - top: 50%; - left: 60%; - animation-delay: 6s; - background: radial-gradient(circle at 60% 60%, rgba(220, 237, 193, 0.35), rgba(220, 237, 193, 0)); -} - -.aurora-3 { - bottom: -180px; - right: -160px; - animation-delay: 12s; - background: radial-gradient(circle at 50% 50%, rgba(129, 199, 132, 0.3), rgba(129, 199, 132, 0)); -} - -@keyframes float { - 0% { - transform: translate3d(0, 0, 0) scale(1); - } - 25% { - transform: translate3d(40px, -30px, 0) scale(1.05); - } - 50% { - transform: translate3d(-35px, 25px, 0) scale(0.95); - } - 75% { - transform: translate3d(20px, 35px, 0) scale(1.08); - } - 100% { - transform: translate3d(0, 0, 0) scale(1); - } -} - -@media (max-width: 768px) { - .aurora { - width: 280px; - height: 280px; - opacity: 0.24; - } - - .aurora-1 { - top: -110px; - left: -130px; - } - - .aurora-2 { - top: 45%; - left: 35%; - } - - .aurora-3 { - bottom: -140px; - right: -120px; - } -} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/css/style.css deleted file mode 100644 index 8fb5f5d8..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/css/style.css +++ /dev/null @@ -1,414 +0,0 @@ -:root { - --bg-base: rgba(255, 255, 255, 0.85); - --panel-bg: rgba(248, 252, 248, 0.9); - --panel-border: rgba(129, 199, 132, 0.25); - --accent-1: #4caf50; - --accent-2: #81c784; - --accent-3: #a5d6a7; - --text-primary: #2e7d32; - --text-secondary: #558b2f; - --chip-bg: rgba(76, 175, 80, 0.15); - --shadow-soft: 0 16px 40px rgba(46, 125, 50, 0.15); - color-scheme: light; -} - -* { - box-sizing: border-box; - margin: 0; - padding: 0; -} - -body { - background: transparent; - color: var(--text-primary); - font-family: "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif; - line-height: 1.6; - min-height: 100vh; - -webkit-font-smoothing: antialiased; -} - -.screen { - width: min(100%, 840px); - margin: 0 auto; - padding: 18px 16px 72px; - display: flex; - flex-direction: column; - gap: 18px; -} - -.screen-header { - display: flex; - flex-direction: column; - gap: 18px; - padding: 20px 18px; - border-radius: 20px; - background: var(--bg-base); - border: 1px solid var(--panel-border); - box-shadow: var(--shadow-soft); - backdrop-filter: blur(18px); -} - -.title-group { - display: flex; - flex-direction: column; - gap: 10px; -} - -.eyebrow { - display: inline-flex; - align-items: center; - gap: 6px; - padding: 4px 12px; - font-size: 0.8rem; - letter-spacing: 0.08em; - text-transform: uppercase; - border-radius: 999px; - color: var(--accent-1); - background: var(--chip-bg); -} - -.screen-header h1 { - font-size: 1.6rem; - font-weight: 700; -} - -.tagline { - font-size: 0.95rem; - color: var(--text-secondary); -} - -.actions { - display: flex; - flex-direction: column; - gap: 10px; - align-items: flex-start; -} - -.refresh { - padding: 10px 20px; - border-radius: 999px; - border: none; - background: linear-gradient(135deg, rgba(76, 175, 80, 0.9), rgba(129, 199, 132, 0.9)); - color: var(--text-primary); - font-size: 0.92rem; - font-weight: 600; - cursor: pointer; - transition: transform 0.2s ease, box-shadow 0.2s ease; - box-shadow: 0 12px 30px rgba(76, 175, 80, 0.25); -} - -.refresh:active { - transform: scale(0.97); -} - -.refresh:disabled { - opacity: 0.6; - cursor: not-allowed; -} - -.timestamp { - font-size: 0.85rem; - color: var(--text-secondary); -} - -.insights { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 12px; -} - -.insight-card { - padding: 16px 18px; - background: var(--panel-bg); - border-radius: 16px; - border: 1px solid rgba(129, 199, 132, 0.3); - box-shadow: var(--shadow-soft); - display: flex; - flex-direction: column; - gap: 6px; -} - -.insight-label { - font-size: 0.85rem; - color: var(--text-secondary); - letter-spacing: 0.02em; -} - -.insight-value { - font-size: 1.3rem; - font-weight: 700; - display: flex; - align-items: baseline; - gap: 4px; - color: var(--text-primary); -} - -.insight-value .unit { - font-size: 0.9rem; - font-weight: 500; - color: var(--text-secondary); -} - -.ranking { - padding: 22px 18px 28px; - background: var(--bg-base); - border-radius: 24px; - border: 1px solid var(--panel-border); - box-shadow: var(--shadow-soft); - backdrop-filter: blur(22px); - display: flex; - flex-direction: column; - gap: 18px; -} - -.ranking-header { - display: flex; - flex-direction: column; - gap: 6px; -} - -.ranking-header h2 { - font-size: 1.25rem; - font-weight: 700; -} - -.subtitle { - font-size: 0.88rem; - color: var(--text-secondary); -} - -.programme-list { - display: flex; - flex-direction: column; - gap: 14px; -} - -.loading, -.error-message, -.empty-message { - padding: 18px 16px; - text-align: center; - color: var(--text-secondary); - border-radius: 14px; - border: 1px dashed rgba(129, 199, 132, 0.4); - background: rgba(248, 252, 248, 0.6); -} - -.programme-item { - display: grid; - grid-template-columns: auto 1fr; - gap: 14px; - padding: 16px; - border-radius: 18px; - background: rgba(248, 252, 248, 0.95); - border: 1px solid rgba(129, 199, 132, 0.3); - box-shadow: 0 14px 30px rgba(46, 125, 50, 0.1); - transition: transform 0.2s ease, box-shadow 0.2s ease; -} - -.programme-item:hover { - transform: translateY(-2px); - box-shadow: 0 18px 36px rgba(46, 125, 50, 0.15); -} - -.rank-badge { - width: 44px; - height: 44px; - border-radius: 14px; - display: flex; - align-items: center; - justify-content: center; - font-weight: 700; - font-size: 1.05rem; - color: #ffffff; - background: linear-gradient(135deg, rgba(76, 175, 80, 0.9), rgba(129, 199, 132, 0.9)); -} - -.rank-badge.top-1 { - background: linear-gradient(135deg, #2e7d32, #4caf50); -} - -.rank-badge.top-2 { - background: linear-gradient(135deg, #388e3c, #66bb6a); -} - -.rank-badge.top-3 { - background: linear-gradient(135deg, #4caf50, #81c784); -} - -.programme-body { - display: flex; - flex-direction: column; - gap: 12px; -} - -.programme-head { - display: flex; - flex-direction: column; - gap: 6px; -} - -.programme-name { - font-size: 1.05rem; - font-weight: 700; -} - -.channel-name { - font-size: 0.9rem; - color: var(--text-secondary); -} - -.metric-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 10px; -} - -.metric { - display: flex; - flex-direction: column; - gap: 2px; -} - -.metric-label { - font-size: 0.78rem; - color: var(--text-secondary); - letter-spacing: 0.04em; - text-transform: uppercase; -} - -.metric-value { - font-size: 0.98rem; - font-weight: 600; -} - -.progress-trend { - display: flex; - flex-direction: column; - gap: 8px; - margin-top: 4px; -} - -.progress-row { - display: flex; - flex-direction: column; - gap: 4px; -} - -.progress-label { - display: flex; - justify-content: space-between; - font-size: 0.8rem; - color: var(--text-secondary); -} - -.progress-bar { - width: 100%; - height: 6px; - border-radius: 6px; - background: rgba(116, 210, 255, 0.16); - overflow: hidden; -} - -.progress-bar span { - display: block; - height: 100%; - border-radius: inherit; - background: linear-gradient(135deg, rgba(116, 210, 255, 0.95), rgba(122, 185, 255, 0.95)); - width: 0; - transition: width 0.5s ease; -} - -.progress-row.attention .progress-bar span { - background: linear-gradient(135deg, rgba(244, 156, 224, 0.95), rgba(116, 210, 255, 0.9)); -} - -/* Tablet layout */ -@media (min-width: 600px) { - .screen { - padding: 24px 20px 88px; - gap: 20px; - } - - .screen-header { - flex-direction: row; - justify-content: space-between; - align-items: center; - padding: 26px 28px; - } - - .screen-header h1 { - font-size: 1.9rem; - } - - .tagline { - font-size: 1rem; - } - - .actions { - align-items: flex-end; - } - - .insights { - grid-template-columns: repeat(4, minmax(0, 1fr)); - gap: 16px; - } - - .programme-item { - grid-template-columns: 72px 1fr; - padding: 18px 20px; - } - - .rank-badge { - width: 54px; - height: 54px; - font-size: 1.25rem; - } - - .metric-grid { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } -} - -/* Desktop layout */ -@media (min-width: 1024px) { - .screen { - width: min(100%, 960px); - padding: 32px 28px 104px; - } - - .insight-card { - padding: 20px 22px; - } - - .insight-value { - font-size: 1.6rem; - } - - .ranking { - padding: 30px 32px 36px; - } - - .programme-item { - grid-template-columns: 96px 1fr; - padding: 22px 26px; - border-radius: 22px; - } - - .programme-name { - font-size: 1.25rem; - } - - .metric-grid { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } -} - -@media (prefers-reduced-motion: reduce) { - * { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - scroll-behavior: auto !important; - } -} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/index.html deleted file mode 100644 index 986169cd..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - 猫眼电视收视排行 - - - - -
    -
    -
    -
    -
    - -
    -
    -
    - 实时收视 -

    猫眼电视收视排行

    -

    聚焦全国频道实时关注度,让你不错过热门节目

    -
    -
    - - 正在同步最新数据... -
    -
    - -
    -
    -

    节目数量

    -

    --

    -
    -
    -

    最高市场份额

    -

    --%

    -
    -
    -

    最高关注指数

    -

    --%

    -
    -
    -

    官方刷新频率

    -

    --

    -
    -
    - -
    -
    -

    频道节目排行榜

    - 实时榜单,数据持续刷新 -
    -
    -
    正在载入电视收视排行...
    -
    -
    -
    - - - - diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/js/main.js b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/js/main.js deleted file mode 100644 index f64fb5b8..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/js/main.js +++ /dev/null @@ -1,290 +0,0 @@ -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top/v2/maoyan/realtime/tv" -]; - -const FALLBACK_ENDPOINT = "./返回接口.json"; -const REFRESH_INTERVAL = 4000; -const MAX_ITEMS = 40; - -const refreshButton = document.getElementById("refreshButton"); -const updateTimeEl = document.getElementById("updateTime"); -const programmeListEl = document.getElementById("programmeList"); -const programmeCountEl = document.getElementById("programmeCount"); -const topMarketRateEl = document.getElementById("topMarketRate"); -const topAttentionRateEl = document.getElementById("topAttentionRate"); -const refreshGapEl = document.getElementById("refreshGap"); - -let isLoading = false; -let autoTimer = null; - -function escapeHtml(value) { - if (value === undefined || value === null) { - return ""; - } - return String(value) - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); -} - -function safeText(value, fallback = "--") { - if (value === undefined || value === null || value === "") { - return fallback; - } - return escapeHtml(value); -} - -function formatNumber(value, fractionDigits = 2) { - const numeric = Number(value); - if (!Number.isFinite(numeric)) { - return "--"; - } - return numeric.toFixed(fractionDigits); -} - -function formatGapText(seconds) { - const numeric = Number(seconds); - if (!Number.isFinite(numeric) || numeric <= 0) { - return "--"; - } - if (numeric < 60) { - return `约每 ${Math.round(numeric)} 秒`; - } - const minutes = Math.floor(numeric / 60); - const remaining = Math.round(numeric % 60); - if (remaining === 0) { - return `约每 ${minutes} 分钟`; - } - return `约每 ${minutes} 分 ${remaining} 秒`; -} - -function parseRate(value) { - const numeric = Number(value); - if (Number.isFinite(numeric) && numeric >= 0) { - return { - text: numeric.toFixed(4).replace(/0+$/, "").replace(/\.$/, ""), - ratio: Math.max(0, Math.min(numeric, 100)) - }; - } - return { text: "--", ratio: 0 }; -} - -function formatUpdateTime(data) { - if (data && typeof data.updated === "string" && data.updated.trim().length > 0) { - return data.updated.trim(); - } - if (data && typeof data.updated_at === "number" && Number.isFinite(data.updated_at)) { - return new Date(data.updated_at).toLocaleString("zh-CN", { hour12: false }); - } - return new Date().toLocaleString("zh-CN", { hour12: false }); -} - -function renderInsights(list, gapSecond) { - const total = Array.isArray(list) ? list.length : 0; - programmeCountEl.textContent = total ? total.toString() : "--"; - - if (total) { - const topMarket = list.reduce((max, item) => { - const value = Number(item?.market_rate); - return value > max ? value : max; - }, 0); - const topAttention = list.reduce((max, item) => { - const value = Number(item?.attention_rate); - return value > max ? value : max; - }, 0); - - topMarketRateEl.textContent = topMarket ? topMarket.toFixed(2) : "--"; - topAttentionRateEl.textContent = topAttention ? topAttention.toFixed(2) : "--"; - } else { - topMarketRateEl.textContent = "--"; - topAttentionRateEl.textContent = "--"; - } - - refreshGapEl.textContent = formatGapText(gapSecond); -} - -function createMetric(label, value) { - return ` -
    - ${label} - ${safeText(value)} -
    - `; -} - -function createProgrammeItem(programme, index) { - const article = document.createElement("article"); - article.className = "programme-item"; - - const topClass = index < 3 ? ` top-${index + 1}` : ""; - const name = safeText(programme?.programme_name || "未命名节目"); - const channel = safeText(programme?.channel_name || "--"); - - const market = parseRate(programme?.market_rate); - const attention = parseRate(programme?.attention_rate); - const marketDesc = safeText(programme?.market_rate_desc || formatNumber(programme?.market_rate)); - const attentionDesc = safeText(programme?.attention_rate_desc || formatNumber(programme?.attention_rate)); - - article.innerHTML = ` -
    ${index + 1}
    -
    -
    -
    ${name}
    -
    ${channel}
    -
    -
    - ${createMetric("市场占有率", marketDesc)} - ${createMetric("关注指数", attentionDesc)} - ${createMetric("排序位置", `第 ${index + 1} 名`)} - ${createMetric("排名趋势", programme?.rank_trend ? safeText(programme.rank_trend) : "--")} -
    -
    -
    -
    - 市场份额 - ${market.text === "--" ? "--" : `${market.text}%`} -
    -
    -
    -
    -
    - 关注份额 - ${attention.text === "--" ? "--" : `${attention.text}%`} -
    -
    -
    -
    -
    - `; - - return article; -} - -function renderProgrammeList(list) { - programmeListEl.innerHTML = ""; - - if (!Array.isArray(list) || list.length === 0) { - const empty = document.createElement("div"); - empty.className = "empty-message"; - empty.textContent = "暂时没有可展示的节目数据"; - programmeListEl.appendChild(empty); - return; - } - - list.slice(0, MAX_ITEMS).forEach((item, index) => { - programmeListEl.appendChild(createProgrammeItem(item, index)); - }); -} - -async function requestJson(url) { - const response = await fetch(url, { cache: "no-store" }); - if (!response.ok) { - throw new Error(`请求失败: ${response.status}`); - } - return response.json(); -} - -async function retrieveData() { - for (const endpoint of API_ENDPOINTS) { - try { - const result = await requestJson(endpoint); - if (result?.code === 200 && result?.data) { - return result.data; - } - } catch (error) { - console.warn("主接口请求失败", error); - } - } - - try { - const fallbackResult = await requestJson(FALLBACK_ENDPOINT); - if (fallbackResult?.data) { - return fallbackResult.data; - } - } catch (fallbackError) { - console.warn("本地示例数据读取失败", fallbackError); - } - - return null; -} - -async function loadData(isManual = false) { - if (isLoading) { - return; - } - - isLoading = true; - - if (isManual) { - refreshButton.disabled = true; - refreshButton.textContent = "刷新中..."; - } - - if (!programmeListEl.children.length) { - programmeListEl.innerHTML = '
    正在载入电视收视排行...
    '; - } - - try { - const data = await retrieveData(); - if (!data) { - throw new Error("无法获取数据"); - } - - renderProgrammeList(Array.isArray(data.list) ? data.list : []); - renderInsights(data.list, data.update_gap_second); - updateTimeEl.textContent = `最近更新 ${formatUpdateTime(data)}`; - } catch (error) { - console.error("加载数据失败", error); - programmeListEl.innerHTML = ''; - const errorBox = document.createElement("div"); - errorBox.className = "error-message"; - errorBox.textContent = "数据获取暂时不可用,系统稍后会自动重试"; - programmeListEl.appendChild(errorBox); - updateTimeEl.textContent = "最近更新 --"; - renderInsights([], 0); - } finally { - if (isManual) { - refreshButton.disabled = false; - refreshButton.textContent = "手动刷新"; - } - isLoading = false; - } -} - -function startAutoRefresh() { - if (autoTimer) { - clearInterval(autoTimer); - } - autoTimer = setInterval(() => { - loadData(false); - }, REFRESH_INTERVAL); -} - -refreshButton.addEventListener("click", () => { - loadData(true); -}); - -document.addEventListener("visibilitychange", () => { - if (document.hidden) { - if (autoTimer) { - clearInterval(autoTimer); - autoTimer = null; - } - } else { - startAutoRefresh(); - loadData(false); - } -}); - -function init() { - loadData(false); - startAutoRefresh(); -} - -if (document.readyState === "loading") { - document.addEventListener("DOMContentLoaded", init); -} else { - init(); -} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/返回接口.json deleted file mode 100644 index a62cc456..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/返回接口.json +++ /dev/null @@ -1,435 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "update_gap_second": 3, - "updated": "2025-09-26 16:22:45", - "updated_at": 1758874965018, - "list": [ - { - "programme_name": "六姊妹37", - "channel_name": "CCTV-1", - "market_rate": 16.1709, - "market_rate_desc": "16.1709%", - "attention_rate": 1.2816, - "attention_rate_desc": "1.2816%" - }, - { - "programme_name": "太行山上6", - "channel_name": "CCTV-4", - "market_rate": 8.2684, - "market_rate_desc": "8.2684%", - "attention_rate": 0.6553, - "attention_rate_desc": "0.6553%" - }, - { - "programme_name": "星推荐", - "channel_name": "CCTV-8", - "market_rate": 7.3725, - "market_rate_desc": "7.3725%", - "attention_rate": 0.5843, - "attention_rate_desc": "0.5843%" - }, - { - "programme_name": "炮兵司令朱瑞", - "channel_name": "CCTV-6", - "market_rate": 7.3315, - "market_rate_desc": "7.3315%", - "attention_rate": 0.5811, - "attention_rate_desc": "0.5811%" - }, - { - "programme_name": "新闻直播间", - "channel_name": "CCTV-13", - "market_rate": 4.4396, - "market_rate_desc": "4.4396%", - "attention_rate": 0.3519, - "attention_rate_desc": "0.3519%" - }, - { - "programme_name": "百姓剧场二:征服15", - "channel_name": "浙江卫视", - "market_rate": 4.3651, - "market_rate_desc": "4.3651%", - "attention_rate": 0.346, - "attention_rate_desc": "0.346%" - }, - { - "programme_name": "新相亲大会精华版", - "channel_name": "江苏卫视", - "market_rate": 4.0919, - "market_rate_desc": "4.0919%", - "attention_rate": 0.3243, - "attention_rate_desc": "0.3243%" - }, - { - "programme_name": "青春独播剧场:底线11", - "channel_name": "湖南卫视", - "market_rate": 3.9014, - "market_rate_desc": "3.9014%", - "attention_rate": 0.3092, - "attention_rate_desc": "0.3092%" - }, - { - "programme_name": "全景自然:黄石公园-飞翔的生命", - "channel_name": "CCTV-9", - "market_rate": 2.504, - "market_rate_desc": "2.504%", - "attention_rate": 0.1985, - "attention_rate_desc": "0.1985%" - }, - { - "programme_name": "运动一起赢", - "channel_name": "CCTV-5", - "market_rate": 2.0781, - "market_rate_desc": "2.0781%", - "attention_rate": 0.1647, - "attention_rate_desc": "0.1647%" - }, - { - "programme_name": "小日子19", - "channel_name": "东方卫视", - "market_rate": 1.9804, - "market_rate_desc": "1.9804%", - "attention_rate": 0.157, - "attention_rate_desc": "0.157%" - }, - { - "programme_name": "向幸福出发", - "channel_name": "CCTV-3", - "market_rate": 1.8832, - "market_rate_desc": "1.8832%", - "attention_rate": 0.1493, - "attention_rate_desc": "0.1493%" - }, - { - "programme_name": "浴血十四年16", - "channel_name": "CCTV-7", - "market_rate": 1.8485, - "market_rate_desc": "1.8485%", - "attention_rate": 0.1465, - "attention_rate_desc": "0.1465%" - }, - { - "programme_name": "正点财经", - "channel_name": "CCTV-2", - "market_rate": 1.7255, - "market_rate_desc": "1.7255%", - "attention_rate": 0.1368, - "attention_rate_desc": "0.1368%" - }, - { - "programme_name": "热播剧场:太行山上6", - "channel_name": "深圳卫视", - "market_rate": 1.6132, - "market_rate_desc": "1.6132%", - "attention_rate": 0.1279, - "attention_rate_desc": "0.1279%" - }, - { - "programme_name": "爱家剧场:父母爱情37", - "channel_name": "山东卫视", - "market_rate": 1.5558, - "market_rate_desc": "1.5558%", - "attention_rate": 0.1233, - "attention_rate_desc": "0.1233%" - }, - { - "programme_name": "刘家媳妇4", - "channel_name": "CCTV-17", - "market_rate": 1.3905, - "market_rate_desc": "1.3905%", - "attention_rate": 0.1102, - "attention_rate_desc": "0.1102%" - }, - { - "programme_name": "午茶剧场:归队8", - "channel_name": "北京卫视", - "market_rate": 1.1078, - "market_rate_desc": "1.1078%", - "attention_rate": 0.0878, - "attention_rate_desc": "0.0878%" - }, - { - "programme_name": "吉视剧场:武工队传奇46", - "channel_name": "吉林卫视", - "market_rate": 0.9407, - "market_rate_desc": "0.9407%", - "attention_rate": 0.0745, - "attention_rate_desc": "0.0745%" - }, - { - "programme_name": "情感剧场:朱元璋64", - "channel_name": "河北卫视", - "market_rate": 0.9211, - "market_rate_desc": "0.9211%", - "attention_rate": 0.073, - "attention_rate_desc": "0.073%" - }, - { - "programme_name": "下午剧场:战火青春3", - "channel_name": "广东卫视", - "market_rate": 0.9211, - "market_rate_desc": "0.9211%", - "attention_rate": 0.073, - "attention_rate_desc": "0.073%" - }, - { - "programme_name": "探索.发现-奥秘54", - "channel_name": "CCTV-10", - "market_rate": 0.822, - "market_rate_desc": "0.822%", - "attention_rate": 0.0652, - "attention_rate_desc": "0.0652%" - }, - { - "programme_name": "一线", - "channel_name": "CCTV-12", - "market_rate": 0.7949, - "market_rate_desc": "0.7949%", - "attention_rate": 0.063, - "attention_rate_desc": "0.063%" - }, - { - "programme_name": "海豚真情剧场:重案六组Ⅱ-45", - "channel_name": "安徽卫视", - "market_rate": 0.7684, - "market_rate_desc": "0.7684%", - "attention_rate": 0.0609, - "attention_rate_desc": "0.0609%" - }, - { - "programme_name": "中国女子围棋甲级联赛-第10轮", - "channel_name": "CCTV-5+", - "market_rate": 0.7621, - "market_rate_desc": "0.7621%", - "attention_rate": 0.0604, - "attention_rate_desc": "0.0604%" - }, - { - "programme_name": "休闲剧场:女子特战队2", - "channel_name": "天津卫视", - "market_rate": 0.6694, - "market_rate_desc": "0.6694%", - "attention_rate": 0.0531, - "attention_rate_desc": "0.0531%" - }, - { - "programme_name": "动画大放映:猪猪侠之超星五灵侠第八季", - "channel_name": "CCTV-14", - "market_rate": 0.6637, - "market_rate_desc": "0.6637%", - "attention_rate": 0.0526, - "attention_rate_desc": "0.0526%" - }, - { - "programme_name": "昆仑剧场:康熙微服私访记第三部30", - "channel_name": "青海卫视", - "market_rate": 0.6511, - "market_rate_desc": "0.6511%", - "attention_rate": 0.0516, - "attention_rate_desc": "0.0516%" - }, - { - "programme_name": "京剧电影工程-大闹天宫", - "channel_name": "CCTV-11", - "market_rate": 0.6069, - "market_rate_desc": "0.6069%", - "attention_rate": 0.0481, - "attention_rate_desc": "0.0481%" - }, - { - "programme_name": "温情剧场:神探狄仁杰Ⅱ-14", - "channel_name": "陕西卫视", - "market_rate": 0.571, - "market_rate_desc": "0.571%", - "attention_rate": 0.0453, - "attention_rate_desc": "0.0453%" - }, - { - "programme_name": "下午剧场:狙击部队30", - "channel_name": "贵州卫视", - "market_rate": 0.5558, - "market_rate_desc": "0.5558%", - "attention_rate": 0.0441, - "attention_rate_desc": "0.0441%" - }, - { - "programme_name": "白天剧场:西游记26", - "channel_name": "湖北卫视", - "market_rate": 0.5463, - "market_rate_desc": "0.5463%", - "attention_rate": 0.0433, - "attention_rate_desc": "0.0433%" - }, - { - "programme_name": "中国爱大剧场:神枪21", - "channel_name": "四川卫视", - "market_rate": 0.5388, - "market_rate_desc": "0.5388%", - "attention_rate": 0.0427, - "attention_rate_desc": "0.0427%" - }, - { - "programme_name": "全民开麦", - "channel_name": "CCTV-15", - "market_rate": 0.4915, - "market_rate_desc": "0.4915%", - "attention_rate": 0.039, - "attention_rate_desc": "0.039%" - }, - { - "programme_name": "下午剧场:仁心俱乐部10", - "channel_name": "东南卫视", - "market_rate": 0.4858, - "market_rate_desc": "0.4858%", - "attention_rate": 0.0385, - "attention_rate_desc": "0.0385%" - }, - { - "programme_name": "生活服务", - "channel_name": "江西卫视", - "market_rate": 0.4113, - "market_rate_desc": "0.4113%", - "attention_rate": 0.0326, - "attention_rate_desc": "0.0326%" - }, - { - "programme_name": "白天剧场:神医喜来乐25", - "channel_name": "宁夏卫视", - "market_rate": 0.4044, - "market_rate_desc": "0.4044%", - "attention_rate": 0.032, - "attention_rate_desc": "0.032%" - }, - { - "programme_name": "传奇剧场:铁血玫瑰15", - "channel_name": "黑龙江卫视", - "market_rate": 0.4031, - "market_rate_desc": "0.4031%", - "attention_rate": 0.032, - "attention_rate_desc": "0.032%" - }, - { - "programme_name": "经典剧场:亮剑30", - "channel_name": "广西卫视", - "market_rate": 0.3836, - "market_rate_desc": "0.3836%", - "attention_rate": 0.0304, - "attention_rate_desc": "0.0304%" - }, - { - "programme_name": "中国网球公开赛-女单-第二轮", - "channel_name": "CCTV-16", - "market_rate": 0.3539, - "market_rate_desc": "0.3539%", - "attention_rate": 0.0281, - "attention_rate_desc": "0.0281%" - }, - { - "programme_name": "生活服务", - "channel_name": "河南卫视", - "market_rate": 0.3413, - "market_rate_desc": "0.3413%", - "attention_rate": 0.0271, - "attention_rate_desc": "0.0271%" - }, - { - "programme_name": "生活服务", - "channel_name": "辽宁卫视", - "market_rate": 0.3318, - "market_rate_desc": "0.3318%", - "attention_rate": 0.0263, - "attention_rate_desc": "0.0263%" - }, - { - "programme_name": "传奇剧场:狼烟21", - "channel_name": "内蒙古卫视", - "market_rate": 0.3262, - "market_rate_desc": "0.3262%", - "attention_rate": 0.0258, - "attention_rate_desc": "0.0258%" - }, - { - "programme_name": "炫酷剧场:薛平贵与王宝钏19", - "channel_name": "云南卫视", - "market_rate": 0.3079, - "market_rate_desc": "0.3079%", - "attention_rate": 0.0244, - "attention_rate_desc": "0.0244%" - }, - { - "programme_name": "休闲剧场:历史转折中的邓小平17", - "channel_name": "兵团卫视", - "market_rate": 0.3035, - "market_rate_desc": "0.3035%", - "attention_rate": 0.0241, - "attention_rate_desc": "0.0241%" - }, - { - "programme_name": "亮剑12", - "channel_name": "重庆卫视", - "market_rate": 0.2656, - "market_rate_desc": "0.2656%", - "attention_rate": 0.0211, - "attention_rate_desc": "0.0211%" - }, - { - "programme_name": "阳光剧场:飞哥大英雄39", - "channel_name": "海南卫视", - "market_rate": 0.2643, - "market_rate_desc": "0.2643%", - "attention_rate": 0.021, - "attention_rate_desc": "0.021%" - }, - { - "programme_name": "劫中劫15-17", - "channel_name": "厦门卫视", - "market_rate": 0.246, - "market_rate_desc": "0.246%", - "attention_rate": 0.0195, - "attention_rate_desc": "0.0195%" - }, - { - "programme_name": "生活服务", - "channel_name": "甘肃卫视", - "market_rate": 0.2448, - "market_rate_desc": "0.2448%", - "attention_rate": 0.0194, - "attention_rate_desc": "0.0194%" - }, - { - "programme_name": "花季剧场:神枪7", - "channel_name": "中国教育台-1", - "market_rate": 0.1703, - "market_rate_desc": "0.1703%", - "attention_rate": 0.0135, - "attention_rate_desc": "0.0135%" - }, - { - "programme_name": "雪莲剧场:南来北往21", - "channel_name": "西藏卫视", - "market_rate": 0.1634, - "market_rate_desc": "0.1634%", - "attention_rate": 0.013, - "attention_rate_desc": "0.013%" - }, - { - "programme_name": "生活服务", - "channel_name": "山西卫视", - "market_rate": 0.1438, - "market_rate_desc": "0.1438%", - "attention_rate": 0.0114, - "attention_rate_desc": "0.0114%" - }, - { - "programme_name": "生活服务", - "channel_name": "新疆卫视", - "market_rate": 0.0656, - "market_rate_desc": "0.0656%", - "attention_rate": 0.0052, - "attention_rate_desc": "0.0052%" - } - ] - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/css/style.css deleted file mode 100755 index 9f2c3b64..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/css/style.css +++ /dev/null @@ -1,582 +0,0 @@ -/* 现代化猫眼票房排行榜样式 */ - -/* 全局重置和基础样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -:root { - /* 主色调 */ - --primary-color: #667eea; - --primary-light: #764ba2; - --secondary-color: #f093fb; - --accent-color: #4facfe; - - /* 中性色 */ - --text-primary: #2d3748; - --text-secondary: #4a5568; - --text-muted: #718096; - --bg-primary: #ffffff; - --bg-secondary: #f7fafc; - --bg-tertiary: #edf2f7; - - /* 状态色 */ - --success-color: #48bb78; - --warning-color: #ed8936; - --error-color: #f56565; - - /* 阴影 */ - --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1); - --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1); - --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); - --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.15); - - /* 圆角 */ - --radius-sm: 6px; - --radius-md: 12px; - --radius-lg: 16px; - --radius-xl: 24px; - - /* 间距 */ - --space-xs: 4px; - --space-sm: 8px; - --space-md: 16px; - --space-lg: 24px; - --space-xl: 32px; - --space-2xl: 48px; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: var(--text-primary); - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - position: relative; - overflow-x: hidden; -} - -/* 动态背景效果 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 20% 80%, rgba(168, 230, 207, 0.15) 0%, transparent 40%), - radial-gradient(circle at 80% 20%, rgba(220, 237, 193, 0.12) 0%, transparent 40%), - radial-gradient(circle at 40% 40%, rgba(255, 211, 165, 0.1) 0%, transparent 40%); - z-index: -1; - animation: backgroundShift 30s ease-in-out infinite; -} - -@keyframes backgroundShift { - 0%, 100% { - transform: scale(1) rotate(0deg); - opacity: 0.8; - } - 50% { - transform: scale(1.1) rotate(180deg); - opacity: 0.6; - } -} - -/* 主容器 */ -.container { - max-width: 900px; - margin: var(--space-lg) auto; - padding: var(--space-xl); - background: rgba(255, 255, 255, 0.92); - backdrop-filter: blur(15px); - border-radius: var(--radius-xl); - box-shadow: 0 8px 32px rgba(76, 175, 80, 0.15); - border: 1px solid rgba(168, 230, 207, 0.3); - position: relative; - animation: slideUp 0.8s ease-out; -} - -@keyframes slideUp { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: var(--space-2xl); - padding-bottom: var(--space-lg); - border-bottom: 2px solid var(--bg-tertiary); - position: relative; -} - -.header::after { - content: ''; - position: absolute; - bottom: -2px; - left: 50%; - transform: translateX(-50%); - width: 60px; - height: 4px; - background: linear-gradient(90deg, #4caf50, #81c784); - border-radius: 2px; -} - -.header h1 { - display: flex; - align-items: center; - justify-content: center; - gap: var(--space-md); - margin-bottom: var(--space-md); - font-size: clamp(1.8rem, 4vw, 2.5rem); - font-weight: 700; - letter-spacing: -0.02em; - flex-wrap: wrap; -} - -.header h1 .icon { - font-size: 1.2em; - animation: bounce 2s infinite; - filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1)); -} - -@keyframes bounce { - 0%, 20%, 50%, 80%, 100% { - transform: translateY(0); - } - 40% { - transform: translateY(-8px); - } - 60% { - transform: translateY(-4px); - } -} - -.header h1 .title-text { - background: linear-gradient(135deg, #2e7d32, #4caf50); - -webkit-background-clip: text; - background-clip: text; - color: transparent; - position: relative; -} - -.header h1 .update-badge { - font-size: 0.4em; - background: linear-gradient(135deg, #66bb6a, #a5d6a7); - color: white; - padding: var(--space-xs) var(--space-md); - border-radius: var(--radius-xl); - font-weight: 600; - box-shadow: 0 4px 6px rgba(76, 175, 80, 0.3); - animation: pulse 3s infinite; - white-space: nowrap; -} - -@keyframes pulse { - 0%, 100% { - transform: scale(1); - box-shadow: var(--shadow-md); - } - 50% { - transform: scale(1.05); - box-shadow: var(--shadow-lg); - } -} - -.header-desc { - color: var(--text-secondary); - font-size: 1.1rem; - font-weight: 500; - margin-top: var(--space-sm); -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: var(--space-2xl); - color: var(--text-secondary); -} - -.spinner { - width: 40px; - height: 40px; - margin: 0 auto var(--space-md); - border: 3px solid rgba(76, 175, 80, 0.2); - border-top: 3px solid #4caf50; - border-radius: 50%; - animation: spin 1s linear infinite; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 内容区域 */ -.content { - animation: fadeIn 0.6s ease-out 0.2s both; -} - -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.ranking-title { - font-size: 1.5rem; - font-weight: 600; - color: var(--text-primary); - margin-bottom: var(--space-lg); - text-align: center; - position: relative; -} - -/* 电影列表 */ -.movie-list { - display: flex; - flex-direction: column; - gap: var(--space-md); -} - -.movie-item { - display: flex; - align-items: center; - gap: var(--space-md); - padding: var(--space-lg); - background: var(--bg-primary); - border-radius: var(--radius-lg); - box-shadow: var(--shadow-sm); - border: 1px solid rgba(0, 0, 0, 0.05); - transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); - position: relative; - overflow: hidden; -} - -.movie-item::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: linear-gradient(135deg, transparent 0%, rgba(76, 175, 80, 0.03) 100%); - opacity: 0; - transition: opacity 0.3s ease; -} - -.movie-item:hover { - transform: translateY(-4px); - box-shadow: 0 10px 25px rgba(76, 175, 80, 0.15); - border-color: rgba(76, 175, 80, 0.3); -} - -.movie-item:hover::before { - opacity: 1; -} - -/* 特殊排名样式 */ -.movie-item.top-1 { - background: linear-gradient(135deg, rgba(76, 175, 80, 0.08) 0%, var(--bg-primary) 100%); - border-color: rgba(76, 175, 80, 0.4); -} - -.movie-item.top-2 { - background: linear-gradient(135deg, rgba(129, 199, 132, 0.06) 0%, var(--bg-primary) 100%); - border-color: rgba(129, 199, 132, 0.3); -} - -.movie-item.top-3 { - background: linear-gradient(135deg, rgba(165, 214, 167, 0.05) 0%, var(--bg-primary) 100%); - border-color: rgba(165, 214, 167, 0.3); -} - -/* 排名徽章 */ -.movie-rank { - display: flex; - align-items: center; - justify-content: center; - width: 50px; - height: 50px; - border-radius: var(--radius-md); - font-size: 1.2rem; - font-weight: 700; - flex-shrink: 0; - transition: all 0.3s ease; - position: relative; -} - -.movie-item:hover .movie-rank { - transform: scale(1.1); -} - -.movie-rank.gold { - background: linear-gradient(135deg, #2e7d32, #4caf50); - color: white; - box-shadow: 0 4px 15px rgba(46, 125, 50, 0.4); -} - -.movie-rank.silver { - background: linear-gradient(135deg, #388e3c, #66bb6a); - color: white; - box-shadow: 0 4px 15px rgba(56, 142, 60, 0.4); -} - -.movie-rank.bronze { - background: linear-gradient(135deg, #4caf50, #81c784); - color: white; - box-shadow: 0 4px 15px rgba(76, 175, 80, 0.4); -} - -.movie-rank.regular { - background: linear-gradient(135deg, #66bb6a, #a5d6a7); - color: white; - box-shadow: 0 4px 15px rgba(102, 187, 106, 0.3); -} - -/* 电影内容 */ -.movie-content { - flex: 1; - display: flex; - flex-direction: column; - gap: var(--space-sm); - min-width: 0; -} - -.movie-title { - font-size: 1.1rem; - font-weight: 600; - color: var(--text-primary); - line-height: 1.4; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.movie-meta { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--space-md); - flex-wrap: wrap; -} - -.movie-year { - color: var(--text-muted); - font-size: 0.85rem; - background: var(--bg-tertiary); - padding: var(--space-xs) var(--space-sm); - border-radius: var(--radius-sm); - font-weight: 500; -} - -.movie-boxoffice { - font-weight: 700; - color: var(--warning-color); - font-size: 1rem; - white-space: nowrap; -} - -/* 更新时间 */ -.update-time { - text-align: center; - margin-top: var(--space-lg); - padding: var(--space-md); - background: var(--bg-secondary); - border-radius: var(--radius-md); - color: var(--text-secondary); - font-size: 0.9rem; - border: 1px solid var(--bg-tertiary); -} - -/* 错误状态 */ -.error { - text-align: center; - padding: var(--space-2xl); - color: var(--error-color); -} - -.error h3 { - font-size: 1.2rem; - margin-bottom: var(--space-md); -} - -.error p { - margin-bottom: var(--space-sm); - color: var(--text-secondary); -} - -/* 响应式设计 */ -@media (max-width: 768px) { - .container { - margin: var(--space-md); - padding: var(--space-lg); - border-radius: var(--radius-lg); - } - - .header { - margin-bottom: var(--space-lg); - padding-bottom: var(--space-md); - } - - .header h1 { - font-size: 1.8rem; - gap: var(--space-sm); - } - - .header h1 .update-badge { - font-size: 0.35em; - padding: 2px var(--space-sm); - } - - .movie-item { - padding: var(--space-md); - gap: var(--space-sm); - } - - .movie-rank { - width: 42px; - height: 42px; - font-size: 1rem; - } - - .movie-title { - font-size: 1rem; - } - - .movie-meta { - gap: var(--space-sm); - } - - .movie-year { - font-size: 0.8rem; - } - - .movie-boxoffice { - font-size: 0.9rem; - } -} - -@media (max-width: 480px) { - .container { - margin: var(--space-sm); - padding: var(--space-md); - } - - .header h1 { - font-size: 1.6rem; - flex-direction: column; - gap: var(--space-xs); - } - - .movie-list { - gap: var(--space-sm); - } - - .movie-item { - padding: var(--space-sm); - } - - .movie-rank { - width: 38px; - height: 38px; - font-size: 0.9rem; - } - - .movie-title { - font-size: 0.95rem; - } - - .movie-meta { - flex-direction: column; - align-items: flex-start; - gap: var(--space-xs); - } -} - -/* 减少动画以节省电池 */ -@media (prefers-reduced-motion: reduce) { - *, - *::before, - *::after { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - } - - body::before { - animation: none; - } -} - -/* 深色模式支持 */ -@media (prefers-color-scheme: dark) { - :root { - --text-primary: #f7fafc; - --text-secondary: #e2e8f0; - --text-muted: #a0aec0; - --bg-primary: #2d3748; - --bg-secondary: #4a5568; - --bg-tertiary: #718096; - } - - body { - background: linear-gradient(135deg, #2d3748 0%, #4a5568 100%); - } - - .container { - background: rgba(45, 55, 72, 0.95); - border-color: rgba(255, 255, 255, 0.1); - } - - .movie-item { - background: var(--bg-primary); - border-color: rgba(255, 255, 255, 0.1); - } - - .movie-item:hover { - border-color: rgba(102, 126, 234, 0.4); - } -} - -/* 打印样式 */ -@media print { - body { - background: white; - color: black; - } - - body::before { - display: none; - } - - .container { - background: white; - box-shadow: none; - border: 1px solid #ccc; - } - - .movie-item { - break-inside: avoid; - box-shadow: none; - border: 1px solid #ddd; - } - - .header h1 .update-badge { - background: #666; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/index.html deleted file mode 100755 index 69ebcdca..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - 猫眼票房排行榜 | 全球电影总票房 - - - - - - - - -
    - -
    -

    - 🎬 - 猫眼票房排行榜 - 实时更新 -

    -

    全球电影总票房榜单 | 权威数据 | 实时更新

    -
    - - -
    -
    -

    正在加载票房数据...

    -
    - - -
    -
    - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/js/script.js b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/js/script.js deleted file mode 100755 index 126db9fa..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/js/script.js +++ /dev/null @@ -1,266 +0,0 @@ -// 猫眼票房排行榜 - JavaScript 实现 - -const API = { - endpoints: [], - currentIndex: 0, - params: { - encoding: 'json' - }, - localFallback: '返回接口.json', - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/maoyan`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.api.shumengya.top/v2/maoyan']; - } - }, - // 获取当前接口URL - getCurrentUrl() { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v)); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } -}; - -let elements = {}; - -// 初始化 -window.addEventListener('DOMContentLoaded', () => { - initElements(); - loadMaoyanList(); -}); - -function initElements() { - elements = { - container: document.getElementById('ranking-content'), - loading: document.getElementById('loading'), - updateTime: document.getElementById('api-update-time'), - statsTotal: document.getElementById('stats-total'), - statsTop10: document.getElementById('stats-top10') - }; -} - -async function loadMaoyanList() { - try { - showLoading(true); - - // 优先从线上API请求 - let data = await fetchFromAPI(); - - // 如果线上失败,尝试从本地返回接口.json加载 - if (!data) { - data = await fetchFromLocal(); - } - - if (!data || data.code !== 200 || !data.data) { - throw new Error(data && data.message ? data.message : '未能获取到有效数据'); - } - - renderRanking(data.data); - } catch (error) { - console.error('加载排行榜失败:', error); - showError(error.message || '加载失败,请稍后重试'); - } finally { - showLoading(false); - } -} - -async function fetchFromAPI() { - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const resp = await fetch(url, { - cache: 'no-store', - timeout: 10000 // 10秒超时 - }); - - if (!resp.ok) { - throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); - } - - const data = await resp.json(); - - if (data && data.code === 200) { - console.log(`接口 ${i + 1} 请求成功`); - return data; - } - - throw new Error(data && data.message ? data.message : '接口返回异常'); - - } catch (e) { - console.warn(`接口 ${i + 1} 失败:`, e.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了 - console.warn('所有远程接口都失败,尝试本地数据'); - return null; - } - } -} - -async function fetchFromLocal() { - try { - const resp = await fetch(API.localFallback + `?t=${Date.now()}`); - if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`); - const data = await resp.json(); - return data; - } catch (e) { - console.error('读取本地返回接口.json失败:', e); - return null; - } -} - -function renderRanking(payload) { - const { list = [], tip = '', update_time = '', update_time_at } = payload || {}; - - // 更新时间 - if (elements.updateTime) { - elements.updateTime.textContent = update_time ? `更新时间:${update_time}` : ''; - } - - // 统计信息 - if (elements.statsTotal) { - elements.statsTotal.textContent = list.length; - } - if (elements.statsTop10) { - elements.statsTop10.textContent = Math.min(10, list.length); - } - - // 渲染列表 - const html = ` -
    -

    全球电影总票房排行榜

    -
    - ${list.map(item => renderMovieItem(item)).join('')} -
    -
    - ${tip ? `
    ${escapeHtml(tip)}
    ` : ''} - ${update_time ? `
    更新时间:${escapeHtml(update_time)}
    ` : ''} - `; - - elements.container.innerHTML = html; - elements.container.classList.add('fade-in'); -} - -// 格式化票房数据,将数字转换为更易读的形式 -function formatBoxOffice(value) { - if (!value) return '未知'; - - // 将字符串转换为数字 - const num = typeof value === 'string' ? parseFloat(value.replace(/[^0-9.]/g, '')) : value; - - if (isNaN(num)) return value; - - if (num >= 100000000) { - return (num / 100000000).toFixed(2) + ' 亿'; - } else if (num >= 10000) { - return (num / 10000).toFixed(2) + ' 万'; - } else { - return num.toLocaleString(); - } -} - -function renderMovieItem(item) { - const rank = item.rank; - const cls = rank === 1 ? 'top-1' : rank === 2 ? 'top-2' : rank === 3 ? 'top-3' : ''; - const badgeCls = rank === 1 ? 'gold' : rank === 2 ? 'silver' : rank === 3 ? 'bronze' : 'regular'; - - // 格式化票房数据 - const boxOffice = formatBoxOffice(item.boxoffice || item.box_office); - - // 美化排名显示 - let rankDisplay; - if (rank === 1) { - rankDisplay = '🏆'; - } else if (rank === 2) { - rankDisplay = '🥈'; - } else if (rank === 3) { - rankDisplay = '🥉'; - } else { - rankDisplay = rank; - } - - return ` -
    -
    ${rankDisplay}
    -
    -
    ${escapeHtml(item.movie_name)}
    -
    - ${escapeHtml(item.release_year || '未知')} - ¥${boxOffice} -
    -
    -
    `; -} - - -function formatCurrencyDesc(desc, num) { - if (desc && typeof desc === 'string' && desc.trim()) return desc; - if (typeof num === 'number') { - // 人民币按亿元显示 - if (num >= 1e8) return (num / 1e8).toFixed(2) + '亿元'; - if (num >= 1e4) return (num / 1e4).toFixed(2) + '万元'; - return num.toLocaleString('zh-CN') + '元'; - } - return '—'; -} - -function showLoading(show) { - if (elements.loading) elements.loading.style.display = show ? 'block' : 'none'; - if (elements.container) elements.container.style.display = show ? 'none' : 'block'; -} - -function showError(message) { - if (!elements.container) return; - elements.container.innerHTML = ` -
    -

    ⚠️ 加载失败

    -

    ${escapeHtml(message)}

    -

    请稍后重试

    -
    - `; - elements.container.style.display = 'block'; -} - -function escapeHtml(text) { - if (text == null) return ''; - const div = document.createElement('div'); - div.textContent = String(text); - return div.innerHTML; -} - -// 键盘刷新快捷键 Ctrl/Cmd + R 刷新数据区域(不刷新整页) -window.addEventListener('keydown', (e) => { - if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'r') { - e.preventDefault(); - loadMaoyanList(); - } -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/接口集合.json b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json deleted file mode 100755 index e430d395..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json +++ /dev/null @@ -1,171 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "list": [ - { - "rank": 1, - "maoyan_id": 243, - "movie_name": "阿凡达", - "release_year": "2009", - "box_office": 21200972239, - "box_office_desc": "212.01亿元" - }, - { - "rank": 2, - "maoyan_id": 248172, - "movie_name": "复仇者联盟 4:终局之战", - "release_year": "2019", - "box_office": 20299852689, - "box_office_desc": "203亿元" - }, - { - "rank": 3, - "maoyan_id": 78461, - "movie_name": "阿凡达:水之道", - "release_year": "2022", - "box_office": 16825062887, - "box_office_desc": "168.25亿元" - }, - { - "rank": 4, - "maoyan_id": 267, - "movie_name": "泰坦尼克号", - "release_year": "1997", - "box_office": 16423064756, - "box_office_desc": "164.23亿元" - }, - { - "rank": 5, - "maoyan_id": 1294273, - "movie_name": "哪吒之魔童闹海", - "release_year": "2025", - "box_office": 15908714214, - "box_office_desc": "159.09亿元" - }, - { - "rank": 6, - "maoyan_id": 78536, - "movie_name": "星球大战:原力觉醒", - "release_year": "2015", - "box_office": 15019898914, - "box_office_desc": "150.2亿元" - }, - { - "rank": 7, - "maoyan_id": 248170, - "movie_name": "复仇者联盟 3:无限战争", - "release_year": "2018", - "box_office": 14882882413, - "box_office_desc": "148.83亿元" - }, - { - "rank": 8, - "maoyan_id": 1254435, - "movie_name": "蜘蛛侠:英雄无归", - "release_year": "2021", - "box_office": 14160042137, - "box_office_desc": "141.6亿元" - }, - { - "rank": 9, - "maoyan_id": 1479534, - "movie_name": "头脑特工队 2", - "release_year": "2024", - "box_office": 12319141075, - "box_office_desc": "123.19亿元" - }, - { - "rank": 10, - "maoyan_id": 78602, - "movie_name": "侏罗纪世界", - "release_year": "2015", - "box_office": 12120986621, - "box_office_desc": "121.21亿元" - }, - { - "rank": 11, - "maoyan_id": 1189879, - "movie_name": "狮子王", - "release_year": "2019", - "box_office": 12051977766, - "box_office_desc": "120.52亿元" - }, - { - "rank": 12, - "maoyan_id": 262, - "movie_name": "复仇者联盟", - "release_year": "2012", - "box_office": 11026033139, - "box_office_desc": "110.26亿元" - }, - { - "rank": 13, - "maoyan_id": 78405, - "movie_name": "速度与激情 7", - "release_year": "2015", - "box_office": 10988354292, - "box_office_desc": "109.88亿元" - }, - { - "rank": 14, - "maoyan_id": 341152, - "movie_name": "壮志凌云 2:独行侠", - "release_year": "2022", - "box_office": 10845892091, - "box_office_desc": "108.46亿元" - }, - { - "rank": 15, - "maoyan_id": 247949, - "movie_name": "冰雪奇缘 2", - "release_year": "2019", - "box_office": 10541240357, - "box_office_desc": "105.41亿元" - }, - { - "rank": 16, - "maoyan_id": 344942, - "movie_name": "芭比", - "release_year": "2023", - "box_office": 10493054406, - "box_office_desc": "104.93亿元" - }, - { - "rank": 17, - "maoyan_id": 78429, - "movie_name": "复仇者联盟 2:奥创纪元", - "release_year": "2015", - "box_office": 10188347873, - "box_office_desc": "101.88亿元" - }, - { - "rank": 18, - "maoyan_id": 1250896, - "movie_name": "超级马里奥兄弟大电影", - "release_year": "2023", - "box_office": 9868050757, - "box_office_desc": "98.68亿元" - }, - { - "rank": 19, - "maoyan_id": 341138, - "movie_name": "黑豹", - "release_year": "2018", - "box_office": 9788853998, - "box_office_desc": "97.89亿元" - }, - { - "rank": 20, - "maoyan_id": 916, - "movie_name": "哈利・波特与死亡圣器(下)", - "release_year": "2011", - "box_office": 9735002643, - "box_office_desc": "97.35亿元" - } - ], - "tip": "注:内地票房数据实时更新,包括点映及预售票房。港澳台及海外票房为统计数据,每小时更新。汇率采用 2025年1月31日市场汇率,1美元≈7.2514人民币", - "update_time": "2025/08/19 14:41:34", - "update_time_at": 1755585694385 - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/css/background.css deleted file mode 100644 index f9843a4d..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/css/background.css +++ /dev/null @@ -1,76 +0,0 @@ -.background-canvas { - position: fixed; - inset: 0; - z-index: -1; - overflow: hidden; - background: linear-gradient(180deg, #f4fff6 0%, #e7f8eb 45%, #def1e4 100%); -} - -.glow { - position: absolute; - width: 420px; - height: 420px; - border-radius: 55% 45% 60% 40% / 48% 52% 45% 55%; - opacity: 0.25; - filter: blur(0px); - background: radial-gradient(circle at 35% 35%, rgba(140, 214, 167, 0.65), rgba(140, 214, 167, 0)); - animation: floaty 32s ease-in-out infinite; -} - -.glow-1 { - top: -140px; - left: -160px; - animation-delay: 0s; -} - -.glow-2 { - top: 55%; - left: 60%; - animation-delay: 8s; - background: radial-gradient(circle at 60% 60%, rgba(120, 192, 152, 0.55), rgba(120, 192, 152, 0)); -} - -.glow-3 { - bottom: -160px; - right: -120px; - animation-delay: 16s; - background: radial-gradient(circle at 40% 40%, rgba(176, 229, 197, 0.6), rgba(176, 229, 197, 0)); -} - -@keyframes floaty { - 0% { - transform: translate3d(0, 0, 0) scale(1); - } - 30% { - transform: translate3d(35px, -25px, 0) scale(1.05); - } - 60% { - transform: translate3d(-30px, 30px, 0) scale(0.95); - } - 100% { - transform: translate3d(0, 0, 0) scale(1); - } -} - -@media (max-width: 768px) { - .glow { - width: 260px; - height: 260px; - opacity: 0.22; - } - - .glow-1 { - top: -110px; - left: -140px; - } - - .glow-2 { - top: 48%; - left: 38%; - } - - .glow-3 { - bottom: -140px; - right: -120px; - } -} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/css/style.css deleted file mode 100644 index 18ffe2c7..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/css/style.css +++ /dev/null @@ -1,393 +0,0 @@ -:root { - --surface-base: rgba(255, 255, 255, 0.85); - --surface-soft: rgba(248, 253, 249, 0.9); - --border-soft: rgba(120, 192, 152, 0.22); - --accent-strong: #4caf7a; - --accent-soft: #8fd5a4; - --accent-pale: #c6efd5; - --text-primary: #134a32; - --text-muted: #528169; - --chip-bg: rgba(140, 214, 167, 0.18); - --shadow-soft: 0 16px 40px rgba(31, 74, 53, 0.14); - color-scheme: light; -} - -* { - box-sizing: border-box; - margin: 0; - padding: 0; -} - -body { - font-family: "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif; - color: var(--text-primary); - background: transparent; - line-height: 1.6; - min-height: 100vh; - -webkit-font-smoothing: antialiased; -} - -.app { - width: min(100%, 930px); - margin: 0 auto; - padding: 20px 16px 80px; - display: flex; - flex-direction: column; - gap: 18px; -} - -.hero { - display: flex; - flex-direction: column; - gap: 18px; - background: var(--surface-base); - border: 1px solid var(--border-soft); - border-radius: 22px; - padding: 22px 18px; - box-shadow: var(--shadow-soft); - backdrop-filter: blur(16px); -} - -.hero-text { - display: flex; - flex-direction: column; - gap: 10px; -} - -.badge { - align-self: flex-start; - padding: 4px 12px; - font-size: 0.82rem; - letter-spacing: 0.08em; - border-radius: 999px; - background: var(--chip-bg); - color: var(--accent-strong); -} - -.hero h1 { - font-size: 1.65rem; - font-weight: 700; -} - -.subtitle { - color: var(--text-muted); - font-size: 0.96rem; -} - -.hero-actions { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 10px; -} - -.refresh { - padding: 10px 20px; - border-radius: 999px; - border: none; - background: linear-gradient(135deg, #66bb86, #4caf7a); - color: #ffffff; - font-size: 0.95rem; - font-weight: 600; - cursor: pointer; - box-shadow: 0 12px 30px rgba(76, 175, 122, 0.36); - transition: transform 0.2s ease, box-shadow 0.2s ease; -} - -.refresh:active { - transform: scale(0.97); -} - -.refresh:disabled { - opacity: 0.65; - cursor: not-allowed; -} - -.update-time { - font-size: 0.85rem; - color: var(--text-muted); -} - -.quick-stats { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 12px; -} - -.stat-card { - background: var(--surface-soft); - border-radius: 18px; - border: 1px solid rgba(143, 213, 164, 0.24); - padding: 16px 18px; - box-shadow: var(--shadow-soft); - display: flex; - flex-direction: column; - gap: 6px; -} - -.stat-label { - font-size: 0.84rem; - color: var(--text-muted); - letter-spacing: 0.04em; -} - -.stat-value { - font-size: 1.35rem; - font-weight: 700; - color: var(--accent-strong); - display: flex; - align-items: baseline; - gap: 4px; -} - -.stat-value .unit { - font-size: 0.9rem; - font-weight: 500; - color: var(--text-muted); -} - -.list-section { - background: var(--surface-base); - border: 1px solid var(--border-soft); - border-radius: 24px; - padding: 24px 18px 28px; - box-shadow: var(--shadow-soft); - display: flex; - flex-direction: column; - gap: 18px; -} - -.list-header { - display: flex; - flex-direction: column; - gap: 6px; -} - -.list-header h2 { - font-size: 1.28rem; - font-weight: 700; -} - -.list-tag { - font-size: 0.88rem; - color: var(--text-muted); -} - -.series-list { - display: flex; - flex-direction: column; - gap: 14px; -} - -.loading, -.error-message, -.empty-message { - padding: 18px 16px; - text-align: center; - color: var(--text-muted); - background: rgba(255, 255, 255, 0.75); - border-radius: 14px; - border: 1px dashed rgba(120, 192, 152, 0.32); -} - -.series-item { - display: grid; - grid-template-columns: auto 1fr; - gap: 14px; - background: rgba(255, 255, 255, 0.92); - border-radius: 20px; - border: 1px solid rgba(120, 192, 152, 0.2); - padding: 16px; - box-shadow: 0 14px 32px rgba(31, 74, 53, 0.12); - transition: transform 0.2s ease, box-shadow 0.2s ease; -} - -.series-item:hover { - transform: translateY(-2px); - box-shadow: 0 18px 40px rgba(31, 74, 53, 0.16); -} - -.rank-pill { - width: 44px; - height: 44px; - border-radius: 14px; - display: flex; - align-items: center; - justify-content: center; - font-weight: 700; - font-size: 1.05rem; - color: #ffffff; - background: linear-gradient(135deg, #7ed49b, #5cc88a); -} - -.rank-pill.top-1 { - background: linear-gradient(135deg, #5cc88a, #3da36b); -} - -.rank-pill.top-2 { - background: linear-gradient(135deg, #72d0a0, #55be85); -} - -.rank-pill.top-3 { - background: linear-gradient(135deg, #8fe0b4, #6fd09a); -} - -.series-body { - display: flex; - flex-direction: column; - gap: 12px; -} - -.series-head { - display: flex; - flex-direction: column; - gap: 6px; -} - -.series-name { - font-size: 1.05rem; - font-weight: 700; - color: var(--text-primary); -} - -.series-meta { - font-size: 0.9rem; - color: var(--text-muted); -} - -.metric-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 10px 14px; -} - -.metric { - display: flex; - flex-direction: column; - gap: 2px; -} - -.metric-label { - font-size: 0.78rem; - color: var(--text-muted); - letter-spacing: 0.04em; -} - -.metric-value { - font-size: 0.98rem; - font-weight: 600; - color: var(--accent-strong); -} - -.progress-wrap { - display: flex; - flex-direction: column; - gap: 6px; - margin-top: 6px; -} - -.progress-row { - display: flex; - flex-direction: column; - gap: 4px; -} - -.progress-label { - display: flex; - justify-content: space-between; - font-size: 0.8rem; - color: var(--text-muted); -} - -.progress-bar { - width: 100%; - height: 6px; - border-radius: 6px; - background: rgba(120, 192, 152, 0.18); - overflow: hidden; -} - -.progress-bar span { - display: block; - height: 100%; - border-radius: inherit; - background: linear-gradient(135deg, rgba(120, 192, 152, 0.9), rgba(76, 175, 122, 0.95)); - width: 0; - transition: width 0.45s ease; -} - -/* Tablet */ -@media (min-width: 600px) { - .app { - padding: 26px 20px 96px; - gap: 22px; - } - - .hero { - flex-direction: row; - justify-content: space-between; - align-items: center; - padding: 26px 28px; - } - - .hero h1 { - font-size: 1.9rem; - } - - .hero-actions { - align-items: flex-end; - } - - .quick-stats { - grid-template-columns: repeat(4, minmax(0, 1fr)); - gap: 16px; - } - - .series-item { - grid-template-columns: 70px 1fr; - padding: 18px 22px; - } - - .rank-pill { - width: 54px; - height: 54px; - font-size: 1.2rem; - } - - .metric-grid { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } -} - -/* Desktop */ -@media (min-width: 1024px) { - .app { - padding: 34px 24px 110px; - } - - .list-section { - padding: 30px 32px 36px; - } - - .series-item { - grid-template-columns: 96px 1fr; - padding: 22px 26px; - } - - .series-name { - font-size: 1.22rem; - } - - .metric-grid { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } -} - -@media (prefers-reduced-motion: reduce) { - * { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - scroll-behavior: auto !important; - } -} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/index.html deleted file mode 100644 index 7057cfaf..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - 猫眼网剧实时热度 - - - - -
    -
    -
    -
    -
    - -
    -
    -
    - 实时热度 -

    猫眼网剧实时热度

    -

    网剧热度榜单即时更新,洞察全网追剧风向

    -
    -
    - - 正在获取最新数据... -
    -
    - -
    -
    -

    上榜剧集

    -

    --

    -
    -
    -

    最高热度值

    -

    --热度

    -
    -
    -

    平均热度值

    -

    --热度

    -
    -
    -

    官方刷新频率

    -

    --

    -
    -
    - -
    -
    -

    网剧热度排行

    - 数据持续刷新 -
    -
    -
    正在载入网剧热度...
    -
    -
    -
    - - - - diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/js/main.js b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/js/main.js deleted file mode 100644 index dfd8c965..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/js/main.js +++ /dev/null @@ -1,293 +0,0 @@ -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top/v2/maoyan/realtime/web" -]; - -const FALLBACK_ENDPOINT = "./返回接口.json"; -const REFRESH_INTERVAL = 4500; -const MAX_ITEMS = 40; - -const refreshButton = document.getElementById("refreshButton"); -const updateTimeEl = document.getElementById("updateTime"); -const seriesListEl = document.getElementById("seriesList"); -const seriesCountEl = document.getElementById("seriesCount"); -const topHeatEl = document.getElementById("topHeat"); -const avgHeatEl = document.getElementById("avgHeat"); -const refreshGapEl = document.getElementById("refreshGap"); - -let isLoading = false; -let autoTimer = null; - -function escapeHtml(value) { - if (value === undefined || value === null) { - return ""; - } - return String(value) - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); -} - -function safeText(value, fallback = "--") { - if (value === undefined || value === null || value === "") { - return fallback; - } - return escapeHtml(value); -} - -function formatNumber(value, fractionDigits = 2) { - const numeric = Number(value); - if (!Number.isFinite(numeric)) { - return "--"; - } - return numeric.toFixed(fractionDigits); -} - -function formatGap(seconds) { - const numeric = Number(seconds); - if (!Number.isFinite(numeric) || numeric <= 0) { - return "--"; - } - - if (numeric < 60) { - return `约每 ${Math.round(numeric)} 秒`; - } - - const minutes = Math.floor(numeric / 60); - const remainder = Math.round(numeric % 60); - if (remainder === 0) { - return `约每 ${minutes} 分钟`; - } - return `约每 ${minutes} 分 ${remainder} 秒`; -} - -function formatUpdateTime(data) { - if (data && typeof data.updated === "string" && data.updated.trim()) { - return data.updated.trim(); - } - if (data && typeof data.updated_at === "number" && Number.isFinite(data.updated_at)) { - return new Date(data.updated_at).toLocaleString("zh-CN", { hour12: false }); - } - return new Date().toLocaleString("zh-CN", { hour12: false }); -} - -function renderStats(list, gapSeconds) { - const total = Array.isArray(list) ? list.length : 0; - seriesCountEl.textContent = total ? total.toString() : "--"; - - if (total) { - let maxHeat = 0; - let sumHeat = 0; - list.forEach(item => { - const heat = Number(item?.curr_heat); - if (Number.isFinite(heat)) { - if (heat > maxHeat) { - maxHeat = heat; - } - sumHeat += heat; - } - }); - - topHeatEl.textContent = maxHeat ? maxHeat.toFixed(2) : "--"; - const average = sumHeat && total ? (sumHeat / total) : 0; - avgHeatEl.textContent = average ? average.toFixed(2) : "--"; - } else { - topHeatEl.textContent = "--"; - avgHeatEl.textContent = "--"; - } - - refreshGapEl.textContent = formatGap(gapSeconds); -} - -function createMetric(label, value) { - return ` -
    - ${label} - ${safeText(value)} -
    - `; -} - -function normalizeBarValue(list) { - let maxValue = 0; - if (Array.isArray(list)) { - list.forEach(item => { - const bar = Number(item?.bar_value ?? item?.curr_heat); - if (Number.isFinite(bar) && bar > maxValue) { - maxValue = bar; - } - }); - } - return maxValue || 1; -} - -function createSeriesItem(series, index, maxBar) { - const article = document.createElement("article"); - article.className = "series-item"; - - const rankClass = index < 3 ? ` top-${index + 1}` : ""; - const name = safeText(series?.series_name || "未命名剧集"); - const releaseInfo = safeText(series?.release_info || "--"); - const platform = safeText(series?.platform_desc || "--"); - const heatDesc = safeText(series?.curr_heat_desc || formatNumber(series?.curr_heat)); - - const barValue = Number(series?.bar_value ?? series?.curr_heat); - const ratio = Number.isFinite(barValue) && maxBar > 0 ? Math.min(100, Math.max(0, (barValue / maxBar) * 100)) : 0; - - article.innerHTML = ` -
    ${index + 1}
    -
    -
    -
    ${name}
    -
    ${releaseInfo} · ${platform}
    -
    -
    - ${createMetric("实时热度", heatDesc)} - ${createMetric("上线信息", releaseInfo)} - ${createMetric("播出平台", platform)} - ${createMetric("剧集ID", safeText(series?.series_id))} -
    -
    -
    -
    - 热度走势 - ${heatDesc} -
    -
    -
    -
    -
    - `; - - return article; -} - -function renderSeriesList(list) { - seriesListEl.innerHTML = ""; - - if (!Array.isArray(list) || list.length === 0) { - const empty = document.createElement("div"); - empty.className = "empty-message"; - empty.textContent = "暂时没有可展示的剧集数据"; - seriesListEl.appendChild(empty); - return; - } - - const maxBar = normalizeBarValue(list); - list.slice(0, MAX_ITEMS).forEach((series, index) => { - seriesListEl.appendChild(createSeriesItem(series, index, maxBar)); - }); -} - -async function requestJson(url) { - const response = await fetch(url, { cache: "no-store" }); - if (!response.ok) { - throw new Error(`请求失败: ${response.status}`); - } - return response.json(); -} - -async function retrieveData() { - for (const endpoint of API_ENDPOINTS) { - try { - const result = await requestJson(endpoint); - if (result?.code === 200 && result?.data) { - return result.data; - } - } catch (error) { - console.warn("主接口请求失败", error); - } - } - - try { - const fallbackResult = await requestJson(FALLBACK_ENDPOINT); - if (fallbackResult?.data) { - return fallbackResult.data; - } - } catch (fallbackError) { - console.warn("本地示例数据读取失败", fallbackError); - } - - return null; -} - -async function loadData(isManual = false) { - if (isLoading) { - return; - } - - isLoading = true; - - if (isManual) { - refreshButton.disabled = true; - refreshButton.textContent = "刷新中..."; - } - - if (!seriesListEl.children.length) { - seriesListEl.innerHTML = '
    正在载入网剧热度...
    '; - } - - try { - const data = await retrieveData(); - if (!data) { - throw new Error("无法获取数据"); - } - - const list = Array.isArray(data.list) ? data.list : []; - renderSeriesList(list); - renderStats(list, data.update_gap_second); - updateTimeEl.textContent = `最近更新 ${formatUpdateTime(data)}`; - } catch (error) { - console.error("加载数据失败", error); - seriesListEl.innerHTML = ""; - const errBox = document.createElement("div"); - errBox.className = "error-message"; - errBox.textContent = "数据获取暂时不可用,系统稍后会自动重试"; - seriesListEl.appendChild(errBox); - updateTimeEl.textContent = "最近更新 --"; - renderStats([], 0); - } finally { - if (isManual) { - refreshButton.disabled = false; - refreshButton.textContent = "手动刷新"; - } - isLoading = false; - } -} - -function startAutoRefresh() { - if (autoTimer) { - clearInterval(autoTimer); - } - autoTimer = setInterval(() => { - loadData(false); - }, REFRESH_INTERVAL); -} - -refreshButton.addEventListener("click", () => { - loadData(true); -}); - -document.addEventListener("visibilitychange", () => { - if (document.hidden) { - if (autoTimer) { - clearInterval(autoTimer); - autoTimer = null; - } - } else { - startAutoRefresh(); - loadData(false); - } -}); - -function init() { - loadData(false); - startAutoRefresh(); -} - -if (document.readyState === "loading") { - document.addEventListener("DOMContentLoaded", init); -} else { - init(); -} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/返回接口.json deleted file mode 100644 index 3c212306..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/返回接口.json +++ /dev/null @@ -1,311 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "update_gap_second": 3, - "updated": "2025-09-26 16:36:56", - "updated_at": 1758875816062, - "list": [ - { - "series_id": 1517707, - "series_name": "赴山海", - "release_info": "上线16天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 6290.29, - "curr_heat_desc": "6290.29", - "bar_value": 6290.29 - }, - { - "series_id": 1528168, - "series_name": "许我耀眼", - "release_info": "上线首日", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 6231.35, - "curr_heat_desc": "6231.35", - "bar_value": 5749.54721862606 - }, - { - "series_id": 1528151, - "series_name": "欢乐家长群2", - "release_info": "上线12天", - "platform_desc": "芒果TV独播", - "platform_txt": -1, - "curr_heat": 6012.95, - "curr_heat_desc": "6012.95", - "bar_value": 5119.06438712135 - }, - { - "series_id": 1492955, - "series_name": "吴邪私家笔记", - "release_info": "上线7天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 5851.91, - "curr_heat_desc": "5851.91", - "bar_value": 4596.76326056356 - }, - { - "series_id": 1538034, - "series_name": "不眠日", - "release_info": "上线10天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 5804.09, - "curr_heat_desc": "5804.09", - "bar_value": 4206.68639815508 - }, - { - "series_id": 1501684, - "series_name": "灼灼韶华", - "release_info": "上线16天", - "platform_desc": "优酷独播", - "platform_txt": 0, - "curr_heat": 5799.01, - "curr_heat_desc": "5799.01", - "bar_value": 3878.03171596132 - }, - { - "series_id": 1474248, - "series_name": "围猎", - "release_info": "上线2天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 5752.05, - "curr_heat_desc": "5752.05", - "bar_value": 3549.20963005863 - }, - { - "series_id": 1501687, - "series_name": "守护者们", - "release_info": "上线4天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 5730.63, - "curr_heat_desc": "5730.63", - "bar_value": 3262.59275525736 - }, - { - "series_id": 1520710, - "series_name": "生万物", - "release_info": "上线45天", - "platform_desc": "爱奇艺独播", - "platform_txt": 1, - "curr_heat": 5475.27, - "curr_heat_desc": "5475.27", - "bar_value": 2876.18977832356 - }, - { - "series_id": 1520734, - "series_name": "芬芳喜事", - "release_info": "上线5天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 5462.54, - "curr_heat_desc": "5462.54", - "bar_value": 2647.63508938203 - }, - { - "series_id": 1506349, - "series_name": "子夜归", - "release_info": "上线40天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 5414.09, - "curr_heat_desc": "5414.09", - "bar_value": 2421.25465526037 - }, - { - "series_id": 1568466, - "series_name": "照镜辞", - "release_info": "上线8天", - "platform_desc": "哔哩哔哩独播", - "platform_txt": -1, - "curr_heat": 5405.94, - "curr_heat_desc": "5405.94", - "bar_value": 2230.68228745166 - }, - { - "series_id": 1501665, - "series_name": "足迹", - "release_info": "上线23天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 5345.55, - "curr_heat_desc": "5345.55", - "bar_value": 2035.21546242053 - }, - { - "series_id": 1481475, - "series_name": "与晋长安", - "release_info": "上线34天", - "platform_desc": "爱奇艺独播", - "platform_txt": 1, - "curr_heat": 5231.26, - "curr_heat_desc": "5231.26", - "bar_value": 1837.70502435479 - }, - { - "series_id": 1500426, - "series_name": "归队", - "release_info": "上线33天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 5167.29, - "curr_heat_desc": "5167.29", - "bar_value": 1674.88052510491 - }, - { - "series_id": 1513970, - "series_name": "阵地", - "release_info": "上线11天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 5155.5, - "curr_heat_desc": "5155.50", - "bar_value": 1541.8541283172 - }, - { - "series_id": 1578416, - "series_name": "金式森林", - "release_info": "上线10天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 5098.99, - "curr_heat_desc": "5098.99", - "bar_value": 1407.04554929882 - }, - { - "series_id": 1500365, - "series_name": "锦月如歌", - "release_info": "上线52天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 5082.9, - "curr_heat_desc": "5082.90", - "bar_value": 1294.15728646218 - }, - { - "series_id": 1481543, - "series_name": "凡人修仙传", - "release_info": "上线62天", - "platform_desc": "优酷独播", - "platform_txt": 0, - "curr_heat": 5064.74, - "curr_heat_desc": "5064.74", - "bar_value": 1189.82790916312 - }, - { - "series_id": 1521009, - "series_name": "十二封信", - "release_info": "上线29天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 5029.58, - "curr_heat_desc": "5029.58", - "bar_value": 1090.21013799029 - }, - { - "series_id": 1492917, - "series_name": "献鱼", - "release_info": "上线42天", - "platform_desc": "优酷独播", - "platform_txt": 0, - "curr_heat": 5010.95, - "curr_heat_desc": "5010.95", - "bar_value": 1002.19 - }, - { - "series_id": 1444502, - "series_name": "利剑·玫瑰", - "release_info": "上线61天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 4972.54, - "curr_heat_desc": "4972.54", - "bar_value": 917.613471447017 - }, - { - "series_id": 1518217, - "series_name": "扫毒风暴", - "release_info": "上线77天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 4896.37, - "curr_heat_desc": "4896.37", - "bar_value": 833.695051286619 - }, - { - "series_id": 1500364, - "series_name": "桃花映江山", - "release_info": "上线94天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 4806.34, - "curr_heat_desc": "4806.34", - "bar_value": 755.090462080828 - }, - { - "series_id": 1505465, - "series_name": "定风波", - "release_info": "上线57天", - "platform_desc": "爱奇艺独播", - "platform_txt": 1, - "curr_heat": 4744.14, - "curr_heat_desc": "4744.14", - "bar_value": 687.69123872798 - }, - { - "series_id": 1531702, - "series_name": "书卷一梦", - "release_info": "上线93天", - "platform_desc": "爱奇艺独播", - "platform_txt": 1, - "curr_heat": 4733.39, - "curr_heat_desc": "4733.39", - "bar_value": 633.081734434469 - }, - { - "series_id": 1500328, - "series_name": "蓄意宠爱", - "release_info": "上线5天", - "platform_desc": "优酷独播", - "platform_txt": 0, - "curr_heat": 4730.18, - "curr_heat_desc": "4730.18", - "bar_value": 583.736247352187 - }, - { - "series_id": 1532221, - "series_name": "目之所及", - "release_info": "上线30天", - "platform_desc": "爱奇艺独播", - "platform_txt": 1, - "curr_heat": 4712.48, - "curr_heat_desc": "4712.48", - "bar_value": 536.586836256929 - }, - { - "series_id": 1524115, - "series_name": "白夜宸缘起三生", - "release_info": "上线13天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 4653.77, - "curr_heat_desc": "4653.77", - "bar_value": 488.930252012005 - }, - { - "series_id": 1491942, - "series_name": "朝雪录", - "release_info": "上线76天", - "platform_desc": "爱奇艺独播", - "platform_txt": 1, - "curr_heat": 4623.3, - "curr_heat_desc": "4623.30", - "bar_value": 448.172875941959 - } - ] - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/background.css deleted file mode 100755 index 2069753d..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/background.css +++ /dev/null @@ -1,196 +0,0 @@ -/* 页面主背景 */ -body { - background: linear-gradient(135deg, #f8fffe 0%, #e8f5e8 50%, #d4f1d4 100%); - background-attachment: fixed; - position: relative; -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(39, 174, 96, 0.05) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(46, 204, 113, 0.05) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(168, 230, 207, 0.08) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 容器背景 */ -.container { - background: rgba(255, 255, 255, 0.7); - backdrop-filter: blur(10px); - border-radius: 16px; - box-shadow: 0 8px 32px rgba(39, 174, 96, 0.1); - margin-top: 20px; - margin-bottom: 20px; -} - -/* 头部背景 */ -.header { - background: linear-gradient(135deg, rgba(39, 174, 96, 0.05) 0%, rgba(168, 230, 207, 0.05) 100%); - border-radius: 16px 16px 0 0; - position: relative; - overflow: hidden; -} - -.header::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 30% 20%, rgba(39, 174, 96, 0.1) 0%, transparent 40%), - radial-gradient(circle at 70% 80%, rgba(46, 204, 113, 0.08) 0%, transparent 40%); - pointer-events: none; -} - -/* 热搜项目背景 */ -.hot-item { - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(8px); - position: relative; - overflow: hidden; -} - -.hot-item::after { - content: ''; - position: absolute; - top: 0; - right: 0; - width: 60px; - height: 100%; - background: linear-gradient(90deg, transparent 0%, rgba(39, 174, 96, 0.02) 100%); - pointer-events: none; -} - -/* 前三名特殊背景效果 */ -.hot-item:nth-child(1) { - background: linear-gradient(135deg, rgba(231, 76, 60, 0.05) 0%, rgba(255, 255, 255, 0.95) 100%); -} - -.hot-item:nth-child(2) { - background: linear-gradient(135deg, rgba(243, 156, 18, 0.05) 0%, rgba(255, 255, 255, 0.95) 100%); -} - -.hot-item:nth-child(3) { - background: linear-gradient(135deg, rgba(52, 152, 219, 0.05) 0%, rgba(255, 255, 255, 0.95) 100%); -} - -/* 加载状态背景 */ -.loading { - background: rgba(255, 255, 255, 0.8); - backdrop-filter: blur(8px); - border-radius: 12px; - margin: 20px; -} - -/* 错误信息背景 */ -.error-message { - background: linear-gradient(135deg, rgba(231, 76, 60, 0.05) 0%, rgba(255, 255, 255, 0.9) 100%); - backdrop-filter: blur(8px); - border-radius: 12px; - border: 1px solid rgba(231, 76, 60, 0.1); - margin: 20px; -} - -/* 底部背景 */ -.footer { - background: linear-gradient(135deg, rgba(39, 174, 96, 0.03) 0%, rgba(168, 230, 207, 0.03) 100%); - border-radius: 0 0 16px 16px; - position: relative; -} - -.footer::before { - content: ''; - position: absolute; - top: 0; - left: 50%; - transform: translateX(-50%); - width: 60px; - height: 1px; - background: linear-gradient(90deg, transparent 0%, rgba(39, 174, 96, 0.3) 50%, transparent 100%); -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - .container { - margin-top: 10px; - margin-bottom: 10px; - border-radius: 12px; - } - - .header { - border-radius: 12px 12px 0 0; - } - - .footer { - border-radius: 0 0 12px 12px; - } - - body::before { - background-image: - radial-gradient(circle at 20% 80%, rgba(39, 174, 96, 0.03) 0%, transparent 40%), - radial-gradient(circle at 80% 20%, rgba(46, 204, 113, 0.03) 0%, transparent 40%); - } -} - -@media (min-width: 1025px) { - .container { - margin-top: 40px; - margin-bottom: 40px; - } - - body::before { - background-image: - radial-gradient(circle at 15% 85%, rgba(39, 174, 96, 0.06) 0%, transparent 60%), - radial-gradient(circle at 85% 15%, rgba(46, 204, 113, 0.06) 0%, transparent 60%), - radial-gradient(circle at 50% 50%, rgba(168, 230, 207, 0.04) 0%, transparent 70%); - } -} - -/* 动画效果 */ -@keyframes backgroundShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 悬浮时的背景变化 */ -.hot-item:hover { - background: rgba(255, 255, 255, 0.95); -} - -.hot-item:hover::after { - background: linear-gradient(90deg, transparent 0%, rgba(39, 174, 96, 0.05) 100%); -} - -/* 排名背景渐变 */ -.rank { - position: relative; - overflow: hidden; -} - -.rank::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 0%, transparent 100%); - pointer-events: none; -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/index.html deleted file mode 100755 index f119e25e..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - 百度实时热搜榜单 - - - - -
    -
    -

    百度实时热搜榜单

    -

    实时热门搜索,掌握网络脉搏

    -
    - -
    -
    -
    -

    正在加载热搜数据...

    -
    - - - - -
    - -
    -

    -
    -
    - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/script.js b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/script.js deleted file mode 100755 index d5324715..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/script.js +++ /dev/null @@ -1,196 +0,0 @@ -// DOM元素获取 -const loadingElement = document.getElementById('loading'); -const errorElement = document.getElementById('error'); -const hotListElement = document.getElementById('hotList'); -const updateTimeElement = document.getElementById('updateTime'); - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', function() { - loadData(); - - // 每5分钟自动刷新数据 - setInterval(loadData, 5 * 60 * 1000); - - // 监听页面可见性变化,页面重新可见时刷新数据 - document.addEventListener('visibilitychange', function() { - if (!document.hidden) { - loadData(); - } - }); - - // 监听网络状态变化 - window.addEventListener('online', loadData); -}); - -// 加载数据函数 -async function loadData() { - try { - showLoading(); - - // 调用百度实时热搜API - const response = await fetch('https://60s.api.shumengya.top/v2/baidu/realtime'); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - renderHotList(data.data); - updateTime(); - hideLoading(); - } else { - throw new Error(data.message || '数据格式错误'); - } - - } catch (error) { - console.error('加载数据失败:', error); - showError(); - } -} - -// 渲染热搜列表 -function renderHotList(hotData) { - if (!hotData || !Array.isArray(hotData)) { - showError(); - return; - } - - const listHTML = hotData.map((item, index) => { - const rank = index + 1; - const rankClass = rank <= 3 ? (rank === 1 ? 'top1' : 'top3') : ''; - - // 处理封面图片 - const coverImg = item.pic ? - `${item.title}` : - ''; - - // 处理描述信息 - const description = item.desc || ''; - - // 处理热度值 - const hotValue = item.hot || ''; - - // 处理链接 - const linkUrl = item.url || '#'; - - return ` -
    -
    ${rank}
    - ${coverImg} -
    -
    -

    ${item.title || '无标题'}

    -
    - ${description ? `

    ${description}

    ` : ''} - -
    -
    - `; - }).join(''); - - hotListElement.innerHTML = listHTML; - hotListElement.style.display = 'block'; -} - -// 格式化热度值 -function formatHotValue(value) { - if (!value) return ''; - - // 如果是数字,进行格式化 - if (typeof value === 'number') { - if (value >= 10000) { - return (value / 10000).toFixed(1) + '万'; - } - return value.toString(); - } - - // 如果是字符串,直接返回 - return value.toString(); -} - -// 打开链接 -function openLink(url) { - if (url && url !== '#') { - window.open(url, '_blank'); - } -} - -// 显示加载状态 -function showLoading() { - loadingElement.style.display = 'block'; - errorElement.style.display = 'none'; - hotListElement.style.display = 'none'; -} - -// 隐藏加载状态 -function hideLoading() { - loadingElement.style.display = 'none'; -} - -// 显示错误信息 -function showError() { - loadingElement.style.display = 'none'; - errorElement.style.display = 'block'; - hotListElement.style.display = 'none'; -} - -// 更新时间显示 -function updateTime() { - const now = new Date(); - const timeString = now.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit' - }); - updateTimeElement.textContent = `最后更新时间: ${timeString}`; -} - -// 重试加载数据 -function retryLoad() { - loadData(); -} - -// 页面滚动优化 -let ticking = false; - -function updateScrollPosition() { - // 可以在这里添加滚动相关的优化逻辑 - ticking = false; -} - -window.addEventListener('scroll', function() { - if (!ticking) { - requestAnimationFrame(updateScrollPosition); - ticking = true; - } -}); - -// 错误处理和日志记录 -window.addEventListener('error', function(e) { - console.error('页面错误:', e.error); -}); - -window.addEventListener('unhandledrejection', function(e) { - console.error('未处理的Promise拒绝:', e.reason); -}); - -// 性能监控 -if ('performance' in window) { - window.addEventListener('load', function() { - setTimeout(function() { - const perfData = performance.timing; - const loadTime = perfData.loadEventEnd - perfData.navigationStart; - console.log('页面加载时间:', loadTime + 'ms'); - }, 0); - }); -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/styles.css b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/styles.css deleted file mode 100755 index ace4270b..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/styles.css +++ /dev/null @@ -1,371 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: #2c3e50; - overflow-x: hidden; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 16px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - text-align: center; - padding: 24px 0; - border-bottom: 2px solid #a8e6cf; - margin-bottom: 24px; -} - -.title { - font-size: 28px; - font-weight: 700; - color: #27ae60; - margin-bottom: 8px; - text-shadow: 0 2px 4px rgba(39, 174, 96, 0.1); -} - -.subtitle { - font-size: 14px; - color: #7f8c8d; - font-weight: 400; -} - -/* 主内容区域 */ -.main-content { - flex: 1; - position: relative; -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 60px 20px; - color: #27ae60; -} - -.loading-spinner { - width: 40px; - height: 40px; - border: 3px solid #a8e6cf; - border-top: 3px solid #27ae60; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 16px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 错误信息 */ -.error-message { - text-align: center; - padding: 40px 20px; - color: #e74c3c; -} - -.retry-btn { - background: #27ae60; - color: white; - border: none; - padding: 10px 20px; - border-radius: 20px; - cursor: pointer; - font-size: 14px; - margin-top: 16px; - transition: background 0.3s ease; -} - -.retry-btn:hover { - background: #219a52; -} - -/* 热搜列表 */ -.hot-list { - display: grid; - gap: 16px; -} - -.hot-item { - background: #ffffff; - border: 1px solid #e8f5e8; - border-radius: 12px; - padding: 16px; - transition: all 0.3s ease; - box-shadow: 0 2px 8px rgba(39, 174, 96, 0.08); - position: relative; - overflow: hidden; - display: flex; - gap: 12px; - cursor: pointer; -} - -.hot-item:hover { - transform: translateY(-2px); - box-shadow: 0 4px 16px rgba(39, 174, 96, 0.15); - border-color: #a8e6cf; -} - -.hot-item::before { - content: ''; - position: absolute; - left: 0; - top: 0; - width: 4px; - height: 100%; - background: linear-gradient(to bottom, #27ae60, #a8e6cf); -} - -/* 排名样式 */ -.rank { - background: linear-gradient(135deg, #27ae60, #2ecc71); - color: white; - width: 32px; - height: 32px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-weight: 700; - font-size: 14px; - flex-shrink: 0; - margin-top: 4px; -} - -.rank.top3 { - background: linear-gradient(135deg, #f39c12, #e67e22); -} - -.rank.top1 { - background: linear-gradient(135deg, #e74c3c, #c0392b); -} - -/* 封面图片 */ -.item-cover { - width: 80px; - height: 60px; - border-radius: 8px; - object-fit: cover; - flex-shrink: 0; - border: 1px solid #e8f5e8; -} - -/* 内容区域 */ -.item-content { - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; - min-height: 60px; -} - -.item-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - margin-bottom: 8px; -} - -.item-title { - font-size: 16px; - font-weight: 600; - color: #2c3e50; - line-height: 1.4; - margin-bottom: 4px; - transition: color 0.3s ease; - flex: 1; -} - -.item-title:hover { - color: #27ae60; -} - -.item-desc { - font-size: 13px; - color: #7f8c8d; - line-height: 1.3; - margin-bottom: 8px; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.item-footer { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; -} - -.item-score { - font-size: 14px; - color: #27ae60; - font-weight: 600; -} - -.item-type { - display: flex; - align-items: center; - gap: 4px; -} - -.type-icon { - width: 16px; - height: 16px; - object-fit: contain; -} - -.type-text { - font-size: 12px; - padding: 2px 8px; - border-radius: 10px; - font-weight: 500; -} - -.type-hot { - background: #ffe6e6; - color: #e74c3c; -} - -.type-new { - background: #e6f3ff; - color: #3498db; -} - -.type-default { - background: #f8f9fa; - color: #6c757d; -} - -/* 底部 */ -.footer { - text-align: center; - padding: 24px 0; - border-top: 1px solid #e8f5e8; - margin-top: 32px; -} - -.update-time { - font-size: 12px; - color: #95a5a6; -} - -/* 手机端优化 (默认) */ -@media (max-width: 768px) { - .container { - padding: 0 12px; - } - - .header { - padding: 20px 0; - } - - .title { - font-size: 24px; - } - - .subtitle { - font-size: 13px; - } - - .hot-item { - padding: 14px; - gap: 10px; - } - - .item-cover { - width: 60px; - height: 45px; - } - - .item-title { - font-size: 15px; - } - - .item-desc { - font-size: 12px; - } - - .rank { - width: 28px; - height: 28px; - font-size: 13px; - } -} - -/* 平板端适配 */ -@media (min-width: 769px) and (max-width: 1024px) { - .container { - padding: 0 24px; - } - - .hot-list { - grid-template-columns: repeat(1, 1fr); - gap: 18px; - } - - .title { - font-size: 32px; - } - - .hot-item { - padding: 18px; - } -} - -/* 电脑端适配 */ -@media (min-width: 1025px) { - .container { - padding: 0 32px; - } - - .hot-list { - grid-template-columns: repeat(1, 1fr); - gap: 20px; - } - - .title { - font-size: 36px; - } - - .hot-item { - padding: 20px; - gap: 16px; - } - - .item-cover { - width: 100px; - height: 75px; - } - - .item-title { - font-size: 17px; - } - - .item-desc { - font-size: 14px; - } -} - -/* 大屏幕优化 */ -@media (min-width: 1400px) { - .hot-list { - grid-template-columns: repeat(2, 1fr); - gap: 24px; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/返回接口.json deleted file mode 100755 index cb3330c3..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/返回接口.json +++ /dev/null @@ -1,606 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "rank": 1, - "title": "102岁老兵ICU看阅兵后安详离世", - "desc": "", - "score": "7807952", - "score_desc": "780.8w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/e190dea8327f8295c8a5883878fe6d14", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=102%E5%B2%81%E8%80%81%E5%85%B5ICU%E7%9C%8B%E9%98%85%E5%85%B5%E5%90%8E%E5%AE%89%E8%AF%A6%E7%A6%BB%E4%B8%96&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 2, - "title": "看阅兵明白了耿爽联合国发言含金量", - "desc": "", - "score": "7714187", - "score_desc": "771.42w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/83340b647c7a2f569c0a03482d5b40f1", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E7%9C%8B%E9%98%85%E5%85%B5%E6%98%8E%E7%99%BD%E4%BA%86%E8%80%BF%E7%88%BD%E8%81%94%E5%90%88%E5%9B%BD%E5%8F%91%E8%A8%80%E5%90%AB%E9%87%91%E9%87%8F&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 3, - "title": "80秒带你回顾阅兵“高燃瞬间”", - "desc": "", - "score": "7616477", - "score_desc": "761.65w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/a64eb808789c7bae99eb3e0f98a20621", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=80%E7%A7%92%E5%B8%A6%E4%BD%A0%E5%9B%9E%E9%A1%BE%E9%98%85%E5%85%B5%E2%80%9C%E9%AB%98%E7%87%83%E7%9E%AC%E9%97%B4%E2%80%9D&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 4, - "title": "新华社认证的帅兵哥已婚", - "desc": "", - "score": "7522472", - "score_desc": "752.25w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/493dd01d2abf915809eb1387e5b8a026", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=%E6%96%B0%E5%8D%8E%E7%A4%BE%E8%AE%A4%E8%AF%81%E7%9A%84%E5%B8%85%E5%85%B5%E5%93%A5%E5%B7%B2%E5%A9%9A&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 5, - "title": "普京记者会身后的大红灯笼亮了", - "desc": "", - "score": "7426902", - "score_desc": "742.69w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/1e895a56da47054e111ce225b1efd58f", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E6%99%AE%E4%BA%AC%E8%AE%B0%E8%80%85%E4%BC%9A%E8%BA%AB%E5%90%8E%E7%9A%84%E5%A4%A7%E7%BA%A2%E7%81%AF%E7%AC%BC%E4%BA%AE%E4%BA%86&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 6, - "title": "中国网警:烽火烬处 赓续前行", - "desc": "", - "score": "7332067", - "score_desc": "733.21w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/0d872743f2cfabc8fd9ee1da970a5fed", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E7%BD%91%E8%AD%A6%EF%BC%9A%E7%83%BD%E7%81%AB%E7%83%AC%E5%A4%84+%E8%B5%93%E7%BB%AD%E5%89%8D%E8%A1%8C&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 7, - "title": "“呼叫81192!” 这一刻含泪量太高", - "desc": "", - "score": "7237296", - "score_desc": "723.73w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/552c202f87db2219d6e150a39976bad7", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=%E2%80%9C%E5%91%BC%E5%8F%AB81192%EF%BC%81%E2%80%9D+%E8%BF%99%E4%B8%80%E5%88%BB%E5%90%AB%E6%B3%AA%E9%87%8F%E5%A4%AA%E9%AB%98&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 8, - "title": "天津和平鸽归巢主人激动吹哨迎接", - "desc": "", - "score": "7139286", - "score_desc": "713.93w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/1c5dfd83c55b6482d1307f310d5642a7", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E5%A4%A9%E6%B4%A5%E5%92%8C%E5%B9%B3%E9%B8%BD%E5%BD%92%E5%B7%A2%E4%B8%BB%E4%BA%BA%E6%BF%80%E5%8A%A8%E5%90%B9%E5%93%A8%E8%BF%8E%E6%8E%A5&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 9, - "title": "中国排面给全世界亿点点震撼", - "desc": "", - "score": "7042854", - "score_desc": "704.29w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/986b69bb82a32bbd72f4c90281ece503", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%8E%92%E9%9D%A2%E7%BB%99%E5%85%A8%E4%B8%96%E7%95%8C%E4%BA%BF%E7%82%B9%E7%82%B9%E9%9C%87%E6%92%BC&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 10, - "title": "8万只气球缘何直径都是26厘米左右", - "desc": "", - "score": "6943236", - "score_desc": "694.32w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/783293899ac972283b13501deb5772fa", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=8%E4%B8%87%E5%8F%AA%E6%B0%94%E7%90%83%E7%BC%98%E4%BD%95%E7%9B%B4%E5%BE%84%E9%83%BD%E6%98%AF26%E5%8E%98%E7%B1%B3%E5%B7%A6%E5%8F%B3&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 11, - "title": "江苏足协辟谣“苏超”要改名", - "desc": "近日,有部分自媒体称“苏超”已改名,对此,江苏省足协回应:“苏超”没有改名,也没有想过要改名。", - "score": "6853163", - "score_desc": "685.32w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/fe16124a5cd018feee2e941d05850e00", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E6%B1%9F%E8%8B%8F%E8%B6%B3%E5%8D%8F%E8%BE%9F%E8%B0%A3%E2%80%9C%E8%8B%8F%E8%B6%85%E2%80%9D%E8%A6%81%E6%94%B9%E5%90%8D&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 12, - "title": "金正恩只回了韩议长一个字", - "desc": "", - "score": "6760236", - "score_desc": "676.02w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/68824cd0db12d3d6b71f6d79dc9cd1e4", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E9%87%91%E6%AD%A3%E6%81%A9%E5%8F%AA%E5%9B%9E%E4%BA%86%E9%9F%A9%E8%AE%AE%E9%95%BF%E4%B8%80%E4%B8%AA%E5%AD%97&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 13, - "title": "特朗普称看了九三阅兵:很精彩很震撼", - "desc": "", - "score": "6656922", - "score_desc": "665.69w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/bb902e423148eb1e83e78955f2eb9adb", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E7%89%B9%E6%9C%97%E6%99%AE%E7%A7%B0%E7%9C%8B%E4%BA%86%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%EF%BC%9A%E5%BE%88%E7%B2%BE%E5%BD%A9%E5%BE%88%E9%9C%87%E6%92%BC&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 14, - "title": "韩国高铁站直播九三阅兵", - "desc": "", - "score": "6566970", - "score_desc": "656.7w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/b68cb01b4b20989cea82c78c9fe39c3b", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E9%9F%A9%E5%9B%BD%E9%AB%98%E9%93%81%E7%AB%99%E7%9B%B4%E6%92%AD%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 15, - "title": "在中国的加沙人看阅兵时落泪", - "desc": "", - "score": "6476621", - "score_desc": "647.66w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f16f082786ac14ea20dc709c527dec4b", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E5%9C%A8%E4%B8%AD%E5%9B%BD%E7%9A%84%E5%8A%A0%E6%B2%99%E4%BA%BA%E7%9C%8B%E9%98%85%E5%85%B5%E6%97%B6%E8%90%BD%E6%B3%AA&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 16, - "title": "专家:东风-61出现改变命名规则", - "desc": "", - "score": "6376137", - "score_desc": "637.61w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/66c1c659e7b1a37732b2735253716d60", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E4%B8%93%E5%AE%B6%EF%BC%9A%E4%B8%9C%E9%A3%8E-61%E5%87%BA%E7%8E%B0%E6%94%B9%E5%8F%98%E5%91%BD%E5%90%8D%E8%A7%84%E5%88%99&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 17, - "title": "军嫂盯着徒步方队找丈夫迷糊了", - "desc": "", - "score": "6274961", - "score_desc": "627.5w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/90ac62b9f3b3365dc7fed40c62259a9f", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E5%86%9B%E5%AB%82%E7%9B%AF%E7%9D%80%E5%BE%92%E6%AD%A5%E6%96%B9%E9%98%9F%E6%89%BE%E4%B8%88%E5%A4%AB%E8%BF%B7%E7%B3%8A%E4%BA%86&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 18, - "title": "普京调侃佩斯科夫:懒虫 不想工作", - "desc": "", - "score": "6180590", - "score_desc": "618.06w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/8e9fae0b3a1b23049cfdb9323d6a1efe", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E6%99%AE%E4%BA%AC%E8%B0%83%E4%BE%83%E4%BD%A9%E6%96%AF%E7%A7%91%E5%A4%AB%EF%BC%9A%E6%87%92%E8%99%AB+%E4%B8%8D%E6%83%B3%E5%B7%A5%E4%BD%9C&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 19, - "title": "原陆军第31集团军军长王昭堃逝世", - "desc": "", - "score": "6089180", - "score_desc": "608.92w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/778f1aa16cdfc4db09926956ae5b5741", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E5%8E%9F%E9%99%86%E5%86%9B%E7%AC%AC31%E9%9B%86%E5%9B%A2%E5%86%9B%E5%86%9B%E9%95%BF%E7%8E%8B%E6%98%AD%E5%A0%83%E9%80%9D%E4%B8%96&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 20, - "title": "“防霸凌”儿童指纹水杯被吐槽费妈", - "desc": "", - "score": "5986581", - "score_desc": "598.66w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/c590f4412c1aa6904b65a94cba7de275", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E2%80%9C%E9%98%B2%E9%9C%B8%E5%87%8C%E2%80%9D%E5%84%BF%E7%AB%A5%E6%8C%87%E7%BA%B9%E6%B0%B4%E6%9D%AF%E8%A2%AB%E5%90%90%E6%A7%BD%E8%B4%B9%E5%A6%88&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 21, - "title": "特朗普下令重振美国军队", - "desc": "", - "score": "5902417", - "score_desc": "590.24w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/de99b4697f6d926890dc31d686c1222c", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E7%89%B9%E6%9C%97%E6%99%AE%E4%B8%8B%E4%BB%A4%E9%87%8D%E6%8C%AF%E7%BE%8E%E5%9B%BD%E5%86%9B%E9%98%9F&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 22, - "title": "间谍张某某死缓:出轨外国女官员生子", - "desc": "", - "score": "5790606", - "score_desc": "579.06w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f93c1366d41c7cfbb2383dcb17449c28", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E9%97%B4%E8%B0%8D%E5%BC%A0%E6%9F%90%E6%9F%90%E6%AD%BB%E7%BC%93%EF%BC%9A%E5%87%BA%E8%BD%A8%E5%A4%96%E5%9B%BD%E5%A5%B3%E5%AE%98%E5%91%98%E7%94%9F%E5%AD%90&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 23, - "title": "5万余人观礼离场后干干净净", - "desc": "", - "score": "5717616", - "score_desc": "571.76w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/53c6b971cef08daf3104bb5133b4b6ed", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=5%E4%B8%87%E4%BD%99%E4%BA%BA%E8%A7%82%E7%A4%BC%E7%A6%BB%E5%9C%BA%E5%90%8E%E5%B9%B2%E5%B9%B2%E5%87%80%E5%87%80&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 24, - "title": "普京乘机回国 王毅送行", - "desc": "", - "score": "5607811", - "score_desc": "560.78w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/5f7afddd2e0a570573b245b6f31a1338", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=%E6%99%AE%E4%BA%AC%E4%B9%98%E6%9C%BA%E5%9B%9E%E5%9B%BD+%E7%8E%8B%E6%AF%85%E9%80%81%E8%A1%8C&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 25, - "title": "刘老庄连战旗为何多了一个点", - "desc": "", - "score": "5513446", - "score_desc": "551.34w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/7084449234aed77c74438ca263fdcd58", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=%E5%88%98%E8%80%81%E5%BA%84%E8%BF%9E%E6%88%98%E6%97%97%E4%B8%BA%E4%BD%95%E5%A4%9A%E4%BA%86%E4%B8%80%E4%B8%AA%E7%82%B9&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 26, - "title": "迎面感受东风-61东风-5C的视觉冲击", - "desc": "", - "score": "5426660", - "score_desc": "542.67w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/40210a63cf69ddbbedbe59a19730e374", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E8%BF%8E%E9%9D%A2%E6%84%9F%E5%8F%97%E4%B8%9C%E9%A3%8E-61%E4%B8%9C%E9%A3%8E-5C%E7%9A%84%E8%A7%86%E8%A7%89%E5%86%B2%E5%87%BB&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 27, - "title": "阅兵当天的北京处处都有追飞机的人", - "desc": "", - "score": "5336487", - "score_desc": "533.65w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/1513230ae41ba37f680dccbc526b7145", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E9%98%85%E5%85%B5%E5%BD%93%E5%A4%A9%E7%9A%84%E5%8C%97%E4%BA%AC%E5%A4%84%E5%A4%84%E9%83%BD%E6%9C%89%E8%BF%BD%E9%A3%9E%E6%9C%BA%E7%9A%84%E4%BA%BA&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 28, - "title": "歼-35大片来了", - "desc": "", - "score": "5240364", - "score_desc": "524.04w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/017c3b52514fb3ae83405da1da5fc350", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E6%AD%BC-35%E5%A4%A7%E7%89%87%E6%9D%A5%E4%BA%86&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 29, - "title": "普京透露与特朗普“车内密谈”细节", - "desc": "", - "score": "5123571", - "score_desc": "512.36w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/5548e90353e4696a1116ffc0e65e086d", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E6%99%AE%E4%BA%AC%E9%80%8F%E9%9C%B2%E4%B8%8E%E7%89%B9%E6%9C%97%E6%99%AE%E2%80%9C%E8%BD%A6%E5%86%85%E5%AF%86%E8%B0%88%E2%80%9D%E7%BB%86%E8%8A%82&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 30, - "title": "和平鸽从天津到北京出差参加阅兵", - "desc": "", - "score": "5037077", - "score_desc": "503.71w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f4558c31275119cfab564cadeddf6f50", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E5%92%8C%E5%B9%B3%E9%B8%BD%E4%BB%8E%E5%A4%A9%E6%B4%A5%E5%88%B0%E5%8C%97%E4%BA%AC%E5%87%BA%E5%B7%AE%E5%8F%82%E5%8A%A0%E9%98%85%E5%85%B5&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 31, - "title": "王毅送中国跑鞋 匈牙利外长爱不释手", - "desc": "", - "score": "4950481", - "score_desc": "495.05w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/95df9511f4c0951f823f387f3286c029", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E7%8E%8B%E6%AF%85%E9%80%81%E4%B8%AD%E5%9B%BD%E8%B7%91%E9%9E%8B+%E5%8C%88%E7%89%99%E5%88%A9%E5%A4%96%E9%95%BF%E7%88%B1%E4%B8%8D%E9%87%8A%E6%89%8B&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 32, - "title": "郑钦文晒东风5C帅照", - "desc": "", - "score": "4841678", - "score_desc": "484.17w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/5e2fec1c090ce966a2dd89071342d3e9", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E9%83%91%E9%92%A6%E6%96%87%E6%99%92%E4%B8%9C%E9%A3%8E5C%E5%B8%85%E7%85%A7&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 33, - "title": "阅兵当天 北京街头成为别样观礼台", - "desc": "", - "score": "4760831", - "score_desc": "476.08w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/a6495a07da318dc9644f77de370b8035", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E9%98%85%E5%85%B5%E5%BD%93%E5%A4%A9+%E5%8C%97%E4%BA%AC%E8%A1%97%E5%A4%B4%E6%88%90%E4%B8%BA%E5%88%AB%E6%A0%B7%E8%A7%82%E7%A4%BC%E5%8F%B0&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 34, - "title": "华春莹与记者互动:我的心情和你一样", - "desc": "", - "score": "4651512", - "score_desc": "465.15w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/4377037f24b931479efc20e2a7b87776", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E5%8D%8E%E6%98%A5%E8%8E%B9%E4%B8%8E%E8%AE%B0%E8%80%85%E4%BA%92%E5%8A%A8%EF%BC%9A%E6%88%91%E7%9A%84%E5%BF%83%E6%83%85%E5%92%8C%E4%BD%A0%E4%B8%80%E6%A0%B7&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 35, - "title": "父亲称女民兵方队领队是全家的骄傲", - "desc": "", - "score": "4566469", - "score_desc": "456.65w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/79b1620e703b1e73fd5db686d6314ea0", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E7%88%B6%E4%BA%B2%E7%A7%B0%E5%A5%B3%E6%B0%91%E5%85%B5%E6%96%B9%E9%98%9F%E9%A2%86%E9%98%9F%E6%98%AF%E5%85%A8%E5%AE%B6%E7%9A%84%E9%AA%84%E5%82%B2&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 36, - "title": "宝宝出生恰逢阅兵 家人取名袁安阅", - "desc": "", - "score": "4470561", - "score_desc": "447.06w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/a5063fd737daf1da7a969e36ab672ed8", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E5%AE%9D%E5%AE%9D%E5%87%BA%E7%94%9F%E6%81%B0%E9%80%A2%E9%98%85%E5%85%B5+%E5%AE%B6%E4%BA%BA%E5%8F%96%E5%90%8D%E8%A2%81%E5%AE%89%E9%98%85&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 37, - "title": "特朗普承认观看中国阅兵", - "desc": "", - "score": "4353451", - "score_desc": "435.35w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/e7c27a7640bc0f9d25dcd7ad79026ce7", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E7%89%B9%E6%9C%97%E6%99%AE%E6%89%BF%E8%AE%A4%E8%A7%82%E7%9C%8B%E4%B8%AD%E5%9B%BD%E9%98%85%E5%85%B5&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 38, - "title": "一地官宣:3孩家庭购房补贴20万元", - "desc": "", - "score": "4290101", - "score_desc": "429.01w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/507444a742944d2ed619b480fdab147e", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%B8%80%E5%9C%B0%E5%AE%98%E5%AE%A3%EF%BC%9A3%E5%AD%A9%E5%AE%B6%E5%BA%AD%E8%B4%AD%E6%88%BF%E8%A1%A5%E8%B4%B420%E4%B8%87%E5%85%83&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 39, - "title": "OpenAI启动员工百亿美元售股", - "desc": "", - "score": "4172580", - "score_desc": "417.26w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/fc06e36007c4b957bee693b9abe64693", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=OpenAI%E5%90%AF%E5%8A%A8%E5%91%98%E5%B7%A5%E7%99%BE%E4%BA%BF%E7%BE%8E%E5%85%83%E5%94%AE%E8%82%A1&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 40, - "title": "想入军迷圈的 现在正是好时候", - "desc": "", - "score": "4098627", - "score_desc": "409.86w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/d5bde24cc4eed187d500f3e7a9d73f2d", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E6%83%B3%E5%85%A5%E5%86%9B%E8%BF%B7%E5%9C%88%E7%9A%84+%E7%8E%B0%E5%9C%A8%E6%AD%A3%E6%98%AF%E5%A5%BD%E6%97%B6%E5%80%99&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 41, - "title": "九三阅兵台湾线上播放超500万", - "desc": "", - "score": "3999782", - "score_desc": "399.98w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/ebfee25839294c24ca24af788fbd92bd", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%8F%B0%E6%B9%BE%E7%BA%BF%E4%B8%8A%E6%92%AD%E6%94%BE%E8%B6%85500%E4%B8%87&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 42, - "title": "信鸽协会回应市民救助落水和平鸽", - "desc": "", - "score": "3886482", - "score_desc": "388.65w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/dc5ce78481f36774922add0eb7076ec7", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%BF%A1%E9%B8%BD%E5%8D%8F%E4%BC%9A%E5%9B%9E%E5%BA%94%E5%B8%82%E6%B0%91%E6%95%91%E5%8A%A9%E8%90%BD%E6%B0%B4%E5%92%8C%E5%B9%B3%E9%B8%BD&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 43, - "title": "台退将看阅兵新装备直呼自己是军盲", - "desc": "", - "score": "3794294", - "score_desc": "379.43w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/686bb8c544ec3d0bc9f01f7ccd31195c", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E5%8F%B0%E9%80%80%E5%B0%86%E7%9C%8B%E9%98%85%E5%85%B5%E6%96%B0%E8%A3%85%E5%A4%87%E7%9B%B4%E5%91%BC%E8%87%AA%E5%B7%B1%E6%98%AF%E5%86%9B%E7%9B%B2&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 44, - "title": "多国来华领导人接连发声", - "desc": "", - "score": "3679787", - "score_desc": "367.98w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/a7f9ac9aaeb54422c70870ac9ab36d09", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E5%A4%9A%E5%9B%BD%E6%9D%A5%E5%8D%8E%E9%A2%86%E5%AF%BC%E4%BA%BA%E6%8E%A5%E8%BF%9E%E5%8F%91%E5%A3%B0&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 45, - "title": "河南佛教协会:释永信枉费僧众信任", - "desc": "", - "score": "3589427", - "score_desc": "358.94w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/279b2b9632b9d7776a62fccefbc058db", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E6%B2%B3%E5%8D%97%E4%BD%9B%E6%95%99%E5%8D%8F%E4%BC%9A%EF%BC%9A%E9%87%8A%E6%B0%B8%E4%BF%A1%E6%9E%89%E8%B4%B9%E5%83%A7%E4%BC%97%E4%BF%A1%E4%BB%BB&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 46, - "title": "揭秘阅兵地铁专列:143趟车接送2万人", - "desc": "", - "score": "3501916", - "score_desc": "350.19w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/711c2769ad7f6071171e7c11908c9f7a", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=%E6%8F%AD%E7%A7%98%E9%98%85%E5%85%B5%E5%9C%B0%E9%93%81%E4%B8%93%E5%88%97%EF%BC%9A143%E8%B6%9F%E8%BD%A6%E6%8E%A5%E9%80%812%E4%B8%87%E4%BA%BA&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 47, - "title": "苑举正观礼听到《黄河大合唱》落泪", - "desc": "", - "score": "3431345", - "score_desc": "343.13w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/ea02d87734137d71f4a1529a5cb864c7", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E8%8B%91%E4%B8%BE%E6%AD%A3%E8%A7%82%E7%A4%BC%E5%90%AC%E5%88%B0%E3%80%8A%E9%BB%84%E6%B2%B3%E5%A4%A7%E5%90%88%E5%94%B1%E3%80%8B%E8%90%BD%E6%B3%AA&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 48, - "title": "九三阅兵解锁了这些“首次”", - "desc": "", - "score": "3339123", - "score_desc": "333.91w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/35812fb7bcf6ff0d71f52f60fb9055fa", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E8%A7%A3%E9%94%81%E4%BA%86%E8%BF%99%E4%BA%9B%E2%80%9C%E9%A6%96%E6%AC%A1%E2%80%9D&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 49, - "title": "中国首起反规避调查", - "desc": "", - "score": "3210675", - "score_desc": "321.07w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/fa9ce1dd50ddb58eab40b7de920a0d79", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E9%A6%96%E8%B5%B7%E5%8F%8D%E8%A7%84%E9%81%BF%E8%B0%83%E6%9F%A5&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 50, - "title": "王楚钦:被祖国的强大深深触动", - "desc": "", - "score": "3147784", - "score_desc": "314.78w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/d8ae151e1eefdec0449a52574f58ee51", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E7%8E%8B%E6%A5%9A%E9%92%A6%EF%BC%9A%E8%A2%AB%E7%A5%96%E5%9B%BD%E7%9A%84%E5%BC%BA%E5%A4%A7%E6%B7%B1%E6%B7%B1%E8%A7%A6%E5%8A%A8&sa=fyb_news&rsv_dl=fyb_news" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/background.css deleted file mode 100755 index 8e7c4e10..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/background.css +++ /dev/null @@ -1,242 +0,0 @@ -/* 页面主背景 */ -body { - background: linear-gradient(135deg, #f9fbe7 0%, #f1f8e9 25%, #e8f5e8 50%, #dcedc8 75%, #c5e1a5 100%); - background-attachment: fixed; - position: relative; -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(139, 195, 74, 0.06) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(205, 220, 57, 0.06) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(212, 225, 87, 0.08) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 容器背景 */ -.container { - background: rgba(255, 255, 255, 0.75); - backdrop-filter: blur(10px); - border-radius: 16px; - box-shadow: 0 8px 32px rgba(139, 195, 74, 0.12); - margin-top: 20px; - margin-bottom: 20px; - border: 1px solid rgba(241, 248, 233, 0.5); -} - -/* 头部背景 */ -.header { - background: linear-gradient(135deg, rgba(139, 195, 74, 0.08) 0%, rgba(205, 220, 57, 0.08) 100%); - border-radius: 16px 16px 0 0; - position: relative; - overflow: hidden; -} - -.header::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 30% 20%, rgba(139, 195, 74, 0.12) 0%, transparent 40%), - radial-gradient(circle at 70% 80%, rgba(205, 220, 57, 0.1) 0%, transparent 40%); - pointer-events: none; -} - -/* 电视剧项目背景 */ -.tv-item { - background: rgba(255, 255, 255, 0.92); - backdrop-filter: blur(8px); - position: relative; - overflow: hidden; -} - -.tv-item::after { - content: ''; - position: absolute; - top: 0; - right: 0; - width: 60px; - height: 100%; - background: linear-gradient(90deg, transparent 0%, rgba(139, 195, 74, 0.03) 100%); - pointer-events: none; -} - -/* 前三名特殊背景效果 */ -.tv-item:nth-child(1) { - background: linear-gradient(135deg, rgba(244, 67, 54, 0.06) 0%, rgba(255, 255, 255, 0.96) 100%); -} - -.tv-item:nth-child(2) { - background: linear-gradient(135deg, rgba(255, 152, 0, 0.06) 0%, rgba(255, 255, 255, 0.96) 100%); -} - -.tv-item:nth-child(3) { - background: linear-gradient(135deg, rgba(255, 193, 7, 0.06) 0%, rgba(255, 255, 255, 0.96) 100%); -} - -/* 加载状态背景 */ -.loading { - background: rgba(255, 255, 255, 0.85); - backdrop-filter: blur(8px); - border-radius: 12px; - margin: 20px; - border: 1px solid rgba(241, 248, 233, 0.3); -} - -/* 错误信息背景 */ -.error-message { - background: linear-gradient(135deg, rgba(231, 76, 60, 0.06) 0%, rgba(255, 255, 255, 0.92) 100%); - backdrop-filter: blur(8px); - border-radius: 12px; - border: 1px solid rgba(231, 76, 60, 0.1); - margin: 20px; -} - -/* 底部背景 */ -.footer { - background: linear-gradient(135deg, rgba(139, 195, 74, 0.04) 0%, rgba(205, 220, 57, 0.04) 100%); - border-radius: 0 0 16px 16px; - position: relative; -} - -.footer::before { - content: ''; - position: absolute; - top: 0; - left: 50%; - transform: translateX(-50%); - width: 60px; - height: 1px; - background: linear-gradient(90deg, transparent 0%, rgba(139, 195, 74, 0.4) 50%, transparent 100%); -} - -/* 封面图片背景效果 */ -.item-cover { - position: relative; - overflow: hidden; -} - -.item-cover::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: linear-gradient(45deg, rgba(139, 195, 74, 0.05) 0%, transparent 50%); - pointer-events: none; - opacity: 0; - transition: opacity 0.3s ease; -} - -.tv-item:hover .item-cover::before { - opacity: 1; -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - .container { - margin-top: 10px; - margin-bottom: 10px; - border-radius: 12px; - } - - .header { - border-radius: 12px 12px 0 0; - } - - .footer { - border-radius: 0 0 12px 12px; - } - - body::before { - background-image: - radial-gradient(circle at 20% 80%, rgba(139, 195, 74, 0.04) 0%, transparent 40%), - radial-gradient(circle at 80% 20%, rgba(205, 220, 57, 0.04) 0%, transparent 40%); - } -} - -@media (min-width: 1025px) { - .container { - margin-top: 40px; - margin-bottom: 40px; - } - - body::before { - background-image: - radial-gradient(circle at 15% 85%, rgba(139, 195, 74, 0.08) 0%, transparent 60%), - radial-gradient(circle at 85% 15%, rgba(205, 220, 57, 0.08) 0%, transparent 60%), - radial-gradient(circle at 50% 50%, rgba(212, 225, 87, 0.06) 0%, transparent 70%); - } -} - -/* 动画效果 */ -@keyframes backgroundShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 悬浮时的背景变化 */ -.tv-item:hover { - background: rgba(255, 255, 255, 0.98); -} - -.tv-item:hover::after { - background: linear-gradient(90deg, transparent 0%, rgba(139, 195, 74, 0.06) 100%); -} - -/* 排名背景渐变 */ -.rank { - position: relative; - overflow: hidden; -} - -.rank::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: linear-gradient(45deg, rgba(255, 255, 255, 0.25) 0%, transparent 100%); - pointer-events: none; -} - -/* 按钮背景效果 */ -.retry-btn { - position: relative; - overflow: hidden; -} - -.retry-btn::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.3) 50%, transparent 100%); - transition: left 0.5s ease; -} - -.retry-btn:hover::before { - left: 100%; -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/index.html deleted file mode 100755 index 8b802e69..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - 百度电视剧榜单 - - - - -
    -
    -

    百度电视剧榜单

    -

    实时热门电视剧,追剧必看榜单

    -
    - -
    -
    -
    -

    正在加载电视剧榜单...

    -
    - - - - -
    - -
    -

    -
    -
    - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/script.js b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/script.js deleted file mode 100755 index 179a3369..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/script.js +++ /dev/null @@ -1,267 +0,0 @@ -// DOM元素获取 -const loadingElement = document.getElementById('loading'); -const errorElement = document.getElementById('error'); -const tvListElement = document.getElementById('tvList'); -const updateTimeElement = document.getElementById('updateTime'); - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', function() { - loadData(); - - // 每5分钟自动刷新数据 - setInterval(loadData, 5 * 60 * 1000); - - // 监听页面可见性变化,页面重新可见时刷新数据 - document.addEventListener('visibilitychange', function() { - if (!document.hidden) { - loadData(); - } - }); - - // 监听网络状态变化 - window.addEventListener('online', loadData); -}); - -// 加载数据函数 -async function loadData() { - try { - showLoading(); - - // 调用百度电视剧榜API - const response = await fetch('https://60s.api.shumengya.top/v2/baidu/teleplay'); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - renderTvList(data.data); - updateTime(); - hideLoading(); - } else { - throw new Error(data.message || '数据格式错误'); - } - - } catch (error) { - console.error('加载数据失败:', error); - showError(); - } -} - -// 渲染电视剧列表 -function renderTvList(tvData) { - if (!tvData || !Array.isArray(tvData)) { - showError(); - return; - } - - const listHTML = tvData.map((item, index) => { - const rank = item.rank || (index + 1); - const rankClass = rank <= 3 ? (rank === 1 ? 'top1' : 'top3') : ''; - - // 处理封面图片 - const coverImg = item.cover ? - `${item.title}` : - ''; - - // 处理描述信息 - const description = item.desc || ''; - - // 处理评分信息 - const score = item.score || ''; - const scoreDesc = item.score_desc || ''; - - // 处理链接 - const linkUrl = item.url || '#'; - - return ` -
    -
    ${rank}
    - ${coverImg} -
    -
    -

    ${item.title || '无标题'}

    -
    - ${description ? `

    ${description}

    ` : ''} - -
    -
    - `; - }).join(''); - - tvListElement.innerHTML = listHTML; - tvListElement.style.display = 'block'; -} - -// 格式化评分 -function formatScore(score) { - if (!score) return ''; - - // 如果是数字,进行格式化 - if (typeof score === 'number') { - if (score >= 10000) { - return (score / 10000).toFixed(1) + '万'; - } - return score.toString(); - } - - // 如果是字符串,直接返回 - return score.toString(); -} - -// 打开链接 -function openLink(url) { - if (url && url !== '#') { - window.open(url, '_blank'); - } -} - -// 显示加载状态 -function showLoading() { - loadingElement.style.display = 'block'; - errorElement.style.display = 'none'; - tvListElement.style.display = 'none'; -} - -// 隐藏加载状态 -function hideLoading() { - loadingElement.style.display = 'none'; -} - -// 显示错误信息 -function showError() { - loadingElement.style.display = 'none'; - errorElement.style.display = 'block'; - tvListElement.style.display = 'none'; -} - -// 更新时间显示 -function updateTime() { - const now = new Date(); - const timeString = now.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit' - }); - updateTimeElement.textContent = `最后更新时间: ${timeString}`; -} - -// 重试加载数据 -function retryLoad() { - loadData(); -} - -// 页面滚动优化 -let ticking = false; - -function updateScrollPosition() { - // 可以在这里添加滚动相关的优化逻辑 - ticking = false; -} - -window.addEventListener('scroll', function() { - if (!ticking) { - requestAnimationFrame(updateScrollPosition); - ticking = true; - } -}); - -// 错误处理和日志记录 -window.addEventListener('error', function(e) { - console.error('页面错误:', e.error); -}); - -window.addEventListener('unhandledrejection', function(e) { - console.error('未处理的Promise拒绝:', e.reason); -}); - -// 性能监控 -if ('performance' in window) { - window.addEventListener('load', function() { - setTimeout(function() { - const perfData = performance.timing; - const loadTime = perfData.loadEventEnd - perfData.navigationStart; - console.log('页面加载时间:', loadTime + 'ms'); - }, 0); - }); -} - -// 图片懒加载优化 -function lazyLoadImages() { - const images = document.querySelectorAll('.item-cover'); - const imageObserver = new IntersectionObserver((entries, observer) => { - entries.forEach(entry => { - if (entry.isIntersecting) { - const img = entry.target; - img.src = img.dataset.src; - img.classList.remove('lazy'); - imageObserver.unobserve(img); - } - }); - }); - - images.forEach(img => imageObserver.observe(img)); -} - -// 添加键盘导航支持 -document.addEventListener('keydown', function(e) { - const items = document.querySelectorAll('.tv-item'); - const currentFocus = document.activeElement; - let currentIndex = Array.from(items).indexOf(currentFocus); - - switch(e.key) { - case 'ArrowDown': - e.preventDefault(); - currentIndex = Math.min(currentIndex + 1, items.length - 1); - items[currentIndex]?.focus(); - break; - case 'ArrowUp': - e.preventDefault(); - currentIndex = Math.max(currentIndex - 1, 0); - items[currentIndex]?.focus(); - break; - case 'Enter': - if (currentFocus && currentFocus.classList.contains('tv-item')) { - currentFocus.click(); - } - break; - } -}); - -// 使电视剧项目可聚焦 -document.addEventListener('DOMContentLoaded', function() { - const style = document.createElement('style'); - style.textContent = ` - .tv-item { - outline: none; - transition: all 0.3s ease; - } - .tv-item:focus { - transform: translateY(-2px); - box-shadow: 0 4px 16px rgba(139, 195, 74, 0.25); - border-color: #8bc34a; - } - `; - document.head.appendChild(style); - - // 为所有电视剧项目添加tabindex - setTimeout(() => { - const items = document.querySelectorAll('.tv-item'); - items.forEach((item, index) => { - item.setAttribute('tabindex', '0'); - }); - }, 100); -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/styles.css b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/styles.css deleted file mode 100755 index 04bdf8c2..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/styles.css +++ /dev/null @@ -1,378 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: #2c3e50; - overflow-x: hidden; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 16px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - text-align: center; - padding: 24px 0; - border-bottom: 2px solid #d4e157; - margin-bottom: 24px; -} - -.title { - font-size: 28px; - font-weight: 700; - background: linear-gradient(135deg, #8bc34a, #cddc39); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - margin-bottom: 8px; - text-shadow: 0 2px 4px rgba(139, 195, 74, 0.1); -} - -.subtitle { - font-size: 14px; - color: #7f8c8d; - font-weight: 400; -} - -/* 主内容区域 */ -.main-content { - flex: 1; - position: relative; -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 60px 20px; - color: #8bc34a; -} - -.loading-spinner { - width: 40px; - height: 40px; - border: 3px solid #d4e157; - border-top: 3px solid #8bc34a; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 16px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 错误信息 */ -.error-message { - text-align: center; - padding: 40px 20px; - color: #e74c3c; -} - -.retry-btn { - background: linear-gradient(135deg, #8bc34a, #cddc39); - color: white; - border: none; - padding: 10px 20px; - border-radius: 20px; - cursor: pointer; - font-size: 14px; - margin-top: 16px; - transition: all 0.3s ease; - box-shadow: 0 2px 8px rgba(139, 195, 74, 0.3); -} - -.retry-btn:hover { - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(139, 195, 74, 0.4); -} - -/* 电视剧列表 */ -.tv-list { - display: grid; - gap: 16px; -} - -.tv-item { - background: #ffffff; - border: 1px solid #f1f8e9; - border-radius: 12px; - padding: 16px; - transition: all 0.3s ease; - box-shadow: 0 2px 8px rgba(139, 195, 74, 0.08); - position: relative; - overflow: hidden; - display: flex; - gap: 12px; - cursor: pointer; -} - -.tv-item:hover { - transform: translateY(-2px); - box-shadow: 0 4px 16px rgba(139, 195, 74, 0.15); - border-color: #d4e157; -} - -.tv-item::before { - content: ''; - position: absolute; - left: 0; - top: 0; - width: 4px; - height: 100%; - background: linear-gradient(to bottom, #8bc34a, #cddc39); -} - -/* 排名样式 */ -.rank { - background: linear-gradient(135deg, #8bc34a, #cddc39); - color: white; - width: 32px; - height: 32px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-weight: 700; - font-size: 14px; - flex-shrink: 0; - margin-top: 4px; - box-shadow: 0 2px 6px rgba(139, 195, 74, 0.3); -} - -.rank.top3 { - background: linear-gradient(135deg, #ff9800, #ffc107); -} - -.rank.top1 { - background: linear-gradient(135deg, #f44336, #e91e63); -} - -/* 封面图片 */ -.item-cover { - width: 80px; - height: 100px; - border-radius: 8px; - object-fit: cover; - flex-shrink: 0; - border: 1px solid #f1f8e9; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); -} - -/* 内容区域 */ -.item-content { - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; - min-height: 100px; -} - -.item-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - margin-bottom: 8px; -} - -.item-title { - font-size: 16px; - font-weight: 600; - color: #2c3e50; - line-height: 1.4; - margin-bottom: 4px; - transition: color 0.3s ease; - flex: 1; -} - -.item-title:hover { - background: linear-gradient(135deg, #8bc34a, #cddc39); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.item-desc { - font-size: 13px; - color: #7f8c8d; - line-height: 1.3; - margin-bottom: 8px; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.item-footer { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; -} - -.item-score { - font-size: 14px; - background: linear-gradient(135deg, #8bc34a, #cddc39); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - font-weight: 600; -} - -.item-score-desc { - font-size: 12px; - color: #95a5a6; - margin-left: 4px; -} - -.item-type { - display: flex; - align-items: center; - gap: 4px; -} - -.type-text { - font-size: 12px; - padding: 2px 8px; - border-radius: 10px; - font-weight: 500; - background: linear-gradient(135deg, #f1f8e9, #e8f5e8); - color: #689f38; - border: 1px solid #d4e157; -} - -/* 底部 */ -.footer { - text-align: center; - padding: 24px 0; - border-top: 1px solid #f1f8e9; - margin-top: 32px; -} - -.update-time { - font-size: 12px; - color: #95a5a6; -} - -/* 手机端优化 (默认) */ -@media (max-width: 768px) { - .container { - padding: 0 12px; - } - - .header { - padding: 20px 0; - } - - .title { - font-size: 24px; - } - - .subtitle { - font-size: 13px; - } - - .tv-item { - padding: 14px; - gap: 10px; - } - - .item-cover { - width: 60px; - height: 80px; - } - - .item-title { - font-size: 15px; - } - - .item-desc { - font-size: 12px; - -webkit-line-clamp: 2; - } - - .rank { - width: 28px; - height: 28px; - font-size: 13px; - } -} - -/* 平板端适配 */ -@media (min-width: 769px) and (max-width: 1024px) { - .container { - padding: 0 24px; - } - - .tv-list { - grid-template-columns: repeat(1, 1fr); - gap: 18px; - } - - .title { - font-size: 32px; - } - - .tv-item { - padding: 18px; - } - - .item-cover { - width: 90px; - height: 110px; - } -} - -/* 电脑端适配 */ -@media (min-width: 1025px) { - .container { - padding: 0 32px; - } - - .tv-list { - grid-template-columns: repeat(1, 1fr); - gap: 20px; - } - - .title { - font-size: 36px; - } - - .tv-item { - padding: 20px; - gap: 16px; - } - - .item-cover { - width: 100px; - height: 130px; - } - - .item-title { - font-size: 17px; - } - - .item-desc { - font-size: 14px; - } -} - -/* 大屏幕优化 */ -@media (min-width: 1400px) { - .tv-list { - grid-template-columns: repeat(2, 1fr); - gap: 24px; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/返回接口.json deleted file mode 100755 index 14bc77ca..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/返回接口.json +++ /dev/null @@ -1,276 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "rank": 1, - "title": "子夜归", - "desc": "改编自扶华的小说《梅夫人宠夫日常》。", - "score": "511898", - "score_desc": "51.19w", - "cover": "https://gips2.baidu.com/it/u=2155452125,2802752464&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E5%AD%90%E5%A4%9C%E5%BD%92+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 2, - "title": "献鱼", - "desc": "该剧改编自扶华的小说《向师祖献上咸鱼》,由浙江东阳奔兔影业有限公司备案。主要讲述了多年前,一位高僧曾在庚辰仙府的大魔头师祖司马焦满是血腥杀戮的未来里窥见过一线生机,给他留下一枚佛珠,希望他对生灵有慈心,能将杀心归藏。后来,被“逼上梁山”的廖停雁接受挑战,两手用力直接扯断了红线木珠,依靠咸鱼的本能降服了司马焦,成为改变他的人,也成为了黎民苍生的生机。从此廖停雁开始了引导大魔头向善的任务。", - "score": "334613", - "score_desc": "33.46w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/74230ae3ec03042a352809630060ed6b", - "url": "https://www.baidu.com/s?wd=%E7%8C%AE%E9%B1%BC+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 3, - "title": "锦月如歌", - "desc": "该剧改编自千山茶客的小说《女将星》。", - "score": "261451", - "score_desc": "26.15w", - "cover": "https://gips1.baidu.com/it/u=1353858050,567139191&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E9%94%A6%E6%9C%88%E5%A6%82%E6%AD%8C+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 4, - "title": "生万物", - "desc": "天牛庙村首富之女宁绣绣出嫁当天被土匪绑架,父亲宁学祥舍不得卖地赎她,将她的妹妹嫁给她青梅竹马的恋人费文典。绣绣决绝地与父亲断绝了关系,嫁给庄户汉子封大脚,学着干农活并慢慢明白了土地对于农民的意义。受杜春林等人的革命思想的启发,她用所学的知识帮助邻居们,带领村里的妇女一起摆脱封建思想桎梏。她和乡亲们一起除匪患、抗日、拥军,在清苦但又充满传奇的二十年岁月中,绣绣最终和她父亲达成了和解,也实现了自我价值。", - "score": "246220", - "score_desc": "24.62w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/956386852c3948e1539daf2a9e8316c5", - "url": "https://www.baidu.com/s?wd=%E7%94%9F%E4%B8%87%E7%89%A9+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 5, - "title": "归队", - "desc": "故事遵循东北抗联的真实发展轨迹,由小人物视角切入,以小见大的展现了战士们“勇赴国难、自觉担当、顽强苦斗、舍生取义、团结御侮”的东北抗联精神。", - "score": "174373", - "score_desc": "17.44w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/41092aaebdbee0a4a9382c182b913f99", - "url": "https://www.baidu.com/s?wd=%E5%BD%92%E9%98%9F+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 6, - "title": "滤镜", - "desc": "一个新科技产品“滤镜手镯”让普通平凡的苏橙橙(李兰迪 饰)拥有了改变容貌的能力。苏橙橙变成大美女“苏渺”、变成女博士“方谨”、变成撕漫男“全胜唐”,让自己咸鱼翻身爽了一把的同时,帮助弱小伸张正义。与此同时,唐奇(檀健次 饰)对见义勇为的苏渺怦然心动,与志同道合的方谨惺惺相惜,对阳光帅气的全胜唐欣赏称赞。为了保住秘密,苏橙橙不得不一次次撒下弥天大谎,让唐奇一次又一次失去了爱人。唐奇在接连的打击下,眼睛的病情逐渐加重,苏橙橙愧疚心虚。终于,唐奇揭开了苏橙橙变换身份的真相,明白自己爱的只有苏橙橙。真诚炙热的心不会被外在迷惑,心意相通的二人要一起面对滤镜手镯带来的严峻挑战。为了将“千鸟集”培育为独具中国特色的高端美妆品牌,苏橙橙和唐奇携手策划了一系列新的国货美妆产品,号召大家享受“自然自信的真实美”。经历重重考验的苏橙橙最终明白,美不应该被单一固化,要用最真实的自己去面对最现实的生活,依靠努力奋斗去追逐梦想,幸福就在眼前。", - "score": "93122", - "score_desc": "9.31w", - "cover": "https://gips2.baidu.com/it/u=3795500355,4042026657&fm=3028&app=3028&f=JPEG&fmt=auto&q=75&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E6%BB%A4%E9%95%9C+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 7, - "title": "与晋长安", - "desc": "该剧改编自九鹭非香的同名小说。太晋女将军黎霜骁勇善战,她受命在一个月之内找出隐藏的奸细。某日,黎霜偶然间救下身负重伤记忆全失的男子,将其带回军营。男子恳求黎霜收留并跟随她征战。黎霜为其赐名晋安,寓意太晋长治久安。二人合力揪出奸细,却接连遭遇新任监军的蓄意为难和邻国大姚的屡屡犯境,晋安凭借自己过人的智谋与黎霜一起克服困难与险境,二人暗生情愫。晋安逐渐想起自己的真实身份竟是大姚的镇世王,而彼时战事一触即发,二人不得已刀兵相见,本就厌倦战争的二人决定联手化解家国危机,帮助百姓安居乐业。", - "score": "63645", - "score_desc": "6.36w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f9e7c5bfe847536bca743e3e397b7bff", - "url": "https://www.baidu.com/s?wd=%E4%B8%8E%E6%99%8B%E9%95%BF%E5%AE%89+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 8, - "title": "暗潮缉凶", - "desc": "", - "score": "56675", - "score_desc": "5.67w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/52c73cc7cd55674511becbabd16aca37", - "url": "https://www.baidu.com/s?wd=%E6%9A%97%E6%BD%AE%E7%BC%89%E5%87%B6+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 9, - "title": "深情眼", - "desc": "改编自耳东兔子的同名小说。年过三十的叶蒙遭遇职场不顺,辞职后带着积蓄回到家乡开启惬意的小镇生活,机缘巧合之下,她偶遇了长着一双深情眼的李靳屿,并被他的神秘和冷峻吸引。两个陌生的灵魂不断触碰,叶蒙因李靳屿的艰辛生活而心生怜爱,热情主动地给予帮助;李靳屿也在叶蒙的追求下敞开了心扉,变得自信开朗起来。他们相互温暖、相互治愈,努力经营着这段来之不易的爱情。一枚戒指的到来打破了两人之间的平静,叶蒙母亲多年前患病去世的谜团缓缓浮出水面,叶蒙不得不面对残酷的真相--母亲的离去与李靳屿家有着千丝万缕的联系。此时李靳屿内心的天平早已偏向叶漾,叶蒙给他带来了阳光,现在轮到他来帮助叶蒙解开心结。最终,两人携手揭开上一辈的纠葛,放下过往恩怨,迎接美好的明天。", - "score": "56341", - "score_desc": "5.63w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f09c4b963cd3cc3062d38e9182be750e", - "url": "https://www.baidu.com/s?wd=%E6%B7%B1%E6%83%85%E7%9C%BC+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 10, - "title": "定风波", - "desc": "《定风波》聚焦宋韵文化传承传播,围绕诗文、书画、美食、旅游、民生等主题,多维度描绘苏东坡的为官之道、志趣审美和精神世界,深入解读苏东坡的当代价值。全片共5集,每集50分钟。第一集“出川记”讲述苏东坡的成长与家风,建构其人生起始动力,探索其后来到杭州的动因;第二集“湖山记”讲述苏东坡首次为官杭州,受到湖山的滋养,实现真正的“胸有丘壑”;第三集“摩羯记”讲述苏东坡应对乌台诗案带来的种种影响,以乐观精神渡过人生的劫难;第四集“悬壶记”讲述苏东坡二度为官杭州,负责防疫,建安乐坊以及重新治理西湖;第五集“筑巢记”讲述苏东坡济苍生、度余生,保持“此心安处是吾乡”的人生态度。", - "score": "51095", - "score_desc": "5.11w", - "cover": "https://gips0.baidu.com/it/u=2177619972,3043234332&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E5%AE%9A%E9%A3%8E%E6%B3%A2+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 11, - "title": "白月梵星", - "desc": "本剧改编自星零小说《白烁上神》,讲述将军府嫡女白烁为报恩而立志修仙,寻仙途中意外搭救妖族大神梵樾,二人不打不相识,从相互利用到互生爱意、双向奔赴,纵然隔着千重困难,但爱足以打破一切限制,拥抱最真的彼此的故事。", - "score": "44201", - "score_desc": "4.42w", - "cover": "https://gips3.baidu.com/it/u=1404661215,4211295377&fm=3028&app=3028&f=JPEG&fmt=auto&q=75&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E7%99%BD%E6%9C%88%E6%A2%B5%E6%98%9F+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 12, - "title": "我在顶峰等你", - "desc": "上一世,顾雪茭曾因恋爱脑而高考失利,职场打拼多年,归来仍是底层外包人员,还首当其冲地成为了“黑心老板”蔺之华的裁员目标。顾雪茭找蔺之华理论,意外重生回到高三那年。有机会重新开局,顾雪茭吸取前世教训,痛定思痛,将学习作为人生第一要务,由恋爱脑扭转为事业脑,在爆改人生的同时,还共同成就一段双向奔赴、互为变量的甜美爱情。", - "score": "37003", - "score_desc": "3.7w", - "cover": "https://gips2.baidu.com/it/u=3240531593,2885940403&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E6%88%91%E5%9C%A8%E9%A1%B6%E5%B3%B0%E7%AD%89%E4%BD%A0+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 13, - "title": "六姊妹", - "desc": "本剧改编自豆瓣阅读连载小说《六姊妹》,作者伊北。新中国成立后,何常胜为支援社会主义建设,携家带口从扬州江都移居安徽淮南,在淮河边上扎下了根。在接下来的二十年中,何常胜连得六个女儿,却在一场车祸中告别人世。大姐何家丽和奶奶何文氏、妈妈刘美心一起承担起了家庭重担,安顿妹妹们成家立业。时代在变化,何家六姊妹也经历了婚恋、工 作、生活等命运起伏,但她们团结一心,共同面对人生的风雨,在生活的磨砺中,六姊妹们也终于明白父亲生前反复强调的“家”的意义。", - "score": "36574", - "score_desc": "3.66w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/9e517a4f66e7fb7106b6333b85f1a5c1", - "url": "https://www.baidu.com/s?wd=%E5%85%AD%E5%A7%8A%E5%A6%B9+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 14, - "title": "扫毒风暴", - "desc": "1995年,缉毒警林强峰(段奕宏 饰)为了追查毒品的线索调到了西港缉毒支队工作。走私商刘少华(秦昊 饰)因偶然的机会接触到了冰毒,毒品带来的巨大利润让他产生邪念,成为了一名制毒师。在林强峰等缉毒警的全力追查下,西港市的涉案的毒贩们一一落网,只剩刘少华在别处鼠窜,企图躲避警方追捕。 1996年,林强峰再次查没了企图东山再起的刘少华的毒品,走投无路的刘少华只能蛰伏了起来,之后刘少华企图再次制毒,被林强峰发现踪迹。1999年,刘少华终于落网。", - "score": "32911", - "score_desc": "3.29w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/d9e3d21ca332652ffe75d7176bce397f", - "url": "https://www.baidu.com/s?wd=%E6%89%AB%E6%AF%92%E9%A3%8E%E6%9A%B4+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 15, - "title": "目之所及", - "desc": "本剧改编自阅读连载小说《盲目》,作者慕遥而寻。 世纪之交,因为水利工程的蓄水要求,一座江边小城即将被淹没,人们如火如荼地进行着新城的规划建设和人口的迁徙。此时,一桩离奇的杀夫案闯入了警方的视野,嫌疑人中,一个是咬定丈夫杀了女儿的可怜女人曲桐,一个是按摩院身份模糊的盲人薛小伟, 他们相互救赎,甘愿为对方牺牲,疑点重重。警 方锲而不舍的追查,揭秘出一段尘封多年,令人唏嘘的往事。真相可能会被淹没,但终有浮出水面的一天。", - "score": "27439", - "score_desc": "2.74w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/3b731c9a9e809e7c694a8cc5c65d5a15", - "url": "https://www.baidu.com/s?wd=%E7%9B%AE%E4%B9%8B%E6%89%80%E5%8F%8A+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 16, - "title": "书卷一梦", - "desc": "柠萌影业出品,改编自千山茶客的同名小说,尚书府嫡长女蒋阮被当成一枚棋子送入宫中,爱上温文儒雅的八皇子。谁知一朝宫变,爱人登基,府上鸡犬升天,她却成为一枚弃子,被污蔑为祸国妖女。蒋阮不甘,下定决心要报仇,却在回府之时遭遇暗杀,后借助神秘黑衣人之手才逃过一劫。从危机四伏的宅院到步步惊心的朝堂,她面对的敌人越来越多她暗暗布下陷阱,却误打误撞遇到锦英王萧韶。萧韶性情冷清,却屡次出手相助于她,两人暗生情愫,渐渐结盟,萧韶的身世之谜也随之浮出水面。此后,蒋阮千方百计阻挠八皇子的夺嫡大业,却引起了萧韶的怀疑,两人结下误会八皇子开始进行疯狂的反击行动,蒋阮的处境十分危险。复仇途中,蒋阮发现自己的身世竟和萧韶的身世之谜有关,一个大锦朝隐藏多年的秘密浮出水面此时,南疆人蠢蠢欲动,欲与宣离结为同盟。彼时,蒋阮小时候被继母种下的毒发作,萧韶带她四处求医,生死一线的时候,蒋阮得知了一个更大的秘密", - "score": "26702", - "score_desc": "2.67w", - "cover": "https://gips2.baidu.com/it/u=1593831522,852391480&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E4%B9%A6%E5%8D%B7%E4%B8%80%E6%A2%A6+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 17, - "title": "樱桃琥珀", - "desc": "《樱桃琥珀》要被影视化了,温柔女主学霸男主,主人公从小城到大都市,直至婚姻殿堂的女孩成长故事,由国内一线知名影视公司出品。", - "score": "26660", - "score_desc": "2.67w", - "cover": "https://gips3.baidu.com/it/u=2643705168,575328711&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E6%A8%B1%E6%A1%83%E7%90%A5%E7%8F%80+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 18, - "title": "咒术回战第二季", - "desc": "", - "score": "26617", - "score_desc": "2.66w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/7b3cfcaf3b343d45f5c16f3e47a9f946", - "url": "https://www.baidu.com/s?wd=%E5%92%92%E6%9C%AF%E5%9B%9E%E6%88%98%E7%AC%AC%E4%BA%8C%E5%AD%A3+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 19, - "title": "偷偷藏不住", - "desc": "桑稚高中时期被老师频繁请家长,为了解决麻烦,桑稚决定找哥哥顶包,然而兄妹见面就互怼闹僵,无奈只好求助来家中玩耍的哥哥舍友段嘉许,在桑稚的苦求要挟下,段嘉许帮桑稚去学校见老师,两人因此结缘,段嘉许从此更是把桑稚当成自己的亲妹妹爱护。随着段嘉许大学毕业,两人分隔异地,又因为一些误会,关系疏远。直到成年后的桑稚如愿考到了段嘉许的城市,两人重逢。在日渐亲密的接触下,桑稚渐渐发现了段嘉许一直以来的压力来源,她想要保护这个一直对自己很好的大哥哥,重拾埋藏心底的暗恋。在桑稚的陪伴下,段嘉许慢慢解开心结,他真心喜欢上了长大的桑稚,一段纯真暗恋终于开出美丽的爱情花朵。", - "score": "24655", - "score_desc": "2.47w", - "cover": "https://gips3.baidu.com/it/u=2216037055,3672846777&fm=3028&app=3028&f=JPEG&fmt=auto&q=75&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E5%81%B7%E5%81%B7%E8%97%8F%E4%B8%8D%E4%BD%8F+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 20, - "title": "一路朝阳", - "desc": "北漂女孩李慕嘉毕业后进入北京最知名的律所,靠着自己的勤奋努力从行政助理一路成为独当一面的律师,在职业巅峰切换跑道加入创业公司,大起大落最终创业成功,收获了一个家;闺蜜田蓉毕业求职未果,误打误撞成为房产中介,与北京男孩李万兵仓促结婚,在婚后职业和感情都遭受了巨大考验;表妹陈青斯坦福毕业与男友回国创业,遭遇种种挫折但找到了心之所向。从2007到2019年,三个女孩对人生的追求和希望在现实中身不由己地改变了模样,庆幸的是十年的磨砺最终还是求得了人生的向阳面,得以一路朝阳。", - "score": "24482", - "score_desc": "2.45w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/356088680f3a962380c8d700cf9a2826", - "url": "https://www.baidu.com/s?wd=%E4%B8%80%E8%B7%AF%E6%9C%9D%E9%98%B3+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 21, - "title": "她和她的他们", - "desc": "《她和她的他们》是由徐麒丰担任总导演、王兵导演,由肖顺尧、贾青、何杜娟领衔主演,胡军特邀领衔主演,袁家欢、王大奇、蒋方婷、郑家彬、钟林煜、李琦、秦奋等主演的都市犯罪悬疑剧。该剧讲述了刑警队副队长赵熵与搭档崔山河,抽丝剥茧,一层层揭开七人之间错综复杂的情感秘密,一场场关于人性、伦理的纠葛,一出出谎言交织的虐戏逐步上演。随着真相步步逼近,赵熵也拉开了自我救赎的序幕。", - "score": "24375", - "score_desc": "2.44w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/6b5d1065fb78498ab26d77cd0e0c7c27", - "url": "https://www.baidu.com/s?wd=%E5%A5%B9%E5%92%8C%E5%A5%B9%E7%9A%84%E4%BB%96%E4%BB%AC+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 22, - "title": "卿卿日常", - "desc": "《清穿日常》是多木木多所著网络小说,在晋江文学城、中国移动和阅读等网站连载。吃……吃喝喝那些事。反正清穿已经都穿成筛子了。清穿就是为了遇见阿哥,种种田过过日子!今天,你清穿了吗?", - "score": "22800", - "score_desc": "2.28w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/6caa4eb1bb38d643d7099b060d94acee", - "url": "https://www.baidu.com/s?wd=%E5%8D%BF%E5%8D%BF%E6%97%A5%E5%B8%B8+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 23, - "title": "初恋,稍显粗糙", - "desc": "《初恋,稍显粗糙》是由小野花梨、风间俊介主演的电视剧,于2023年7月7日在东京电视台深夜播出。该剧改编自作者ざくざくろ的同名漫画,讲述一位轻度智力障碍女性的纯爱故事。", - "score": "21904", - "score_desc": "2.19w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/e4c672a71dfa478102360895a77b4108", - "url": "https://www.baidu.com/s?wd=%E5%88%9D%E6%81%8B%EF%BC%8C%E7%A8%8D%E6%98%BE%E7%B2%97%E7%B3%99+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 24, - "title": "九重紫", - "desc": "年少失母的窦昭因为家庭变故和坎坷波折的命运对人间情爱与亲情失望透顶,她斗继母、保家产,避居冷僻田庄,求学晓事以图自保自强。大雨之夜,窦昭与扮作商贾投宿的宋墨在田庄相逢,用自己的智慧帮其保下平寇有功的定国公一脉遗孤,二人命运也因此紧紧缠绕。出身官宦之家的宋墨深陷家变谜团,而窦昭也在继母的破坏下遭遇换亲流言,二人选择成亲以结同盟、共度困局。曾经彼此猜忌的他们在相互帮扶中共渡难关,也由此渐渐相知相惜、互为知己。不料风雨欲来、朝堂骤变,窦昭与宋墨携手面对危局,共同挽救家族命运、解开英国公府换子疑云、成功阻止辽王谋逆,平忠臣冤案、保家国安宁,活出了真正属于自己的幸福生活。", - "score": "21717", - "score_desc": "2.17w", - "cover": "https://gips3.baidu.com/it/u=1237661084,451511578&fm=3028&app=3028&f=JPEG&fmt=auto&q=75&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E4%B9%9D%E9%87%8D%E7%B4%AB+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 25, - "title": "香港人在北京", - "desc": "《香港人在北京》是由陈展鹏、吴若希、戴祖仪主演的TVB电视剧,在拍摄中。", - "score": "21238", - "score_desc": "2.12w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/2e5f4d3fe3b36a7d9f4f782c35979016", - "url": "https://www.baidu.com/s?wd=%E9%A6%99%E6%B8%AF%E4%BA%BA%E5%9C%A8%E5%8C%97%E4%BA%AC+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 26, - "title": "你好,我们是欢喜天团", - "desc": "《你好,我们是欢喜天团》是由刘浩南执导,由王艺瑾、千喆、高卿尘领衔主演,易恒、伍雅露、阿克朱力、曹左、贵尚奇、庄逸涵、曲梦婷主演,陈名豪、代少冬特别出演的古代网络微短剧。2022年10月15日,《你好,我们是欢喜天团》杀青。该剧于2023年9月22日在腾讯视频播出。", - "score": "20966", - "score_desc": "2.1w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/94e45c218022c97e865f68c3a15c9c22", - "url": "https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD%EF%BC%8C%E6%88%91%E4%BB%AC%E6%98%AF%E6%AC%A2%E5%96%9C%E5%A4%A9%E5%9B%A2+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 27, - "title": "诛仙", - "desc": "一夜间惨变孤儿的张小凡被青云门收为弟子,经过五年刻苦修炼,他在师门七脉会武上大放异彩,后被派往空桑山打探魔教行迹,旅程中,他与师姐陆雪琪遭遇危难,并结识救护了魔教女子碧瑶,同时,新的危险也在前方等待着他。", - "score": "20659", - "score_desc": "2.07w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/ab55434dff2e8c4432119fc980f5a51d", - "url": "https://www.baidu.com/s?wd=%E8%AF%9B%E4%BB%99+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 28, - "title": "玫瑰的故事", - "desc": "电视剧改编自亦舒同名小说,由刘亦菲出演该剧女一号。剧中主要讲述了黄玫瑰一生的情感故事。出身于富贵之家的玫瑰经历了几段刻骨铭心的爱情,在浮浮沉沉中明白自己想要的是什么,为爱放手去追寻,成长为更有勇气的自己。", - "score": "20439", - "score_desc": "2.04w", - "cover": "https://gips1.baidu.com/it/u=1227308879,4121027510&fm=3028&app=3028&f=PNG&fmt=auto&q=75&size=f608_864", - "url": "https://www.baidu.com/s?wd=%E7%8E%AB%E7%91%B0%E7%9A%84%E6%95%85%E4%BA%8B+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 29, - "title": "爱你,是我做过最好的事", - "desc": "《爱你,是我做过最好的事》笙离的小说。讲述了一个关于青春、成长、初恋、选择的故事。", - "score": "20196", - "score_desc": "2.02w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/d680ad814edfef5438f7e6175c0456f6", - "url": "https://www.baidu.com/s?wd=%E7%88%B1%E4%BD%A0%EF%BC%8C%E6%98%AF%E6%88%91%E5%81%9A%E8%BF%87%E6%9C%80%E5%A5%BD%E7%9A%84%E4%BA%8B+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 30, - "title": "唐朝诡事录", - "desc": "暗夜邪仙从天而降,鬼市地宫露出冰山一角,而风靡长安的诡异红茶究竟是养生之药还是害人之物?长安城里新娘失踪案接连发生,似乎与红茶有着千丝万缕的联系案件扑朔迷离,人心玄妙难鉴!金吾卫中郎将卢凌风奉命查案,遭遇平生最强对手狄仁杰关门弟子苏无名,双强携手共破长安奇案!九个不同风格的诡异案件,《长安红茶》《石桥图》《众生堂》《黄梅杀》《甘棠驿怪谈》《鼍神》《人面花》《参天楼》,一一为您揭晓大唐夜色笼罩之下的奇闻异录! 见证唐诗之外,被湮没千年的奇诡想象。千年前的唐朝,万邦来朝,是当之无愧的世界中心。优越的物质生活,多样的文化融合,催生了唐朝人极致的想象力。 除了李白、杜甫、白居易等一代传奇诗人,用唐诗描绘出的华丽的大唐美卷;市井间的贩夫走卒,更用他们更加不羁的想象力,在唐朝的夜幕中 勾勒出神魔鬼怪的憧憧魅影:仙魔精妖、奇闻怪谈、幻术道法、异域传说、珍禽异兽、宫廷轶事", - "score": "17785", - "score_desc": "1.78w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/5bb62453122a1d67e077b70321676175", - "url": "https://www.baidu.com/s?wd=%E5%94%90%E6%9C%9D%E8%AF%A1%E4%BA%8B%E5%BD%95+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/api.js b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/api.js deleted file mode 100755 index b6aec5c6..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/api.js +++ /dev/null @@ -1,146 +0,0 @@ -// API 配置和数据获取模块 -class HotTopicsAPI { - constructor() { - this.apiUrl = 'https://60s.api.shumengya.top/v2/baidu/tieba'; - this.fallbackData = null; - } - - // 获取热搜数据 - async fetchHotTopics() { - try { - const response = await fetch(this.apiUrl, { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - // 添加超时控制 - signal: AbortSignal.timeout(10000) // 10秒超时 - }); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.json(); - - // 验证数据格式 - if (!this.validateData(data)) { - throw new Error('Invalid data format'); - } - - // 缓存成功的数据作为备用 - this.fallbackData = data; - - return { - success: true, - data: data, - timestamp: new Date().toISOString() - }; - } catch (error) { - console.error('API请求失败:', error); - - // 如果有缓存数据,返回缓存数据 - if (this.fallbackData) { - return { - success: true, - data: this.fallbackData, - timestamp: new Date().toISOString(), - isCache: true - }; - } - - return { - success: false, - error: error.message, - timestamp: new Date().toISOString() - }; - } - } - - // 验证数据格式 - validateData(data) { - if (!data || typeof data !== 'object') { - return false; - } - - if (data.code !== 200) { - return false; - } - - if (!Array.isArray(data.data)) { - return false; - } - - // 验证数据项格式 - return data.data.every(item => { - return item.rank && - item.title && - item.desc && - item.score_desc; - }); - } - - // 处理图片URL - processImageUrl(url) { - if (!url) return null; - - // 处理百度贴吧图片URL的特殊字符 - try { - return url.replace(/&/g, '&'); - } catch (error) { - console.warn('图片URL处理失败:', error); - return null; - } - } - - // 处理跳转URL - processTopicUrl(url) { - if (!url) return '#'; - - try { - return url.replace(/&/g, '&'); - } catch (error) { - console.warn('链接URL处理失败:', error); - return '#'; - } - } - - // 格式化分数显示 - formatScore(score, scoreDesc) { - if (scoreDesc) { - return scoreDesc; - } - - if (typeof score === 'number') { - if (score >= 10000) { - return (score / 10000).toFixed(1) + 'w'; - } - return score.toString(); - } - - return '0'; - } - - // 截断文本 - truncateText(text, maxLength = 100) { - if (!text) return ''; - - if (text.length <= maxLength) { - return text; - } - - return text.substring(0, maxLength) + '...'; - } - - // 获取排名样式类 - getRankClass(rank) { - if (rank === 1) return 'top-1'; - if (rank === 2) return 'top-2'; - if (rank === 3) return 'top-3'; - return 'normal'; - } -} - -// 导出API实例 -const hotTopicsAPI = new HotTopicsAPI(); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/app.js b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/app.js deleted file mode 100755 index ee1be932..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/app.js +++ /dev/null @@ -1,201 +0,0 @@ -// 主应用程序文件 -class HotTopicsApp { - constructor() { - this.isInitialized = false; - this.retryCount = 0; - this.maxRetries = 3; - this.retryDelay = 2000; // 2秒 - } - - // 初始化应用 - async init() { - if (this.isInitialized) return; - - try { - console.log('初始化百度贴吧热搜应用...'); - - // 检查必要的元素是否存在 - this.checkRequiredElements(); - - // 加载初始数据 - await this.loadHotTopics(); - - // 设置自动刷新 - this.setupAutoRefresh(); - - // 设置页面可见性监听 - this.setupVisibilityListener(); - - this.isInitialized = true; - console.log('应用初始化完成'); - - } catch (error) { - console.error('应用初始化失败:', error); - uiManager.showError('应用初始化失败,请刷新页面重试'); - } - } - - // 检查必要元素 - checkRequiredElements() { - const requiredElements = ['loading', 'error', 'hotList', 'refreshBtn', 'updateTime']; - const missingElements = requiredElements.filter(id => !document.getElementById(id)); - - if (missingElements.length > 0) { - throw new Error(`缺少必要元素: ${missingElements.join(', ')}`); - } - } - - // 加载热搜数据 - async loadHotTopics() { - try { - console.log('开始获取热搜数据...'); - uiManager.showLoading(); - - const result = await hotTopicsAPI.fetchHotTopics(); - - if (result.success) { - console.log('数据获取成功:', result.data.data?.length || 0, '条记录'); - uiManager.renderHotTopics(result.data); - this.retryCount = 0; // 重置重试计数 - - // 如果是缓存数据,显示提示 - if (result.isCache) { - uiManager.showToast('当前显示缓存数据', 3000); - } - } else { - throw new Error(result.error || '数据获取失败'); - } - - } catch (error) { - console.error('加载热搜数据失败:', error); - - // 重试逻辑 - if (this.retryCount < this.maxRetries) { - this.retryCount++; - console.log(`第 ${this.retryCount} 次重试...`); - - uiManager.showToast(`加载失败,${this.retryDelay / 1000}秒后重试...`, this.retryDelay); - - setTimeout(() => { - this.loadHotTopics(); - }, this.retryDelay); - - // 增加重试延迟 - this.retryDelay = Math.min(this.retryDelay * 1.5, 10000); - } else { - uiManager.showError('数据加载失败,请检查网络连接后重试'); - this.retryCount = 0; - this.retryDelay = 2000; - } - } - } - - // 设置自动刷新 - setupAutoRefresh() { - // 每5分钟自动刷新一次 - setInterval(() => { - if (document.visibilityState === 'visible' && !uiManager.isLoading) { - console.log('自动刷新数据...'); - this.loadHotTopics(); - } - }, 5 * 60 * 1000); // 5分钟 - } - - // 设置页面可见性监听 - setupVisibilityListener() { - document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'visible') { - // 页面变为可见时,检查是否需要刷新数据 - const lastUpdate = localStorage.getItem('lastUpdateTime'); - const now = Date.now(); - - if (!lastUpdate || (now - parseInt(lastUpdate)) > 10 * 60 * 1000) { - // 超过10分钟没更新,自动刷新 - console.log('页面重新可见,刷新数据...'); - this.loadHotTopics(); - } - } - }); - } - - // 手动刷新 - async refresh() { - if (uiManager.isLoading) { - console.log('正在加载中,忽略刷新请求'); - return; - } - - console.log('手动刷新数据...'); - this.retryCount = 0; - this.retryDelay = 2000; - await this.loadHotTopics(); - } - - // 获取应用状态 - getStatus() { - return { - isInitialized: this.isInitialized, - isLoading: uiManager.isLoading, - retryCount: this.retryCount, - lastUpdate: localStorage.getItem('lastUpdateTime') - }; - } -} - -// 创建应用实例 -const app = new HotTopicsApp(); - -// 全局函数,供HTML调用 -window.loadHotTopics = () => app.loadHotTopics(); -window.refreshData = () => app.refresh(); -window.getAppStatus = () => app.getStatus(); - -// 页面加载完成后初始化 -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', () => { - app.init(); - }); -} else { - // 如果页面已经加载完成 - app.init(); -} - -// 错误处理 -window.addEventListener('error', (event) => { - console.error('全局错误:', event.error); - - // 如果是网络错误,显示友好提示 - if (event.error?.message?.includes('fetch') || - event.error?.message?.includes('network') || - event.error?.message?.includes('Failed to fetch')) { - uiManager.showToast('网络连接异常,请检查网络设置'); - } -}); - -// 未处理的Promise拒绝 -window.addEventListener('unhandledrejection', (event) => { - console.error('未处理的Promise拒绝:', event.reason); - - // 防止默认的错误处理 - event.preventDefault(); - - // 显示用户友好的错误信息 - if (event.reason?.message?.includes('fetch') || - event.reason?.message?.includes('network')) { - uiManager.showToast('网络请求失败,请稍后重试'); - } -}); - -// 导出应用实例(用于调试) -window.hotTopicsApp = app; - -// 开发模式下的调试信息 -if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') { - console.log('🚀 百度贴吧热搜应用已启动'); - console.log('📱 响应式设计已启用'); - console.log('🔄 自动刷新已设置(5分钟间隔)'); - console.log('💡 可用调试命令:'); - console.log(' - hotTopicsApp.getStatus() // 获取应用状态'); - console.log(' - hotTopicsApp.refresh() // 手动刷新'); - console.log(' - loadHotTopics() // 重新加载数据'); -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/index.html deleted file mode 100755 index 9ff2a1e0..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/index.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - 百度贴吧热搜榜单 - - - - - -
    - -
    -
    - -
    - -
    -
    -
    - - -
    -
    -

    正在获取最新热搜...

    -
    - - - - - -
    -
    - -
    -
    - - -
    -

    最后更新:--

    -

    数据来源:百度贴吧官方

    -
    -
    - - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/styles.css b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/styles.css deleted file mode 100755 index 60dd3a5d..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/styles.css +++ /dev/null @@ -1,419 +0,0 @@ -/* 全局样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - background: linear-gradient(135deg, #e8f5e8 0%, #f9f9e8 50%, #f5f5f5 100%); - min-height: 100vh; - color: #333; - line-height: 1.6; -} - -.container { - max-width: 800px; - margin: 0 auto; - padding: 0 16px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - padding: 20px 0; - position: sticky; - top: 0; - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(10px); - border-radius: 0 0 20px 20px; - margin-bottom: 20px; - z-index: 100; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); -} - -.header-content { - display: flex; - justify-content: space-between; - align-items: center; -} - -.logo { - display: flex; - align-items: center; - gap: 12px; -} - -.logo i { - font-size: 28px; - color: #7fb069; -} - -.logo h1 { - font-size: 24px; - font-weight: 700; - color: #2d3748; - margin: 0; -} - -.refresh-btn { - width: 44px; - height: 44px; - border-radius: 50%; - background: linear-gradient(135deg, #7fb069, #a8cc8c); - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(127, 176, 105, 0.3); -} - -.refresh-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(127, 176, 105, 0.4); -} - -.refresh-btn:active { - transform: translateY(0); -} - -.refresh-btn i { - color: white; - font-size: 18px; -} - -.refresh-btn.loading i { - animation: spin 1s linear infinite; -} - -@keyframes spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } -} - -/* 主内容区域 */ -.main-content { - flex: 1; - margin-bottom: 20px; -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 60px 20px; - color: white; -} - -.loading-spinner { - width: 40px; - height: 40px; - border: 3px solid rgba(255, 255, 255, 0.3); - border-top: 3px solid white; - border-radius: 50%; - margin: 0 auto 20px; - animation: spin 1s linear infinite; -} - -.loading p { - font-size: 16px; - opacity: 0.9; -} - -/* 错误状态 */ -.error { - text-align: center; - padding: 60px 20px; - color: white; -} - -.error i { - font-size: 48px; - margin-bottom: 20px; - opacity: 0.8; -} - -.error p { - font-size: 16px; - margin-bottom: 20px; - opacity: 0.9; -} - -.retry-btn { - background: rgba(255, 255, 255, 0.2); - border: 2px solid rgba(255, 255, 255, 0.3); - color: white; - padding: 12px 24px; - border-radius: 25px; - cursor: pointer; - font-size: 14px; - transition: all 0.3s ease; -} - -.retry-btn:hover { - background: rgba(255, 255, 255, 0.3); - border-color: rgba(255, 255, 255, 0.5); -} - -/* 热搜列表 */ -.hot-list { - display: grid; - gap: 16px; -} - -.hot-item { - background: rgba(255, 255, 255, 0.95); - border-radius: 16px; - padding: 20px; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); - transition: all 0.3s ease; - cursor: pointer; - backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.2); -} - -.hot-item:hover { - transform: translateY(-4px); - box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15); - background: rgba(255, 255, 255, 1); -} - -.hot-item-header { - display: flex; - align-items: flex-start; - gap: 16px; - margin-bottom: 12px; -} - -.rank-badge { - min-width: 32px; - height: 32px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-weight: 700; - font-size: 14px; - color: white; - flex-shrink: 0; -} - -.rank-badge.top-1 { - background: linear-gradient(135deg, #ff6b6b, #ee5a24); - box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3); -} - -.rank-badge.top-2 { - background: linear-gradient(135deg, #ffa726, #ff7043); - box-shadow: 0 4px 15px rgba(255, 167, 38, 0.3); -} - -.rank-badge.top-3 { - background: linear-gradient(135deg, #ffca28, #ffa000); - box-shadow: 0 4px 15px rgba(255, 202, 40, 0.3); -} - -.rank-badge.normal { - background: linear-gradient(135deg, #7fb069, #a8cc8c); - box-shadow: 0 4px 15px rgba(127, 176, 105, 0.3); -} - -.hot-item-content { - flex: 1; - min-width: 0; -} - -.hot-title { - font-size: 16px; - font-weight: 600; - color: #2d3748; - margin-bottom: 8px; - line-height: 1.4; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.hot-desc { - font-size: 14px; - color: #718096; - line-height: 1.5; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; - margin-bottom: 12px; -} - -.hot-meta { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; -} - -.hot-score { - display: flex; - align-items: center; - gap: 6px; - color: #7fb069; - font-weight: 600; - font-size: 14px; -} - -.hot-score i { - font-size: 12px; -} - -.hot-avatar { - width: 24px; - height: 24px; - border-radius: 50%; - object-fit: cover; - border: 2px solid rgba(127, 176, 105, 0.2); -} - -/* 底部 */ -.footer { - text-align: center; - padding: 20px 0; - color: rgba(255, 255, 255, 0.8); - font-size: 12px; - line-height: 1.5; -} - -.update-time { - margin-bottom: 4px; - font-weight: 500; -} - -.data-source { - opacity: 0.7; -} - -/* 响应式设计 */ -@media (max-width: 768px) { - .container { - padding: 0 12px; - } - - .header { - padding: 16px 0; - margin-bottom: 16px; - } - - .logo h1 { - font-size: 20px; - } - - .logo i { - font-size: 24px; - } - - .refresh-btn { - width: 40px; - height: 40px; - } - - .refresh-btn i { - font-size: 16px; - } - - .hot-list { - gap: 12px; - } - - .hot-item { - padding: 16px; - } - - .hot-item-header { - gap: 12px; - margin-bottom: 10px; - } - - .rank-badge { - min-width: 28px; - height: 28px; - font-size: 12px; - } - - .hot-title { - font-size: 15px; - } - - .hot-desc { - font-size: 13px; - } - - .hot-score { - font-size: 13px; - } - - .hot-avatar { - width: 20px; - height: 20px; - border: 2px solid rgba(127, 176, 105, 0.2); - } -} - -@media (max-width: 480px) { - .container { - padding: 0 8px; - } - - .hot-item { - padding: 12px; - } - - .hot-title { - font-size: 14px; - } - - .hot-desc { - font-size: 12px; - } -} - -/* 动画效果 */ -.hot-item { - animation: fadeInUp 0.6s ease forwards; - opacity: 0; - transform: translateY(20px); -} - -.hot-item:nth-child(1) { animation-delay: 0.1s; } -.hot-item:nth-child(2) { animation-delay: 0.2s; } -.hot-item:nth-child(3) { animation-delay: 0.3s; } -.hot-item:nth-child(4) { animation-delay: 0.4s; } -.hot-item:nth-child(5) { animation-delay: 0.5s; } -.hot-item:nth-child(n+6) { animation-delay: 0.6s; } - -@keyframes fadeInUp { - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 滚动条样式 */ -::-webkit-scrollbar { - width: 6px; -} - -::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.1); -} - -::-webkit-scrollbar-thumb { - background: rgba(255, 255, 255, 0.3); - border-radius: 3px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(255, 255, 255, 0.5); -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/ui.js b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/ui.js deleted file mode 100755 index e0a17f53..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/ui.js +++ /dev/null @@ -1,354 +0,0 @@ -// UI 渲染和交互模块 -class UIManager { - constructor() { - this.elements = { - loading: document.getElementById('loading'), - error: document.getElementById('error'), - hotList: document.getElementById('hotList'), - refreshBtn: document.getElementById('refreshBtn'), - updateTime: document.getElementById('updateTime') - }; - - this.isLoading = false; - this.initEventListeners(); - } - - // 初始化事件监听器 - initEventListeners() { - // 刷新按钮点击事件 - this.elements.refreshBtn.addEventListener('click', () => { - if (!this.isLoading) { - this.refreshData(); - } - }); - - // 键盘快捷键 - document.addEventListener('keydown', (e) => { - if (e.key === 'F5' || (e.ctrlKey && e.key === 'r')) { - e.preventDefault(); - if (!this.isLoading) { - this.refreshData(); - } - } - }); - - // 下拉刷新(移动端) - this.initPullToRefresh(); - } - - // 初始化下拉刷新 - initPullToRefresh() { - let startY = 0; - let currentY = 0; - let isPulling = false; - const threshold = 80; - - document.addEventListener('touchstart', (e) => { - if (window.scrollY === 0) { - startY = e.touches[0].clientY; - isPulling = true; - } - }); - - document.addEventListener('touchmove', (e) => { - if (isPulling && window.scrollY === 0) { - currentY = e.touches[0].clientY; - const pullDistance = currentY - startY; - - if (pullDistance > 0) { - e.preventDefault(); - - // 添加视觉反馈 - if (pullDistance > threshold) { - this.elements.refreshBtn.style.transform = 'scale(1.1)'; - } else { - this.elements.refreshBtn.style.transform = 'scale(1)'; - } - } - } - }); - - document.addEventListener('touchend', () => { - if (isPulling) { - const pullDistance = currentY - startY; - - if (pullDistance > threshold && !this.isLoading) { - this.refreshData(); - } - - this.elements.refreshBtn.style.transform = 'scale(1)'; - isPulling = false; - } - }); - } - - // 显示加载状态 - showLoading() { - this.isLoading = true; - this.elements.loading.style.display = 'block'; - this.elements.error.style.display = 'none'; - this.elements.hotList.style.display = 'none'; - this.elements.refreshBtn.classList.add('loading'); - } - - // 隐藏加载状态 - hideLoading() { - this.isLoading = false; - this.elements.loading.style.display = 'none'; - this.elements.refreshBtn.classList.remove('loading'); - } - - // 显示错误状态 - showError(message = '获取数据失败,请稍后重试') { - this.hideLoading(); - this.elements.error.style.display = 'block'; - this.elements.hotList.style.display = 'none'; - - const errorText = this.elements.error.querySelector('p'); - if (errorText) { - errorText.textContent = message; - } - } - - // 显示热搜列表 - showHotList() { - this.hideLoading(); - this.elements.error.style.display = 'none'; - this.elements.hotList.style.display = 'grid'; - } - - // 渲染热搜数据 - renderHotTopics(data) { - if (!data || !data.data || !Array.isArray(data.data)) { - this.showError('数据格式错误'); - return; - } - - const hotTopics = data.data; - this.elements.hotList.innerHTML = ''; - - hotTopics.forEach((topic, index) => { - const hotItem = this.createHotItem(topic, index); - this.elements.hotList.appendChild(hotItem); - }); - - this.showHotList(); - this.updateTimestamp(data.isCache); - } - - // 创建热搜项目元素 - createHotItem(topic, index) { - const item = document.createElement('div'); - item.className = 'hot-item'; - item.style.animationDelay = `${index * 0.1}s`; - - // 处理数据 - const rank = topic.rank || (index + 1); - const title = hotTopicsAPI.truncateText(topic.title, 80); - const desc = hotTopicsAPI.truncateText(topic.desc, 120); - const score = hotTopicsAPI.formatScore(topic.score, topic.score_desc); - const avatarUrl = hotTopicsAPI.processImageUrl(topic.avatar); - const topicUrl = hotTopicsAPI.processTopicUrl(topic.url); - const rankClass = hotTopicsAPI.getRankClass(rank); - - item.innerHTML = ` -
    -
    - ${rank} -
    -
    -

    ${title}

    -

    ${desc}

    -
    -
    - - ${score} -
    - ${avatarUrl ? `话题图片` : ''} -
    -
    -
    - `; - - // 添加点击事件 - item.addEventListener('click', () => { - this.openTopic(topicUrl, title); - }); - - // 添加长按事件(移动端) - let pressTimer; - item.addEventListener('touchstart', (e) => { - pressTimer = setTimeout(() => { - this.showTopicMenu(topic, e.touches[0].clientX, e.touches[0].clientY); - }, 500); - }); - - item.addEventListener('touchend', () => { - clearTimeout(pressTimer); - }); - - item.addEventListener('touchmove', () => { - clearTimeout(pressTimer); - }); - - return item; - } - - // 打开话题链接 - openTopic(url, title) { - if (url && url !== '#') { - // 在新窗口打开 - window.open(url, '_blank', 'noopener,noreferrer'); - } else { - this.showToast('链接暂不可用'); - } - } - - // 显示话题菜单(长按) - showTopicMenu(topic, x, y) { - const menu = document.createElement('div'); - menu.className = 'topic-menu'; - menu.style.cssText = ` - position: fixed; - left: ${x}px; - top: ${y}px; - background: white; - border-radius: 8px; - box-shadow: 0 4px 20px rgba(0,0,0,0.2); - padding: 8px 0; - z-index: 1000; - min-width: 120px; - `; - - const actions = [ - { text: '打开链接', action: () => this.openTopic(hotTopicsAPI.processTopicUrl(topic.url), topic.title) }, - { text: '复制标题', action: () => this.copyText(topic.title) }, - { text: '分享', action: () => this.shareContent(topic) } - ]; - - actions.forEach(action => { - const item = document.createElement('div'); - item.textContent = action.text; - item.style.cssText = ` - padding: 12px 16px; - cursor: pointer; - font-size: 14px; - color: #333; - border-bottom: 1px solid #f0f0f0; - `; - item.addEventListener('click', () => { - action.action(); - document.body.removeChild(menu); - }); - menu.appendChild(item); - }); - - document.body.appendChild(menu); - - // 点击其他地方关闭菜单 - setTimeout(() => { - document.addEventListener('click', function closeMenu() { - if (document.body.contains(menu)) { - document.body.removeChild(menu); - } - document.removeEventListener('click', closeMenu); - }); - }, 100); - } - - // 复制文本 - async copyText(text) { - try { - await navigator.clipboard.writeText(text); - this.showToast('已复制到剪贴板'); - } catch (error) { - console.error('复制失败:', error); - this.showToast('复制失败'); - } - } - - // 分享内容 - async shareContent(topic) { - const shareData = { - title: topic.title, - text: topic.desc, - url: hotTopicsAPI.processTopicUrl(topic.url) - }; - - try { - if (navigator.share) { - await navigator.share(shareData); - } else { - // 降级到复制链接 - await this.copyText(`${topic.title} - ${shareData.url}`); - } - } catch (error) { - console.error('分享失败:', error); - } - } - - // 显示提示消息 - showToast(message, duration = 2000) { - const toast = document.createElement('div'); - toast.textContent = message; - toast.style.cssText = ` - position: fixed; - bottom: 20px; - left: 50%; - transform: translateX(-50%); - background: rgba(0,0,0,0.8); - color: white; - padding: 12px 20px; - border-radius: 20px; - font-size: 14px; - z-index: 1000; - animation: fadeInUp 0.3s ease; - `; - - document.body.appendChild(toast); - - setTimeout(() => { - toast.style.animation = 'fadeOut 0.3s ease'; - setTimeout(() => { - if (document.body.contains(toast)) { - document.body.removeChild(toast); - } - }, 300); - }, duration); - } - - // 更新时间戳 - updateTimestamp(isCache = false) { - const now = new Date(); - const timeString = now.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit' - }); - - const cacheText = isCache ? ' (缓存数据)' : ''; - this.elements.updateTime.textContent = `最后更新:${timeString}${cacheText}`; - } - - // 刷新数据 - async refreshData() { - if (window.loadHotTopics) { - await window.loadHotTopics(); - } - } -} - -// 导出UI管理器实例 -const uiManager = new UIManager(); - -// 添加CSS动画 -const style = document.createElement('style'); -style.textContent = ` - @keyframes fadeOut { - from { opacity: 1; transform: translateX(-50%) translateY(0); } - to { opacity: 0; transform: translateX(-50%) translateY(10px); } - } -`; -document.head.appendChild(style); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/返回接口.json deleted file mode 100755 index 2b5ae003..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/返回接口.json +++ /dev/null @@ -1,306 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "rank": 1, - "title": "MAGA喉舌被枪杀,川普为其降半旗", - "desc": "美国知名保守派活动人士、特朗普的政治盟友查理·柯克在大学演讲时遭枪击身亡,特朗普下令全美降半旗致哀。", - "abstract": "美国知名保守派活动人士、特朗普的政治盟友查理·柯克在大学演讲时遭枪击身亡,特朗普下令全美降半旗致哀。", - "score": 1594980, - "score_desc": "159.5w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=7fd9bdea3ad98d1076815f714702803a/a9d3fd1f4134970a614a3b39d3cad1c8a7865dee.jpg?tbpicau=2025-09-22-05_85ec313083b76eb31917067b6948c007", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344923&topic_name=MAGA%E5%96%89%E8%88%8C%E8%A2%AB%E6%9E%AA%E6%9D%80%2C%E5%B7%9D%E6%99%AE%E4%B8%BA%E5%85%B6%E9%99%8D%E5%8D%8A%E6%97%97" - }, - { - "rank": 2, - "title": "上膛!南理工打响整肃伪拳第一枪", - "desc": "终于有学校开了个好头,南京理工大学打响了武汉大学事件之后高校反对极端女权的第一枪。国防七子就是不一样,支持南理工!", - "abstract": "终于有学校开了个好头,南京理工大学打响了武汉大学事件之后高校反对极端女权的第一枪。国防七子就是不一样,支持南理工!", - "score": 1585575, - "score_desc": "158.56w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=45147a89e20f4bfb8c85cd14657240c4/8b13632762d0f703569980ca4efa513d2697c5f9.jpg?tbpicau=2025-09-22-05_8d101b01ab9f7032a8943a8ad9ad3591", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344934&topic_name=%E4%B8%8A%E8%86%9B%21%E5%8D%97%E7%90%86%E5%B7%A5%E6%89%93%E5%93%8D%E6%95%B4%E8%82%83%E4%BC%AA%E6%8B%B3%E7%AC%AC%E4%B8%80%E6%9E%AA" - }, - { - "rank": 3, - "title": "武大暗中篡改?杨某论文再次上架", - "desc": "又反转!武汉大学杨某媛“金牌”论文半夜又偷偷重新上架知网,不会是武大偷改好的版本吧,等热度一过就开始岁月史书?", - "abstract": "又反转!武汉大学杨某媛“金牌”论文半夜又偷偷重新上架知网,不会是武大偷改好的版本吧,等热度一过就开始岁月史书?", - "score": 1265376, - "score_desc": "126.54w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=e3f59fed7fdbb6fd250eb6666f19932c/8601a18b87d6277f2c00192e6e381f30e924fc92.jpg?tbpicau=2025-09-22-05_8c33e404e8488061ca9169977a762457", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344925&topic_name=%E6%AD%A6%E5%A4%A7%E6%9A%97%E4%B8%AD%E7%AF%A1%E6%94%B9%3F%E6%9D%A8%E6%9F%90%E8%AE%BA%E6%96%87%E5%86%8D%E6%AC%A1%E4%B8%8A%E6%9E%B6" - }, - { - "rank": 4, - "title": "兽王关键吼,XG大逆风翻盘石头人", - "desc": "落后1W6翻盘,Xxs刷新兽王关键吼,AME巨魔diff水晶。XG1比0石头人,拿下正赛首局,加油!", - "abstract": "落后1W6翻盘,Xxs刷新兽王关键吼,AME巨魔diff水晶。XG1比0石头人,拿下正赛首局,加油!", - "score": 893943, - "score_desc": "89.39w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=882897db1466d0167e4ccd68f116ec33/86d6277f9e2f070899cb3e16af24b899a801f2de.jpg?tbpicau=2025-09-22-05_625c74153fe7c84accea9ea76d88097b", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344941&topic_name=%E5%85%BD%E7%8E%8B%E5%85%B3%E9%94%AE%E5%90%BC%2CXG%E5%A4%A7%E9%80%86%E9%A3%8E%E7%BF%BB%E7%9B%98%E7%9F%B3%E5%A4%B4%E4%BA%BA" - }, - { - "rank": 5, - "title": "户圣开炮,安卓旗舰谁敢买?", - "desc": "户晨风再现逆天言论,苹果17发布,安卓中高端机遭遇灭顶之灾,两千五以上没人买,有能力的一定要给父母换iPhone!", - "abstract": "户晨风再现逆天言论,苹果17发布,安卓中高端机遭遇灭顶之灾,两千五以上没人买,有能力的一定要给父母换iPhone!", - "score": 766532, - "score_desc": "76.65w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=0eb028f7692eb938ec3829b2b35fbd01/c8177f3e6709c93d2a9825e1d93df8dcd10054b9.jpg?tbpicau=2025-09-22-05_a331d216b4e47c0049889f880fe693e3", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344926&topic_name=%E6%88%B7%E5%9C%A3%E5%BC%80%E7%82%AE%2C%E5%AE%89%E5%8D%93%E6%97%97%E8%88%B0%E8%B0%81%E6%95%A2%E4%B9%B0%3F" - }, - { - "rank": 6, - "title": "成都诬告偷拍败诉!小叶还能怎?", - "desc": "成都地铁诬告偷拍案二审维持原判,追风小叶维权失败,吧友锐评温和派的路走到头了。", - "abstract": "成都地铁诬告偷拍案二审维持原判,追风小叶维权失败,吧友锐评温和派的路走到头了。", - "score": 663175, - "score_desc": "66.32w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=9b41180f6bf5e0feee4dda413a5d0c9c/8694a4c27d1ed21b65aa39f3eb6eddc451da3f40.jpg?tbpicau=2025-09-22-05_db6b89b7846083172cde82c7146ebddc", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344942&topic_name=%E6%88%90%E9%83%BD%E8%AF%AC%E5%91%8A%E5%81%B7%E6%8B%8D%E8%B4%A5%E8%AF%89%21%E5%B0%8F%E5%8F%B6%E8%BF%98%E8%83%BD%E6%80%8E%3F" - }, - { - "rank": 7, - "title": "绝密飙至60w,盾奶开始泛滥", - "desc": "三角洲战备猛涨,玩家钱包 “躺平”!那些攥得紧紧、舍不得动的家底,这下不得不掏出来,打工一局倒贴钱,谁顶得住?", - "abstract": "三角洲战备猛涨,玩家钱包 “躺平”!那些攥得紧紧、舍不得动的家底,这下不得不掏出来,打工一局倒贴钱,谁顶得住?", - "score": 590856, - "score_desc": "59.09w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=61af83ea3ad98d1076815f714702803a/a9d3fd1f4134970a7f3c0539d3cad1c8a7865d5c.jpg?tbpicau=2025-09-22-05_82bc9423e1e1b97f3c071ce96e1cf7e4", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344936&topic_name=%E7%BB%9D%E5%AF%86%E9%A3%99%E8%87%B360w%2C%E7%9B%BE%E5%A5%B6%E5%BC%80%E5%A7%8B%E6%B3%9B%E6%BB%A5" - }, - { - "rank": 8, - "title": "邓紫棋被扒抢闺蜜男友博上位", - "desc": "邓紫棋被曝实锤撬闺蜜墙角,硬生生抢走正与闺蜜浓情蜜意的男友魏俊杰。事后为掩人耳目,还接连拉华晨宇、林宥嘉的绯闻来挡枪,一波操作引得舆论炸开了锅,粉丝纷纷 “跑路” 。", - "abstract": "邓紫棋被曝实锤撬闺蜜墙角,硬生生抢走正与闺蜜浓情蜜意的男友魏俊杰。事后为掩人耳目,还接连拉华晨宇、林宥嘉的绯闻来挡枪,一波操作引得舆论炸开了锅,粉丝纷纷 “跑路” 。", - "score": 506184, - "score_desc": "50.62w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=4d464c04094a20a4314b6f87f66fa016/30adcbef76094b36a2ff0ffbe5cc7cd98d109db2.jpg?tbpicau=2025-09-22-05_ed8c8f84187ef131dbb94421e614577b", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344937&topic_name=%E9%82%93%E7%B4%AB%E6%A3%8B%E8%A2%AB%E6%89%92%E6%8A%A2%E9%97%BA%E8%9C%9C%E7%94%B7%E5%8F%8B%E5%8D%9A%E4%B8%8A%E4%BD%8D" - }, - { - "rank": 9, - "title": "小红书被掘,薯民赛博戒网瘾", - "desc": "今天,网信办对小红书平台采取约谈、责令限期改正、警告、从严处理责任人等处置处罚措施。这下薯民们该何去何从?", - "abstract": "今天,网信办对小红书平台采取约谈、责令限期改正、警告、从严处理责任人等处置处罚措施。这下薯民们该何去何从?", - "score": 471548, - "score_desc": "47.15w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=51c0d93fc018367aaddc2c9d484eb3e0/bf096b63f6246b60eda2a662adf81a4c510fa27c.jpg?tbpicau=2025-09-22-05_61c56fced5303058de8e34d5f5c2f858", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344940&topic_name=%E5%B0%8F%E7%BA%A2%E4%B9%A6%E8%A2%AB%E6%8E%98%2C%E8%96%AF%E6%B0%91%E8%B5%9B%E5%8D%9A%E6%88%92%E7%BD%91%E7%98%BE" - }, - { - "rank": 10, - "title": "以军喊话轰全球:导弹是不长眼的", - "desc": "轰炸卡塔尔后以总理喊话全世界,称自己要效仿美国“9·11”事件后的行动,谁敢窝藏恐怖分子,以色列统统揍个遍!", - "abstract": "轰炸卡塔尔后以总理喊话全世界,称自己要效仿美国“9·11”事件后的行动,谁敢窝藏恐怖分子,以色列统统揍个遍!", - "score": 415002, - "score_desc": "41.5w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=6e77f03535f082022dc7c27f2dc6c3d9/562c11dfa9ec8a13a01b43f6b103918fa0ecc0a7.jpg?tbpicau=2025-09-22-05_492a74721d2be35b494d022729ab3727", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344938&topic_name=%E4%BB%A5%E5%86%9B%E5%96%8A%E8%AF%9D%E8%BD%B0%E5%85%A8%E7%90%83%3A%E5%AF%BC%E5%BC%B9%E6%98%AF%E4%B8%8D%E9%95%BF%E7%9C%BC%E7%9A%84" - }, - { - "rank": 11, - "title": "照抄还耗时?紫龙延迟补偿抠到爆", - "desc": "《第七史诗》紫龙又拉了,都25年了居然在白天维护服务器长达11个小时。延长这么久不说,打发玩家2000体力就想当无事发生,最起码补个光暗自选吧?", - "abstract": "《第七史诗》紫龙又拉了,都25年了居然在白天维护服务器长达11个小时。延长这么久不说,打发玩家2000体力就想当无事发生,最起码补个光暗自选吧?", - "score": 316800, - "score_desc": "31.68w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=4c344da7c60a19d8cb56d74555c7babf/7a899e510fb30f24c22cf8158e95d143ad4b0375.jpg?tbpicau=2025-09-22-05_ea3299a237a4be90f638d6f54ddfaee7", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344939&topic_name=%E7%85%A7%E6%8A%84%E8%BF%98%E8%80%97%E6%97%B6%3F%E7%B4%AB%E9%BE%99%E5%BB%B6%E8%BF%9F%E8%A1%A5%E5%81%BF%E6%8A%A0%E5%88%B0%E7%88%86" - }, - { - "rank": 12, - "title": "苹果是懂得维护韩男自尊心的", - "desc": "苹果市场部很懂韩国国情,还特意把新机海报上的敏感手势去掉了。", - "abstract": "苹果市场部很懂韩国国情,还特意把新机海报上的敏感手势去掉了。", - "score": 296609, - "score_desc": "29.66w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=16bc6dd6c4025aafd3672d8b9dd09350/10dfa9ec8a136327a57fe925d78fa0ec08fac712.jpg?tbpicau=2025-09-22-05_6d1258c530ad80062d801a0cdf3878c4", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344930&topic_name=%E8%8B%B9%E6%9E%9C%E6%98%AF%E6%87%82%E5%BE%97%E7%BB%B4%E6%8A%A4%E9%9F%A9%E7%94%B7%E8%87%AA%E5%B0%8A%E5%BF%83%E7%9A%84" - }, - { - "rank": 13, - "title": "米家胜!二游大逃杀,原神未滑档", - "desc": "国内畅销榜上,一众作品竞逐热度之际,《原神》稳居前列,凭独特玩法持续圈粉。网友直言:原神团队定是藏着 “神人”,决策方向始终正确,精准踩中玩家心巴。", - "abstract": "国内畅销榜上,一众作品竞逐热度之际,《原神》稳居前列,凭独特玩法持续圈粉。网友直言:原神团队定是藏着 “神人”,决策方向始终正确,精准踩中玩家心巴。", - "score": 210780, - "score_desc": "21.08w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=606b285c9cb44aed591beda4d521bf35/f7246b600c3387440d8b046a170fd9f9d72aa05e.jpg?tbpicau=2025-09-22-05_ac66e09b0535bcca38158c54002fa3c7", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344927&topic_name=%E7%B1%B3%E5%AE%B6%E8%83%9C%21%E4%BA%8C%E6%B8%B8%E5%A4%A7%E9%80%83%E6%9D%80%2C%E5%8E%9F%E7%A5%9E%E6%9C%AA%E6%BB%91%E6%A1%A3" - }, - { - "rank": 14, - "title": "秽土转生失败,动漫之家GG", - "desc": "动漫之家,终究还是停运了。起初反复刷新,还以为是网络出了问题,没想到它已经走了有一会儿了。这个无数漫迷的 “秘密基地”,如今却在激烈竞争与种种困境中再也回不来了。", - "abstract": "动漫之家,终究还是停运了。起初反复刷新,还以为是网络出了问题,没想到它已经走了有一会儿了。这个无数漫迷的 “秘密基地”,如今却在激烈竞争与种种困境中再也回不来了。", - "score": 207264, - "score_desc": "20.73w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=0db5d97a563853438c9ad461f52e884a/bd315c6034a85edfb52ed4350f540923dd547501.jpg?tbpicau=2025-09-22-05_9adff68227c9f67304fffc1a2731d758", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344932&topic_name=%E7%A7%BD%E5%9C%9F%E8%BD%AC%E7%94%9F%E5%A4%B1%E8%B4%A5%2C%E5%8A%A8%E6%BC%AB%E4%B9%8B%E5%AE%B6GG" - }, - { - "rank": 15, - "title": "张本两连败大飞,日男全军覆没", - "desc": "WTT澳门冠军赛男单1/16决赛,薛飞把张本智和打静音,横扫日乒一哥晋级,至此日本男队全部出局,这下真爆冷了。", - "abstract": "WTT澳门冠军赛男单1/16决赛,薛飞把张本智和打静音,横扫日乒一哥晋级,至此日本男队全部出局,这下真爆冷了。", - "score": 179152, - "score_desc": "17.92w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=1be7d7b39743ad4ba67b1580e43f629b/0bd162d9f2d3572cd30bb6cacc13632762d0c33f.jpg?tbpicau=2025-09-22-05_c5e594913af43484029ee1ccf719ee0a", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344933&topic_name=%E5%BC%A0%E6%9C%AC%E4%B8%A4%E8%BF%9E%E8%B4%A5%E5%A4%A7%E9%A3%9E%2C%E6%97%A5%E7%94%B7%E5%85%A8%E5%86%9B%E8%A6%86%E6%B2%A1" - }, - { - "rank": 16, - "title": "拳愿323:抽象的征西派内战", - "desc": "拳愿奥米迦323话大更:征西派的裂痕与王马的抉择,爱德华回生能力过于劣质,雷庵表现力太逆天,怕不是要成为决赛圈垫脚石?", - "abstract": "拳愿奥米迦323话大更:征西派的裂痕与王马的抉择,爱德华回生能力过于劣质,雷庵表现力太逆天,怕不是要成为决赛圈垫脚石?", - "score": 144915, - "score_desc": "14.49w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=65d67ff6b103918fd7846e8a37001ea3/b17eca8065380cd797d28afbe744ad34588281d3.jpg?tbpicau=2025-09-22-05_d45822c1109107fa7baacd2b01fefb61", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344924&topic_name=%E6%8B%B3%E6%84%BF323%3A%E6%8A%BD%E8%B1%A1%E7%9A%84%E5%BE%81%E8%A5%BF%E6%B4%BE%E5%86%85%E6%88%98" - }, - { - "rank": 17, - "title": "TES 3-1踩头WBG,灯皇薇恩送好局", - "desc": "LPL季后赛,TES对阵WBG。Light薇恩0输出葬送优势局,Kanavi潘森天降弑神,最终TES 3-1 WBG挺进胜决。", - "abstract": "LPL季后赛,TES对阵WBG。Light薇恩0输出葬送优势局,Kanavi潘森天降弑神,最终TES 3-1 WBG挺进胜决。", - "score": 108556, - "score_desc": "10.86w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=75e5576c66a446237e9ff622fe1f4a3a/caef76094b36acaf361abbea3ad98d1001e99c29.jpg?tbpicau=2025-09-22-05_dda77f28de2da58e81fcd3b6ff5aaacc", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344917&topic_name=TES%203-1%E8%B8%A9%E5%A4%B4WBG%2C%E7%81%AF%E7%9A%87%E8%96%87%E6%81%A9%E9%80%81%E5%A5%BD%E5%B1%80" - }, - { - "rank": 18, - "title": "师出有名,黄岩岛建立保护区", - "desc": "字少事大,国务院批复同意新建黄岩岛国家级自然保护区,隔壁菲猴还敢乱来吗?", - "abstract": "字少事大,国务院批复同意新建黄岩岛国家级自然保护区,隔壁菲猴还敢乱来吗?", - "score": 98280, - "score_desc": "9.83w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=31dba91375fa828bd176cea39b227900/43a7d933c895d14320aec93535f082025baf07cf.jpg?tbpicau=2025-09-22-05_b0badf07bc38a792ed54b85bb056f5aa", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344916&topic_name=%E5%B8%88%E5%87%BA%E6%9C%89%E5%90%8D%2C%E9%BB%84%E5%B2%A9%E5%B2%9B%E5%BB%BA%E7%AB%8B%E4%BF%9D%E6%8A%A4%E5%8C%BA" - }, - { - "rank": 19, - "title": "9月10日乐子限定", - "desc": "沪姐大战彩礼女,年轻人为了台苹果机不择手段,来看看昨天都有哪些乐子。", - "abstract": "沪姐大战彩礼女,年轻人为了台苹果机不择手段,来看看昨天都有哪些乐子。", - "score": 75660, - "score_desc": "7.57w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=f4c1e0dce951f3dec3e7ea24f2d3c82b/c9fcc3cec3fdfc03fb92cbae923f8794a4c22639.jpg?tbpicau=2025-09-22-05_04534fa7edbe9fa62b6c5170f11f6d42", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344922&topic_name=9%E6%9C%8810%E6%97%A5%E4%B9%90%E5%AD%90%E9%99%90%E5%AE%9A" - }, - { - "rank": 20, - "title": "每天一个宝藏吧——meme图吧", - "desc": "一个用梗图交流、靠表情包续命的赛博快乐老家,进来一个meme图小白,出去就是万人敬仰的meme图大师!", - "abstract": "一个用梗图交流、靠表情包续命的赛博快乐老家,进来一个meme图小白,出去就是万人敬仰的meme图大师!", - "score": 64691, - "score_desc": "6.47w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=366db542454f78f0805ec9b31f0c3261/908fa0ec08fa513deb1747c87b6d55fbb2fbd963.jpg?tbpicau=2025-09-22-05_0f79439d4fa718dccec3909f1093b1a0", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344928&topic_name=%E6%AF%8F%E5%A4%A9%E4%B8%80%E4%B8%AA%E5%AE%9D%E8%97%8F%E5%90%A7%E2%80%94%E2%80%94meme%E5%9B%BE%E5%90%A7" - }, - { - "rank": 21, - "title": "向鹏不敌德国选手,无缘十六强", - "desc": "在2025年世界乒乓球职业大联盟澳门冠军赛男子单打首轮比赛中,中国选手向鹏2比3不敌德国选手弗朗西斯卡,无缘16强。", - "abstract": "在2025年世界乒乓球职业大联盟澳门冠军赛男子单打首轮比赛中,中国选手向鹏2比3不敌德国选手弗朗西斯卡,无缘16强。", - "score": 51010, - "score_desc": "5.1w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=5110a6270c90f60304e5cf075f2f8b2f/91529822720e0cf30c5864ed4c46f21fbe09aa7d.jpg?tbpicau=2025-09-22-05_6494ac6b728dc643d62ecdfec9ffc10f", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344931&topic_name=%E5%90%91%E9%B9%8F%E4%B8%8D%E6%95%8C%E5%BE%B7%E5%9B%BD%E9%80%89%E6%89%8B%2C%E6%97%A0%E7%BC%98%E5%8D%81%E5%85%AD%E5%BC%BA" - }, - { - "rank": 22, - "title": "Faker虐爆许秀,T1险胜DK", - "desc": "绝境Faker再现!T1 3-2险胜DK,决胜局T1凭借关键团战逆转取胜。", - "abstract": "绝境Faker再现!T1 3-2险胜DK,决胜局T1凭借关键团战逆转取胜。", - "score": 47646, - "score_desc": "4.76w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=9d867145b0246b607b5be1348dc52278/55e736d12f2eb938b8df55e493628535e5dd6f71.jpg?tbpicau=2025-09-22-05_a1bfae75faab275c23b0f53a0a5b06ef", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344913&topic_name=Faker%E8%99%90%E7%88%86%E8%AE%B8%E7%A7%80%2CT1%E9%99%A9%E8%83%9CDK" - }, - { - "rank": 23, - "title": "张雪峰愿捐款打台独,媒体狂吠狠批", - "desc": "张雪峰说打台独自己捐五千万,大象新闻直接来了个大长篇,上来就给一个普通中国人的朴素爱国情怀扣上“鼓吹战争”的帽子,搞媒体的就这种素质?", - "abstract": "张雪峰说打台独自己捐五千万,大象新闻直接来了个大长篇,上来就给一个普通中国人的朴素爱国情怀扣上“鼓吹战争”的帽子,搞媒体的就这种素质?", - "score": 40064, - "score_desc": "4.01w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=2e4fc1ec3dcb0a468577d8790d5ece10/00e93901213fb80e595042c170d12f2eb9389426.jpg?tbpicau=2025-09-22-05_6e078e9f935aa244e26346ab37187ee2", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344910&topic_name=%E5%BC%A0%E9%9B%AA%E5%B3%B0%E6%84%BF%E6%8D%90%E6%AC%BE%E6%89%93%E5%8F%B0%E7%8B%AC%2C%E5%AA%92%E4%BD%93%E7%8B%82%E5%90%A0%E7%8B%A0%E6%89%B9" - }, - { - "rank": 24, - "title": "美军压境,委内瑞拉急盼歼10C", - "desc": "美军F-35A压境加勒比,委内瑞拉方寸大乱,紧急寻求采购歼10C。", - "abstract": "美军F-35A压境加勒比,委内瑞拉方寸大乱,紧急寻求采购歼10C。", - "score": 38052, - "score_desc": "3.81w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=90d8a718f73533faf5e3c06eceeec52b/0e2442a7d933c8955843b66d971373f0820200e2.jpg?tbpicau=2025-09-22-05_f8126e747fe76e25cfd9b3d3a75d1d54", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344921&topic_name=%E7%BE%8E%E5%86%9B%E5%8E%8B%E5%A2%83%2C%E5%A7%94%E5%86%85%E7%91%9E%E6%8B%89%E6%80%A5%E7%9B%BC%E6%AD%BC10C" - }, - { - "rank": 25, - "title": "真男人!海贼王龙哥射杀天龙人", - "desc": "海贼王1160话情报,龙开枪射击天龙人,救下红发双胞胎。昔日流汗王风评反转,龙哥成为海贼最有种的男人。", - "abstract": "海贼王1160话情报,龙开枪射击天龙人,救下红发双胞胎。昔日流汗王风评反转,龙哥成为海贼最有种的男人。", - "score": 26682, - "score_desc": "2.67w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=f8cb34fbe5cc7cd9fa7867995f3c190b/a71ea8d3fd1f4134c36e2a68631f95cad1c85e4e.jpg?tbpicau=2025-09-22-05_6853585b745b7349ad45ef38cf6df62f", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344920&topic_name=%E7%9C%9F%E7%94%B7%E4%BA%BA%21%E6%B5%B7%E8%B4%BC%E7%8E%8B%E9%BE%99%E5%93%A5%E5%B0%84%E6%9D%80%E5%A4%A9%E9%BE%99%E4%BA%BA" - }, - { - "rank": 26, - "title": "三角洲免费送点券,玩家争当洲孝子", - "desc": "三角洲行动周年庆福利拉满,免费送3900三角券。玩家火速倒戈,暂停讨伐制作组,怒赞策划太良心。", - "abstract": "三角洲行动周年庆福利拉满,免费送3900三角券。玩家火速倒戈,暂停讨伐制作组,怒赞策划太良心。", - "score": 25255, - "score_desc": "2.53w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=c4d99672d2eef01f4d414b8586c3a111/9345d688d43f8794d4946738941b0ef41bd53ab8.jpg?tbpicau=2025-09-22-05_a2046d59aca4681d2f9495edce4c3b25", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344919&topic_name=%E4%B8%89%E8%A7%92%E6%B4%B2%E5%85%8D%E8%B4%B9%E9%80%81%E7%82%B9%E5%88%B8%2C%E7%8E%A9%E5%AE%B6%E4%BA%89%E5%BD%93%E6%B4%B2%E5%AD%9D%E5%AD%90" - }, - { - "rank": 27, - "title": "以空袭卡塔尔,暗杀哈马斯未得逞", - "desc": "以色列对身处卡塔尔首都多哈的哈马斯领导层发动所谓精准打击,并证实哈马斯5名成员死于以军空袭,但以方暗杀哈马斯高层的图谋未能得逞。", - "abstract": "以色列对身处卡塔尔首都多哈的哈马斯领导层发动所谓精准打击,并证实哈马斯5名成员死于以军空袭,但以方暗杀哈马斯高层的图谋未能得逞。", - "score": 20900, - "score_desc": "2.09w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=5eb82d27673fb80e0c84329750ec171a/314e251f95cad1c8f8d7dd31393e6709c93d51b3.jpg?tbpicau=2025-09-22-05_cf088fe88563cb500e0581d892800736", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344898&topic_name=%E4%BB%A5%E7%A9%BA%E8%A2%AD%E5%8D%A1%E5%A1%94%E5%B0%94%2C%E6%9A%97%E6%9D%80%E5%93%88%E9%A9%AC%E6%96%AF%E6%9C%AA%E5%BE%97%E9%80%9E" - }, - { - "rank": 28, - "title": "局座出山,战忽局要开工了?", - "desc": "神隐五年之后,被网友戏称“战略忽悠局局长”的军事评论家张召忠重出江湖参加讲座。国际局势风云变幻,战忽局还有市场吗?", - "abstract": "神隐五年之后,被网友戏称“战略忽悠局局长”的军事评论家张召忠重出江湖参加讲座。国际局势风云变幻,战忽局还有市场吗?", - "score": 20166, - "score_desc": "2.02w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=c4150e6a170fd9f9a04206294310ec1e/d4628535e5dde711bf0262e0e1efce1b9c1661d7.jpg?tbpicau=2025-09-22-05_f7db127146ec115d51ff7ede6261253e", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344903&topic_name=%E5%B1%80%E5%BA%A7%E5%87%BA%E5%B1%B1%2C%E6%88%98%E5%BF%BD%E5%B1%80%E8%A6%81%E5%BC%80%E5%B7%A5%E4%BA%86%3F" - }, - { - "rank": 29, - "title": "丝之歌光速滑跪,更新补丁降难度", - "desc": "《空洞骑士:丝之歌》游戏难度逆天差评不断,制作组官宣更新补丁,前期BOSS难度降低、奖励增加。", - "abstract": "《空洞骑士:丝之歌》游戏难度逆天差评不断,制作组官宣更新补丁,前期BOSS难度降低、奖励增加。", - "score": 14526, - "score_desc": "1.45w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=420c2d34f51bb0518f71e0685047e280/7acb0a46f21fbe098018e2022d600c338744ad66.jpg?tbpicau=2025-09-22-05_95664e9657ba0ab59a428fd9a3db30b7", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344899&topic_name=%E4%B8%9D%E4%B9%8B%E6%AD%8C%E5%85%89%E9%80%9F%E6%BB%91%E8%B7%AA%2C%E6%9B%B4%E6%96%B0%E8%A1%A5%E4%B8%81%E9%99%8D%E9%9A%BE%E5%BA%A6" - }, - { - "rank": 30, - "title": "倭殖入脑,武大再现逆天论文", - "desc": "近日,武汉大学又被挖出一篇关于”传统武士道精神下的女性形象“的逆天论文,武汉大学持续发力,吧友吐槽“武大的文科真是奇迹般的存在 ”", - "abstract": "近日,武汉大学又被挖出一篇关于”传统武士道精神下的女性形象“的逆天论文,武汉大学持续发力,吧友吐槽“武大的文科真是奇迹般的存在 ”", - "score": 13717, - "score_desc": "1.37w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=71b4b4adc1d6277fe94761784e052704/d8f9d72a6059252d229f3d12729b033b5bb5b918.jpg?tbpicau=2025-09-22-05_71986e04f0934ae41569ea8d11844675", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344905&topic_name=%E5%80%AD%E6%AE%96%E5%85%A5%E8%84%91%2C%E6%AD%A6%E5%A4%A7%E5%86%8D%E7%8E%B0%E9%80%86%E5%A4%A9%E8%AE%BA%E6%96%87" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/css/background.css deleted file mode 100755 index c7e0ed7d..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/css/background.css +++ /dev/null @@ -1,108 +0,0 @@ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; -} - -.green-gradient { - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 135deg, - rgba(0, 132, 255, 0.4) 0%, - rgba(0, 132, 255, 0.3) 25%, - rgba(0, 132, 255, 0.2) 50%, - rgba(0, 132, 255, 0.3) 75%, - rgba(0, 132, 255, 0.4) 100% - ); - animation: gradient-flow 20s ease-in-out infinite; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -.green-gradient::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: radial-gradient( - circle at 30% 70%, - rgba(139, 195, 74, 0.4) 0%, - transparent 50% - ), radial-gradient( - circle at 70% 30%, - rgba(102, 187, 106, 0.3) 0%, - transparent 50% - ); - animation: green-pulse 15s ease-in-out infinite alternate; -} - -@keyframes green-flow { - 0%, 100% { - transform: rotate(0deg) scale(1); - opacity: 0.8; - } - 25% { - transform: rotate(90deg) scale(1.1); - opacity: 0.6; - } - 50% { - transform: rotate(180deg) scale(0.9); - opacity: 0.9; - } - 75% { - transform: rotate(270deg) scale(1.05); - opacity: 0.7; - } -} - -@keyframes green-pulse { - 0% { - transform: scale(1) rotate(0deg); - opacity: 0.5; - } - 50% { - transform: scale(1.2) rotate(180deg); - opacity: 0.8; - } - 100% { - transform: scale(1) rotate(360deg); - opacity: 0.6; - } -} - -/* 手机端背景优化 */ -@media (max-width: 768px) { - .green-gradient { - animation-duration: 25s; - } - - .green-gradient::before { - animation-duration: 18s; - } -} - -/* 减少动画以节省电池 */ -@media (prefers-reduced-motion: reduce) { - .green-gradient, - .green-gradient::before { - animation: none; - } - - .green-gradient { - background: linear-gradient( - 135deg, - rgba(76, 175, 80, 0.2) 0%, - rgba(165, 214, 167, 0.1) 50%, - rgba(200, 230, 201, 0.15) 100% - ); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/css/style.css deleted file mode 100755 index 1b3fbd3c..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/css/style.css +++ /dev/null @@ -1,574 +0,0 @@ -/* 背景样式 */ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; - background-color: #f8f9fa; -} - -.modern-gradient { - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 135deg, - rgba(64, 169, 255, 0.4) 0%, - rgba(120, 192, 255, 0.3) 25%, - rgba(255, 175, 64, 0.2) 50%, - rgba(255, 140, 50, 0.3) 75%, - rgba(255, 122, 69, 0.4) 100% - ); - animation: gradient-flow 20s ease-in-out infinite; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -.modern-gradient::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: radial-gradient( - circle at 30% 70%, - rgba(64, 169, 255, 0.5) 0%, - transparent 50% - ), radial-gradient( - circle at 70% 30%, - rgba(255, 140, 50, 0.4) 0%, - transparent 50% - ); - animation: pulse-effect 15s ease-in-out infinite alternate; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -@keyframes gradient-flow { - 0%, 100% { - transform: rotate(0deg) scale(1); - opacity: 0.8; - } - 25% { - transform: rotate(90deg) scale(1.1); - opacity: 0.6; - } - 50% { - transform: rotate(180deg) scale(0.9); - opacity: 0.9; - } - 75% { - transform: rotate(270deg) scale(1.05); - opacity: 0.7; - } -} - -@keyframes pulse-effect { - 0% { - transform: scale(1) rotate(0deg); - opacity: 0.5; - } - 50% { - transform: scale(1.2) rotate(180deg); - opacity: 0.8; - } - 100% { - transform: scale(1) rotate(360deg); - opacity: 0.6; - } -} - -/* 主样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; - color: #333; - background-color: #f8f9fa; - position: relative; - min-height: 100vh; - line-height: 1.6; -} - -.container { - max-width: 800px; - margin: 0 auto; - padding: 24px; - position: relative; - z-index: 1; - background-color: rgba(255, 255, 255, 0.85); - border-radius: 16px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08); - backdrop-filter: blur(10px); -} - -header { - text-align: center; - margin-bottom: 28px; - padding-bottom: 20px; - border-bottom: 1px solid rgba(0, 0, 0, 0.06); -} - -header h1 { - background: linear-gradient(135deg, #4096ff, #ff7a45); - -webkit-background-clip: text; - background-clip: text; - color: transparent; - margin-bottom: 14px; - font-size: 2.4rem; - font-weight: 700; - letter-spacing: -0.5px; -} - -.update-time { - color: #666; - font-size: 0.9rem; - background-color: rgba(0, 0, 0, 0.03); - padding: 8px 16px; - border-radius: 24px; - display: inline-block; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); -} - -.hot-list { - list-style: none; -} - -.hot-item { - padding: 20px; - margin-bottom: 16px; - border-radius: 12px; - background-color: white; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04); - transition: all 0.3s ease; - display: flex; - align-items: center; - border: 1px solid rgba(0, 0, 0, 0.03); -} - -.hot-item:hover { - transform: translateY(-3px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); - border-color: rgba(64, 169, 255, 0.3); -} - -.hot-rank { - font-size: 1.2rem; - font-weight: bold; - color: #4096ff; - margin-right: 18px; - min-width: 38px; - text-align: center; - background-color: rgba(64, 169, 255, 0.1); - border-radius: 50%; - width: 38px; - height: 38px; - display: flex; - align-items: center; - justify-content: center; -} - -.hot-rank.top-1 { - background: linear-gradient(135deg, #ff4d4f, #ff7a45); - color: white; -} - -.hot-rank.top-2 { - background: linear-gradient(135deg, #ff7a45, #ffa940); - color: white; -} - -.hot-rank.top-3 { - background: linear-gradient(135deg, #ffa940, #ffec3d); - color: white; -} - -.hot-content { - flex: 1; -} - -.hot-title { - font-size: 1.15rem; - margin-bottom: 8px; - color: #333; - text-decoration: none; - display: block; - line-height: 1.5; - font-weight: 500; - transition: color 0.2s ease; -} - -.hot-title:hover { - color: #4096ff; - text-decoration: none; -} - -.loading { - text-align: center; - padding: 40px; - color: #666; - font-size: 1.1rem; -} - -footer { - text-align: center; - margin-top: 30px; - padding-top: 20px; - border-top: 1px solid rgba(0, 0, 0, 0.06); - color: #666; - font-size: 0.9rem; -} - -/* 新增样式 */ -.topic-header { - display: flex; - flex-wrap: wrap; - align-items: flex-start; - width: 100%; -} - -/* 短内容时的布局 - 图片在右侧 */ -.topic-header.short-content { - flex-direction: row; -} - -/* 长内容时的布局 - 图片在下方 */ -.topic-header.long-content { - flex-direction: column; -} - -.topic-rank { - font-size: 1.2rem; - font-weight: bold; - color: #4096ff; - margin-right: 16px; - min-width: 36px; - text-align: center; - background-color: rgba(64, 169, 255, 0.1); - border-radius: 50%; - width: 36px; - height: 36px; - display: flex; - align-items: center; - justify-content: center; -} - -.topic-rank.top-1 { - background: linear-gradient(135deg, #ff4d4f, #ff7a45); - color: white; -} - -.topic-rank.top-2 { - background: linear-gradient(135deg, #ff7a45, #ffa940); - color: white; -} - -.topic-rank.top-3 { - background: linear-gradient(135deg, #ffa940, #ffec3d); - color: white; -} - -.topic-content { - flex: 1; - padding-right: 16px; -} - -.topic-title { - font-size: 1.15rem; - margin-bottom: 8px; - color: #333; - text-decoration: none; - display: block; - line-height: 1.5; - font-weight: 600; - transition: color 0.2s ease; -} - -.topic-title:hover { - color: #4096ff; -} - -.topic-detail { - color: #666; - font-size: 0.95rem; - line-height: 1.6; - margin-bottom: 10px; - text-align: justify; - text-indent: 2em; -} - -.topic-stats { - display: flex; - flex-wrap: wrap; - gap: 12px; - margin-top: 8px; - font-size: 0.85rem; - color: #666; -} - -.stat-item { - display: flex; - align-items: center; -} - -.hot-value { - color: #ff4d4f; - font-weight: 500; -} - -/* 短内容时的图片样式 - 在右侧 */ -.short-content .topic-cover { - width: 120px; - height: 80px; - object-fit: cover; - border-radius: 8px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); - align-self: center; - margin-left: auto; -} - -/* 长内容时的图片样式 - 在下方 */ -.long-content .topic-cover { - width: 100%; - height: auto; - max-height: none; - object-fit: contain; - border-radius: 8px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); - margin-top: 12px; - margin-left: 0; - margin-bottom: 8px; -} - -.topic-item { - padding: 20px; - margin-bottom: 16px; - border-radius: 12px; - background-color: white; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04); - transition: all 0.3s ease; - border: 1px solid rgba(0, 0, 0, 0.03); -} - -.topic-item:hover { - transform: translateY(-3px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); - border-color: rgba(64, 169, 255, 0.3); -} - -/* 响应式设计 */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - max-width: 90%; - padding: 20px; - } - - header h1 { - font-size: 2.2rem; - } - - .topic-item { - padding: 18px; - } - - .topic-title { - font-size: 1.1rem; - } - - .topic-cover { - width: 100px; - height: 70px; - } -} - -@media (max-width: 768px) { - body { - background-color: #f8f9fa; - } - - .container { - max-width: 95%; - margin: 12px auto; - padding: 16px; - border-radius: 12px; - } - - header { - margin-bottom: 20px; - padding-bottom: 16px; - } - - header h1 { - font-size: 1.8rem; - margin-bottom: 10px; - } - - .update-time { - font-size: 0.85rem; - padding: 6px 12px; - } - - .topic-item { - padding: 16px; - margin-bottom: 12px; - border-radius: 10px; - } - - .topic-rank { - font-size: 1.1rem; - margin-right: 14px; - min-width: 32px; - width: 32px; - height: 32px; - } - - .topic-title { - font-size: 1rem; - line-height: 1.5; - margin-bottom: 6px; - } - - .topic-cover { - width: 90px; - height: 65px; - } - - footer { - margin-top: 24px; - padding-top: 16px; - font-size: 0.85rem; - } -} - -@media (max-width: 480px) { - body { - overflow-x: hidden; - } - - .container { - margin: 8px; - padding: 12px; - max-width: calc(100vw - 16px); - width: calc(100vw - 16px); - } - - header { - margin-bottom: 20px; - padding-bottom: 16px; - } - - header h1 { - font-size: 1.5rem; - margin-bottom: 10px; - } - - .update-time { - font-size: 0.8rem; - padding: 6px 12px; - } - - .topic-item { - padding: 14px; - margin-bottom: 12px; - width: 100%; - min-width: 0; - } - - .topic-header { - width: 100%; - min-width: 0; - } - - .topic-rank { - font-size: 1rem; - margin-right: 12px; - min-width: 30px; - width: 30px; - height: 30px; - flex-shrink: 0; - } - - .topic-content { - flex: 1; - min-width: 0; - padding-right: 12px; - } - - .topic-title { - font-size: 0.95rem; - line-height: 1.4; - word-break: break-all; - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - } - - .topic-detail { - font-size: 0.85rem; - line-height: 1.5; - margin-bottom: 8px; - word-break: break-all; - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - } - - .topic-stats { - gap: 8px; - font-size: 0.75rem; - flex-wrap: wrap; - } - - .short-content .topic-cover { - width: 70px; - height: 50px; - flex-shrink: 0; - } - - .long-content .topic-cover { - width: 100%; - max-width: 100%; - height: auto; - margin-top: 10px; - } - - .loading { - padding: 30px; - font-size: 1rem; - } - - footer { - margin-top: 20px; - padding-top: 16px; - font-size: 0.8rem; - } -} - -/* 减少动画以节省电池 */ -@media (prefers-reduced-motion: reduce) { - .modern-gradient, - .modern-gradient::before { - animation: none; - } - - .modern-gradient { - background: linear-gradient( - 135deg, - rgba(64, 169, 255, 0.3) 0%, - rgba(255, 175, 64, 0.2) 50%, - rgba(255, 122, 69, 0.25) 100% - ); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/img/zhihu-logo.svg b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/img/zhihu-logo.svg deleted file mode 100755 index a285cef5..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/img/zhihu-logo.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/index.html deleted file mode 100755 index 89d366ab..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/index.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - 知乎热门话题 - - - - -
    -
    -
    - -
    -
    -

    知乎热门话题

    -
    -
    - -
    -
    -
    加载中...
    -
    -
    - -
    -

    数据来源于知乎热门话题

    -
    -
    - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/js/main.js b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/js/main.js deleted file mode 100755 index a22bf485..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/js/main.js +++ /dev/null @@ -1,159 +0,0 @@ -// API接口列表 -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top/v2/zhihu", -]; - -// 当前使用的API索引 -let currentApiIndex = 0; - -// DOM元素 -const topicListElement = document.getElementById('topicList'); -const updateTimeElement = document.getElementById('updateTime'); - -// 格式化时间 -function formatDate(date) { - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - - return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; -} - -// 格式化数字 -function formatNumber(num) { - if (num >= 10000) { - return (num / 10000).toFixed(1) + '万'; - } - return num.toString(); -} - -// 渲染话题列表 -function renderTopicList(data) { - topicListElement.innerHTML = ''; - - data.forEach((item, index) => { - const topicItem = document.createElement('div'); - topicItem.className = 'topic-item'; - - const rankClass = index < 3 ? `top-${index + 1}` : ''; - - // 处理封面图片 - const coverImg = item.cover ? - `话题封面` : ''; - - // 判断文本内容长度,决定图片位置 - // 如果detail存在且长度较长,或者没有detail但标题较长,则图片放在下方 - const detailLength = item.detail ? item.detail.length : 0; - const titleLength = item.title ? item.title.length : 0; - const isLongContent = detailLength > 100 || (detailLength === 0 && titleLength > 30); - - // 根据内容长度决定布局类名 - const layoutClass = isLongContent ? 'long-content' : 'short-content'; - - topicItem.innerHTML = ` -
    -
    ${index + 1}
    -
    - 🔥 ${item.title} - ${item.detail ? `
    ${item.detail}
    ` : ''} -
    - ${item.hot_value_desc ? `
    🔥 ${item.hot_value_desc}
    ` : ''} - ${item.answer_cnt ? `
    💬 ${formatNumber(item.answer_cnt)} 回答
    ` : ''} - ${item.follower_cnt ? `
    👥 ${formatNumber(item.follower_cnt)} 关注
    ` : ''} -
    -
    - ${coverImg} -
    `; - - topicListElement.appendChild(topicItem); - }); - - // 更新时间 - updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`; -} - -// 显示加载状态 -function showLoading() { - topicListElement.innerHTML = '
    加载中...
    '; -} - -// 显示错误状态 -function showError(message) { - topicListElement.innerHTML = `
    ${message}
    `; -} - -// 获取知乎热门话题数据 -async function fetchZhihuTopics() { - showLoading(); - - try { - const response = await fetch(API_ENDPOINTS[currentApiIndex]); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const result = await response.json(); - - if (result.code === 200 && result.data && Array.isArray(result.data)) { - if (result.data.length > 0) { - renderTopicList(result.data); - } else { - showError('暂无热门话题数据'); - } - } else { - throw new Error('数据格式错误或无数据'); - } - } catch (error) { - console.error('获取数据失败:', error); - - // 尝试切换到下一个API - const nextApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; - - if (nextApiIndex !== 0) { - // 还有其他API可以尝试 - currentApiIndex = nextApiIndex; - showError('获取数据失败,正在尝试其他接口...'); - - // 延迟后重试 - setTimeout(fetchZhihuTopics, 2000); - } else { - // 所有API都尝试过了 - currentApiIndex = 0; - showError('所有接口都无法访问,请稍后再试'); - } - } -} - -// 手动刷新数据 -function refreshData() { - currentApiIndex = 0; // 重置API索引 - fetchZhihuTopics(); -} - -// 页面加载完成后获取数据 -document.addEventListener('DOMContentLoaded', () => { - fetchZhihuTopics(); - - // 每隔5分钟刷新一次数据 - setInterval(fetchZhihuTopics, 5 * 60 * 1000); - - // 添加键盘快捷键支持(按R键刷新) - document.addEventListener('keydown', (event) => { - if (event.key === 'r' || event.key === 'R') { - event.preventDefault(); - refreshData(); - } - }); -}); - -// 页面可见性变化时的处理 -document.addEventListener('visibilitychange', () => { - if (!document.hidden) { - // 页面重新可见时刷新数据 - refreshData(); - } -}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/接口集合.json b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/接口集合.json deleted file mode 100755 index 42245813..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top" -] diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/返回接口.json deleted file mode 100755 index 1c9e1df8..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/返回接口.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "title": "你是什么时候意识到抗日战争很艰难的?", - "detail": "就不像抗日神剧", - "cover": "https://picx.zhimg.com/v2-a07a53b2e23887c7a2440cc3f1984122.png", - "hot_value_desc": "1311 万热度", - "answer_cnt": 739, - "follower_cnt": 1739, - "comment_cnt": 0, - "created_at": 1622774952000, - "created": "2021/06/04 10:49:12", - "link": "https://api.zhihu.com/questions/463076881" - }, - { - "title": "为什么中国在很多领域都要求自主研发?", - "detail": "中国在很多领域都要求自主研发,似乎确认很多东西都有个中国版本,真有这个必要吗?", - "cover": "https://pic3.zhimg.com/80/v2-bb4dfa56f138980078da003df436e661_hd.png", - "hot_value_desc": "816 万热度", - "answer_cnt": 2476, - "follower_cnt": 12545, - "comment_cnt": 0, - "created_at": 1352205751000, - "created": "2012/11/06 20:42:31", - "link": "https://api.zhihu.com/questions/20579464" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/background.css deleted file mode 100755 index 410d31b7..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/background.css +++ /dev/null @@ -1,128 +0,0 @@ -/* 网易云音乐特色背景样式 */ -body { - background: linear-gradient(135deg, #2b2b2b 0%, #1e1e1e 50%, #2b2b2b 100%); - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; - position: relative; - color: #fff; -} - -/* 背景渐变动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 网易云红色装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(236, 65, 65, 0.15) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(236, 65, 65, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(236, 65, 65, 0.08) 0%, transparent 50%); - pointer-events: none; - z-index: -2; -} - -/* 音符装饰效果 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(236, 65, 65, 0.4), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(236, 65, 65, 0.3), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(236, 65, 65, 0.4), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(236, 65, 65, 0.3), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(236, 65, 65, 0.4), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: particleFloat 20s linear infinite; - pointer-events: none; - z-index: -1; - opacity: 0.6; -} - -/* 音符浮动动画 */ -@keyframes particleFloat { - 0% { - transform: translateY(0px); - } - 100% { - transform: translateY(-100px); - } -} - -/* 音符装饰 */ -.music-note { - position: absolute; - font-size: 24px; - color: rgba(236, 65, 65, 0.3); - animation: floatNote 15s linear infinite; - z-index: -1; -} - -@keyframes floatNote { - 0% { - transform: translateY(0) rotate(0deg); - opacity: 0; - } - 10% { - opacity: 0.8; - } - 90% { - opacity: 0.8; - } - 100% { - transform: translateY(-100vh) rotate(360deg); - opacity: 0; - } -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - body::after { - background-size: 150px 75px; - animation-duration: 25s; - } -} - -@media (max-width: 480px) { - body::after { - background-size: 100px 50px; - animation-duration: 30s; - opacity: 0.4; - } -} - -/* 高性能模式 - 减少动画 */ -@media (prefers-reduced-motion: reduce) { - body { - animation: none; - background: linear-gradient(135deg, #2b2b2b 0%, #1e1e1e 50%, #2b2b2b 100%); - } - - body::after { - animation: none; - } - - .music-note { - animation: none; - display: none; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/responsive.css b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/responsive.css deleted file mode 100755 index b98956ef..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/responsive.css +++ /dev/null @@ -1,194 +0,0 @@ -/* 响应式样式 - 适配不同设备 */ - -/* 基础样式 - 移动设备优先 */ -.container { - width: 95%; - padding: 15px; - margin: 10px auto; -} - -header h1 { - font-size: 1.5rem; -} - -.update-time { - font-size: 0.8rem; - padding: 6px 12px; -} - -.rank-list { - grid-template-columns: 1fr; - gap: 16px; - margin-top: 15px; -} - -.rank-item { - border-radius: 10px; -} - -.rank-cover { - height: 160px; -} - -.rank-info { - padding: 12px; -} - -.rank-name { - font-size: 1rem; - margin-bottom: 6px; -} - -.rank-desc { - font-size: 0.85rem; - margin-bottom: 10px; - -webkit-line-clamp: 2; -} - -.rank-meta { - font-size: 0.75rem; - margin-bottom: 10px; -} - -.rank-link { - padding: 6px 14px; - font-size: 0.85rem; -} - -/* 平板设备 */ -@media screen and (min-width: 768px) { - .container { - width: 90%; - padding: 20px; - margin: 15px auto; - } - - header h1 { - font-size: 1.8rem; - } - - .update-time { - font-size: 0.85rem; - padding: 7px 14px; - } - - .rank-list { - grid-template-columns: repeat(2, 1fr); - gap: 20px; - margin-top: 20px; - } - - .rank-cover { - height: 170px; - } - - .rank-info { - padding: 15px; - } - - .rank-name { - font-size: 1.1rem; - margin-bottom: 8px; - } - - .rank-desc { - font-size: 0.9rem; - margin-bottom: 12px; - -webkit-line-clamp: 3; - } - - .rank-meta { - font-size: 0.8rem; - } - - .rank-link { - padding: 7px 16px; - font-size: 0.9rem; - } - - .loading-spinner { - width: 60px; - height: 60px; - } -} - -/* 桌面设备 */ -@media screen and (min-width: 1024px) { - .container { - width: 85%; - max-width: 1200px; - margin: 20px auto; - } - - header h1 { - font-size: 2.2rem; - } - - .update-time { - font-size: 0.9rem; - padding: 8px 16px; - } - - .rank-list { - grid-template-columns: repeat(3, 1fr); - gap: 24px; - margin-top: 25px; - } - - .rank-cover { - height: 180px; - } - - .rank-info { - padding: 18px; - } - - .rank-name { - font-size: 1.2rem; - margin-bottom: 10px; - } - - .rank-desc { - font-size: 0.95rem; - margin-bottom: 15px; - } - - .rank-meta { - font-size: 0.85rem; - margin-bottom: 15px; - } - - .rank-link { - padding: 8px 18px; - font-size: 0.95rem; - } -} - -/* 大屏幕设备 */ -@media screen and (min-width: 1440px) { - .container { - max-width: 1400px; - } - - .rank-list { - grid-template-columns: repeat(4, 1fr); - gap: 30px; - } - - .rank-cover { - height: 200px; - } - - .rank-name { - font-size: 1.25rem; - } - - .rank-desc { - font-size: 1rem; - } - - .rank-link { - padding: 10px 20px; - font-size: 1rem; - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/style.css deleted file mode 100755 index 2aa56ff2..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/style.css +++ /dev/null @@ -1,474 +0,0 @@ -/* 背景样式 */ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; - background-color: #f8f9fa; -} - -.modern-gradient { - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 135deg, - rgba(64, 169, 255, 0.4) 0%, - rgba(120, 192, 255, 0.3) 25%, - rgba(255, 175, 64, 0.2) 50%, - rgba(255, 140, 50, 0.3) 75%, - rgba(255, 122, 69, 0.4) 100% - ); - animation: gradient-flow 20s ease-in-out infinite; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -.modern-gradient::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: radial-gradient( - circle at 30% 70%, - rgba(64, 169, 255, 0.5) 0%, - transparent 50% - ), radial-gradient( - circle at 70% 30%, - rgba(255, 140, 50, 0.4) 0%, - transparent 50% - ); - animation: pulse-effect 15s ease-in-out infinite alternate; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -@keyframes gradient-flow { - 0%, 100% { - transform: rotate(0deg) scale(1); - opacity: 0.8; - } - 25% { - transform: rotate(90deg) scale(1.1); - opacity: 0.6; - } - 50% { - transform: rotate(180deg) scale(0.9); - opacity: 0.9; - } - 75% { - transform: rotate(270deg) scale(1.05); - opacity: 0.7; - } -} - -@keyframes pulse-effect { - 0% { - transform: scale(1) rotate(0deg); - opacity: 0.5; - } - 50% { - transform: scale(1.2) rotate(180deg); - opacity: 0.8; - } - 100% { - transform: scale(1) rotate(360deg); - opacity: 0.6; - } -} - -/* 主样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; - color: #333; - background-color: #f8f9fa; - position: relative; - min-height: 100vh; - overflow-x: hidden; - line-height: 1.6; -} - -.container { - max-width: 800px; - margin: 0 auto; - padding: 24px; - position: relative; - z-index: 1; - background-color: rgba(255, 255, 255, 0.85); - border-radius: 16px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08); - backdrop-filter: blur(10px); - position: relative; -} - -header { - text-align: center; - margin-bottom: 28px; - padding-bottom: 20px; - border-bottom: 1px solid rgba(0, 0, 0, 0.06); -} - -header h1 { - background: linear-gradient(135deg, #4096ff, #ff7a45); - -webkit-background-clip: text; - background-clip: text; - color: transparent; - margin-bottom: 14px; - font-size: 2.4rem; - font-weight: 700; - letter-spacing: -0.5px; -} - -.update-time { - color: #666; - font-size: 0.9rem; - background-color: rgba(0, 0, 0, 0.03); - padding: 8px 16px; - border-radius: 24px; - display: inline-block; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); -} - -.rank-list { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); - gap: 24px; - margin-top: 20px; -} - -.rank-item { - background-color: white; - border-radius: 12px; - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08); - overflow: hidden; - transition: all 0.3s ease; - display: flex; - flex-direction: column; - border: 1px solid rgba(0, 0, 0, 0.05); -} - -.rank-item:hover { - transform: translateY(-5px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); - border-color: rgba(236, 65, 65, 0.3); -} - -.rank-cover { - position: relative; - height: 180px; - overflow: hidden; -} - -.rank-cover img { - width: 100%; - height: 100%; - object-fit: cover; - transition: transform 0.5s ease; -} - -.rank-item:hover .rank-cover img { - transform: scale(1.05); -} - -.rank-update { - position: absolute; - bottom: 0; - right: 0; - background: rgba(236, 65, 65, 0.8); - color: white; - padding: 4px 10px; - font-size: 0.8rem; - border-top-left-radius: 8px; -} - -.rank-info { - padding: 16px; - flex: 1; - display: flex; - flex-direction: column; -} - -.rank-name { - font-size: 1.2rem; - font-weight: 600; - margin-bottom: 8px; - color: #333; -} - -.rank-desc { - font-size: 0.9rem; - color: #666; - margin-bottom: 12px; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; - flex: 1; -} - -.rank-meta { - font-size: 0.8rem; - color: #999; - margin-bottom: 12px; -} - -.rank-link { - display: inline-block; - background: linear-gradient(135deg, #ec4141, #ff7a45); - color: white; - text-decoration: none; - padding: 8px 16px; - border-radius: 20px; - font-size: 0.9rem; - text-align: center; - transition: all 0.3s ease; - box-shadow: 0 2px 8px rgba(236, 65, 65, 0.3); -} - -.rank-link:hover { - background: linear-gradient(135deg, #d73435, #f06937); - box-shadow: 0 4px 12px rgba(236, 65, 65, 0.4); - transform: translateY(-2px); -} - -.hot-title { - font-size: 1.15rem; - margin-bottom: 8px; - color: #333; - text-decoration: none; - display: block; - line-height: 1.5; - font-weight: 500; - transition: color 0.2s ease; -} - -.hot-title:hover { - color: #4096ff; - text-decoration: none; -} - -.loading { - text-align: center; - padding: 40px; - color: #666; - font-size: 1.1rem; -} - -.loading-spinner { - display: inline-block; - width: 50px; - height: 50px; - border: 3px solid rgba(236, 65, 65, 0.3); - border-radius: 50%; - border-top-color: #ec4141; - animation: spin 1s ease-in-out infinite; - margin-bottom: 16px; -} - -@keyframes spin { - to { transform: rotate(360deg); } -} - -.error-message { - text-align: center; - padding: 40px; - color: #ff4d4f; - font-size: 1.1rem; -} - -.retry-button { - background: #ec4141; - color: white; - border: none; - padding: 8px 20px; - border-radius: 20px; - font-size: 0.9rem; - margin-top: 16px; - cursor: pointer; - transition: all 0.3s ease; -} - -.retry-button:hover { - background: #d73435; - box-shadow: 0 2px 8px rgba(236, 65, 65, 0.4); -} - -footer { - text-align: center; - margin-top: 30px; - padding-top: 20px; - border-top: 1px solid rgba(0, 0, 0, 0.06); - color: #666; - font-size: 0.9rem; -} - -/* 音符装饰样式 */ -.music-note { - position: fixed; - font-size: 24px; - color: rgba(236, 65, 65, 0.6); - z-index: 0; - pointer-events: none; - animation: floatNote 20s linear infinite; - text-shadow: 0 0 5px rgba(255, 255, 255, 0.7); -} - -@keyframes floatNote { - 0% { - transform: translateY(0) rotate(0deg); - opacity: 0.7; - } - 50% { - transform: translateY(-100px) rotate(180deg); - opacity: 0.9; - } - 100% { - transform: translateY(-200px) rotate(360deg); - opacity: 0; - } -} - -/* 响应式设计 */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - max-width: 90%; - padding: 20px; - } - - header h1 { - font-size: 2.2rem; - } - - .hot-item { - padding: 18px; - } - - .hot-title { - font-size: 1.1rem; - } - - .music-note { - font-size: 22px; - } -} - -@media (max-width: 768px) { - body { - background-color: #f8f9fa; - } - - .container { - max-width: 95%; - margin: 12px auto; - padding: 16px; - border-radius: 12px; - } - - header { - margin-bottom: 20px; - padding-bottom: 16px; - } - - header h1 { - font-size: 1.8rem; - margin-bottom: 10px; - } - - .update-time { - font-size: 0.85rem; - padding: 6px 12px; - } - - .hot-item { - padding: 16px; - margin-bottom: 12px; - border-radius: 10px; - flex-direction: row; - align-items: flex-start; - } - - .hot-rank { - font-size: 1.1rem; - margin-right: 14px; - min-width: 32px; - width: 32px; - height: 32px; - margin-top: 2px; - } - - .hot-title { - font-size: 1rem; - line-height: 1.5; - margin-bottom: 6px; - } - - footer { - margin-top: 24px; - padding-top: 16px; - font-size: 0.85rem; - } - - .music-note { - font-size: 20px; - } -} - -@media (max-width: 480px) { - .container { - margin: 8px auto; - padding: 14px; - } - - header h1 { - font-size: 1.6rem; - } - - .hot-item { - padding: 14px; - margin-bottom: 10px; - } - - .hot-rank { - font-size: 1rem; - margin-right: 12px; - min-width: 30px; - width: 30px; - height: 30px; - } - - .hot-title { - font-size: 0.95rem; - } - - .music-note { - font-size: 16px; - } -} - -/* 减少动画以节省电池 */ -@media (prefers-reduced-motion: reduce) { - .modern-gradient, - .modern-gradient::before { - animation: none; - } - - .modern-gradient { - background: linear-gradient( - 135deg, - rgba(64, 169, 255, 0.3) 0%, - rgba(255, 175, 64, 0.2) 50%, - rgba(255, 122, 69, 0.25) 100% - ); - } -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/index.html deleted file mode 100755 index de5314fe..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - 网易云音乐榜单 - InfoGenie - - - - - - - -
    -
    -
    - - -
    - -
    -
    -

    网易云音乐榜单

    -
    加载中...
    -
    - -
    -
    -
    -

    正在加载榜单数据...

    -
    - - - - -
    - -
    -

    数据来源:网易云音乐官方API

    -

    © 2024 InfoGenie - 网易云音乐榜单

    -
    -
    - - - - \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/js/app.js b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/js/app.js deleted file mode 100755 index 7ef9c24c..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/js/app.js +++ /dev/null @@ -1,252 +0,0 @@ -/** - * 网易云音乐榜单 - 主应用脚本 - * 功能:获取API数据、渲染榜单、处理错误、自动切换API接口 - */ - -// 全局变量 -const apiUrls = []; -let currentApiIndex = 0; -let rankData = null; - -// DOM元素 -const loadingElement = document.getElementById('loading'); -const errorElement = document.getElementById('error-message'); -const rankListElement = document.getElementById('rank-list'); -const updateTimeElement = document.getElementById('update-time'); -const retryButton = document.getElementById('retry-button'); - -// 初始化函数 -async function init() { - try { - // 获取API接口列表 - await loadApiUrls(); - - // 获取榜单数据 - await fetchRankData(); - - // 添加音符装饰 - createMusicNotes(); - } catch (error) { - console.error('初始化失败:', error); - showError(); - } -} - -// 加载API接口列表 -async function loadApiUrls() { - try { - const response = await fetch('./接口集合.json'); - if (!response.ok) { - throw new Error('无法加载API接口列表'); - } - const data = await response.json(); - if (Array.isArray(data) && data.length > 0) { - apiUrls.push(...data); - console.log('已加载API接口列表:', apiUrls); - } else { - throw new Error('API接口列表为空'); - } - } catch (error) { - console.error('加载API接口列表失败:', error); - // 使用默认API - apiUrls.push('https://60s.api.shumengya.top/v2/ncm-rank'); - } -} - -// 获取榜单数据 -async function fetchRankData() { - showLoading(); - - // 如果没有API接口,显示错误 - if (apiUrls.length === 0) { - throw new Error('没有可用的API接口'); - } - - try { - const apiUrl = apiUrls[currentApiIndex]; - const response = await fetch(apiUrl); - - if (!response.ok) { - throw new Error(`API请求失败: ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data && Array.isArray(data.data)) { - rankData = data; - renderRankList(data.data); - updateLastUpdateTime(data); - hideLoading(); - } else { - throw new Error('API返回数据格式错误'); - } - } catch (error) { - console.error('获取榜单数据失败:', error); - // 尝试切换到下一个API - if (tryNextApi()) { - return fetchRankData(); - } else { - showError(); - } - } -} - -// 尝试切换到下一个API -function tryNextApi() { - if (currentApiIndex < apiUrls.length - 1) { - currentApiIndex++; - console.log(`切换到下一个API: ${apiUrls[currentApiIndex]}`); - return true; - } - return false; -} - -// 渲染榜单列表 -function renderRankList(ranks) { - if (!Array.isArray(ranks) || ranks.length === 0) { - showError('没有榜单数据'); - return; - } - - rankListElement.innerHTML = ''; - - ranks.forEach(rank => { - const rankItem = document.createElement('div'); - rankItem.className = 'rank-item'; - - // 构建榜单项HTML - rankItem.innerHTML = ` -
    - ${rank.name} -
    ${rank.update_frequency || '定期更新'}
    -
    -
    -

    ${rank.name}

    -

    ${rank.description || '暂无描述'}

    -
    - 更新: ${formatDate(rank.updated)} -
    - 查看详情 -
    - `; - - rankListElement.appendChild(rankItem); - }); - - rankListElement.style.display = 'grid'; -} - -// 更新最后更新时间 -function updateLastUpdateTime(data) { - if (data && data.data && data.data.length > 0) { - const latestRank = data.data.reduce((latest, current) => { - const latestDate = latest.updated_at || 0; - const currentDate = current.updated_at || 0; - return currentDate > latestDate ? current : latest; - }, data.data[0]); - - if (latestRank && latestRank.updated) { - updateTimeElement.textContent = `最近更新: ${formatDate(latestRank.updated)}`; - } else { - updateTimeElement.textContent = '数据已更新'; - } - } -} - -// 格式化日期 -function formatDate(dateStr) { - if (!dateStr) return '未知'; - - try { - const date = new Date(dateStr.replace('2025-', '2024-')); - if (isNaN(date.getTime())) return dateStr; - - return date.toLocaleDateString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit' - }).replace(/\//g, '-'); - } catch (e) { - return dateStr; - } -} - -// 创建音符装饰 -function createMusicNotes() { - const notesContainer = document.getElementById('music-notes-container'); - const notes = ['♪', '♫', '♬', '♩', '♭', '♮']; - const containerWidth = window.innerWidth; - const containerHeight = window.innerHeight; - - // 清空容器 - notesContainer.innerHTML = ''; - - // 创建15个音符 - for (let i = 0; i < 15; i++) { - const note = document.createElement('div'); - note.className = 'music-note'; - note.textContent = notes[Math.floor(Math.random() * notes.length)]; - - // 随机位置 - const left = Math.random() * containerWidth; - const top = Math.random() * containerHeight; - - // 随机动画延迟 - const delay = Math.random() * 20; - const duration = 15 + Math.random() * 15; - - // 设置样式 - note.style.left = `${left}px`; - note.style.top = `${top}px`; - note.style.animationDelay = `${delay}s`; - note.style.animationDuration = `${duration}s`; - - notesContainer.appendChild(note); - } -} - -// 显示加载中 -function showLoading() { - loadingElement.style.display = 'block'; - errorElement.style.display = 'none'; - rankListElement.style.display = 'none'; -} - -// 隐藏加载中 -function hideLoading() { - loadingElement.style.display = 'none'; -} - -// 显示错误信息 -function showError(message = '加载失败,请稍后再试') { - loadingElement.style.display = 'none'; - errorElement.querySelector('p').textContent = message; - errorElement.style.display = 'block'; -} - -// 重试按钮点击事件 -retryButton.addEventListener('click', () => { - // 重置API索引 - currentApiIndex = 0; - // 重新获取数据 - fetchRankData(); -}); - -// 窗口大小改变时重新创建音符 -window.addEventListener('resize', debounce(createMusicNotes, 300)); - -// 防抖函数 -function debounce(func, wait) { - let timeout; - return function() { - const context = this; - const args = arguments; - clearTimeout(timeout); - timeout = setTimeout(() => func.apply(context, args), wait); - }; -} - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', init); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/接口集合.json b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/接口集合.json deleted file mode 100755 index 11b7262a..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/接口集合.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://60s.api.shumengya.top/v2/ncm-rank" -] diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/返回接口.json deleted file mode 100755 index 3eccd9d0..00000000 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/返回接口.json +++ /dev/null @@ -1,750 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "id": 19723756, - "name": "飙升榜", - "description": "云音乐中每天热度上升最快的100首单曲,每日更新。", - "cover": "https://p2.music.126.net/rIi7Qzy2i2Y_1QD7cd0MYA==/109951170048506929.jpg", - "update_frequency": "更新78首", - "updated": "2025-09-05 08:24:41", - "updated_at": 1757031881385, - "created": "2014-06-30 15:58:56", - "created_at": 1404115136883, - "link": "https://music.163.com/#/discover/toplist?id=19723756" - }, - { - "id": 3779629, - "name": "新歌榜", - "description": "云音乐新歌榜:云音乐用户一周内收听所有新歌(一月内最新发行) 官方TOP排行榜,每天更新。", - "cover": "https://p2.music.126.net/5guhqPBTcIrrhLBotgaT6w==/109951170048511751.jpg", - "update_frequency": "刚刚更新", - "updated": "2025-09-05 08:24:50", - "updated_at": 1757031890587, - "created": "2013-09-09 18:09:58", - "created_at": 1378721398225, - "link": "https://music.163.com/#/discover/toplist?id=3779629" - }, - { - "id": 2884035, - "name": "原创榜", - "description": "云音乐独立原创音乐人作品官方榜单,以推荐优秀原创作品为目的。每周四网易云音乐首发。申请网易音乐人:http://music.163.com/nmusician/", - "cover": "https://p2.music.126.net/BaP9nrocNTL3gGThysv4eQ==/109951170091896587.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:54:42", - "updated_at": 1756954482653, - "created": "2013-07-25 14:05:25", - "created_at": 1374732325894, - "link": "https://music.163.com/#/discover/toplist?id=2884035" - }, - { - "id": 3778678, - "name": "热歌榜", - "description": "云音乐热歌榜:云音乐用户一周内收听所有线上歌曲官方TOP排行榜,每日更新。", - "cover": "https://p2.music.126.net/0SUEG8yDACfx0Bw2MYFv4Q==/109951170048519512.jpg", - "update_frequency": "更新14首", - "updated": "2025-09-05 08:25:03", - "updated_at": 1757031903733, - "created": "2013-09-09 18:10:06", - "created_at": 1378721406014, - "link": "https://music.163.com/#/discover/toplist?id=3778678" - }, - { - "id": 991319590, - "name": "网易云中文说唱榜", - "description": "网易云原创说唱音乐人作品官方榜单,每周五更新。以网易云用户一周播放热度为主,收录2个月内发行的原创说唱作品,按照综合数据排名取前50名。申请网易音乐人:http://music.163.com/nmusician", - "cover": "https://p2.music.126.net/GgHbgDfGXHpE2YTchU7IvA==/109951171510498108.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 10:19:58", - "updated_at": 1756433998618, - "created": "2017-11-10 13:06:29", - "created_at": 1510290389440, - "link": "https://music.163.com/#/discover/toplist?id=991319590" - }, - { - "id": 71384707, - "name": "网易云古典榜", - "description": "网易云用户一周内收听所有古典音乐官方TOP排行榜,每周四更新。", - "cover": "https://p2.music.126.net/urByD_AmfBDBrs7fA9-O8A==/109951167976973225.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:52:54", - "updated_at": 1756954374913, - "created": "2015-05-07 11:22:00", - "created_at": 1430968920537, - "link": "https://music.163.com/#/discover/toplist?id=71384707" - }, - { - "id": 1978921795, - "name": "网易云电音榜", - "description": "网易云用户一周内收听电子音乐官方TOP排行榜,每周五更新。喜力星电音,用先锋电音带你解锁全新维度和体验!", - "cover": "https://p2.music.126.net/hXGObvXfsGtFjFvRhOYAkA==/109951170091888741.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 12:00:01", - "updated_at": 1756440001367, - "created": "2017-11-16 17:47:12", - "created_at": 1510825632233, - "link": "https://music.163.com/#/discover/toplist?id=1978921795" - }, - { - "id": 14028249541, - "name": "网易云全球说唱榜", - "description": "想聆听世界的说唱节奏?全球说唱榜每周五更新,聚焦华语地区以外的优秀说唱作品。根据云音乐用户每周播放热度数据,按照综合数据排名取前 50 名。", - "cover": "https://p2.music.126.net/0hhFjP6WyIjHYDXKW5E7BA==/109951171535150782.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 11:51:16", - "updated_at": 1756439476712, - "created": "2025-07-24 14:09:26", - "created_at": 1753337366883, - "link": "https://music.163.com/#/discover/toplist?id=14028249541" - }, - { - "id": 13372522766, - "name": "潮流风向榜", - "description": "精心挑选云音乐极具声量的音乐作品,呈现歌曲真实热度趋势,榜单每日更新。", - "cover": "https://p2.music.126.net/dIKA5e7jCncz2Br1Toxgaw==/109951170621574552.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:58", - "updated_at": 1756958758114, - "created": "2025-02-26 14:01:33", - "created_at": 1740549693794, - "link": "https://music.163.com/#/discover/toplist?id=13372522766" - }, - { - "id": 12911403728, - "name": "音乐合伙人推荐榜", - "description": "音乐合伙人近一个月内推荐过的歌曲官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p2.music.126.net/s6ITpmGjKbyDpi7DPkqd2w==/109951170187827373.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 12:06:04", - "updated_at": 1756699564013, - "created": "2024-11-25 15:14:30", - "created_at": 1732518870190, - "link": "https://music.163.com/#/discover/toplist?id=12911403728" - }, - { - "id": 12911589513, - "name": "音乐合伙人热歌榜", - "description": "音乐合伙人近一周评定过的高分热歌官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p2.music.126.net/RgYxQmB-ZUjkMRo2N1jWnQ==/109951170187823494.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 12:06:01", - "updated_at": 1756699561725, - "created": "2024-11-25 15:13:46", - "created_at": 1732518826543, - "link": "https://music.163.com/#/discover/toplist?id=12911589513" - }, - { - "id": 12911619970, - "name": "音乐合伙人留名榜", - "description": "音乐合伙人近一个月内留名过的所有歌曲官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p2.music.126.net/aJJzGIxhkVaD7dX0XBNUnw==/109951170187831145.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 12:05:49", - "updated_at": 1756699549550, - "created": "2024-11-25 15:12:50", - "created_at": 1732518770868, - "link": "https://music.163.com/#/discover/toplist?id=12911619970" - }, - { - "id": 12911379734, - "name": "音乐合伙人高分新歌榜", - "description": "音乐合伙人近期评定过的所有新歌(一个月内最新发行)官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p2.music.126.net/bfk15bvanhdPFU7yjPFgWA==/109951170187832038.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 12:05:54", - "updated_at": 1756699554077, - "created": "2024-11-25 15:11:53", - "created_at": 1732518713161, - "link": "https://music.163.com/#/discover/toplist?id=12911379734" - }, - { - "id": 12768855486, - "name": "音乐合伙人高分榜", - "description": "音乐合伙人的高分歌曲官方榜单,收录近半年来获得音乐合伙人高分推荐的TOP100首歌曲,每日更新。跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p2.music.126.net/fPP5T0Z8Ac15qNvRTcHa6g==/109951170074028970.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:49", - "updated_at": 1756958749724, - "created": "2024-10-25 11:51:10", - "created_at": 1729828270342, - "link": "https://music.163.com/#/discover/toplist?id=12768855486" - }, - { - "id": 5453912201, - "name": "黑胶VIP爱听榜", - "description": "云音乐站内会员播放热度TOP100的歌曲,每周四更新。\n黑胶们都爱听什么歌曲?\n热门好歌一站式收听,让你念念不忘~\n做尊贵黑胶,畅听品味好歌~", - "cover": "https://p2.music.126.net/qo6-o9n5AhMjNyejev38-A==/109951169743111905.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 18:05:01", - "updated_at": 1756980301317, - "created": "2021-01-08 14:30:24", - "created_at": 1610087424470, - "link": "https://music.163.com/#/discover/toplist?id=5453912201" - }, - { - "id": 71385702, - "name": "网易云ACG榜", - "description": "网易云用户一周内收听所有ACG音乐官方TOP排行榜,每周四更新。", - "cover": "https://p2.music.126.net/na1kEeCS1iZEkzOrs9r_9g==/109951167976973667.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:19:13", - "updated_at": 1756952353409, - "created": "2015-05-07 11:22:15", - "created_at": 1430968935040, - "link": "https://music.163.com/#/discover/toplist?id=71385702" - }, - { - "id": 745956260, - "name": "网易云韩语榜", - "description": "网易云用户一周内收听所有韩语歌曲官方TOP排行榜,每周四更新。", - "cover": "https://p2.music.126.net/5oN9YaFznwNGXkmi8i2Ytw==/109951167430864741.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:30:40", - "updated_at": 1756953040555, - "created": "2017-05-31 11:34:51", - "created_at": 1496201691281, - "link": "https://music.163.com/#/discover/toplist?id=745956260" - }, - { - "id": 180106, - "name": "UK排行榜周榜", - "description": "UK排行榜", - "cover": "https://p2.music.126.net/fhAqiflLy3eU-ldmBQByrg==/109951165613082765.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-01 10:26:53", - "updated_at": 1756693613998, - "created": "2013-02-19 10:09:26", - "created_at": 1361239766844, - "link": "https://music.163.com/#/discover/toplist?id=180106" - }, - { - "id": 60198, - "name": "美国Billboard榜", - "description": "美国Billboard排行榜", - "cover": "https://p2.music.126.net/rwRsVIJHQ68gglhA6TNEYA==/109951165611413732.jpg", - "update_frequency": "每周三更新", - "updated": "2025-09-03 10:40:27", - "updated_at": 1756867227129, - "created": "2013-01-22 10:51:16", - "created_at": 1358823076818, - "link": "https://music.163.com/#/discover/toplist?id=60198" - }, - { - "id": 3812895, - "name": "Beatport全球电子舞曲榜", - "description": "Beatport全球电子舞曲排行榜TOP100(本榜每周三更新)", - "cover": "https://p2.music.126.net/oT-RHuPBJiD7WMoU7WG5Rw==/109951166093489621.jpg", - "update_frequency": "每周三更新", - "updated": "2025-09-03 10:51:47", - "updated_at": 1756867907849, - "created": "2013-09-11 16:03:09", - "created_at": 1378886589466, - "link": "https://music.163.com/#/discover/toplist?id=3812895" - }, - { - "id": 21845217, - "name": "KTV唛榜", - "description": "KTV唛榜是目前国内首个以全国超过200家KTV点歌平台真实数据的当红歌曲榜单。所涉及的KTV店铺覆盖全国近100多个城市,囊括一、二、三线各级城市及地区。在综合全国各地KTV点唱数据的前提下进行汇总与统计。为了保证信息的及时性,唛榜每周五更新。提供给K迷们最新和最准确的数据。", - "cover": "https://p2.music.126.net/5wDP78s43ydVTKt62C8OjQ==/109951165613100063.jpg", - "update_frequency": "每周五更新", - "updated": "2021-11-26 17:56:43", - "updated_at": 1637920603975, - "created": "2014-07-18 11:11:33", - "created_at": 1405653093230, - "link": "https://music.163.com/#/discover/toplist?id=21845217" - }, - { - "id": 60131, - "name": "日本Oricon榜", - "description": "日本Oricon数字单曲周榜,每周三更新,欢迎关注。", - "cover": "https://p2.music.126.net/aXUPgImt8hhf4cMUZEjP4g==/109951165611417794.jpg", - "update_frequency": "每天更新", - "updated": "2025-08-29 10:20:10", - "updated_at": 1756434010126, - "created": "2013-01-08 16:51:24", - "created_at": 1357635084874, - "link": "https://music.163.com/#/discover/toplist?id=60131" - }, - { - "id": 2809513713, - "name": "网易云欧美热歌榜", - "description": "网易云用户一周内收听所有欧美歌曲官方TOP排行榜,每周四更新。\nWestern Hit Chart (updated every Thursday)", - "cover": "https://p2.music.126.net/70_EO_Dc7NT_hhfvsapzcQ==/109951167430862162.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 09:44:52", - "updated_at": 1756950292193, - "created": "2019-05-22 10:49:33", - "created_at": 1558493373769, - "link": "https://music.163.com/#/discover/toplist?id=2809513713" - }, - { - "id": 2809577409, - "name": "网易云欧美新歌榜", - "description": "网易云用户一周内收听所有欧美新歌(一月内最新发行)官方TOP排行榜,每天更新。\nWestern New Release Chart (new songs released in last 30 days, updated daily)\n", - "cover": "https://p2.music.126.net/0lPWpI9Ejn1OiW2LSbg-qw==/109951167430863224.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 09:44:27", - "updated_at": 1756950267625, - "created": "2019-05-22 10:46:54", - "created_at": 1558493214795, - "link": "https://music.163.com/#/discover/toplist?id=2809577409" - }, - { - "id": 27135204, - "name": "法国 NRJ Vos Hits 周榜", - "description": "法国NRJ电台(national Radio de Jeunes)成立于1981年,总部位于法国巴黎。是法国最受欢迎的音乐电台和听众最多的广播电台之一。NRJ音乐奖素有法国的“格莱美”之称。此榜单针对NRJ电台法国本土热门歌曲排行。【每周五更新】", - "cover": "https://p2.music.126.net/-fyzrPWd06FfWl_0JDAxMQ==/109951165613108584.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 10:20:26", - "updated_at": 1756434026143, - "created": "2014-09-04 18:03:33", - "created_at": 1409825013948, - "link": "https://music.163.com/#/discover/toplist?id=27135204" - }, - { - "id": 3001835560, - "name": "网易云ACG动画榜", - "description": "网易云中每天热度上升最快的100首ACG动画单曲,每日更新。", - "cover": "https://p2.music.126.net/SkGlKQ6acixthb77VlD9eQ==/109951164432300406.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:09", - "updated_at": 1756958709531, - "created": "2019-09-27 10:03:58", - "created_at": 1569549838610, - "link": "https://music.163.com/#/discover/toplist?id=3001835560" - }, - { - "id": 3001795926, - "name": "网易云ACG游戏榜", - "description": "网易云中每天热度上升最快的100首ACG游戏单曲,每日更新。", - "cover": "https://p2.music.126.net/hivOOHMwEmnn9s_6rgZwEQ==/109951164432303700.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:17", - "updated_at": 1756958717981, - "created": "2019-09-27 10:04:56", - "created_at": 1569549896656, - "link": "https://music.163.com/#/discover/toplist?id=3001795926" - }, - { - "id": 3001890046, - "name": "网易云ACG VOCALOID榜", - "description": "", - "cover": "https://p2.music.126.net/Ag7RyRCYiINcd9EtRXf6xA==/109951164432303690.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:25", - "updated_at": 1756958725790, - "created": "2019-09-27 10:05:25", - "created_at": 1569549925472, - "link": "https://music.163.com/#/discover/toplist?id=3001890046" - }, - { - "id": 5059644681, - "name": "网易云日语榜", - "description": "网易云用户一周内收听所有日语歌曲官方TOP排行榜,每周二更新。", - "cover": "https://p2.music.126.net/YFBFNI2F-4BveUpv6FKFuw==/109951167430864069.jpg", - "update_frequency": "每周二更新", - "updated": "2025-09-02 10:57:27", - "updated_at": 1756781847266, - "created": "2020-06-11 16:10:00", - "created_at": 1591863000459, - "link": "https://music.163.com/#/discover/toplist?id=5059644681" - }, - { - "id": 5059633707, - "name": "网易云摇滚榜", - "description": "网易云用户一周内收听所有摇滚歌曲官方TOP排行榜,每周五更新。", - "cover": "https://p2.music.126.net/LjkX2hktgFD1NXc3W6w0sA==/109951170048522513.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 17:02:04", - "updated_at": 1756458124397, - "created": "2020-06-11 16:13:33", - "created_at": 1591863213389, - "link": "https://music.163.com/#/discover/toplist?id=5059633707" - }, - { - "id": 5059642708, - "name": "网易云国风榜", - "description": "网易云用户一周内收听所有国风歌曲官方TOP排行榜,每周五更新。", - "cover": "https://p2.music.126.net/kTJC5OBhg8I477X_ZmXyDQ==/109951168539740982.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 09:58:05", - "updated_at": 1756432685431, - "created": "2020-06-11 16:14:18", - "created_at": 1591863258438, - "link": "https://music.163.com/#/discover/toplist?id=5059642708" - }, - { - "id": 5338990334, - "name": "潜力爆款榜", - "description": "全民一起PICK潜力好歌,每周二更新", - "cover": "https://p2.music.126.net/Mi4QPklg1mtbWAfq74tEqQ==/109951165498334721.jpg", - "update_frequency": "每周二更新", - "updated": "2025-09-02 12:05:33", - "updated_at": 1756785933871, - "created": "2020-11-17 14:24:34", - "created_at": 1605594274077, - "link": "https://music.163.com/#/discover/toplist?id=5338990334" - }, - { - "id": 5059661515, - "name": "网易云民谣榜", - "description": "网易云用户一周内收听所有民谣歌曲官方TOP排行榜,每周五更新。", - "cover": "https://p2.music.126.net/Xe9qLTAqtBAWX_hPgFHMyw==/109951170048510929.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 17:00:41", - "updated_at": 1756458041706, - "created": "2020-06-11 16:10:52", - "created_at": 1591863052757, - "link": "https://music.163.com/#/discover/toplist?id=5059661515" - }, - { - "id": 6688069460, - "name": "听歌识曲榜", - "description": "网易云音乐站内歌曲按用户“听歌识曲”次数排列,每周四更新", - "cover": "https://p2.music.126.net/wJVUAiUuykKk7yGbQxDBug==/109951167430857712.jpg", - "update_frequency": "更新24首", - "updated": "2025-09-04 23:35:03", - "updated_at": 1757000103145, - "created": "2021-03-31 16:45:54", - "created_at": 1617180354803, - "link": "https://music.163.com/#/discover/toplist?id=6688069460" - }, - { - "id": 6723173524, - "name": "网络热歌榜", - "description": "网罗一周热门网络歌曲,反映云音乐用户近一周网络热歌收听趋势。每周五更新。", - "cover": "https://p2.music.126.net/_kSxOPqQ5J5etC5DKTFwNA==/109951170048519530.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 11:03:41", - "updated_at": 1756436621202, - "created": "2021-04-22 10:41:46", - "created_at": 1619059306654, - "link": "https://music.163.com/#/discover/toplist?id=6723173524" - }, - { - "id": 6732051320, - "name": "俄语榜", - "description": "网易云音乐用户一周内收听所有俄罗斯语歌曲官方TOP排行榜,每周四更新。", - "cover": "https://p2.music.126.net/HbJ0BK5doY4I4pEMY6-FQw==/109951167430852698.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:21:42", - "updated_at": 1756952502045, - "created": "2021-04-28 12:05:12", - "created_at": 1619582712108, - "link": "https://music.163.com/#/discover/toplist?id=6732051320" - }, - { - "id": 6732014811, - "name": "越南语榜", - "description": "网易云音乐用户一周内收听所有越南语歌曲官方TOP排行榜,每周四更新。", - "cover": "https://p2.music.126.net/N-Y5maLGWgrowt3TE6RtSg==/109951167430857045.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:28:52", - "updated_at": 1756952932171, - "created": "2021-04-28 12:05:49", - "created_at": 1619582749349, - "link": "https://music.163.com/#/discover/toplist?id=6732014811" - }, - { - "id": 6886768100, - "name": "中文慢摇DJ榜", - "description": "搜索“DJ”,进入慢摇DJ专区,探索更多网络热歌!", - "cover": "https://p2.music.126.net/w_01BfDU012ojxnzLO6tYw==/109951167977358686.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:00:00", - "updated_at": 1756958400638, - "created": "2021-07-28 18:09:59", - "created_at": 1627466999260, - "link": "https://music.163.com/#/discover/toplist?id=6886768100" - }, - { - "id": 6939992364, - "name": "俄罗斯top hit流行音乐榜", - "description": "top hit榜根据俄罗斯及全球400多个无线广播的音乐播放量和YouTube播放量计算得来,每周一更新。", - "cover": "https://p2.music.126.net/KLVO8PxVZzOoLdWQQNyprA==/109951166327316568.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 17:03:04", - "updated_at": 1756458184216, - "created": "2021-08-27 11:30:02", - "created_at": 1630035002268, - "link": "https://music.163.com/#/discover/toplist?id=6939992364" - }, - { - "id": 7095271308, - "name": "泰语榜", - "description": "网易云音乐用户一周内收听所有泰语歌曲官方TOP排行榜,每周四更新。", - "cover": "https://p2.music.126.net/4W0WBHBgwYlYfRniuyL47A==/109951167430843284.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:41:26", - "updated_at": 1756953686280, - "created": "2021-11-29 14:22:17", - "created_at": 1638166937809, - "link": "https://music.163.com/#/discover/toplist?id=7095271308" - }, - { - "id": 7356827205, - "name": "BEAT排行榜", - "description": "嘿~朋友,欢迎来到本周的Beat排行榜\n我们挑选了近一周内热门的Beat作品,一起来感受下大家近期的“口味”吧!\n每周都会更新哦,记得按下收藏,我每天都会在这里等你来与我交流!~\n\n关于Beat的必备小知识\nQ1.什么是Beat?\nBeat即节拍,特指嘻哈音乐中的伴奏,现在也可指所有流行音乐的伴奏\nQ2.Beat有什么用?\n在Beat的帮助下,你只需要填词演唱即可完成一首歌曲的创作,而且Beat也可以作为各种流媒体的背景音乐或是多场景现场演出的得力助手,不同风格的Beat还能为你的音乐创作提供灵感哦~\n搜索关注“BEATSOUL激灵”网易云官号,探索更多炸裂音乐内容~", - "cover": "https://p2.music.126.net/yhzlQJCJ9NcT4MvJBG_HgQ==/109951167977014958.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 20:05:00", - "updated_at": 1756987500926, - "created": "2022-03-29 19:39:58", - "created_at": 1648553998273, - "link": "https://music.163.com/#/discover/toplist?id=7356827205" - }, - { - "id": 7325478166, - "name": "星云榜VOL.29 Addison Rae新专来袭,寻找最真实的自己", - "description": "精心评审,专业推荐。每周五更新,为你呈现宝藏新歌。\n1、《Aquamarinee》歌手:Addison Rae\n2、《羽毛剑》歌手:秦凡淇\n3、《Take me back》歌手:HAIM\n4、《妈妈的眼睛》歌手:张震岳\n5、《25岁永不停下》歌手:张醒婵\n6、《雨季症候》歌手:SHARK卫彬月\n7、《山东王FREESTYLE》歌手:华云龙KLE\n8、《LOVE I NEED》歌手:陈瑜Estelle\n9、《FFFFF》歌手:刘柏辛Lexie\n10、《Vipaśyanā》歌手:Namunong\n本期封面:Addison Rae,Aquamarine", - "cover": "https://p2.music.126.net/u440jFG0N5i06C9ejOeMCQ==/109951171381091309.jpg", - "update_frequency": "每周五更新", - "updated": "2025-06-30 16:17:26", - "updated_at": 1751271446032, - "created": "2022-03-09 11:24:46", - "created_at": 1646796286440, - "link": "https://music.163.com/#/discover/toplist?id=7325478166" - }, - { - "id": 7603212484, - "name": "LOOK直播歌曲榜", - "description": "LOOK直播好歌共赏,专属你的声音聊愈场。榜单选取符合条件且近7日热度最高的前50首歌曲,每周二更新。", - "cover": "https://p1.music.126.net/u-RQC-LyY0aoeseRumJ14A==/109951167977730469.jpg", - "update_frequency": "每周二更新", - "updated": "2024-05-07 21:23:03", - "updated_at": 1715088183913, - "created": "2022-08-23 09:54:56", - "created_at": 1661219696017, - "link": "https://music.163.com/#/discover/toplist?id=7603212484" - }, - { - "id": 7775163417, - "name": "赏音榜", - "description": "云音乐歌曲赏音榜,以让用户鉴赏到更多潜力好歌为目的,以用户对歌曲互动热度为核心,按照综合数据排名取前100名,每日更新", - "cover": "https://p1.music.126.net/m9hQzC-d5wefBipedNPaHg==/109951168178601971.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:36", - "updated_at": 1756958736108, - "created": "2022-11-28 14:46:19", - "created_at": 1669617979380, - "link": "https://music.163.com/#/discover/toplist?id=7775163417" - }, - { - "id": 7785123708, - "name": "黑胶VIP新歌榜", - "description": "云音乐站内播放热度TOP50的7日内新晋会员歌曲,每日更新。\n更适合黑胶体质的新歌榜单来啦!\n耳机分你一只,新曲一起来听~\n成为尊贵黑胶,不错过每一首VIP新歌!", - "cover": "https://p1.music.126.net/vjitpkT9nXBCth6tvdDMWg==/109951169743115266.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:37", - "updated_at": 1756958737548, - "created": "2022-12-02 18:51:16", - "created_at": 1669978276103, - "link": "https://music.163.com/#/discover/toplist?id=7785123708" - }, - { - "id": 7785066739, - "name": "黑胶VIP热歌榜", - "description": "云音乐站内播放和付费热度TOP50的会员歌曲,每日更新。\n更适合黑胶体质的热歌榜单来啦!\n哪首是你的单曲循环?\n成为尊贵黑胶,随心畅听热门好歌!", - "cover": "https://p1.music.126.net/Ay3mLgQ9weG_c8JjYrD-Bw==/109951169743106495.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:36", - "updated_at": 1756958736684, - "created": "2022-12-02 18:51:31", - "created_at": 1669978291024, - "link": "https://music.163.com/#/discover/toplist?id=7785066739" - }, - { - "id": 7785091694, - "name": "黑胶VIP爱搜榜", - "description": "云音乐站内会员搜索播放热度TOP50的歌曲,每日更新。\n更适合黑胶体质的搜歌榜单来啦!\n热搜好歌一网打尽,只为有品位的你~\n成为尊贵黑胶,你搜我听畅听不停!", - "cover": "https://p1.music.126.net/R7DtZqNraesnsiaIKvzTHA==/109951169743112799.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:41", - "updated_at": 1756958741914, - "created": "2022-12-02 18:51:43", - "created_at": 1669978303210, - "link": "https://music.163.com/#/discover/toplist?id=7785091694" - }, - { - "id": 8246775932, - "name": "实时热度榜", - "description": "每天9-23点为你精选当下歌曲热度最高的歌曲", - "cover": "https://p1.music.126.net/U7ZbdpWzRdmZVr6Khn_4ag==/109951168673982478.jpg", - "update_frequency": "更新65首", - "updated": "2025-09-05 09:30:07", - "updated_at": 1757035807371, - "created": "2023-03-20 10:39:59", - "created_at": 1679279999154, - "link": "https://music.163.com/#/discover/toplist?id=8246775932" - }, - { - "id": 8537588450, - "name": "喜力®星电音派对潮音榜", - "description": "乐无界,越未来!《星电音联盟》歌曲官方榜单,每周一更新,让云村村民们随时随地躁起高燃派对氛围!喜力®星电音构建狂欢永不停歇的新奇电音宇宙,激活潮流基因,释放先锋灵感,跨维开启奇妙电音之旅!", - "cover": "https://p1.music.126.net/HVu2hGYvzN5XBuvFc_4Bgg==/109951168730309120.jpg", - "update_frequency": "每周五更新", - "updated": "2024-09-16 12:05:30", - "updated_at": 1726459530378, - "created": "2023-07-07 10:48:39", - "created_at": 1688698119437, - "link": "https://music.163.com/#/discover/toplist?id=8537588450" - }, - { - "id": 8661209031, - "name": "乐夏榜", - "description": "听乐夏,上网易云,一头扎进爱音乐的人群! 综艺《乐队的夏天3》官方榜单,每周一更新。和三星折叠屏手机一起畅听《乐队的夏天3》官方榜单,折叠看三星,五代更来劲。", - "cover": "https://p1.music.126.net/RlStCmE97y0xYFk7rS3Zww==/109951168864907822.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 12:05:41", - "updated_at": 1756699541864, - "created": "2023-08-16 17:47:27", - "created_at": 1692179247425, - "link": "https://music.163.com/#/discover/toplist?id=8661209031" - }, - { - "id": 8703179781, - "name": "特斯拉车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/UL8dhobSa3TR6Wd1JmWe_g==/109951168924385363.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:08", - "updated_at": 1756713908385, - "created": "2023-08-31 12:29:59", - "created_at": 1693456199735, - "link": "https://music.163.com/#/discover/toplist?id=8703179781" - }, - { - "id": 8703052295, - "name": "理想车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/U--PWdWupY1ER5cVSjr1jQ==/109951168928365496.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:09", - "updated_at": 1756713909830, - "created": "2023-08-31 12:38:29", - "created_at": 1693456709598, - "link": "https://music.163.com/#/discover/toplist?id=8703052295" - }, - { - "id": 8702582160, - "name": "比亚迪车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/S1OG-OLTaofa3HfrHW48kA==/109951168924393585.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:07", - "updated_at": 1756713907323, - "created": "2023-08-31 12:38:42", - "created_at": 1693456722262, - "link": "https://music.163.com/#/discover/toplist?id=8702582160" - }, - { - "id": 8703220480, - "name": "蔚来车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/r9kBQNsOro1EAB82Ol51WQ==/109951168924380971.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:04", - "updated_at": 1756713904286, - "created": "2023-08-31 12:38:56", - "created_at": 1693456736086, - "link": "https://music.163.com/#/discover/toplist?id=8703220480" - }, - { - "id": 8702982391, - "name": "极氪车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/Cu0RXoKewSPM9Gyc7Cp8jw==/109951168924391596.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:06", - "updated_at": 1756713906978, - "created": "2023-08-31 12:39:19", - "created_at": 1693456759762, - "link": "https://music.163.com/#/discover/toplist?id=8702982391" - }, - { - "id": 8532443277, - "name": "蛋仔派对听歌榜", - "description": "来自蛋仔岛的热播歌曲速递,网易《蛋仔派对》官方榜单,每周五更新。云村村民们,和蛋仔们一起随歌摇摆吧!", - "cover": "https://p1.music.126.net/TMb0be5QLMZKOFeuOKT4tg==/109951168717283910.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 12:05:43", - "updated_at": 1756440343562, - "created": "2023-07-05 10:32:04", - "created_at": 1688524324879, - "link": "https://music.163.com/#/discover/toplist?id=8532443277" - }, - { - "id": 9651277674, - "name": "AI歌曲榜", - "description": "精心挑选每日最新最热AI生成歌曲,榜单每日更新,一起感受AI的独特魅力吧!", - "cover": "https://p1.music.126.net/M0m6GeZ1Y8Osz9jqxaW8Wg==/109951169462048035.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:43", - "updated_at": 1756958743415, - "created": "2024-04-02 18:25:12", - "created_at": 1712053512213, - "link": "https://music.163.com/#/discover/toplist?id=9651277674" - }, - { - "id": 10131772880, - "name": "昊铂车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/EL7H4rkKejZY7Uv54EFNXg==/109951169655010112.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:03", - "updated_at": 1756713903085, - "created": "2024-06-04 16:50:00", - "created_at": 1717491000945, - "link": "https://music.163.com/#/discover/toplist?id=10131772880" - }, - { - "id": 10162841534, - "name": "埃安车友爱听榜", - "description": "埃安车友平时都在听什么??", - "cover": "https://p1.music.126.net/FcP1U6Bck0wPKqd0XgBwSQ==/109951169679731241.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:05", - "updated_at": 1756713905568, - "created": "2024-06-12 13:31:44", - "created_at": 1718170304691, - "link": "https://music.163.com/#/discover/toplist?id=10162841534" - }, - { - "id": 12225155968, - "name": "欧美R&B榜", - "description": "云音乐用户一周内收听节奏布鲁斯(R&B)官方TOP排行榜,每周五更新。", - "cover": "https://p1.music.126.net/0E6MzYzyA5uvQ4CSoIG2mw==/109951169739660034.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 12:05:45", - "updated_at": 1756440345198, - "created": "2024-06-25 18:14:05", - "created_at": 1719310445382, - "link": "https://music.163.com/#/discover/toplist?id=12225155968" - }, - { - "id": 12344472377, - "name": "黑胶VIP限免榜", - "description": "云音乐站内热度最高的限免播放歌曲TOP50,每日更新。\n人气旋律一听就会爱上!现在马上进入免费模式(点击云音乐首页左上角侧边栏,选择“免费听歌”)畅听全榜吧!", - "cover": "https://p1.music.126.net/WXCSf4ZNcDCdOTY5ixm3Bg==/109951169809318325.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:45", - "updated_at": 1756958745487, - "created": "2024-07-23 16:08:37", - "created_at": 1721722117311, - "link": "https://music.163.com/#/discover/toplist?id=12344472377" - }, - { - "id": 12717025277, - "name": "吉利车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/XVmZb3JSyrwMgqu9WVz61A==/109951170037568570.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:01", - "updated_at": 1756713901625, - "created": "2024-10-12 13:44:04", - "created_at": 1728711844151, - "link": "https://music.163.com/#/discover/toplist?id=12717025277" - } - ] -} \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/HackerNews最新.html b/InfoGenie-frontend/public/60sapi/热门榜单/HackerNews最新.html new file mode 100644 index 00000000..e85ceccc --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/HackerNews最新.html @@ -0,0 +1,67 @@ + + + + +HackerNews最新 + + + + + +
    + +

    💻 HackerNews最新

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/HackerNews热门.html b/InfoGenie-frontend/public/60sapi/热门榜单/HackerNews热门.html new file mode 100644 index 00000000..842040d8 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/HackerNews热门.html @@ -0,0 +1,67 @@ + + + + +HackerNews热门 + + + + + +
    + +

    💻 HackerNews热门

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/今日头条.html b/InfoGenie-frontend/public/60sapi/热门榜单/今日头条.html new file mode 100644 index 00000000..a1d4714e --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/今日头条.html @@ -0,0 +1,67 @@ + + + + +今日头条 + + + + + +
    + +

    📰 今日头条

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/哔哩哔哩热搜.html b/InfoGenie-frontend/public/60sapi/热门榜单/哔哩哔哩热搜.html new file mode 100644 index 00000000..4da1a80f --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/哔哩哔哩热搜.html @@ -0,0 +1,67 @@ + + + + +哔哩哔哩热搜 + + + + + +
    + +

    📺 哔哩哔哩热搜

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/夸克热搜.html b/InfoGenie-frontend/public/60sapi/热门榜单/夸克热搜.html new file mode 100644 index 00000000..d126a889 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/夸克热搜.html @@ -0,0 +1,67 @@ + + + + +夸克热搜 + + + + + +
    + +

    🔎 夸克热搜

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/小红书热搜.html b/InfoGenie-frontend/public/60sapi/热门榜单/小红书热搜.html new file mode 100644 index 00000000..675bc65a --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/小红书热搜.html @@ -0,0 +1,67 @@ + + + + +小红书热搜 + + + + + +
    + +

    🍠 小红书热搜

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/微博热搜.html b/InfoGenie-frontend/public/60sapi/热门榜单/微博热搜.html new file mode 100644 index 00000000..3fbeecaa --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/微博热搜.html @@ -0,0 +1,67 @@ + + + + +微博热搜 + + + + + +
    + +

    📱 微博热搜

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/懂车帝热搜.html b/InfoGenie-frontend/public/60sapi/热门榜单/懂车帝热搜.html new file mode 100644 index 00000000..20cc47a4 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/懂车帝热搜.html @@ -0,0 +1,67 @@ + + + + +懂车帝热搜 + + + + + +
    + +

    🚗 懂车帝热搜

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/抖音热搜.html b/InfoGenie-frontend/public/60sapi/热门榜单/抖音热搜.html new file mode 100644 index 00000000..b037bb8b --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/抖音热搜.html @@ -0,0 +1,67 @@ + + + + +抖音热搜 + + + + + +
    + +

    🎵 抖音热搜

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/猫眼实时票房.html b/InfoGenie-frontend/public/60sapi/热门榜单/猫眼实时票房.html new file mode 100644 index 00000000..73c758c8 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/猫眼实时票房.html @@ -0,0 +1,67 @@ + + + + +猫眼实时票房 + + + + + +
    + +

    🎬 猫眼实时票房

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/猫眼电视热度.html b/InfoGenie-frontend/public/60sapi/热门榜单/猫眼电视热度.html new file mode 100644 index 00000000..84a9f5fd --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/猫眼电视热度.html @@ -0,0 +1,67 @@ + + + + +猫眼电视热度 + + + + + +
    + +

    📺 猫眼电视热度

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/猫眼网剧热度.html b/InfoGenie-frontend/public/60sapi/热门榜单/猫眼网剧热度.html new file mode 100644 index 00000000..fd74ec6d --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/猫眼网剧热度.html @@ -0,0 +1,67 @@ + + + + +猫眼网剧热度 + + + + + +
    + +

    💻 猫眼网剧热度

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/百度热搜.html b/InfoGenie-frontend/public/60sapi/热门榜单/百度热搜.html new file mode 100644 index 00000000..f2f4d888 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/百度热搜.html @@ -0,0 +1,67 @@ + + + + +百度热搜 + + + + + +
    + +

    🔍 百度热搜

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/百度电视剧榜.html b/InfoGenie-frontend/public/60sapi/热门榜单/百度电视剧榜.html new file mode 100644 index 00000000..908f2ed7 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/百度电视剧榜.html @@ -0,0 +1,67 @@ + + + + +百度电视剧榜 + + + + + +
    + +

    📺 百度电视剧榜

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/百度贴吧话题.html b/InfoGenie-frontend/public/60sapi/热门榜单/百度贴吧话题.html new file mode 100644 index 00000000..19de721f --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/百度贴吧话题.html @@ -0,0 +1,67 @@ + + + + +百度贴吧话题 + + + + + +
    + +

    💬 百度贴吧话题

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/知乎热门.html b/InfoGenie-frontend/public/60sapi/热门榜单/知乎热门.html new file mode 100644 index 00000000..93b61cb5 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/知乎热门.html @@ -0,0 +1,67 @@ + + + + +知乎热门 + + + + + +
    + +

    💡 知乎热门

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/网易云音乐榜单.html b/InfoGenie-frontend/public/60sapi/热门榜单/网易云音乐榜单.html new file mode 100644 index 00000000..09b5217d --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/网易云音乐榜单.html @@ -0,0 +1,67 @@ + + + + +网易云音乐榜单 + + + + + +
    + +

    🎶 网易云音乐榜单

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/豆瓣一周口碑电影.html b/InfoGenie-frontend/public/60sapi/热门榜单/豆瓣一周口碑电影.html new file mode 100644 index 00000000..3a225c4c --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/豆瓣一周口碑电影.html @@ -0,0 +1,67 @@ + + + + +豆瓣一周口碑电影 + + + + + +
    + +

    🎬 豆瓣一周口碑电影

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/豆瓣国产剧集.html b/InfoGenie-frontend/public/60sapi/热门榜单/豆瓣国产剧集.html new file mode 100644 index 00000000..43485cf0 --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/豆瓣国产剧集.html @@ -0,0 +1,67 @@ + + + + +豆瓣国产剧集 + + + + + +
    + +

    📺 豆瓣国产剧集

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热门榜单/豆瓣海外剧集.html b/InfoGenie-frontend/public/60sapi/热门榜单/豆瓣海外剧集.html new file mode 100644 index 00000000..d063fb5d --- /dev/null +++ b/InfoGenie-frontend/public/60sapi/热门榜单/豆瓣海外剧集.html @@ -0,0 +1,67 @@ + + + + +豆瓣海外剧集 + + + + + +
    + +

    🌏 豆瓣海外剧集

    + +
    +
    +
    加载中...
    +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI中国亲戚称呼计算器/index.html b/InfoGenie-frontend/public/aimodelapp/AI中国亲戚称呼计算器/index.html index 9e7bf811..3df1b280 100644 --- a/InfoGenie-frontend/public/aimodelapp/AI中国亲戚称呼计算器/index.html +++ b/InfoGenie-frontend/public/aimodelapp/AI中国亲戚称呼计算器/index.html @@ -53,7 +53,9 @@ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI中国亲戚称呼计算器/script.js b/InfoGenie-frontend/public/aimodelapp/AI中国亲戚称呼计算器/script.js index a71c1bd4..3d06a2bc 100644 --- a/InfoGenie-frontend/public/aimodelapp/AI中国亲戚称呼计算器/script.js +++ b/InfoGenie-frontend/public/aimodelapp/AI中国亲戚称呼计算器/script.js @@ -35,28 +35,22 @@ function clearResults() { } async function callKinshipAPI(relationChain) { - const token = window.AUTH_CONFIG.getToken(); - if (!token) throw new Error('未登录,请先登录后使用AI功能'); - - const url = `${window.API_CONFIG.baseUrl}${window.API_CONFIG.endpoints.kinshipCalculator}`; - const resp = await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ relation_chain: relationChain }) - }); - - if (!resp.ok) { - if (resp.status === 402) throw new Error('您的萌芽币余额不足,无法使用此功能'); - const err = await resp.json().catch(() => ({})); - throw new Error(err.error || `API请求失败: ${resp.status} ${resp.statusText}`); + const content = await window.AiChat.complete([ + { role: 'user', content: window.AiPrompts.kinship(relationChain) }, + ]); + var parsed; + try { + parsed = JSON.parse(content); + } catch (e) { + var m = content.match(/\{[\s\S]*\}/); + parsed = m ? JSON.parse(m[0]) : {}; } - - const data = await resp.json(); - if (!data.success) throw new Error(data.error || 'API响应异常'); - return data; + return { + success: true, + mandarin_title: parsed.mandarin_title, + dialect_titles: parsed.dialect_titles, + notes: parsed.notes, + }; } function renderDialects(dialectTitles) { diff --git a/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/index.html b/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/index.html index e03736d3..f830c799 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/index.html +++ b/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/index.html @@ -4,214 +4,7 @@ AI古诗生成器 - +
    @@ -240,7 +33,9 @@
    + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/script.js b/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/script.js index b47f327b..a03a768e 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/script.js +++ b/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/script.js @@ -7,45 +7,12 @@ const loading = document.getElementById('loading'); const poemOutput = document.getElementById('poemOutput'); const themeInput = document.getElementById('theme'); -// 调用后端API +// 调用后端统一 chat(提示词在前端 ai-prompts.js) async function callBackendAPI(theme) { - try { - // 获取JWT token - const token = localStorage.getItem('token'); - - if (!token) { - throw new Error('未登录,请先登录后使用AI功能'); - } - - const response = await fetch(`${window.API_CONFIG.baseUrl}/api/aimodelapp/poetry`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ - theme: theme - }) - }); - - if (!response.ok) { - if (response.status === 402) { - throw new Error('您的萌芽币余额不足,无法使用此功能'); - } - const errorData = await response.json(); - throw new Error(errorData.error || `API请求失败: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - if (data.success) { - return data.poem; - } else { - throw new Error(data.error || 'API响应格式异常'); - } - } catch (error) { - console.error('API调用错误:', error); - throw error; - } + const content = await window.AiChat.complete( + [{ role: 'user', content: window.AiPrompts.poetry(theme) }] + ); + return content; } // 显示错误信息 diff --git a/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/index.html b/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/index.html index ae8365cc..d9c8e2e9 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/index.html +++ b/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/index.html @@ -4,7 +4,7 @@ AI变量命名助手 - +
    @@ -37,7 +37,9 @@
    + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/script.js b/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/script.js index 1a829756..46eeb24d 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/script.js +++ b/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/script.js @@ -37,45 +37,12 @@ const namingConventions = { -// 调用后端API +// 调用后端统一 chat(提示词在前端) async function callBackendAPI(description) { - try { - // 获取JWT token - const token = localStorage.getItem('token'); - - if (!token) { - throw new Error('未登录,请先登录后使用AI功能'); - } - - const response = await fetch(`${window.API_CONFIG.baseUrl}/api/aimodelapp/variable-naming`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ - description: description - }) - }); - - if (!response.ok) { - if (response.status === 402) { - throw new Error('您的萌芽币余额不足,无法使用此功能'); - } - const errorData = await response.json(); - throw new Error(errorData.error || `API请求失败: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - if (data.success) { - return data.suggestions; - } else { - throw new Error(data.error || 'API响应格式异常'); - } - } catch (error) { - console.error('API调用错误:', error); - throw error; - } + const content = await window.AiChat.complete( + [{ role: 'user', content: window.AiPrompts.variableNaming(description) }] + ); + return parseAIResponse(content); } // 解析AI响应 @@ -227,12 +194,7 @@ async function generateSuggestions() { displaySuggestions(suggestions); } catch (error) { console.error('生成建议失败:', error); - // 检查是否是萌芽币不足导致的错误 - if (error.message && error.message.includes('萌芽币余额不足')) { - showErrorMessage(`萌芽币不足: 每次使用AI功能需要消耗100萌芽币,请通过每日签到获取更多萌芽币`); - } else { - showErrorMessage(`生成失败: ${error.message}`); - } + showErrorMessage(`生成失败: ${error.message}`); } finally { showLoading(false); } diff --git a/InfoGenie-frontend/public/aimodelapp/AI姓名评测/index.html b/InfoGenie-frontend/public/aimodelapp/AI姓名评测/index.html index 582ea4fa..5cad1b5b 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI姓名评测/index.html +++ b/InfoGenie-frontend/public/aimodelapp/AI姓名评测/index.html @@ -4,7 +4,7 @@ AI姓名评测 - +
    @@ -51,7 +51,9 @@
    + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI姓名评测/script.js b/InfoGenie-frontend/public/aimodelapp/AI姓名评测/script.js index 7a4bbb59..a835c0eb 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI姓名评测/script.js +++ b/InfoGenie-frontend/public/aimodelapp/AI姓名评测/script.js @@ -187,49 +187,12 @@ async function analyzeName() { existingError.remove(); } - const requestBody = { - name: name - }; - try { - // 调用后端API - // 获取JWT token - const token = localStorage.getItem('token'); - - if (!token) { - throw new Error('未登录,请先登录后使用AI功能'); - } - - const response = await fetch(`${window.API_CONFIG.baseUrl}/api/aimodelapp/name-analysis`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify(requestBody) - }); - - // 检查HTTP状态码 - if (response.status === 429) { - throw new Error('短时间内请求次数过多,请休息一下!'); - } - - if (!response.ok) { - if (response.status === 402) { - throw new Error('您的萌芽币余额不足,无法使用此功能'); - } - const errorData = await response.json(); - throw new Error(errorData.error || `请求失败: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - - if (data.success && data.analysis) { - const analysisResult = parseAnalysisResult(data.analysis.trim()); - updateResults(analysisResult); - } else { - throw new Error(data.error || 'AI响应格式异常'); - } + const content = await window.AiChat.complete([ + { role: 'user', content: window.AiPrompts.nameAnalysis(name) }, + ]); + const analysisResult = parseAnalysisResult(content.trim()); + updateResults(analysisResult); } catch (error) { console.error('分析姓名时出错:', error); showError(error.message); diff --git a/InfoGenie-frontend/public/aimodelapp/AI文章排版/index.html b/InfoGenie-frontend/public/aimodelapp/AI文章排版/index.html index 6118e10d..e2bfe067 100644 --- a/InfoGenie-frontend/public/aimodelapp/AI文章排版/index.html +++ b/InfoGenie-frontend/public/aimodelapp/AI文章排版/index.html @@ -72,6 +72,8 @@ + + diff --git a/InfoGenie-frontend/public/aimodelapp/AI文章排版/script.js b/InfoGenie-frontend/public/aimodelapp/AI文章排版/script.js index 5a144a42..9141ff58 100644 --- a/InfoGenie-frontend/public/aimodelapp/AI文章排版/script.js +++ b/InfoGenie-frontend/public/aimodelapp/AI文章排版/script.js @@ -25,39 +25,11 @@ function showErrorMessage(msg) { resultContainer.innerHTML = `
    ${msg}
    `; } -// 调用后端API +// 调用后端统一 chat(提示词在前端;markdownOption 仅保留兼容 UI,不参与提示词) async function callBackendAPI(articleText, emojiStyle, markdownOption) { - try { - const token = window.AUTH_CONFIG.getToken(); - if (!token) throw new Error('未登录,请先登录后使用AI功能'); - - const url = `${window.API_CONFIG.baseUrl}${window.API_CONFIG.endpoints.markdownFormatting}`; - const response = await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ - article_text: articleText, - emoji_style: emojiStyle, - markdown_option: markdownOption - }) - }); - - if (!response.ok) { - if (response.status === 402) throw new Error('您的萌芽币余额不足,无法使用此功能'); - const errorData = await response.json().catch(() => ({})); - throw new Error(errorData.error || `API请求失败: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - if (data.success && data.formatted_markdown) return data.formatted_markdown; - throw new Error(data.error || 'API响应格式异常'); - } catch (error) { - console.error('API调用错误:', error); - throw error; - } + return window.AiChat.complete([ + { role: 'user', content: window.AiPrompts.markdownFormatting(articleText, emojiStyle) }, + ]); } // 显示结果 diff --git a/InfoGenie-frontend/public/aimodelapp/AI文章转文言文/index.html b/InfoGenie-frontend/public/aimodelapp/AI文章转文言文/index.html index ebe0c0af..0525a0e6 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI文章转文言文/index.html +++ b/InfoGenie-frontend/public/aimodelapp/AI文章转文言文/index.html @@ -60,7 +60,9 @@ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI文章转文言文/script.js b/InfoGenie-frontend/public/aimodelapp/AI文章转文言文/script.js index 61a2b7c6..264832ad 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI文章转文言文/script.js +++ b/InfoGenie-frontend/public/aimodelapp/AI文章转文言文/script.js @@ -9,47 +9,11 @@ const convertBtn = document.getElementById('convertBtn'); const loadingDiv = document.getElementById('loading'); const conversionResultContainer = document.getElementById('conversionResult'); -// 调用后端API +// 调用后端统一 chat(提示词在前端) async function callBackendAPI(modernText, style, articleType) { - try { - // 获取JWT token - const token = localStorage.getItem('token'); - - if (!token) { - throw new Error('未登录,请先登录后使用AI功能'); - } - - const response = await fetch(`${window.API_CONFIG.baseUrl}/api/aimodelapp/classical_conversion`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ - modern_text: modernText, - style: style, - article_type: articleType - }) - }); - - if (!response.ok) { - if (response.status === 402) { - throw new Error('您的萌芽币余额不足,无法使用此功能'); - } - const errorData = await response.json(); - throw new Error(errorData.error || `API请求失败: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - if (data.success) { - return data.conversion_result; - } else { - throw new Error(data.error || 'API响应格式异常'); - } - } catch (error) { - console.error('API调用错误:', error); - throw error; - } + return window.AiChat.complete([ + { role: 'user', content: window.AiPrompts.classicalConversion(modernText, style, articleType) }, + ]); } // 解析AI响应 diff --git a/InfoGenie-frontend/public/aimodelapp/AI生成Linux命令/index.html b/InfoGenie-frontend/public/aimodelapp/AI生成Linux命令/index.html index 038673fd..f1396cfc 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI生成Linux命令/index.html +++ b/InfoGenie-frontend/public/aimodelapp/AI生成Linux命令/index.html @@ -44,7 +44,9 @@ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI生成Linux命令/script.js b/InfoGenie-frontend/public/aimodelapp/AI生成Linux命令/script.js index ffcf39fe..e1ee0dcc 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI生成Linux命令/script.js +++ b/InfoGenie-frontend/public/aimodelapp/AI生成Linux命令/script.js @@ -8,45 +8,11 @@ const generateBtn = document.getElementById('generateBtn'); const loadingDiv = document.getElementById('loading'); const commandsContainer = document.getElementById('commands'); -// 调用后端API +// 调用后端统一 chat(提示词在前端) async function callBackendAPI(taskDescription, difficultyLevel) { - try { - const token = localStorage.getItem('token'); - const headers = { - 'Content-Type': 'application/json' - }; - - if (token) { - headers['Authorization'] = `Bearer ${token}`; - } - - const response = await fetch(`${window.API_CONFIG.baseUrl}${window.API_CONFIG.endpoints.linuxCommand}`, { - method: 'POST', - headers: headers, - body: JSON.stringify({ - task_description: taskDescription, - difficulty_level: difficultyLevel - }) - }); - - if (!response.ok) { - if (response.status === 402) { - throw new Error('您的萌芽币余额不足,无法使用此功能'); - } - const errorData = await response.json(); - throw new Error(errorData.error || `API请求失败: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - if (data.success) { - return data.command_result; - } else { - throw new Error(data.error || 'API响应格式异常'); - } - } catch (error) { - console.error('API调用错误:', error); - throw error; - } + return window.AiChat.complete([ + { role: 'user', content: window.AiPrompts.linuxCommand(taskDescription, difficultyLevel) }, + ]); } // 解析AI响应 diff --git a/InfoGenie-frontend/public/aimodelapp/AI生成表情包/index.html b/InfoGenie-frontend/public/aimodelapp/AI生成表情包/index.html index faad6113..4328cae9 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI生成表情包/index.html +++ b/InfoGenie-frontend/public/aimodelapp/AI生成表情包/index.html @@ -46,7 +46,9 @@ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI生成表情包/script.js b/InfoGenie-frontend/public/aimodelapp/AI生成表情包/script.js index 2f6672f3..ef445344 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI生成表情包/script.js +++ b/InfoGenie-frontend/public/aimodelapp/AI生成表情包/script.js @@ -31,46 +31,12 @@ const generateBtn = document.getElementById('generateBtn'); const loadingDiv = document.getElementById('loading'); const expressionsContainer = document.getElementById('expressions'); -// 调用后端API +// 调用后端统一 chat(提示词在前端) async function callBackendAPI(text, style) { - try { - // 获取JWT token - const token = localStorage.getItem('token'); - - if (!token) { - throw new Error('未登录,请先登录后使用AI功能'); - } - - const response = await fetch(`${window.API_CONFIG.baseUrl}/api/aimodelapp/expression-maker`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ - text: text, - style: style - }) - }); - - if (!response.ok) { - if (response.status === 402) { - throw new Error('您的萌芽币余额不足,无法使用此功能'); - } - const errorData = await response.json(); - throw new Error(errorData.error || `API请求失败: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - if (data.success) { - return data.expressions; - } else { - throw new Error(data.error || 'API响应格式异常'); - } - } catch (error) { - console.error('API调用错误:', error); - throw error; - } + const content = await window.AiChat.complete([ + { role: 'user', content: window.AiPrompts.expressionMaker(text, style) }, + ]); + return parseAIResponse(content); } // 解析AI响应 @@ -232,12 +198,7 @@ async function generateExpressions() { displayExpressions(expressions); } catch (error) { console.error('生成表情失败:', error); - // 检查是否是萌芽币不足导致的错误 - if (error.message && error.message.includes('萌芽币余额不足')) { - showErrorMessage(`萌芽币不足: 每次使用AI功能需要消耗100萌芽币,请通过每日签到获取更多萌芽币`); - } else { - showErrorMessage(`生成失败: ${error.message}`); - } + showErrorMessage(`生成失败: ${error.message}`); } finally { showLoading(false); } diff --git a/InfoGenie-frontend/public/aimodelapp/AI语言翻译助手/index.html b/InfoGenie-frontend/public/aimodelapp/AI语言翻译助手/index.html index 0495ce04..0818a230 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI语言翻译助手/index.html +++ b/InfoGenie-frontend/public/aimodelapp/AI语言翻译助手/index.html @@ -56,7 +56,9 @@ + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI语言翻译助手/script.js b/InfoGenie-frontend/public/aimodelapp/AI语言翻译助手/script.js index 595a0057..cf13c419 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI语言翻译助手/script.js +++ b/InfoGenie-frontend/public/aimodelapp/AI语言翻译助手/script.js @@ -8,46 +8,12 @@ const translateBtn = document.getElementById('translateBtn'); const loadingDiv = document.getElementById('loading'); const translationResultContainer = document.getElementById('translationResult'); -// 调用后端API +// 调用后端统一 chat(提示词在前端) async function callBackendAPI(sourceText, targetLanguage) { - try { - // 获取JWT token - const token = localStorage.getItem('token'); - - if (!token) { - throw new Error('未登录,请先登录后使用AI功能'); - } - - const response = await fetch(`${window.API_CONFIG.baseUrl}/api/aimodelapp/translation`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ - source_text: sourceText, - target_language: targetLanguage - }) - }); - - if (!response.ok) { - if (response.status === 402) { - throw new Error('您的萌芽币余额不足,无法使用此功能'); - } - const errorData = await response.json(); - throw new Error(errorData.error || `API请求失败: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - if (data.success) { - return data.translation_result; - } else { - throw new Error(data.error || 'API响应格式异常'); - } - } catch (error) { - console.error('API调用错误:', error); - throw error; - } + const content = await window.AiChat.complete( + [{ role: 'user', content: window.AiPrompts.translation(sourceText, targetLanguage) }] + ); + return content; } // 解析AI响应 diff --git a/InfoGenie-frontend/public/aimodelapp/shared/ai-chat.js b/InfoGenie-frontend/public/aimodelapp/shared/ai-chat.js new file mode 100644 index 00000000..cbc85aa7 --- /dev/null +++ b/InfoGenie-frontend/public/aimodelapp/shared/ai-chat.js @@ -0,0 +1,48 @@ +/** + * 统一调用后端 /api/aimodelapp/chat(提示词由前端 ai-prompts.js 组装) + */ +(function (global) { + global.AiChat = { + /** + * @param {{ role: string, content: string }[]} messages + * @param {{ provider?: string, model?: string }} [opts] + * @returns {Promise} assistant 文本 + */ + async complete(messages, opts) { + opts = opts || {}; + const token = + (global.AUTH_CONFIG && typeof global.AUTH_CONFIG.getToken === 'function' + ? global.AUTH_CONFIG.getToken() + : null) || global.localStorage.getItem('token'); + if (!token) { + throw new Error('未登录,请先登录后使用AI功能'); + } + const base = (global.API_CONFIG && global.API_CONFIG.baseUrl) || ''; + const res = await fetch(base + '/api/aimodelapp/chat', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer ' + token, + }, + body: JSON.stringify({ + messages, + provider: opts.provider || 'deepseek', + model: opts.model || 'deepseek-chat', + }), + }); + if (!res.ok) { + let errMsg = res.statusText; + try { + const errData = await res.json(); + errMsg = errData.error || errMsg; + } catch (e) { /* ignore */ } + throw new Error(errMsg || 'API 请求失败'); + } + const data = await res.json(); + if (data.success && data.content != null) { + return typeof data.content === 'string' ? data.content : String(data.content); + } + throw new Error(data.error || 'API 响应异常'); + }, + }; +})(typeof window !== 'undefined' ? window : this); diff --git a/InfoGenie-frontend/public/aimodelapp/shared/ai-prompts.js b/InfoGenie-frontend/public/aimodelapp/shared/ai-prompts.js new file mode 100644 index 00000000..7489aac1 --- /dev/null +++ b/InfoGenie-frontend/public/aimodelapp/shared/ai-prompts.js @@ -0,0 +1,138 @@ +/** + * AI 应用提示词(与历史后端 handler 语义对齐,便于在前端迭代) + */ +(function (g) { + var LANG_MAP = { + 'zh-CN': '中文(简体)', + 'zh-TW': '中文(繁体)', + en: '英语', + ja: '日语', + ko: '韩语', + fr: '法语', + de: '德语', + es: '西班牙语', + it: '意大利语', + pt: '葡萄牙语', + ru: '俄语', + ar: '阿拉伯语', + hi: '印地语', + th: '泰语', + vi: '越南语', + }; + + var EXPR_STYLE = { + mixed: '混合使用Emoji表情和颜文字', + emoji: '仅使用Emoji表情符号', + kaomoji: '仅使用颜文字', + cute: '使用可爱风格的表情符号', + cool: '使用酷炫风格的表情符号', + }; + + g.AiPrompts = { + nameAnalysis: function (name) { + return ( + '你是一位专业的姓名学专家和语言学家,请对输入的姓名进行全面分析。请直接输出分析结果,不要包含任何思考过程或标签。\n\n姓名:' + + name + + '\n\n请按照以下格式严格输出分析结果:\n\n【稀有度评分】\n评分:X%%\n评价:[对稀有度的详细说明,包括姓氏和名字的常见程度分析]\n\n【音韵评价】\n评分:X%%\n评价:[对音韵美感的分析,包括声调搭配、读音流畅度、音律和谐度等]\n\n【含义解读】\n[详细分析姓名的寓意内涵,包括:\n1. 姓氏的历史渊源和文化背景\n2. 名字各字的含义和象征\n3. 整体姓名的寓意组合\n4. 可能体现的父母期望或文化内涵\n5. 与传统文化、诗词典故的关联等]\n\n要求:\n1. 评分必须是1-100的整数百分比,要有明显区分度,避免雷同\n2. 分析要专业、客观、有依据,评分要根据实际情况有所差异\n3. 含义解读要详细深入,至少150字\n4. 严格按照上述格式输出,不要添加思考过程、标签或其他内容\n5. 如果是生僻字或罕见姓名,要特别说明\n6. 直接输出最终结果,不要显示推理过程' + ); + }, + + variableNaming: function (desc) { + return ( + '你是一个专业的变量命名助手。请根据以下描述为变量生成合适的名称:\n\n描述:' + + desc + + '\n\n请为每种命名规范生成3个变量名建议:\n1. camelCase (驼峰命名法)\n2. PascalCase (帕斯卡命名法)\n3. snake_case (下划线命名法)\n4. kebab-case (短横线命名法)\n5. CONSTANT_CASE (常量命名法)\n\n请按JSON格式返回:\n{"suggestions":{"camelCase":[{"name":"变量名","description":"说明"}],"PascalCase":[{"name":"变量名","description":"说明"}],"snake_case":[{"name":"变量名","description":"说明"}],"kebab-case":[{"name":"变量名","description":"说明"}],"CONSTANT_CASE":[{"name":"变量名","description":"说明"}]}}\n\n只返回JSON格式的结果,不要包含其他文字。' + ); + }, + + poetry: function (theme, style, mood) { + style = style || '现代诗'; + mood = mood || '自由发挥'; + return ( + '你是一位才华横溢的诗人,请根据以下要求创作一首诗歌。\n\n主题:' + + theme + + '\n风格:' + + style + + '\n情感基调:' + + mood + + '\n\n创作要求:\n1. 紧扣主题,情感真挚\n2. 语言优美,意境深远\n3. 符合指定的诗歌风格\n4. 长度适中,朗朗上口\n5. 如果是古体诗,注意平仄和韵律\n\n请直接输出诗歌作品,不需要额外的解释或分析。' + ); + }, + + translationLangName: function (code) { + return LANG_MAP[code] || code; + }, + + translation: function (text, targetLang) { + var langName = LANG_MAP[targetLang] || targetLang; + return ( + '你是一位专业的翻译专家,精通多种语言的翻译工作。请将以下文本翻译成' + + langName + + '。\n\n原文:' + + text + + '\n\n翻译要求:\n1. 【信】- 忠实原文,准确传达原意\n2. 【达】- 译文通顺流畅,符合目标语言的表达习惯\n3. 【雅】- 用词优美得体,风格与原文相符\n\n请按以下JSON格式返回翻译结果:\n{"detected_language":"检测到的源语言","target_language":"' + + langName + + '","translation":"翻译结果","alternative_translations":["备选翻译1","备选翻译2"],"explanation":"翻译说明","pronunciation":"发音指导"}\n\n只返回JSON格式的结果,不要包含其他文字。' + ); + }, + + classicalConversion: function (text, style, articleType) { + style = style || '古雅'; + articleType = articleType || '散文'; + return ( + '你是一位精通古代文言文的文学大师,擅长将现代文转换为优美的文言文。请将以下现代文转换为文言文。\n\n现代文:' + + text + + '\n风格:' + + style + + '\n文体:' + + articleType + + '\n\n请按以下JSON格式返回转换结果:\n{"classical_text":"转换后的文言文","translation_notes":"转换说明","style_analysis":"风格分析","difficulty_level":"难度等级","key_phrases":[{"modern":"现代词汇","classical":"文言文词汇","explanation":"转换说明"}],"cultural_elements":"文化内涵说明"}\n\n只返回JSON格式的结果,不要包含其他文字。' + ); + }, + + expressionMaker: function (text, style) { + style = style || 'mixed'; + var styleDesc = EXPR_STYLE[style] || EXPR_STYLE.mixed; + return ( + '你是一个专业的表情符号专家。请根据以下文字内容生成相应的表情符号:\n\n文字内容:' + + text + + '\n表情风格:' + + styleDesc + + '\n\n请按JSON格式返回:\n{"expressions":{"emoji":[{"symbol":"😊","description":"场景说明","intensity":"中等","usage":"使用建议"}],"kaomoji":[{"symbol":"(^_^)","description":"场景说明","intensity":"轻微","usage":"使用建议"}],"combination":[{"symbol":"🎉✨","description":"场景说明","intensity":"强烈","usage":"使用建议"}]},"summary":{"emotion_analysis":"情感分析","recommended_usage":"推荐使用场景","style_notes":"风格特点"}}\n\n只返回JSON格式的结果,不要包含其他文字。' + ); + }, + + linuxCommand: function (taskDesc, level) { + level = level || 'beginner'; + return ( + '你是一位Linux系统专家,请根据用户的任务描述生成相应的Linux命令。\n\n任务描述:' + + taskDesc + + '\n用户水平:' + + level + + '\n\n请按JSON格式返回:\n{"commands":[{"command":"具体命令","description":"说明","safety_level":"safe","explanation":"解释","example_output":"示例输出","alternatives":["替代命令"]}],"safety_warnings":["安全提示"],"prerequisites":["前置条件"],"related_concepts":["相关概念"]}\n\n只返回JSON格式的结果,不要包含其他文字。' + ); + }, + + markdownFormatting: function (text, emojiStyle) { + emojiStyle = emojiStyle || 'balanced'; + return ( + '你是一位专业的文档排版助手。请将用户提供的全文按"标准Markdown格式"进行排版,并在不改变任何原文内容的前提下进行结构化呈现。严格遵守以下规则:\n\n1) 保留所有原始内容,严禁改写、删减或添加新内容。\n2) 使用合理的Markdown结构(标题、分节、段落、列表、引用、表格如有必要、代码块仅当原文包含)。\n3) 智能添加适量Emoji以增强可读性(' + + emojiStyle + + '),在标题、关键句、列表项等处点缀;避免过度使用,保持专业。\n4) 保持语言与语气不变,只优化排版和表现形式。\n5) 输出"纯Markdown文本",不要包含任何JSON、HTML、XML、解释文字、或代码块围栏标记。\n\n如果原文本较长,可在开头自动生成简洁的"目录"以便阅读。\n\n原文如下:\n' + + text + ); + }, + + kinship: function (chain, dialects) { + var d = dialects && dialects.length + ? dialects + : ['粤语', '闽南语', '上海话', '四川话', '东北话', '客家话']; + return ( + '你是一位中国亲属称呼专家。请解析下面的亲属关系链,给出最终的亲属称呼。\n\n请遵循:\n1) 以中国大陆通行的标准普通话称呼为准。\n2) 同时给出若干方言的对应称呼:' + + d.join('、') + + '。\n3) 如存在地区差异或性别歧义,请在notes中说明。\n4) 不要展示推理过程;只输出JSON。\n\n严格按以下JSON结构输出:\n{"mandarin_title":"标准普通话称呼","dialect_titles":{"粤语":{"title":"称呼","romanization":"粤拼","notes":"说明"}},"notes":"总体说明"}\n\n关系链:' + + chain + ); + }, + }; +})(typeof window !== 'undefined' ? window : this); diff --git a/InfoGenie-frontend/public/aimodelapp/shared/compact-styles.css b/InfoGenie-frontend/public/aimodelapp/shared/compact-styles.css new file mode 100644 index 00000000..2128b6eb --- /dev/null +++ b/InfoGenie-frontend/public/aimodelapp/shared/compact-styles.css @@ -0,0 +1,458 @@ +/* 紧凑版样式 - 针对移动端优化 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Helvetica Neue', Arial, sans-serif; + background: linear-gradient(135deg, #87CEEB 0%, #98FB98 100%); + min-height: 100vh; + padding: 8px; + color: #1D1D1F; + line-height: 1.4; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + scrollbar-width: none; + -ms-overflow-style: none; +} + +body::-webkit-scrollbar, +*::-webkit-scrollbar { + display: none; +} + +.container { + max-width: 500px; + margin: 0 auto; + background: rgba(255, 255, 255, 0.9); + border-radius: 16px; + padding: 16px; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(15px) saturate(180%); + border: 1px solid rgba(255, 255, 255, 0.3); +} + +.header { + text-align: center; + margin-bottom: 20px; +} + +.title { + font-size: 1.5rem; + color: #1D1D1F; + margin-bottom: 6px; + font-weight: 600; + letter-spacing: -0.01em; +} + +.subtitle { + color: #86868B; + font-size: 0.9rem; + margin-bottom: 16px; + font-weight: 400; +} + +.form-section { + margin-bottom: 20px; +} + +.form-group { + margin-bottom: 16px; +} + +.form-label { + display: block; + margin-bottom: 6px; + font-weight: 600; + color: #1D1D1F; + font-size: 0.9rem; +} + +.form-input { + width: 100%; + padding: 10px 12px; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 8px; + font-size: 0.9rem; + transition: all 0.2s ease; + background: rgba(255, 255, 255, 0.8); + font-family: inherit; + backdrop-filter: blur(8px); +} + +.form-input:focus { + outline: none; + border-color: #007AFF; + background: rgba(255, 255, 255, 0.95); + box-shadow: 0 0 0 3px rgba(0, 122, 255, 0.15); +} + +.textarea { + resize: vertical; + min-height: 80px; +} + +.btn { + width: 100%; + padding: 12px; + background: #007AFF; + color: white; + border: none; + border-radius: 8px; + font-size: 0.95rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; + margin-bottom: 16px; + box-shadow: 0 2px 6px rgba(0, 122, 255, 0.25); +} + +.btn:hover { + background: #0056CC; + transform: translateY(-1px); + box-shadow: 0 3px 10px rgba(0, 122, 255, 0.35); +} + +.btn:active { + transform: translateY(0); + background: #004499; +} + +.btn:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; + background: #86868B; +} + +.result-section { + margin-top: 20px; +} + +.result-title { + font-size: 1.1rem; + color: #1D1D1F; + margin-bottom: 12px; + text-align: center; + font-weight: 600; +} + +.loading { + display: none; + text-align: center; + color: #007AFF; + font-style: normal; + padding: 16px; + font-weight: 500; +} + +.poem-output, +.result-container { + background: rgba(255, 255, 255, 0.7); + border: 1px solid rgba(0, 0, 0, 0.08); + border-radius: 12px; + padding: 16px; + min-height: 120px; + backdrop-filter: blur(8px); +} + +.poem-output { + white-space: pre-wrap; + font-family: 'PingFang SC', 'Hiragino Sans GB', 'KaiTi', '楷体', serif; + font-size: 1rem; + line-height: 1.6; + text-align: center; + color: #1D1D1F; + letter-spacing: 0.3px; +} + +.result-container { + display: grid; + gap: 12px; + grid-template-columns: 1fr; +} + +.result-card { + background: rgba(255, 255, 255, 0.8); + border: 1px solid rgba(0, 0, 0, 0.06); + border-radius: 10px; + padding: 12px; + backdrop-filter: blur(8px); +} + +.card-title { + font-size: 0.95rem; + color: #1D1D1F; + margin-bottom: 8px; + font-weight: 600; +} + +.score-display { + font-size: 1.8rem; + font-weight: 700; + color: #007AFF; + margin-bottom: 4px; + text-align: center; +} + +.score-desc { + font-size: 0.85rem; + color: #86868B; + text-align: center; + line-height: 1.3; +} + +.meaning-content { + font-size: 0.9rem; + color: #1D1D1F; + line-height: 1.5; +} + +.suggestions-container { + background: rgba(255, 255, 255, 0.7); + border: 1px solid rgba(0, 0, 0, 0.08); + border-radius: 12px; + padding: 12px; + min-height: 100px; + backdrop-filter: blur(8px); + display: grid; + gap: 10px; + grid-template-columns: 1fr; +} + +.placeholder { + text-align: center; + color: #86868B; + font-style: normal; + padding: 20px 10px; + font-weight: 400; + font-size: 0.85rem; +} + +.convention-group-title { + font-size: 0.9rem; + font-weight: 600; + color: white; + margin: 12px 0 8px 0; + padding: 8px 12px; + background: #007AFF; + border-radius: 8px; + text-align: center; + box-shadow: 0 2px 6px rgba(0, 122, 255, 0.25); + grid-column: 1 / -1; +} + +.convention-group-title:first-child { + margin-top: 0; +} + +.suggestion-item { + background: rgba(255, 255, 255, 0.9); + border: 1px solid rgba(0, 0, 0, 0.06); + border-radius: 8px; + padding: 10px; + margin-bottom: 0; + transition: all 0.2s ease; + cursor: pointer; + position: relative; + backdrop-filter: blur(8px); + min-height: 60px; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.suggestion-item:hover { + border-color: rgba(0, 122, 255, 0.3); + box-shadow: 0 3px 10px rgba(0, 122, 255, 0.15); + background: rgba(255, 255, 255, 0.95); +} + +.variable-name { + font-family: 'SF Mono', 'Monaco', 'Consolas', 'Courier New', monospace; + font-size: 0.9rem; + font-weight: 600; + color: #1D1D1F; + margin-bottom: 3px; + word-break: break-all; +} + +.variable-description { + font-size: 0.8rem; + color: #86868B; + line-height: 1.3; + flex-grow: 1; +} + +.copy-btn { + position: absolute; + top: 6px; + right: 6px; + background: #007AFF; + color: white; + border: none; + border-radius: 4px; + padding: 3px 6px; + font-size: 0.7rem; + font-weight: 600; + cursor: pointer; + opacity: 0; + transition: all 0.2s ease; + box-shadow: 0 1px 3px rgba(0, 122, 255, 0.25); +} + +.suggestion-item:hover .copy-btn { + opacity: 1; +} + +.copy-btn:hover { + background: #0056CC; + transform: translateY(-1px); +} + +.error { + color: #FF3B30; + background: rgba(255, 59, 48, 0.1); + border: 1px solid rgba(255, 59, 48, 0.2); + padding: 12px; + border-radius: 8px; + margin-top: 12px; + font-weight: 500; + backdrop-filter: blur(8px); + font-size: 0.85rem; +} + +.success-toast { + position: fixed; + top: 15px; + right: 15px; + background: #34C759; + color: white; + padding: 8px 16px; + border-radius: 8px; + box-shadow: 0 4px 16px rgba(52, 199, 89, 0.3); + z-index: 1000; + opacity: 0; + transform: translateX(100%); + transition: all 0.3s ease; + font-weight: 600; + backdrop-filter: blur(15px); + font-size: 0.85rem; +} + +.success-toast.show { + opacity: 1; + transform: translateX(0); +} + +/* 移动端优化 */ +@media (max-width: 480px) { + body { + padding: 4px; + } + + .container { + padding: 12px; + border-radius: 12px; + } + + .title { + font-size: 1.3rem; + } + + .subtitle { + font-size: 0.85rem; + margin-bottom: 12px; + } + + .form-group { + margin-bottom: 12px; + } + + .form-input { + padding: 8px 10px; + font-size: 0.85rem; + } + + .textarea { + min-height: 70px; + } + + .btn { + padding: 10px; + font-size: 0.85rem; + } + + .result-section { + margin-top: 16px; + } + + .poem-output, + .result-container, + .suggestions-container { + padding: 12px; + min-height: 100px; + } + + .poem-output { + font-size: 0.9rem; + } + + .result-card { + padding: 10px; + } + + .suggestion-item { + padding: 8px; + min-height: 50px; + } + + .variable-name { + font-size: 0.85rem; + } + + .variable-description { + font-size: 0.75rem; + } + + .copy-btn { + position: static; + opacity: 1; + margin-top: 4px; + width: 100%; + padding: 4px 6px; + font-size: 0.7rem; + } +} + +/* 动画效果 */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(8px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.suggestion-item, +.result-card { + animation: fadeIn 0.3s ease; +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +.loading { + animation: pulse 1.5s ease-in-out infinite; +} diff --git a/InfoGenie-frontend/public/assets/favicon.ico b/InfoGenie-frontend/public/assets/favicon.ico new file mode 100644 index 00000000..ce3745c3 Binary files /dev/null and b/InfoGenie-frontend/public/assets/favicon.ico differ diff --git a/InfoGenie-frontend/public/assets/fonts/kaiti1.ttf b/InfoGenie-frontend/public/assets/fonts/kaiti1.ttf deleted file mode 100644 index e3c7007c..00000000 Binary files a/InfoGenie-frontend/public/assets/fonts/kaiti1.ttf and /dev/null differ diff --git a/InfoGenie-frontend/public/assets/logo.png b/InfoGenie-frontend/public/assets/logo.png index 4c81f1ac..a212dd91 100755 Binary files a/InfoGenie-frontend/public/assets/logo.png and b/InfoGenie-frontend/public/assets/logo.png differ diff --git a/InfoGenie-frontend/public/assets/圆角-logo.png b/InfoGenie-frontend/public/assets/圆角-logo.png deleted file mode 100644 index ef7d5fc2..00000000 Binary files a/InfoGenie-frontend/public/assets/圆角-logo.png and /dev/null differ diff --git a/InfoGenie-frontend/public/icons/apple-touch-icon.png b/InfoGenie-frontend/public/icons/apple-touch-icon.png index 626e9bc8..a7f8a7a9 100644 Binary files a/InfoGenie-frontend/public/icons/apple-touch-icon.png and b/InfoGenie-frontend/public/icons/apple-touch-icon.png differ diff --git a/InfoGenie-frontend/public/icons/favicon-16.png b/InfoGenie-frontend/public/icons/favicon-16.png index bc87eedb..bfbada15 100644 Binary files a/InfoGenie-frontend/public/icons/favicon-16.png and b/InfoGenie-frontend/public/icons/favicon-16.png differ diff --git a/InfoGenie-frontend/public/icons/favicon-32.png b/InfoGenie-frontend/public/icons/favicon-32.png index bc180073..495ccffa 100644 Binary files a/InfoGenie-frontend/public/icons/favicon-32.png and b/InfoGenie-frontend/public/icons/favicon-32.png differ diff --git a/InfoGenie-frontend/public/icons/icon-192-maskable.png b/InfoGenie-frontend/public/icons/icon-192-maskable.png index e3bfe560..281fbf46 100644 Binary files a/InfoGenie-frontend/public/icons/icon-192-maskable.png and b/InfoGenie-frontend/public/icons/icon-192-maskable.png differ diff --git a/InfoGenie-frontend/public/icons/icon-192.png b/InfoGenie-frontend/public/icons/icon-192.png index 3e941db8..281fbf46 100644 Binary files a/InfoGenie-frontend/public/icons/icon-192.png and b/InfoGenie-frontend/public/icons/icon-192.png differ diff --git a/InfoGenie-frontend/public/icons/icon-512-maskable.png b/InfoGenie-frontend/public/icons/icon-512-maskable.png index 9a9d66f1..108137c4 100644 Binary files a/InfoGenie-frontend/public/icons/icon-512-maskable.png and b/InfoGenie-frontend/public/icons/icon-512-maskable.png differ diff --git a/InfoGenie-frontend/public/icons/icon-512.png b/InfoGenie-frontend/public/icons/icon-512.png index 92c0ea3f..108137c4 100644 Binary files a/InfoGenie-frontend/public/icons/icon-512.png and b/InfoGenie-frontend/public/icons/icon-512.png differ diff --git a/InfoGenie-frontend/public/index.html b/InfoGenie-frontend/public/index.html index 8e187995..55dcd0f0 100755 --- a/InfoGenie-frontend/public/index.html +++ b/InfoGenie-frontend/public/index.html @@ -3,19 +3,19 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -24,15 +24,15 @@ - - - - - - - - - + + + + + + + + + @@ -44,282 +44,135 @@ 万象口袋 @@ -327,41 +180,38 @@ - -
    -
    - + +
    +
    + +
    +
    +
    -
    - 万象口袋 -
    - 🎨 一个跨平台的多功能聚合应用(´。• ω •。`) 💬 -
    -
    +
    万象口袋
    +
    加载中
    +
    +
    +
    +
    - - + window.addEventListener('error', function(e) { + console.error('应用加载错误:', e.error); + }); + + + diff --git a/InfoGenie-frontend/public/manifest.json b/InfoGenie-frontend/public/manifest.json index 95ef1902..6c2dbde1 100755 --- a/InfoGenie-frontend/public/manifest.json +++ b/InfoGenie-frontend/public/manifest.json @@ -1,42 +1,42 @@ -{ - "short_name": "万象口袋", - "name": "✨ 万象口袋 - 多功能聚合应用", - "description": "🎨 一个多功能的聚合软件应用,提供聚合应用、休闲小游戏、AI模型工具等丰富功能", - "icons": [ - { - "src": "/icons/icon-192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "/icons/icon-512.png", - "type": "image/png", - "sizes": "512x512" - }, - { - "src": "/icons/icon-192-maskable.png", - "type": "image/png", - "sizes": "192x192", - "purpose": "maskable" - }, - { - "src": "/icons/icon-512-maskable.png", - "type": "image/png", - "sizes": "512x512", - "purpose": "maskable" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#667eea", - "background_color": "#ffffff", - "orientation": "portrait-primary", - "scope": ".", - "lang": "zh-CN", - "categories": ["utilities", "productivity", "entertainment"], - "screenshots": [ - { - "src": "data:image/svg+xml,万象口袋", +{ + "short_name": "万象口袋", + "name": "万象口袋 - 多功能聚合应用", + "description": "万象口袋 - 多功能聚合应用", + "icons": [ + { + "src": "/icons/icon-192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "/icons/icon-512.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "/icons/icon-192-maskable.png", + "type": "image/png", + "sizes": "192x192", + "purpose": "maskable" + }, + { + "src": "/icons/icon-512-maskable.png", + "type": "image/png", + "sizes": "512x512", + "purpose": "maskable" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#667eea", + "background_color": "#ffffff", + "orientation": "portrait-primary", + "scope": ".", + "lang": "zh-CN", + "categories": ["utilities", "productivity", "entertainment"], + "screenshots": [ + { + "src": "data:image/svg+xml,万象口袋", "type": "image/svg+xml", "sizes": "400x800", "form_factor": "narrow" diff --git a/InfoGenie-frontend/public/smallgame/2048/game-logic.js b/InfoGenie-frontend/public/smallgame/2048/game-logic.js index 4ebfdbb8..5c1a49b3 100755 --- a/InfoGenie-frontend/public/smallgame/2048/game-logic.js +++ b/InfoGenie-frontend/public/smallgame/2048/game-logic.js @@ -1,152 +1,22 @@ -// 2048游戏核心逻辑 class Game2048 { constructor() { this.size = 4; this.grid = []; this.score = 0; - this.gameWon = false; this.gameOver = false; this.moved = false; - - // 游戏统计数据 - this.stats = { - moves: 0, - startTime: null, - gameTime: 0, - maxTile: 2, - mergeCount: 0 - }; - + this.stats = { moves: 0, startTime: null, gameTime: 0, maxTile: 2, mergeCount: 0 }; + this.initializeGrid(); this.updateDisplay(); this.addRandomTile(); this.addRandomTile(); this.updateDisplay(); - - // 绑定事件 this.bindEvents(); - - // 开始计时 this.startTimer(); } - // 依据分数计算权重(0.1 ~ 0.95) - calculateWeightByScore(score) { - const w = score / 4000; // 4000分约接近满权重 - return Math.max(0.1, Math.min(0.95, w)); - } - - // 按权重偏向生成0~10的随机整数,权重越高越偏向更大值 - biasedRandomInt(maxInclusive, weight) { - const rand = Math.random(); - const biased = Math.pow(rand, 1 - weight); // weight越大,biased越接近1 - const val = Math.floor(biased * (maxInclusive + 1)); - return Math.max(0, Math.min(maxInclusive, val)); - } - - // 附加结束信息到界面 - appendEndInfo(text, type = 'info') { - const message = document.getElementById('game-message'); - if (!message) return; - const info = document.createElement('div'); - info.style.marginTop = '10px'; - info.style.fontSize = '16px'; - info.style.color = type === 'error' ? '#d9534f' : (type === 'success' ? '#28a745' : '#776e65'); - info.textContent = text; - message.appendChild(info); - } - - // 游戏结束时尝试给当前登录账户加“萌芽币” - async tryAwardCoinsOnGameOver() { - try { - const token = localStorage.getItem('token'); - if (!token) { - this.appendEndInfo('未登录,无法获得萌芽币'); - return; - } - - let email = null; - try { - const userStr = localStorage.getItem('user'); - if (userStr) { - const userObj = JSON.parse(userStr); - email = userObj && (userObj.email || userObj['邮箱']); - } - } catch (e) { - // 忽略解析错误 - } - - if (!email) { - this.appendEndInfo('未找到账户信息(email),无法加币', 'error'); - return; - } - - // 根据分数计算权重与概率 - const weight = this.calculateWeightByScore(this.score); - let awardProbability = weight; // 默认用权重作为概率 - let guaranteed = false; - - // 分数≥500时必定触发奖励 - if (this.score >= 500) { - awardProbability = 1; - guaranteed = true; - } - - const roll = Math.random(); - if (roll > awardProbability) { - this.appendEndInfo('本局未获得萌芽币'); - return; - } - - // 生成0~10随机萌芽币数量,权重越高越偏向更大值 - let coins = this.biasedRandomInt(5, weight); - // 保底至少 1 个(仅当分数≥500时) - if (guaranteed) { - coins = Math.max(1, coins); - } - coins = Math.max(0, Math.min(10, coins)); - - if (coins <= 0) { - this.appendEndInfo('本局未获得萌芽币'); - return; - } - - // 后端 API base URL(从父窗口ENV_CONFIG获取,回退到本地默认) - const apiBase = (window.parent && window.parent.ENV_CONFIG && window.parent.ENV_CONFIG.API_URL) - ? window.parent.ENV_CONFIG.API_URL - : ((window.ENV_CONFIG && window.ENV_CONFIG.API_URL) ? window.ENV_CONFIG.API_URL : 'http://127.0.0.1:5002'); - - const resp = await fetch(`${apiBase}/api/user/add-coins`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ email, amount: coins }) - }); - - if (!resp.ok) { - const err = await resp.json().catch(() => ({})); - const msg = err && (err.message || err.error) ? (err.message || err.error) : `请求失败(${resp.status})`; - this.appendEndInfo(`加币失败:${msg}`, 'error'); - return; - } - - const data = await resp.json(); - if (data && data.success) { - const newCoins = data.data && data.data.new_coins; - this.appendEndInfo(`恭喜获得 ${coins} 个萌芽币!当前余额:${newCoins}`, 'success'); - } else { - const msg = (data && (data.message || data.error)) || '未知错误'; - this.appendEndInfo(`加币失败:${msg}`, 'error'); - } - } catch (e) { - console.error('加币流程发生错误:', e); - this.appendEndInfo('加币失败:网络或系统错误', 'error'); - } - } - initializeGrid() { this.grid = []; for (let i = 0; i < this.size; i++) { @@ -156,468 +26,216 @@ class Game2048 { } } } - + addRandomTile() { const emptyCells = []; for (let i = 0; i < this.size; i++) { for (let j = 0; j < this.size; j++) { - if (this.grid[i][j] === 0) { - emptyCells.push({x: i, y: j}); - } + if (this.grid[i][j] === 0) emptyCells.push({ x: i, y: j }); } } - if (emptyCells.length > 0) { - const randomCell = emptyCells[Math.floor(Math.random() * emptyCells.length)]; + const cell = emptyCells[Math.floor(Math.random() * emptyCells.length)]; const value = Math.random() < 0.9 ? 2 : 4; - this.grid[randomCell.x][randomCell.y] = value; - - // 创建新方块动画 - this.createTileElement(randomCell.x, randomCell.y, value, true); + this.grid[cell.x][cell.y] = value; + this.createTileElement(cell.x, cell.y, value, true); } } - + createTileElement(x, y, value, isNew = false) { const container = document.getElementById('tile-container'); const tile = document.createElement('div'); tile.className = `tile tile-${value}`; if (isNew) tile.classList.add('tile-new'); - tile.textContent = value; - tile.style.left = `${y * (100/4)}%`; - tile.style.top = `${x * (100/4)}%`; + tile.style.left = `${y * 25}%`; + tile.style.top = `${x * 25}%`; tile.dataset.x = x; tile.dataset.y = y; tile.dataset.value = value; - container.appendChild(tile); - - // 移除动画类 - setTimeout(() => { - tile.classList.remove('tile-new'); - }, 200); + setTimeout(() => tile.classList.remove('tile-new'), 200); } - + updateDisplay() { - // 清除所有方块 const container = document.getElementById('tile-container'); container.innerHTML = ''; - - // 重新创建所有方块 for (let i = 0; i < this.size; i++) { for (let j = 0; j < this.size; j++) { - if (this.grid[i][j] !== 0) { - this.createTileElement(i, j, this.grid[i][j]); - } + if (this.grid[i][j] !== 0) this.createTileElement(i, j, this.grid[i][j]); } } - - // 更新分数 document.getElementById('score').textContent = this.score; - - // 更新统计数据显示 - if (window.gameStats) { - window.gameStats.updateDisplay(); - } } - + move(direction) { if (this.gameOver) return; - this.moved = false; - const previousGrid = this.grid.map(row => [...row]); - + switch (direction) { - case 'up': - this.moveUp(); - break; - case 'down': - this.moveDown(); - break; - case 'left': - this.moveLeft(); - break; - case 'right': - this.moveRight(); - break; + case 'up': this.moveUp(); break; + case 'down': this.moveDown(); break; + case 'left': this.moveLeft(); break; + case 'right': this.moveRight(); break; } - + if (this.moved) { this.stats.moves++; this.addRandomTile(); this.updateDisplay(); - + if (this.isGameWon() && !this.gameWon) { this.gameWon = true; - this.showGameWon(); + this.showEndScreen('你赢了!🎉'); } else if (this.isGameOver()) { this.gameOver = true; - this.showGameOver(); + this.showEndScreen('游戏结束!'); } } } - + moveLeft() { for (let i = 0; i < this.size; i++) { - const row = this.grid[i].filter(val => val !== 0); + const row = this.grid[i].filter(v => v !== 0); const merged = []; - for (let j = 0; j < row.length - 1; j++) { if (row[j] === row[j + 1] && !merged[j] && !merged[j + 1]) { - row[j] *= 2; - this.score += row[j]; - this.stats.mergeCount++; + row[j] *= 2; this.score += row[j]; this.stats.mergeCount++; this.stats.maxTile = Math.max(this.stats.maxTile, row[j]); - row[j + 1] = 0; - merged[j] = true; + row[j + 1] = 0; merged[j] = true; } } - - const newRow = row.filter(val => val !== 0); - while (newRow.length < this.size) { - newRow.push(0); - } - + const newRow = row.filter(v => v !== 0); + while (newRow.length < this.size) newRow.push(0); for (let j = 0; j < this.size; j++) { - if (this.grid[i][j] !== newRow[j]) { - this.moved = true; - } + if (this.grid[i][j] !== newRow[j]) this.moved = true; this.grid[i][j] = newRow[j]; } } } - + moveRight() { for (let i = 0; i < this.size; i++) { - const row = this.grid[i].filter(val => val !== 0); + const row = this.grid[i].filter(v => v !== 0); const merged = []; - for (let j = row.length - 1; j > 0; j--) { if (row[j] === row[j - 1] && !merged[j] && !merged[j - 1]) { - row[j] *= 2; - this.score += row[j]; - this.stats.mergeCount++; + row[j] *= 2; this.score += row[j]; this.stats.mergeCount++; this.stats.maxTile = Math.max(this.stats.maxTile, row[j]); - row[j - 1] = 0; - merged[j] = true; + row[j - 1] = 0; merged[j] = true; } } - - const newRow = row.filter(val => val !== 0); - while (newRow.length < this.size) { - newRow.unshift(0); - } - + const newRow = row.filter(v => v !== 0); + while (newRow.length < this.size) newRow.unshift(0); for (let j = 0; j < this.size; j++) { - if (this.grid[i][j] !== newRow[j]) { - this.moved = true; - } + if (this.grid[i][j] !== newRow[j]) this.moved = true; this.grid[i][j] = newRow[j]; } } } - + moveUp() { for (let j = 0; j < this.size; j++) { - const column = []; - for (let i = 0; i < this.size; i++) { - if (this.grid[i][j] !== 0) { - column.push(this.grid[i][j]); - } - } - + const col = []; + for (let i = 0; i < this.size; i++) { if (this.grid[i][j] !== 0) col.push(this.grid[i][j]); } const merged = []; - for (let i = 0; i < column.length - 1; i++) { - if (column[i] === column[i + 1] && !merged[i] && !merged[i + 1]) { - column[i] *= 2; - this.score += column[i]; - this.stats.mergeCount++; - this.stats.maxTile = Math.max(this.stats.maxTile, column[i]); - column[i + 1] = 0; - merged[i] = true; + for (let i = 0; i < col.length - 1; i++) { + if (col[i] === col[i + 1] && !merged[i] && !merged[i + 1]) { + col[i] *= 2; this.score += col[i]; this.stats.mergeCount++; + this.stats.maxTile = Math.max(this.stats.maxTile, col[i]); + col[i + 1] = 0; merged[i] = true; } } - - const newColumn = column.filter(val => val !== 0); - while (newColumn.length < this.size) { - newColumn.push(0); - } - + const newCol = col.filter(v => v !== 0); + while (newCol.length < this.size) newCol.push(0); for (let i = 0; i < this.size; i++) { - if (this.grid[i][j] !== newColumn[i]) { - this.moved = true; - } - this.grid[i][j] = newColumn[i]; + if (this.grid[i][j] !== newCol[i]) this.moved = true; + this.grid[i][j] = newCol[i]; } } } - + moveDown() { for (let j = 0; j < this.size; j++) { - const column = []; - for (let i = 0; i < this.size; i++) { - if (this.grid[i][j] !== 0) { - column.push(this.grid[i][j]); - } - } - + const col = []; + for (let i = 0; i < this.size; i++) { if (this.grid[i][j] !== 0) col.push(this.grid[i][j]); } const merged = []; - for (let i = column.length - 1; i > 0; i--) { - if (column[i] === column[i - 1] && !merged[i] && !merged[i - 1]) { - column[i] *= 2; - this.score += column[i]; - this.stats.mergeCount++; - this.stats.maxTile = Math.max(this.stats.maxTile, column[i]); - column[i - 1] = 0; - merged[i] = true; + for (let i = col.length - 1; i > 0; i--) { + if (col[i] === col[i - 1] && !merged[i] && !merged[i - 1]) { + col[i] *= 2; this.score += col[i]; this.stats.mergeCount++; + this.stats.maxTile = Math.max(this.stats.maxTile, col[i]); + col[i - 1] = 0; merged[i] = true; } } - - const newColumn = column.filter(val => val !== 0); - while (newColumn.length < this.size) { - newColumn.unshift(0); - } - + const newCol = col.filter(v => v !== 0); + while (newCol.length < this.size) newCol.unshift(0); for (let i = 0; i < this.size; i++) { - if (this.grid[i][j] !== newColumn[i]) { - this.moved = true; - } - this.grid[i][j] = newColumn[i]; + if (this.grid[i][j] !== newCol[i]) this.moved = true; + this.grid[i][j] = newCol[i]; } } } - + isGameWon() { - for (let i = 0; i < this.size; i++) { - for (let j = 0; j < this.size; j++) { - if (this.grid[i][j] === 2048) { - return true; - } - } - } + for (let i = 0; i < this.size; i++) + for (let j = 0; j < this.size; j++) + if (this.grid[i][j] === 2048) return true; return false; } - + isGameOver() { - // 检查是否有空格 - for (let i = 0; i < this.size; i++) { + for (let i = 0; i < this.size; i++) for (let j = 0; j < this.size; j++) { - if (this.grid[i][j] === 0) { + if (this.grid[i][j] === 0) return false; + const c = this.grid[i][j]; + if ((i > 0 && this.grid[i-1][j] === c) || (i < this.size-1 && this.grid[i+1][j] === c) || + (j > 0 && this.grid[i][j-1] === c) || (j < this.size-1 && this.grid[i][j+1] === c)) return false; - } } - } - - // 检查是否可以合并 - for (let i = 0; i < this.size; i++) { - for (let j = 0; j < this.size; j++) { - const current = this.grid[i][j]; - if ( - (i > 0 && this.grid[i - 1][j] === current) || - (i < this.size - 1 && this.grid[i + 1][j] === current) || - (j > 0 && this.grid[i][j - 1] === current) || - (j < this.size - 1 && this.grid[i][j + 1] === current) - ) { - return false; - } - } - } - return true; } - - showGameWon() { + + showEndScreen(text) { const message = document.getElementById('game-message'); - message.className = 'game-message game-won'; + message.className = 'game-message ' + (this.gameWon ? 'game-won' : 'game-over'); message.style.display = 'flex'; - message.querySelector('p').textContent = '你赢了!'; - - // 胜利也尝试加币(异步,不阻塞UI) - this.tryAwardCoinsOnGameOver(); - - // 显示最终统计 - setTimeout(() => { - if (window.gameStats) { - window.gameStats.showFinalStats(); - } - }, 1000); + message.querySelector('p').innerHTML = + `${text}
    ` + + `得分 ${this.score} · 步数 ${this.stats.moves} · ` + + `最大方块 ${this.stats.maxTile} · 用时 ${this.stats.gameTime}秒`; } - - showGameOver() { - const message = document.getElementById('game-message'); - message.className = 'game-message game-over'; - message.style.display = 'flex'; - message.querySelector('p').textContent = '游戏结束!'; - - // 渲染排行榜 - try { - this.renderLeaderboard(); - } catch (e) { - console.error('渲染排行榜时发生错误:', e); - } - - // 尝试加币(异步,不阻塞UI) - this.tryAwardCoinsOnGameOver(); - // 显示最终统计 - setTimeout(() => { - if (window.gameStats) { - window.gameStats.showFinalStats(); - } - }, 1000); - } - restart() { this.score = 0; this.gameWon = false; this.gameOver = false; this.moved = false; - - // 重置统计数据 - this.stats = { - moves: 0, - startTime: null, - gameTime: 0, - maxTile: 2, - mergeCount: 0 - }; - + this.stats = { moves: 0, startTime: null, gameTime: 0, maxTile: 2, mergeCount: 0 }; this.initializeGrid(); this.addRandomTile(); this.addRandomTile(); this.updateDisplay(); - - // 隐藏游戏消息 document.getElementById('game-message').style.display = 'none'; - - // 重新开始计时 this.startTimer(); } - - startTimer() { this.stats.startTime = Date.now(); - - if (this.timerInterval) { - clearInterval(this.timerInterval); - } - + if (this.timerInterval) clearInterval(this.timerInterval); this.timerInterval = setInterval(() => { if (!this.gameOver && this.stats.startTime) { this.stats.gameTime = Math.floor((Date.now() - this.stats.startTime) / 1000); - if (window.gameStats) { - window.gameStats.updateDisplay(); - } } }, 1000); } - - // 构建并渲染排行榜 - renderLeaderboard() { - const container = document.getElementById('leaderboard'); - if (!container) return; - // 生成当前玩家数据 - const today = this.formatDate(new Date()); - const currentPlayer = { - "名称": "我", - "账号": "guest-local", - "分数": this.score, - "时间": today, - _current: true - }; - - // 合并并排序数据(分数由高到低) - const baseData = (typeof playerdata !== 'undefined' && Array.isArray(playerdata)) ? playerdata : []; - const merged = [...baseData.map(d => ({...d})), currentPlayer] - .sort((a, b) => (b["分数"] || 0) - (a["分数"] || 0)); - - // 计算当前玩家排名 - const currentIndex = merged.findIndex(d => d._current); - const rank = currentIndex >= 0 ? currentIndex + 1 : '-'; - - // 仅展示前10条 - const topN = merged.slice(0, 10); - - // 生成 HTML - const summaryHtml = ` -
    - 本局分数:${this.score} - 用时:${this.stats.gameTime} - 你的排名:${rank} -
    - `; - - const headerHtml = ` -
    -
    排名
    -
    名称
    -
    分数
    -
    日期
    -
    - `; - - const rowsHtml = topN.map((d, i) => { - const isCurrent = !!d._current; - const rowClass = `leaderboard-row${isCurrent ? ' current' : ''}`; - return ` -
    -
    ${i + 1}
    -
    ${this.escapeHtml(d["名称"] || '未知')}
    -
    ${d["分数"] ?? 0}
    -
    ${this.escapeHtml(d["时间"] || '-')}
    -
    - `; - }).join(''); - - container.innerHTML = ` -
    排行榜
    - ${summaryHtml} -
    - ${headerHtml} -
    ${rowsHtml}
    -
    - `; - } - - // 工具:日期格式化 YYYY-MM-DD - formatDate(date) { - const y = date.getFullYear(); - const m = String(date.getMonth() + 1).padStart(2, '0'); - const d = String(date.getDate()).padStart(2, '0'); - return `${y}-${m}-${d}`; - } - - // 工具:简单转义以避免 XSS - escapeHtml(str) { - return String(str) - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/\"/g, '"') - .replace(/'/g, '''); - } - bindEvents() { - // 重试按钮 - document.getElementById('retry-btn').addEventListener('click', () => { - this.restart(); - }); + document.getElementById('retry-btn').addEventListener('click', () => this.restart()); } - - } -// 游戏实例 let game; - -// 页面加载完成后初始化游戏 document.addEventListener('DOMContentLoaded', () => { game = new Game2048(); - - - - // 导出游戏实例供其他模块使用 window.game2048 = game; -}); \ No newline at end of file +}); diff --git a/InfoGenie-frontend/public/smallgame/2048/gamedata.js b/InfoGenie-frontend/public/smallgame/2048/gamedata.js deleted file mode 100644 index 59e41662..00000000 --- a/InfoGenie-frontend/public/smallgame/2048/gamedata.js +++ /dev/null @@ -1,20 +0,0 @@ -const playerdata = [ - { - "名称":"树萌芽", - "账号":"3205788256@qq.com", - "分数":1232, - "时间":"2025-09-08" - }, - { - "名称":"柚大青", - "账号":"2143323382@qq.com", - "分数":132, - "时间":"2025-09-21" - }, - { - "名称":"牛马", - "账号":"2973419538@qq.com", - "分数":876, - "时间":"2025-09-25" - } -] \ No newline at end of file diff --git a/InfoGenie-frontend/public/smallgame/2048/index.html b/InfoGenie-frontend/public/smallgame/2048/index.html index 11a8f6c0..41e1a707 100755 --- a/InfoGenie-frontend/public/smallgame/2048/index.html +++ b/InfoGenie-frontend/public/smallgame/2048/index.html @@ -22,8 +22,6 @@

    - -
    @@ -66,7 +64,6 @@ - diff --git a/InfoGenie-frontend/public/smallgame/2048/styles.css b/InfoGenie-frontend/public/smallgame/2048/styles.css index f3c76763..0fb12299 100755 --- a/InfoGenie-frontend/public/smallgame/2048/styles.css +++ b/InfoGenie-frontend/public/smallgame/2048/styles.css @@ -237,91 +237,6 @@ body { transition: all 0.3s ease; } -/* 排行榜样式(与 2048 主题一致) */ -.leaderboard { - width: 100%; - max-width: 440px; - background: rgba(250, 248, 239, 0.95); /* #faf8ef */ - border-radius: 12px; - padding: 12px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); - color: #776e65; -} - -.leaderboard-title { - font-size: 22px; - font-weight: 700; - color: #8f7a66; - margin-bottom: 8px; - letter-spacing: 0.5px; -} - -.leaderboard-summary { - display: flex; - flex-wrap: wrap; - gap: 10px; - font-size: 14px; - color: #8f7a66; - margin-bottom: 10px; -} -.leaderboard-summary strong { - color: #8f7a66; -} - -.leaderboard-table { - border: 1px solid rgba(187, 173, 160, 0.3); /* #bbada0 */ - border-radius: 10px; - overflow: hidden; - background: rgba(238, 228, 218, 0.4); /* #eee4da */ -} - -.leaderboard-header, -.leaderboard-row { - display: grid; - grid-template-columns: 64px 1fr 90px 120px; /* 排名/名称/分数/日期 */ - align-items: center; -} - -.leaderboard-header { - background: #eee4da; - color: #776e65; - font-weight: 700; - padding: 8px 10px; - border-bottom: 1px solid rgba(187, 173, 160, 0.3); -} - -.leaderboard-body { - max-height: 220px; - overflow-y: auto; - background: rgba(238, 228, 218, 0.25); -} - -.leaderboard-row { - padding: 8px 10px; - border-top: 1px solid rgba(187, 173, 160, 0.15); -} -.leaderboard-row:nth-child(odd) { - background: rgba(238, 228, 218, 0.22); -} -.leaderboard-row.current { - background: #f3e9d4; - box-shadow: inset 0 0 0 2px rgba(143, 122, 102, 0.35); -} - -.leaderboard-col.rank { - text-align: center; - font-weight: 700; - color: #8f7a66; -} -.leaderboard-col.score { - text-align: right; - font-weight: 700; -} -.leaderboard-col.time { - text-align: right; - color: #776e65; -} - .retry-button:hover { background: #9f8a76; transform: translateY(-2px); diff --git a/InfoGenie-frontend/public/smallgame/floppybird/.gitignore b/InfoGenie-frontend/public/smallgame/floppybird/.gitignore new file mode 100644 index 00000000..c2658d7d --- /dev/null +++ b/InfoGenie-frontend/public/smallgame/floppybird/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/.wrangler/cache/pages.json b/InfoGenie-frontend/public/smallgame/floppybird/.wrangler/cache/pages.json new file mode 100644 index 00000000..eb1dfb0b --- /dev/null +++ b/InfoGenie-frontend/public/smallgame/floppybird/.wrangler/cache/pages.json @@ -0,0 +1,4 @@ +{ + "account_id": "3fdbaad92364222635c5c1c41ff1af8b", + "project_name": "floppy-bird" +} \ No newline at end of file diff --git a/InfoGenie-frontend/public/smallgame/floppybird/.wrangler/cache/wrangler-account.json b/InfoGenie-frontend/public/smallgame/floppybird/.wrangler/cache/wrangler-account.json new file mode 100644 index 00000000..3d01dad3 --- /dev/null +++ b/InfoGenie-frontend/public/smallgame/floppybird/.wrangler/cache/wrangler-account.json @@ -0,0 +1,6 @@ +{ + "account": { + "id": "3fdbaad92364222635c5c1c41ff1af8b", + "name": "shumengya" + } +} \ No newline at end of file diff --git a/InfoGenie-frontend/public/smallgame/floppybird/LICENSE b/InfoGenie-frontend/public/smallgame/floppybird/LICENSE new file mode 100644 index 00000000..2bb9ad24 --- /dev/null +++ b/InfoGenie-frontend/public/smallgame/floppybird/LICENSE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/InfoGenie-frontend/public/smallgame/floppybird/README.md b/InfoGenie-frontend/public/smallgame/floppybird/README.md new file mode 100644 index 00000000..d1fe74b7 --- /dev/null +++ b/InfoGenie-frontend/public/smallgame/floppybird/README.md @@ -0,0 +1,51 @@ + + +# [play floppy bird](https://nebezb.com/floppybird/) + +If you missed the Flappy Bird hype, here's your chance to try the best vintage knockoff. + +**Features** + +* 🎉 good ol' div's for all the objects and graphics, +* 🖥 scales perfectly on almost any screen, both mobile and desktop, +* 💩 unoptimized, laggy, and not nearly as fast as a canvas implementation, +* 👷‍♂️ a typescript version that does almost nothing better over at [ts-floppybird](https://github.com/nebez/ts-floppybird)! + +Enjoy. + +https://nebezb.com/floppybird/ (or play [**easy mode**](https://nebezb.com/floppybird/?easy)) + +### Clones + +* https://wanderingstan.github.io/handybird/ + * **[@wanderinstan](https://github.com/wanderingstan)** enables hand gestures to play using doppler effect and a microphone +* http://www.hhcc.com/404 + * **[Hill Holiday](http://www.hhcc.com/)** using it for their 404 +* http://heart-work.se/duvchi + * promotional campaign for an album release +* https://www.progressivewebflap.com/ + * **[@jsonthor](https://twitter.com/jsonthor)** lets you take floppy bird with you as a progressive web app +* https://github.com/rukmal/FlappyLeapBird + * **[Rukmal](http://rukmal.me/)** integrates the LeapMotion Controller +* http://chrisbeaumont.github.io/floppybird/ + * **[@chrisbeaumont](https://github.com/chrisbeaumont)** puts the bird on auto-pilot +* http://www.lobe.io/flappy-math-saga/ + * **[@tikwid](https://github.com/tikwid)** teaches you math +* http://dota2.cyborgmatt.com/flappydota/ + * flappy dota +* http://labs.aylien.com/flappy-bird/ + * **[@mdibaiee/flappy-es](https://github.com/mdibaiee/flappy-es)** brings skynet to floppy bird +* https://emu.edu/gaming-hub/flappy-huxman-game/ + * university celebrates 100 years by putting President Susan Huxman on a floppy bird body +* https://www.docker.com/blog/creating-the-kubecon-flappy-dock-extension/ + * a Docker-themed fork that was turned into a Docker Extension for KubeCon EU 2022 ([source available here](https://github.com/mikesir87/floppybird)) +* http://flappydragon.attim.in/ + * **[@iarunava/flappydragon](https://github.com/iarunava/flappydragon)** redesign flappy bird for Game of Thrones. + +### Notice + +The assets powering the visual element of the game have all been extracted directly from the Flappy Bird android game. I do not own the assets, nor do I have explicit permission to use them from their creator. They are the work and copyright of original creator Dong Nguyen and .GEARS games (http://www.dotgears.com/). + +I took this Tweet (https://twitter.com/dongatory/status/431060041009856512 / http://i.imgur.com/AcyWyqf.png) by Dong Nguyen, the creator of the game, as an open invitation to reuse the game concept and assets in an open source project. There is no intention to steal the game, monetize it, or claim it as my own. + +If the copyright holder would like for the assets to be removed, please open an issue to start the conversation. diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/bird.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/bird.png new file mode 100644 index 00000000..71f2cf49 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/bird.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/ceiling.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/ceiling.png new file mode 100644 index 00000000..ca0d6652 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/ceiling.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big.psd b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big.psd new file mode 100644 index 00000000..1fb7ddf1 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big.psd differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_0.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_0.png new file mode 100644 index 00000000..894e22d2 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_0.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_1.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_1.png new file mode 100644 index 00000000..ecdeed33 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_1.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_2.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_2.png new file mode 100644 index 00000000..4c541ee1 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_2.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_3.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_3.png new file mode 100644 index 00000000..8e04cdd4 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_3.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_4.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_4.png new file mode 100644 index 00000000..3d48beb9 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_4.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_5.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_5.png new file mode 100644 index 00000000..8ac9c8a3 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_5.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_6.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_6.png new file mode 100644 index 00000000..4b18cf14 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_6.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_7.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_7.png new file mode 100644 index 00000000..2323a63c Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_7.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_8.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_8.png new file mode 100644 index 00000000..434b31b0 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_8.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_9.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_9.png new file mode 100644 index 00000000..4723fe5e Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_big_9.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small.psd b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small.psd new file mode 100644 index 00000000..772c2e3b Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small.psd differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_0.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_0.png new file mode 100644 index 00000000..6ba492ef Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_0.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_1.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_1.png new file mode 100644 index 00000000..c2e989c0 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_1.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_2.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_2.png new file mode 100644 index 00000000..57edbd37 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_2.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_3.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_3.png new file mode 100644 index 00000000..81d1efaa Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_3.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_4.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_4.png new file mode 100644 index 00000000..fd2400e8 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_4.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_5.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_5.png new file mode 100644 index 00000000..b11da485 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_5.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_6.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_6.png new file mode 100644 index 00000000..e69e7675 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_6.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_7.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_7.png new file mode 100644 index 00000000..203848ab Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_7.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_8.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_8.png new file mode 100644 index 00000000..7a02d8ff Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_8.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_9.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_9.png new file mode 100644 index 00000000..651d926e Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/font_small_9.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/land.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/land.png new file mode 100644 index 00000000..3f28e1aa Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/land.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/medal_bronze.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/medal_bronze.png new file mode 100644 index 00000000..6dcbb362 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/medal_bronze.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/medal_gold.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/medal_gold.png new file mode 100644 index 00000000..d50f852b Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/medal_gold.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/medal_platinum.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/medal_platinum.png new file mode 100644 index 00000000..d63796f8 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/medal_platinum.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/medal_silver.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/medal_silver.png new file mode 100644 index 00000000..6df0be62 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/medal_silver.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/pipe-down.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/pipe-down.png new file mode 100644 index 00000000..7164af46 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/pipe-down.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/pipe-up.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/pipe-up.png new file mode 100644 index 00000000..ecd2eb56 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/pipe-up.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/pipe.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/pipe.png new file mode 100644 index 00000000..69c58b6b Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/pipe.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/replay.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/replay.png new file mode 100644 index 00000000..28c7e48c Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/replay.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/scoreboard.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/scoreboard.png new file mode 100644 index 00000000..56a3bb5a Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/scoreboard.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/sky.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/sky.png new file mode 100644 index 00000000..7bf035fe Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/sky.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_die.ogg b/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_die.ogg new file mode 100644 index 00000000..a980e921 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_die.ogg differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_hit.ogg b/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_hit.ogg new file mode 100644 index 00000000..72d821a6 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_hit.ogg differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_point.ogg b/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_point.ogg new file mode 100644 index 00000000..efb2d994 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_point.ogg differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_swooshing.ogg b/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_swooshing.ogg new file mode 100644 index 00000000..f483cd6c Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_swooshing.ogg differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_wing.ogg b/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_wing.ogg new file mode 100644 index 00000000..76e3a2af Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/sounds/sfx_wing.ogg differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/splash.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/splash.png new file mode 100644 index 00000000..61fe4346 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/splash.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/assets/thumb.png b/InfoGenie-frontend/public/smallgame/floppybird/assets/thumb.png new file mode 100644 index 00000000..a77550d5 Binary files /dev/null and b/InfoGenie-frontend/public/smallgame/floppybird/assets/thumb.png differ diff --git a/InfoGenie-frontend/public/smallgame/floppybird/css/main.css b/InfoGenie-frontend/public/smallgame/floppybird/css/main.css new file mode 100644 index 00000000..7d10a563 --- /dev/null +++ b/InfoGenie-frontend/public/smallgame/floppybird/css/main.css @@ -0,0 +1,374 @@ +@-webkit-keyframes animLand { + 0% { background-position: 0px 0px; } + 100% { background-position: -335px 0px; } +} +@-moz-keyframes animLand { + 0% { background-position: 0px 0px; } + 100% { background-position: -335px 0px; } +} +@-o-keyframes animLand { + 0% { background-position: 0px 0px; } + 100% { background-position: -335px 0px; } +} +@keyframes animLand { + 0% { background-position: 0px 0px; } + 100% { background-position: -335px 0px; } +} + +@-webkit-keyframes animSky { + 0% { background-position: 0px 100%; } + 100% { background-position: -275px 100%; } +} +@-moz-keyframes animSky { + 0% { background-position: 0px 100%; } + 100% { background-position: -275px 100%; } +} +@-o-keyframes animSky { + 0% { background-position: 0px 100%; } + 100% { background-position: -275px 100%; } +} +@keyframes animSky { + 0% { background-position: 0px 100%; } + 100% { background-position: -275px 100%; } +} + +@-webkit-keyframes animBird { + from { background-position: 0px 0px; } + to { background-position: 0px -96px; } +} +@-moz-keyframes animBird { + from { background-position: 0px 0px; } + to { background-position: 0px -96px; } +} +@-o-keyframes animBird { + from { background-position: 0px 0px; } + to { background-position: 0px -96px; } +} +@keyframes animBird { + from { background-position: 0px 0px; } + to { background-position: 0px -96px; } +} + +@-webkit-keyframes animPipe { + 0% { left: 900px; } + 100% { left: -100px; } +} +@-moz-keyframes animPipe { + 0% { left: 900px; } + 100% { left: -100px; } +} +@-o-keyframes animPipe { + 0% { left: 900px; } + 100% { left: -100px; } +} +@keyframes animPipe { + 0% { left: 900px; } + 100% { left: -100px; } +} + +@-webkit-keyframes animCeiling { + 0% { background-position: 0px 0px; } + 100% { background-position: -63px 0px; } +} +@-moz-keyframes animCeiling { + 0% { background-position: 0px 0px; } + 100% { background-position: -63px 0px; } +} +@-o-keyframes animCeiling { + 0% { background-position: 0px 0px; } + 100% { background-position: -63px 0px; } +} +@keyframes animCeiling { + 0% { background-position: 0px 0px; } + 100% { background-position: -63px 0px; } +} + + +*, +*:before, +*:after +{ + /* border box */ + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + /* gpu acceleration */ + -webkit-transition: translate3d(0,0,0); + /* select disable */ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +html, +body +{ + height: 100%; + overflow: hidden; + font-family: monospace; + font-size: 12px; + color: #fff; +} + +#gamecontainer +{ + position: relative; + width: 100%; + height: 100%; + min-height: 525px; +} + +/* +Screen - Game +*/ +#gamescreen +{ + position: absolute; + width: 100%; + height: 100%; +} + +#sky +{ + position: absolute; + top: 0; + width: 100%; + height: 80%; + background-image: url('../assets/sky.png'); + background-repeat: repeat-x; + background-position: 0px 100%; + background-color: #4ec0ca; + + -webkit-animation: animSky 7s linear infinite; + animation: animSky 7s linear infinite; +} + +#flyarea +{ + position: absolute; + bottom: 0; + height: 420px; + width: 100%; +} + +#ceiling +{ + position: absolute; + top: -16px; + height: 16px; + width: 100%; + background-image: url('../assets/ceiling.png'); + background-repeat: repeat-x; + + -webkit-animation: animCeiling 481ms linear infinite; + animation: animCeiling 481ms linear infinite; +} + +#land +{ + position: absolute; + bottom: 0; + width: 100%; + height: 20%; + background-image: url('../assets/land.png'); + background-repeat: repeat-x; + background-position: 0px 0px; + background-color: #ded895; + + -webkit-animation: animLand 2516ms linear infinite; + animation: animLand 2516ms linear infinite; +} + +#bigscore +{ + position: absolute; + top: 20px; + left: 150px; + z-index: 100; +} + +#bigscore img +{ + display: inline-block; + padding: 1px; +} + +#splash +{ + position: absolute; + opacity: 0; + top: 75px; + left: 65px; + width: 188px; + height: 170px; + background-image: url('../assets/splash.png'); + background-repeat: no-repeat; +} + +#scoreboard +{ + position: absolute; + display: none; + opacity: 0; + top: 64px; + left: 43px; + width: 236px; + height: 280px; + background-image: url('../assets/scoreboard.png'); + background-repeat: no-repeat; + + z-index: 1000; +} + +#medal +{ + position: absolute; + opacity: 0; + top: 114px; + left: 32px; + width: 44px; + height: 44px; +} + +#currentscore +{ + position: absolute; + top: 105px; + left: 107px; + width: 104px; + height: 14px; + text-align: right; +} + +#currentscore img +{ + padding-left: 2px; +} + +#highscore +{ + position: absolute; + top: 147px; + left: 107px; + width: 104px; + height: 14px; + text-align: right; +} + +#highscore img +{ + padding-left: 2px; +} + +#replay +{ + position: absolute; + opacity: 0; + top: 205px; + left: 61px; + height: 115px; + width: 70px; + cursor: pointer; +} + +.boundingbox +{ + position: absolute; + display: none; + top: 0; + left: 0; + width: 0; + height: 0; + border: 1px solid red; +} + +#player +{ + left: 60px; + top: 200px; +} + +.bird +{ + position: absolute; + width: 34px; + height: 24px; + background-image: url('../assets/bird.png'); + + -webkit-animation: animBird 300ms steps(4) infinite; + animation: animBird 300ms steps(4) infinite; +} + +.pipe +{ + position: absolute; + left: -100px; + width: 52px; + height: 100%; + z-index: 10; + + -webkit-animation: animPipe 7500ms linear; + animation: animPipe 7500ms linear; +} + +.pipe_upper +{ + position: absolute; + top: 0; + width: 52px; + background-image: url('../assets/pipe.png'); + background-repeat: repeat-y; + background-position: center; +} + +.pipe_upper:after +{ + content: ""; + position: absolute; + bottom: 0; + width: 52px; + height: 26px; + background-image: url('../assets/pipe-down.png'); +} + +.pipe_lower +{ + position: absolute; + bottom: 0; + width: 52px; + background-image: url('../assets/pipe.png'); + background-repeat: repeat-y; + background-position: center; +} + +.pipe_lower:after +{ + content: ""; + position: absolute; + top: 0; + width: 52px; + height: 26px; + background-image: url('../assets/pipe-up.png'); +} + +#footer +{ + position: absolute; + bottom: 3px; + left: 3px; +} + +#footer a, +#footer a:link, +#footer a:visited, +#footer a:hover, +#footer a:active +{ + display: block; + padding: 2px; + text-decoration: none; + color: #fff; +} diff --git a/InfoGenie-frontend/public/smallgame/floppybird/css/reset.css b/InfoGenie-frontend/public/smallgame/floppybird/css/reset.css new file mode 100644 index 00000000..8384bbe9 --- /dev/null +++ b/InfoGenie-frontend/public/smallgame/floppybird/css/reset.css @@ -0,0 +1,2 @@ +/* html5doctor.com Reset v1.6.1 - http://cssreset.com */ +html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,abbr,address,cite,code,del,dfn,em,img,ins,kbd,q,samp,small,strong,sub,sup,var,b,i,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent}body{line-height:1}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}nav ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:none}a{margin:0;padding:0;font-size:100%;vertical-align:baseline;background:transparent}ins{background-color:#ff9;color:#000;text-decoration:none}mark{background-color:#ff9;color:#000;font-style:italic;font-weight:bold}del{text-decoration:line-through}abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help}table{border-collapse:collapse;border-spacing:0}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}input,select{vertical-align:middle} \ No newline at end of file diff --git a/InfoGenie-frontend/public/smallgame/floppybird/index.html b/InfoGenie-frontend/public/smallgame/floppybird/index.html new file mode 100644 index 00000000..62b1f531 --- /dev/null +++ b/InfoGenie-frontend/public/smallgame/floppybird/index.html @@ -0,0 +1,78 @@ + + + + Floppy Bird + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    +
    +
    +
    replay
    +
    + + +
    +
    +
    +
    +
    + +
    +
    + + + + + + + + + + diff --git a/InfoGenie-frontend/public/smallgame/floppybird/js/buzz.min.js b/InfoGenie-frontend/public/smallgame/floppybird/js/buzz.min.js new file mode 100644 index 00000000..556ce766 --- /dev/null +++ b/InfoGenie-frontend/public/smallgame/floppybird/js/buzz.min.js @@ -0,0 +1,11 @@ + // ---------------------------------------------------------------------------- + // Buzz, a Javascript HTML5 Audio library + // v1.1.0 - released 2013-08-15 13:18 + // Licensed under the MIT license. + // http://buzz.jaysalvat.com/ + // ---------------------------------------------------------------------------- + // Copyright (C) 2010-2013 Jay Salvat + // http://jaysalvat.com/ + // ---------------------------------------------------------------------------- + +(function(t,n,e){"undefined"!=typeof module&&module.exports?module.exports=e():"function"==typeof n.define&&n.define.amd?define(t,[],e):n[t]=e()})("buzz",this,function(){var t={defaults:{autoplay:!1,duration:5e3,formats:[],loop:!1,placeholder:"--",preload:"metadata",volume:80,document:document},types:{mp3:"audio/mpeg",ogg:"audio/ogg",wav:"audio/wav",aac:"audio/aac",m4a:"audio/x-m4a"},sounds:[],el:document.createElement("audio"),sound:function(n,e){function i(t){for(var n=[],e=t.length-1,i=0;e>=i;i++)n.push({start:t.start(i),end:t.end(i)});return n}function u(t){return t.split(".").pop()}function s(n,e){var i=r.createElement("source");i.src=e,t.types[u(e)]&&(i.type=t.types[u(e)]),n.appendChild(i)}e=e||{};var r=e.document||t.defaults.document,o=0,a=[],h={},l=t.isSupported();if(this.load=function(){return l?(this.sound.load(),this):this},this.play=function(){return l?(this.sound.play(),this):this},this.togglePlay=function(){return l?(this.sound.paused?this.sound.play():this.sound.pause(),this):this},this.pause=function(){return l?(this.sound.pause(),this):this},this.isPaused=function(){return l?this.sound.paused:null},this.stop=function(){return l?(this.setTime(0),this.sound.pause(),this):this},this.isEnded=function(){return l?this.sound.ended:null},this.loop=function(){return l?(this.sound.loop="loop",this.bind("ended.buzzloop",function(){this.currentTime=0,this.play()}),this):this},this.unloop=function(){return l?(this.sound.removeAttribute("loop"),this.unbind("ended.buzzloop"),this):this},this.mute=function(){return l?(this.sound.muted=!0,this):this},this.unmute=function(){return l?(this.sound.muted=!1,this):this},this.toggleMute=function(){return l?(this.sound.muted=!this.sound.muted,this):this},this.isMuted=function(){return l?this.sound.muted:null},this.setVolume=function(t){return l?(0>t&&(t=0),t>100&&(t=100),this.volume=t,this.sound.volume=t/100,this):this},this.getVolume=function(){return l?this.volume:this},this.increaseVolume=function(t){return this.setVolume(this.volume+(t||1))},this.decreaseVolume=function(t){return this.setVolume(this.volume-(t||1))},this.setTime=function(t){if(!l)return this;var n=!0;return this.whenReady(function(){n===!0&&(n=!1,this.sound.currentTime=t)}),this},this.getTime=function(){if(!l)return null;var n=Math.round(100*this.sound.currentTime)/100;return isNaN(n)?t.defaults.placeholder:n},this.setPercent=function(n){return l?this.setTime(t.fromPercent(n,this.sound.duration)):this},this.getPercent=function(){if(!l)return null;var n=Math.round(t.toPercent(this.sound.currentTime,this.sound.duration));return isNaN(n)?t.defaults.placeholder:n},this.setSpeed=function(t){return l?(this.sound.playbackRate=t,this):this},this.getSpeed=function(){return l?this.sound.playbackRate:null},this.getDuration=function(){if(!l)return null;var n=Math.round(100*this.sound.duration)/100;return isNaN(n)?t.defaults.placeholder:n},this.getPlayed=function(){return l?i(this.sound.played):null},this.getBuffered=function(){return l?i(this.sound.buffered):null},this.getSeekable=function(){return l?i(this.sound.seekable):null},this.getErrorCode=function(){return l&&this.sound.error?this.sound.error.code:0},this.getErrorMessage=function(){if(!l)return null;switch(this.getErrorCode()){case 1:return"MEDIA_ERR_ABORTED";case 2:return"MEDIA_ERR_NETWORK";case 3:return"MEDIA_ERR_DECODE";case 4:return"MEDIA_ERR_SRC_NOT_SUPPORTED";default:return null}},this.getStateCode=function(){return l?this.sound.readyState:null},this.getStateMessage=function(){if(!l)return null;switch(this.getStateCode()){case 0:return"HAVE_NOTHING";case 1:return"HAVE_METADATA";case 2:return"HAVE_CURRENT_DATA";case 3:return"HAVE_FUTURE_DATA";case 4:return"HAVE_ENOUGH_DATA";default:return null}},this.getNetworkStateCode=function(){return l?this.sound.networkState:null},this.getNetworkStateMessage=function(){if(!l)return null;switch(this.getNetworkStateCode()){case 0:return"NETWORK_EMPTY";case 1:return"NETWORK_IDLE";case 2:return"NETWORK_LOADING";case 3:return"NETWORK_NO_SOURCE";default:return null}},this.set=function(t,n){return l?(this.sound[t]=n,this):this},this.get=function(t){return l?t?this.sound[t]:this.sound:null},this.bind=function(t,n){if(!l)return this;t=t.split(" ");for(var e=this,i=function(t){n.call(e,t)},u=0;t.length>u;u++){var s=t[u],r=s;s=r.split(".")[0],a.push({idx:r,func:i}),this.sound.addEventListener(s,i,!0)}return this},this.unbind=function(t){if(!l)return this;t=t.split(" ");for(var n=0;t.length>n;n++)for(var e=t[n],i=e.split(".")[0],u=0;a.length>u;u++){var s=a[u].idx.split(".");(a[u].idx==e||s[1]&&s[1]==e.replace(".",""))&&(this.sound.removeEventListener(i,a[u].func,!0),a.splice(u,1))}return this},this.bindOnce=function(t,n){if(!l)return this;var e=this;return h[o++]=!1,this.bind(t+"."+o,function(){h[o]||(h[o]=!0,n.call(e)),e.unbind(t+"."+o)}),this},this.trigger=function(t){if(!l)return this;t=t.split(" ");for(var n=0;t.length>n;n++)for(var e=t[n],i=0;a.length>i;i++){var u=a[i].idx.split(".");if(a[i].idx==e||u[0]&&u[0]==e.replace(".","")){var s=r.createEvent("HTMLEvents");s.initEvent(u[0],!1,!0),this.sound.dispatchEvent(s)}}return this},this.fadeTo=function(n,e,i){function u(){setTimeout(function(){n>s&&n>o.volume?(o.setVolume(o.volume+=1),u()):s>n&&o.volume>n?(o.setVolume(o.volume-=1),u()):i instanceof Function&&i.apply(o)},r)}if(!l)return this;e instanceof Function?(i=e,e=t.defaults.duration):e=e||t.defaults.duration;var s=this.volume,r=e/Math.abs(s-n),o=this;return this.play(),this.whenReady(function(){u()}),this},this.fadeIn=function(t,n){return l?this.setVolume(0).fadeTo(100,t,n):this},this.fadeOut=function(t,n){return l?this.fadeTo(0,t,n):this},this.fadeWith=function(t,n){return l?(this.fadeOut(n,function(){this.stop()}),t.play().fadeIn(n),this):this},this.whenReady=function(t){if(!l)return null;var n=this;0===this.sound.readyState?this.bind("canplay.buzzwhenready",function(){t.call(n)}):t.call(n)},l&&n){for(var d in t.defaults)t.defaults.hasOwnProperty(d)&&(e[d]=e[d]||t.defaults[d]);if(this.sound=r.createElement("audio"),n instanceof Array)for(var c in n)n.hasOwnProperty(c)&&s(this.sound,n[c]);else if(e.formats.length)for(var f in e.formats)e.formats.hasOwnProperty(f)&&s(this.sound,n+"."+e.formats[f]);else s(this.sound,n);e.loop&&this.loop(),e.autoplay&&(this.sound.autoplay="autoplay"),this.sound.preload=e.preload===!0?"auto":e.preload===!1?"none":e.preload,this.setVolume(e.volume),t.sounds.push(this)}},group:function(t){function n(){for(var n=e(null,arguments),i=n.shift(),u=0;t.length>u;u++)t[u][i].apply(t[u],n)}function e(t,n){return t instanceof Array?t:Array.prototype.slice.call(n)}t=e(t,arguments),this.getSounds=function(){return t},this.add=function(n){n=e(n,arguments);for(var i=0;n.length>i;i++)t.push(n[i])},this.remove=function(n){n=e(n,arguments);for(var i=0;n.length>i;i++)for(var u=0;t.length>u;u++)if(t[u]==n[i]){t.splice(u,1);break}},this.load=function(){return n("load"),this},this.play=function(){return n("play"),this},this.togglePlay=function(){return n("togglePlay"),this},this.pause=function(t){return n("pause",t),this},this.stop=function(){return n("stop"),this},this.mute=function(){return n("mute"),this},this.unmute=function(){return n("unmute"),this},this.toggleMute=function(){return n("toggleMute"),this},this.setVolume=function(t){return n("setVolume",t),this},this.increaseVolume=function(t){return n("increaseVolume",t),this},this.decreaseVolume=function(t){return n("decreaseVolume",t),this},this.loop=function(){return n("loop"),this},this.unloop=function(){return n("unloop"),this},this.setTime=function(t){return n("setTime",t),this},this.set=function(t,e){return n("set",t,e),this},this.bind=function(t,e){return n("bind",t,e),this},this.unbind=function(t){return n("unbind",t),this},this.bindOnce=function(t,e){return n("bindOnce",t,e),this},this.trigger=function(t){return n("trigger",t),this},this.fade=function(t,e,i,u){return n("fade",t,e,i,u),this},this.fadeIn=function(t,e){return n("fadeIn",t,e),this},this.fadeOut=function(t,e){return n("fadeOut",t,e),this}},all:function(){return new t.group(t.sounds)},isSupported:function(){return!!t.el.canPlayType},isOGGSupported:function(){return!!t.el.canPlayType&&t.el.canPlayType('audio/ogg; codecs="vorbis"')},isWAVSupported:function(){return!!t.el.canPlayType&&t.el.canPlayType('audio/wav; codecs="1"')},isMP3Supported:function(){return!!t.el.canPlayType&&t.el.canPlayType("audio/mpeg;")},isAACSupported:function(){return!!t.el.canPlayType&&(t.el.canPlayType("audio/x-m4a;")||t.el.canPlayType("audio/aac;"))},toTimer:function(t,n){var e,i,u;return e=Math.floor(t/3600),e=isNaN(e)?"--":e>=10?e:"0"+e,i=n?Math.floor(t/60%60):Math.floor(t/60),i=isNaN(i)?"--":i>=10?i:"0"+i,u=Math.floor(t%60),u=isNaN(u)?"--":u>=10?u:"0"+u,n?e+":"+i+":"+u:i+":"+u},fromTimer:function(t){var n=(""+t).split(":");return n&&3==n.length&&(t=3600*parseInt(n[0],10)+60*parseInt(n[1],10)+parseInt(n[2],10)),n&&2==n.length&&(t=60*parseInt(n[0],10)+parseInt(n[1],10)),t},toPercent:function(t,n,e){var i=Math.pow(10,e||0);return Math.round(100*t/n*i)/i},fromPercent:function(t,n,e){var i=Math.pow(10,e||0);return Math.round(n/100*t*i)/i}};return t}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/smallgame/floppybird/js/jquery.min.js b/InfoGenie-frontend/public/smallgame/floppybird/js/jquery.min.js new file mode 100644 index 00000000..da417064 --- /dev/null +++ b/InfoGenie-frontend/public/smallgame/floppybird/js/jquery.min.js @@ -0,0 +1,6 @@ +/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery-1.10.2.min.map +*/ +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
    ",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
    a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
    t
    ",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
    ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t +}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x(" + +

    对象元素 (object)

    + + 替代文本 + + +

    图片映射 (map 和 area)

    + 示例图片 + + 矩形区域 + 圆形区域 + + +

    轨道路径 (track)

    +

    track 元素通常与 video 或 audio 元素一起使用,用于字幕等

    + +

    图片源 (picture 和 source)

    + + + + 响应式图片 + + + +
    +

    (五)表格元素

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    表格标题 (caption)
    表头单元格 (th)表头单元格 (th)表头单元格 (th)
    表格数据 (td)表格数据 (td)表格数据 (td)
    表格数据 (td)表格数据 (td)表格数据 (td)
    表格页脚 (tfoot)
    + + +
    +

    (六)表单元素

    +
    +
    + 表单标题 (legend) + + +

    + + +

    + + +

    + + +

    + + +

    + + +

    + + +

    + + +

    + + +

    + + +

    + +
    + +
    + +

    + +
    + +
    + +

    + + +

    + + + + +

    + +
    +

    + + + 计算结果

    + + + 70%

    + + + 60%

    + + + + + +
    +
    +
    + +
    +

    (七)交互元素

    + +

    详情和摘要 (details 和 summary)

    +
    + 点击查看详情 (summary) +

    这是隐藏的详情内容 (details)

    +
    + +

    对话框 (dialog)

    + +

    这是一个对话框 (dialog)

    +
    + +
    +
    + +

    菜单 (menu)

    + +
  • +
  • +
    +
    + +
    +

    (八)语义元素

    + +

    我们已经展示了大部分语义元素,这里补充一些:

    + +

    导航区域 (nav)

    +

    已经在页面顶部使用了 nav 元素

    + +

    页眉页脚 (header, footer)

    +

    已经在页面中使用了 header 和 footer 元素

    + +

    时间元素 (time)

    +

    会议时间:

    + +

    标记元素 (mark)

    +

    搜索关键词:HTML5 是网页标准

    + +

    旁注元素 (aside)

    +

    已经在内容分区中展示

    +
    + +
    +

    (九)其他元素

    + +

    模板元素 (template)

    + + +

    脚本相关 (noscript)

    + + +

    标题组 (hgroup)

    +
    +

    主标题

    +

    副标题

    +
    + +

    方向性文本 (bdi 和 bdo)

    +

    隔离文本方向 (bdi)

    +

    从右到左的文本 (bdo)

    + +

    换行机会 (wbr)

    +

    这是一个非常长的单词:supercalifragilisticexpialidocious

    + +

    嵌入对象参数 (param)

    +

    param 元素与 object 元素一起使用

    + +

    脚本元素 (script)

    +

    虽然本页面不使用 JavaScript,但 script 元素是 HTML 的一部分

    + +

    样式元素 (style)

    +

    虽然本页面不使用 CSS,但 style 元素是 HTML 的一部分

    + +

    标题元素 (title)

    +

    在 head 部分使用,定义页面标题

    + +

    元数据元素 (meta, link, base)

    +

    在 head 部分使用,提供文档元数据

    +
    + + +
    +

    (十)页脚区域 (footer)

    +

    本页面展示了超过 100 个 HTML 元素,涵盖了现代浏览器支持的大部分元素。

    +

    注意:某些元素(如 dialog)需要特定属性才能正确显示。

    +

    返回顶部

    +
    + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/HTML的div标签指南/index.html b/InfoGenie-frontend/public/toolbox/学习工具/HTML的div标签指南/index.html new file mode 100644 index 00000000..378b0093 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/HTML的div标签指南/index.html @@ -0,0 +1,662 @@ + + + + + + HTML div元素全面指南 + + + + +
    +

    HTML <div> 元素全面指南

    +

    <div> 是 HTML 中最常用、最通用的容器元素。它是 "division"(分割)的缩写,用于将文档分割成独立的部分,没有特定的语义含义,主要用于布局和样式化。

    +
    + +
    +
    + +
    +
    + +

    1. 基础功能:作为通用容器

    +
    +

    <div> 是一个块级元素,用于将 HTML 文档划分为独立的区块,便于应用样式和布局。

    + +
    + <div id="header">这是页头</div>
    + <div id="main-content">
    +   <div class="article">文章1</div>
    +   <div class="article">文章2</div>
    + </div>
    + <div id="footer">这是页脚</div> +
    + +
    +

    示例:div作为容器

    +
    + 这是一个带有样式的div容器 +
    +
    + 这是另一个带有不同样式的div容器 +
    +
    +
    + + +
    +
    + +

    2. 布局功能

    +
    +

    使用 <div> 创建页面布局,结合 CSS 实现各种布局技术。

    + +

    2.1 传统浮动布局

    +
    +
    +
    + 左侧边栏 (float: left) +
    +
    + 右侧边栏 (float: right) +
    +
    + 主要内容区域 (自适应宽度) +
    +
    +
    + +

    2.2 Flexbox 布局

    +
    +
    Flex 项目 1
    +
    Flex 项目 2
    +
    Flex 项目 3
    +
    + +

    2.3 CSS Grid 布局

    +
    +
    网格项目 1
    +
    网格项目 2
    +
    网格项目 3
    +
    网格项目 4
    +
    网格项目 5
    +
    网格项目 6
    +
    +
    + + +
    +
    + +

    3. 分组与样式化

    +
    +

    使用 <div> 对相关元素进行分组,以便统一应用样式。

    + +
    +
    +

    带背景渐变的分组

    +

    这个div包含标题和段落,并应用了渐变背景。

    + +
    + +
    +

    带边框的分组

    +

    这个div有自定义边框和背景色,用于突出显示内容。

    +
    +
    +
    + + +
    +
    + +

    4. 交互功能

    +
    +

    通过 JavaScript 为 <div> 添加交互功能。

    + +
    +

    4.1 点击事件

    +
    + 点击这个div,我会改变颜色和文本 +
    + +

    4.2 悬停效果

    +
    + 鼠标悬停在我上面试试 +
    + +

    4.3 显示/隐藏内容

    + + +
    +
    + + +
    +
    + +

    5. 模拟其他元素

    +
    +

    <div> 可以结合CSS模拟其他元素的功能。

    + +
    +

    5.1 模拟按钮

    +
    看起来像按钮的div
    + +

    5.2 模拟卡片

    +
    +
    +
    +

    卡片标题

    +

    这是一个使用div创建的卡片组件,具有图片区域和内容区域。

    +
    查看详情
    +
    +
    + +

    5.3 模拟表格

    +
    +
    +
    姓名
    +
    年龄
    +
    城市
    +
    +
    +
    张三
    +
    28
    +
    北京
    +
    +
    +
    李四
    +
    34
    +
    上海
    +
    +
    +
    +
    +
    + + +
    + + + + + + + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/index.html b/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/index.html new file mode 100644 index 00000000..8d62df6b --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/index.html @@ -0,0 +1,65 @@ + + + + + + 入党申请书 + + + +
    +

    入党申请书

    +

    敬爱的党组织:

    +

    我志愿申请加入中国共产党,并愿意为党的事业奋斗终身。中国共产党是一个具有坚强意志、不断克服困难并始终走在正确道路上的伟大政党。党带领着工农阶级开辟了一条光辉的前进道路,让无数像我一样来自普通工农家庭的人民看到了希望和未来的美好。加入中国共产党一直是我内心最崇高的理想与追求。

    +

    自中国共产党成立以来,党始终代表最广大人民的根本利益,全心全意为人民服务。正如党章所述,中国共产党是中国工人阶级的先锋队,是中国各族人民利益的忠实代表,是中国社会主义事业的领导核心。党以马克思列宁主义、毛泽东思想、邓小平理论、三个代表重要思想、科学发展观以及习近平新时代中国特色社会主义思想为指导,带领全国各族人民经过不懈努力,走出了一条具有中国特色的社会主义道路,取得了伟大的成就。

    +

    党的根本宗旨是全心全意为人民服务,这一点从小便深深印在我的心中。自我开始接触政治以来,便逐步认识到,党不仅来自于人民,更是植根于人民,服务于人民。每一个共产党员都肩负着为人民服务的责任与使命,这是无产阶级政党的性质决定的,也是马克思主义建党学说的核心原则。中国共产党自成立以来,始终把人民的利益放在第一位,所有的政策与方针都以满足人民的需求为出发点。因此,我更加坚定了加入党组织的决心,愿为实现全心全意为人民服务的目标贡献自己的一切。

    +

    自初中加入中国共青团以来,我逐渐意识到,作为一名共青团员,我的身份不仅仅是一名学生,更意味着肩负着宣传党的路线、方针和政策的责任。作为共青团员,我始终以严格的标准要求自己,在学习上刻苦努力,积极参加各种有益的社会实践活动,力求在各个方面发挥模范带头作用。我始终未曾忘记我的团员身份,并时刻保持自我约束与提高。

    +

    通过共青团的组织生活,我逐步学习和理解了党的理论知识,思想觉悟有了进一步的提高。我明白,党是我们国家的中流砥柱,党员是为人民服务的先锋队。因此,在今后的学习和工作中,我一直以党员的标准严格要求自己,并将全心全意为人民服务作为自己行动的指导思想。

    +

    我小时候看到爷爷佩戴着党颁发的勋章时,总是充满了好奇和敬畏。随着爷爷的讲述,我逐渐了解了中国共产党带领人民走过艰苦的革命斗争,赢得自由和安定的光辉历史,也认识到党在建设社会主义现代化国家中所作出的巨大贡献。在爷爷年幼时,他们生活在贫困和动荡中,连电灯都没有,而如今,老人们已经能够享受现代科技带来的便利。这一切都是党带领我们创造的。如果没有党的领导,就没有我们今天的幸福生活。因此,我更加坚定要加入党组织,为国家和人民的伟大事业贡献自己的青春和力量。

    +

    进入大学后,我逐渐适应了校园生活和社会这个大家庭,并认识到自己在思想、生活和学习中还存在一些不足。比如,在一些场合中,我还无法充分展现自己的能力,表现得有些不够自信。不过,我通过参加学校的各类比赛和社团活动,积极提升自我。我清楚地知道,要成为一名合格的党员,不仅要有坚定的理想信念,还要在日常生活中克服自身的弱点,不断提高个人的综合素质,增强自己的社会责任感和服务意识。

    +

    通过大学生活的磨练和党课的学习,我更加明确了加入中国共产党的决心。在参与党课学习的过程中,我不仅对党的基本理论有了更深刻的理解,还通过与优秀党员的接触,学会了如何在实际生活中践行党的宗旨。我发现,党员们无论是在学习、工作还是生活中,都始终保持着高度的责任感和使命感,时刻以全心全意为人民服务为己任。这让我深受鼓舞,也更加坚定了我入党的决心。

    +

    我深知,成为一名党员意味着要承担更大的责任与使命。这不仅是一种光荣的身份,更是一份崇高的责任。党员不仅要在思想上与党保持高度一致,更要在实践中始终发挥模范带头作用。因此,在今后的学习和生活中,我将继续以党员的标准严格要求自己,努力克服自己的缺点和不足,不断提高个人修养,增强理论知识,做到理论联系实际,关心国内外大事,关注党和政府的重大方针政策。同时,我会更加注重明辨是非,树立正确的人生观和价值观,保持积极乐观的生活态度,做到不以善小而不为,不以恶小而为之。从小事做起,从点滴做起,时刻将党和人民的利益放在首位。

    +

    除了严格要求自己、为他人服务以外,我还将通过自身的实际行动去影响他人,带动更多的人关心国家、集体和他人的利益,争取早日从思想上、行动上入党,进而实现从组织上加入中国共产党的愿望。

    +

    如果党组织认为我还未完全符合党员的要求,我也不会因此气馁。我将继续严格要求自己,积极接受党员和群众的监督与帮助,努力克服自己的不足,不断完善自我,争取早日达到党组织的要求,真正做到在各方面发挥党员的先锋模范作用。我相信,在党组织的帮助与指导下,我一定能够不断进步,最终实现我加入中国共产党的愿望。

    +

    请党组织在实践中考验我!

    +
    +

    此致

    +

    敬礼!

    +

    申请人:xxx

    +

    2024年xx月xx日

    +
    +
    + + diff --git a/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文1.txt b/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文1.txt new file mode 100644 index 00000000..b0ec6af7 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文1.txt @@ -0,0 +1 @@ +大学生入党申请书 2 敬爱的党组织:   在我很小的时候我就开始接受长辈的教导,说我将来长大后一定要加入中国共产党,当时我还不明白什么意思,只能似懂非懂的答应,他们都夸我是好孩子。当我渐渐的长大,通过在学校的学习,我知道了什么是中国共产党,我就坚定的加入中国共产党的决心。   作为一名的大学生,在一年多的大学生活中使我对党的认识有了进一步的加深。党是工人阶级的先进分子组成的,是工人阶级及广大劳动群众利益的忠实代表。党在制定政策、路线、方针时都无不围绕着人民群众的根本利益,切切实实地为人民群众谋求的福利;党员为人民群众鞠躬尽瘁、死而后已,坚决把人民利益放在个人利益之上,个人利益服从人民利益。   我立志加入中国共产党。我会以全心全意为人民服务为思想核心,以忧人民之所忧,急人民之所急,为座右铭去指导我的行动,用我有限的智慧去为广大人民群众谋求福利,吃苦在前,享乐在后,克己奉公,多作贡献。当然,在不断追求思想进步的同时,我时刻铭记自己是一名学生,学习是我的天职。   本人深知自己距离党的要求还有不少差距,存在不少缺点和不足,如理论知识掌握不扎实,政治素养不高等等。但是,我诚实勤奋,自尊、自强、自爱,与同学关系良好,各方面的能力正在逐步提高。我也将以党员的标准严格要求自己,自觉接受党组织和同学们的监督和帮助,坚持不懈地克服自身的缺点,弥补自己的不足,积极向党组织靠拢,争取早日加入伟大的中国共产党。   我在工作上和学习上还体现出了不足的方面,如工作上处理问题不够成熟,在学习上还存在方法上的错误等。我希望在日后的生活中能改正缺点,完善自己。也希望在党支部的生活中能得到思想和政治觉悟上的进一步提高,个人综合素质也不断提高,得到全面的发展。   如果党组织批准了我的入党申请书,使我成为正式党员,我一定会更加严格的要求自己,时时刻刻为同学做榜样,严于律己,把周围的环境带好,这我还是有信心的,我相信我有这个能力和魅力。   如果党组织没有批准我的入党申请书,说明我的条件还不成熟,我做的还是达不到党的要求。我一定不会灰心的,也不会自暴自弃,我智慧更加严格的要求自己,加强文化学习,提高个人素质,直到达到党组织的要求为止,我相信我会做到的,也请党组织相信我。   此致 敬礼!   申请人:xxx   20xx年xx月xx日 \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文2.txt b/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文2.txt new file mode 100644 index 00000000..3b4b239e --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文2.txt @@ -0,0 +1 @@ +敬爱的党组织:   我申请加入中国共产党。   我是一名大学生,一直是沐浴在党的光辉下成长起来的青年人,在回顾自己成长的过程,心中感慨万分。我发现在我的成长中,无时无刻都能感受到党温暖的光辉,因为我每一次的阶段性进步,都蕴含着党对我的教育和培养。   作为一名合格的大学生就要有一个坚定的信仰,而我的信仰就是加入中国共产党,实现共产主义,这不仅仅是中国共产党崇高的理想的价值追求。同时,也是我们全中国人民的共同理想。而大学生作为国家的顶梁柱,是实现民族富强的中坚力量,是我国社会主义现在代化建设的先锋,作为大学生的我更应把实现共产主义作为理想,把加入中国共产党作为我的信仰。   在我回顾自己的学习生涯时,过去真的是拼尽了很大的努力,还留下了一些遗憾,我知道这些都是相应的付出,这些遗憾和代价让我迎来了大学美好的生活!在大学里,不仅要继续努力的学习,我还要通过不断的努力,争取加入我向往已久的中国共产党。   作为一名大学生,同时还作为一名共青团员,我一直都有严格的要求自己,并用实际的行动去证明我作为共青团员的价值,随着时间的推移,我的文化知识在不断的增长,而对党的认识也越发深刻,加入到党组织的愿望也越发强烈。为了有资格加入党组织,在平日里,我不断努力加强自身的修养,经常学习党的理论,期望做到用党性来武装自己的头脑,做一名优秀的共青团员。   中国共产党这个光荣而又神圣的组织,从1921年建党到今天,我们伟大的党已经走过了100年的光辉历程。其中经历了长期的革命斗争,终于建设了适合中国的具有中国特色的社会主义道路,并逐步实现了社会主义现代化。   我热爱我们伟大的党,因为她是中国工人阶级的先锋队,是中国各族人民利益的忠实代表,是中国特色社会主义事业的领导核心,她始终代表中国先进生产力的发展要求,代表中国先进文化的发展方向,代表中国最广大人民的根本利益,为实现国家和人民的根本利益而不懈奋斗。   在学习中,我也一直关注着党的一切,知道党的十九大是全面建成小康社会关键阶段和中国特色社会主义发展关键时期的一次十分重要的大会,对鼓舞和动员全国各族人民继续推进全面建成小康社会、坚持和发展中国特色社会主义具有重大意义。   敬爱的党组织,作为新时代大学生的我,今天郑重地递上入党的申请书,这将会是我人生精彩历程中最最庄严神圣的一件事。如果党组织在严格审查后能够将我的申请批准,我一定会认真履行党员应尽的义务,在往后的生活和学习中一定严格要求自己,并接受党组织和同学们的监督。做到生活中严于律己,学习中勤奋进取,尽的努力做一名合格且先进的共产党员,为党的事业和我国的社会主义现代化事业贡献我毕生的精力和热血。   即使组织上认为我尚未符合一个党员的资格,但我也将按党员的标准,严格要求自己,积极参加院、系、班的各项活动,充分发挥自己的特长,真正起到先锋模范作用。争取早日加入党组织。请党组织考验我!   此致 敬礼!   申请人:xxx   20xx年xx月xx日 \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文3.txt b/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文3.txt new file mode 100644 index 00000000..c331ba39 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文3.txt @@ -0,0 +1 @@ +尊敬的党组织:   我志愿加入中国共产党。中国共产党是一个有着坚强意志的,不断克服进步的政党。他带领着工农阶级走出了一条正确而光辉的道路。让众多类似我所处的工农家庭带来希望和笑容。所以加入中国共产党是我一直以来的梦想和追求!   全心全意为人民服务是我们党的根本宗旨,是由无产阶级政党的性质决定的。这自从接触政治就牢牢的印在我的脑海里。党来自人民,植根于人民,服务于人民。正是如此,每一个共产党员都肩负着一个服务于人的责任与义务。同时这也是马克思主义建党的基本原则,是中国共产党一贯坚持的根本宗旨。   自从初中加入了共青团,就让我感觉一个身份的改变。在作为学生的同时还肩负着一份责任。为宣传执行党的路线,方针和政策。不断提高为人民服务的本领。而且我一直未忘记我的这层身份。所以我好好学习,参加各种活动,全面发展,争取在各个方面起到一个模范带头作用。想起小时候,每次看到爷爷佩戴起那枚党颁发的勋章时总会昂起胸膛陷入回忆我总好奇,不解。后来爷爷总会更我讲述着他那历经岁月的记忆。中国共产党带领着人们获得自由与安定,在后期的建设中不断的积极进取,努力创新终于有了如今的繁荣。在爷爷上私塾那会连电都没有,但是在他的晚年却能用上手机。在我认为这些都是党带领我们创造出来的,没有党就不会有如今的生活!因此我会更加努力学习为党,为国家,为人民奉献出自己的一份力量。   刚步入大学,渐渐的开始步入社会这个大家庭,我也渐渐发现自己的缺点,尤其是在某些场合放不开,但是我已经在不断去纠正。我积极主动的参加了学校的一些比赛和社团活动。   在今后的学习生活中,我更会以党员的标准严格要求自己,努力克服自己的弱点和缺点,不断的提高自己。继续加强理论知识的学习,同时理论联系实际,关心国内外大事,关注党和政府的重大方针和政策,同时分清是非,正确认识各种社会现象。树立正确的人生观和价值观,积极乐观地对待生活。坚持不以善小而不为,不以恶小而为之,从小事做起,从点滴做起。除了严格要求自己、为他人服务以外,还要用自己的言行去影响他人,带动大家来关心国家、集体和他人的利益,争取先从思想上入党,进而从组织上入党。   如果组织暂时没有接受我的请求,我也不会气馁,我会自觉接受党员和群众的帮助和监督,努力克服自己的缺点,进一步注意自己的言行,加强组织性、纪律性,真正达到党员所要求的标准,起到模范带头作用。我相信在组织的帮助和指导下,我一定会加入党组织!请组织在实践中考验我。   此致 敬礼!   申请人:xxx   20xx年xx月xx日 \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文4.txt b/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文4.txt new file mode 100644 index 00000000..e6029f9b --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文4.txt @@ -0,0 +1 @@ +尊敬的党组织:   我志愿加入中国共产党,并愿意为党的事业奋斗终身!   之前刚上大一的时候我就向党组织递交了入党申请书,可能是党组织认为我的入党申请书写的不够好或者是我的素质达不到党组织的要求,党组织拒绝了我的入党申请,可是党组织还是给了我机会,让我再接再厉,在以后的机会中实现自己的入党愿望。我考虑到党组织对我的了解不够深入,所以我就想向党组织递交我的入党自传,让党组织更好的了解我,了解我强烈希望加入做共产党的愿望。   我父亲是一名中国共产党党员,母亲是一名下岗工人,我是在党的教育下成长起来的。父亲谦虚严谨,细致谨慎的工作作风从小就深深地感染着我。一九八八年九月我进入小学,临学前父亲教育我,鲜艳的红领巾是先辈的鲜血染红的,是少先先锋队的标志,只有象解放军战士那样不怕苦,最勇敢的人才配戴上它。我牢记父亲的话,上小学后,学习上,努力刻苦,争当先进;劳动中,不怕脏,不怕累。   从此,我学习更加努力了,在班上学习成绩一直名列前茅,每学期都被评为三好学生。小学毕业后,我以优秀成绩考入了中学。随着知识的积累和年龄的增长,我在思想上逐渐懂得了,青年人要成长进步必须靠近团组织,主动接受团组织的教育和培养。通过组织的帮助和自己的努力,我光荣地加入了中国共青团。   在高考这座独木桥上,我落第了。如果这是生活向我发起的一次挑战的话,我不会后悔我所作的选择。最后我被调剂录取到xx大学电气工程学院电气工程及其自动化系,翻开了我人生征程崭新的一页,我对着新的目标开始了新的奋斗和跋涉。   大一下学期,我参加学院分党校举办的党的基本知识培训班。通过学习,我对党的性质、纲领、宗旨、指导思想、组织原则和纪律、党员条件等党的基本知识有了比较系统的了解,提高了对党的认识,懂得了怎样争取做一名共产党员。同时,我有了更多的时间和机会接触到身边的党员,政治视野也得到了扩充,看到当前存在党风不正的现象,希望自己能加入到党组织,做一名优秀的党员,重新确定党的形象。   经过认知意识的转变,我觉得入党前最重要的就是要正确和全面地认识我们的党。此时,我的父亲对我的教育给了我很大的启示。他对我的转变并不惊讶,反而给予了赞扬,他说,那是我在为自己诠释对党的认识,是我确立正确的入党动机的必修课。他对我说,入党同学习一样,重要的是独立思考的能力,要会观察,会总结,会引申,要去看书学习,去思考,是要花一番气力的。有的人在入党之后一段时间,甚至是一生都要不断补充对入党的思考,也包括对入党动机的更完整的再定义。在那以后我就决心,通过自己的学习和思考让自己的真正的入党动机在心里成形。我觉得我必须把思想的转变和行动相宜地结合起来,让自己把每一点思考和每一次实践对应起来,学要学得有进步,做要做得有体会,实实在在的向要求一名党员那样来要求自己。   长期以来,我都始终贯穿着自己是入党积极分子的思想。在集体活动中,我都积极参与,和大家积极配合完成集体任务。生活中,团结同学,尽量发挥自己的作用,作一些力所能及的事情帮助和关心同学,比如听说同学病了,就去看望问候;听说朋友心情不好,就去劝勉鼓励。二年级上学期,我被选为学院学科部副部长,担任学生干部,这是组织对我的信任,也是培养为人民服务思想,增长才干,锻炼提高自己的极好机会。在担任学生会干部期间,认真履行自己的职责,对学科部事务注入了很大的热情,而且坚持锻炼自己做好学生会工作,学好专业课程两方面的能力。随后我又参加了党校的学习,由于我学习刻苦,被学院分党校评为优秀学员。作为一名入党积极分子,我在申请期间,定期向党组织汇报自己的思想,所有这些行动对提高自己的思想认识起着重要的作用。我明白以实际行动争取入党,必须持之以恒,从申请入党的那天起,就应该以正确的态度和真诚的努力争取早日成为一名名副其实的共产党员。   我渴望成为一名光荣的中国共产党员,这绝不是为了光宗耀祖,绝不是为了凭借执政党的地位为自己谋私利,我深深地懂得共产党员意味着拼搏,奋斗甚至意味着牺牲,我入党只是为了更直接地接受党的领导,为共产主义事业奋斗。   敬爱的党组织,今天我郑重地递上入党自传,是我人生历程中最庄严神圣的一件事,是我在入党前对人生的一次宣誓。若党组织在严格审查后能予以批准,我将认真履行党章上所要求的一切,严格要求自己,接受党组织和同志们的监督,严于律己、勤奋进取,努力作一名合格而且先进的共产党员,为党的事业、为我国的社会主义向现代化事业贡献我毕生的精力和热血。   请党组织在实践中考验我!   此致 敬礼!   申请人:xxx   20xx年xx月xx日 \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文5.txt b/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文5.txt new file mode 100644 index 00000000..24dbdbe9 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/入党申请书/入党申请书范文5.txt @@ -0,0 +1,21 @@ +入党申请书 + +敬爱的党组织: +我志愿申请加入中国共产党,并愿意为党的事业奋斗终身。中国共产党是一个具有坚强意志、不断克服困难并始终走在正确道路上的伟大政党。党带领着工农阶级开辟了一条光辉的前进道路,让无数像我一样来自普通工农家庭的人民看到了希望和未来的美好。加入中国共产党一直是我内心最崇高的理想与追求。 +自中国共产党成立以来,党始终代表最广大人民的根本利益,全心全意为人民服务。正如党章所述,中国共产党是中国工人阶级的先锋队,是中国各族人民利益的忠实代表,是中国社会主义事业的领导核心。党以马克思列宁主义、毛泽东思想、邓小平理论、三个代表重要思想、科学发展观以及习近平新时代中国特色社会主义思想为指导,带领全国各族人民经过不懈努力,走出了一条具有中国特色的社会主义道路,取得了伟大的成就。 +党的根本宗旨是全心全意为人民服务,这一点从小便深深印在我的心中。自我开始接触政治以来,便逐步认识到,党不仅来自于人民,更是植根于人民,服务于人民。每一个共产党员都肩负着为人民服务的责任与使命,这是无产阶级政党的性质决定的,也是马克思主义建党学说的核心原则。中国共产党自成立以来,始终把人民的利益放在第一位,所有的政策与方针都以满足人民的需求为出发点。因此,我更加坚定了加入党组织的决心,愿为实现全心全意为人民服务的目标贡献自己的一切。 +自初中加入中国共青团以来,我逐渐意识到,作为一名共青团员,我的身份不仅仅是一名学生,更意味着肩负着宣传党的路线、方针和政策的责任。作为共青团员,我始终以严格的标准要求自己,在学习上刻苦努力,积极参加各种有益的社会实践活动,力求在各个方面发挥模范带头作用。我始终未曾忘记我的团员身份,并时刻保持自我约束与提高。 +通过共青团的组织生活,我逐步学习和理解了党的理论知识,思想觉悟有了进一步的提高。我明白,党是我们国家的中流砥柱,党员是为人民服务的先锋队。因此,在今后的学习和工作中,我一直以党员的标准严格要求自己,并将全心全意为人民服务作为自己行动的指导思想。 +我小时候看到爷爷佩戴着党颁发的勋章时,总是充满了好奇和敬畏。随着爷爷的讲述,我逐渐了解了中国共产党带领人民走过艰苦的革命斗争,赢得自由和安定的光辉历史,也认识到党在建设社会主义现代化国家中所作出的巨大贡献。在爷爷年幼时,他们生活在贫困和动荡中,连电灯都没有,而如今,老人们已经能够享受现代科技带来的便利。这一切都是党带领我们创造的。如果没有党的领导,就没有我们今天的幸福生活。因此,我更加坚定要加入党组织,为国家和人民的伟大事业贡献自己的青春和力量。 +进入大学后,我逐渐适应了校园生活和社会这个大家庭,并认识到自己在思想、生活和学习中还存在一些不足。比如,在一些场合中,我还无法充分展现自己的能力,表现得有些不够自信。不过,我通过参加学校的各类比赛和社团活动,积极提升自我。我清楚地知道,要成为一名合格的党员,不仅要有坚定的理想信念,还要在日常生活中克服自身的弱点,不断提高个人的综合素质,增强自己的社会责任感和服务意识。 +通过大学生活的磨练和党课的学习,我更加明确了加入中国共产党的决心。在参与党课学习的过程中,我不仅对党的基本理论有了更深刻的理解,还通过与优秀党员的接触,学会了如何在实际生活中践行党的宗旨。我发现,党员们无论是在学习、工作还是生活中,都始终保持着高度的责任感和使命感,时刻以全心全意为人民服务为己任。这让我深受鼓舞,也更加坚定了我入党的决心。 +我深知,成为一名党员意味着要承担更大的责任与使命。这不仅是一种光荣的身份,更是一份崇高的责任。党员不仅要在思想上与党保持高度一致,更要在实践中始终发挥模范带头作用。因此,在今后的学习和生活中,我将继续以党员的标准严格要求自己,努力克服自己的缺点和不足,不断提高个人修养,增强理论知识,做到理论联系实际,关心国内外大事,关注党和政府的重大方针政策。同时,我会更加注重明辨是非,树立正确的人生观和价值观,保持积极乐观的生活态度,做到不以善小而不为,不以恶小而为之。从小事做起,从点滴做起,时刻将党和人民的利益放在首位。 +除了严格要求自己、为他人服务以外,我还将通过自身的实际行动去影响他人,带动更多的人关心国家、集体和他人的利益,争取早日从思想上、行动上入党,进而实现从组织上加入中国共产党的愿望。 +如果党组织认为我还未完全符合党员的要求,我也不会因此气馁。我将继续严格要求自己,积极接受党员和群众的监督与帮助,努力克服自己的不足,不断完善自我,争取早日达到党组织的要求,真正做到在各方面发挥党员的先锋模范作用。我相信,在党组织的帮助与指导下,我一定能够不断进步,最终实现我加入中国共产党的愿望。 +请党组织在实践中考验我! +此致 + +敬礼! +申请人:xxx + +2024年xx月xx日 diff --git a/InfoGenie-frontend/public/toolbox/学习工具/文档类网页模板/index.html b/InfoGenie-frontend/public/toolbox/学习工具/文档类网页模板/index.html new file mode 100644 index 00000000..014f2617 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/文档类网页模板/index.html @@ -0,0 +1,834 @@ + + + + + + 专业文档模板 - 设计规范 + + + + + +
    + + + + +
    + +
    +

    专业文档网页模板

    +

    基于现代设计规范的响应式文档模板,采用柔和的蓝白色渐变背景和卡片式布局,提供优秀的阅读和开发体验。

    +
    + + +
    +

    模板介绍

    +

    这是一个专业文档类网页模板,完全遵循以下设计规范:

    +
      +
    • 整体采用柔和的蓝白色渐变背景(#f5f7fa#c3cfe2
    • +
    • 使用卡片式布局,卡片有圆角、阴影和悬停上浮效果
    • +
    • 标题采用#2c3e50#3498db的蓝色系,有清晰的层级关系
    • +
    • 代码块使用深色背景(#2c3e50)和等宽字体
    • +
    • 包含响应式侧边栏和主内容区布局
    • +
    • 集成常用UI组件:按钮、警告框、徽章、导航菜单
    • +
    • 所有交互都有平滑的过渡效果
    • +
    • 移动端适配:单列布局,适当调整内边距
    • +
    + +
    +

    设计特点演示

    +

    将鼠标悬停在卡片上体验上浮效果,或尝试调整浏览器窗口大小查看响应式布局变化。

    +
    + + + + + +
    +
    +
    + + +
    +

    UI 组件展示

    +

    本模板内置了一系列常用UI组件,所有组件都遵循统一的设计语言。

    + +

    警告框组件

    +
    + 成功提示: 操作已成功完成。 +
    + +
    + 警告提示: 此操作可能带来风险。 +
    + +
    + 错误提示: 操作过程中发生了错误。 +
    + +
    + 信息提示: 这是一条普通信息提示。 +
    + +

    徽章组件

    +

    徽章用于显示状态、分类或计数:

    +
    + 主要徽章 + 成功徽章 + 警告徽章 + 危险徽章 + 计数 12 + 新功能 +
    +
    + + +
    +

    代码示例

    +

    以下展示了代码块的设计样式,支持多种编程语言语法高亮。

    + +

    HTML结构示例

    +
    +
    + index.html + +
    + +<!DOCTYPE html> +<html lang="zh-CN"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>专业文档模板</title> + <link rel="stylesheet" href="styles.css"> +</head> +<body> + <div class="container"> + <aside class="sidebar"> + <!-- 侧边栏内容 --> + </aside> + <main class="main-content"> + <!-- 主内容区域 --> + <div class="card"> + <h2>卡片标题</h2> + <p>卡片内容描述</p> + </div> + </main> + </div> +</body> +</html> + +
    + +

    CSS样式示例

    +
    +
    + styles.css + +
    + +/* 卡片设计 */ +.card { + background-color: #ffffff; + border-radius: 10px; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08); + padding: 30px; + margin-bottom: 30px; + transition: all 0.3s ease; +} + +.card:hover { + transform: translateY(-10px); + box-shadow: 0 15px 30px rgba(0, 0, 0, 0.15); +} + +/* 响应式设计 */ +@media (max-width: 768px) { + .container { + flex-direction: column; + padding: 15px; + } + + .card { + padding: 20px; + } +} + +
    + +

    JavaScript交互示例

    +
    +
    + script.js + +
    + +// 复制代码功能 +document.querySelectorAll('.copy-btn').forEach(button => { + button.addEventListener('click', function() { + const code = this.parentElement.nextElementSibling.textContent; + navigator.clipboard.writeText(code); + + // 提示用户 + const originalText = this.textContent; + this.textContent = '已复制!'; + + setTimeout(() => { + this.textContent = originalText; + }, 2000); + }); +}); + +// 侧边栏导航激活状态 +document.querySelectorAll('.nav-menu a').forEach(link => { + link.addEventListener('click', function(e) { + document.querySelectorAll('.nav-menu a').forEach(item => { + item.classList.remove('active'); + }); + this.classList.add('active'); + }); +}); + +
    +
    + + +
    +

    响应式布局

    +

    本模板采用移动优先的响应式设计,在不同设备上都能提供优秀的用户体验。

    + +
    +

    响应式断点

    +

    模板定义了以下响应式断点:

    +
      +
    • ≥1024px: 桌面布局,侧边栏+主内容并排
    • +
    • 768px-1023px: 平板布局,侧边栏与主内容垂直排列
    • +
    • ≤767px: 移动端布局,单列布局,适当调整内边距
    • +
    + +
    + +

    当前设备预览

    +

    尝试调整浏览器窗口大小,观察布局变化:

    +
    +
    + +

    桌面端布局

    +
    +
    + +

    平板端布局

    +
    +
    + +

    移动端布局

    +
    +
    +
    +
    + + +
    +

    © 2023 专业文档模板 | 设计规范演示

    + +

    遵循现代网页设计规范,提供优秀的用户体验和开发体验。

    +

    最后更新: 2023年10月

    +
    +
    +
    + + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/app.js b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/app.js new file mode 100644 index 00000000..5826ec45 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/app.js @@ -0,0 +1,261 @@ +// 计算机英语词汇学习应用 +class VocabularyApp { + constructor() { + this.vocabulary = vocabularyData; + this.currentIndex = 0; + this.learningMode = 'sequential'; // sequential, random, reverse + this.randomIndices = []; + this.history = []; + + this.initializeElements(); + this.initializeEventListeners(); + this.initializeApp(); + } + + initializeElements() { + // 获取DOM元素 + this.elements = { + wordNumber: document.getElementById('wordNumber'), + englishWord: document.getElementById('englishWord'), + phonetic: document.getElementById('phonetic'), + wordType: document.getElementById('wordType'), + chineseMeaning: document.getElementById('chineseMeaning'), + currentIndex: document.getElementById('currentIndex'), + totalWords: document.getElementById('totalWords'), + prevBtn: document.getElementById('prevBtn'), + nextBtn: document.getElementById('nextBtn'), + sequentialMode: document.getElementById('sequentialMode'), + randomMode: document.getElementById('randomMode'), + reverseMode: document.getElementById('reverseMode') + }; + } + + initializeEventListeners() { + // 模式切换按钮 + this.elements.sequentialMode.addEventListener('click', () => this.setLearningMode('sequential')); + this.elements.randomMode.addEventListener('click', () => this.setLearningMode('random')); + this.elements.reverseMode.addEventListener('click', () => this.setLearningMode('reverse')); + + // 绑定按钮事件 + this.elements.prevBtn.addEventListener('click', () => this.previousWord()); + this.elements.nextBtn.addEventListener('click', () => this.nextWord()); + + // 键盘快捷键 + document.addEventListener('keydown', (e) => this.handleKeyPress(e)); + } + + initializeApp() { + // 设置总词汇数 + this.elements.totalWords.textContent = this.vocabulary.length; + + // 生成随机索引数组 + this.generateRandomIndices(); + + // 显示第一个词汇 + this.displayCurrentWord(); + + // 更新按钮状态 + this.updateButtonStates(); + } + + generateRandomIndices() { + // 生成随机索引数组 + this.randomIndices = Array.from({length: this.vocabulary.length}, (_, i) => i); + + // Fisher-Yates 洗牌算法 + for (let i = this.randomIndices.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [this.randomIndices[i], this.randomIndices[j]] = [this.randomIndices[j], this.randomIndices[i]]; + } + } + + setLearningMode(mode) { + this.learningMode = mode; + + // 更新按钮样式 + document.querySelectorAll('.mode-btn').forEach(btn => btn.classList.remove('active')); + this.elements[mode + 'Mode'].classList.add('active'); + + // 重置当前索引 + this.currentIndex = 0; + this.history = []; + + // 如果是随机模式,重新生成随机索引 + if (mode === 'random') { + this.generateRandomIndices(); + } + + // 显示当前词汇 + this.displayCurrentWord(); + this.updateButtonStates(); + } + + getCurrentWordIndex() { + switch (this.learningMode) { + case 'sequential': + return this.currentIndex; + case 'random': + return this.randomIndices[this.currentIndex]; + case 'reverse': + return this.vocabulary.length - 1 - this.currentIndex; + default: + return this.currentIndex; + } + } + + displayCurrentWord() { + const wordIndex = this.getCurrentWordIndex(); + const word = this.vocabulary[wordIndex]; + + if (word) { + this.elements.wordNumber.textContent = word.id; + this.elements.englishWord.textContent = word.word; + this.elements.phonetic.textContent = word.phonetic; + this.elements.wordType.textContent = word.type; + this.elements.chineseMeaning.textContent = word.meaning; + this.elements.currentIndex.textContent = this.currentIndex + 1; + + // 添加动画效果 + this.addDisplayAnimation(); + } + } + + addDisplayAnimation() { + const card = document.querySelector('.vocabulary-card'); + card.style.transform = 'scale(0.95)'; + card.style.opacity = '0.7'; + + setTimeout(() => { + card.style.transform = 'scale(1)'; + card.style.opacity = '1'; + }, 100); + } + + nextWord() { + // 记录当前位置到历史 + this.history.push(this.currentIndex); + + // 移动到下一个词汇 + if (this.currentIndex < this.vocabulary.length - 1) { + this.currentIndex++; + } else { + // 到达末尾,根据模式处理 + if (this.learningMode === 'random') { + // 随机模式:重新洗牌 + this.generateRandomIndices(); + this.currentIndex = 0; + } else { + // 顺序或逆序模式:回到开头 + this.currentIndex = 0; + } + } + + this.displayCurrentWord(); + this.updateButtonStates(); + } + + previousWord() { + if (this.history.length > 0) { + // 从历史记录中恢复 + this.currentIndex = this.history.pop(); + } else if (this.currentIndex > 0) { + // 简单向前移动 + this.currentIndex--; + } else { + // 在开头时,跳到末尾 + this.currentIndex = this.vocabulary.length - 1; + } + + this.displayCurrentWord(); + this.updateButtonStates(); + } + + updateButtonStates() { + // 更新上一个按钮状态 + const canGoPrevious = this.history.length > 0 || this.currentIndex > 0; + this.elements.prevBtn.disabled = !canGoPrevious; + + // 更新下一个按钮状态(总是可用) + this.elements.nextBtn.disabled = false; + } + + + + handleKeyPress(e) { + switch (e.key) { + case 'ArrowLeft': + e.preventDefault(); + this.previousWord(); + break; + case 'ArrowRight': + case ' ': // 空格键 + e.preventDefault(); + this.nextWord(); + break; + case '1': + this.setLearningMode('sequential'); + break; + case '2': + this.setLearningMode('random'); + break; + case '3': + this.setLearningMode('reverse'); + break; + } + } + + // 获取学习统计信息 + getStats() { + return { + totalWords: this.vocabulary.length, + currentPosition: this.currentIndex + 1, + learningMode: this.learningMode, + historyLength: this.history.length + }; + } +} + +// 页面加载完成后初始化应用 +document.addEventListener('DOMContentLoaded', () => { + window.vocabularyApp = new VocabularyApp(); + + // 添加一些用户提示 + console.log('计算机英语词汇学习应用已启动!'); + console.log('快捷键提示:'); + console.log('← 上一个词汇'); + console.log('→ 或 空格 下一个词汇'); + console.log('1 顺序模式'); + console.log('2 随机模式'); + console.log('3 逆序模式'); +}); + +// 防止页面刷新时丢失进度(可选功能) +window.addEventListener('beforeunload', () => { + if (window.vocabularyApp) { + const stats = window.vocabularyApp.getStats(); + localStorage.setItem('vocabularyProgress', JSON.stringify({ + currentIndex: window.vocabularyApp.currentIndex, + learningMode: window.vocabularyApp.learningMode, + timestamp: Date.now() + })); + } +}); + +// 页面加载时恢复进度(可选功能) +window.addEventListener('load', () => { + const savedProgress = localStorage.getItem('vocabularyProgress'); + if (savedProgress && window.vocabularyApp) { + try { + const progress = JSON.parse(savedProgress); + // 只在24小时内的进度才恢复 + if (Date.now() - progress.timestamp < 24 * 60 * 60 * 1000) { + window.vocabularyApp.setLearningMode(progress.learningMode); + window.vocabularyApp.currentIndex = progress.currentIndex; + window.vocabularyApp.displayCurrentWord(); + window.vocabularyApp.updateButtonStates(); + } + } catch (e) { + console.log('无法恢复学习进度'); + } + } +}); \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/background.css b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/background.css new file mode 100644 index 00000000..b9e1c17d --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/background.css @@ -0,0 +1,139 @@ +/* 背景样式文件 */ + +/* 主体背景 */ +body { + background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); + background-attachment: fixed; +} + +/* 淡绿色渐变背景变体 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(135deg, #e8f5e8 0%, #a8e6a3 50%, #81c784 100%); + opacity: 0.3; + z-index: -2; +} + +/* 动态背景装饰 */ +body::after { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle at 20% 80%, rgba(39, 174, 96, 0.1) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(46, 204, 113, 0.1) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(52, 152, 219, 0.05) 0%, transparent 50%); + z-index: -1; + animation: backgroundFloat 20s ease-in-out infinite; +} + +/* 背景动画 */ +@keyframes backgroundFloat { + 0%, 100% { + transform: translateY(0px) rotate(0deg); + } + 33% { + transform: translateY(-10px) rotate(1deg); + } + 66% { + transform: translateY(5px) rotate(-1deg); + } +} + +/* 词汇卡片背景增强 */ +.vocabulary-card { + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); +} + +/* 按钮背景效果 */ +.control-btn::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transition: left 0.5s; + z-index: -1; +} + +.control-btn { + position: relative; + overflow: hidden; +} + +.control-btn:hover::before { + left: 100%; +} + +/* 模式按钮背景效果 */ +.mode-btn { + position: relative; + overflow: hidden; +} + +.mode-btn::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); + transition: left 0.4s; + z-index: -1; +} + +.mode-btn:hover::before { + left: 100%; +} + +/* 响应式背景调整 */ +@media (max-width: 768px) { + body::after { + animation-duration: 15s; + } + + .vocabulary-card { + background: rgba(255, 255, 255, 0.98); + } +} + +@media (max-width: 480px) { + body::before { + opacity: 0.2; + } + + body::after { + animation: none; + } +} + +/* 深色模式背景支持 */ +@media (prefers-color-scheme: dark) { + body { + background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%); + } + + body::before { + background: linear-gradient(135deg, #27ae60 0%, #2ecc71 50%, #16a085 100%); + opacity: 0.1; + } + + .vocabulary-card { + background: rgba(44, 62, 80, 0.95); + color: #ecf0f1; + border-color: rgba(39, 174, 96, 0.3); + } +} \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/convert_vocabulary.py b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/convert_vocabulary.py new file mode 100644 index 00000000..2a4612dc --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/convert_vocabulary.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +计算机英语词汇数据转换脚本 +将txt格式的词汇文件转换为JavaScript数组格式 +""" + +import re +import json + +def parse_vocabulary_file(file_path): + """解析词汇文件""" + vocabulary_list = [] + + with open(file_path, 'r', encoding='utf-8') as file: + lines = file.readlines() + + for line in lines: + line = line.strip() + if not line or line.startswith('51 - 100') or line.startswith('101 - 150') or line.startswith('151 - 200'): + continue + + # 使用正则表达式匹配词汇条目 + # 格式: 数字. 单词 [音标] 词性 中文释义 + pattern = r'^(\d+)\. ([a-zA-Z\-\']+) \[([^\]]*(?:\][^\]]*)*) ([a-zA-Z\.&]+) (.+)$' + match = re.match(pattern, line) + + if match: + word_id, word, phonetic, word_type, meaning = match.groups() + + # 修复音标格式问题 + if not phonetic.endswith(']'): + # 查找下一个有效的词性和释义 + parts = line.split() + for i, part in enumerate(parts): + if part in ['n.', 'v.', 'vt.', 'vi.', 'a.', 'ad.', 'prep.', 'conj.', 'pron.']: + word_type = part + meaning = ' '.join(parts[i+1:]) + # 从原始行中提取音标 + phonetic_start = line.find('[') + 1 + phonetic_end = line.find(word_type) - 1 + phonetic = line[phonetic_start:phonetic_end].strip() + break + + vocabulary_item = { + 'id': int(word_id), + 'word': word.strip(), + 'phonetic': f'[{phonetic}]', + 'type': word_type.strip(), + 'meaning': meaning.strip() + } + + vocabulary_list.append(vocabulary_item) + + return vocabulary_list + +def generate_js_file(vocabulary_list, output_path): + """生成JavaScript文件""" + js_content = '''// 计算机英语词汇数据 +const vocabularyData = [ +''' + + for i, item in enumerate(vocabulary_list): + js_content += f' {{ id: {item["id"]}, word: "{item["word"]}", phonetic: "{item["phonetic"]}", type: "{item["type"]}", meaning: "{item["meaning"]}" }}' + + if i < len(vocabulary_list) - 1: + js_content += ',\n' + else: + js_content += '\n' + + js_content += ''']; + +// 导出数据供其他文件使用 +if (typeof module !== 'undefined' && module.exports) { + module.exports = vocabularyData; +} +''' + + with open(output_path, 'w', encoding='utf-8') as file: + file.write(js_content) + + print(f'成功生成JavaScript文件: {output_path}') + print(f'共转换 {len(vocabulary_list)} 个词汇') + +def main(): + """主函数""" + input_file = '计算机英语词汇.txt' + output_file = 'vocabulary-data.js' + + try: + print('开始解析词汇文件...') + vocabulary_list = parse_vocabulary_file(input_file) + + print('开始生成JavaScript文件...') + generate_js_file(vocabulary_list, output_file) + + print('转换完成!') + + except FileNotFoundError: + print(f'错误: 找不到文件 {input_file}') + except Exception as e: + print(f'转换过程中发生错误: {e}') + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/index.html b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/index.html new file mode 100644 index 00000000..dc721a9a --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/index.html @@ -0,0 +1,46 @@ + + + + + + 计算机英语词汇学习 + + + + +
    +
    +

    计算机英语词汇学习

    +
    + + + +
    +
    + +
    +
    +
    1
    +
    +
    file
    +
    [fail]
    +
    n.
    +
    文件;v. 保存文件
    +
    +
    + +
    + 1 / 1731 +
    + +
    + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/styles.css b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/styles.css new file mode 100644 index 00000000..b33e5650 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/styles.css @@ -0,0 +1,364 @@ +/* 基础样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; + line-height: 1.6; + color: #2c3e50; + min-height: 100vh; +} + +.container { + max-width: 800px; + margin: 0 auto; + padding: 20px; + min-height: 100vh; + display: flex; + flex-direction: column; +} + +/* 头部样式 */ +header { + text-align: center; + margin-bottom: 30px; +} + +header h1 { + color: #27ae60; + font-size: 2rem; + margin-bottom: 20px; + font-weight: 600; +} + +/* 模式选择器 */ +.mode-selector { + display: flex; + justify-content: center; + gap: 10px; + margin-bottom: 20px; +} + +.mode-btn { + padding: 8px 16px; + border: 2px solid #27ae60; + background: transparent; + color: #27ae60; + border-radius: 20px; + cursor: pointer; + font-size: 14px; + transition: all 0.3s ease; + font-weight: 500; +} + +.mode-btn:hover { + background: #27ae60; + color: white; + transform: translateY(-2px); +} + +.mode-btn.active { + background: #27ae60; + color: white; +} + +/* 主要内容区域 */ +main { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +/* 词汇卡片 */ +.vocabulary-card { + background: white; + border-radius: 20px; + padding: 40px; + box-shadow: 0 10px 30px rgba(39, 174, 96, 0.1); + text-align: center; + margin-bottom: 30px; + width: 100%; + max-width: 500px; + border: 2px solid #e8f5e8; + transition: all 0.3s ease; +} + +.vocabulary-card:hover { + transform: translateY(-5px); + box-shadow: 0 15px 40px rgba(39, 174, 96, 0.15); +} + +.word-number { + color: #95a5a6; + font-size: 14px; + margin-bottom: 20px; + font-weight: 500; +} + +.word-content { + display: flex; + flex-direction: column; + gap: 15px; +} + +.english-word { + font-size: 2.5rem; + font-weight: 700; + color: #27ae60; + margin-bottom: 10px; +} + +.phonetic { + font-size: 1.2rem; + color: #7f8c8d; + font-style: italic; +} + +.word-type { + font-size: 1rem; + color: #e67e22; + font-weight: 600; +} + +.chinese-meaning { + font-size: 1.3rem; + color: #2c3e50; + font-weight: 500; + line-height: 1.5; +} + +/* 进度信息 */ +.progress-info { + color: #7f8c8d; + font-size: 16px; + margin-bottom: 30px; + font-weight: 500; +} + +/* 控制按钮 */ +.control-buttons { + display: flex; + gap: 15px; + justify-content: center; + flex-wrap: wrap; +} + +.control-btn { + padding: 12px 24px; + border: 2px solid #27ae60; + background: transparent; + color: #27ae60; + border-radius: 25px; + cursor: pointer; + font-size: 16px; + font-weight: 600; + transition: all 0.3s ease; + min-width: 100px; +} + +.control-btn:hover { + background: #27ae60; + color: white; + transform: translateY(-2px); +} + +.control-btn.primary { + background: #27ae60; + color: white; +} + +.control-btn.primary:hover { + background: #219a52; + transform: translateY(-2px); +} + +.control-btn:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; +} + +.control-btn:disabled:hover { + background: transparent; + color: #27ae60; + transform: none; +} + + + +/* 平板端适配 (768px - 1024px) */ +@media (min-width: 768px) and (max-width: 1024px) { + .container { + padding: 30px; + } + + header h1 { + font-size: 2.5rem; + } + + .vocabulary-card { + padding: 50px; + } + + .english-word { + font-size: 3rem; + } + + .control-buttons { + gap: 20px; + } + + .control-btn { + padding: 15px 30px; + font-size: 18px; + min-width: 120px; + } +} + +/* 电脑端适配 (1024px+) */ +@media (min-width: 1024px) { + .container { + padding: 40px; + } + + header h1 { + font-size: 3rem; + } + + .vocabulary-card { + padding: 60px; + } + + .english-word { + font-size: 3.5rem; + } + + .phonetic { + font-size: 1.4rem; + } + + .chinese-meaning { + font-size: 1.5rem; + } + + .control-buttons { + gap: 25px; + } + + .control-btn { + padding: 15px 35px; + font-size: 18px; + min-width: 130px; + } + + .mode-btn { + padding: 10px 20px; + font-size: 16px; + } + + +} + +/* 手机端优化 (最大767px) */ +@media (max-width: 767px) { + .container { + padding: 15px; + } + + header h1 { + font-size: 1.8rem; + margin-bottom: 15px; + } + + .mode-selector { + gap: 8px; + margin-bottom: 15px; + } + + .mode-btn { + padding: 6px 12px; + font-size: 12px; + border-radius: 15px; + } + + .vocabulary-card { + padding: 25px 20px; + margin-bottom: 20px; + border-radius: 15px; + } + + .english-word { + font-size: 2rem; + margin-bottom: 8px; + } + + .phonetic { + font-size: 1rem; + } + + .word-type { + font-size: 0.9rem; + } + + .chinese-meaning { + font-size: 1.1rem; + } + + .word-content { + gap: 10px; + } + + .progress-info { + font-size: 14px; + margin-bottom: 20px; + } + + .control-buttons { + gap: 10px; + width: 100%; + } + + .control-btn { + padding: 10px 16px; + font-size: 14px; + min-width: 80px; + flex: 1; + } + +} + +/* 超小屏幕优化 (最大480px) */ +@media (max-width: 480px) { + .container { + padding: 10px; + } + + header h1 { + font-size: 1.5rem; + } + + .vocabulary-card { + padding: 20px 15px; + } + + .english-word { + font-size: 1.8rem; + } + + .control-buttons { + flex-direction: column; + gap: 8px; + } + + .control-btn { + width: 100%; + min-width: auto; + } + + +} \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/vocabulary-data.js b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/vocabulary-data.js new file mode 100644 index 00000000..398d44e4 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/vocabulary-data.js @@ -0,0 +1,1677 @@ +// 计算机英语词汇数据 +const vocabularyData = [ + { id: 1, word: "file", phonetic: "[fail]]", type: "n.", meaning: "文件;v. 保存文件" }, + { id: 2, word: "command", phonetic: "[kə ˈ mɑ:nd]]", type: "n.", meaning: "命令,指令" }, + { id: 3, word: "use", phonetic: "[ju:z, ju:s]]", type: "v.", meaning: "使用,用途" }, + { id: 4, word: "program", phonetic: "[ ˈ pr ə ugræm]]", type: "n.", meaning: "程 序" }, + { id: 5, word: "line", phonetic: "[lain]]", type: "n.", meaning: "(数据,程序)行,线路" }, + { id: 6, word: "if", phonetic: "[if]]", type: "conj.", meaning: "如果" }, + { id: 7, word: "display", phonetic: "[disˈ plei]]", type: "vt.", meaning: "显示,显示器" }, + { id: 8, word: "set", phonetic: "[set]]", type: "v.", meaning: "设置,n. 集合" }, + { id: 9, word: "key", phonetic: "[ki:]]", type: "n.", meaning: "键,关键字,关键码" }, + { id: 10, word: "list", phonetic: "[list]]", type: "n.", meaning: "列表,显示,v. 打印" }, + { id: 11, word: "by", phonetic: "[bai]]", type: "prep.", meaning: "凭,靠,沿" }, + { id: 12, word: "press", phonetic: "[pres]]", type: "v.", meaning: "按,压" }, + { id: 13, word: "with", phonetic: "[wið, wiθ]]", type: "prep.", meaning: "用,与,随着" }, + { id: 14, word: "format", phonetic: "[ˈ fɔ :mæt]]", type: "n.", meaning: "格式" }, + { id: 15, word: "change", phonetic: "[tʃ eindʒ ]]", type: "v.", meaning: "更换,改变,变动" }, + { id: 16, word: "cursor", phonetic: "['kə :sə ]]", type: "n.", meaning: "光标" }, + { id: 17, word: "directory", phonetic: "[diˈ rektə ri]]", type: "n.", meaning: "目录,索引簿" }, + { id: 18, word: "from", phonetic: "[frə m,frɔ m]]", type: "prep.", meaning: "从,来自,以来" }, + { id: 19, word: "menu", phonetic: "[ˈ menju:]]", type: "n.", meaning: "菜单,目录" }, + { id: 20, word: "option", phonetic: "[ˈ ɔ pʃ ə n]]", type: "n.", meaning: "任选,选择,可选项" }, + { id: 21, word: "character", phonetic: "[ˈ kæriktə ]]", type: "n.", meaning: "字符,符号,特性" }, + { id: 22, word: "current", phonetic: "[ˈ kʌ rə nt]]", type: "n.", meaning: "电流" }, + { id: 23, word: "type", phonetic: "[taip]]", type: "n.", meaning: "型,类型;v. 打印" }, + { id: 24, word: "screen", phonetic: "[skri:n]]", type: "n.", meaning: "屏幕,屏;v. 屏蔽" }, + { id: 25, word: "specify", phonetic: "[ˈ spesifai]]", type: "v.", meaning: "指定,规定,确定" }, + { id: 26, word: "move", phonetic: "[mu:v]]", type: "v.", meaning: "移动" }, + { id: 27, word: "disk", phonetic: "[disk]]", type: "n.", meaning: "盘,磁盘" }, + { id: 28, word: "text", phonetic: "[tekst]]", type: "n.", meaning: "正文,文本" }, + { id: 29, word: "drive", phonetic: "[draiv]]", type: "v.", meaning: "驱动;n. 驱动器" }, + { id: 30, word: "see", phonetic: "[si:]]", type: "v.", meaning: "看,看出,查看" }, + { id: 31, word: "name", phonetic: "[ˈ neim]]", type: "n.", meaning: "名,名称;vt. 命名" }, + { id: 32, word: "record", phonetic: "[ˈ rekɔ :d, riˈ kɔ :d]]", type: "n.", meaning: "记录" }, + { id: 33, word: "box", phonetic: "[bɔ ks]]", type: "n.", meaning: "箱,匣,(逻辑)框" }, + { id: 34, word: "database", phonetic: "[ˈ deitə beis]]", type: "n.", meaning: "数据库" }, + { id: 35, word: "help", phonetic: "[help]]", type: "v.", meaning: "& n. 帮助" }, + { id: 36, word: "memory", phonetic: "[ˈ memə ri]]", type: "n.", meaning: "记忆存储,存储器" }, + { id: 37, word: "which", phonetic: "[witʃ ]]", type: "pron.", meaning: "哪个,a. 那一个" }, + { id: 38, word: "all", phonetic: "[ɔ :l]]", type: "a.", meaning: "全,全部;ad. 完全" }, + { id: 39, word: "on", phonetic: "[ɔ n]]", type: "ad.", meaning: "接通,导电,开" }, + { id: 40, word: "copy", phonetic: "[ˈ kɔ pi]]", type: "n.", meaning: "复制,v. 拷贝" }, + { id: 41, word: "shell", phonetic: "[ʃ el]]", type: "n.", meaning: "壳,外壳 ·" }, + { id: 42, word: "delete", phonetic: "[diˈ li:t]]", type: "vt.", meaning: "删除,删去,作废" }, + { id: 43, word: "enter", phonetic: "[ˈ entə ]]", type: "v.", meaning: "键入,送入" }, + { id: 44, word: "margin", phonetic: "[ˈ mɑ:dʒ in]]", type: "n.", meaning: "余量,边缘,边际" }, + { id: 45, word: "mark", phonetic: "[mɑ:k]]", type: "n.", meaning: "标记;vt. 加标记" }, + { id: 46, word: "also", phonetic: "[ˈ ɔ :lsə u]]", type: "ad.", meaning: "& conj. 也,亦,还" }, + { id: 47, word: "do", phonetic: "[du, du:]]", type: "v.", meaning: "做,干;n. 循环" }, + { id: 48, word: "information", phonetic: "[ˌ infə ˈ meiʃ ə n]", type: "n.", meaning: "信息,情报" }, + { id: 49, word: "choose", phonetic: "[tʃ u:z]]", type: "v.", meaning: "挑选,选择,选定" }, + { id: 50, word: "select", phonetic: "[siˈ lekt]]", type: "vt.", meaning: "选择" }, + { id: 51, word: "group", phonetic: "[gru:p]]", type: "n.", meaning: "组,群" }, + { id: 52, word: "first", phonetic: "[fə :st]]", type: "a.", meaning: "& ad. & n. 第一,首先" }, + { id: 53, word: "field", phonetic: "[fi:ld]]", type: "n.", meaning: "字段,域,栏,场" }, + { id: 54, word: "procedure", phonetic: "[prə ˈ si:dʒ ə ]]", type: "n.", meaning: "过程,程序,工序" }, + { id: 55, word: "print", phonetic: "[print]]", type: "v.", meaning: "打印,印刷" }, + { id: 56, word: "return", phonetic: "[riˈ tə :n]]", type: "v.", meaning: "返回,回送" }, + { id: 57, word: "number", phonetic: "[ˈ nʌ mbə ]]", type: "n.", meaning: "数字,号码;vt. 编号" }, + { id: 58, word: "selected", phonetic: "[siˈ lekt]]", type: "a.", meaning: "精选的" }, + { id: 59, word: "want", phonetic: "[wɔ nt, wɑ:nt]]", type: "v.", meaning: "需要,应该,缺少" }, + { id: 60, word: "window", phonetic: "[ˈ wində u]]", type: "n.", meaning: "窗口" }, + { id: 61, word: "message", phonetic: "[ˈ mesidʒ ]]", type: "n.", meaning: "信息,消息,电文" }, + { id: 62, word: "dialog", phonetic: "[ˈ daiə lɔ g]]", type: "n.", meaning: "& vt. 对话" }, + { id: 63, word: "example", phonetic: "[igˈ zɑ:mpə l]]", type: "n.", meaning: "例子,实例" }, + { id: 64, word: "create", phonetic: "[kri:ˈ eit]]", type: "vt.", meaning: "创立,建立" }, + { id: 65, word: "insert", phonetic: "[inˈ sə :t, ˈ insə :t]]", type: "vt.", meaning: "插入" }, + { id: 66, word: "related", phonetic: "[riˈ leitid]]", type: "a.", meaning: "相关的" }, + { id: 67, word: "item", phonetic: "[ˈ aitə m]]", type: "n.", meaning: "项,项目,条款" }, + { id: 68, word: "edit", phonetic: "[ˈ edit]]", type: "vt.", meaning: "编辑,编排,编篡" }, + { id: 69, word: "marked", phonetic: "[ma:kt]]", type: "a.", meaning: "有记号的" }, + { id: 70, word: "area", phonetic: "[ˈɛə riə ]]", type: "n.", meaning: "(区)域,面积,方面" }, + { id: 71, word: "parameter", phonetic: "[pə ˈ ræmitə ]]", type: "n.", meaning: "参数,参变量" }, + { id: 72, word: "then", phonetic: "[ðen]]", type: "ad.", meaning: "& conj. 那时,则" }, + { id: 73, word: "variable", phonetic: "[ˈ veə riə bə l]]", type: "a.", meaning: "可变的;n. 变量" }, + { id: 74, word: "tab", phonetic: "[tæb]]", type: "n.", meaning: "制表键" }, + { id: 75, word: "up", phonetic: "[ʌ p]]", type: "ad.", meaning: "上,向上,a. 高的" }, + { id: 76, word: "string", phonetic: "[striŋ]]", type: "n.", meaning: "行,字符串" }, + { id: 77, word: "each", phonetic: "[ˈ i:tʃ ]]", type: "a.", meaning: "& ad. 各(自),每个" }, + { id: 78, word: "active", phonetic: "[ˈ æktiv]]", type: "a.", meaning: "激活的,活动的" }, + { id: 79, word: "topic", phonetic: "[ˈ tɔ pik]]", type: "n.", meaning: "题目,论题" }, + { id: 80, word: "start", phonetic: "[stɑ:t]]", type: "v.", meaning: "起动,开始,启动" }, + { id: 81, word: "mode", phonetic: "[mə ud]]", type: "n.", meaning: "态,方式,模" }, + { id: 82, word: "selection", phonetic: "[siˈ lekʃ ə n]]", type: "n.", meaning: "选择" }, + { id: 83, word: "function", phonetic: "[ˈ fʌ ŋkʃ ə n]]", type: "n.", meaning: "函数,功能,操作" }, + { id: 84, word: "word", phonetic: "[wə :d]]", type: "n.", meaning: "字(词),单词" }, + { id: 85, word: "make", phonetic: "[meik]]", type: "vt.", meaning: "制造,形成,接通" }, + { id: 86, word: "right", phonetic: "[rait]]", type: "a.", meaning: "右边的,正确的" }, + { id: 87, word: "value", phonetic: "[ˈ vælju:]]", type: "n.", meaning: "值" }, + { id: 88, word: "button", phonetic: "[ˈ bʌ tn]]", type: "n.", meaning: "按钮" }, + { id: 89, word: "index", phonetic: "[ˈ indeks]]", type: "n.", meaning: "索引,变址,指数" }, + { id: 90, word: "without", phonetic: "[wiˈ ðaut]]", type: "prep.", meaning: "没有,在…以外" }, + { id: 91, word: "appear", phonetic: "[ə ˈ piə ]]", type: "vi.", meaning: "出现,显现,好像" }, + { id: 92, word: "left", phonetic: "[left]]", type: "a.", meaning: "& n. 左边(的)" }, + { id: 93, word: "save", phonetic: "[seiv]]", type: "v.", meaning: "保存" }, + { id: 94, word: "next", phonetic: "[nekst]]", type: "n.", meaning: "下一次,a. 其次" }, + { id: 95, word: "off", phonetic: "[ɔ (:)f]]", type: "ad.", meaning: "(设备)关着,脱离" }, + { id: 96, word: "following", phonetic: "[ˈ fɔ lə uiŋ]]", type: "a.", meaning: "下列的,以下的" }, + { id: 97, word: "control", phonetic: "[kə nˈ trə ul]]", type: "v.", meaning: "控制,支配,管理" }, + { id: 98, word: "only", phonetic: "[ˈ ə unli]]", type: "a.", meaning: "唯一的,ad. 仅仅" }, + { id: 99, word: "user", phonetic: "[ˈ ju:zə ]]", type: "n.", meaning: "用户" }, + { id: 100, word: "end", phonetic: "[end]]", type: "n.", meaning: "结束,终点,端点" }, + { id: 101, word: "system", phonetic: "[ˈ sistə m]]", type: "n.", meaning: "系统" }, + { id: 102, word: "contain", phonetic: "[kə nˈ tein]]", type: "vt.", meaning: "包含,包括" }, + { id: 103, word: "time", phonetic: "[taim]]", type: "n.", meaning: "时间;vt. 计时" }, + { id: 104, word: "letter", phonetic: "[ˈ letə ]]", type: "n.", meaning: "字母,信" }, + { id: 105, word: "data", phonetic: "[ˈ deitə ]]", type: "n.", meaning: "数据" }, + { id: 106, word: "setting", phonetic: "[ˈ setiŋ]]", type: "n.", meaning: "设置,调整" }, + { id: 107, word: "desire", phonetic: "[diˈ zaiə ]]", type: "v.", meaning: "& n. 期望" }, + { id: 108, word: "position", phonetic: "[pə ˈ ziʃ ə n]]", type: "n.", meaning: "位置;vt. 定位" }, + { id: 109, word: "down", phonetic: "[daun]]", type: "ad.", meaning: "落下,降低,减少" }, + { id: 110, word: "task", phonetic: "[tɑ:sk]]", type: "n.", meaning: "任务;v. 派给…任务" }, + { id: 111, word: "view", phonetic: "[vju:]]", type: "n.", meaning: "& v. 视图,景象" }, + { id: 112, word: "switch", phonetic: "[switʃ ]]", type: "n.", meaning: "& v. 开关,转换,切换" }, + { id: 113, word: "include", phonetic: "[inˈ klu:d]]", type: "vt.", meaning: "包括,包含" }, + { id: 114, word: "get", phonetic: "[get]]", type: "v.", meaning: "得到,获得,取" }, + { id: 115, word: "default", phonetic: "[diˈ fɔ :lt]]", type: "v.", meaning: "缺省,预置,约定" }, + { id: 116, word: "structure", phonetic: "[ˈ strʌ ktʃ ə ]]", type: "n.", meaning: "结构,构造,构件" }, + { id: 117, word: "into", phonetic: "[ˈ intu, ˈ intə ]]", type: "prep.", meaning: "向内,进入" }, + { id: 118, word: "path", phonetic: "[pɑ:θ]]", type: "n.", meaning: "路径,通路,轨道" }, + { id: 119, word: "blank", phonetic: "[blæŋk]]", type: "n.", meaning: "空白,间隔" }, + { id: 120, word: "open", phonetic: "[ˈ ə upə n]]", type: "v.", meaning: "打开,开启,断开" }, + { id: 121, word: "add", phonetic: "[æd]]", type: "v.", meaning: "& n. 加,增加,添" }, + { id: 122, word: "enable", phonetic: "[iˈ neibə l]]", type: "vt.", meaning: "启动,恢复正常操作" }, + { id: 123, word: "operation", phonetic: "[ˌ ɔ pə ˈ reiʃ ə n]]", type: "n.", meaning: "操作,运算,动作" }, + { id: 124, word: "erase", phonetic: "[iˈ reiz]]", type: "v.", meaning: "擦除,取消,删除" }, + { id: 125, word: "filename", phonetic: "['failneim]]", type: "n.", meaning: "文件名" }, + { id: 126, word: "search", phonetic: "[sə :tʃ ]]", type: "v.", meaning: "检索,查询,搜索" }, + { id: 127, word: "another", phonetic: "[ə ˈ nʌ ðə ]]", type: "a.", meaning: "另一个,别的" }, + { id: 128, word: "last", phonetic: "[lɑ:st]]", type: "a.", meaning: "& n. 最后(的)" }, + { id: 129, word: "column", phonetic: "[ˈ kɔ lə m]]", type: "n.", meaning: "列,柱,栏" }, + { id: 130, word: "after", phonetic: "[ˈ ɑ:ftə ]]", type: "prep.", meaning: "& ad. 以后,后面" }, + { id: 131, word: "prompt", phonetic: "[prɔ mpt]]", type: "n.", meaning: "& v. 提示" }, + { id: 132, word: "two", phonetic: "[tu:]]", type: "n.", meaning: "& a. 二,两,双" }, + { id: 133, word: "execute", phonetic: "[ˈ eksikju:t]]", type: "v.", meaning: "实行,实施" }, + { id: 134, word: "about", phonetic: "[ə ˈ baut]]", type: "ad.", meaning: "关于,大约,附近" }, + { id: 135, word: "escape", phonetic: "[iˈ skeip]]", type: "v.", meaning: "逃避,逸出,换码" }, + { id: 136, word: "error", phonetic: "[ˈ erə ]]", type: "n.", meaning: "错误,误差,差错" }, + { id: 137, word: "currently", phonetic: "[ˈ kʌ rə ntli]]", type: "ad.", meaning: "目前,现在" }, + { id: 138, word: "extension", phonetic: "[ikˈ stenʃ ə n]]", type: "n.", meaning: "扩充,延伸" }, + { id: 139, word: "same", phonetic: "[seim]]", type: "a.", meaning: "同样的,相同的" }, + { id: 140, word: "status", phonetic: "[ˈ steitə s]]", type: "n.", meaning: "状态,态,状况" }, + { id: 141, word: "run", phonetic: "[rʌ n]]", type: "v.", meaning: "运行,运转,操作" }, + { id: 142, word: "argument", phonetic: "[ˈ ɑ:gju:mə nt]]", type: "n.", meaning: "变元,自变量" }, + { id: 143, word: "statement", phonetic: "[ˈ steitmə nt]]", type: "n.", meaning: "语句,陈述,命题" }, + { id: 144, word: "shift", phonetic: "[ʃ ift]]", type: "v.", meaning: "转义,换档,移位" }, + { id: 145, word: "store", phonetic: "[stɔ :]]", type: "n.", meaning: "& vt. 存储,存储器" }, + { id: 146, word: "scroll", phonetic: "[skrə ul]]", type: "vt.", meaning: "上滚(卷);n. 纸卷" }, + { id: 147, word: "replace", phonetic: "[ri(:)ˈ pleis]]", type: "vt.", meaning: "替换,置换,代换" }, + { id: 148, word: "macro", phonetic: "['mækrə u]]", type: "n.", meaning: "宏,宏功能,宏指令" }, + { id: 149, word: "page", phonetic: "[peidʒ ]]", type: "n.", meaning: "页面,页,版面" }, + { id: 150, word: "quit", phonetic: "[kwit]]", type: "v.", meaning: "退出,结束" }, + { id: 151, word: "define", phonetic: "[diˈ fain]]", type: "vt.", meaning: "定义,规定,分辨" }, + { id: 152, word: "reference", phonetic: "[ˈ refə rə ns]]", type: "n.", meaning: "& a. 参考;参考的" }, + { id: 153, word: "other", phonetic: "[ˈ ʌ ðə ]]", type: "a.", meaning: "别的,另外的" }, + { id: 154, word: "while", phonetic: "[wail]]", type: "conj.", meaning: "当…的时候" }, + { id: 155, word: "pressing", phonetic: "[ˈ presiŋ]]", type: "n.", meaning: "& a. 压制;紧急的" }, + { id: 156, word: "restore", phonetic: "[riˈ stɔ :]]", type: "vt.", meaning: "恢复,复原" }, + { id: 157, word: "top", phonetic: "[tɔ p]]", type: "n.", meaning: "顶,尖端" }, + { id: 158, word: "how", phonetic: "[hau]]", type: "ad.", meaning: "如何,怎样,多么" }, + { id: 159, word: "color", phonetic: "[ˈ kʌ lə ]]", type: "n.", meaning: "颜色,色彩,(彩)色" }, + { id: 160, word: "allow", phonetic: "[ə ˈ lau]]", type: "v.", meaning: "允许,容许" }, + { id: 161, word: "block", phonetic: "[blɔ k]]", type: "n.", meaning: "(字,信息,数据)块" }, + { id: 162, word: "decimal", phonetic: "[ˈ desimə l]]", type: "n.", meaning: "& a. 十进制;十进制的" }, + { id: 163, word: "main", phonetic: "[mein]]", type: "a.", meaning: "主要的" }, + { id: 164, word: "definition", phonetic: "[ˌ defiˈ niʃ ə n]]", type: "n.", meaning: "定义,确实,清晰度" }, + { id: 165, word: "between", phonetic: "[biˈ twi:n]]", type: "prep.", meaning: "在…之间,中间" }, + { id: 166, word: "optional", phonetic: "[ˈ ɔ pʃ ə nə l]]", type: "a.", meaning: "任选的,可选的" }, + { id: 167, word: "date", phonetic: "[ˈ deit]]", type: "n.", meaning: "日期" }, + { id: 168, word: "remove", phonetic: "[riˈ mu:v]]", type: "v.", meaning: "除去,移动" }, + { id: 169, word: "arrow", phonetic: "[ˈ ærə u]]", type: "n.", meaning: "箭头,指针" }, + { id: 170, word: "label", phonetic: "[ˈ leibə l]]", type: "n.", meaning: "标签,标号,标识符" }, + { id: 171, word: "within", phonetic: "[wiˈ ðin]]", type: "prep.", meaning: "在…以内" }, + { id: 172, word: "issue", phonetic: "[ˈ iʃ u:, ˈ isju:]]", type: "v.", meaning: "发行,出版,流出" }, + { id: 174, word: "available", phonetic: "[ə ˈ veilə bə l]]", type: "a.", meaning: "可用的" }, + { id: 175, word: "returned", phonetic: "[ri'tə :nd]]", type: "a.", meaning: "退回的" }, + { id: 176, word: "associate", phonetic: "[ə ˈ sə uʃ ieit]]", type: "v.", meaning: "相联,联想,关联" }, + { id: 177, word: "attribute", phonetic: "[ˈ ætribju:t, ə ˈ tribju:t]]", type: "n.", meaning: "属性,标志,表征" }, + { id: 179, word: "before", phonetic: "[biˈ fɔ :]]", type: "prep.", meaning: "以前,前,先" }, + { id: 180, word: "order", phonetic: "[ˈ ɔ :də ]]", type: "n.", meaning: "& vt. 指令,次序;排序" }, + { id: 181, word: "modify", phonetic: "[ˈ mɔ difai]]", type: "vt.", meaning: "修改,改变,变址" }, + { id: 182, word: "array", phonetic: "[ə ˈ rei]]", type: "n.", meaning: "数组,阵列" }, + { id: 183, word: "mouse", phonetic: "[maus]]", type: "n.", meaning: "鼠标器" }, + { id: 184, word: "note", phonetic: "[nə ut]]", type: "n.", meaning: "注解,注释" }, + { id: 185, word: "locate", phonetic: "[lə uˈ keit]]", type: "vt.", meaning: "定位" }, + { id: 186, word: "video", phonetic: "[ˈ vidiə u]]", type: "n.", meaning: "视频,电视" }, + { id: 187, word: "printer", phonetic: "[ˈ printə ]]", type: "n.", meaning: "打印机,印刷机" }, + { id: 188, word: "bar", phonetic: "[bɑ:]]", type: "n.", meaning: "条,杆,棒" }, + { id: 189, word: "bottom", phonetic: "['bɔ tə m]]", type: "n.", meaning: "& a. 底,基础;底下的" }, + { id: 190, word: "carriage", phonetic: "[ˈ kæridʒ ]]", type: "n.", meaning: "滑架,托架" }, + { id: 191, word: "content", phonetic: "[ˈ kɔ ntent]]", type: "n.", meaning: "含量,容量,内容" }, + { id: 192, word: "either", phonetic: "[ˈ aiðə , ˈ i:ðə ]]", type: "a.", meaning: "& pron. 任何一个,各" }, + { id: 193, word: "ok", phonetic: "[ə uˈ kei]]", type: "ad.", meaning: "& a. 对,好;全对" }, + { id: 194, word: "space", phonetic: "[speis]]", type: "n.", meaning: "空格键,空间" }, + { id: 195, word: "editor", phonetic: "[ˈ editə ]]", type: "n.", meaning: "编辑程序" }, + { id: 196, word: "exist", phonetic: "[igˈ zist]]", type: "vi.", meaning: "存在,生存,有" }, + { id: 197, word: "scope", phonetic: "[skə up]]", type: "n.", meaning: "范围,显示器" }, + { id: 198, word: "paragraph", phonetic: "[ˈ pærə grɑ:f]]", type: "n.", meaning: "段(落),节,短讯" }, + { id: 200, word: "clear", phonetic: "[kliə ]]", type: "v.", meaning: "清除,弄干净" }, + { id: 201, word: "exit", phonetic: "[ˈ eksit]]", type: "n.", meaning: "& vi. 出口;退出" }, + { id: 202, word: "report", phonetic: "[riˈ pɔ :t]]", type: "vt.", meaning: "& n. 报告,报表" }, + { id: 203, word: "execution", phonetic: "[ˌ eksiˈ kju:ʃ ə n]]", type: "n.", meaning: "执行" }, + { id: 204, word: "backup", phonetic: "[ˈ bækʌ p]]", type: "n.", meaning: "备份,后备,后援" }, + { id: 205, word: "version", phonetic: "[ˈ və :ʃ ə n, ˈ və :rʒ ə n]]", type: "n.", meaning: "版本" }, + { id: 206, word: "find", phonetic: "[faind]]", type: "v.", meaning: "寻找,发现" }, + { id: 207, word: "pointer", phonetic: "[ˈ pɔ intə ]]", type: "n.", meaning: "指针,指示字" }, + { id: 208, word: "subset", phonetic: "['sʌ bset]]", type: "n.", meaning: "子集,子设备" }, + { id: 209, word: "keyboard", phonetic: "[ˈ ki:bɔ :d]]", type: "n.", meaning: "键盘" }, + { id: 210, word: "full", phonetic: "[ful]]", type: "a.", meaning: "& ad. & n. 全(的),满" }, + { id: 211, word: "check", phonetic: "[tʃ ek]]", type: "v.", meaning: "校对,栓查,核算" }, + { id: 212, word: "should", phonetic: "[ʃ ud, ʃ ə d]]", type: "v.", meaning: "& aux. 应当,该" }, + { id: 213, word: "single", phonetic: "[ˈ siŋgə l]]", type: "a.", meaning: "& n. 单个的;一个,单" }, + { id: 214, word: "positioning", phonetic: "[pə ˈ ziʃ ə n]]", type: "n.", meaning: "定位" }, + { id: 215, word: "provide", phonetic: "[prə ˈ vaid]]", type: "v.", meaning: "提供" }, + { id: 216, word: "title", phonetic: "[ˈ taitl]]", type: "n.", meaning: "题目,标题" }, + { id: 217, word: "expression", phonetic: "[ikˈ spreʃ ə n]]", type: "n.", meaning: "表达式" }, + { id: 218, word: "through", phonetic: "[θru:]]", type: "prep.", meaning: "& ad. 通过,直通" }, + { id: 219, word: "toggle", phonetic: "['tɔ gl]]", type: "n.", meaning: "& v. 触发器;系紧" }, + { id: 220, word: "code", phonetic: "[kə ud]]", type: "n.", meaning: "码,代码,编码" }, + { id: 221, word: "such", phonetic: "[sʌ tʃ ]]", type: "a.", meaning: "& pron. 这样的,如此" }, + { id: 222, word: "beginning", phonetic: "[biˈ giniŋ]]", type: "n.", meaning: "起点,初" }, + { id: 223, word: "guide", phonetic: "[gaid]]", type: "n.", meaning: "向导,指南,入门" }, + { id: 224, word: "tree", phonetic: "[tri:]]", type: "n.", meaning: "树,语法树" }, + { id: 225, word: "environment", phonetic: "[inˈ vaiə rə nmə nt]]", type: "n.", meaning: "环境" }, + { id: 227, word: "device", phonetic: "[diˈ vais]]", type: "n.", meaning: "设备,器件,装置" }, + { id: 228, word: "highlight", phonetic: "[ˈ hailait]]", type: "n.", meaning: "增强亮度,提示区" }, + { id: 229, word: "call", phonetic: "[kɔ :l]]", type: "v.", meaning: "调用,访问,呼叫" }, + { id: 230, word: "continue", phonetic: "[kə nˈ tinju:]]", type: "v.", meaning: "连续,继续" }, + { id: 231, word: "indicate", phonetic: "[ˈ indikeit]]", type: "vt.", meaning: "指示,表示" }, + { id: 232, word: "until", phonetic: "[ə nˈ til, ʌ nˈ til]]", type: "prep.", meaning: "到…为止,直到" }, + { id: 233, word: "begin", phonetic: "[biˈ gin]]", type: "v.", meaning: "开始,着手,开端" }, + { id: 234, word: "place", phonetic: "[pleis]]", type: "vt.", meaning: "放,位,地点" }, + { id: 235, word: "rename", phonetic: "[ri:'neim]]", type: "vt.", meaning: "更名,改名" }, + { id: 236, word: "swap", phonetic: "[swɔ p]]", type: "v.", meaning: "交换,调动" }, + { id: 237, word: "work", phonetic: "[wə :k]]", type: "n.", meaning: "工作" }, + { id: 238, word: "remain", phonetic: "[riˈ mein]]", type: "vi.", meaning: "剩下,留下,仍然" }, + { id: 239, word: "close", phonetic: "[klə uz]]", type: "v.", meaning: "& a. 关闭,闭合;紧密的" }, + { id: 240, word: "combination", phonetic: "[ˌ kɔ mbiˈ neiʃ ə n]]", type: "n.", meaning: "结合,组合" }, + { id: 241, word: "profile", phonetic: "[ˈ prə ufail]]", type: "n.", meaning: "简要,剖面,概貌" }, + { id: 242, word: "unless", phonetic: "[ʌ nˈ les]]", type: "conj.", meaning: "除非" }, + { id: 243, word: "so", phonetic: "[sə u]]", type: "pron.", meaning: "& conj. 如此,这样" }, + { id: 244, word: "except", phonetic: "[ikˈ sept]]", type: "prep.", meaning: "除…之外,除非" }, + { id: 245, word: "turn", phonetic: "[tə :n]]", type: "v.", meaning: "& n. 转,转动;圈,匝" }, + { id: 246, word: "back", phonetic: "[bæk]]", type: "n.", meaning: "背面,反向,底座" }, + { id: 247, word: "sure", phonetic: "[ʃ uə ,ʃ ɔ :]]", type: "a.", meaning: "& ad. 确实的;的确" }, + { id: 248, word: "section", phonetic: "[ˈ sekʃ (ə )n]]", type: "n.", meaning: "节,段,区域" }, + { id: 249, word: "follow", phonetic: "[ˈ fɔ lə u]]", type: "v.", meaning: "跟随,跟踪" }, + { id: 250, word: "split", phonetic: "[split]]", type: "v.", meaning: "分开,分离" }, + { id: 251, word: "need", phonetic: "[ni:d]]", type: "v.", meaning: "必须,需要" }, + { id: 252, word: "access", phonetic: "[ˈ ækses]]", type: "n.", meaning: "存取,选取,接近" }, + { id: 253, word: "additional", phonetic: "[ə ˈ diʃ ə nə l]]", type: "a.", meaning: "附加的,辅助的" }, + { id: 254, word: "cancel", phonetic: "[ˈ kænsə l]]", type: "v.", meaning: "删除,取消,作废" }, + { id: 255, word: "document", phonetic: "[ˈ dɔ kjumə nt]]", type: "n.", meaning: "文献,资料,文件" }, + { id: 256, word: "case", phonetic: "[keis]]", type: "n.", meaning: "情况,场合" }, + { id: 257, word: "numeric", phonetic: "[nju:'merik]]", type: "n.", meaning: "& a. 数字的,分数" }, + { id: 258, word: "go", phonetic: "[gə u]]", type: "vi.", meaning: "运行,达到" }, + { id: 259, word: "load", phonetic: "[lə ud]]", type: "n.", meaning: "& v. 装入,负载,寄存" }, + { id: 260, word: "try", phonetic: "[trai]]", type: "n.", meaning: "(尝)试,试验" }, + { id: 261, word: "size", phonetic: "[saiz]]", type: "n.", meaning: "尺寸,大小,容量" }, + { id: 262, word: "entire", phonetic: "[inˈ taiə ]]", type: "a.", meaning: "& n. 完全的;总体" }, + { id: 263, word: "leave", phonetic: "[li:v]]", type: "v.", meaning: "离开,留下" }, + { id: 264, word: "history", phonetic: "[ˈ histə ri]]", type: "n.", meaning: "历史" }, + { id: 265, word: "second", phonetic: "[ˈ sekə nd, siˈ kɔ nd]]", type: "n.", meaning: "& a. 秒,第二(的)" }, + { id: 266, word: "reflow", phonetic: "[ri:'flə u]]", type: "v.", meaning: "& n. 回流,逆流" }, + { id: 267, word: "output", phonetic: "[ˈ autput]]", type: "n.", meaning: "输出,输出设备" }, + { id: 268, word: "out", phonetic: "[aut]]", type: "n.", meaning: "& a. 输入,在外" }, + { id: 269, word: "both", phonetic: "[bə uθ]]", type: "a.", meaning: "& ad. 两,双,都" }, + { id: 270, word: "install", phonetic: "[inˈ stɔ :l]]", type: "vt.", meaning: "安装" }, + { id: 271, word: "source", phonetic: "[sɔ :s]]", type: "n.", meaning: "源,电源,源点" }, + { id: 272, word: "way", phonetic: "[wei]]", type: "n.", meaning: "路线,途径,状态" }, + { id: 273, word: "assign", phonetic: "[ə ˈ sain]]", type: "vt.", meaning: "赋值,指定,分派" }, + { id: 274, word: "support", phonetic: "[sə ˈ pɔ :t]]", type: "vt.", meaning: "支援,支持,配套" }, + { id: 275, word: "specific", phonetic: "[spiˈ sifik]]", type: "a.", meaning: "特殊的,具体的" }, + { id: 276, word: "join", phonetic: "[dʒ ɔ in]]", type: "v.", meaning: "& n. 连接,并(运算)" }, + { id: 277, word: "expand", phonetic: "[ikˈ spænd]]", type: "v.", meaning: "扩充,扩展,展开" }, + { id: 278, word: "like", phonetic: "[laik]]", type: "a.", meaning: "类似的,同样的" }, + { id: 279, word: "diskette", phonetic: "['disket]]", type: "n.", meaning: "软磁盘,软盘片" }, + { id: 280, word: "skip", phonetic: "[skip]]", type: "v.", meaning: "跳跃(定位),跳过" }, + { id: 281, word: "application", phonetic: "[ˌ æpliˈ keiʃ (ə )n]]", type: "n.", meaning: "应用" }, + { id: 282, word: "confirmation", phonetic: "[ˌ kɔ nfə ˈ meiʃ ə n]]", type: "n.", meaning: "认可" }, + { id: 283, word: "whether", phonetic: "[ˈ weðə ]]", type: "conj.", meaning: "无论,不管" }, + { id: 284, word: "hold", phonetic: "[hə uld]]", type: "v.", meaning: "保持" }, + { id: 285, word: "click", phonetic: "[klik]]", type: "n.", meaning: "“卡搭”声,插销" }, + { id: 286, word: "write", phonetic: "[rait]]", type: "v.", meaning: "写,存入" }, + { id: 287, word: "byte", phonetic: "[bait]]", type: "n.", meaning: "(二进制的)字节" }, + { id: 288, word: "abbreviate", phonetic: "[ə ˈ bri:vieit]]", type: "vt.", meaning: "缩写,省略" }, + { id: 289, word: "show", phonetic: "[ʃ ə u]]", type: "v.", meaning: "显示,呈现,出示" }, + { id: 290, word: "otherwise", phonetic: "[ˈ ʌ ðə waiz]]", type: "ad.", meaning: "& a. 另外" }, + { id: 291, word: "working", phonetic: "[ˈ wə :kiŋ]]", type: "n.", meaning: "工作,操作,作业" }, + { id: 292, word: "delimiter", phonetic: "[di'limitə ]]", type: "n.", meaning: "定界符,分界符" }, + { id: 293, word: "location", phonetic: "[lə uˈ keiʃ ə n]]", type: "n.", meaning: "定位,(存储器)单元" }, + { id: 294, word: "perform", phonetic: "[pə ˈ fɔ :m]]", type: "v.", meaning: "执行,完成" }, + { id: 295, word: "graphic", phonetic: "[ˈ græfik]]", type: "n.", meaning: "& a. 图形;图形的" }, + { id: 296, word: "read", phonetic: "[ri:d]]", type: "v.", meaning: "读,读阅" }, + { id: 297, word: "confirm", phonetic: "[kə nˈ fə :m]]", type: "vt.", meaning: "证实,确认" }, + { id: 298, word: "sort", phonetic: "[sɔ :t]]", type: "v.", meaning: "分类,排序" }, + { id: 299, word: "clause", phonetic: "[klɔ :z]]", type: "n.", meaning: "条款,项目,子句" }, + { id: 300, word: "once", phonetic: "[wʌ ns]]", type: "ad.", meaning: "& n. 只一次,一旦" }, + { id: 301, word: "however", phonetic: "[hauˈ evə ]]", type: "conj.", meaning: "然而,可是" }, + { id: 302, word: "extend", phonetic: "[ikˈ stend]]", type: "v.", meaning: "扩充" }, + { id: 303, word: "look", phonetic: "[luk]]", type: "v.", meaning: "看,查看" }, + { id: 304, word: "starting", phonetic: "['stɑ:tiŋ]]", type: "a.", meaning: "起始的" }, + { id: 305, word: "now", phonetic: "[nau]]", type: "ad.", meaning: "& n. 此刻,现在" }, + { id: 306, word: "original", phonetic: "[ə ˈ ridʒ ə nə l]]", type: "n.", meaning: "& a. 原文;原(初)始的" }, + { id: 307, word: "correspond", phonetic: "[ˌ kɔ riˈ spɔ nd]]", type: "vi.", meaning: "通信(联系)" }, + { id: 308, word: "property", phonetic: "[ˈ prɔ pə ti]]", type: "n.", meaning: "性(质),特征" }, + { id: 309, word: "several", phonetic: "[ˈ sevə rə l]]", type: "a.", meaning: "& n. 若干个,几个" }, + { id: 310, word: "learn", phonetic: "[lə :n]]", type: "v.", meaning: "学习,训练" }, + { id: 311, word: "cause", phonetic: "[kɔ :z]]", type: "n.", meaning: "原因,理由" }, + { id: 312, word: "bracket", phonetic: "[ˈ brækit]]", type: "n.", meaning: "(方)括号,等级" }, + { id: 313, word: "omit", phonetic: "[ə uˈ mit]]", type: "vt.", meaning: "省略,删去,遗漏" }, + { id: 314, word: "running", phonetic: "[ˈ rʌ niŋ]]", type: "a.", meaning: "运行着的,游动的" }, + { id: 316, word: "edge", phonetic: "[edʒ ]]", type: "n.", meaning: "棱,边,边缘,界限" }, + { id: 317, word: "form", phonetic: "[fɔ :m]]", type: "n.", meaning: "格式,表格,方式" }, + { id: 318, word: "instruction", phonetic: "[inˈ strʌ kʃ ə n]]", type: "n.", meaning: "指令,指导" }, + { id: 320, word: "below", phonetic: "[biˈ lə u]]", type: "a.", meaning: "& prep. 下列的;低于" }, + { id: 321, word: "standard", phonetic: "[ˈ stændə d]]", type: "n.", meaning: "标准" }, + { id: 322, word: "occurrence", phonetic: "[ə ˈ kʌ rə ns]]", type: "n.", meaning: "出现,发生" }, + { id: 323, word: "lock", phonetic: "[lɔ k]]", type: "n.", meaning: "& v. 锁,封闭;自动跟踪" }, + { id: 324, word: "append", phonetic: "[ə ˈ pend]]", type: "vt.", meaning: "附加,增补" }, + { id: 325, word: "destination", phonetic: "[ˌ destiˈ neiʃ ə n]]", type: "n.", meaning: "目的地,接收站" }, + { id: 326, word: "password", phonetic: "['pɑ:swə :d]]", type: "n.", meaning: "口令,保密字" }, + { id: 327, word: "point", phonetic: "[pɔ int]]", type: "n.", meaning: "点,小数点,句号" }, + { id: 328, word: "variety", phonetic: "[və ˈ raiə ti]]", type: "n.", meaning: "变化,种类,品种" }, + { id: 329, word: "many", phonetic: "[ˈ meni]]", type: "a.", meaning: "& n. 许多,多数" }, + { id: 330, word: "buffer", phonetic: "[ˈ bʌ fə ]]", type: "n.", meaning: "缓冲器" }, + { id: 331, word: "useful", phonetic: "[ˈ ju:sfə l]]", type: "a.", meaning: "有用的" }, + { id: 332, word: "object", phonetic: "[ˈ ɔ bdʒ iktˌ ə bˈ dʒ ekt]]", type: "n.", meaning: "对象,目标,物体" }, + { id: 333, word: "again", phonetic: "[ə ˈ gein]]", type: "ad.", meaning: "再,又,重新,也" }, + { id: 334, word: "operating", phonetic: "[ˈ ɔ pə reit]]", type: "a.", meaning: "操作的,控制的" }, + { id: 335, word: "carry", phonetic: "[ˈ kæri]]", type: "v.", meaning: "进位,带" }, + { id: 336, word: "update", phonetic: "[ˌ ʌ pˈ deit]]", type: "v.", meaning: "更新,修改,校正" }, + { id: 337, word: "moving", phonetic: "['mu:viŋ]]", type: "n.", meaning: "& a. 活动的,自动的" }, + { id: 338, word: "coprocessor", phonetic: "['kə uˌ prə usesə ]]", type: "n.", meaning: "协同处理器" }, + { id: 339, word: "overlay", phonetic: "['ə uvə 'lei]]", type: "v.", meaning: "覆盖,重叠" }, + { id: 340, word: "practice", phonetic: "[ˈ præktis]]", type: "n.", meaning: "实习,实践" }, + { id: 341, word: "navigation", phonetic: "[ˌ næviˈ geiʃ ə n]]", type: "n.", meaning: "导航" }, + { id: 342, word: "automatically", phonetic: "[ɔ :tə ˈ mætikli]]", type: "ad.", meaning: "自动地,机械地" }, + { id: 343, word: "total", phonetic: "[ˈ tə utl]]", type: "n.", meaning: "& v. 总数;总计" }, + { id: 344, word: "previous", phonetic: "[ˈ pri:viə s]]", type: "a.", meaning: "早先的,上述的" }, + { id: 345, word: "software", phonetic: "[ˈ sɔ ftwɛ ə ]]", type: "n.", meaning: "软件" }, + { id: 346, word: "shortcut", phonetic: "[ˈʃɔ :tkʌ t]]", type: "n.", meaning: "近路,捷径" }, + { id: 347, word: "long", phonetic: "[lɔ ŋ]]", type: "a.", meaning: "长的,远的" }, + { id: 348, word: "unique", phonetic: "[ju:ˈ ni:k]]", type: "a.", meaning: "唯一的,独特的" }, + { id: 349, word: "part", phonetic: "[pɑ:t]]", type: "n.", meaning: "部分,零件" }, + { id: 350, word: "updated", phonetic: "[ˌ ʌ pˈ deit]]", type: "a.", meaning: "适时的,更新的" }, + { id: 351, word: "internal", phonetic: "[inˈ tə :nl]]", type: "a.", meaning: "内部的" }, + { id: 352, word: "fill", phonetic: "[fil]]", type: "v.", meaning: "填充" }, + { id: 353, word: "basic", phonetic: "[ˈ beisik]]", type: "n.", meaning: "& a. 基本;基本的" }, + { id: 354, word: "math", phonetic: "[mæθ]]", type: "n.", meaning: "数学" }, + { id: 355, word: "since", phonetic: "[sins]]", type: "prep.", meaning: "自从…以来" }, + { id: 356, word: "determine", phonetic: "[diˈ tə :min]]", type: "v.", meaning: "确定" }, + { id: 357, word: "making", phonetic: "[ˈ meikiŋ]]", type: "n.", meaning: "制造,构造" }, + { id: 358, word: "center", phonetic: "[ˈ sentə ]]", type: "n.", meaning: "中心,中央" }, + { id: 359, word: "already", phonetic: "[ɔ :lˈ redi]]", type: "ad.", meaning: "已经,早已" }, + { id: 360, word: "keyword", phonetic: "['ki:wə :d]]", type: "n.", meaning: "关键字(词)" }, + { id: 361, word: "action", phonetic: "[ˈ ækʃ ə n]]", type: "n.", meaning: "操作,运算" }, + { id: 362, word: "condition", phonetic: "[kə nˈ diʃ ə n]]", type: "n.", meaning: "条件,情况;vt. 调节" }, + { id: 363, word: "quick", phonetic: "[kwik]]", type: "a.", meaning: "& ad. 快速的,灵敏的" }, + { id: 364, word: "assigned", phonetic: "[ə ˈ sain]]", type: "a.", meaning: "指定的,赋值的" }, + { id: 365, word: "give", phonetic: "[giv]]", type: "vt.", meaning: "给出,赋予,发生" }, + { id: 366, word: "large", phonetic: "[lɑ:dʒ ]]", type: "a.", meaning: "(巨)大的,大量的" }, + { id: 367, word: "chapter", phonetic: "[ˈ tʃ æptə ]]", type: "n.", meaning: "章,段" }, + { id: 368, word: "computer", phonetic: "[kʌ mˈ pju:tə ]]", type: "n.", meaning: "计算机" }, + { id: 369, word: "complete", phonetic: "[kə mˈ pli:t]]", type: "v.", meaning: "& a. 完成;完整的" }, + { id: 370, word: "past", phonetic: "[pɑ:st]]", type: "a.", meaning: "过去的,结束的" }, + { id: 371, word: "match", phonetic: "[mætʃ ]]", type: "v.", meaning: "比较,匹配,符合" }, + { id: 372, word: "recover", phonetic: "[riˈ kʌ və ]]", type: "v.", meaning: "恢复,回收" }, + { id: 373, word: "always", phonetic: "[ˈ ɔ :lweiz]]", type: "ad.", meaning: "总是,一直,始终" }, + { id: 374, word: "require", phonetic: "[riˈ kwaiə ]]", type: "v.", meaning: "需要,要求" }, + { id: 375, word: "opening", phonetic: "[ˈ ə upə niŋ]]", type: "n.", meaning: "打开,断路,孔" }, + { id: 376, word: "network", phonetic: "[ˈ netwə :k]]", type: "n.", meaning: "& vt. 网络;联网" }, + { id: 377, word: "sign", phonetic: "[sain]]", type: "n.", meaning: "符号,信号,记号" }, + { id: 378, word: "release", phonetic: "[riˈ li:s]]", type: "vt.", meaning: "& n. 释放,核发,版" }, + { id: 379, word: "three", phonetic: "[θri:]]", type: "a.", meaning: "& n. 三(的)" }, + { id: 380, word: "recall", phonetic: "[riˈ kɔ (:)l]]", type: "vt.", meaning: "撤消,复活,检索" }, + { id: 381, word: "deletion", phonetic: "[di'li:ʃ ə n]]", type: "n.", meaning: "删去(部分),删除" }, + { id: 382, word: "fixed", phonetic: "[fikst]]", type: "a.", meaning: "固定的,不变的" }, + { id: 383, word: "amount", phonetic: "[ə 'maunt]]", type: "vt.", meaning: "& n. 总计;合计" }, + { id: 384, word: "alias", phonetic: "[ˈ eiliə s]]", type: "n.", meaning: "别名,代号,标记" }, + { id: 385, word: "quote", phonetic: "[kwə ut]]", type: "n.", meaning: "& v. 引号;加引号" }, + { id: 386, word: "correct", phonetic: "[kə ˈ rekt]]", type: "a.", meaning: "& vt. 正确的;改正" }, + { id: 387, word: "else", phonetic: "[els]]", type: "ad.", meaning: "& conj. 否则,此外" }, + { id: 388, word: "maximum", phonetic: "[ˈ mæksimə m]]", type: "n.", meaning: "& a. 最大(的),最高" }, + { id: 389, word: "under", phonetic: "[ˈ ʌ ndə ]]", type: "prep.", meaning: "在…下面(之下)" }, + { id: 390, word: "take", phonetic: "[teik]]", type: "v.", meaning: "取,拿" }, + { id: 391, word: "switching", phonetic: "[switʃ iŋ]]", type: "n.", meaning: "开关,转接,交换" }, + { id: 392, word: "element", phonetic: "[ˈ elimə nt]]", type: "n.", meaning: "元件,元素,码元" }, + { id: 393, word: "modification", phonetic: "[ˌ mɔ difiˈ keiʃ ə n]]", type: "n.", meaning: "改变,修改" }, + { id: 394, word: "modified", phonetic: "['mɔ difaid]]", type: "a.", meaning: "修改的,变更的" }, + { id: 395, word: "input", phonetic: "[ˈ input]]", type: "n.", meaning: "输入,输入设备" }, + { id: 396, word: "uppercase", phonetic: "['ʌ pə ˌ keis]]", type: "n.", meaning: "大写字母" }, + { id: 397, word: "plus", phonetic: "[plʌ s]]", type: "prep.", meaning: "加,加上,外加" }, + { id: 398, word: "found", phonetic: "[faund]]", type: "v.", meaning: "建立,创办" }, + { id: 399, word: "debug", phonetic: "[di:'bʌ g]]", type: "vt.", meaning: "调试" }, + { id: 400, word: "force", phonetic: "[fɔ :s]]", type: "v.", meaning: "& n. 强制;压力,强度" }, + { id: 401, word: "lowercase", phonetic: "['lə uə ˌ keis]]", type: "n.", meaning: "下档,小写体" }, + { id: 402, word: "just", phonetic: "[dʒ ʌ st]]", type: "ad.", meaning: "恰好" }, + { id: 403, word: "undo", phonetic: "[ʌ nˈ du:]]", type: "vt.", meaning: "取消,废除" }, + { id: 404, word: "environ", phonetic: "[in'vaiə rə n]]", type: "vt.", meaning: "围绕,包围" }, + { id: 405, word: "why", phonetic: "[wai]]", type: "ad.", meaning: "为什么" }, + { id: 406, word: "temporary", phonetic: "[ˈ tempə rə ri]]", type: "a.", meaning: "暂时的,临时的" }, + { id: 407, word: "put", phonetic: "[put]]", type: "v.", meaning: "存放(记录),放置" }, + { id: 408, word: "instead", phonetic: "[inˈ sted]]", type: "ad.", meaning: "(来)代替,当作" }, + { id: 409, word: "encounter", phonetic: "[inˈ kauntə ]]", type: "v.", meaning: "& n. 遇到,碰到" }, + { id: 410, word: "across", phonetic: "[ə ˈ krɔ s]]", type: "prep.", meaning: "交叉,越过" }, + { id: 411, word: "matching", phonetic: "['mætʃ iŋ]]", type: "n.", meaning: "匹配,调整" }, + { id: 413, word: "spill", phonetic: "[spil]]", type: "v.", meaning: "漏出,溢出,漏失" }, + { id: 414, word: "level", phonetic: "[ˈ levə l]]", type: "n.", meaning: "水平,级,层次" }, + { id: 415, word: "browse", phonetic: "[brauz]]", type: "v.", meaning: "浏览" }, + { id: 416, word: "speech", phonetic: "[spi:tʃ ]]", type: "n.", meaning: "说话,言语,语音" }, + { id: 417, word: "occur", phonetic: "[ə ˈ kə :]]", type: "vi.", meaning: "发生,出现,存在" }, + { id: 418, word: "memo", phonetic: "[ˈ memə u]]", type: "n.", meaning: "备忘录" }, + { id: 419, word: "prior", phonetic: "[ˈ praiə ]]", type: "a.", meaning: "先验的,优先的" }, + { id: 420, word: "loaded", phonetic: "[lə ud]]", type: "a.", meaning: "有负载的" }, + { id: 421, word: "length", phonetic: "[leŋθ]]", type: "n.", meaning: "(字,记录,块)长度" }, + { id: 422, word: "round", phonetic: "[raund]]", type: "v.", meaning: "舍入,四舍五入" }, + { id: 423, word: "variant", phonetic: "[ˈ veə riə nt]]", type: "n.", meaning: "& a. 变体,易变的" }, + { id: 424, word: "floppy", phonetic: "[ˈ flɔ pi]]", type: "n.", meaning: "软磁盘" }, + { id: 425, word: "machine", phonetic: "[məˈʃ i(:)n]]", type: "n.", meaning: "机器,计算机" }, + { id: 426, word: "square", phonetic: "[skwɛ ə ]]", type: "n.", meaning: "& a. 正方形;方形的" }, + { id: 427, word: "supply", phonetic: "[sə ˈ plai]]", type: "vt.", meaning: "& n. 电源,供给" }, + { id: 428, word: "home", phonetic: "[hə um]]", type: "n.", meaning: "& a. 家,出发点" }, + { id: 429, word: "normal", phonetic: "['nɔ :mə l]]", type: "a.", meaning: "& n. 正常,标准" }, + { id: 430, word: "onto", phonetic: "[ˈ ɔ ntu, -tə ]]", type: "prep.", meaning: "向…,到…上" }, + { id: 431, word: "during", phonetic: "[ˈ djuə riŋ]]", type: "prep.", meaning: "在…期间" }, + { id: 432, word: "module", phonetic: "[ˈ mɔ dju:l]]", type: "n.", meaning: "模块(程序设计)" }, + { id: 433, word: "monochrome", phonetic: "['mɔ nə krə um]]", type: "n.", meaning: "单色" }, + { id: 434, word: "assistance", phonetic: "[ə ˈ sistə ns]]", type: "n.", meaning: "辅助设备,帮助" }, + { id: 435, word: "tell", phonetic: "[tel]]", type: "n.", meaning: "讲,说,教,计算" }, + { id: 436, word: "library", phonetic: "[ˈ laibrə ri]]", type: "n.", meaning: "(程序…)库,图书馆" }, + { id: 437, word: "demonstration", phonetic: "[ˌ demə nˈ streiʃ ə n]]", type: "n.", meaning: "(公开)表演,示范" }, + { id: 438, word: "stack", phonetic: "[stæk]]", type: "n.", meaning: "栈,堆栈,存储栈" }, + { id: 439, word: "even", phonetic: "[ˈ i:və n]]", type: "a.", meaning: "& ad. 偶数的;甚至" }, + { id: 440, word: "evaluate", phonetic: "[iˈ væljueit]]", type: "v.", meaning: "估计,估算,求值" }, + { id: 441, word: "times", phonetic: "[taimz]]", type: "n.", meaning: "次数" }, + { id: 442, word: "previously", phonetic: "['pri:vjə sli]]", type: "ad.", meaning: "以前,预先" }, + { id: 443, word: "directly", phonetic: "[di'rektli]]", type: "ad.", meaning: "直接地,立即" }, + { id: 444, word: "logical", phonetic: "[ˈ lɔ dʒ ikə l]]", type: "a.", meaning: "逻辑的,逻辑“或”" }, + { id: 445, word: "template", phonetic: "['templit]]", type: "n.", meaning: "标准框,样板,模板" }, + { id: 446, word: "calling", phonetic: "['kɔ :liŋ]]", type: "n.", meaning: "呼叫,调用,调入" }, + { id: 447, word: "later", phonetic: "['leitə ]]", type: "a.", meaning: "更后的,后面的" }, + { id: 448, word: "driver", phonetic: "['draivə ]]", type: "n.", meaning: "驱动器,驱动程序" }, + { id: 449, word: "therefore", phonetic: "['ðɛ ə fɔ :]]", type: "ad.", meaning: "& conj. 因此,所以" }, + { id: 450, word: "saving", phonetic: "[ˈ seiviŋ]]", type: "a.", meaning: "保存的" }, + { id: 451, word: "detail", phonetic: "[ˈ di:teil]]", type: "n.", meaning: "元件,零件,细节" }, + { id: 452, word: "linker", phonetic: "['liŋkə ]]", type: "n.", meaning: "连接程序" }, + { id: 453, word: "loop", phonetic: "[lu:p]]", type: "n.", meaning: "圈,环;(程序)循环,回路" }, + { id: 454, word: "process", phonetic: "[ˈ prə uses]]", type: "vt.", meaning: "处理,进程,加工" }, + { id: 455, word: "scheme", phonetic: "[ski:m]]", type: "n.", meaning: "方案,计划,图" }, + { id: 456, word: "every", phonetic: "[ˈ evri]]", type: "a.", meaning: "每个,全体,所有的" }, + { id: 457, word: "refer", phonetic: "[riˈ fə :]]", type: "v.", meaning: "访问,引用,涉及" }, + { id: 458, word: "possible", phonetic: "[ˈ pɔ sə b(ə )l]]", type: "a.", meaning: "可能的,潜在的" }, + { id: 459, word: "above", phonetic: "[ə ˈ bʌ v]]", type: "a.", meaning: "在…之上,大于" }, + { id: 460, word: "overview", phonetic: "[ˈ ə uvə vju:]]", type: "n.", meaning: "综述,概要" }, + { id: 461, word: "result", phonetic: "[riˈ zʌ lt]]", type: "n.", meaning: "结果" }, + { id: 462, word: "syntax", phonetic: "['sintæks]]", type: "n.", meaning: "语法,文法,句法" }, + { id: 463, word: "abbreviation", phonetic: "[ə ˌ bri:viˈ eiʃ ə n]]", type: "n.", meaning: "缩短,省略,简称" }, + { id: 465, word: "hidden", phonetic: "['hidn]]", type: "a.", meaning: "隐藏的,秘密的" }, + { id: 466, word: "null", phonetic: "[nʌ l]]", type: "n.", meaning: "& a. 空(的),零(的)" }, + { id: 467, word: "send", phonetic: "[send]]", type: "v.", meaning: "发送" }, + { id: 468, word: "private", phonetic: "['praivit]]", type: "a.", meaning: "专用的,私人的" }, + { id: 469, word: "hard", phonetic: "[ˈ hɑ:d]]", type: "a.", meaning: "硬的" }, + { id: 470, word: "hardware", phonetic: "[ˈ hɑ:dwɛ ə ]]", type: "n.", meaning: "硬件" }, + { id: 471, word: "say", phonetic: "[sei]]", type: "v.", meaning: "说,显示,假定" }, + { id: 472, word: "equal", phonetic: "['i:kwə l]]", type: "vt.", meaning: "& n. 等于,相等;等号" }, + { id: 473, word: "pack", phonetic: "[pæk]]", type: "n.", meaning: "压缩,包裹" }, + { id: 474, word: "minus", phonetic: "[ˈ mainə s]]", type: "a.", meaning: "& n. 负的;负数,减" }, + { id: 475, word: "alternate", phonetic: "[ɔ :lˈ tə :nit, ˈ ɔ :ltə :neit]]", type: "a.", meaning: "交替的,备用的" }, + { id: 476, word: "collapse", phonetic: "[kə 'læps]]", type: "v.", meaning: "崩溃,破裂" }, + { id: 477, word: "corner", phonetic: "['kɔ :nə ]]", type: "n.", meaning: "角,角落,转换" }, + { id: 478, word: "present", phonetic: "['preznt,pri'zent]]", type: "a.", meaning: "& v. 现行的;提供" }, + { id: 479, word: "interpreter", phonetic: "[inˈ tə :pritə ]]", type: "n.", meaning: "解释程序,翻译机" }, + { id: 480, word: "advance", phonetic: "[ə dˈ vɑ:ns]]", type: "v.", meaning: "& n. 进步,提高;进展" }, + { id: 481, word: "forward", phonetic: "[ˈ fɔ :wə d]]", type: "a.", meaning: "正向的" }, + { id: 482, word: "fast", phonetic: "[fɑ:st]]", type: "a.", meaning: "& ad. 快速的" }, + { id: 483, word: "special", phonetic: "[fɑ:st]]", type: "a.", meaning: "专用的,特殊的" }, + { id: 484, word: "slash", phonetic: "[slæʃ ]]", type: "n.", meaning: "斜线" }, + { id: 485, word: "utility", phonetic: "[ju:ˈ tiliti]]", type: "n.", meaning: "& a. 实用程序;实用性" }, + { id: 486, word: "regardless", phonetic: "[riˈ gɑ:dlə s]]", type: "a.", meaning: "不注意的,不考虑的" }, + { id: 487, word: "disable", phonetic: "[dis'eibl]]", type: "vt.", meaning: "禁止,停用" }, + { id: 488, word: "compatible", phonetic: "[kə mˈ pætə bə l]]", type: "a.", meaning: "可兼容的,可共存的" }, + { id: 489, word: "depend", phonetic: "[diˈ pend]]", type: "vi.", meaning: "随…而定,取决于" }, + { id: 490, word: "empty", phonetic: "[ˈ empti]]", type: "a.", meaning: "空,零,未占用" }, + { id: 491, word: "alphabetical", phonetic: "[ˌ ælfə 'betikə l]]", type: "a.", meaning: "字母(表)的,abc 的" }, + { id: 492, word: "branch", phonetic: "[brɑ:ntʃ ]]", type: "n.", meaning: "分支,支线;v. 转换" }, + { id: 493, word: "resume", phonetic: "[ˈ rezju:mei]]", type: "v.", meaning: "重(新)开(始)" }, + { id: 494, word: "multiple", phonetic: "[ˈ mʌ ltipə l]]", type: "a.", meaning: "多次的,复杂的" }, + { id: 495, word: "monitor", phonetic: "[ˈ mɔ nitə ]]", type: "n.", meaning: "监视器,监督程序" }, + { id: 496, word: "configuration", phonetic: "[kə nˌ figjuˈ reiʃ ə n]]", type: "n.", meaning: "配置" }, + { id: 497, word: "replacement", phonetic: "[riˈ pleismə nt]]", type: "n.", meaning: "替换,置换,更新" }, + { id: 498, word: "required", phonetic: "[ri'kwaiə d]]", type: "a.", meaning: "需要的" }, + { id: 499, word: "macros", phonetic: "['mækrɔ s]]", type: "n.", meaning: "宏命令(指令)" }, + { id: 500, word: "table", phonetic: "['teibl]]", type: "n.", meaning: "表" }, + { id: 501, word: "loss", phonetic: "[lɔ s]]", type: "n.", meaning: "损耗,损失" }, + { id: 502, word: "batch", phonetic: "[bætʃ ]]", type: "n.", meaning: "批,批量,成批" }, + { id: 503, word: "exact", phonetic: "[ig'zækt]]", type: "a.", meaning: "正确的" }, + { id: 504, word: "aboveboard", phonetic: "[ə 'bʌ v'bɔ :d]]", type: "ad.", meaning: "& a. 照直,公开的" }, + { id: 505, word: "activate", phonetic: "[ˈ æktiveit]]", type: "vt.", meaning: "& n. 使激活,驱动" }, + { id: 506, word: "around", phonetic: "[ə ˈ raund]]", type: "ad.", meaning: "& prep. 周围,围绕" }, + { id: 507, word: "slow", phonetic: "[slə u]]", type: "a.", meaning: "& ad. 慢速的" }, + { id: 508, word: "floating", phonetic: "['flə utiŋ]]", type: "a.", meaning: "浮动的,浮点的" }, + { id: 509, word: "refresh", phonetic: "[ri'freʃ ]]", type: "v.", meaning: "刷新,更新,再生" }, + { id: 510, word: "stop", phonetic: "[stɔ p]]", type: "v.", meaning: "停止,停机" }, + { id: 511, word: "pass", phonetic: "[pɑ:s]]", type: "v.", meaning: "传送,传递,遍(数)" }, + { id: 512, word: "public", phonetic: "['pʌ blik]]", type: "a.", meaning: "公用的,公共的" }, + { id: 513, word: "eject", phonetic: "[iˈ dʒ ekt]]", type: "n.", meaning: "弹出" }, + { id: 514, word: "ignore", phonetic: "[igˈ nɔ :]]", type: "vt.", meaning: "不管,忽略不计" }, + { id: 515, word: "share", phonetic: "[ʃɛə ]]", type: "v.", meaning: "共享,共用" }, + { id: 516, word: "sequence", phonetic: "['si:kwə ns]]", type: "n.", meaning: "顺序,时序,序列" }, + { id: 517, word: "consist", phonetic: "[kə n'sist]]", type: "vi.", meaning: "符合,包括" }, + { id: 518, word: "step", phonetic: "[step]]", type: "n.", meaning: "步,步骤,步长,档" }, + { id: 519, word: "double", phonetic: "['dʌ bl]]", type: "a.", meaning: "两倍的,成双的" }, + { id: 520, word: "come", phonetic: "[kʌ m]]", type: "vi.", meaning: "来,到,出现" }, + { id: 521, word: "lower", phonetic: "['lə uə ,'lauə ]]", type: "a.", meaning: "下部的,低级的" }, + { id: 522, word: "describe", phonetic: "[di'skraib]]", type: "vt.", meaning: "描述,沿…运行" }, + { id: 523, word: "count", phonetic: "[kaunt]]", type: "v.", meaning: "计数,计算" }, + { id: 524, word: "pop", phonetic: "[pɔ p]]", type: "v.", meaning: "上托,弹出(栈)" }, + { id: 525, word: "valid", phonetic: "['vælid]]", type: "a.", meaning: "有效的" }, + { id: 526, word: "suspend", phonetic: "[sə s'pend]]", type: "v.", meaning: "中止,暂停,挂起" }, + { id: 527, word: "enhance", phonetic: "[in'hɑ:ns]]", type: "vt.", meaning: "增强,放大,夸张" }, + { id: 528, word: "separate", phonetic: "[ˈ sepə reit]]", type: "v.", meaning: "& a. 分隔,分离,各自的" }, + { id: 529, word: "echo", phonetic: "['ekə u]]", type: "n.", meaning: "回波,反射波" }, + { id: 530, word: "necessary", phonetic: "[ˈ nesisə ri]]", type: "a.", meaning: "必要的,必然的" }, + { id: 532, word: "able", phonetic: "['eibl]]", type: "a.", meaning: "能…的,有能力的" }, + { id: 533, word: "marking", phonetic: "[mɑ:kiŋ]]", type: "n.", meaning: "标记,记号,传号" }, + { id: 534, word: "ask", phonetic: "[ɑ:sk]]", type: "v.", meaning: "请求,需要" }, + { id: 535, word: "term", phonetic: "[tə :m]]", type: "n.", meaning: "项,条款,术语" }, + { id: 536, word: "bring", phonetic: "[briŋ]]", type: "v.", meaning: "引起,产生,拿来" }, + { id: 537, word: "warning", phonetic: "['wɔ :niŋ]]", type: "n.", meaning: "& a. 报警,预告" }, + { id: 538, word: "less", phonetic: "[les]]", type: "a.", meaning: "& ad. 更小,更少" }, + { id: 539, word: "whose", phonetic: "[hu:z]]", type: "pron.", meaning: "谁的" }, + { id: 540, word: "comment", phonetic: "[ˈ kɔ ment]]", type: "n.", meaning: "& vi. 注解,注释" }, + { id: 541, word: "effect", phonetic: "[i'fekt]]", type: "n.", meaning: "效率,作用,效能" }, + { id: 542, word: "expanding", phonetic: "[iks'pændiŋ]]", type: "a.", meaning: "扩展的,扩充的" }, + { id: 543, word: "on-line", phonetic: "['ɔ nˌ lain]]", type: "a.", meaning: "联机的" }, + { id: 544, word: "reorder", phonetic: "[ri:'ɔ :də ]]", type: "v.", meaning: "(按序)排列,排序" }, + { id: 545, word: "direct", phonetic: "[di'rekt]]", type: "a.", meaning: "直接的" }, + { id: 546, word: "enclose", phonetic: "[in'klə uz]]", type: "vt.", meaning: "封闭,密封,围住,包装" }, + { id: 547, word: "reset", phonetic: "['ri:'set]]", type: "vt.", meaning: "复位,置“0”" }, + { id: 548, word: "various", phonetic: "['vɛ ə riə s]]", type: "a.", meaning: "不同的,各种各样的" }, + { id: 549, word: "paper", phonetic: "['peipə ]]", type: "n.", meaning: "纸,文件,论文" }, + { id: 550, word: "prevent", phonetic: "[pri'vent]]", type: "v.", meaning: "防止,预防" }, + { id: 551, word: "side", phonetic: "[said]]", type: "n.", meaning: "(旁)边,面,侧(面)" }, + { id: 552, word: "push", phonetic: "[puʃ ]]", type: "v.", meaning: "推,按,压,进(栈)" }, + { id: 553, word: "programming", phonetic: "['prə ugræmiŋ]]", type: "n.", meaning: "程序设计,编程序" }, + { id: 554, word: "upper", phonetic: "['ʌ pə ]]", type: "a.", meaning: "上的,上部的" }, + { id: 555, word: "row", phonetic: "[rə u,rau]]", type: "n.", meaning: "行" }, + { id: 556, word: "pressed", phonetic: "[prest]]", type: "a.", meaning: "加压的,压缩的" }, + { id: 557, word: "temporarily", phonetic: "['tempə rerili]]", type: "ad.", meaning: "暂时" }, + { id: 558, word: "day", phonetic: "[dei]]", type: "n.", meaning: "日,天,白天,时代" }, + { id: 559, word: "repaint", phonetic: "[ri:'peint]]", type: "vt.", meaning: "重画" }, + { id: 560, word: "redefine", phonetic: "['ri:di'fain]]", type: "vt.", meaning: "重新规定(定义)" }, + { id: 561, word: "relation", phonetic: "[ri'leiʃ ə n]]", type: "n.", meaning: "关系,关系式" }, + { id: 562, word: "dimension", phonetic: "[di'menʃ ə n]]", type: "n.", meaning: "尺寸,维,因次" }, + { id: 563, word: "boundary", phonetic: "['baundə ri]]", type: "n.", meaning: "边界,界限,约束" }, + { id: 564, word: "zoom", phonetic: "[zu:m]]", type: "v.", meaning: "变焦距" }, + { id: 565, word: "initialize", phonetic: "[i'niʃ ə laiz]]", type: "v.", meaning: "初始化" }, + { id: 566, word: "personal", phonetic: "['pə :sə nl]]", type: "a.", meaning: "个人的,自身的" }, + { id: 567, word: "hello", phonetic: "[ˈ hʌ ˈ lə u] int. &]", type: "v.", meaning: "喂!;呼叫" }, + { id: 568, word: "true", phonetic: "[tru:]]", type: "a.", meaning: "& n. 真,实,选中" }, + { id: 569, word: "wish", phonetic: "[wiʃ ]]", type: "v.", meaning: "& n. 祝愿,希望" }, + { id: 570, word: "font", phonetic: "[fɔ nt]]", type: "n.", meaning: "铅字,字形" }, + { id: 571, word: "know", phonetic: "[nə u]]", type: "v.", meaning: "知道,了解,认识" }, + { id: 572, word: "convert", phonetic: "[kə nˈ və :t, ˈ kɔ nvə :t]]", type: "v.", meaning: "转换,变换" }, + { id: 573, word: "global", phonetic: "[ˈ glə ubə l]]", type: "n.", meaning: "全局,全程,全局符" }, + { id: 574, word: "still", phonetic: "[stil]]", type: "a.", meaning: "& n. & v. 静止的;静;平静" }, + { id: 575, word: "installation", phonetic: "[ˌ instə ˈ leiʃ ə n]]", type: "n.", meaning: "安装,装配" }, + { id: 576, word: "invoke", phonetic: "[inˈ və uk]]", type: "vt.", meaning: "调用,请求" }, + { id: 577, word: "interactive", phonetic: "[intə r'æktiv]]", type: "a.", meaning: "交互式,交互的" }, + { id: 578, word: "described", phonetic: "[diˈ skraib]]", type: "a.", meaning: "被看到的,被发现的" }, + { id: 579, word: "century", phonetic: "[ˈ sentʃ ə ri]]", type: "n.", meaning: "世纪" }, + { id: 580, word: "literal", phonetic: "[ˈ litə rə l]]", type: "a.", meaning: "文字的" }, + { id: 581, word: "rather", phonetic: "[ˈ rɑ:ðə ]]", type: "ad.", meaning: "宁可,有点" }, + { id: 582, word: "exclusive", phonetic: "[ikˈ sklu:siv]]", type: "a.", meaning: "排斥,排它性" }, + { id: 583, word: "marker", phonetic: "[mɑ:kə ]]", type: "n.", meaning: "记号,标记,标志" }, + { id: 584, word: "wait", phonetic: "[weit]]", type: "v.", meaning: "等待" }, + { id: 585, word: "appropriate", phonetic: "[ ə ˈ pr ə upri-it, ə ˈ pr əuprieit]]", type: "a.", meaning: "适当的,合适的" }, + { id: 586, word: "fit", phonetic: "[fit]]", type: "v.", meaning: "& n. 适合,装配;非特" }, + { id: 587, word: "adapter", phonetic: "[ə 'dæptə ]]", type: "n.", meaning: "适配器,转换器" }, + { id: 588, word: "filter", phonetic: "[ˈ filtə ]]", type: "n.", meaning: "滤波器,滤光材料" }, + { id: 589, word: "break", phonetic: "[breik]]", type: "v.", meaning: "断开,撕开,中断" }, + { id: 590, word: "backward", phonetic: "['bækwə d]]", type: "ad.", meaning: "向后,逆,倒" }, + { id: 591, word: "searching", phonetic: "[sə :tʃ ]]", type: "n.", meaning: "搜索" }, + { id: 592, word: "receive", phonetic: "[riˈ si:v]]", type: "v.", meaning: "接收" }, + { id: 593, word: "dual", phonetic: "['dju:ə l]]", type: "a.", meaning: "对偶的,双的" }, + { id: 594, word: "retry", phonetic: "[ri:'trai]]", type: "vt.", meaning: "再试,复算" }, + { id: 595, word: "normally", phonetic: "['nɔ :mə li]]", type: "ad.", meaning: "正常地,通常" }, + { id: 596, word: "exactly", phonetic: "[igˈ zæktli]]", type: "ad.", meaning: "正好,完全,精确地" }, + { id: 597, word: "immediately", phonetic: "[iˈ mi:diə tli]]", type: "ad.", meaning: "直接地" }, + { id: 598, word: "separated", phonetic: "['sepə reitid]]", type: "a.", meaning: "分开的" }, + { id: 599, word: "high", phonetic: "[hai]]", type: "a.", meaning: "高" }, + { id: 600, word: "equivalent", phonetic: "[i'kwivə lə nt]]", type: "a.", meaning: "相等的,等效的" }, + { id: 601, word: "light", phonetic: "[lait]]", type: "n.", meaning: "& a. 光(波,源);轻的" }, + { id: 602, word: "zero", phonetic: "['ziə rə u]]", type: "n.", meaning: "零,零位,零点" }, + { id: 603, word: "storage", phonetic: "['stɔ :ridʒ ]]", type: "n.", meaning: "存储,存储器" }, + { id: 604, word: "width", phonetic: "[widθ]]", type: "n.", meaning: "宽度" }, + { id: 605, word: "language", phonetic: "[ˈ læŋgwidʒ ]]", type: "n.", meaning: "语言" }, + { id: 606, word: "startup", phonetic: "['stɑ:tʌ p]]", type: "n.", meaning: "启动" }, + { id: 607, word: "much", phonetic: "[mʌ tʃ ]]", type: "a.", meaning: "& n. 很多,许多,大量" }, + { id: 608, word: "per", phonetic: "[pə ]]", type: "prep.", meaning: "每,按" }, + { id: 609, word: "over", phonetic: "[ˈ ə uvə ]]", type: "prep.", meaning: "在…上方" }, + { id: 610, word: "mirror", phonetic: "[ˈ mirə ]]", type: "n.", meaning: "& v. 镜,反射,反映" }, + { id: 611, word: "request", phonetic: "[ri'kwest]]", type: "n.", meaning: "& vt. 请求" }, + { id: 612, word: "keypad", phonetic: "['ki:ˌ pæd]]", type: "n.", meaning: "小键盘" }, + { id: 613, word: "keep", phonetic: "[ki:p]]", type: "v.", meaning: "保持,保存" }, + { id: 614, word: "resident", phonetic: "[ˈ rezidə nt]]", type: "a.", meaning: "驻留的" }, + { id: 615, word: "learning", phonetic: "[ˈ lə :niŋ]]", type: "n.", meaning: "学问,知识" }, + { id: 616, word: "talk", phonetic: "[tɔ :k]]", type: "v.", meaning: "通话,谈话" }, + { id: 617, word: "summary", phonetic: "[ˈ sʌ mə ri]]", type: "n.", meaning: "摘要,汇总,提要" }, + { id: 618, word: "well", phonetic: "[wel]]", type: "n.", meaning: "& a. 井;好,良好" }, + { id: 619, word: "link", phonetic: "[liŋk]]", type: "n.", meaning: "& v. 链接;连接,联络" }, + { id: 621, word: "identify", phonetic: "[ai'dentifai]]", type: "v.", meaning: "识别,辨认" }, + { id: 622, word: "designated", phonetic: "[ˈ dezignit, -neit]]", type: "a.", meaning: "指定的,特指的" }, + { id: 623, word: "pertain", phonetic: "[pə ˈ tein]]", type: "vi.", meaning: "附属,属于,关于" }, + { id: 624, word: "expansion", phonetic: "[ikˈ spænʃ ə n]]", type: "n.", meaning: "展开,展开式" }, + { id: 625, word: "incompatible", phonetic: "[ˌ inkə mˈ pætə bə l]]", type: "a.", meaning: "不兼容的" }, + { id: 626, word: "blinking", phonetic: "[bliŋk]]", type: "n.", meaning: "闪烁" }, + { id: 627, word: "month", phonetic: "[mʌ nθ]]", type: "n.", meaning: "月份" }, + { id: 628, word: "precede", phonetic: "[priˈ si:d]]", type: "v.", meaning: "先于" }, + { id: 629, word: "readily", phonetic: "['redili]]", type: "ad.", meaning: "容易地,不勉强" }, + { id: 630, word: "transportable", phonetic: "[træns'pɔ :tə bl]]", type: "a.", meaning: "可移动的" }, + { id: 631, word: "appropriately", phonetic: "[ə 'prə upriˌ eitli]]", type: "ad.", meaning: "适当地" }, + { id: 632, word: "routine", phonetic: "[ru:'ti:n]]", type: "n.", meaning: "程序,例行程序" }, + { id: 633, word: "ready", phonetic: "[ˈ redi]]", type: "a.", meaning: "就绪,准备好的" }, + { id: 634, word: "listing", phonetic: "['listiŋ]]", type: "n.", meaning: "列表,编目" }, + { id: 635, word: "newly", phonetic: "['nju:li]]", type: "ad.", meaning: "新近,重新" }, + { id: 636, word: "year", phonetic: "[jiə ]]", type: "n.", meaning: "(一)年,年度,年龄" }, + { id: 637, word: "contact", phonetic: "[ˈ kɔ ntækt]]", type: "n.", meaning: "接触,触点" }, + { id: 638, word: "session", phonetic: "[ˈ seʃ ə n]]", type: "n.", meaning: "对话,通话" }, + { id: 639, word: "own", phonetic: "[ə un]]", type: "a.", meaning: "& v. 自己的;拥有" }, + { id: 640, word: "redraw", phonetic: "[ri:'drɔ :]]", type: "vt.", meaning: "再拉" }, + { id: 641, word: "here", phonetic: "[hiə ]]", type: "ad.", meaning: "在这里" }, + { id: 642, word: "manual", phonetic: "['mænjuə l]]", type: "a.", meaning: "手工的,手动的" }, + { id: 643, word: "particular", phonetic: "[pə 'tikjulə ]]", type: "a.", meaning: "特定的,特别的" }, + { id: 644, word: "rectangle", phonetic: "['rektæŋgl]]", type: "n.", meaning: "矩形" }, + { id: 645, word: "additive", phonetic: "['æditiv]]", type: "a.", meaning: "& n. 相加的;附加物" }, + { id: 646, word: "similar", phonetic: "['similə ]]", type: "a.", meaning: "相似的" }, + { id: 647, word: "assembly", phonetic: "[ə 'sembli]]", type: "n.", meaning: "汇编,安装,装配" }, + { id: 648, word: "copyright", phonetic: "['kɔ pirait]]", type: "n.", meaning: "版权" }, + { id: 649, word: "description", phonetic: "[di'skripʃ ə n]]", type: "n.", meaning: "描述" }, + { id: 650, word: "retrieve", phonetic: "[ri'tri:v]]", type: "v.", meaning: "检索" }, + { id: 651, word: "mistake", phonetic: "[mi'steik]]", type: "n.", meaning: "错误" }, + { id: 652, word: "produce", phonetic: "[prə 'dju:s]]", type: "v.", meaning: "生产,制造" }, + { id: 654, word: "exception", phonetic: "[ik'sepʃ ə n]]", type: "n.", meaning: "例外,异常,异议" }, + { id: 655, word: "digit", phonetic: "['didʒ it]]", type: "n.", meaning: "数字,位数,位" }, + { id: 656, word: "reverse", phonetic: "[ri'və :s]]", type: "v.", meaning: "& a. 反向的,逆" }, + { id: 657, word: "minimum", phonetic: "['minimə m]]", type: "n.", meaning: "& a. 最小(的),最低" }, + { id: 658, word: "enough", phonetic: "[iˈ nʌ f]]", type: "a.", meaning: "& ad. 足够的,充足的" }, + { id: 659, word: "although", phonetic: "[ɔ :l'ðə u]]", type: "conj.", meaning: "虽然,即使" }, + { id: 661, word: "third", phonetic: "[θə :d]]", type: "a.", meaning: "& n. 第三,三分之一" }, + { id: 662, word: "red", phonetic: "[red]]", type: "a.", meaning: "& n. 红色(的)" }, + { id: 663, word: "along", phonetic: "[ə 'lɔ ŋ]]", type: "prep.", meaning: "& ad. 沿着" }, + { id: 664, word: "test", phonetic: "[test]]", type: "n.", meaning: "& v. 测试" }, + { id: 665, word: "small", phonetic: "[smɔ :l]]", type: "a.", meaning: "小的,小型的" }, + { id: 666, word: "feed", phonetic: "[fi:d]]", type: "v.", meaning: "馈给,(打印机)进纸" }, + { id: 667, word: "company", phonetic: "[ˈ kʌ mpə ni]]", type: "n.", meaning: "& v. 公司;交际,交往" }, + { id: 668, word: "movie", phonetic: "['mu:vi]]", type: "n.", meaning: "影片,电影(院)" }, + { id: 669, word: "compile", phonetic: "[kə m'pail]]", type: "vt.", meaning: "编译" }, + { id: 670, word: "frequently", phonetic: "[ˈ fri:kwə ntli]]", type: "ad.", meaning: "常常,频繁地" }, + { id: 671, word: "undefined", phonetic: "[ˌ ʌ ndi'faind]]", type: "a.", meaning: "未定义的" }, + { id: 672, word: "state", phonetic: "[steit]]", type: "n.", meaning: "& vt. 状态;确定" }, + { id: 674, word: "accept", phonetic: "[ə kˈ sept]]", type: "vt.", meaning: "接受,认可,同意" }, + { id: 675, word: "intense", phonetic: "[inˈ tens]]", type: "a.", meaning: "强烈的,高度的" }, + { id: 676, word: "documentation", phonetic: "[ ˌ d ɔ kjumen'tei ʃ ən]]", type: "n.", meaning: "文件编制,文本" }, + { id: 677, word: "asterisk", phonetic: "[ˈ æstə risk]]", type: "n.", meaning: "星号(*)" }, + { id: 678, word: "easily", phonetic: "[ˈ i:zili]]", type: "ad.", meaning: "容易地,轻易地" }, + { id: 679, word: "become", phonetic: "[biˈ kʌ m]]", type: "v.", meaning: "成为,变成,适宜" }, + { id: 680, word: "address", phonetic: "[ə ˈ dres]]", type: "vt.", meaning: "& n. 寻址;地址" }, + { id: 681, word: "interface", phonetic: "['intə feis]]", type: "n.", meaning: "接口" }, + { id: 682, word: "pause", phonetic: "[pɔ :z]]", type: "vi.", meaning: "暂停" }, + { id: 683, word: "repeat", phonetic: "[riˈ pi:t]]", type: "v.", meaning: "重复" }, + { id: 684, word: "restart", phonetic: "[ˌ ri:'stɑ:rt]]", type: "v.", meaning: "重新启动,再启动" }, + { id: 685, word: "assumed", phonetic: "[ə 'sju:md,ə 'su:md]]", type: "a.", meaning: "假定的" }, + { id: 686, word: "speed", phonetic: "[spi:d]]", type: "n.", meaning: "速度" }, + { id: 687, word: "entry", phonetic: "[ˈ entri]]", type: "n.", meaning: "输入,项(目),入口" }, + { id: 688, word: "combine", phonetic: "[kə mˈ bain]]", type: "v.", meaning: "组合,联合" }, + { id: 689, word: "organize", phonetic: "[ˈ ɔ :gə naiz]]", type: "v.", meaning: "组织,创办,成立" }, + { id: 690, word: "finished", phonetic: "['finiʃ t]]", type: "a.", meaning: "完成的" }, + { id: 691, word: "mixed", phonetic: "[mikst]]", type: "a.", meaning: "混合的" }, + { id: 692, word: "permit", phonetic: "['pə :mit,pə 'mit]]", type: "v.", meaning: "许可,容许" }, + { id: 693, word: "formatting", phonetic: "['fɔ :mætiŋ]]", type: "n.", meaning: "格式化" }, + { id: 694, word: "root", phonetic: "[ru:t]]", type: "n.", meaning: "根" }, + { id: 695, word: "symbol", phonetic: "[ˈ simbə l]]", type: "n.", meaning: "符号,记号" }, + { id: 696, word: "binary", phonetic: "['bainə ri]]", type: "n.", meaning: "& a. 二进制;双态的" }, + { id: 697, word: "whenever", phonetic: "[wenˈ evə ]]", type: "ad.", meaning: "& conj. 随时" }, + { id: 698, word: "reach", phonetic: "[ri:tʃ ]]", type: "v.", meaning: "& n. 范围,达到范围" }, + { id: 699, word: "caution", phonetic: "[ˈ kɔ :ʃ ə n]]", type: "n.", meaning: "& v. 警告,注意" }, + { id: 700, word: "subtotal", phonetic: "[sʌ b'tə utl]]", type: "n.", meaning: "& v. 小计,求部分和" }, + { id: 701, word: "card", phonetic: "[kɑ:d]]", type: "n.", meaning: "卡片,插件(板)" }, + { id: 702, word: "general", phonetic: "[ˈ dʒ enə rə l]]", type: "a.", meaning: "通用的" }, + { id: 703, word: "associated", phonetic: "[ə 'sə uʃ iˌ eitid]]", type: "a.", meaning: "联合的,相联的" }, + { id: 704, word: "transfer", phonetic: "[træns'fə :]]", type: "v.", meaning: "传送,转换,转移" }, + { id: 705, word: "connect", phonetic: "[kə nˈ nekt]]", type: "v.", meaning: "连接" }, + { id: 706, word: "partition", phonetic: "[kə nˈ nekt]]", type: "v.", meaning: "划分,分区,部分" }, + { id: 707, word: "hexadecimal", phonetic: "['heksə ˌ desimə l]]", type: "a.", meaning: "十六进制的" }, + { id: 708, word: "generate", phonetic: "[ˈ dʒ enə reit]]", type: "vt.", meaning: "产生,发生,生成" }, + { id: 709, word: "specification", phonetic: "[ˌ spesifiˈ keiʃ ə n]]", type: "n.", meaning: "说明书,规则说明书" }, + { id: 710, word: "customize", phonetic: "['kʌ stə maiz]]", type: "vt.", meaning: "定制,定做" }, + { id: 711, word: "far", phonetic: "[fɑ:]]", type: "a.", meaning: "远的,遥远的" }, + { id: 712, word: "nest", phonetic: "[nest]]", type: "v.", meaning: "嵌套,后进先出" }, + { id: 713, word: "duplicate", phonetic: "[ˈ dju:plikit]]", type: "vt.", meaning: "复制,转录,加倍" }, + { id: 714, word: "compression", phonetic: "[kə m'preʃ ə n]]", type: "n.", meaning: "压缩,浓缩" }, + { id: 715, word: "unable", phonetic: "[ʌ nˈ eibə l]]", type: "a.", meaning: "不能的" }, + { id: 716, word: "means", phonetic: "[mi:nz]]", type: "n.", meaning: "方法,手段" }, + { id: 717, word: "alternately", phonetic: "[ɔ :lˈ tə :nitli]]", type: "ad.", meaning: "交替地,轮流地" }, + { id: 718, word: "intensity", phonetic: "[inˈ tensiti]]", type: "n.", meaning: "强度,亮度" }, + { id: 719, word: "reading", phonetic: "[ˈ ri:diŋ]]", type: "n.", meaning: "读,读数" }, + { id: 720, word: "let", phonetic: "[let]]", type: "v.", meaning: "让,允许" }, + { id: 721, word: "explicitly", phonetic: "[ik'splisitli]]", type: "ad.", meaning: "明显地,显然地" }, + { id: 722, word: "compare", phonetic: "[kə m'pɛ ə ]]", type: "v.", meaning: "比较,对照,比喻" }, + { id: 723, word: "sector", phonetic: "[ˈ sektə ]]", type: "n.", meaning: "& v. 扇区,段;分段" }, + { id: 724, word: "problem", phonetic: "[ˈ prɔ blə m]]", type: "n.", meaning: "问题,难题" }, + { id: 725, word: "vertically", phonetic: "['və :tikə li]]", type: "ad.", meaning: "竖直地,直立地" }, + { id: 726, word: "horizontally", phonetic: "[ˌ hɔ ri'zɔ ntli]]", type: "ad.", meaning: "水平地" }, + { id: 727, word: "backspace", phonetic: "['bækˌ speis]]", type: "v.", meaning: "退格,回退" }, + { id: 728, word: "terminate", phonetic: "[ˈ tə :mineit]]", type: "v.", meaning: "端接,终止" }, + { id: 729, word: "people", phonetic: "[ˈ pi:pl]]", type: "n.", meaning: "人们" }, + { id: 730, word: "short", phonetic: "[ʃ ɔ :t]]", type: "a.", meaning: "& n. 短的;短路" }, + { id: 731, word: "drag", phonetic: "[dræg]]", type: "vt.", meaning: "拖,拉,牵,曳" }, + { id: 732, word: "formatted", phonetic: "[fɔ :rmæt]]", type: "a.", meaning: "有格式的" }, + { id: 733, word: "preview", phonetic: "['pri:vju:]]", type: "n.", meaning: "& vt. 预映" }, + { id: 734, word: "underscore", phonetic: "['ʌ ndə 'skɔ :]]", type: "vt.", meaning: "在…下面划线" }, + { id: 735, word: "correctly", phonetic: "[kə 'rektli]]", type: "ad.", meaning: "正确地" }, + { id: 736, word: "initially", phonetic: "[i'niʃ ə li]]", type: "ad.", meaning: "最初,开头" }, + { id: 737, word: "reformat", phonetic: "[ˌ ri'fɔ mæt]]", type: "v.", meaning: "重定格式" }, + { id: 738, word: "inside", phonetic: "[inˈ said]]", type: "n.", meaning: "& a. 内部,内容;内部的" }, + { id: 739, word: "integrate", phonetic: "[ˈ intigreit]]", type: "v.", meaning: "综合,集成" }, + { id: 740, word: "controlled", phonetic: "[kə nˈ trə ul]]", type: "a.", meaning: "受控制的,受操纵的" }, + { id: 741, word: "period", phonetic: "[ˈ piə riə d]]", type: "n.", meaning: "周期" }, + { id: 742, word: "huge", phonetic: "[hju:dʒ ]]", type: "a.", meaning: "巨大的,非常的" }, + { id: 743, word: "determined", phonetic: "[di'tə :mind]]", type: "a.", meaning: "坚决的,毅然的" }, + { id: 744, word: "trailing", phonetic: "['treiliŋ]]", type: "n.", meaning: "& a. 结尾;尾随的" }, + { id: 745, word: "seek", phonetic: "[si:k]]", type: "v.", meaning: "查找,寻找,探求" }, + { id: 746, word: "introduction", phonetic: "[ˌ intrə 'dʌ kʃ ə n]]", type: "n.", meaning: "入门,介绍,引进" }, + { id: 747, word: "indent", phonetic: "['indent,in'dent]]", type: "v.", meaning: "缩排" }, + { id: 748, word: "base", phonetic: "[ˈ beisis]]", type: "n.", meaning: "基,底,基地址" }, + { id: 749, word: "integer", phonetic: "['intidʒ ə ]]", type: "n.", meaning: "整数" }, + { id: 750, word: "attempt", phonetic: "[ə ˈ tempt]]", type: "vt.", meaning: "& n. 尝试,试验" }, + { id: 751, word: "twice", phonetic: "[twais]]", type: "n.", meaning: "& ad. 两次,两倍于" }, + { id: 752, word: "formed", phonetic: "[fɔ :m]]", type: "a.", meaning: "& n. 成形" }, + { id: 753, word: "subscript", phonetic: "['sʌ bskript]]", type: "n.", meaning: "注脚,下标" }, + { id: 754, word: "tiny", phonetic: "[ˈ taini]]", type: "a.", meaning: "微小的,微量的" }, + { id: 755, word: "model", phonetic: "[ˈ mɔ dl]]", type: "n.", meaning: "模型,样机,型号" }, + { id: 756, word: "correction", phonetic: "[kə 'rekʃ ə n]]", type: "n.", meaning: "校正,修正" }, + { id: 757, word: "rating", phonetic: "[ˈ reitiŋ]]", type: "n.", meaning: "定额,标称值" }, + { id: 758, word: "secondary", phonetic: "['sekə nderi]]", type: "a.", meaning: "辅助的,第二的" }, + { id: 760, word: "limit", phonetic: "['limit]]", type: "n.", meaning: "极限,限界" }, + { id: 761, word: "sun", phonetic: "[sʌ n]]", type: "n.", meaning: "太阳,日" }, + { id: 762, word: "translate", phonetic: "[træns'leit]]", type: "v.", meaning: "翻译,转换,平移" }, + { id: 763, word: "reason", phonetic: "['ri:zn]]", type: "n.", meaning: "原因,理由" }, + { id: 764, word: "colon", phonetic: "['kə ulə n]]", type: "n.", meaning: "冒号“:”" }, + { id: 765, word: "avoid", phonetic: "[ə 'vɔ id]]", type: "vt.", meaning: "避免,取消,无效" }, + { id: 766, word: "range", phonetic: "[reindʒ ]]", type: "n.", meaning: "范围,域,区域" }, + { id: 767, word: "allocate", phonetic: "['ælə keit]]", type: "vt.", meaning: "分配" }, + { id: 769, word: "simply", phonetic: "['simpli]]", type: "ad.", meaning: "简单地,单纯地" }, + { id: 770, word: "verify", phonetic: "['verifai]]", type: "vt.", meaning: "鉴定,检验,核对" }, + { id: 771, word: "manner", phonetic: "['mænə ]]", type: "n.", meaning: "方法,样式,惯例" }, + { id: 772, word: "direction", phonetic: "[di'rekʃ ə n]]", type: "n.", meaning: "方向,定向,指向" }, + { id: 773, word: "portion", phonetic: "['pɔ :ʃ ə n]]", type: "n.", meaning: "& vt. 部分;分配" }, + { id: 774, word: "emulator", phonetic: "['emjuleitə ]]", type: "n.", meaning: "仿真器,仿真程序" }, + { id: 775, word: "successful", phonetic: "[sə k'sesfə l]]", type: "a.", meaning: "成功的" }, + { id: 776, word: "applied", phonetic: "[ə 'plaid]]", type: "a.", meaning: "适用的,外加的" }, + { id: 777, word: "sum", phonetic: "[sʌ m]]", type: "n.", meaning: "和,合计,总额" }, + { id: 778, word: "achieve", phonetic: "[ə 'tʃ i:v]]", type: "vt.", meaning: "完成,实现" }, + { id: 779, word: "together", phonetic: "[tə 'geðə ]]", type: "ad.", meaning: "一同,共同,相互" }, + { id: 780, word: "affect", phonetic: "[ə ˈ fekt]]", type: "vt.", meaning: "影响,改变,感动" }, + { id: 781, word: "delay", phonetic: "[di'lei]]", type: "v.", meaning: "延迟" }, + { id: 782, word: "free", phonetic: "[fri:]]", type: "a.", meaning: "自由的,空闲的" }, + { id: 783, word: "properly", phonetic: "['prɔ pə li]]", type: "ad.", meaning: "真正地,适当地" }, + { id: 784, word: "kind", phonetic: "[kaind]]", type: "n.", meaning: "种类,属,级,等" }, + { id: 785, word: "splitting", phonetic: "['splitiŋ]]", type: "n.", meaning: "分区(裂)" }, + { id: 786, word: "feature", phonetic: "[fi:tʃ ə ]]", type: "n.", meaning: "特征,特点" }, + { id: 787, word: "console", phonetic: "['kɔ nsə ul,kə n'sə ul]]", type: "n.", meaning: "控制台,操作台" }, + { id: 788, word: "operate", phonetic: "['ɔ pə reit]]", type: "v.", meaning: "操作,运算" }, + { id: 789, word: "kernel", phonetic: "['kə :nl]]", type: "n.", meaning: "内核(核心)程序" }, + { id: 790, word: "easy", phonetic: "['i:zi]]", type: "a.", meaning: "& ad. 容易的;容易地" }, + { id: 791, word: "modifier", phonetic: "['mɔ difaiə ]]", type: "n.", meaning: "修改量,变址数" }, + { id: 792, word: "invalid", phonetic: "['invə li:d]]", type: "a.", meaning: "无效的" }, + { id: 793, word: "compiler", phonetic: "[kə m'pailə ]]", type: "n.", meaning: "编译程序(器)" }, + { id: 794, word: "dot", phonetic: "[dɔ t]]", type: "n.", meaning: "点" }, + { id: 795, word: "beep", phonetic: "[bi:p]]", type: "n.", meaning: "蜂鸣声,嘀嘀声" }, + { id: 796, word: "face", phonetic: "[feis]]", type: "n.", meaning: "面,表面" }, + { id: 797, word: "random", phonetic: "['rændə m]]", type: "a.", meaning: "随机的" }, + { id: 798, word: "facility", phonetic: "[fə 'siliti]]", type: "n.", meaning: "设施,装备,便利" }, + { id: 799, word: "heading", phonetic: "[ˈ hediŋ]]", type: "n.", meaning: "标题" }, + { id: 800, word: "asynchronous", phonetic: "[ei'siŋkrə nə s]]", type: "a.", meaning: "异步的,非同步的" }, + { id: 801, word: "series", phonetic: "['siə ri:z]]", type: "n.", meaning: "序列,系列,串联" }, + { id: 802, word: "individual", phonetic: "[ˌ indi'vidjuə l]]", type: "a.", meaning: "个别的,单个的" }, + { id: 803, word: "explain", phonetic: "[iks'plein]]", type: "v.", meaning: "阐明,解释" }, + { id: 804, word: "paste", phonetic: "[peist]]", type: "n.", meaning: "湖,胶,膏" }, + { id: 805, word: "welcome", phonetic: "['welkə m]]", type: "vt.", meaning: "& n. 欢迎" }, + { id: 806, word: "six", phonetic: "[siks]]", type: "n.", meaning: "& a. 六(个)(的)" }, + { id: 807, word: "early", phonetic: "['ə :li]]", type: "a.", meaning: "& ad. 早期,初期" }, + { id: 808, word: "wrap", phonetic: "[ræp]]", type: "v.", meaning: "& n. 包装,缠绕" }, + { id: 809, word: "blue", phonetic: "[blu:]]", type: "a.", meaning: "& n. 蓝(色),青色" }, + { id: 810, word: "queue", phonetic: "[kju:]]", type: "v.", meaning: "& n. 排队,队列" }, + { id: 811, word: "interrupt", phonetic: "[ˌ intə ˈ rʌ pt]]", type: "v.", meaning: "& n. 中断" }, + { id: 812, word: "respect", phonetic: "[riˈ spekt]]", type: "n.", meaning: "& vt. 遵守,关系" }, + { id: 813, word: "converted", phonetic: "[kə n'və :tid]]", type: "a.", meaning: "转换的,变换的" }, + { id: 814, word: "common", phonetic: "['kɔ mə n]]", type: "a.", meaning: "公用的" }, + { id: 815, word: "hyphen", phonetic: "['haifə n]]", type: "n.", meaning: "连字符,短线" }, + { id: 816, word: "serial", phonetic: "['siə riə l]]", type: "a.", meaning: "串行的,串联的" }, + { id: 817, word: "loading", phonetic: "['lə udiŋ]]", type: "n.", meaning: "装入,加载,存放" }, + { id: 818, word: "retain", phonetic: "[ri'tein]]", type: "vt.", meaning: "保持,维持" }, + { id: 819, word: "setup", phonetic: "['setʌ p]]", type: "n.", meaning: "安排,准备,配置" }, + { id: 820, word: "freeze", phonetic: "[fri:z]]", type: "v.", meaning: "冻结,结冰" }, + { id: 821, word: "intend", phonetic: "[in'tend]]", type: "vt.", meaning: "打算,设计" }, + { id: 822, word: "explanation", phonetic: "[ˌ eksplə 'neiʃ ə n]]", type: "n.", meaning: "说明,注解,注释" }, + { id: 823, word: "certain", phonetic: "['sə :tn]]", type: "a.", meaning: "确实的,确定的" }, + { id: 824, word: "zap", phonetic: "[zæp]]", type: "v.", meaning: "迅速离去,击溃" }, + { id: 825, word: "archive", phonetic: "['ɑ:kaiv]]", type: "vt.", meaning: "归档" }, + { id: 826, word: "negative", phonetic: "[ˈ negə tiv]]", type: "a.", meaning: "负的,否定的" }, + { id: 827, word: "image", phonetic: "['imidʒ ]]", type: "n.", meaning: "图像,影像,映像" }, + { id: 828, word: "platform", phonetic: "['plætfɔ :m]]", type: "n.", meaning: "平台,台架" }, + { id: 829, word: "often", phonetic: "['ɔ :fə n]]", type: "ad.", meaning: "经常,往往,屡次" }, + { id: 830, word: "signal", phonetic: "[ˈ signə l]]", type: "n.", meaning: "& v. 信号;发信号" }, + { id: 832, word: "bit", phonetic: "[bait]]", type: "n.", meaning: "比特;(二进制)位" }, + { id: 833, word: "fully", phonetic: "['fuli]]", type: "ad.", meaning: "十分,完全" }, + { id: 834, word: "deactivate", phonetic: "[di:'æktiveit]]", type: "vt.", meaning: "释放,去活化" }, + { id: 835, word: "especially", phonetic: "[is'peʃ ə li]]", type: "ad.", meaning: "特别(是),尤其" }, + { id: 836, word: "usually", phonetic: "['ju:ʒ uə li]]", type: "ad.", meaning: "通常,平常,一般" }, + { id: 837, word: "recommend", phonetic: "[ˌ rekə 'mend]]", type: "vt.", meaning: "推荐,建议" }, + { id: 838, word: "maintain", phonetic: "[mein'tein]]", type: "vt.", meaning: "维护,保养,保留" }, + { id: 839, word: "important", phonetic: "[im'pɔ :tə nt]]", type: "a.", meaning: "严重的,显著的" }, + { id: 840, word: "central", phonetic: "[ˈ sentrə l]]", type: "a.", meaning: "中央的,中心的" }, + { id: 841, word: "addition", phonetic: "[ə 'diʃ ə n]]", type: "n.", meaning: "加法,增加" }, + { id: 842, word: "anytime", phonetic: "[ˈ enitaim]]", type: "ad.", meaning: "在任何时候" }, + { id: 843, word: "analyst", phonetic: "[ˈ ænə list]]", type: "n.", meaning: "分析员" }, + { id: 844, word: "false", phonetic: "[fɔ :ls]]", type: "a.", meaning: "假(布尔值),错误" }, + { id: 845, word: "black", phonetic: "[blæk]]", type: "a.", meaning: "& n. 黑色的,黑色" }, + { id: 846, word: "gather", phonetic: "[ˈ gæðə ]]", type: "n.", meaning: "聚集,集合" }, + { id: 847, word: "cycle", phonetic: "[ˈ saikə l]]", type: "n.", meaning: "& v. 周,周期;循环" }, + { id: 848, word: "relative", phonetic: "[ˈ relə tiv]]", type: "a.", meaning: "相对的" }, + { id: 849, word: "offer", phonetic: "[ˈ ɔ fə ]]", type: "v.", meaning: "提供,给予,呈现" }, + { id: 850, word: "ending", phonetic: "[ˈ endiŋ]]", type: "n.", meaning: "结束" }, + { id: 851, word: "rent", phonetic: "[rent]]", type: "v.", meaning: "& n. 租用;裂缝" }, + { id: 852, word: "sentence", phonetic: "[ˈ sentə ns]]", type: "n.", meaning: "句(子)" }, + { id: 853, word: "remember", phonetic: "[riˈ membə ]]", type: "v.", meaning: "存储,记忆,记住" }, + { id: 854, word: "proper", phonetic: "[ˈ prɔ pə ]]", type: "a.", meaning: "真的,固有的" }, + { id: 855, word: "design", phonetic: "[diˈ zain]]", type: "v.", meaning: "设计" }, + { id: 856, word: "examine", phonetic: "[igˈ zæmin]]", type: "v.", meaning: "检验,考试,审查" }, + { id: 857, word: "initial", phonetic: "[iˈ niʃ ə l]]", type: "a.", meaning: "最初的,初始的" }, + { id: 858, word: "corrupt", phonetic: "[kə 'rʌ pt]]", type: "v.", meaning: "& a. 恶化;有毛病的" }, + { id: 859, word: "buy", phonetic: "[bai]]", type: "v.", meaning: "买,购买,赢得" }, + { id: 860, word: "increase", phonetic: "['inkri:s,in'kri:s]]", type: "v.", meaning: "增加,增大" }, + { id: 861, word: "host", phonetic: "[hə ust]]", type: "n.", meaning: "主机" }, + { id: 862, word: "sample", phonetic: "['sæmpl]]", type: "n.", meaning: "& v. 样品,样本;抽样" }, + { id: 863, word: "pending", phonetic: "[ˈ pendiŋ]]", type: "a.", meaning: "悬而未决的,未定的" }, + { id: 864, word: "divide", phonetic: "[diˈ vaid]]", type: "v.", meaning: "除" }, + { id: 865, word: "boot", phonetic: "[bu:t]]", type: "n.", meaning: "引导,靴" }, + { id: 866, word: "hide", phonetic: "[haid]]", type: "v.", meaning: "隐藏,隐蔽" }, + { id: 867, word: "half", phonetic: "[hɑ:f]]", type: "n.", meaning: "& a. & ad. 一半,半个" }, + { id: 868, word: "magenta", phonetic: "[mə ˈ dʒ entə ]]", type: "n.", meaning: "& a. 深红色(的)" }, + { id: 869, word: "leading", phonetic: "[ˈ li:diŋ]]", type: "n.", meaning: "& a. 引导(的)" }, + { id: 870, word: "wrong", phonetic: "[rɔ ŋ]]", type: "a.", meaning: "& ad. n. 错误(的)" }, + { id: 871, word: "today", phonetic: "[tə ˈ dei]]", type: "n.", meaning: "& ad. 今天" }, + { id: 872, word: "least", phonetic: "[li:st]]", type: "a.", meaning: "& ad. 最小(的)" }, + { id: 873, word: "opposite", phonetic: "[ˈ ɔ pə zit]]", type: "a.", meaning: "& n. & ad. 相反的" }, + { id: 874, word: "white", phonetic: "[wait]]", type: "a.", meaning: "& n. 白色(的)" }, + { id: 875, word: "override", phonetic: "[ˌ ə uvə ˈ raid]]", type: "v.", meaning: "& n. 超越,克服" }, + { id: 876, word: "brown", phonetic: "[braun]]", type: "a.", meaning: "& n. 褐色(的),棕色" }, + { id: 877, word: "hex", phonetic: "[heks]]", type: "a.", meaning: "& n. 六角形的" }, + { id: 878, word: "rest", phonetic: "[rest]]", type: "n.", meaning: "& v. 剩余,休息" }, + { id: 879, word: "damage", phonetic: "[ˈ dæmidʒ ]]", type: "n.", meaning: "& vt. 损伤,故障" }, + { id: 880, word: "instant", phonetic: "[ˈ instə nt]]", type: "a.", meaning: "立刻的,直接的" }, + { id: 881, word: "reserved", phonetic: "[riˈ zə :vd]]", type: "a.", meaning: "保留的,预订的" }, + { id: 882, word: "technology", phonetic: "[tekˈ nɔ lə dʒ i]]", type: "n.", meaning: "工艺,技术,制造学" }, + { id: 883, word: "handle", phonetic: "['hændl]]", type: "n.", meaning: "处理,句柄" }, + { id: 884, word: "apply", phonetic: "[ə ˈ plai]]", type: "v.", meaning: "应用,适用于,作用" }, + { id: 885, word: "stand", phonetic: "[stænd]]", type: "v.", meaning: "处于(状态),保持" }, + { id: 886, word: "payment", phonetic: "[ˈ peimə nt]]", type: "n.", meaning: "支付,付款" }, + { id: 887, word: "kilobyte", phonetic: "['kilə ˌ bait]]", type: "n.", meaning: "千字节(kb)" }, + { id: 888, word: "parenthesis", phonetic: "[pə 'renθisis]]", type: "n.", meaning: "括弧,圆括号" }, + { id: 889, word: "scan", phonetic: "[skæn]]", type: "v.", meaning: "扫描,扫视,搜索" }, + { id: 890, word: "locating", phonetic: "[lə u'kə itiŋ]]", type: "n.", meaning: "定位,查找" }, + { id: 891, word: "developer", phonetic: "[di'velə pə ]]", type: "n.", meaning: "开发者,显影剂" }, + { id: 892, word: "murder", phonetic: "[ˈ mə :də ]]", type: "n.", meaning: "弄坏,毁掉" }, + { id: 893, word: "flush", phonetic: "[flʌ ʃ ]]", type: "v.", meaning: "弄平,使齐平" }, + { id: 894, word: "unlock", phonetic: "[ʌ nˈ lɔ k]]", type: "v.", meaning: "开锁,打开" }, + { id: 895, word: "movement", phonetic: "[ˈ mu:vmə nt]]", type: "n.", meaning: "传送,移动" }, + { id: 896, word: "consecutive", phonetic: "[kə nˈ sekjutiv]]", type: "a.", meaning: "连续的,连贯的" }, + { id: 897, word: "collection", phonetic: "[kə 'lekʃ ə n]]", type: "n.", meaning: "集合,聚集,画卷" }, + { id: 898, word: "front", phonetic: "[frʌ nt]]", type: "a.", meaning: "前面的,正面的" }, + { id: 899, word: "addressing", phonetic: "[ə 'dresiŋ]]", type: "n.", meaning: "寻址" }, + { id: 900, word: "prefix", phonetic: "[ˈ pri:fiks]]", type: "n.", meaning: "前缀" }, + { id: 901, word: "carousel", phonetic: "['kærə 'sel]]", type: "n.", meaning: "圆盘传送带" }, + { id: 902, word: "safety", phonetic: "['seifti]]", type: "n.", meaning: "安全,保险" }, + { id: 903, word: "static", phonetic: "[ˈ stætik]]", type: "a.", meaning: "静态的,不变的" }, + { id: 904, word: "background", phonetic: "['bækgraund]]", type: "n.", meaning: "背景,底色,基础" }, + { id: 905, word: "product", phonetic: "['prɔ də kt]]", type: "n.", meaning: "(乘)积,产品" }, + { id: 906, word: "assignment", phonetic: "[ə 'sainmə nt]]", type: "n.", meaning: "赋值,分配" }, + { id: 907, word: "bad", phonetic: "[bæd]]", type: "a.", meaning: "坏的,不良的" }, + { id: 908, word: "declare", phonetic: "[di'klɛ ə ]]", type: "v.", meaning: "说明" }, + { id: 909, word: "adjust", phonetic: "[ə 'dʒ ʌ st]]", type: "vt.", meaning: "调整,调节,控制" }, + { id: 910, word: "recognize", phonetic: "['rekə gnaiz]]", type: "v.", meaning: "识别" }, + { id: 911, word: "route", phonetic: "[ru:t]]", type: "n.", meaning: "路线,路由" }, + { id: 912, word: "respectively", phonetic: "[ri'spektivli]]", type: "ad.", meaning: "分别地" }, + { id: 913, word: "unsuccessful", phonetic: "['ʌ nsə k'sesful]]", type: "a.", meaning: "不成功的,失败的" }, + { id: 914, word: "received", phonetic: "[ri'si:vd]]", type: "a.", meaning: "被接收的,公认的" }, + { id: 915, word: "navigate", phonetic: "['næviˌ geit]]", type: "v.", meaning: "导航,驾驶" }, + { id: 916, word: "considered", phonetic: "[kə n'sidə d]]", type: "a.", meaning: "考虑过的,被尊重的" }, + { id: 917, word: "due", phonetic: "[dju:]]", type: "a.", meaning: "到期的,应付(给)的" }, + { id: 918, word: "recently", phonetic: "['ri:sntli]]", type: "ad.", meaning: "近来" }, + { id: 919, word: "room", phonetic: "[ru:m]]", type: "n.", meaning: "房间,空间" }, + { id: 920, word: "descend", phonetic: "[diˈ send]]", type: "v.", meaning: "下降,落下" }, + { id: 921, word: "fact", phonetic: "[fækt]]", type: "n.", meaning: "事实" }, + { id: 922, word: "alter", phonetic: "[ˈ ɔ :ltə ]]", type: "v.", meaning: "改变,修改" }, + { id: 923, word: "track", phonetic: "[træk]]", type: "n.", meaning: "磁道,轨道" }, + { id: 924, word: "precedence", phonetic: "[ˈ presidə ns]]", type: "n.", meaning: "优先权" }, + { id: 925, word: "skeleton", phonetic: "[ˈ skelitə n]]", type: "n.", meaning: "骨架,框架" }, + { id: 926, word: "log", phonetic: "[lɔ g]]", type: "n.", meaning: "& v. 记录,存入" }, + { id: 927, word: "star", phonetic: "[stɑ:]]", type: "n.", meaning: "星形,星号" }, + { id: 928, word: "hot", phonetic: "[hɔ t]]", type: "a.", meaning: "热的" }, + { id: 929, word: "replaceable", phonetic: "[ri'pleisə bl]]", type: "a.", meaning: "可替换的" }, + { id: 930, word: "accessible", phonetic: "[ə kˈ sesə bə l]]", type: "a.", meaning: "可以使用的" }, + { id: 931, word: "involve", phonetic: "[in'vɔ lv]]", type: "vt.", meaning: "涉及,卷入,占用" }, + { id: 932, word: "configure", phonetic: "[kə n'figə ]]", type: "vt.", meaning: "使成形" }, + { id: 933, word: "question", phonetic: "[ˈ kwestʃ (ə )n]]", type: "n.", meaning: "问题" }, + { id: 934, word: "green", phonetic: "[gri:n]]", type: "n.", meaning: "& a. 绿色绿色的" }, + { id: 935, word: "entirely", phonetic: "[in'taiə li]]", type: "ad.", meaning: "完全地,彻底地" }, + { id: 936, word: "helpful", phonetic: "['helpfə l]]", type: "a.", meaning: "有帮助的,有用的" }, + { id: 937, word: "middle", phonetic: "['midl]]", type: "a.", meaning: "中间的" }, + { id: 938, word: "declared", phonetic: "[di'klɛ ə d]]", type: "a.", meaning: "承认的,申报的" }, + { id: 939, word: "compress", phonetic: "['kɔ mpres,kə m'pres]]", type: "vt.", meaning: "压缩,精减" }, + { id: 940, word: "graphically", phonetic: "['græfikə li]]", type: "ad.", meaning: "用图表表示" }, + { id: 941, word: "auto", phonetic: "[ˈ ɔ :tə u]]", type: "a.", meaning: "自动的" }, + { id: 942, word: "automatic", phonetic: "[ˌ ɔ :tə 'mætik]]", type: "a.", meaning: "自动的" }, + { id: 943, word: "aligned", phonetic: "[ə 'laind]]", type: "a.", meaning: "对准的,均衡的" }, + { id: 944, word: "anywhere", phonetic: "['eniwɛ ə ]]", type: "ad.", meaning: "在任何地方" }, + { id: 945, word: "terminal", phonetic: "['tə :minl]]", type: "n.", meaning: "终端,端子" }, + { id: 946, word: "door", phonetic: "[dɔ :]]", type: "n.", meaning: "舱门,入口,孔" }, + { id: 947, word: "expire", phonetic: "[iks'paiə ]]", type: "v.", meaning: "终止,期满" }, + { id: 948, word: "resolution", phonetic: "[ˌ rezə ˈ lu:ʃ ə n]]", type: "n.", meaning: "分辨率" }, + { id: 949, word: "local", phonetic: "[ˈ lə ukə l]]", type: "a.", meaning: "局部的,本地的" }, + { id: 950, word: "semicolon", phonetic: "[ˌ semi'kə ulə n]]", type: "n.", meaning: "分号(;)" }, + { id: 951, word: "reread", phonetic: "[ri:'ri:d]]", type: "vt.", meaning: "重读" }, + { id: 952, word: "overwrite", phonetic: "[ˌ ə uvə 'rait]]", type: "v.", meaning: "重写" }, + { id: 953, word: "critical", phonetic: "['kritikə l]]", type: "a.", meaning: "& n. 临界的;临界值" }, + { id: 954, word: "manager", phonetic: "[ˈ mænidʒ ə ]]", type: "n.", meaning: "管理程序" }, + { id: 955, word: "capability", phonetic: "[ˌ keipə 'biliti]]", type: "n.", meaning: "能力,效力,权力" }, + { id: 956, word: "affected", phonetic: "[ə ˈ fektid]]", type: "a.", meaning: "受了影响的" }, + { id: 957, word: "allowed", phonetic: "[ə ˈ lau]]", type: "a.", meaning: "容许的" }, + { id: 958, word: "border", phonetic: "['bɔ :də ]]", type: "n.", meaning: "边界,框,界限" }, + { id: 959, word: "cache", phonetic: "[kæʃ ]]", type: "n.", meaning: "高速缓存" }, + { id: 960, word: "bell", phonetic: "[bel]]", type: "n.", meaning: "铃,钟" }, + { id: 961, word: "play", phonetic: "[plei]]", type: "v.", meaning: "玩,奏,放音,放象" }, + { id: 962, word: "quickly", phonetic: "['kwikli]]", type: "a.", meaning: "快,迅速地" }, + { id: 963, word: "fastback", phonetic: "['fɑ:stbæk]]", type: "n.", meaning: "快速返回" }, + { id: 964, word: "answer", phonetic: "['ɑ:nsə ]]", type: "n.", meaning: "& v. 响应,回答;答复" }, + { id: 965, word: "represent", phonetic: "[ˌ repri'zent]]", type: "v.", meaning: "表示,表现,代表" }, + { id: 966, word: "difference", phonetic: "['difə rə ns]]", type: "n.", meaning: "差分,差" }, + { id: 967, word: "highest", phonetic: "[haiist]]", type: "a.", meaning: "最高的" }, + { id: 968, word: "project", phonetic: "[prə 'dʒ ekt]]", type: "n.", meaning: "项目,计划,设计" }, + { id: 969, word: "physical", phonetic: "['fizikə l]]", type: "a.", meaning: "物理的,实际的" }, + { id: 970, word: "matter", phonetic: "['mætə ]]", type: "n.", meaning: "物质,内容,事情" }, + { id: 971, word: "hercules", phonetic: "['hə :kjuli:z]]", type: "n.", meaning: "大力神,大力士" }, + { id: 972, word: "reduce", phonetic: "[ri'dju:s]]", type: "v.", meaning: "减少,降低,简化" }, + { id: 973, word: "publisher", phonetic: "['pʌ bliʃ ə ]]", type: "n.", meaning: "出版者,发行人" }, + { id: 974, word: "trim", phonetic: "[trim]]", type: "n.", meaning: "区标,微调" }, + { id: 975, word: "substitute", phonetic: "['sʌ bstitju:t]]", type: "v.", meaning: "代替,替换,代入" }, + { id: 976, word: "disabled", phonetic: "[dis'eibld]]", type: "a.", meaning: "禁止的,报废的" }, + { id: 977, word: "recent", phonetic: "['ri:snt]]", type: "a.", meaning: "近来的" }, + { id: 978, word: "positive", phonetic: "['pɔ zitiv]]", type: "a.", meaning: "正的,阳的,正片" }, + { id: 979, word: "upgrade", phonetic: "['ʌ pgreid]]", type: "v.", meaning: "升级,提高质量" }, + { id: 980, word: "instance", phonetic: "['instə ns]]", type: "n.", meaning: "& vt. 例子,情况;举例" }, + { id: 981, word: "happen", phonetic: "['hæpə n]]", type: "vi.", meaning: "(偶然)发生,碰巧" }, + { id: 982, word: "elapsed", phonetic: "[iˈ læps]]", type: "vi.", meaning: "& n. 经过" }, + { id: 983, word: "future", phonetic: "['fju:tʃ ə ]]", type: "n.", meaning: "& a. 将来,未来的" }, + { id: 984, word: "midnight", phonetic: "['midnait]]", type: "n.", meaning: "& a. 午夜" }, + { id: 985, word: "though", phonetic: "[ðə u]]", type: "conj.", meaning: "虽然,尽管" }, + { id: 986, word: "nor", phonetic: "[nɔ :]]", type: "conj.", meaning: "也不" }, + { id: 987, word: "mono", phonetic: "['mɔ nə u]]", type: "a.", meaning: "& n. 单音的" }, + { id: 988, word: "slide", phonetic: "[slaid]]", type: "v.", meaning: "& n. 滑动,滑动触头" }, + { id: 989, word: "abort", phonetic: "[ə 'bɔ :t]]", type: "v.", meaning: "& n. 中断,故障" }, + { id: 990, word: "jump", phonetic: "[dʒ ʌ mp]]", type: "v.", meaning: "& n. 转移" }, + { id: 992, word: "throughout", phonetic: "[θru(:)ˈ aut]]", type: "prep.", meaning: "贯穿,整,遍" }, + { id: 993, word: "via", phonetic: "['vaiə ]]", type: "prep.", meaning: "经过,经由" }, + { id: 994, word: "among", phonetic: "[ə 'mʌ ŋ]]", type: "prep.", meaning: "在…之中,中间" }, + { id: 995, word: "neither", phonetic: "['ni:ðə ]]", type: "a.", meaning: "& pron. (两者)都不" }, + { id: 996, word: "layer", phonetic: "['leiə ]]", type: "n.", meaning: "& v. 层,涂层" }, + { id: 997, word: "scatter", phonetic: "['skætə ]]", type: "v.", meaning: "散射,分散,散布" }, + { id: 998, word: "attention", phonetic: "[ə 'tenʃ ə n]]", type: "n.", meaning: "注意(信号)" }, + { id: 999, word: "convention", phonetic: "[kə n'venʃ ə n]]", type: "n.", meaning: "常规,约定,协定" }, + { id: 1000, word: "conventional", phonetic: "[kə n'venʃ ə nl]]", type: "a.", meaning: "常规的,习惯的" }, + { id: 1001, word: "tool", phonetic: "[tu:l]]", type: "n.", meaning: "工具,刀" }, + { id: 1002, word: "handler", phonetic: "['hændlə ]]", type: "n.", meaning: "处理程序" }, + { id: 1003, word: "processor", phonetic: "['prə usesə ]]", type: "n.", meaning: "处理机,处理程序" }, + { id: 1004, word: "desktop", phonetic: "['desktɔ p]]", type: "a.", meaning: "台式的" }, + { id: 1005, word: "build", phonetic: "[bild]]", type: "v.", meaning: "建造,建立,组合" }, + { id: 1006, word: "windowing", phonetic: "['wində uiŋ]]", type: "n.", meaning: "开窗口" }, + { id: 1007, word: "development", phonetic: "[di'velə pmə nt]]", type: "n.", meaning: "开发,研制,显影" }, + { id: 1008, word: "exceed", phonetic: "[ik'si:d]]", type: "v.", meaning: "超过,大于" }, + { id: 1009, word: "understand", phonetic: "[ˌ ʌ ndə 'stænd]]", type: "v.", meaning: "懂,明白(了),理解" }, + { id: 1010, word: "horizontal", phonetic: "[ˌ hɔ ri'zɔ ntl]]", type: "a.", meaning: "水平的,横向的" }, + { id: 1012, word: "meet", phonetic: "[mi:t]]", type: "v.", meaning: "“与”,符合,满足" }, + { id: 1013, word: "protect", phonetic: "[prə 'tekt]]", type: "vt.", meaning: "保护" }, + { id: 1014, word: "reserve", phonetic: "[ri'zə :v]]", type: "vt.", meaning: "保留,预定,预约" }, + { id: 1015, word: "clock", phonetic: "[klɔ k]]", type: "n.", meaning: "时钟,计时器,同步" }, + { id: 1016, word: "manifest", phonetic: "['mænifest]]", type: "vt.", meaning: "表明,显示,显现" }, + { id: 1017, word: "safe", phonetic: "[seif]]", type: "a.", meaning: "安全的,可靠的" }, + { id: 1018, word: "disconnect", phonetic: "[ˌ diskə 'nekt]]", type: "vt.", meaning: "拆接,断开,拆线" }, + { id: 1019, word: "clockwise", phonetic: "[ˈ klɔ k-waiz]]", type: "a.", meaning: "顺时针的" }, + { id: 1020, word: "eliminate", phonetic: "[iˈ limineit]]", type: "vt.", meaning: "除去,消除,切断" }, + { id: 1021, word: "actual", phonetic: "[ˈ æktʃ uə l]]", type: "a.", meaning: "实际的,现实的" }, + { id: 1022, word: "declaration", phonetic: "[ˌ deklə ˈ reiʃ ə n]]", type: "n.", meaning: "说明,申报" }, + { id: 1023, word: "probably", phonetic: "['prɔ bə bli]]", type: "ad.", meaning: "多半,很可能" }, + { id: 1024, word: "ring", phonetic: "[riŋ]]", type: "n.", meaning: "& v. 环,圈;按铃" }, + { id: 1025, word: "cover", phonetic: "[ˈ kʌ və ]]", type: "vt.", meaning: "盖,罩,套" }, + { id: 1026, word: "indicator", phonetic: "[ˈ indikeitə ]]", type: "n.", meaning: "指示器,指示灯" }, + { id: 1027, word: "apple", phonetic: "['æpl]]", type: "n.", meaning: "苹果" }, + { id: 1028, word: "icon", phonetic: "['aikɔ n]]", type: "n.", meaning: "图符,象征" }, + { id: 1029, word: "consideration", phonetic: "[kə nsidə 'reiʃ ə n]]", type: "n.", meaning: "考虑,研究,讨论" }, + { id: 1030, word: "skill", phonetic: "['skil]]", type: "n.", meaning: "技巧" }, + { id: 1031, word: "picture", phonetic: "['piktʃ ə ]]", type: "n.", meaning: "图象,画面" }, + { id: 1032, word: "layout", phonetic: "['leiaut]]", type: "n.", meaning: "布置,布局,安排" }, + { id: 1033, word: "suggest", phonetic: "[sə ˈ dʒ est]]", type: "vt.", meaning: "建议,提议,暗示" }, + { id: 1034, word: "convenient", phonetic: "[kə nˈ vi:niə nt]]", type: "a.", meaning: "方便的,便利的" }, + { id: 1035, word: "instruct", phonetic: "[inˈ strʌ kt]]", type: "vt.", meaning: "讲授,命令" }, + { id: 1036, word: "appendix", phonetic: "[ə 'pendiks]]", type: "n.", meaning: "附录" }, + { id: 1037, word: "medium", phonetic: "[ˈ mi:diə m]]", type: "n.", meaning: "& a. 媒体;中等的" }, + { id: 1038, word: "truncate", phonetic: "[trʌ ŋˈ keit]]", type: "vt.", meaning: "截尾,截断" }, + { id: 1039, word: "inhibit", phonetic: "[inˈ hibit]]", type: "vt.", meaning: "禁止" }, + { id: 1040, word: "nearly", phonetic: "['niə li]]", type: "ad.", meaning: "近乎,差不多,几乎" }, + { id: 1041, word: "warn", phonetic: "[wɔ :n]]", type: "vt.", meaning: "警告,警戒,预告" }, + { id: 1042, word: "underline", phonetic: "[ˌ ʌ ndə 'lain]]", type: "n.", meaning: "下划线" }, + { id: 1043, word: "register", phonetic: "['redʒ istə ]]", type: "n.", meaning: "寄存器" }, + { id: 1044, word: "stuff", phonetic: "[stʌ f]]", type: "n.", meaning: "& vt. 材料;装入" }, + { id: 1045, word: "exclude", phonetic: "[iks'klu:d]]", type: "vt.", meaning: "排除,除去" }, + { id: 1046, word: "destroy", phonetic: "[dis'trɔ i]]", type: "vt.", meaning: "破坏,毁坏,打破" }, + { id: 1047, word: "calculation", phonetic: "[ˌ kælkju'leiʃ ə n]]", type: "n.", meaning: "计算,统计,估计" }, + { id: 1048, word: "angle", phonetic: "['æŋgl]]", type: "n.", meaning: "角,角度" }, + { id: 1049, word: "lexical", phonetic: "['leksikə l]]", type: "a.", meaning: "辞典的,词法的" }, + { id: 1050, word: "decide", phonetic: "[diˈ said]]", type: "v.", meaning: "(使)判定,判断" }, + { id: 1051, word: "trouble", phonetic: "[ˈ trʌ bə l]]", type: "n.", meaning: "故障" }, + { id: 1052, word: "processing", phonetic: "['prɔ sesiŋ]]", type: "n.", meaning: "(数据)处理,加工" }, + { id: 1053, word: "customer", phonetic: "['kʌ stə mə ]]", type: "n.", meaning: "顾客,客户" }, + { id: 1054, word: "port", phonetic: "[pɔ :t]]", type: "n.", meaning: "端口,进出口" }, + { id: 1055, word: "discuss", phonetic: "[di'skʌ s]]", type: "vt.", meaning: "讨论,论述" }, + { id: 1056, word: "segment", phonetic: "['segmə nt]]", type: "n.", meaning: "段,片段,图块" }, + { id: 1057, word: "filing", phonetic: "['failiŋ]]", type: "n.", meaning: "(文件的)整理汇集" }, + { id: 1058, word: "identically", phonetic: "[ai'dentikli]]", type: "ad.", meaning: "相等,恒等" }, + { id: 1059, word: "market", phonetic: "['mɑ:kit]]", type: "n.", meaning: "市场,行情,销路" }, + { id: 1060, word: "valuable", phonetic: "['væljuə bl]]", type: "a.", meaning: "有价值的,贵重的" }, + { id: 1061, word: "limited", phonetic: "['limitid]]", type: "a.", meaning: "有限的,(受)限制的" }, + { id: 1062, word: "trying", phonetic: "['traiiŋ]]", type: "a.", meaning: "费劲的,困难的" }, + { id: 1063, word: "heap", phonetic: "[hi:p]]", type: "n.", meaning: "堆阵" }, + { id: 1064, word: "grey", phonetic: "[grei]]", type: "n.", meaning: "& a. 灰色;灰色的" }, + { id: 1065, word: "permanently", phonetic: "['pə :mə nə ntli]]", type: "ad.", meaning: "永久地,持久地" }, + { id: 1066, word: "accelerator", phonetic: "[æk'selə ˌ reitə ]]", type: "n.", meaning: "加速装置,加速剂" }, + { id: 1067, word: "originally", phonetic: "[ə 'ridʒ ə nə li]]", type: "ad.", meaning: "原来,最初" }, + { id: 1068, word: "ability", phonetic: "[ə 'biliti]]", type: "n.", meaning: "性能,能力,效率" }, + { id: 1069, word: "internally", phonetic: "[in'tə :nə li]]", type: "ad.", meaning: "在内(部)" }, + { id: 1070, word: "derelict", phonetic: "['derilikt]]", type: "vt.", meaning: "中途淘汰" }, + { id: 1071, word: "redirect", phonetic: "[ˌ ri:di'rekt]]", type: "vt.", meaning: "重定向" }, + { id: 1072, word: "reside", phonetic: "[ri'zaid]]", type: "vi.", meaning: "驻留" }, + { id: 1073, word: "header", phonetic: "['hedə ]]", type: "n.", meaning: "首部,标题,报头" }, + { id: 1074, word: "extra", phonetic: "[ˈ ekstrə ]]", type: "a.", meaning: "特别的,额外的" }, + { id: 1075, word: "repeated", phonetic: "[riˈ pi:tid]]", type: "a.", meaning: "重复的" }, + { id: 1076, word: "death", phonetic: "[deθ]]", type: "n.", meaning: "毁灭,消灭" }, + { id: 1077, word: "observe", phonetic: "[ə b'zə :v]]", type: "v.", meaning: "观察,探测" }, + { id: 1078, word: "density", phonetic: "['densiti]]", type: "n.", meaning: "密度" }, + { id: 1079, word: "management", phonetic: "[ˈ mænidʒ mə nt]]", type: "n.", meaning: "管理" }, + { id: 1080, word: "environmental", phonetic: "[inˌ vaiə rə n'mentl]]", type: "a.", meaning: "周围的,环境的" }, + { id: 1081, word: "surrounding", phonetic: "[sə 'raundiŋ]]", type: "a.", meaning: "周围的,环绕的" }, + { id: 1082, word: "master", phonetic: "['mɑ:stə ]]", type: "a.", meaning: "总要的,总的" }, + { id: 1083, word: "recursive", phonetic: "[ri'kə :siv]]", type: "a.", meaning: "递归的,循环的" }, + { id: 1084, word: "trap", phonetic: "[træp]]", type: "n.", meaning: "& vt. 陷阱;俘获" }, + { id: 1085, word: "dimensional", phonetic: "[di'menʃ ə nə l]]", type: "n.", meaning: "尺寸的,…维的" }, + { id: 1086, word: "logic", phonetic: "[ˈ lɔ dʒ ik]]", type: "n.", meaning: "逻辑(线路)" }, + { id: 1087, word: "conjunction", phonetic: "[kə n'dʒ ʌ ŋkʃ ə n]]", type: "n.", meaning: "逻辑乘,“与”" }, + { id: 1088, word: "identical", phonetic: "[ai'dentikə l]]", type: "a.", meaning: "相等的,相同的" }, + { id: 1089, word: "advice", phonetic: "[ə d'vais]]", type: "n.", meaning: "意见,参考说明" }, + { id: 1090, word: "meaning", phonetic: "[ˈ mi:niŋ]]", type: "n.", meaning: "意义,含义" }, + { id: 1091, word: "fall", phonetic: "[fɔ :l]]", type: "n.", meaning: "落下,降落" }, + { id: 1092, word: "interval", phonetic: "['intə və l]]", type: "n.", meaning: "间歇,区间" }, + { id: 1093, word: "compatibility", phonetic: "[kə mˌ pætə 'biliti]]", type: "n.", meaning: "兼容性,适应性" }, + { id: 1094, word: "rule", phonetic: "[ru:l]]", type: "n.", meaning: "规则,法则,尺" }, + { id: 1095, word: "flag", phonetic: "[flæg]]", type: "n.", meaning: "标志(记),特征(位)" }, + { id: 1096, word: "criterion", phonetic: "[krai'tiə riə n]]", type: "n.", meaning: "标准,判据,准则" }, + { id: 1097, word: "office", phonetic: "['ɔ :fis]]", type: "n.", meaning: "办公室,局,站" }, + { id: 1098, word: "express", phonetic: "[iks'pres]]", type: "a.", meaning: "快速的" }, + { id: 1099, word: "volume", phonetic: "['vɔ ljum]]", type: "n.", meaning: "卷,册,体积,容量" }, + { id: 1100, word: "soft", phonetic: "[sɔ ft]]", type: "a.", meaning: "软的" }, + { id: 1101, word: "rated", phonetic: "['reitid]]", type: "a.", meaning: "额定的" }, + { id: 1102, word: "activity", phonetic: "[æk'tiviti]]", type: "n.", meaning: "活力,功率" }, + { id: 1103, word: "odometer", phonetic: "[ə u'dɔ mitə ]]", type: "n.", meaning: "里程表,计程仪" }, + { id: 1104, word: "phoenix", phonetic: "['fi:niks]]", type: "n.", meaning: "凤凰,绝世珍品" }, + { id: 1105, word: "obtain", phonetic: "[ə b'tein]]", type: "v.", meaning: "获得,得到" }, + { id: 1106, word: "easel", phonetic: "['i:zl]]", type: "n.", meaning: "框,(画)架" }, + { id: 1107, word: "latter", phonetic: "['lætə ]]", type: "a.", meaning: "后面的,最近的" }, + { id: 1108, word: "decrease", phonetic: "['di:kri:s,di:'kri:s]]", type: "v.", meaning: "减少,降低,缩短" }, + { id: 1109, word: "mainframe", phonetic: "['meinfreim]]", type: "n.", meaning: "主机,大型机" }, + { id: 1110, word: "debugger", phonetic: "['di:'bʌ gə ]]", type: "n.", meaning: "调试程序" }, + { id: 1111, word: "diacritical", phonetic: "[ˌ daiə 'kritikə l]]", type: "a.", meaning: "区分的,辩别的" }, + { id: 1112, word: "confidential", phonetic: "[ˌ kɔ nfiˈ denʃ ə l]]", type: "a.", meaning: "机密的" }, + { id: 1113, word: "trace", phonetic: "[treis]]", type: "v.", meaning: "跟踪,追踪" }, + { id: 1114, word: "division", phonetic: "[di'viʒ ə n]]", type: "n.", meaning: "除,除法,(程序)部分" }, + { id: 1115, word: "regular", phonetic: "['regjulə ]]", type: "a.", meaning: "正则的,正规的" }, + { id: 1116, word: "implicit", phonetic: "[im'plisit]]", type: "a.", meaning: "隐式的" }, + { id: 1117, word: "mention", phonetic: "['menʃ ə n]]", type: "vt.", meaning: "& n. 叙述,说到" }, + { id: 1118, word: "near", phonetic: "[niə ]]", type: "ad.", meaning: "& prep. 领近,接近" }, + { id: 1119, word: "fifth", phonetic: "[fifθ]]", type: "n.", meaning: "& a. 第五,五分之一" }, + { id: 1120, word: "seven", phonetic: "['sevn]]", type: "n.", meaning: "& a. 七(个)" }, + { id: 1121, word: "whereas", phonetic: "[hwɛ ə r'æz]]", type: "conj.", meaning: "面,其实,既然" }, + { id: 1122, word: "review", phonetic: "[ri'vju:]]", type: "v.", meaning: "& n. (再)检查" }, + { id: 1123, word: "whatever", phonetic: "[wɔ t'evə ]]", type: "pron.", meaning: "& a. 无论什么" }, + { id: 1124, word: "transform", phonetic: "[træns'fɔ :m]]", type: "v.", meaning: "& n. 变换,变换式" }, + { id: 1125, word: "align", phonetic: "[ə 'lain]]", type: "v.", meaning: "& n. 定位,对准" }, + { id: 1126, word: "yellow", phonetic: "['jelə u]]", type: "a.", meaning: "& n. 黄色(的)" }, + { id: 1127, word: "assist", phonetic: "[ə 'sist]]", type: "v.", meaning: "& n. 加速,帮助" }, + { id: 1128, word: "finish", phonetic: "['finiʃ ]]", type: "v.", meaning: "& n. 完成,结束" }, + { id: 1129, word: "micro", phonetic: "['maikrə u]]", type: "a.", meaning: "& n. 微的,百万分之一" }, + { id: 1130, word: "beyond", phonetic: "[bi'jɔ nd]]", type: "prep.", meaning: "超过,那边" }, + { id: 1131, word: "against", phonetic: "[ə 'geinst,ə 'genst]]", type: "prep.", meaning: "反对,阻止" }, + { id: 1132, word: "upon", phonetic: "[ə 'pɔ n]]", type: "prep.", meaning: "依据,遵照" }, + { id: 1133, word: "service", phonetic: "[ˈ sə :vis]]", type: "n.", meaning: "& vt. 服务,业务" }, + { id: 1134, word: "little", phonetic: "['litl]]", type: "a.", meaning: "小的,少量的" }, + { id: 1135, word: "exhaust", phonetic: "[ig'zɔ :st]]", type: "v.", meaning: "取尽,用完" }, + { id: 1136, word: "choice", phonetic: "[tʃ ɔ is]]", type: "n.", meaning: "选择,精品" }, + { id: 1137, word: "sounding", phonetic: "['saundiŋ]]", type: "a.", meaning: "发声的" }, + { id: 1138, word: "develop", phonetic: "[di'velə p]]", type: "v.", meaning: "发展,研制,显影" }, + { id: 1139, word: "holding", phonetic: "['hə uldiŋ]]", type: "n.", meaning: "保持,固定,存储" }, + { id: 1140, word: "alpha", phonetic: "['ælfə ]]", type: "n.", meaning: "希腊字母α,未知数" }, + { id: 1141, word: "constant", phonetic: "['kɔ nstə nt]]", type: "n.", meaning: "常数" }, + { id: 1142, word: "warranty", phonetic: "['wɔ rə nti]]", type: "n.", meaning: "保证(书),授权" }, + { id: 1143, word: "stay", phonetic: "[stei]]", type: "v.", meaning: "停止,停留" }, + { id: 1144, word: "industry", phonetic: "['ində stri]]", type: "n.", meaning: "工业" }, + { id: 1145, word: "trigger", phonetic: "['trigə ]]", type: "n.", meaning: "& v. 触发器;触发" }, + { id: 1146, word: "lesson", phonetic: "['lesn]]", type: "n.", meaning: "功课,教训" }, + { id: 1147, word: "handling", phonetic: "['hændliŋ]]", type: "n.", meaning: "处理,操纵" }, + { id: 1148, word: "treat", phonetic: "[tri:t]]", type: "v.", meaning: "处理,加工" }, + { id: 1149, word: "busy", phonetic: "['bizi]]", type: "a.", meaning: "忙碌的,占线的" }, + { id: 1150, word: "usage", phonetic: "['ju:sidʒ ]]", type: "n.", meaning: "应用,使用,用法" }, + { id: 1151, word: "difficult", phonetic: "['difikə lt]]", type: "a.", meaning: "困难的,不容易的" }, + { id: 1152, word: "failure", phonetic: "['feiljə ]]", type: "n.", meaning: "失效,故障,失败" }, + { id: 1153, word: "communication", phonetic: "[k ə ˌ mju:ni'kei ʃ ən]]", type: "n.", meaning: "通信" }, + { id: 1154, word: "building", phonetic: "['bildiŋ]]", type: "n.", meaning: "建造,建筑,房屋" }, + { id: 1155, word: "ally", phonetic: "[ə 'lai]]", type: "v.", meaning: "联合,与…关联" }, + { id: 1156, word: "exclamation", phonetic: "[ˌ eksklə 'meiʃ ə n]]", type: "n.", meaning: "惊叹(号)" }, + { id: 1157, word: "turning", phonetic: "['tə :niŋ]]", type: "a.", meaning: "转弯的,旋转的" }, + { id: 1158, word: "whole", phonetic: "[hə ul]]", type: "a.", meaning: "全部的,整个的" }, + { id: 1159, word: "parent", phonetic: "['pɛ ə rə nt]]", type: "n.", meaning: "双亲,父代" }, + { id: 1160, word: "connection", phonetic: "[kə 'nekʃ ə n]]", type: "n.", meaning: "连接(法)" }, + { id: 1161, word: "connectivity", phonetic: "[kə 'nektiviˌ ti]]", type: "n.", meaning: "连通性,联络性" }, + { id: 1162, word: "translation", phonetic: "[træns'leiʃ ə n]]", type: "n.", meaning: "翻译,变换,平移" }, + { id: 1163, word: "dynamic", phonetic: "[dai'næmik]]", type: "a.", meaning: "动态的,动力的" }, + { id: 1164, word: "foreground", phonetic: "['fɔ :graund]]", type: "n.", meaning: "前台" }, + { id: 1165, word: "preserve", phonetic: "[pri'zə :v]]", type: "vt.", meaning: "保存,维持" }, + { id: 1166, word: "vice", phonetic: "[vais]]", type: "n.", meaning: "缺点,毛病,错误" }, + { id: 1167, word: "necessarily", phonetic: "['nesə serili]]", type: "ad.", meaning: "必定,当然" }, + { id: 1168, word: "circle", phonetic: "[ˈ sə :kə l]]", type: "n.", meaning: "圆,圈,循环,周期" }, + { id: 1169, word: "differ", phonetic: "['difə ]]", type: "vi.", meaning: "不同,不一致" }, + { id: 1170, word: "stationary", phonetic: "['steiʃ ə nə ri]]", type: "a.", meaning: "静止的,平稳的" }, + { id: 1171, word: "extract", phonetic: "['ekstrækt,iks'trækt]]", type: "vt.", meaning: "抽取,摘录,开方" }, + { id: 1172, word: "unrecognized", phonetic: "['ʌ n'rekə gnaizd]]", type: "a.", meaning: "未被认出的" }, + { id: 1173, word: "thereafter", phonetic: "[ðɛ ə 'æftə ]]", type: "ad.", meaning: "此后,据此" }, + { id: 1174, word: "inverse", phonetic: "['in'və :s]]", type: "a.", meaning: "反向的,逆的" }, + { id: 1175, word: "spell", phonetic: "[spel]]", type: "v.", meaning: "拼写" }, + { id: 1176, word: "limiting", phonetic: "['limitiŋ]]", type: "n.", meaning: "(电路参数)限制处理" }, + { id: 1177, word: "restructure", phonetic: "[ri:'strʌ ktʃ ə ]]", type: "vt.", meaning: "调整,重新组织" }, + { id: 1178, word: "delimit", phonetic: "[di:'limit]]", type: "vt.", meaning: "定界,定义" }, + { id: 1179, word: "pay", phonetic: "[pei]]", type: "v.", meaning: "付款,支付" }, + { id: 1180, word: "separately", phonetic: "['sepə ritli]]", type: "ad.", meaning: "分别地" }, + { id: 1181, word: "classify", phonetic: "['klæsifai]]", type: "vt.", meaning: "分类,分级" }, + { id: 1182, word: "interfere", phonetic: "[ˌ intə ˈ fiə ]]", type: "vi.", meaning: "干涉,干扰,冲突" }, + { id: 1183, word: "mind", phonetic: "[maind]]", type: "n.", meaning: "愿望,想法,智力" }, + { id: 1184, word: "individually", phonetic: "[ˌ indi'vidjuə li]]", type: "ad.", meaning: "个别地,单独地" }, + { id: 1185, word: "vertical", phonetic: "['və :tikə l]]", type: "a.", meaning: "垂直的,立(式)的" }, + { id: 1186, word: "undesirable", phonetic: "['ʌ ndi'zairə bl]]", type: "a.", meaning: "不合乎需要的" }, + { id: 1187, word: "lot", phonetic: "[lɔ t]]", type: "n.", meaning: "一块(批,组,套)" }, + { id: 1188, word: "piece", phonetic: "[pi:s]]", type: "n.", meaning: "一块,部分,段" }, + { id: 1189, word: "unavailable", phonetic: "['ʌ nə 'veilə bl]]", type: "a.", meaning: "不能利用的" }, + { id: 1190, word: "unlike", phonetic: "[ˌ ʌ nˈ laik]]", type: "a.", meaning: "不象的,不同的" }, + { id: 1191, word: "sit", phonetic: "[sit]]", type: "v.", meaning: "位于,安装" }, + { id: 1192, word: "insufficient", phonetic: "[ˌ insə 'fiʃ ə nt]]", type: "a.", meaning: "不足的,不适当的" }, + { id: 1193, word: "map", phonetic: "[mæp]]", type: "n.", meaning: "& vt. 图;映射,变址" }, + { id: 1194, word: "figure", phonetic: "['figə ]]", type: "n.", meaning: "数字;图,图形,形状" }, + { id: 1195, word: "prepare", phonetic: "[pri'pɛ ə ]]", type: "v.", meaning: "准备" }, + { id: 1196, word: "consider", phonetic: "[kə nˈ sidə ]]", type: "v.", meaning: "考虑,认为,设想" }, + { id: 1197, word: "detect", phonetic: "[diˈ tekt]]", type: "vt.", meaning: "检测" }, + { id: 1198, word: "convenience", phonetic: "[kə n'vi:njə ns]]", type: "n.", meaning: "方便,便利" }, + { id: 1199, word: "method", phonetic: "['meθə d]]", type: "n.", meaning: "方法,方案" }, + { id: 1200, word: "mean", phonetic: "[mi:n]]", type: "n.", meaning: "& vt. 平均;意味着" }, + { id: 1201, word: "salary", phonetic: "['sælə ri]]", type: "n.", meaning: "& vt. 薪水;发工资" }, + { id: 1202, word: "pacific", phonetic: "[pə 'sifik]]", type: "a.", meaning: "平稳的,太平(洋)的" }, + { id: 1203, word: "strong", phonetic: "[strɔ ŋ]]", type: "a.", meaning: "强的" }, + { id: 1204, word: "emphasize", phonetic: "[ˈ emfə saiz]]", type: "v.", meaning: "强调,着重,增强" }, + { id: 1205, word: "department", phonetic: "[diˈ pɑ:tmə nt]]", type: "n.", meaning: "部门,门类,系" }, + { id: 1206, word: "forced", phonetic: "[fɔ :st]]", type: "a.", meaning: "强制的,压力的" }, + { id: 1208, word: "permanent", phonetic: "['pə :mə nə nt]]", type: "a.", meaning: "永久的" }, + { id: 1209, word: "remark", phonetic: "[ri'mɑ:k]]", type: "n.", meaning: "评注,备注" }, + { id: 1210, word: "away", phonetic: "[ə ˈ wei]]", type: "ad.", meaning: "离开,(去)掉" }, + { id: 1211, word: "concatenate", phonetic: "[kɔ n'kætineit]]", type: "vt.", meaning: "连接,串联,并置" }, + { id: 1212, word: "lightning", phonetic: "['laitniŋ]]", type: "n.", meaning: "闪电" }, + { id: 1213, word: "additionally", phonetic: "[ə 'diʃ ə nli]]", type: "ad.", meaning: "另外,又" }, + { id: 1214, word: "emulate", phonetic: "[ˈ emjuleit]]", type: "v.", meaning: "仿真,模仿;赶上或超过" }, + { id: 1215, word: "tape", phonetic: "[teip]]", type: "n.", meaning: "磁带,纸带" }, + { id: 1216, word: "accidentally", phonetic: "[ˌ æksi'dentə li]]", type: "ad.", meaning: "偶然地" }, + { id: 1217, word: "concept", phonetic: "['kɔ nsept]]", type: "n.", meaning: "概念" }, + { id: 1218, word: "optimize", phonetic: "['ɔ ptimaiz]]", type: "v.", meaning: "优选,优化" }, + { id: 1219, word: "counter", phonetic: "['kauntə ]]", type: "n.", meaning: "计数器,计算器" }, + { id: 1220, word: "expect", phonetic: "[ikˈ spekt]]", type: "vt.", meaning: "期望,期待,盼望" }, + { id: 1221, word: "subsequently", phonetic: "[ˈ sʌ bsikwə ntli]]", type: "ad.", meaning: "其后,其次,按着" }, + { id: 1222, word: "registration", phonetic: "[ˌ redʒ iˈ streiʃ ə n]]", type: "n.", meaning: "登记,挂号,读数" }, + { id: 1223, word: "city", phonetic: "[ˈ siti]]", type: "n.", meaning: "城市,市区" }, + { id: 1224, word: "designate", phonetic: "[ˈ dezignit, -neit]]", type: "vt.", meaning: "任命,标志" }, + { id: 1225, word: "visible", phonetic: "[ˈ vizə bə l]]", type: "a.", meaning: "可见的,明显的" }, + { id: 1226, word: "consult", phonetic: "[kə n'sʌ lt]]", type: "v.", meaning: "咨询,顾问" }, + { id: 1227, word: "completely", phonetic: "[kə m'pli:tli]]", type: "ad.", meaning: "十分,完全,彻底" }, + { id: 1228, word: "virtually", phonetic: "[ˈ və :tʃ uə li]]", type: "ad.", meaning: "实际上" }, + { id: 1229, word: "substantially", phonetic: "[sə bˈ stænʃ ə li]]", type: "ad.", meaning: "实质上,本质上" }, + { id: 1230, word: "specialize", phonetic: "['speʃ ə laiz]]", type: "v.", meaning: "(使)专门化" }, + { id: 1231, word: "fail", phonetic: "[feil]]", type: "n.", meaning: "故障,失效" }, + { id: 1232, word: "primarily", phonetic: "[prai'mə rili]]", type: "ad.", meaning: "首先,起初,原来" }, + { id: 1233, word: "sequentially", phonetic: "[si'kwenʃ ə li]]", type: "ad.", meaning: "顺序地" }, + { id: 1234, word: "client", phonetic: "['klaiə nt]]", type: "n.", meaning: "顾客,买主" }, + { id: 1235, word: "runtime", phonetic: "[rʌ n'taim]]", type: "n.", meaning: "运行时间" }, + { id: 1236, word: "fix", phonetic: "[fiks]]", type: "v.", meaning: "固定,定影" }, + { id: 1237, word: "author", phonetic: "[ˈ ɔ :θə ]]", type: "n.", meaning: "程序设计者,作者" }, + { id: 1238, word: "programmer", phonetic: "['prə ugræmə ]]", type: "n.", meaning: "程序设计人员" }, + { id: 1239, word: "commercial", phonetic: "[kə ˈ mə :ʃ ə l]]", type: "a.", meaning: "商业的,经济的" }, + { id: 1240, word: "particularly", phonetic: "[pə ˈ tikjulə li]]", type: "ad.", meaning: "特别,格外,尤其" }, + { id: 1241, word: "low", phonetic: "[lə u]]", type: "a.", meaning: "低的,浅的,弱的" }, + { id: 1242, word: "sheet", phonetic: "[ʃ i:t]]", type: "n.", meaning: "(图)表,纸,片" }, + { id: 1243, word: "employee", phonetic: "[ˌ em'plɔ ii:]]", type: "n.", meaning: "雇员" }, + { id: 1244, word: "legal", phonetic: "[ˈ li:gə l]]", type: "a.", meaning: "合法的,法律的" }, + { id: 1245, word: "qualified", phonetic: "['kwɔ lifaid]]", type: "a.", meaning: "合格的,受限制的" }, + { id: 1246, word: "context", phonetic: "[ˈ kɔ ntekst]]", type: "n.", meaning: "上下文,来龙去脉" }, + { id: 1247, word: "involved", phonetic: "[inˈ vɔ lvd]]", type: "a.", meaning: "有关的" }, + { id: 1248, word: "conditional", phonetic: "[kə n'diʃ ə nə l]]", type: "a.", meaning: "有条件的" }, + { id: 1249, word: "halfway", phonetic: "['hɑ:f'wei]]", type: "a.", meaning: "中途的,不彻底的" }, + { id: 1250, word: "oriented", phonetic: "['ɔ :riə ntid]]", type: "a.", meaning: "有向的,定向的" }, + { id: 1251, word: "pair", phonetic: "[pɛ ə ]]", type: "n.", meaning: "(一)对,一双" }, + { id: 1252, word: "week", phonetic: "[wi:k]]", type: "n.", meaning: "(一)星期,(一)周" }, + { id: 1253, word: "suppressed", phonetic: "[sə ˈ pres]]", type: "vt.", meaning: "抑制,取消" }, + { id: 1254, word: "subroutine", phonetic: "['sʌ bru:'ti:n]]", type: "n.", meaning: "子程序" }, + { id: 1255, word: "bracketed", phonetic: "['brækə tid]]", type: "a.", meaning: "加括号的" }, + { id: 1256, word: "manually", phonetic: "['mænjuə li]]", type: "ad.", meaning: "用手,手动地" }, + { id: 1257, word: "preset", phonetic: "[pri:'set]]", type: "vt.", meaning: "预置" }, + { id: 1259, word: "restrict", phonetic: "[riˈ strikt]]", type: "vt.", meaning: "约束,限制" }, + { id: 1260, word: "performance", phonetic: "[pə 'fɔ :mə ns]]", type: "n.", meaning: "性能,实绩" }, + { id: 1261, word: "showing", phonetic: "['ʃ ə uiŋ]]", type: "n.", meaning: "显示,表现" }, + { id: 1262, word: "ever", phonetic: "[ˈ evə ]]", type: "ad.", meaning: "在任何时候,曾经" }, + { id: 1263, word: "distribution", phonetic: "[ˌ distriˈ bju:ʃ ə n]]", type: "n.", meaning: "分布,分配" }, + { id: 1264, word: "denote", phonetic: "[diˈ nə ut]]", type: "vt.", meaning: "指示,意味着,代表" }, + { id: 1265, word: "cash", phonetic: "[kæʃ ]]", type: "n.", meaning: "现金" }, + { id: 1266, word: "repeatedly", phonetic: "[riˈ pi:tidli]]", type: "ad.", meaning: "重复地" }, + { id: 1267, word: "replicate", phonetic: "[ˈ replikeit]]", type: "vt.", meaning: "重复,复制" }, + { id: 1268, word: "mega", phonetic: "['megə ]]", type: "n.", meaning: "兆,百万" }, + { id: 1269, word: "conform", phonetic: "[kə nˈ fɔ :m]]", type: "vi.", meaning: "遵从,符合" }, + { id: 1270, word: "rebuild", phonetic: "[ri:'bild]]", type: "v.", meaning: "重建,修复,改造" }, + { id: 1271, word: "certainty", phonetic: "['sə :tnti]]", type: "n.", meaning: "必然,确实" }, + { id: 1272, word: "controller", phonetic: "[kə n'trə ulə ]]", type: "n.", meaning: "控制器" }, + { id: 1273, word: "pseudo", phonetic: "['sju:də u]]", type: "a.", meaning: "假的,伪的,冒充的" }, + { id: 1274, word: "manage", phonetic: "['mænidʒ ]]", type: "v.", meaning: "管理,经营,使用" }, + { id: 1275, word: "administrator", phonetic: "[ə d'ministreitə ]]", type: "n.", meaning: "管理人,行政人员" }, + { id: 1276, word: "ensemble", phonetic: "[ɑ:n'sɑ:mbl]]", type: "n.", meaning: "总体,集合体" }, + { id: 1277, word: "bus", phonetic: "[bʌ s]]", type: "n.", meaning: "总线,信息通路" }, + { id: 1278, word: "allowable", phonetic: "[ə 'lauə bl]]", type: "a.", meaning: "容许的,承认的" }, + { id: 1279, word: "limitations", phonetic: "[ˌ limiˈ teiʃ ə n]]", type: "n.", meaning: "限制,边界" }, + { id: 1280, word: "restriction", phonetic: "[ri'strikʃ ə n]]", type: "n.", meaning: "限制,约束,节流" }, + { id: 1281, word: "height", phonetic: "[hait]]", type: "n.", meaning: "高度" }, + { id: 1282, word: "remainder", phonetic: "[ri'meində ]]", type: "n.", meaning: "余数,余项,剩余" }, + { id: 1283, word: "traverse", phonetic: "['trævə :s]]", type: "v.", meaning: "横渡,横过,横断" }, + { id: 1284, word: "organization", phonetic: "[ˌ ɔ :gə nai'zeiʃ ə n]]", type: "n.", meaning: "结构,机构,公司" }, + { id: 1285, word: "resulting", phonetic: "[ri'zʌ ltiŋ]]", type: "a.", meaning: "结果的,合成的" }, + { id: 1286, word: "solution", phonetic: "[sə 'lu:ʃ ə n]]", type: "n.", meaning: "解,解法,解答" }, + { id: 1287, word: "external", phonetic: "[eks'tə :nl]]", type: "a.", meaning: "外部的" }, + { id: 1288, word: "adequate", phonetic: "['ædikwit]]", type: "a.", meaning: "足够的,充分的" }, + { id: 1290, word: "vary", phonetic: "[ˈ veə ri]]", type: "v.", meaning: "变化,变换" }, + { id: 1291, word: "gap", phonetic: "[gæp]]", type: "n.", meaning: "间隙,间隔,缝隙" }, + { id: 1292, word: "indexing", phonetic: "['indeksiŋ]]", type: "n.", meaning: "变址,标引,加下标" }, + { id: 1293, word: "board", phonetic: "[bɔ :d]]", type: "n.", meaning: "板,插件板" }, + { id: 1294, word: "package", phonetic: "['pækidʒ ]]", type: "n.", meaning: "插件,(软件)包" }, + { id: 1295, word: "insertion", phonetic: "[in'sə :ʃ ə n]]", type: "n.", meaning: "插入,嵌入,插页" }, + { id: 1296, word: "intervene", phonetic: "[ˌ intə 'vi:n]]", type: "vi", meaning: "插入,干涉" }, + { id: 1297, word: "conflict", phonetic: "['kɔ nflikt]]", type: "v.", meaning: "冲突,碰头" }, + { id: 1298, word: "really", phonetic: "[ˈ riə li]]", type: "a.", meaning: "真正地,确实地" }, + { id: 1299, word: "overflow", phonetic: "[ˌ ə uvə 'flə u,'ə uvə flə u]]", type: "v.", meaning: "溢出,上溢" }, + { id: 1300, word: "charge", phonetic: "[tʃ ɑ:dʒ ]]", type: "n.", meaning: "电荷,充电,负荷" }, + { id: 1301, word: "phone", phonetic: "[fə un]]", type: "n.", meaning: "电话,电话机,音素" }, + { id: 1302, word: "virtual", phonetic: "['və :tjuə l]]", type: "a.", meaning: "虚(拟)的,虚拟" }, + { id: 1303, word: "compose", phonetic: "[kə m'pə uz]]", type: "v.", meaning: "组成,构成,构图" }, + { id: 1304, word: "snapshot", phonetic: "['snæpʃ ɔ t]]", type: "n.", meaning: "抽点打印" }, + { id: 1305, word: "sensitivity", phonetic: "[ˌ sensi'tiviti]]", type: "n.", meaning: "灵敏度" }, + { id: 1306, word: "familiar", phonetic: "[fə 'miljə ]]", type: "a.", meaning: "熟悉的,惯用的" }, + { id: 1307, word: "mach", phonetic: "[mɑ:k]]", type: "n.", meaning: "马赫(速度单位)" }, + { id: 1308, word: "incorrect", phonetic: "[ˌ inkə 'rekt]]", type: "a.", meaning: "错误的,不正确的" }, + { id: 1309, word: "cut", phonetic: "[kʌ t]]", type: "v.", meaning: "割,切" }, + { id: 1310, word: "lowest", phonetic: "['lə uist]]", type: "a.", meaning: "最低的,最小的" }, + { id: 1311, word: "simple", phonetic: "['simpl]]", type: "a.", meaning: "简单的" }, + { id: 1312, word: "subsequent", phonetic: "['sʌ bsikwə nt]]", type: "a.", meaning: "后来的,其次的" }, + { id: 1313, word: "capitalized", phonetic: "['kæpitə lɑizd]]", type: "a.", meaning: "大写的" }, + { id: 1314, word: "compact", phonetic: "[kə m'pækt]]", type: "a.", meaning: "紧致的,压缩的" }, + { id: 1315, word: "plain", phonetic: "[plein]]", type: "n.", meaning: "明码" }, + { id: 1316, word: "noted", phonetic: "['nə utid]]", type: "a.", meaning: "著名的" }, + { id: 1317, word: "desirable", phonetic: "[diˈ zaiə rə bə l]]", type: "a.", meaning: "所希望的,称心的" }, + { id: 1318, word: "substitution", phonetic: "[ˌ sʌ bsti'tju:ʃ ə n]]", type: "n.", meaning: "代替,替换,置换" }, + { id: 1319, word: "consume", phonetic: "[kə n'sju:m]]", type: "v.", meaning: "消耗,使用" }, + { id: 1320, word: "forget", phonetic: "[fə 'get]]", type: "v.", meaning: "忘记" }, + { id: 1321, word: "keyed", phonetic: "[ki:d]]", type: "a.", meaning: "键控的" }, + { id: 1322, word: "overstrike", phonetic: "[ə uvə 'straik]]", type: "n.", meaning: "过打印" }, + { id: 1323, word: "tornado", phonetic: "[tɔ :ˈ neidə u]]", type: "n.", meaning: "旋风,龙卷风" }, + { id: 1324, word: "quotation", phonetic: "[kwə u'teiʃ ə n]]", type: "n.", meaning: "引证,引用(句)" }, + { id: 1325, word: "ones", phonetic: "[wʌ n]]", type: "n.", meaning: "二进制反码" }, + { id: 1326, word: "parse", phonetic: "[pɑ:z]]", type: "vt.", meaning: "(语法)分析" }, + { id: 1327, word: "experience", phonetic: "[iks'piə riə ns]]", type: "vt.", meaning: "& n. 试验" }, + { id: 1328, word: "manufacture", phonetic: "[ˌ mænju'fæktʃ ə ]]", type: "vt.", meaning: "& n. 制造(业),工业" }, + { id: 1329, word: "hundred", phonetic: "['hʌ ndrə d]]", type: "n.", meaning: "& a. (一)百,百个" }, + { id: 1330, word: "thousand", phonetic: "[ˈ θauzə nd]]", type: "n.", meaning: "& a. (一)千,无数的" }, + { id: 1331, word: "twentieth", phonetic: "['twentiiθ]]", type: "n.", meaning: "& a. 第二十(的)" }, + { id: 1332, word: "understanding", phonetic: "[ˌ ʌ ndə ˈ stændiŋ]]", type: "n.", meaning: "& a. 了解的,聪明的" }, + { id: 1333, word: "hand", phonetic: "[hænd]]", type: "n.", meaning: "& a. 手,手工(动)的" }, + { id: 1334, word: "restricting", phonetic: "[ris'triktiŋ]]", type: "n.", meaning: "& a. 限制(的)" }, + { id: 1335, word: "fancy", phonetic: "['fænsi]]", type: "n.", meaning: "& a. 想象(的),精制的" }, + { id: 1336, word: "wide", phonetic: "[waid]]", type: "a.", meaning: "& ad. 宽的,广阔的" }, + { id: 1337, word: "fine", phonetic: "[fain]]", type: "a.", meaning: "& ad. 微小的,细的" }, + { id: 1338, word: "worry", phonetic: "['wʌ ri]]", type: "v.", meaning: "& n. (使)烦恼" }, + { id: 1339, word: "somewhat", phonetic: "['sʌ mwɔ t]]", type: "pron.", meaning: "& ad. 稍微,有点" }, + { id: 1340, word: "quiet", phonetic: "['kwaiə t]]", type: "a.", meaning: "& n. 静态,静止的" }, + { id: 1341, word: "purge", phonetic: "[pə :dʒ ]]", type: "v.", meaning: "& n. 清除" }, + { id: 1343, word: "numeral", phonetic: "['nju:mə rə l]]", type: "n.", meaning: "& n. 数字的,数码" }, + { id: 1344, word: "whichever", phonetic: "[witʃ 'evə ]]", type: "a.", meaning: "& pron. 无论哪个" }, + { id: 1345, word: "purchase", phonetic: "['pə :tʃ ə s]]", type: "n.", meaning: "& v. 购买" }, + { id: 1346, word: "care", phonetic: "[kɛ ə ]]", type: "n.", meaning: "& v. 关心,注意" }, + { id: 1347, word: "watch", phonetic: "[wɔ tʃ ]]", type: "n.", meaning: "& v. 监视,观测" }, + { id: 1348, word: "endeavor", phonetic: "[inˈ devə ]]", type: "n.", meaning: "& v. 尽力,力图" }, + { id: 1349, word: "mismatch", phonetic: "[ˌ mis'mætʃ ]]", type: "n.", meaning: "& vt. 失配,不匹配" }, + { id: 1350, word: "printout", phonetic: "['printaut]]", type: "n.", meaning: "印出" }, + { id: 1351, word: "ellipsis", phonetic: "[i'lipsis]]", type: "n.", meaning: "省略符号,省略(法)" }, + { id: 1352, word: "ship", phonetic: "[ʃ ip]]", type: "n.", meaning: "舰,船" }, + { id: 1353, word: "british", phonetic: "[ˈ britiʃ ]]", type: "a.", meaning: "& n. 英国的;英国人" }, + { id: 1354, word: "parallel", phonetic: "['pærə lel]]", type: "a.", meaning: "并行" }, + { id: 1355, word: "custom", phonetic: "[ˈ kʌ stə m]]", type: "a.", meaning: "& n. 常规的,惯例;用户" }, + { id: 1357, word: "protection", phonetic: "[prə ˈ tekʃ ə n]]", type: "n.", meaning: "保护" }, + { id: 1358, word: "glass", phonetic: "[glɑ:s]]", type: "n.", meaning: "玻璃" }, + { id: 1359, word: "pattern", phonetic: "['pætə n]]", type: "n.", meaning: "模式" }, + { id: 1360, word: "insure", phonetic: "[in'ʃ uə ]]", type: "v.", meaning: "保证,保障" }, + { id: 1361, word: "stopping", phonetic: "['stɔ piŋ]]", type: "n.", meaning: "停止,制动(状态)" }, + { id: 1362, word: "factory", phonetic: "['fæktə ri]]", type: "n.", meaning: "工厂,制造厂" }, + { id: 1363, word: "implement", phonetic: "[ˈ implimə nt]]", type: "n.", meaning: "& vt. 工具;执行,实现" }, + { id: 1364, word: "effort", phonetic: "['efə t]]", type: "n.", meaning: "工作,研究计划" }, + { id: 1365, word: "worker", phonetic: "[ˈ wə :kə ]]", type: "n.", meaning: "工作人员" }, + { id: 1366, word: "ampersand", phonetic: "['æmpə sænd]]", type: "n.", meaning: "&号(and)" }, + { id: 1367, word: "deal", phonetic: "[di:l]]", type: "v.", meaning: "处理,分配,交易" }, + { id: 1368, word: "power", phonetic: "[ˈ pauə ]]", type: "n.", meaning: "功率,电源,幂" }, + { id: 1369, word: "difficulty", phonetic: "['difikə lti]]", type: "n.", meaning: "困难,难点" }, + { id: 1370, word: "lose", phonetic: "[lu:z]]", type: "n.", meaning: "失去,损失" }, + { id: 1371, word: "magic", phonetic: "[ˈ mædʒ ik]]", type: "n.", meaning: "魔术,幻术" }, + { id: 1372, word: "proprietary", phonetic: "[prə 'praiə tə ri]]", type: "a.", meaning: "专有的" }, + { id: 1373, word: "aware", phonetic: "[ə ˈ weə ]]", type: "a.", meaning: "知道的,察觉到的" }, + { id: 1374, word: "numerous", phonetic: "[ˈ nju:mə rə s]]", type: "a.", meaning: "为数众多的,无数的" }, + { id: 1375, word: "vowel", phonetic: "[ˈ vauə l]]", type: "n.", meaning: "元音,母音" }, + { id: 1376, word: "closely", phonetic: "['klə usli]]", type: "a.", meaning: "精密地,仔细地" }, + { id: 1377, word: "accuracy", phonetic: "['ækjurə si]]", type: "n.", meaning: "精确度,准确度" }, + { id: 1378, word: "traditional", phonetic: "[trə 'diʃ ə nə l]]", type: "a.", meaning: "传统的,惯例的" }, + { id: 1379, word: "synchronization", phonetic: "[ˌ siŋkrə nai'zeiʃ ə n]]", type: "n.", meaning: "同步" }, + { id: 1380, word: "fragment", phonetic: "['frægmə nt]]", type: "n.", meaning: "片段,段,分段" }, + { id: 1381, word: "primary", phonetic: "[ˈ praimə ri]]", type: "a.", meaning: "原始的,主要的" }, + { id: 1382, word: "safely", phonetic: "[ˈ seifli]]", type: "ad.", meaning: "安全地,确实地" }, + { id: 1383, word: "habit", phonetic: "['hæbit]]", type: "n.", meaning: "习惯" }, + { id: 1384, word: "comprise", phonetic: "[kə mˈ praiz]]", type: "vt.", meaning: "包括,由…组成" }, + { id: 1386, word: "absence", phonetic: "[ˈ æbsə ns]]", type: "n.", meaning: "缺少,没有" }, + { id: 1387, word: "revolutionize", phonetic: "[ˌ revə 'lu:ʃ ə naiz]]", type: "vt.", meaning: "变革,彻底改革" }, + { id: 1388, word: "constantly", phonetic: "[ˈ kɔ nstə ntli]]", type: "ad.", meaning: "不变地,经常地" }, + { id: 1389, word: "seldom", phonetic: "['seldə m]]", type: "ad.", meaning: "不常,很少,难得" }, + { id: 1390, word: "unfortunately", phonetic: "[ʌ nˈ fɔ :tʃ ə nitli]]", type: "ad.", meaning: "不幸,遗憾地" }, + { id: 1391, word: "expunge", phonetic: "[ikˈ spʌ ndʒ ]]", type: "vt.", meaning: "擦除,删掉" }, + { id: 1392, word: "security", phonetic: "[siˈ kjuə riti]]", type: "n.", meaning: "安全性,保密性" }, + { id: 1393, word: "touch", phonetic: "[tʌ tʃ ]]", type: "v.", meaning: "& n. 按,揿,触;触力" }, + { id: 1394, word: "contrast", phonetic: "[ˈ kɔ ntrɑ:st]]", type: "n.", meaning: "反差,对比,对比度" }, + { id: 1395, word: "invent", phonetic: "[inˈ vent]]", type: "vt.", meaning: "创造,想象" }, + { id: 1396, word: "reflect", phonetic: "[ri'flekt]]", type: "v.", meaning: "反射" }, + { id: 1397, word: "undone", phonetic: "[ˌ ʌ nˈ dʌ n]]", type: "a.", meaning: "未完成的" }, + { id: 1398, word: "unshift", phonetic: "[ʌ n'ʃ ift]]", type: "v.", meaning: "未移动,不移档" }, + { id: 1399, word: "complex", phonetic: "[ˈ kɔ mpleks]]", type: "a.", meaning: "& n. 复杂的;复数" }, + { id: 1400, word: "complexity", phonetic: "[kə mˈ pleksiti]]", type: "n.", meaning: "复杂性,复杂度" }, + { id: 1401, word: "creation", phonetic: "[kriˈ eiʃ ə n]]", type: "n.", meaning: "创造,创作" }, + { id: 1402, word: "unknown", phonetic: "[ˌ ʌ nˈ nə un]]", type: "a.", meaning: "未知的,无名的" }, + { id: 1403, word: "greatly", phonetic: "[ˈ greitli]]", type: "ad.", meaning: "大大地,非常" }, + { id: 1404, word: "cost", phonetic: "[kɔ st]]", type: "n.", meaning: "值,价值,成本" }, + { id: 1405, word: "degrade", phonetic: "[diˈ greid]]", type: "v.", meaning: "降低,减少,递降" }, + { id: 1406, word: "suggestion", phonetic: "[sə 'dʒ estʃ ə n]]", type: "n.", meaning: "暗示,提醒" }, + { id: 1407, word: "real", phonetic: "[riə l]]", type: "n.", meaning: "实数,实的,实型" }, + { id: 1408, word: "experimentation", phonetic: "[ikˌ sperimen'teiʃ n]]", type: "n.", meaning: "实验(工作,法)" }, + { id: 1409, word: "experiment", phonetic: "[ikˈ sperimə nt]]", type: "n.", meaning: "实验,试验(研究)" }, + { id: 1410, word: "substantial", phonetic: "[sə bˈ stænʃ ə l]]", type: "a.", meaning: "实质的,真正的" }, + { id: 1411, word: "solely", phonetic: "['sə ulli]]", type: "ad.", meaning: "独自,单独,只" }, + { id: 1412, word: "announce", phonetic: "[ə ˈ nauns]]", type: "vt.", meaning: "发表,宣布" }, + { id: 1413, word: "squeeze", phonetic: "[skwi:z]]", type: "v.", meaning: "挤压" }, + { id: 1414, word: "distribute", phonetic: "[di'stribjut]]", type: "vt.", meaning: "分布,配线,配给" }, + { id: 1415, word: "negate", phonetic: "[ni'geit]]", type: "vt.", meaning: "否定,求反,“非”" }, + { id: 1416, word: "capture", phonetic: "[ˈ kæptʃ ə ]]", type: "vt.", meaning: "俘获,捕捉" }, + { id: 1417, word: "father", phonetic: "[ˈ fɑ:ðə ]]", type: "n.", meaning: "父,上层(树节点的)" }, + { id: 1418, word: "reinstate", phonetic: "[ˌ ri:inˈ steit]]", type: "vt.", meaning: "复原,恢复" }, + { id: 1419, word: "tutorial", phonetic: "[ˌ ri:inˈ steit]]", type: "a.", meaning: "指导的" }, + { id: 1420, word: "nicety", phonetic: "[ˈ naisiti]]", type: "n.", meaning: "细节,精细" }, + { id: 1421, word: "roll", phonetic: "[rə ul]]", type: "n.", meaning: "& v. 案卷;卷动,滚动" }, + { id: 1422, word: "exponent", phonetic: "[eks'pə unə nt]]", type: "n.", meaning: "指数,阶,幂" }, + { id: 1423, word: "exponential", phonetic: "[ˌ ekspə u'nenʃ ə l]]", type: "a.", meaning: "指数的,幂的,阶的" }, + { id: 1425, word: "complicated", phonetic: "[ˈ kɔ mplikeitid]]", type: "v.", meaning: "使复杂化,使混乱" }, + { id: 1426, word: "reactivate", phonetic: "[riˈ æktiveit]]", type: "v.", meaning: "使恢复活动" }, + { id: 1427, word: "spread", phonetic: "[spred]]", type: "v.", meaning: "展开,传播" }, + { id: 1428, word: "synchronize", phonetic: "[ˈ siŋkrə naiz]]", type: "v.", meaning: "使同步" }, + { id: 1429, word: "formation", phonetic: "[fɔ :'meiʃ ə n]]", type: "n.", meaning: "构造,结构,形成" }, + { id: 1430, word: "widely", phonetic: "['waidli]]", type: "ad.", meaning: "广泛,很远" }, + { id: 1431, word: "comma", phonetic: "[ˈ kɔ mə ]]", type: "n.", meaning: "逗号“,”,逗点" }, + { id: 1432, word: "very", phonetic: "[ˈ veri]]", type: "ad.", meaning: "很,非常,最" }, + { id: 1433, word: "unnecessary", phonetic: "[ʌ nˈ nesə sə ri]]", type: "a.", meaning: "不必要的,多余的" }, + { id: 1434, word: "unchanged", phonetic: "[ʌ nˈ tʃ eindʒ d]]", type: "a.", meaning: "不变的" }, + { id: 1435, word: "cross", phonetic: "[krɔ s]]", type: "n.", meaning: "交叉,十字准线" }, + { id: 1436, word: "yet", phonetic: "[jet]]", type: "ad.", meaning: "还,仍然,至今" }, + { id: 1437, word: "slowly", phonetic: "[ˈ slə uli]]", type: "ad.", meaning: "缓慢地" }, + { id: 1438, word: "inexperienced", phonetic: "[ˌ iniksˈ piə riə nst]]", type: "a.", meaning: "不熟练的,外行的" }, + { id: 1439, word: "noninteractive", phonetic: "['nɔ nintə 'æktiv]]", type: "a.", meaning: "不相关的,非交互的" }, + { id: 1440, word: "unwanted", phonetic: "['ʌ n'wɔ ntid]]", type: "a.", meaning: "不需要的,多余的" }, + { id: 1441, word: "unused", phonetic: "[ˌ ʌ nˈ ju:zd]]", type: "a.", meaning: "不用的,空着的" }, + { id: 1442, word: "unmarked", phonetic: "[ˌ ʌ n'mɑ:kt]]", type: "a.", meaning: "没有标记的" }, + { id: 1443, word: "nothing", phonetic: "[ˈ nʌ θiŋ]]", type: "n.", meaning: "没有任何东西" }, + { id: 1444, word: "chart", phonetic: "[tʃ ɑ:t]]", type: "n.", meaning: "图(表)" }, + { id: 1445, word: "dearly", phonetic: "[ˈ diə li]]", type: "ad.", meaning: "极,非常,昂贵地" }, + { id: 1446, word: "extremely", phonetic: "[ikˈ stri:mli]]", type: "ad.", meaning: "极端地,非常" }, + { id: 1447, word: "hardly", phonetic: "[ˈ hɑ:dli]]", type: "ad.", meaning: "几乎不,未必" }, + { id: 1448, word: "placement", phonetic: "['pleismə nt]]", type: "n.", meaning: "布局" }, + { id: 1449, word: "think", phonetic: "[θiŋk]]", type: "v.", meaning: "考虑,以为,判断" }, + { id: 1450, word: "technical", phonetic: "['teknikə l]]", type: "a.", meaning: "技术的,专业的" }, + { id: 1451, word: "idea", phonetic: "[ai'diə ]]", type: "n.", meaning: "思想,观念" }, + { id: 1452, word: "stamp", phonetic: "[stæmp]]", type: "n.", meaning: "图章" }, + { id: 1453, word: "indirectly", phonetic: "[ˌ indiˈ rektli]]", type: "ad.", meaning: "间接地" }, + { id: 1454, word: "equation", phonetic: "[iˈ kweiʃ ə n]]", type: "n.", meaning: "方程,方程式" }, + { id: 1455, word: "smooth", phonetic: "[smu:ð]]", type: "v.", meaning: "& a. 平滑;平滑的" }, + { id: 1456, word: "attached", phonetic: "[ə ˈ tætʃ ]]", type: "a.", meaning: "附加的" }, + { id: 1457, word: "average", phonetic: "[ˈ ævə ridʒ ]]", type: "n.", meaning: "平均,平均数" }, + { id: 1458, word: "quietly", phonetic: "[ˈ kwaiə tli]]", type: "ad.", meaning: "静静地" }, + { id: 1459, word: "discard", phonetic: "[disˈ kɑ:d]]", type: "v.", meaning: "删除,废除,放弃" }, + { id: 1460, word: "never", phonetic: "[ˈ nevə ]]", type: "ad.", meaning: "决不,从来不" }, + { id: 1461, word: "initiate", phonetic: "[iˈ niʃ ieit]]", type: "vt.", meaning: "开创,起始" }, + { id: 1462, word: "powerful", phonetic: "[ˈ pauə fə l]]", type: "a.", meaning: "强大的,大功率的" }, + { id: 1463, word: "purpose", phonetic: "['pə :pə s]]", type: "n.", meaning: "& vt. 目的,用途;打算" }, + { id: 1464, word: "regard", phonetic: "[ri'gɑ:d]]", type: "vt.", meaning: "考虑,注意,关系" }, + { id: 1465, word: "daily", phonetic: "['deili]]", type: "a.", meaning: "每日的,日常的" }, + { id: 1466, word: "possibly", phonetic: "[ˈ pɔ sə bli]]", type: "ad.", meaning: "可能地,合理地" }, + { id: 1467, word: "potentially", phonetic: "[pə 'tenʃ ə li]]", type: "ad.", meaning: "可能地,大概地" }, + { id: 1468, word: "moreover", phonetic: "[mɔ :ˈ rə uvə ]]", type: "ad.", meaning: "况且,并且,此外" }, + { id: 1469, word: "american", phonetic: "[ə ˈ merikə n]]", type: "a.", meaning: "美国的" }, + { id: 1470, word: "guard", phonetic: "[gɑ:d]]", type: "v.", meaning: "& n. 防护;防护装置" }, + { id: 1471, word: "world", phonetic: "[wə :ld]]", type: "n.", meaning: "世界,全球" }, + { id: 1472, word: "independent", phonetic: "[ˌ indiˈ pendə nt]]", type: "a.", meaning: "独立的" }, + { id: 1473, word: "independently", phonetic: "[ˌ indiˈ pendə ntli]]", type: "a.", meaning: "独立地" }, + { id: 1474, word: "continuously", phonetic: "[kə n'tinjuə sli]]", type: "ad.", meaning: "连续不断地" }, + { id: 1475, word: "shield", phonetic: "['ʃ i:ld]]", type: "v.", meaning: "屏蔽,罩,防护" }, + { id: 1476, word: "glance", phonetic: "['ʃ i:ld]]", type: "n.", meaning: "闪烁" }, + { id: 1477, word: "happening", phonetic: "['hæpə niŋ]]", type: "n.", meaning: "事件,偶然发生的事" }, + { id: 1478, word: "transaction", phonetic: "[træn'zækʃ ə n]]", type: "n.", meaning: "事项,事务,学报" }, + { id: 1479, word: "emulation", phonetic: "[ˌ emju'leiʃ ə n]]", type: "n.", meaning: "仿真,仿效" }, + { id: 1480, word: "strike", phonetic: "[straik]]", type: "v.", meaning: "敲,击" }, + { id: 1481, word: "dump", phonetic: "[dʌ mp]]", type: "v.", meaning: "(内存信息)转储" }, + { id: 1482, word: "occasionally", phonetic: "[ə 'keiʒ ə nə li]]", type: "ad.", meaning: "偶尔(地),不时" }, + { id: 1483, word: "tension", phonetic: "['tenʃ ə n]]", type: "n.", meaning: "张力" }, + { id: 1484, word: "probable", phonetic: "['prɔ bə bl]]", type: "a.", meaning: "概率的,可能的" }, + { id: 1485, word: "talent", phonetic: "[ˈ tælə nt]]", type: "n.", meaning: "才能,技能,人才" }, + { id: 1486, word: "financial", phonetic: "[fə ˈ nænʃ ə l]]", type: "a.", meaning: "财务的,金融的" }, + { id: 1487, word: "meter", phonetic: "[ˈ mi:tə ]]", type: "n.", meaning: "仪表,米" }, + { id: 1488, word: "logged", phonetic: "[lɔ :gd]]", type: "a.", meaning: "记录的,浸透的" }, + { id: 1489, word: "ware", phonetic: "[wɛ ə ]]", type: "n.", meaning: "仪器,商品" }, + { id: 1490, word: "disregard", phonetic: "[ˌ disri'gɑ:d]]", type: "vt.", meaning: "轻视,把…忽略不计" }, + { id: 1491, word: "waiting", phonetic: "[ˈ weitiŋ]]", type: "a.", meaning: "等待的" }, + { id: 1492, word: "preceding", phonetic: "[pri(:)ˈ si:diŋ]]", type: "a.", meaning: "先的,以前的" }, + { id: 1493, word: "comparison", phonetic: "[kə mˈ pærisə n]]", type: "n.", meaning: "比较,对照" }, + { id: 1494, word: "advanced", phonetic: "[ə dˈ vɑ:nst]]", type: "a.", meaning: "先进的,预先的" }, + { id: 1495, word: "rate", phonetic: "[reit]]", type: "n.", meaning: "比率,速率,费率" }, + { id: 1496, word: "fly", phonetic: "[flai]]", type: "v.", meaning: "飞,跳过" }, + { id: 1497, word: "programmable", phonetic: "['prə ugræmə bə l]]", type: "a.", meaning: "可编程的" }, + { id: 1498, word: "definable", phonetic: "[di'fainə bl]]", type: "a.", meaning: "可定义的,可确定的" }, + { id: 1499, word: "readable", phonetic: "['ri:də bl]]", type: "a.", meaning: "可读的" }, + { id: 1500, word: "recoverable", phonetic: "[ri'kʌ və rə bl]]", type: "a.", meaning: "可恢复的,可回收的" }, + { id: 1501, word: "possibility", phonetic: "[ˌ pɔ sə ˈ biliti]]", type: "n.", meaning: "可能性" }, + { id: 1502, word: "finisher", phonetic: "['finiʃ ə (r)]]", type: "n.", meaning: "成品机" }, + { id: 1503, word: "applicable", phonetic: "[ˈ æplikə bə l]]", type: "a.", meaning: "可适用的,合适的" }, + { id: 1504, word: "printable", phonetic: "['printə bl]]", type: "a.", meaning: "可印刷的" }, + { id: 1505, word: "executable", phonetic: "['eksikju:tə bə l]]", type: "a.", meaning: "可执行的" }, + { id: 1506, word: "essentially", phonetic: "[iˈ senʃ ə li]]", type: "ad.", meaning: "实质上,本来" }, + { id: 1507, word: "confuse", phonetic: "[kə nˈ fju:z]]", type: "vt.", meaning: "使混乱,干扰" }, + { id: 1508, word: "familiarize", phonetic: "[fə 'miljuraiz]]", type: "vt.", meaning: "使熟悉,使通俗化" }, + { id: 1509, word: "employe", phonetic: "[ˌ emplɔ iˈ i:]]", type: "vt.", meaning: "使用,花费" }, + { id: 1510, word: "suitable", phonetic: "[ˈ su:tə bə l, ˈ sju:-]]", type: "a.", meaning: "适合的,相适宜的" }, + { id: 1511, word: "generation", phonetic: "[ˌ dʒ enə ˈ reiʃ ə n]]", type: "n.", meaning: "(世)代,(发展)阶段" }, + { id: 1512, word: "quality", phonetic: "[ˈ kwɔ liti]]", type: "n.", meaning: "质量,性质,属性" }, + { id: 1513, word: "defective", phonetic: "[diˈ fektiv]]", type: "a.", meaning: "故障的,有毛病的" }, + { id: 1514, word: "interpretable", phonetic: "[in'tə :pritə bl]]", type: "a.", meaning: "彼此协作的" }, + { id: 1515, word: "interest", phonetic: "[ˈ intrist]]", type: "n.", meaning: "兴趣,注意,影响" }, + { id: 1516, word: "fourscore", phonetic: "[ˈ fɔ :ˈ skɔ :]]", type: "n.", meaning: "八十" }, + { id: 1517, word: "teach", phonetic: "[ti:tʃ ]]", type: "v.", meaning: "教,讲授" }, + { id: 1518, word: "procedural", phonetic: "[prə u'si:dʒ ə rə l]]", type: "a.", meaning: "程序上的" }, + { id: 1519, word: "phrase", phonetic: "[freiz]]", type: "n.", meaning: "短语,成语" }, + { id: 1520, word: "specifically", phonetic: "[spiˈ sifikə li]]", type: "ad.", meaning: "特别地,逐一地" }, + { id: 1521, word: "penalty", phonetic: "['penə lti]]", type: "n.", meaning: "惩罚,罚款,负担" }, + { id: 1522, word: "violate", phonetic: "[ˈ vaiə leit]]", type: "vt.", meaning: "违犯,妨碍,破坏" }, + { id: 1523, word: "indefinitely", phonetic: "[inˈ defə nitli]]", type: "ad.", meaning: "无限地,无穷地" }, + { id: 1524, word: "major", phonetic: "[ˈ meidʒ ə ]]", type: "a.", meaning: "较大的,主要的" }, + { id: 1525, word: "higher", phonetic: "['haiə (r)]]", type: "a.", meaning: "较高的" }, + { id: 1526, word: "wise", phonetic: "[waiz]]", type: "a.", meaning: "聪明的" }, + { id: 1527, word: "becoming", phonetic: "[biˈ kʌ miŋ]]", type: "a.", meaning: "合适的,相称的" }, + { id: 1528, word: "equally", phonetic: "[ˈ i:kwə li]]", type: "ad.", meaning: "相等地,相同地" }, + { id: 1529, word: "enjoy", phonetic: "[inˈ dʒ ɔ i]]", type: "vt.", meaning: "享受,欣赏,喜爱" }, + { id: 1530, word: "forth", phonetic: "[fɔ :θ]]", type: "ad.", meaning: "向前" }, + { id: 1531, word: "disappear", phonetic: "[ˌ disə ˈ piə ]]", type: "vi.", meaning: "消失" }, + { id: 1532, word: "crop", phonetic: "[krɔ p]]", type: "v.", meaning: "切,剪切" }, + { id: 1533, word: "diagonally", phonetic: "[dai'ægə nə li]]", type: "ad.", meaning: "斜(对)" }, + { id: 1534, word: "labeled", phonetic: "['leibld]]", type: "a.", meaning: "有标号的" }, + { id: 1535, word: "decision", phonetic: "[di'siʒ ə n]]", type: "n.", meaning: "判定,决定,决策" }, + { id: 1536, word: "effective", phonetic: "[i'fektiv]]", type: "a.", meaning: "有效的" }, + { id: 1537, word: "significant", phonetic: "[sigˈ nifikə nt]]", type: "a.", meaning: "有效的,有意义的" }, + { id: 1538, word: "avail", phonetic: "[ə ˈ veil]]", type: "v.", meaning: "& n. 有益于;利益" }, + { id: 1539, word: "hang", phonetic: "[hænd]]", type: "v.", meaning: "中止,暂停,挂起" }, + { id: 1540, word: "craze", phonetic: "[kreiz]]", type: "n.", meaning: "& v. 裂纹开裂" }, + { id: 1541, word: "consequently", phonetic: "[ˈ kɔ nsikwə ntli]]", type: "ad.", meaning: "因此,从而" }, + { id: 1542, word: "introduce", phonetic: "[ˈ intrə ˈ dju:s]]", type: "vt.", meaning: "引进,引导" }, + { id: 1543, word: "team", phonetic: "[ti:m]]", type: "n.", meaning: "队,小组" }, + { id: 1544, word: "visual", phonetic: "[ˈ viʒ juə l]]", type: "a.", meaning: "视觉的,直观的" }, + { id: 1545, word: "acknowledgment", phonetic: "[ə kˈ nɔ lidʒ mə nt]]", type: "n.", meaning: "接收(收妥),承认" }, + { id: 1546, word: "efficiently", phonetic: "[iˈ fiʃ ə ntli]]", type: "ad.", meaning: "有效地" }, + { id: 1547, word: "predict", phonetic: "[priˈ dikt]]", type: "vt.", meaning: "预测,预言" }, + { id: 1548, word: "anticipate", phonetic: "[ænˈ tisipeit]]", type: "vt.", meaning: "预先考虑,抢…先" }, + { id: 1549, word: "bypass", phonetic: "[ˈ baipɑ:s]]", type: "n.", meaning: "旁路" }, + { id: 1550, word: "nature", phonetic: "[ˈ neitʃ ə ]]", type: "n.", meaning: "自然,天然" }, + { id: 1551, word: "natural", phonetic: "[ˈ nætʃ ə rə l]]", type: "a.", meaning: "自然的" }, + { id: 1552, word: "grant", phonetic: "[grɑ:nt]]", type: "vt.", meaning: "允许,授权" }, + { id: 1553, word: "logarithm", phonetic: "['lɔ gə ˌ riðə m]]", type: "n.", meaning: "对数" }, + { id: 1554, word: "reappears", phonetic: "[ˌ ri:ə ˈ piə ]]", type: "vi.", meaning: "再现,重现" }, + { id: 1555, word: "reload", phonetic: "[ri:'lə ud]]", type: "vt.", meaning: "再装入" }, + { id: 1556, word: "occupy", phonetic: "[ˈ ɔ kjupai]]", type: "vt.", meaning: "占有,充满" }, + { id: 1557, word: "photograph", phonetic: "[ˈ fə utə grɑ:f]]", type: "n.", meaning: "照片;v.照相" }, + { id: 1558, word: "terminating", phonetic: "['tə :mineitiŋ]]", type: "n.", meaning: "终止,终结,收信" }, + { id: 1559, word: "resolve", phonetic: "[ri'zɔ lv]]", type: "v.", meaning: "分辨,解像" }, + { id: 1560, word: "unsafe", phonetic: "['ʌ n'seif]]", type: "v.", meaning: "恢复" }, + { id: 1561, word: "separator", phonetic: "['sepə reitə ]]", type: "n.", meaning: "分隔符" }, + { id: 1562, word: "hierarchical", phonetic: "[ˌ haiə 'rɑ:kikl]]", type: "a.", meaning: "分级的,分层的" }, + { id: 1563, word: "assortment", phonetic: "[ə ˈ sɔ :tmə nt]]", type: "n.", meaning: "种类,花色品种" }, + { id: 1564, word: "growing", phonetic: "['grə uiŋ]]", type: "n.", meaning: "分类,分组,成群" }, + { id: 1565, word: "discussion", phonetic: "[di'skʌʃə n]]", type: "n.", meaning: "讨论,商议,论述" }, + { id: 1566, word: "alphabet", phonetic: "[ˈ ælfə bet]]", type: "n.", meaning: "字母,字母表" }, + { id: 1567, word: "scattered", phonetic: "['skætə d]]", type: "a.", meaning: "分散的" }, + { id: 1568, word: "eventually", phonetic: "[iˈ ventʃ uə li]]", type: "ad.", meaning: "终于,最后" }, + { id: 1569, word: "finally", phonetic: "[ˈ fainə li]]", type: "ad.", meaning: "终于,最后" }, + { id: 1570, word: "subgroup", phonetic: "['sʌ bgru:p]]", type: "n.", meaning: "分组,子群" }, + { id: 1571, word: "superimpose", phonetic: "[ˌ su:pə rimˈ pə uz, ˌsju:-]]", type: "vt.", meaning: "重叠,叠加" }, + { id: 1572, word: "reorganization", phonetic: "[ˌ ri:ɔ :gə naiˈ zeiʃ ə n]]", type: "vt.", meaning: "重排,改组" }, + { id: 1573, word: "rewrite", phonetic: "[ˌ ri:ˈ rait]]", type: "vt.", meaning: "重写,再生" }, + { id: 1574, word: "university", phonetic: "[ˌ ju:niˈ və :siti]]", type: "n.", meaning: "(综合性)大学" }, + { id: 1575, word: "deter", phonetic: "[diˈ tə :]]", type: "vt.", meaning: "阻止,拦住,妨碍" }, + { id: 1576, word: "pool", phonetic: "[pu:l]]", type: "n.", meaning: "& v. 池,坑;共享" }, + { id: 1577, word: "moment", phonetic: "[ˈ mə umə nt]]", type: "n.", meaning: "矩,力矩,磁矩" }, + { id: 1578, word: "shut", phonetic: "[ʃ ʌ t]]", type: "v.", meaning: "关闭" }, + { id: 1579, word: "closed", phonetic: "[klə uzd]]", type: "a.", meaning: "关闭的,闭迹" }, + { id: 1580, word: "respond", phonetic: "[riˈ spɔ nd]]", type: "v.", meaning: "回答,响应" }, + { id: 1581, word: "repeating", phonetic: "[riˈ pi:t]]", type: "n.", meaning: "重复,循环" }, + { id: 1582, word: "repetitive", phonetic: "[ri'petitiv]]", type: "a.", meaning: "重复的" }, + { id: 1583, word: "reenter", phonetic: "[ˌ ri:'entə ]]", type: "v.", meaning: "重新进入" }, + { id: 1584, word: "rearrange", phonetic: "['ri:ə 'reindʒ ]]", type: "v.", meaning: "重新整理,重新排序" }, + { id: 1585, word: "rectangular", phonetic: "[rekˈ tæŋgjulə ]]", type: "a.", meaning: "矩形的,成直角的" }, + { id: 1586, word: "tag", phonetic: "[tæg]]", type: "n.", meaning: "特征,标记,标识符" }, + { id: 1587, word: "suppose", phonetic: "[sə 'pə uz]]", type: "v.", meaning: "假定,推测" }, + { id: 1588, word: "supposed", phonetic: "[sə 'pə uzd]]", type: "a.", meaning: "假定的,推测的" }, + { id: 1589, word: "manipulating", phonetic: "[mə ˈ nipjuleit]]", type: "v.", meaning: "操纵,操作" }, + { id: 1590, word: "operator", phonetic: "[ˈ ɔ pə reitə ]]", type: "n.", meaning: "操作员,运算符" }, + { id: 1591, word: "masking", phonetic: "['mɑ:skiŋ]]", type: "n.", meaning: "掩蔽,屏蔽" }, + { id: 1592, word: "price", phonetic: "[prais]]", type: "n.", meaning: "价格" }, + { id: 1593, word: "demonstrate", phonetic: "['demə nstreit]]", type: "v.", meaning: "论证,证明,证实" }, + { id: 1594, word: "importance", phonetic: "[imˈ pɔ :tə ns]]", type: "n.", meaning: "价值,重要" }, + { id: 1595, word: "pipe", phonetic: "[paip]]", type: "n.", meaning: "管,导管" }, + { id: 1596, word: "overall", phonetic: "[ˈ ə uvə rɔ :l]]", type: "a.", meaning: "总共的,全部的" }, + { id: 1597, word: "turnkey", phonetic: "['tə :nki:]]", type: "n.", meaning: "总控钥匙" }, + { id: 1598, word: "restricted", phonetic: "[ris'triktid]]", type: "a.", meaning: "受限制的,受约束的" }, + { id: 1599, word: "suspension", phonetic: "[sə ˈ spenʃ ə n]]", type: "n.", meaning: "暂停,中止,挂起" }, + { id: 1600, word: "seamless", phonetic: "['si:mlis]]", type: "a.", meaning: "无缝的" }, + { id: 1601, word: "clipper", phonetic: "['klipə ]]", type: "n.", meaning: "限幅器,钳位器" }, + { id: 1602, word: "unsigned", phonetic: "['ʌ n'saind]]", type: "a.", meaning: "无符号的" }, + { id: 1603, word: "unformatted", phonetic: "[ʌ n'fɔ :mætid]]", type: "a.", meaning: "无格式的" }, + { id: 1604, word: "infinite", phonetic: "['infinit]]", type: "a.", meaning: "无限的,无穷的" }, + { id: 1605, word: "useless", phonetic: "['ju:slis]]", type: "a.", meaning: "无用的" }, + { id: 1606, word: "limiter", phonetic: "['limitə ]]", type: "n.", meaning: "限制(幅)器" }, + { id: 1607, word: "mountain", phonetic: "['mauntin]]", type: "n.", meaning: "高山,山脉" }, + { id: 1608, word: "redundant", phonetic: "[ri'dʌ ndə nt]]", type: "a.", meaning: "冗余的" }, + { id: 1609, word: "dependent", phonetic: "[di'pendə nt]]", type: "a.", meaning: "相关的" }, + { id: 1610, word: "contiguous", phonetic: "[kə n'tigjuə s]]", type: "a.", meaning: "相连的,邻接的" }, + { id: 1611, word: "consistent", phonetic: "[kə n'sistə nt]]", type: "a.", meaning: "相容的,一致的" }, + { id: 1612, word: "multiprocessing", phonetic: "['mʌ ltiˌ prə usesiŋ]]", type: "n.", meaning: "多重处理,多道处理" }, + { id: 1613, word: "architecture", phonetic: "[ˈ ɑ:kitektʃ ə ]]", type: "n.", meaning: "结构,构造" }, + { id: 1614, word: "structural", phonetic: "[ˈ strʌ ktʃ ə rə l]]", type: "a.", meaning: "结构的,结构上的" }, + { id: 1615, word: "outcome", phonetic: "[ˈ autkʌ m]]", type: "n.", meaning: "结果,成果,输出" }, + { id: 1616, word: "association", phonetic: "[ə ˌ sə usiˈ eiʃ ə n]]", type: "n.", meaning: "结合,协会,联想" }, + { id: 1617, word: "opinion", phonetic: "[ə ˈ pinjə n]]", type: "n.", meaning: "意见,见解,判断" }, + { id: 1618, word: "interpret", phonetic: "[inˈ tə :prit]]", type: "v.", meaning: "解释" }, + { id: 1619, word: "explanatory", phonetic: "[iks'plænə tə ri]]", type: "a.", meaning: "解释(性)的" }, + { id: 1620, word: "assemble", phonetic: "[ə ˈ sembə l]]", type: "v.", meaning: "汇编,装配" }, + { id: 1621, word: "assembler", phonetic: "[ə 'semblə ]]", type: "n.", meaning: "汇编程序" }, + { id: 1623, word: "arithmetic", phonetic: "[ə ˈ riθmə tik]]", type: "n.", meaning: "算术,运算" }, + { id: 1624, word: "varying", phonetic: "['vɛ ə riŋ]]", type: "a.", meaning: "变化的,可变的" }, + { id: 1625, word: "representative", phonetic: "[repri'zentə tiv]]", type: "a.", meaning: "典型的,表示的" }, + { id: 1626, word: "typical", phonetic: "['tipikə l]]", type: "a.", meaning: "典型的,标准的" }, + { id: 1627, word: "sufficient", phonetic: "[sə ˈ fiʃ ə nt]]", type: "a.", meaning: "充足的,足够的" }, + { id: 1628, word: "blast", phonetic: "[blɑ:st]]", type: "v.", meaning: "& n. 清除;爆炸" }, + { id: 1629, word: "clean", phonetic: "[kli:n]]", type: "a.", meaning: "清洁的,干净的" }, + { id: 1630, word: "caret", phonetic: "[ˈ kærit]]", type: "n.", meaning: "插入符号" }, + { id: 1631, word: "socket", phonetic: "[ˈ sɔ kit]]", type: "n.", meaning: "插座,插孔,插口" }, + { id: 1632, word: "stated", phonetic: "['steitid]]", type: "a.", meaning: "规定的" }, + { id: 1633, word: "protocol", phonetic: "[ˈ prə utə kɔ l]]", type: "n.", meaning: "规约,协议,规程" }, + { id: 1634, word: "presence", phonetic: "[ˈ prezə ns]]", type: "n.", meaning: "存在,有" }, + { id: 1635, word: "telephone", phonetic: "[ˈ telifə un]]", type: "n.", meaning: "电话" }, + { id: 1636, word: "social", phonetic: "['sə uʃ ə l]]", type: "a.", meaning: "社会的" }, + { id: 1637, word: "equipment", phonetic: "[iˈ kwipmə nt]]", type: "n.", meaning: "设备,装备,仪器" }, + { id: 1638, word: "lending", phonetic: "['lendiŋ]]", type: "n.", meaning: "& a. 借给,出租;借出的" }, + { id: 1639, word: "book", phonetic: "[buk]]", type: "n.", meaning: "书,手册,源程序块" }, + { id: 1640, word: "circumstances", phonetic: "[ˈ sə :kə mstə ns]]", type: "n.", meaning: "情况,环境,细节" }, + { id: 1641, word: "situation", phonetic: "[ˌ sitʃ uˈ eiʃ (ə )n]]", type: "n.", meaning: "情况,状况,势态" }, + { id: 1642, word: "desk", phonetic: "[desk]]", type: "n.", meaning: "书桌,控制台,面板" }, + { id: 1643, word: "please", phonetic: "[pli:z]]", type: "v.", meaning: "请" }, + { id: 1644, word: "mixture", phonetic: "[ˈ mikstʃ ə ]]", type: "n.", meaning: "混合物" }, + { id: 1645, word: "representation", phonetic: "[ˌ reprizenˈ teiʃ ə n]]", type: "n.", meaning: "表示" }, + { id: 1646, word: "esoteric", phonetic: "[ˌ esə u'terik]]", type: "a.", meaning: "深奥的,奥秘的" }, + { id: 1647, word: "depth", phonetic: "[depθ]]", type: "n.", meaning: "深度,浓度(颜色的)" }, + { id: 1648, word: "final", phonetic: "[ˈ fainə l]]", type: "a.", meaning: "最终的" }, + { id: 1649, word: "physically", phonetic: "[ˈ fizikə li]]", type: "a.", meaning: "物理上,实际上" }, + { id: 1650, word: "aid", phonetic: "[eid]]", type: "n.", meaning: "帮助,辅助程序" }, + { id: 1651, word: "successive", phonetic: "[sə kˈ sesiv]]", type: "a.", meaning: "逐次的,相继的" }, + { id: 1652, word: "succession", phonetic: "[sə kˈ seʃ ə n]]", type: "n.", meaning: "逐次性,连续性" }, + { id: 1653, word: "unpack", phonetic: "['ʌ n'pæk]]", type: "v.", meaning: "拆开,卸,分开" }, + { id: 1654, word: "chunk", phonetic: "[tʃ ʌ ŋk]]", type: "n.", meaning: "厚块,大部分" }, + { id: 1655, word: "alignment", phonetic: "[ə 'lainmə nt]]", type: "n.", meaning: "序列,成直线" }, + { id: 1656, word: "typewriter", phonetic: "['taipˌ raitə ]]", type: "n.", meaning: "打字机" }, + { id: 1657, word: "big", phonetic: "[big]]", type: "a.", meaning: "大的,重要的" }, + { id: 1658, word: "tone", phonetic: "[tə un]]", type: "n.", meaning: "音调,音色,色调" }, + { id: 1659, word: "sensitive", phonetic: "[ˈ sensitiv]]", type: "a.", meaning: "敏感的,灵敏的" }, + { id: 1660, word: "reduction", phonetic: "[riˈ dʌ kʃ ə n]]", type: "n.", meaning: "减化,还原,减少" }, + { id: 1661, word: "indentation", phonetic: "[ˌ indenˈ teiʃ ə n]]", type: "n.", meaning: "缩进,缩排" }, + { id: 1662, word: "terminology", phonetic: "[ˌ tə :miˈ nɔ lə dʒ i]]", type: "n.", meaning: "术语" }, + { id: 1663, word: "ascending", phonetic: "[ə 'sendiŋ]]", type: "a.", meaning: "增长的,向上的" }, + { id: 1664, word: "augment", phonetic: "[ɔ :gˈ ment]]", type: "v.", meaning: "增加,添加,扩充" }, + { id: 1665, word: "increment", phonetic: "['inkrimə nt]]", type: "n.", meaning: "增量,加1,递增" }, + { id: 1666, word: "gain", phonetic: "[gein]]", type: "n.", meaning: "增益(系数)" }, + { id: 1667, word: "stream", phonetic: "[stri:m]]", type: "n.", meaning: "流" }, + { id: 1668, word: "obsolete", phonetic: "['ɔ bsə ˌ li:t]]", type: "a.", meaning: "作废的,过时的" }, + { id: 1669, word: "accommodate", phonetic: "[ə 'kɔ mə deit]]", type: "v.", meaning: "调节,适应" }, + { id: 1670, word: "motif", phonetic: "[mə uˈ ti:f]]", type: "n.", meaning: "主题,要点,特色" }, + { id: 1671, word: "subject", phonetic: "[ˈ sʌ bdʒ ikt]]", type: "n.", meaning: "主题,源" }, + { id: 1672, word: "job", phonetic: "[dʒ ɔ b]]", type: "n.", meaning: "作业" }, + { id: 1673, word: "differentiate", phonetic: "[ˌ difə ˈ renʃ ieit]]", type: "v.", meaning: "区别,分辨" }, + { id: 1674, word: "distinction", phonetic: "[diˈ stiŋkʃ ə n]]", type: "n.", meaning: "区别,相异,特性" }, + { id: 1675, word: "distinguish", phonetic: "[diˈ stiŋgwiʃ ]]", type: "v.", meaning: "区别,辨识" }, + { id: 1676, word: "locking", phonetic: "[lɔ kiŋ]]", type: "n.", meaning: "锁定,加锁" }, + { id: 1677, word: "progress", phonetic: "[prə u'gres]]", type: "n.", meaning: "进度,进展" }, + { id: 1678, word: "fundamental", phonetic: "[ˌ fʌ ndə 'mentl]]", type: "a.", meaning: "基本的,根本的" }, + { id: 1679, word: "basis", phonetic: "[ˈ beisis]]", type: "n.", meaning: "基础,座" }, + { id: 1680, word: "underlying", phonetic: "[ˌ ʌ ndə ˈ laiiŋ]]", type: "a.", meaning: "基础的,根本的" }, + { id: 1681, word: "sound", phonetic: "[saund]]", type: "n.", meaning: "声音,音响" }, + { id: 1682, word: "vital", phonetic: "[ˈ vaitl]]", type: "a.", meaning: "生动的,不可缺少的" }, + { id: 1683, word: "national", phonetic: "[ˈ næʃ ə n(ə )l]]", type: "a.", meaning: "国家的" }, + { id: 1684, word: "sale", phonetic: "[seil]]", type: "n.", meaning: "销售,销路" }, + { id: 1685, word: "agree", phonetic: "[ə ˈ gri:]]", type: "v.", meaning: "符合,相同" }, + { id: 1686, word: "iterative", phonetic: "['itə rə tiv]]", type: "a.", meaning: "迭代的" }, + { id: 1687, word: "inclusive", phonetic: "[inˈ klu:siv]]", type: "a.", meaning: "包括的,内含的" }, + { id: 1688, word: "charm", phonetic: "[tʃ ɑ:m]]", type: "n.", meaning: "吸引力" }, + { id: 1689, word: "hit", phonetic: "[hit]]", type: "v.", meaning: "命中,瞬时干扰" }, + { id: 1690, word: "course", phonetic: "[kɔ :s]]", type: "n.", meaning: "过程,航向,课程" }, + { id: 1691, word: "exceeded", phonetic: "[ikˈ si:d]]", type: "a.", meaning: "过度的,非常的" }, + { id: 1692, word: "numerical", phonetic: "[nju:ˈ merikə l]]", type: "a.", meaning: "数量的,数字的" }, + { id: 1693, word: "digital", phonetic: "['didʒ itə l]]", type: "a.", meaning: "数字的" }, + { id: 1694, word: "combo", phonetic: "[ˈ kɔ mbə u]]", type: "n.", meaning: "二进位组合码" }, + { id: 1695, word: "cord", phonetic: "[kɔ :d]]", type: "n.", meaning: "绳子,电线" } +]; + +// 导出数据供其他文件使用 +if (typeof module !== 'undefined' && module.exports) { + module.exports = vocabularyData; +} diff --git a/InfoGenie-frontend/public/60sapi/生成要求模板.txt b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/生成要求模板.txt old mode 100755 new mode 100644 similarity index 90% rename from InfoGenie-frontend/public/60sapi/生成要求模板.txt rename to InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/生成要求模板.txt index 73163bf4..33402de4 --- a/InfoGenie-frontend/public/60sapi/生成要求模板.txt +++ b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/生成要求模板.txt @@ -2,6 +2,5 @@ 2.网页要适配手机端,电脑端和平板端三个设备分别做不同的css格式,优先优化手机端用户体验 3.网页默认风格以淡绿色清新风格为主,除非用户要求 4.尽量不要引用外部css,js,实在要引用就使用中国国内的cdn,否则用户可能加载不出来 -5.返回接口.json储存了网页api返回的数据格式 6.严格按照用户要求执行,不得随意添加什么注解,如“以下数据来自...” 8.在css中有关背景的css单独一个css文件,方便我直接迁移 \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/计算机英语词汇.txt b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/计算机英语词汇.txt new file mode 100644 index 00000000..7be5e954 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/学习工具/计算机英语词汇学习/计算机英语词汇.txt @@ -0,0 +1,1731 @@ + +词汇 +1 - 50 +1. file [fail] n. 文件;v. 保存文件 +2. command [kə ˈ mɑ:nd] n. 命令,指令 +3. use [ju:z, ju:s] v. 使用,用途 +4. program [ ˈ pr ə ugræm] n. 程 序 +5. line [lain] n. (数据,程序)行,线路 +6. if [if] conj. 如果 +7. display [disˈ plei] vt. 显示,显示器 +8. set [set] v. 设置,n. 集合 +9. key [ki:] n. 键,关键字,关键码 +10. list [list] n. 列表,显示,v. 打印 +11. by [bai] prep. 凭,靠,沿 +12. press [pres] v. 按,压 +13. with [wið, wiθ] prep. 用,与,随着 +14. format [ˈ fɔ :mæt] n. 格式 +15. change [tʃ eindʒ ] v. 更换,改变,变动 +16. cursor ['kə :sə ] n. 光标 +17. directory [diˈ rektə ri] n. 目录,索引簿 +18. from [frə m,frɔ m] prep. 从,来自,以来 +19. menu [ˈ menju:] n. 菜单,目录 +20. option [ˈ ɔ pʃ ə n] n. 任选,选择,可选项 +21. character [ˈ kæriktə ] n. 字符,符号,特性 +22. current [ˈ kʌ rə nt] n. 电流 +23. type [taip] n. 型,类型;v. 打印 +24. screen [skri:n] n. 屏幕,屏;v. 屏蔽 +25. specify [ˈ spesifai] v. 指定,规定,确定 +26. move [mu:v] v. 移动 +27. disk [disk] n. 盘,磁盘 +28. text [tekst] n. 正文,文本 +29. drive [draiv] v. 驱动;n. 驱动器 +30. see [si:] v. 看,看出,查看 +31. name [ˈ neim] n. 名,名称;vt. 命名 +32. record [ˈ rekɔ :d, riˈ kɔ :d] n. 记录 +33. box [bɔ ks] n. 箱,匣,(逻辑)框 +34. database [ˈ deitə beis] n. 数据库 +35. help [help] v. & n. 帮助 +36. memory [ˈ memə ri] n. 记忆存储,存储器 +37. which [witʃ ] pron. 哪个,a. 那一个 +38. all [ɔ :l] a. 全,全部;ad. 完全 +39. on [ɔ n] ad. 接通,导电,开 +40. copy [ˈ kɔ pi] n. 复制,v. 拷贝 +41. shell [ʃ el] n. 壳,外壳 · +42. delete [diˈ li:t] vt. 删除,删去,作废 +43. enter [ˈ entə ] v. 键入,送入 +44. margin [ˈ mɑ:dʒ in] n. 余量,边缘,边际 +45. mark [mɑ:k] n. 标记;vt. 加标记 +46. also [ˈ ɔ :lsə u] ad. & conj. 也,亦,还 +47. do [du, du:] v. 做,干;n. 循环 +48. information [ˌ infə ˈ meiʃ ə n n. 信息,情报 +49. choose [tʃ u:z] v. 挑选,选择,选定 +50. select [siˈ lekt] vt. 选择 +51 - 100 +51. group [gru:p] n. 组,群 +52. first [fə :st] a. & ad. & n. 第一,首先 +53. field [fi:ld] n. 字段,域,栏,场 +54. procedure [prə ˈ si:dʒ ə ] n. 过程,程序,工序 +55. print [print] v. 打印,印刷 +56. return [riˈ tə :n] v. 返回,回送 +57. number [ˈ nʌ mbə ] n. 数字,号码;vt. 编号 +58. selected [siˈ lekt] a. 精选的 +59. want [wɔ nt, wɑ:nt] v. 需要,应该,缺少 +60. window [ˈ wində u] n. 窗口 +61. message [ˈ mesidʒ ] n. 信息,消息,电文 +62. dialog [ˈ daiə lɔ g] n. & vt. 对话 +63. example [igˈ zɑ:mpə l] n. 例子,实例 +64. create [kri:ˈ eit] vt. 创立,建立 +65. insert [inˈ sə :t, ˈ insə :t] vt. 插入 +66. related [riˈ leitid] a. 相关的 +67. item [ˈ aitə m] n. 项,项目,条款 +68. edit [ˈ edit] vt. 编辑,编排,编篡 +69. marked [ma:kt] a. 有记号的 +70. area [ˈɛə riə ] n. (区)域,面积,方面 +71. parameter [pə ˈ ræmitə ] n. 参数,参变量 +72. then [ðen] ad. & conj. 那时,则 +73. variable [ˈ veə riə bə l] a. 可变的;n. 变量 +74. tab [tæb] n. 制表键 +75. up [ʌ p] ad. 上,向上,a. 高的 +76. string [striŋ] n. 行,字符串 +77. each [ˈ i:tʃ ] a. & ad. 各(自),每个 +78. active [ˈ æktiv] a. 激活的,活动的 +79. topic [ˈ tɔ pik] n. 题目,论题 +80. start [stɑ:t] v. 起动,开始,启动 +81. mode [mə ud] n. 态,方式,模 +82. selection [siˈ lekʃ ə n] n. 选择 +83. function [ˈ fʌ ŋkʃ ə n] n. 函数,功能,操作 +84. word [wə :d] n. 字(词),单词 +85. make [meik] vt. 制造,形成,接通 +86. right [rait] a. 右边的,正确的 +87. value [ˈ vælju:] n. 值 +88. button [ˈ bʌ tn] n. 按钮 +89. index [ˈ indeks] n. 索引,变址,指数 +90. without [wiˈ ðaut] prep. 没有,在…以外 +91. appear [ə ˈ piə ] vi. 出现,显现,好像 +92. left [left] a. & n. 左边(的) +93. save [seiv] v. 保存 +94. next [nekst] n. 下一次,a. 其次 +95. off [ɔ (:)f] ad. (设备)关着,脱离 +96. following [ˈ fɔ lə uiŋ] a. 下列的,以下的 +97. control [kə nˈ trə ul] v. 控制,支配,管理 +98. only [ˈ ə unli] a. 唯一的,ad. 仅仅 +99. user [ˈ ju:zə ] n. 用户 +100. end [end] n. 结束,终点,端点 +101 - 150 +101. system [ˈ sistə m] n. 系统 +102. contain [kə nˈ tein] vt. 包含,包括 +103. time [taim] n. 时间;vt. 计时 +104. letter [ˈ letə ] n. 字母,信 +105. data [ˈ deitə ] n. 数据 +106. setting [ˈ setiŋ] n. 设置,调整 +107. desire [diˈ zaiə ] v. & n. 期望 +108. position [pə ˈ ziʃ ə n] n. 位置;vt. 定位 +109. down [daun] ad. 落下,降低,减少 +110. task [tɑ:sk] n. 任务;v. 派给…任务 +111. view [vju:] n. & v. 视图,景象 +112. switch [switʃ ] n. & v. 开关,转换,切换 +113. include [inˈ klu:d] vt. 包括,包含 +114. get [get] v. 得到,获得,取 +115. default [diˈ fɔ :lt] v. 缺省,预置,约定 +116. structure [ˈ strʌ ktʃ ə ] n. 结构,构造,构件 +117. into [ˈ intu, ˈ intə ] prep. 向内,进入 +118. path [pɑ:θ] n. 路径,通路,轨道 +119. blank [blæŋk] n. 空白,间隔 +120. open [ˈ ə upə n] v. 打开,开启,断开 +121. add [æd] v. & n. 加,增加,添 +122. enable [iˈ neibə l] vt. 启动,恢复正常操作 +123. operation [ˌ ɔ pə ˈ reiʃ ə n] n. 操作,运算,动作 +124. erase [iˈ reiz] v. 擦除,取消,删除 +125. filename ['failneim] n. 文件名 +126. search [sə :tʃ ] v. 检索,查询,搜索 +127. another [ə ˈ nʌ ðə ] a. 另一个,别的 +128. last [lɑ:st] a. & n. 最后(的) +129. column [ˈ kɔ lə m] n. 列,柱,栏 +130. after [ˈ ɑ:ftə ] prep. & ad. 以后,后面 +131. prompt [prɔ mpt] n. & v. 提示 +132. two [tu:] n. & a. 二,两,双 +133. execute [ˈ eksikju:t] v. 实行,实施 +134. about [ə ˈ baut] ad. 关于,大约,附近 +135. escape [iˈ skeip] v. 逃避,逸出,换码 +136. error [ˈ erə ] n. 错误,误差,差错 +137. currently [ˈ kʌ rə ntli] ad. 目前,现在 +138. extension [ikˈ stenʃ ə n] n. 扩充,延伸 +139. same [seim] a. 同样的,相同的 +140. status [ˈ steitə s] n. 状态,态,状况 +141. run [rʌ n] v. 运行,运转,操作 +142. argument [ˈ ɑ:gju:mə nt] n. 变元,自变量 +143. statement [ˈ steitmə nt] n. 语句,陈述,命题 +144. shift [ʃ ift] v. 转义,换档,移位 +145. store [stɔ :] n. & vt. 存储,存储器 +146. scroll [skrə ul] vt. 上滚(卷);n. 纸卷 +147. replace [ri(:)ˈ pleis] vt. 替换,置换,代换 +148. macro ['mækrə u] n. 宏,宏功能,宏指令 +149. page [peidʒ ] n. 页面,页,版面 +150. quit [kwit] v. 退出,结束 +151 - 200 +151. define [diˈ fain] vt. 定义,规定,分辨 +152. reference [ˈ refə rə ns] n. & a. 参考;参考的 +153. other [ˈ ʌ ðə ] a. 别的,另外的 +154. while [wail] conj. 当…的时候 +155. pressing [ˈ presiŋ] n. & a. 压制;紧急的 +156. restore [riˈ stɔ :] vt. 恢复,复原 +157. top [tɔ p] n. 顶,尖端 +158. how [hau] ad. 如何,怎样,多么 +159. color [ˈ kʌ lə ] n. 颜色,色彩,(彩)色 +160. allow [ə ˈ lau] v. 允许,容许 +161. block [blɔ k] n. (字,信息,数据)块 +162. decimal [ˈ desimə l] n. & a. 十进制;十进制的 +163. main [mein] a. 主要的 +164. definition [ˌ defiˈ niʃ ə n] n. 定义,确实,清晰度 +165. between [biˈ twi:n] prep. 在…之间,中间 +166. optional [ˈ ɔ pʃ ə nə l] a. 任选的,可选的 +167. date [ˈ deit] n. 日期 +168. remove [riˈ mu:v] v. 除去,移动 +169. arrow [ˈ ærə u] n. 箭头,指针 +170. label [ˈ leibə l] n. 标签,标号,标识符 +171. within [wiˈ ðin] prep. 在…以内 +172. issue [ˈ iʃ u:, ˈ isju:] v. 发行,出版,流出 +173. different [ˈ difrə nt]a. 不同的,各种各样的 +174. available [ə ˈ veilə bə l] a. 可用的 +175. returned [ri'tə :nd] a. 退回的 +176. associate [ə ˈ sə uʃ ieit] v. 相联,联想,关联 +177. attribute [ˈ ætribju:t, ə ˈ tribju:t] n. 属性,标志,表征 +178. dos [du:z]磁盘操作系统 +179. before [biˈ fɔ :] prep. 以前,前,先 +180. order [ˈ ɔ :də ] n. & vt. 指令,次序;排序 +181. modify [ˈ mɔ difai] vt. 修改,改变,变址 +182. array [ə ˈ rei] n. 数组,阵列 +183. mouse [maus] n. 鼠标器 +184. note [nə ut] n. 注解,注释 +185. locate [lə uˈ keit] vt. 定位 +186. video [ˈ vidiə u] n. 视频,电视 +187. printer [ˈ printə ] n. 打印机,印刷机 +188. bar [bɑ:] n. 条,杆,棒 +189. bottom ['bɔ tə m] n. & a. 底,基础;底下的 +190. carriage [ˈ kæridʒ ] n. 滑架,托架 +191. content [ˈ kɔ ntent] n. 含量,容量,内容 +192. either [ˈ aiðə , ˈ i:ðə ] a. & pron. 任何一个,各 +193. ok [ə uˈ kei] ad. & a. 对,好;全对 +194. space [speis] n. 空格键,空间 +195. editor [ˈ editə ] n. 编辑程序 +196. exist [igˈ zist] vi. 存在,生存,有 +197. scope [skə up] n. 范围,显示器 +198. paragraph [ˈ pærə grɑ:f] n. 段(落),节,短讯 +199. multi [mʌ lti] (词头)多 +200. clear [kliə ] v. 清除,弄干净 +201 - 250 +201. exit [ˈ eksit] n. & vi. 出口;退出 +202. report [riˈ pɔ :t] vt. & n. 报告,报表 +203. execution [ˌ eksiˈ kju:ʃ ə n] n. 执行 +204. backup [ˈ bækʌ p] n. 备份,后备,后援 +205. version [ˈ və :ʃ ə n, ˈ və :rʒ ə n] n. 版本 +206. find [faind] v. 寻找,发现 +207. pointer [ˈ pɔ intə ] n. 指针,指示字 +208. subset ['sʌ bset] n. 子集,子设备 +209. keyboard [ˈ ki:bɔ :d] n. 键盘 +210. full [ful] a. & ad. & n. 全(的),满 +211. check [tʃ ek] v. 校对,栓查,核算 +212. should [ʃ ud, ʃ ə d] v. & aux. 应当,该 +213. single [ˈ siŋgə l] a. & n. 单个的;一个,单 +214. positioning [pə ˈ ziʃ ə n] n. 定位 +215. provide [prə ˈ vaid] v. 提供 +216. title [ˈ taitl] n. 题目,标题 +217. expression [ikˈ spreʃ ə n] n. 表达式 +218. through [θru:] prep. & ad. 通过,直通 +219. toggle ['tɔ gl] n. & v. 触发器;系紧 +220. code [kə ud] n. 码,代码,编码 +221. such [sʌ tʃ ] a. & pron. 这样的,如此 +222. beginning [biˈ giniŋ] n. 起点,初 +223. guide [gaid] n. 向导,指南,入门 +224. tree [tri:] n. 树,语法树 +225. environment [inˈ vaiə rə nmə nt] n. 环境 +226. but [bʌ t,bə t]但是,可是,除非,不过 +227. device [diˈ vais] n. 设备,器件,装置 +228. highlight [ˈ hailait] n. 增强亮度,提示区 +229. call [kɔ :l] v. 调用,访问,呼叫 +230. continue [kə nˈ tinju:] v. 连续,继续 +231. indicate [ˈ indikeit] vt. 指示,表示 +232. until [ə nˈ til, ʌ nˈ til] prep. 到…为止,直到 +233. begin [biˈ gin] v. 开始,着手,开端 +234. place [pleis] vt. 放,位,地点 +235. rename [ri:'neim] vt. 更名,改名 +236. swap [swɔ p] v. 交换,调动 +237. work [wə :k] n. 工作 +238. remain [riˈ mein] vi. 剩下,留下,仍然 +239. close [klə uz] v. & a. 关闭,闭合;紧密的 +240. combination [ˌ kɔ mbiˈ neiʃ ə n] n. 结合,组合 +241. profile [ˈ prə ufail] n. 简要,剖面,概貌 +242. unless [ʌ nˈ les] conj. 除非 +243. so [sə u] pron. & conj. 如此,这样 +244. except [ikˈ sept] prep. 除…之外,除非 +245. turn [tə :n] v. & n. 转,转动;圈,匝 +246. back [bæk] n. 背面,反向,底座 +247. sure [ʃ uə ,ʃ ɔ :] a. & ad. 确实的;的确 +248. section [ˈ sekʃ (ə )n] n. 节,段,区域 +249. follow [ˈ fɔ lə u] v. 跟随,跟踪 +250. split [split] v. 分开,分离 +251 - 300 +251. need [ni:d] v. 必须,需要 +252. access [ˈ ækses] n. 存取,选取,接近 +253. additional [ə ˈ diʃ ə nə l] a. 附加的,辅助的 +254. cancel [ˈ kænsə l] v. 删除,取消,作废 +255. document [ˈ dɔ kjumə nt] n. 文献,资料,文件 +256. case [keis] n. 情况,场合 +257. numeric [nju:'merik] n. & a. 数字的,分数 +258. go [gə u] vi. 运行,达到 +259. load [lə ud] n. & v. 装入,负载,寄存 +260. try [trai] n. (尝)试,试验 +261. size [saiz] n. 尺寸,大小,容量 +262. entire [inˈ taiə ] a. & n. 完全的;总体 +263. leave [li:v] v. 离开,留下 +264. history [ˈ histə ri] n. 历史 +265. second [ˈ sekə nd, siˈ kɔ nd] n. & a. 秒,第二(的) +266. reflow [ri:'flə u] v. & n. 回流,逆流 +267. output [ˈ autput] n. 输出,输出设备 +268. out [aut] n. & a. 输入,在外 +269. both [bə uθ] a. & ad. 两,双,都 +270. install [inˈ stɔ :l] vt. 安装 +271. source [sɔ :s] n. 源,电源,源点 +272. way [wei] n. 路线,途径,状态 +273. assign [ə ˈ sain] vt. 赋值,指定,分派 +274. support [sə ˈ pɔ :t] vt. 支援,支持,配套 +275. specific [spiˈ sifik] a. 特殊的,具体的 +276. join [dʒ ɔ in] v. & n. 连接,并(运算) +277. expand [ikˈ spænd] v. 扩充,扩展,展开 +278. like [laik] a. 类似的,同样的 +279. diskette ['disket] n. 软磁盘,软盘片 +280. skip [skip] v. 跳跃(定位),跳过 +281. application [ˌ æpliˈ keiʃ (ə )n] n. 应用 +282. confirmation [ˌ kɔ nfə ˈ meiʃ ə n] n. 认可 +283. whether [ˈ weðə ] conj. 无论,不管 +284. hold [hə uld] v. 保持 +285. click [klik] n. “卡搭”声,插销 +286. write [rait] v. 写,存入 +287. byte [bait] n. (二进制的)字节 +288. abbreviate [ə ˈ bri:vieit] vt. 缩写,省略 +289. show [ʃ ə u] v. 显示,呈现,出示 +290. otherwise [ˈ ʌ ðə waiz] ad. & a. 另外 +291. working [ˈ wə :kiŋ] n. 工作,操作,作业 +292. delimiter [di'limitə ] n. 定界符,分界符 +293. location [lə uˈ keiʃ ə n] n. 定位,(存储器)单元 +294. perform [pə ˈ fɔ :m] v. 执行,完成 +295. graphic [ˈ græfik] n. & a. 图形;图形的 +296. read [ri:d] v. 读,读阅 +297. confirm [kə nˈ fə :m] vt. 证实,确认 +298. sort [sɔ :t] v. 分类,排序 +299. clause [klɔ :z] n. 条款,项目,子句 +300. once [wʌ ns] ad. & n. 只一次,一旦 +301 - 350 +301. however [hauˈ evə ] conj. 然而,可是 +302. extend [ikˈ stend] v. 扩充 +303. look [luk] v. 看,查看 +304. starting ['stɑ:tiŋ] a. 起始的 +305. now [nau] ad. & n. 此刻,现在 +306. original [ə ˈ ridʒ ə nə l] n. & a. 原文;原(初)始的 +307. correspond [ˌ kɔ riˈ spɔ nd] vi. 通信(联系) +308. property [ˈ prɔ pə ti] n. 性(质),特征 +309. several [ˈ sevə rə l] a. & n. 若干个,几个 +310. learn [lə :n] v. 学习,训练 +311. cause [kɔ :z] n. 原因,理由 +312. bracket [ˈ brækit] n. (方)括号,等级 +313. omit [ə uˈ mit] vt. 省略,删去,遗漏 +314. running [ˈ rʌ niŋ] a. 运行着的,游动的 +315. sub-directory n. 子目录 +316. edge [edʒ ] n. 棱,边,边缘,界限 +317. form [fɔ :m] n. 格式,表格,方式 +318. instruction [inˈ strʌ kʃ ə n] n. 指令,指导 +319. ascii n. 美国信息交换标准码 +320. below [biˈ lə u] a. & prep. 下列的;低于 +321. standard [ˈ stændə d] n. 标准 +322. occurrence [ə ˈ kʌ rə ns] n. 出现,发生 +323. lock [lɔ k] n. & v. 锁,封闭;自动跟踪 +324. append [ə ˈ pend] vt. 附加,增补 +325. destination [ˌ destiˈ neiʃ ə n] n. 目的地,接收站 +326. password ['pɑ:swə :d] n. 口令,保密字 +327. point [pɔ int] n. 点,小数点,句号 +328. variety [və ˈ raiə ti] n. 变化,种类,品种 +329. many [ˈ meni] a. & n. 许多,多数 +330. buffer [ˈ bʌ fə ] n. 缓冲器 +331. useful [ˈ ju:sfə l] a. 有用的 +332. object [ˈ ɔ bdʒ iktˌ ə bˈ dʒ ekt] n. 对象,目标,物体 +333. again [ə ˈ gein] ad. 再,又,重新,也 +334. operating [ˈ ɔ pə reit] a. 操作的,控制的 +335. carry [ˈ kæri] v. 进位,带 +336. update [ˌ ʌ pˈ deit] v. 更新,修改,校正 +337. moving ['mu:viŋ] n. & a. 活动的,自动的 +338. coprocessor ['kə uˌ prə usesə ] n. 协同处理器 +339. overlay ['ə uvə 'lei] v. 覆盖,重叠 +340. practice [ˈ præktis] n. 实习,实践 +341. navigation [ˌ næviˈ geiʃ ə n] n. 导航 +342. automatically [ɔ :tə ˈ mætikli] ad. 自动地,机械地 +343. total [ˈ tə utl] n. & v. 总数;总计 +344. previous [ˈ pri:viə s] a. 早先的,上述的 +345. software [ˈ sɔ ftwɛ ə ] n. 软件 +346. shortcut [ˈʃɔ :tkʌ t] n. 近路,捷径 +347. long [lɔ ŋ] a. 长的,远的 +348. unique [ju:ˈ ni:k] a. 唯一的,独特的 +349. part [pɑ:t] n. 部分,零件 +350. updated [ˌ ʌ pˈ deit] a. 适时的,更新的 +351 - 400 +351. internal [inˈ tə :nl] a. 内部的 +352. fill [fil] v. 填充 +353. basic [ˈ beisik] n. & a. 基本;基本的 +354. math [mæθ] n. 数学 +355. since [sins] prep. 自从…以来 +356. determine [diˈ tə :min] v. 确定 +357. making [ˈ meikiŋ] n. 制造,构造 +358. center [ˈ sentə ] n. 中心,中央 +359. already [ɔ :lˈ redi] ad. 已经,早已 +360. keyword ['ki:wə :d] n. 关键字(词) +361. action [ˈ ækʃ ə n] n. 操作,运算 +362. condition [kə nˈ diʃ ə n] n. 条件,情况;vt. 调节 +363. quick [kwik] a. & ad. 快速的,灵敏的 +364. assigned [ə ˈ sain] a. 指定的,赋值的 +365. give [giv] vt. 给出,赋予,发生 +366. large [lɑ:dʒ ] a. (巨)大的,大量的 +367. chapter [ˈ tʃ æptə ] n. 章,段 +368. computer [kʌ mˈ pju:tə ] n. 计算机 +369. complete [kə mˈ pli:t] v. & a. 完成;完整的 +370. past [pɑ:st] a. 过去的,结束的 +371. match [mætʃ ] v. 比较,匹配,符合 +372. recover [riˈ kʌ və ] v. 恢复,回收 +373. always [ˈ ɔ :lweiz] ad. 总是,一直,始终 +374. require [riˈ kwaiə ] v. 需要,要求 +375. opening [ˈ ə upə niŋ] n. 打开,断路,孔 +376. network [ˈ netwə :k] n. & vt. 网络;联网 +377. sign [sain] n. 符号,信号,记号 +378. release [riˈ li:s] vt. & n. 释放,核发,版 +379. three [θri:] a. & n. 三(的) +380. recall [riˈ kɔ (:)l] vt. 撤消,复活,检索 +381. deletion [di'li:ʃ ə n] n. 删去(部分),删除 +382. fixed [fikst] a. 固定的,不变的 +383. amount [ə 'maunt] vt. & n. 总计;合计 +384. alias [ˈ eiliə s] n. 别名,代号,标记 +385. quote [kwə ut] n. & v. 引号;加引号 +386. correct [kə ˈ rekt] a. & vt. 正确的;改正 +387. else [els] ad. & conj. 否则,此外 +388. maximum [ˈ mæksimə m] n. & a. 最大(的),最高 +389. under [ˈ ʌ ndə ] prep. 在…下面(之下) +390. take [teik] v. 取,拿 +391. switching [switʃ iŋ] n. 开关,转接,交换 +392. element [ˈ elimə nt] n. 元件,元素,码元 +393. modification [ˌ mɔ difiˈ keiʃ ə n] n. 改变,修改 +394. modified ['mɔ difaid] a. 修改的,变更的 +395. input [ˈ input] n. 输入,输入设备 +396. uppercase ['ʌ pə ˌ keis] n. 大写字母 +397. plus [plʌ s] prep. 加,加上,外加 +398. found [faund] v. 建立,创办 +399. debug [di:'bʌ g] vt. 调试 +400. force [fɔ :s] v. & n. 强制;压力,强度 +401 - 450 +401. lowercase ['lə uə ˌ keis] n. 下档,小写体 +402. just [dʒ ʌ st] ad. 恰好 +403. undo [ʌ nˈ du:] vt. 取消,废除 +404. environ [in'vaiə rə n] vt. 围绕,包围 +405. why [wai] ad. 为什么 +406. temporary [ˈ tempə rə ri] a. 暂时的,临时的 +407. put [put] v. 存放(记录),放置 +408. instead [inˈ sted] ad. (来)代替,当作 +409. encounter [inˈ kauntə ] v. & n. 遇到,碰到 +410. across [ə ˈ krɔ s] prep. 交叉,越过 +411. matching ['mætʃ iŋ] n. 匹配,调整 +412. wildcard n. 通配符 +413. spill [spil] v. 漏出,溢出,漏失 +414. level [ˈ levə l] n. 水平,级,层次 +415. browse [brauz] v. 浏览 +416. speech [spi:tʃ ] n. 说话,言语,语音 +417. occur [ə ˈ kə :] vi. 发生,出现,存在 +418. memo [ˈ memə u] n. 备忘录 +419. prior [ˈ praiə ] a. 先验的,优先的 +420. loaded [lə ud] a. 有负载的 +421. length [leŋθ] n. (字,记录,块)长度 +422. round [raund] v. 舍入,四舍五入 +423. variant [ˈ veə riə nt] n. & a. 变体,易变的 +424. floppy [ˈ flɔ pi] n. 软磁盘 +425. machine [məˈʃ i(:)n] n. 机器,计算机 +426. square [skwɛ ə ] n. & a. 正方形;方形的 +427. supply [sə ˈ plai] vt. & n. 电源,供给 +428. home [hə um] n. & a. 家,出发点 +429. normal ['nɔ :mə l] a. & n. 正常,标准 +430. onto [ˈ ɔ ntu, -tə ] prep. 向…,到…上 +431. during [ˈ djuə riŋ] prep. 在…期间 +432. module [ˈ mɔ dju:l] n. 模块(程序设计) +433. monochrome ['mɔ nə krə um] n. 单色 +434. assistance [ə ˈ sistə ns] n. 辅助设备,帮助 +435. tell [tel] n. 讲,说,教,计算 +436. library [ˈ laibrə ri] n. (程序…)库,图书馆 +437. demonstration [ˌ demə nˈ streiʃ ə n] n. (公开)表演,示范 +438. stack [stæk] n. 栈,堆栈,存储栈 +439. even [ˈ i:və n] a. & ad. 偶数的;甚至 +440. evaluate [iˈ væljueit] v. 估计,估算,求值 +441. times [taimz] n. 次数 +442. previously ['pri:vjə sli] ad. 以前,预先 +443. directly [di'rektli] ad. 直接地,立即 +444. logical [ˈ lɔ dʒ ikə l] a. 逻辑的,逻辑“或” +445. template ['templit] n. 标准框,样板,模板 +446. calling ['kɔ :liŋ] n. 呼叫,调用,调入 +447. later ['leitə ] a. 更后的,后面的 +448. driver ['draivə ] n. 驱动器,驱动程序 +449. therefore ['ðɛ ə fɔ :] ad. & conj. 因此,所以 +450. saving [ˈ seiviŋ] a. 保存的 +451 - 500 +451. detail [ˈ di:teil] n. 元件,零件,细节 +452. linker ['liŋkə ] n. 连接程序 +453. loop [lu:p] n. 圈,环;(程序)循环,回路 +454. process [ˈ prə uses] vt. 处理,进程,加工 +455. scheme [ski:m] n. 方案,计划,图 +456. every [ˈ evri] a. 每个,全体,所有的 +457. refer [riˈ fə :] v. 访问,引用,涉及 +458. possible [ˈ pɔ sə b(ə )l] a. 可能的,潜在的 +459. above [ə ˈ bʌ v] a. 在…之上,大于 +460. overview [ˈ ə uvə vju:] n. 综述,概要 +461. result [riˈ zʌ lt] n. 结果 +462. syntax ['sintæks] n. 语法,文法,句法 +463. abbreviation [ə ˌ bri:viˈ eiʃ ə n] n. 缩短,省略,简称 +464. bios n. 基本输入/输出系统 +465. hidden ['hidn] a. 隐藏的,秘密的 +466. null [nʌ l] n. & a. 空(的),零(的) +467. send [send] v. 发送 +468. private ['praivit] a. 专用的,私人的 +469. hard [ˈ hɑ:d] a. 硬的 +470. hardware [ˈ hɑ:dwɛ ə ] n. 硬件 +471. say [sei] v. 说,显示,假定 +472. equal ['i:kwə l] vt. & n. 等于,相等;等号 +473. pack [pæk] n. 压缩,包裹 +474. minus [ˈ mainə s] a. & n. 负的;负数,减 +475. alternate [ɔ :lˈ tə :nit, ˈ ɔ :ltə :neit] a. 交替的,备用的 +476. collapse [kə 'læps] v. 崩溃,破裂 +477. corner ['kɔ :nə ] n. 角,角落,转换 +478. present ['preznt,pri'zent] a. & v. 现行的;提供 +479. interpreter [inˈ tə :pritə ] n. 解释程序,翻译机 +480. advance [ə dˈ vɑ:ns] v. & n. 进步,提高;进展 +481. forward [ˈ fɔ :wə d] a. 正向的 +482. fast [fɑ:st] a. & ad. 快速的 +483. special [fɑ:st] a. 专用的,特殊的 +484. slash [slæʃ ] n. 斜线 +485. utility [ju:ˈ tiliti] n. & a. 实用程序;实用性 +486. regardless [riˈ gɑ:dlə s] a. 不注意的,不考虑的 +487. disable [dis'eibl] vt. 禁止,停用 +488. compatible [kə mˈ pætə bə l] a. 可兼容的,可共存的 +489. depend [diˈ pend] vi. 随…而定,取决于 +490. empty [ˈ empti] a. 空,零,未占用 +491. alphabetical [ˌ ælfə 'betikə l] a. 字母(表)的,abc 的 +492. branch [brɑ:ntʃ ] n. 分支,支线;v. 转换 +493. resume [ˈ rezju:mei] v. 重(新)开(始) +494. multiple [ˈ mʌ ltipə l] a. 多次的,复杂的 +495. monitor [ˈ mɔ nitə ] n. 监视器,监督程序 +496. configuration [kə nˌ figjuˈ reiʃ ə n] n. 配置 +497. replacement [riˈ pleismə nt] n. 替换,置换,更新 +498. required [ri'kwaiə d] a. 需要的 +499. macros ['mækrɔ s] n. 宏命令(指令) +500. table ['teibl] n. 表 +501 - 550 +501. loss [lɔ s] n. 损耗,损失 +502. batch [bætʃ ] n. 批,批量,成批 +503. exact [ig'zækt] a. 正确的 +504. aboveboard [ə 'bʌ v'bɔ :d] ad. & a. 照直,公开的 +505. activate [ˈ æktiveit] vt. & n. 使激活,驱动 +506. around [ə ˈ raund] ad. & prep. 周围,围绕 +507. slow [slə u] a. & ad. 慢速的 +508. floating ['flə utiŋ] a. 浮动的,浮点的 +509. refresh [ri'freʃ ] v. 刷新,更新,再生 +510. stop [stɔ p] v. 停止,停机 +511. pass [pɑ:s] v. 传送,传递,遍(数) +512. public ['pʌ blik] a. 公用的,公共的 +513. eject [iˈ dʒ ekt] n. 弹出 +514. ignore [igˈ nɔ :] vt. 不管,忽略不计 +515. share [ʃɛə ] v. 共享,共用 +516. sequence ['si:kwə ns] n. 顺序,时序,序列 +517. consist [kə n'sist] vi. 符合,包括 +518. step [step] n. 步,步骤,步长,档 +519. double ['dʌ bl] a. 两倍的,成双的 +520. come [kʌ m] vi. 来,到,出现 +521. lower ['lə uə ,'lauə ] a. 下部的,低级的 +522. describe [di'skraib] vt. 描述,沿…运行 +523. count [kaunt] v. 计数,计算 +524. pop [pɔ p] v. 上托,弹出(栈) +525. valid ['vælid] a. 有效的 +526. suspend [sə s'pend] v. 中止,暂停,挂起 +527. enhance [in'hɑ:ns] vt. 增强,放大,夸张 +528. separate [ˈ sepə reit] v. & a. 分隔,分离,各自的 +529. echo ['ekə u] n. 回波,反射波 +530. necessary [ˈ nesisə ri] a. 必要的,必然的 +531. greater than 大于 +532. able ['eibl] a. 能…的,有能力的 +533. marking [mɑ:kiŋ] n. 标记,记号,传号 +534. ask [ɑ:sk] v. 请求,需要 +535. term [tə :m] n. 项,条款,术语 +536. bring [briŋ] v. 引起,产生,拿来 +537. warning ['wɔ :niŋ] n. & a. 报警,预告 +538. less [les] a. & ad. 更小,更少 +539. whose [hu:z] pron. 谁的 +540. comment [ˈ kɔ ment] n. & vi. 注解,注释 +541. effect [i'fekt] n. 效率,作用,效能 +542. expanding [iks'pændiŋ] a. 扩展的,扩充的 +543. on-line ['ɔ nˌ lain] a. 联机的 +544. reorder [ri:'ɔ :də ] v. (按序)排列,排序 +545. direct [di'rekt] a. 直接的 +546. enclose [in'klə uz] vt. 封闭,密封,围住,包装 +547. reset ['ri:'set] vt. 复位,置“0” +548. various ['vɛ ə riə s] a. 不同的,各种各样的 +549. paper ['peipə ] n. 纸,文件,论文 +550. prevent [pri'vent] v. 防止,预防 +551 - 600 +551. side [said] n. (旁)边,面,侧(面) +552. push [puʃ ] v. 推,按,压,进(栈) +553. programming ['prə ugræmiŋ] n. 程序设计,编程序 +554. upper ['ʌ pə ] a. 上的,上部的 +555. row [rə u,rau] n. 行 +556. pressed [prest] a. 加压的,压缩的 +557. temporarily ['tempə rerili] ad. 暂时 +558. day [dei] n. 日,天,白天,时代 +559. repaint [ri:'peint] vt. 重画 +560. redefine ['ri:di'fain] vt. 重新规定(定义) +561. relation [ri'leiʃ ə n] n. 关系,关系式 +562. dimension [di'menʃ ə n] n. 尺寸,维,因次 +563. boundary ['baundə ri] n. 边界,界限,约束 +564. zoom [zu:m] v. 变焦距 +565. initialize [i'niʃ ə laiz] v. 初始化 +566. personal ['pə :sə nl] a. 个人的,自身的 +567. hello [ˈ hʌ ˈ lə u] int. & v. 喂!;呼叫 +568. true [tru:] a. & n. 真,实,选中 +569. wish [wiʃ ] v. & n. 祝愿,希望 +570. font [fɔ nt] n. 铅字,字形 +571. know [nə u] v. 知道,了解,认识 +572. convert [kə nˈ və :t, ˈ kɔ nvə :t] v. 转换,变换 +573. global [ˈ glə ubə l] n. 全局,全程,全局符 +574. still [stil] a. & n. & v. 静止的;静;平静 +575. installation [ˌ instə ˈ leiʃ ə n] n. 安装,装配 +576. invoke [inˈ və uk] vt. 调用,请求 +577. interactive [intə r'æktiv] a. 交互式,交互的 +578. described [diˈ skraib] a. 被看到的,被发现的 +579. century [ˈ sentʃ ə ri] n. 世纪 +580. literal [ˈ litə rə l] a. 文字的 +581. rather [ˈ rɑ:ðə ] ad. 宁可,有点 +582. exclusive [ikˈ sklu:siv] a. 排斥,排它性 +583. marker [mɑ:kə ] n. 记号,标记,标志 +584. wait [weit] v. 等待 +585. appropriate [ ə ˈ pr ə upri-it, ə ˈ pr əuprieit] a. 适当的,合适的 +586. fit [fit] v. & n. 适合,装配;非特 +587. adapter [ə 'dæptə ] n. 适配器,转换器 +588. filter [ˈ filtə ] n. 滤波器,滤光材料 +589. break [breik] v. 断开,撕开,中断 +590. backward ['bækwə d] ad. 向后,逆,倒 +591. searching [sə :tʃ ] n. 搜索 +592. receive [riˈ si:v] v. 接收 +593. dual ['dju:ə l] a. 对偶的,双的 +594. retry [ri:'trai] vt. 再试,复算 +595. normally ['nɔ :mə li] ad. 正常地,通常 +596. exactly [igˈ zæktli] ad. 正好,完全,精确地 +597. immediately [iˈ mi:diə tli] ad. 直接地 +598. separated ['sepə reitid] a. 分开的 +599. high [hai] a. 高 +600. equivalent [i'kwivə lə nt] a. 相等的,等效的 +601 - 650 +601. light [lait] n. & a. 光(波,源);轻的 +602. zero ['ziə rə u] n. 零,零位,零点 +603. storage ['stɔ :ridʒ ] n. 存储,存储器 +604. width [widθ] n. 宽度 +605. language [ˈ læŋgwidʒ ] n. 语言 +606. startup ['stɑ:tʌ p] n. 启动 +607. much [mʌ tʃ ] a. & n. 很多,许多,大量 +608. per [pə ] prep. 每,按 +609. over [ˈ ə uvə ] prep. 在…上方 +610. mirror [ˈ mirə ] n. & v. 镜,反射,反映 +611. request [ri'kwest] n. & vt. 请求 +612. keypad ['ki:ˌ pæd] n. 小键盘 +613. keep [ki:p] v. 保持,保存 +614. resident [ˈ rezidə nt] a. 驻留的 +615. learning [ˈ lə :niŋ] n. 学问,知识 +616. talk [tɔ :k] v. 通话,谈话 +617. summary [ˈ sʌ mə ri] n. 摘要,汇总,提要 +618. well [wel] n. & a. 井;好,良好 +619. link [liŋk] n. & v. 链接;连接,联络 +620. according to a. 按照,根据 +621. identify [ai'dentifai] v. 识别,辨认 +622. designated [ˈ dezignit, -neit] a. 指定的,特指的 +623. pertain [pə ˈ tein] vi. 附属,属于,关于 +624. expansion [ikˈ spænʃ ə n] n. 展开,展开式 +625. incompatible [ˌ inkə mˈ pætə bə l] a. 不兼容的 +626. blinking [bliŋk] n. 闪烁 +627. month [mʌ nθ] n. 月份 +628. precede [priˈ si:d] v. 先于 +629. readily ['redili] ad. 容易地,不勉强 +630. transportable [træns'pɔ :tə bl] a. 可移动的 +631. appropriately [ə 'prə upriˌ eitli] ad. 适当地 +632. routine [ru:'ti:n] n. 程序,例行程序 +633. ready [ˈ redi] a. 就绪,准备好的 +634. listing ['listiŋ] n. 列表,编目 +635. newly ['nju:li] ad. 新近,重新 +636. year [jiə ] n. (一)年,年度,年龄 +637. contact [ˈ kɔ ntækt] n. 接触,触点 +638. session [ˈ seʃ ə n] n. 对话,通话 +639. own [ə un] a. & v. 自己的;拥有 +640. redraw [ri:'drɔ :] vt. 再拉 +641. here [hiə ] ad. 在这里 +642. manual ['mænjuə l] a. 手工的,手动的 +643. particular [pə 'tikjulə ] a. 特定的,特别的 +644. rectangle ['rektæŋgl] n. 矩形 +645. additive ['æditiv] a. & n. 相加的;附加物 +646. similar ['similə ] a. 相似的 +647. assembly [ə 'sembli] n. 汇编,安装,装配 +648. copyright ['kɔ pirait] n. 版权 +649. description [di'skripʃ ə n] n. 描述 +650. retrieve [ri'tri:v] v. 检索 +651 - 700 +651. mistake [mi'steik] n. 错误 +652. produce [prə 'dju:s] v. 生产,制造 +653. ram [ræm] 随机存取存储器 +654. exception [ik'sepʃ ə n] n. 例外,异常,异议 +655. digit ['didʒ it] n. 数字,位数,位 +656. reverse [ri'və :s] v. & a. 反向的,逆 +657. minimum ['minimə m] n. & a. 最小(的),最低 +658. enough [iˈ nʌ f] a. & ad. 足够的,充足的 +659. although [ɔ :l'ðə u] conj. 虽然,即使 +660. reindex v. & n. 变换(改变)符号 +661. third [θə :d] a. & n. 第三,三分之一 +662. red [red] a. & n. 红色(的) +663. along [ə 'lɔ ŋ] prep. & ad. 沿着 +664. test [test] n. & v. 测试 +665. small [smɔ :l] a. 小的,小型的 +666. feed [fi:d] v. 馈给,(打印机)进纸 +667. company [ˈ kʌ mpə ni] n. & v. 公司;交际,交往 +668. movie ['mu:vi] n. 影片,电影(院) +669. compile [kə m'pail] vt. 编译 +670. frequently [ˈ fri:kwə ntli] ad. 常常,频繁地 +671. undefined [ˌ ʌ ndi'faind] a. 未定义的 +672. state [steit] n. & vt. 状态;确定 +673. tick [tik] v;n. 滴答(响);勾号(√) +674. accept [ə kˈ sept] vt. 接受,认可,同意 +675. intense [inˈ tens] a. 强烈的,高度的 +676. documentation [ ˌ d ɔ kjumen'tei ʃ ən] n. 文件编制,文本 +677. asterisk [ˈ æstə risk] n. 星号(*) +678. easily [ˈ i:zili] ad. 容易地,轻易地 +679. become [biˈ kʌ m] v. 成为,变成,适宜 +680. address [ə ˈ dres] vt. & n. 寻址;地址 +681. interface ['intə feis] n. 接口 +682. pause [pɔ :z] vi. 暂停 +683. repeat [riˈ pi:t] v. 重复 +684. restart [ˌ ri:'stɑ:rt] v. 重新启动,再启动 +685. assumed [ə 'sju:md,ə 'su:md] a. 假定的 +686. speed [spi:d] n. 速度 +687. entry [ˈ entri] n. 输入,项(目),入口 +688. combine [kə mˈ bain] v. 组合,联合 +689. organize [ˈ ɔ :gə naiz] v. 组织,创办,成立 +690. finished ['finiʃ t] a. 完成的 +691. mixed [mikst] a. 混合的 +692. permit ['pə :mit,pə 'mit] v. 许可,容许 +693. formatting ['fɔ :mætiŋ] n. 格式化 +694. root [ru:t] n. 根 +695. symbol [ˈ simbə l] n. 符号,记号 +696. binary ['bainə ri] n. & a. 二进制;双态的 +697. whenever [wenˈ evə ] ad. & conj. 随时 +698. reach [ri:tʃ ] v. & n. 范围,达到范围 +699. caution [ˈ kɔ :ʃ ə n] n. & v. 警告,注意 +700. subtotal [sʌ b'tə utl] n. & v. 小计,求部分和 +701 - 750 +701. card [kɑ:d] n. 卡片,插件(板) +702. general [ˈ dʒ enə rə l] a. 通用的 +703. associated [ə 'sə uʃ iˌ eitid] a. 联合的,相联的 +704. transfer [træns'fə :] v. 传送,转换,转移 +705. connect [kə nˈ nekt] v. 连接 +706. partition [kə nˈ nekt] v. 划分,分区,部分 +707. hexadecimal ['heksə ˌ desimə l] a. 十六进制的 +708. generate [ˈ dʒ enə reit] vt. 产生,发生,生成 +709. specification [ˌ spesifiˈ keiʃ ə n] n. 说明书,规则说明书 +710. customize ['kʌ stə maiz] vt. 定制,定做 +711. far [fɑ:] a. 远的,遥远的 +712. nest [nest] v. 嵌套,后进先出 +713. duplicate [ˈ dju:plikit] vt. 复制,转录,加倍 +714. compression [kə m'preʃ ə n] n. 压缩,浓缩 +715. unable [ʌ nˈ eibə l] a. 不能的 +716. means [mi:nz] n. 方法,手段 +717. alternately [ɔ :lˈ tə :nitli] ad. 交替地,轮流地 +718. intensity [inˈ tensiti] n. 强度,亮度 +719. reading [ˈ ri:diŋ] n. 读,读数 +720. let [let] v. 让,允许 +721. explicitly [ik'splisitli] ad. 明显地,显然地 +722. compare [kə m'pɛ ə ] v. 比较,对照,比喻 +723. sector [ˈ sektə ] n. & v. 扇区,段;分段 +724. problem [ˈ prɔ blə m] n. 问题,难题 +725. vertically ['və :tikə li] ad. 竖直地,直立地 +726. horizontally [ˌ hɔ ri'zɔ ntli] ad. 水平地 +727. backspace ['bækˌ speis] v. 退格,回退 +728. terminate [ˈ tə :mineit] v. 端接,终止 +729. people [ˈ pi:pl] n. 人们 +730. short [ʃ ɔ :t] a. & n. 短的;短路 +731. drag [dræg] vt. 拖,拉,牵,曳 +732. formatted [fɔ :rmæt] a. 有格式的 +733. preview ['pri:vju:] n. & vt. 预映 +734. underscore ['ʌ ndə 'skɔ :] vt. 在…下面划线 +735. correctly [kə 'rektli] ad. 正确地 +736. initially [i'niʃ ə li] ad. 最初,开头 +737. reformat [ˌ ri'fɔ mæt] v. 重定格式 +738. inside [inˈ said] n. & a. 内部,内容;内部的 +739. integrate [ˈ intigreit] v. 综合,集成 +740. controlled [kə nˈ trə ul] a. 受控制的,受操纵的 +741. period [ˈ piə riə d] n. 周期 +742. huge [hju:dʒ ] a. 巨大的,非常的 +743. determined [di'tə :mind] a. 坚决的,毅然的 +744. trailing ['treiliŋ] n. & a. 结尾;尾随的 +745. seek [si:k] v. 查找,寻找,探求 +746. introduction [ˌ intrə 'dʌ kʃ ə n] n. 入门,介绍,引进 +747. indent ['indent,in'dent] v. 缩排 +748. base [ˈ beisis] n. 基,底,基地址 +749. integer ['intidʒ ə ] n. 整数 +750. attempt [ə ˈ tempt] vt. & n. 尝试,试验 +751 - 800 +751. twice [twais] n. & ad. 两次,两倍于 +752. formed [fɔ :m] a. & n. 成形 +753. subscript ['sʌ bskript] n. 注脚,下标 +754. tiny [ˈ taini] a. 微小的,微量的 +755. model [ˈ mɔ dl] n. 模型,样机,型号 +756. correction [kə 'rekʃ ə n] n. 校正,修正 +757. rating [ˈ reitiŋ] n. 定额,标称值 +758. secondary ['sekə nderi] a. 辅助的,第二的 +759. opened a. 开路的,断开的 +760. limit ['limit] n. 极限,限界 +761. sun [sʌ n] n. 太阳,日 +762. translate [træns'leit] v. 翻译,转换,平移 +763. reason ['ri:zn] n. 原因,理由 +764. colon ['kə ulə n] n. 冒号“:” +765. avoid [ə 'vɔ id] vt. 避免,取消,无效 +766. range [reindʒ ] n. 范围,域,区域 +767. allocate ['ælə keit] vt. 分配 +768. wordperfect a. 一字不错地熟记的 +769. simply ['simpli] ad. 简单地,单纯地 +770. verify ['verifai] vt. 鉴定,检验,核对 +771. manner ['mænə ] n. 方法,样式,惯例 +772. direction [di'rekʃ ə n] n. 方向,定向,指向 +773. portion ['pɔ :ʃ ə n] n. & vt. 部分;分配 +774. emulator ['emjuleitə ] n. 仿真器,仿真程序 +775. successful [sə k'sesfə l] a. 成功的 +776. applied [ə 'plaid] a. 适用的,外加的 +777. sum [sʌ m] n. 和,合计,总额 +778. achieve [ə 'tʃ i:v] vt. 完成,实现 +779. together [tə 'geðə ] ad. 一同,共同,相互 +780. affect [ə ˈ fekt] vt. 影响,改变,感动 +781. delay [di'lei] v. 延迟 +782. free [fri:] a. 自由的,空闲的 +783. properly ['prɔ pə li] ad. 真正地,适当地 +784. kind [kaind] n. 种类,属,级,等 +785. splitting ['splitiŋ] n. 分区(裂) +786. feature [fi:tʃ ə ] n. 特征,特点 +787. console ['kɔ nsə ul,kə n'sə ul] n. 控制台,操作台 +788. operate ['ɔ pə reit] v. 操作,运算 +789. kernel ['kə :nl] n. 内核(核心)程序 +790. easy ['i:zi] a. & ad. 容易的;容易地 +791. modifier ['mɔ difaiə ] n. 修改量,变址数 +792. invalid ['invə li:d] a. 无效的 +793. compiler [kə m'pailə ] n. 编译程序(器) +794. dot [dɔ t] n. 点 +795. beep [bi:p] n. 蜂鸣声,嘀嘀声 +796. face [feis] n. 面,表面 +797. random ['rændə m] a. 随机的 +798. facility [fə 'siliti] n. 设施,装备,便利 +799. heading [ˈ hediŋ] n. 标题 +800. asynchronous [ei'siŋkrə nə s] a. 异步的,非同步的 +801 - 850 +801. series ['siə ri:z] n. 序列,系列,串联 +802. individual [ˌ indi'vidjuə l] a. 个别的,单个的 +803. explain [iks'plein] v. 阐明,解释 +804. paste [peist] n. 湖,胶,膏 +805. welcome ['welkə m] vt. & n. 欢迎 +806. six [siks] n. & a. 六(个)(的) +807. early ['ə :li] a. & ad. 早期,初期 +808. wrap [ræp] v. & n. 包装,缠绕 +809. blue [blu:] a. & n. 蓝(色),青色 +810. queue [kju:] v. & n. 排队,队列 +811. interrupt [ˌ intə ˈ rʌ pt] v. & n. 中断 +812. respect [riˈ spekt] n. & vt. 遵守,关系 +813. converted [kə n'və :tid] a. 转换的,变换的 +814. common ['kɔ mə n] a. 公用的 +815. hyphen ['haifə n] n. 连字符,短线 +816. serial ['siə riə l] a. 串行的,串联的 +817. loading ['lə udiŋ] n. 装入,加载,存放 +818. retain [ri'tein] vt. 保持,维持 +819. setup ['setʌ p] n. 安排,准备,配置 +820. freeze [fri:z] v. 冻结,结冰 +821. intend [in'tend] vt. 打算,设计 +822. explanation [ˌ eksplə 'neiʃ ə n] n. 说明,注解,注释 +823. certain ['sə :tn] a. 确实的,确定的 +824. zap [zæp] v. 迅速离去,击溃 +825. archive ['ɑ:kaiv] vt. 归档 +826. negative [ˈ negə tiv] a. 负的,否定的 +827. image ['imidʒ ] n. 图像,影像,映像 +828. platform ['plætfɔ :m] n. 平台,台架 +829. often ['ɔ :fə n] ad. 经常,往往,屡次 +830. signal [ˈ signə l] n. & v. 信号;发信号 +831. cpu 控制处理部件 +832. bit [bait] n. 比特;(二进制)位 +833. fully ['fuli] ad. 十分,完全 +834. deactivate [di:'æktiveit] vt. 释放,去活化 +835. especially [is'peʃ ə li] ad. 特别(是),尤其 +836. usually ['ju:ʒ uə li] ad. 通常,平常,一般 +837. recommend [ˌ rekə 'mend] vt. 推荐,建议 +838. maintain [mein'tein] vt. 维护,保养,保留 +839. important [im'pɔ :tə nt] a. 严重的,显著的 +840. central [ˈ sentrə l] a. 中央的,中心的 +841. addition [ə 'diʃ ə n] n. 加法,增加 +842. anytime [ˈ enitaim] ad. 在任何时候 +843. analyst [ˈ ænə list] n. 分析员 +844. false [fɔ :ls] a. 假(布尔值),错误 +845. black [blæk] a. & n. 黑色的,黑色 +846. gather [ˈ gæðə ] n. 聚集,集合 +847. cycle [ˈ saikə l] n. & v. 周,周期;循环 +848. relative [ˈ relə tiv] a. 相对的 +849. offer [ˈ ɔ fə ] v. 提供,给予,呈现 +850. ending [ˈ endiŋ] n. 结束 +851 - 900 +851. rent [rent] v. & n. 租用;裂缝 +852. sentence [ˈ sentə ns] n. 句(子) +853. remember [riˈ membə ] v. 存储,记忆,记住 +854. proper [ˈ prɔ pə ] a. 真的,固有的 +855. design [diˈ zain] v. 设计 +856. examine [igˈ zæmin] v. 检验,考试,审查 +857. initial [iˈ niʃ ə l] a. 最初的,初始的 +858. corrupt [kə 'rʌ pt] v. & a. 恶化;有毛病的 +859. buy [bai] v. 买,购买,赢得 +860. increase ['inkri:s,in'kri:s] v. 增加,增大 +861. host [hə ust] n. 主机 +862. sample ['sæmpl] n. & v. 样品,样本;抽样 +863. pending [ˈ pendiŋ] a. 悬而未决的,未定的 +864. divide [diˈ vaid] v. 除 +865. boot [bu:t] n. 引导,靴 +866. hide [haid] v. 隐藏,隐蔽 +867. half [hɑ:f] n. & a. & ad. 一半,半个 +868. magenta [mə ˈ dʒ entə ] n. & a. 深红色(的) +869. leading [ˈ li:diŋ] n. & a. 引导(的) +870. wrong [rɔ ŋ] a. & ad. n. 错误(的) +871. today [tə ˈ dei] n. & ad. 今天 +872. least [li:st] a. & ad. 最小(的) +873. opposite [ˈ ɔ pə zit] a. & n. & ad. 相反的 +874. white [wait] a. & n. 白色(的) +875. override [ˌ ə uvə ˈ raid] v. & n. 超越,克服 +876. brown [braun] a. & n. 褐色(的),棕色 +877. hex [heks] a. & n. 六角形的 +878. rest [rest] n. & v. 剩余,休息 +879. damage [ˈ dæmidʒ ] n. & vt. 损伤,故障 +880. instant [ˈ instə nt] a. 立刻的,直接的 +881. reserved [riˈ zə :vd] a. 保留的,预订的 +882. technology [tekˈ nɔ lə dʒ i] n. 工艺,技术,制造学 +883. handle ['hændl] n. 处理,句柄 +884. apply [ə ˈ plai] v. 应用,适用于,作用 +885. stand [stænd] v. 处于(状态),保持 +886. payment [ˈ peimə nt] n. 支付,付款 +887. kilobyte ['kilə ˌ bait] n. 千字节(kb) +888. parenthesis [pə 'renθisis] n. 括弧,圆括号 +889. scan [skæn] v. 扫描,扫视,搜索 +890. locating [lə u'kə itiŋ] n. 定位,查找 +891. developer [di'velə pə ] n. 开发者,显影剂 +892. murder [ˈ mə :də ] n. 弄坏,毁掉 +893. flush [flʌ ʃ ] v. 弄平,使齐平 +894. unlock [ʌ nˈ lɔ k] v. 开锁,打开 +895. movement [ˈ mu:vmə nt] n. 传送,移动 +896. consecutive [kə nˈ sekjutiv] a. 连续的,连贯的 +897. collection [kə 'lekʃ ə n] n. 集合,聚集,画卷 +898. front [frʌ nt] a. 前面的,正面的 +899. addressing [ə 'dresiŋ] n. 寻址 +900. prefix [ˈ pri:fiks] n. 前缀 +901 - 950 +901. carousel ['kærə 'sel] n. 圆盘传送带 +902. safety ['seifti] n. 安全,保险 +903. static [ˈ stætik] a. 静态的,不变的 +904. background ['bækgraund] n. 背景,底色,基础 +905. product ['prɔ də kt] n. (乘)积,产品 +906. assignment [ə 'sainmə nt] n. 赋值,分配 +907. bad [bæd] a. 坏的,不良的 +908. declare [di'klɛ ə ] v. 说明 +909. adjust [ə 'dʒ ʌ st] vt. 调整,调节,控制 +910. recognize ['rekə gnaiz] v. 识别 +911. route [ru:t] n. 路线,路由 +912. respectively [ri'spektivli] ad. 分别地 +913. unsuccessful ['ʌ nsə k'sesful] a. 不成功的,失败的 +914. received [ri'si:vd] a. 被接收的,公认的 +915. navigate ['næviˌ geit] v. 导航,驾驶 +916. considered [kə n'sidə d] a. 考虑过的,被尊重的 +917. due [dju:] a. 到期的,应付(给)的 +918. recently ['ri:sntli] ad. 近来 +919. room [ru:m] n. 房间,空间 +920. descend [diˈ send] v. 下降,落下 +921. fact [fækt] n. 事实 +922. alter [ˈ ɔ :ltə ] v. 改变,修改 +923. track [træk] n. 磁道,轨道 +924. precedence [ˈ presidə ns] n. 优先权 +925. skeleton [ˈ skelitə n] n. 骨架,框架 +926. log [lɔ g] n. & v. 记录,存入 +927. star [stɑ:] n. 星形,星号 +928. hot [hɔ t] a. 热的 +929. replaceable [ri'pleisə bl] a. 可替换的 +930. accessible [ə kˈ sesə bə l] a. 可以使用的 +931. involve [in'vɔ lv] vt. 涉及,卷入,占用 +932. configure [kə n'figə ] vt. 使成形 +933. question [ˈ kwestʃ (ə )n] n. 问题 +934. green [gri:n] n. & a. 绿色绿色的 +935. entirely [in'taiə li] ad. 完全地,彻底地 +936. helpful ['helpfə l] a. 有帮助的,有用的 +937. middle ['midl] a. 中间的 +938. declared [di'klɛ ə d] a. 承认的,申报的 +939. compress ['kɔ mpres,kə m'pres] vt. 压缩,精减 +940. graphically ['græfikə li] ad. 用图表表示 +941. auto [ˈ ɔ :tə u] a. 自动的 +942. automatic [ˌ ɔ :tə 'mætik] a. 自动的 +943. aligned [ə 'laind] a. 对准的,均衡的 +944. anywhere ['eniwɛ ə ] ad. 在任何地方 +945. terminal ['tə :minl] n. 终端,端子 +946. door [dɔ :] n. 舱门,入口,孔 +947. expire [iks'paiə ] v. 终止,期满 +948. resolution [ˌ rezə ˈ lu:ʃ ə n] n. 分辨率 +949. local [ˈ lə ukə l] a. 局部的,本地的 +950. semicolon [ˌ semi'kə ulə n] n. 分号(;) +951 - 1000 +951. reread [ri:'ri:d] vt. 重读 +952. overwrite [ˌ ə uvə 'rait] v. 重写 +953. critical ['kritikə l] a. & n. 临界的;临界值 +954. manager [ˈ mænidʒ ə ] n. 管理程序 +955. capability [ˌ keipə 'biliti] n. 能力,效力,权力 +956. affected [ə ˈ fektid] a. 受了影响的 +957. allowed [ə ˈ lau] a. 容许的 +958. border ['bɔ :də ] n. 边界,框,界限 +959. cache [kæʃ ] n. 高速缓存 +960. bell [bel] n. 铃,钟 +961. play [plei] v. 玩,奏,放音,放象 +962. quickly ['kwikli] a. 快,迅速地 +963. fastback ['fɑ:stbæk] n. 快速返回 +964. answer ['ɑ:nsə ] n. & v. 响应,回答;答复 +965. represent [ˌ repri'zent] v. 表示,表现,代表 +966. difference ['difə rə ns] n. 差分,差 +967. highest [haiist] a. 最高的 +968. project [prə 'dʒ ekt] n. 项目,计划,设计 +969. physical ['fizikə l] a. 物理的,实际的 +970. matter ['mætə ] n. 物质,内容,事情 +971. hercules ['hə :kjuli:z] n. 大力神,大力士 +972. reduce [ri'dju:s] v. 减少,降低,简化 +973. publisher ['pʌ bliʃ ə ] n. 出版者,发行人 +974. trim [trim] n. 区标,微调 +975. substitute ['sʌ bstitju:t] v. 代替,替换,代入 +976. disabled [dis'eibld] a. 禁止的,报废的 +977. recent ['ri:snt] a. 近来的 +978. positive ['pɔ zitiv] a. 正的,阳的,正片 +979. upgrade ['ʌ pgreid] v. 升级,提高质量 +980. instance ['instə ns] n. & vt. 例子,情况;举例 +981. happen ['hæpə n] vi. (偶然)发生,碰巧 +982. elapsed [iˈ læps] vi. & n. 经过 +983. future ['fju:tʃ ə ] n. & a. 将来,未来的 +984. midnight ['midnait] n. & a. 午夜 +985. though [ðə u] conj. 虽然,尽管 +986. nor [nɔ :] conj. 也不 +987. mono ['mɔ nə u] a. & n. 单音的 +988. slide [slaid] v. & n. 滑动,滑动触头 +989. abort [ə 'bɔ :t] v. & n. 中断,故障 +990. jump [dʒ ʌ mp] v. & n. 转移 +991. toward prep. 朝(着…方向) +992. throughout [θru(:)ˈ aut] prep. 贯穿,整,遍 +993. via ['vaiə ] prep. 经过,经由 +994. among [ə 'mʌ ŋ] prep. 在…之中,中间 +995. neither ['ni:ðə ] a. & pron. (两者)都不 +996. layer ['leiə ] n. & v. 层,涂层 +997. scatter ['skætə ] v. 散射,分散,散布 +998. attention [ə 'tenʃ ə n] n. 注意(信号) +999. convention [kə n'venʃ ə n] n. 常规,约定,协定 +1000. conventional [kə n'venʃ ə nl] a. 常规的,习惯的 +1001 - 1050 +1001. tool [tu:l] n. 工具,刀 +1002. handler ['hændlə ] n. 处理程序 +1003. processor ['prə usesə ] n. 处理机,处理程序 +1004. desktop ['desktɔ p] a. 台式的 +1005. build [bild] v. 建造,建立,组合 +1006. windowing ['wində uiŋ] n. 开窗口 +1007. development [di'velə pmə nt] n. 开发,研制,显影 +1008. exceed [ik'si:d] v. 超过,大于 +1009. understand [ˌ ʌ ndə 'stænd] v. 懂,明白(了),理解 +1010. horizontal [ˌ hɔ ri'zɔ ntl] a. 水平的,横向的 +1011. alphabetically ad. 按字母表顺序 +1012. meet [mi:t] v. “与”,符合,满足 +1013. protect [prə 'tekt] vt. 保护 +1014. reserve [ri'zə :v] vt. 保留,预定,预约 +1015. clock [klɔ k] n. 时钟,计时器,同步 +1016. manifest ['mænifest] vt. 表明,显示,显现 +1017. safe [seif] a. 安全的,可靠的 +1018. disconnect [ˌ diskə 'nekt] vt. 拆接,断开,拆线 +1019. clockwise [ˈ klɔ k-waiz] a. 顺时针的 +1020. eliminate [iˈ limineit] vt. 除去,消除,切断 +1021. actual [ˈ æktʃ uə l] a. 实际的,现实的 +1022. declaration [ˌ deklə ˈ reiʃ ə n] n. 说明,申报 +1023. probably ['prɔ bə bli] ad. 多半,很可能 +1024. ring [riŋ] n. & v. 环,圈;按铃 +1025. cover [ˈ kʌ və ] vt. 盖,罩,套 +1026. indicator [ˈ indikeitə ] n. 指示器,指示灯 +1027. apple ['æpl] n. 苹果 +1028. icon ['aikɔ n] n. 图符,象征 +1029. consideration [kə nsidə 'reiʃ ə n] n. 考虑,研究,讨论 +1030. skill ['skil] n. 技巧 +1031. picture ['piktʃ ə ] n. 图象,画面 +1032. layout ['leiaut] n. 布置,布局,安排 +1033. suggest [sə ˈ dʒ est] vt. 建议,提议,暗示 +1034. convenient [kə nˈ vi:niə nt] a. 方便的,便利的 +1035. instruct [inˈ strʌ kt] vt. 讲授,命令 +1036. appendix [ə 'pendiks] n. 附录 +1037. medium [ˈ mi:diə m] n. & a. 媒体;中等的 +1038. truncate [trʌ ŋˈ keit] vt. 截尾,截断 +1039. inhibit [inˈ hibit] vt. 禁止 +1040. nearly ['niə li] ad. 近乎,差不多,几乎 +1041. warn [wɔ :n] vt. 警告,警戒,预告 +1042. underline [ˌ ʌ ndə 'lain] n. 下划线 +1043. register ['redʒ istə ] n. 寄存器 +1044. stuff [stʌ f] n. & vt. 材料;装入 +1045. exclude [iks'klu:d] vt. 排除,除去 +1046. destroy [dis'trɔ i] vt. 破坏,毁坏,打破 +1047. calculation [ˌ kælkju'leiʃ ə n] n. 计算,统计,估计 +1048. angle ['æŋgl] n. 角,角度 +1049. lexical ['leksikə l] a. 辞典的,词法的 +1050. decide [diˈ said] v. (使)判定,判断 +1051 - 1100 +1051. trouble [ˈ trʌ bə l] n. 故障 +1052. processing ['prɔ sesiŋ] n. (数据)处理,加工 +1053. customer ['kʌ stə mə ] n. 顾客,客户 +1054. port [pɔ :t] n. 端口,进出口 +1055. discuss [di'skʌ s] vt. 讨论,论述 +1056. segment ['segmə nt] n. 段,片段,图块 +1057. filing ['failiŋ] n. (文件的)整理汇集 +1058. identically [ai'dentikli] ad. 相等,恒等 +1059. market ['mɑ:kit] n. 市场,行情,销路 +1060. valuable ['væljuə bl] a. 有价值的,贵重的 +1061. limited ['limitid] a. 有限的,(受)限制的 +1062. trying ['traiiŋ] a. 费劲的,困难的 +1063. heap [hi:p] n. 堆阵 +1064. grey [grei] n. & a. 灰色;灰色的 +1065. permanently ['pə :mə nə ntli] ad. 永久地,持久地 +1066. accelerator [æk'selə ˌ reitə ] n. 加速装置,加速剂 +1067. originally [ə 'ridʒ ə nə li] ad. 原来,最初 +1068. ability [ə 'biliti] n. 性能,能力,效率 +1069. internally [in'tə :nə li] ad. 在内(部) +1070. derelict ['derilikt] vt. 中途淘汰 +1071. redirect [ˌ ri:di'rekt] vt. 重定向 +1072. reside [ri'zaid] vi. 驻留 +1073. header ['hedə ] n. 首部,标题,报头 +1074. extra [ˈ ekstrə ] a. 特别的,额外的 +1075. repeated [riˈ pi:tid] a. 重复的 +1076. death [deθ] n. 毁灭,消灭 +1077. observe [ə b'zə :v] v. 观察,探测 +1078. density ['densiti] n. 密度 +1079. management [ˈ mænidʒ mə nt] n. 管理 +1080. environmental [inˌ vaiə rə n'mentl] a. 周围的,环境的 +1081. surrounding [sə 'raundiŋ] a. 周围的,环绕的 +1082. master ['mɑ:stə ] a. 总要的,总的 +1083. recursive [ri'kə :siv] a. 递归的,循环的 +1084. trap [træp] n. & vt. 陷阱;俘获 +1085. dimensional [di'menʃ ə nə l] n. 尺寸的,…维的 +1086. logic [ˈ lɔ dʒ ik] n. 逻辑(线路) +1087. conjunction [kə n'dʒ ʌ ŋkʃ ə n] n. 逻辑乘,“与” +1088. identical [ai'dentikə l] a. 相等的,相同的 +1089. advice [ə d'vais] n. 意见,参考说明 +1090. meaning [ˈ mi:niŋ] n. 意义,含义 +1091. fall [fɔ :l] n. 落下,降落 +1092. interval ['intə və l] n. 间歇,区间 +1093. compatibility [kə mˌ pætə 'biliti] n. 兼容性,适应性 +1094. rule [ru:l] n. 规则,法则,尺 +1095. flag [flæg] n. 标志(记),特征(位) +1096. criterion [krai'tiə riə n] n. 标准,判据,准则 +1097. office ['ɔ :fis] n. 办公室,局,站 +1098. express [iks'pres] a. 快速的 +1099. volume ['vɔ ljum] n. 卷,册,体积,容量 +1100. soft [sɔ ft] a. 软的 +1101 - 1150 +1101. rated ['reitid] a. 额定的 +1102. activity [æk'tiviti] n. 活力,功率 +1103. odometer [ə u'dɔ mitə ] n. 里程表,计程仪 +1104. phoenix ['fi:niks] n. 凤凰,绝世珍品 +1105. obtain [ə b'tein] v. 获得,得到 +1106. easel ['i:zl] n. 框,(画)架 +1107. latter ['lætə ] a. 后面的,最近的 +1108. decrease ['di:kri:s,di:'kri:s] v. 减少,降低,缩短 +1109. mainframe ['meinfreim] n. 主机,大型机 +1110. debugger ['di:'bʌ gə ] n. 调试程序 +1111. diacritical [ˌ daiə 'kritikə l] a. 区分的,辩别的 +1112. confidential [ˌ kɔ nfiˈ denʃ ə l] a. 机密的 +1113. trace [treis] v. 跟踪,追踪 +1114. division [di'viʒ ə n] n. 除,除法,(程序)部分 +1115. regular ['regjulə ] a. 正则的,正规的 +1116. implicit [im'plisit] a. 隐式的 +1117. mention ['menʃ ə n] vt. & n. 叙述,说到 +1118. near [niə ] ad. & prep. 领近,接近 +1119. fifth [fifθ] n. & a. 第五,五分之一 +1120. seven ['sevn] n. & a. 七(个) +1121. whereas [hwɛ ə r'æz] conj. 面,其实,既然 +1122. review [ri'vju:] v. & n. (再)检查 +1123. whatever [wɔ t'evə ] pron. & a. 无论什么 +1124. transform [træns'fɔ :m] v. & n. 变换,变换式 +1125. align [ə 'lain] v. & n. 定位,对准 +1126. yellow ['jelə u] a. & n. 黄色(的) +1127. assist [ə 'sist] v. & n. 加速,帮助 +1128. finish ['finiʃ ] v. & n. 完成,结束 +1129. micro ['maikrə u] a. & n. 微的,百万分之一 +1130. beyond [bi'jɔ nd] prep. 超过,那边 +1131. against [ə 'geinst,ə 'genst] prep. 反对,阻止 +1132. upon [ə 'pɔ n] prep. 依据,遵照 +1133. service [ˈ sə :vis] n. & vt. 服务,业务 +1134. little ['litl] a. 小的,少量的 +1135. exhaust [ig'zɔ :st] v. 取尽,用完 +1136. choice [tʃ ɔ is] n. 选择,精品 +1137. sounding ['saundiŋ] a. 发声的 +1138. develop [di'velə p] v. 发展,研制,显影 +1139. holding ['hə uldiŋ] n. 保持,固定,存储 +1140. alpha ['ælfə ] n. 希腊字母α,未知数 +1141. constant ['kɔ nstə nt] n. 常数 +1142. warranty ['wɔ rə nti] n. 保证(书),授权 +1143. stay [stei] v. 停止,停留 +1144. industry ['ində stri] n. 工业 +1145. trigger ['trigə ] n. & v. 触发器;触发 +1146. lesson ['lesn] n. 功课,教训 +1147. handling ['hændliŋ] n. 处理,操纵 +1148. treat [tri:t] v. 处理,加工 +1149. busy ['bizi] a. 忙碌的,占线的 +1150. usage ['ju:sidʒ ] n. 应用,使用,用法 +1151 - 1200 +1151. difficult ['difikə lt] a. 困难的,不容易的 +1152. failure ['feiljə ] n. 失效,故障,失败 +1153. communication [k ə ˌ mju:ni'kei ʃ ən] n. 通信 +1154. building ['bildiŋ] n. 建造,建筑,房屋 +1155. ally [ə 'lai] v. 联合,与…关联 +1156. exclamation [ˌ eksklə 'meiʃ ə n] n. 惊叹(号) +1157. turning ['tə :niŋ] a. 转弯的,旋转的 +1158. whole [hə ul] a. 全部的,整个的 +1159. parent ['pɛ ə rə nt] n. 双亲,父代 +1160. connection [kə 'nekʃ ə n] n. 连接(法) +1161. connectivity [kə 'nektiviˌ ti] n. 连通性,联络性 +1162. translation [træns'leiʃ ə n] n. 翻译,变换,平移 +1163. dynamic [dai'næmik] a. 动态的,动力的 +1164. foreground ['fɔ :graund] n. 前台 +1165. preserve [pri'zə :v] vt. 保存,维持 +1166. vice [vais] n. 缺点,毛病,错误 +1167. necessarily ['nesə serili] ad. 必定,当然 +1168. circle [ˈ sə :kə l] n. 圆,圈,循环,周期 +1169. differ ['difə ] vi. 不同,不一致 +1170. stationary ['steiʃ ə nə ri] a. 静止的,平稳的 +1171. extract ['ekstrækt,iks'trækt] vt. 抽取,摘录,开方 +1172. unrecognized ['ʌ n'rekə gnaizd] a. 未被认出的 +1173. thereafter [ðɛ ə 'æftə ] ad. 此后,据此 +1174. inverse ['in'və :s] a. 反向的,逆的 +1175. spell [spel] v. 拼写 +1176. limiting ['limitiŋ] n. (电路参数)限制处理 +1177. restructure [ri:'strʌ ktʃ ə ] vt. 调整,重新组织 +1178. delimit [di:'limit] vt. 定界,定义 +1179. pay [pei] v. 付款,支付 +1180. separately ['sepə ritli] ad. 分别地 +1181. classify ['klæsifai] vt. 分类,分级 +1182. interfere [ˌ intə ˈ fiə ] vi. 干涉,干扰,冲突 +1183. mind [maind] n. 愿望,想法,智力 +1184. individually [ˌ indi'vidjuə li] ad. 个别地,单独地 +1185. vertical ['və :tikə l] a. 垂直的,立(式)的 +1186. undesirable ['ʌ ndi'zairə bl] a. 不合乎需要的 +1187. lot [lɔ t] n. 一块(批,组,套) +1188. piece [pi:s] n. 一块,部分,段 +1189. unavailable ['ʌ nə 'veilə bl] a. 不能利用的 +1190. unlike [ˌ ʌ nˈ laik] a. 不象的,不同的 +1191. sit [sit] v. 位于,安装 +1192. insufficient [ˌ insə 'fiʃ ə nt] a. 不足的,不适当的 +1193. map [mæp] n. & vt. 图;映射,变址 +1194. figure ['figə ] n. 数字;图,图形,形状 +1195. prepare [pri'pɛ ə ] v. 准备 +1196. consider [kə nˈ sidə ] v. 考虑,认为,设想 +1197. detect [diˈ tekt] vt. 检测 +1198. convenience [kə n'vi:njə ns] n. 方便,便利 +1199. method ['meθə d] n. 方法,方案 +1200. mean [mi:n] n. & vt. 平均;意味着 +1201 - 1250 +1201. salary ['sælə ri] n. & vt. 薪水;发工资 +1202. pacific [pə 'sifik] a. 平稳的,太平(洋)的 +1203. strong [strɔ ŋ] a. 强的 +1204. emphasize [ˈ emfə saiz] v. 强调,着重,增强 +1205. department [diˈ pɑ:tmə nt] n. 部门,门类,系 +1206. forced [fɔ :st] a. 强制的,压力的 +1207. ansi n. 美国国家标准协会 +1208. permanent ['pə :mə nə nt] a. 永久的 +1209. remark [ri'mɑ:k] n. 评注,备注 +1210. away [ə ˈ wei] ad. 离开,(去)掉 +1211. concatenate [kɔ n'kætineit] vt. 连接,串联,并置 +1212. lightning ['laitniŋ] n. 闪电 +1213. additionally [ə 'diʃ ə nli] ad. 另外,又 +1214. emulate [ˈ emjuleit] v. 仿真,模仿;赶上或超过 +1215. tape [teip] n. 磁带,纸带 +1216. accidentally [ˌ æksi'dentə li] ad. 偶然地 +1217. concept ['kɔ nsept] n. 概念 +1218. optimize ['ɔ ptimaiz] v. 优选,优化 +1219. counter ['kauntə ] n. 计数器,计算器 +1220. expect [ikˈ spekt] vt. 期望,期待,盼望 +1221. subsequently [ˈ sʌ bsikwə ntli] ad. 其后,其次,按着 +1222. registration [ˌ redʒ iˈ streiʃ ə n] n. 登记,挂号,读数 +1223. city [ˈ siti] n. 城市,市区 +1224. designate [ˈ dezignit, -neit] vt. 任命,标志 +1225. visible [ˈ vizə bə l] a. 可见的,明显的 +1226. consult [kə n'sʌ lt] v. 咨询,顾问 +1227. completely [kə m'pli:tli] ad. 十分,完全,彻底 +1228. virtually [ˈ və :tʃ uə li] ad. 实际上 +1229. substantially [sə bˈ stænʃ ə li] ad. 实质上,本质上 +1230. specialize ['speʃ ə laiz] v. (使)专门化 +1231. fail [feil] n. 故障,失效 +1232. primarily [prai'mə rili] ad. 首先,起初,原来 +1233. sequentially [si'kwenʃ ə li] ad. 顺序地 +1234. client ['klaiə nt] n. 顾客,买主 +1235. runtime [rʌ n'taim] n. 运行时间 +1236. fix [fiks] v. 固定,定影 +1237. author [ˈ ɔ :θə ] n. 程序设计者,作者 +1238. programmer ['prə ugræmə ] n. 程序设计人员 +1239. commercial [kə ˈ mə :ʃ ə l] a. 商业的,经济的 +1240. particularly [pə ˈ tikjulə li] ad. 特别,格外,尤其 +1241. low [lə u] a. 低的,浅的,弱的 +1242. sheet [ʃ i:t] n. (图)表,纸,片 +1243. employee [ˌ em'plɔ ii:] n. 雇员 +1244. legal [ˈ li:gə l] a. 合法的,法律的 +1245. qualified ['kwɔ lifaid] a. 合格的,受限制的 +1246. context [ˈ kɔ ntekst] n. 上下文,来龙去脉 +1247. involved [inˈ vɔ lvd] a. 有关的 +1248. conditional [kə n'diʃ ə nə l] a. 有条件的 +1249. halfway ['hɑ:f'wei] a. 中途的,不彻底的 +1250. oriented ['ɔ :riə ntid] a. 有向的,定向的 +1251 - 1300 +1251. pair [pɛ ə ] n. (一)对,一双 +1252. week [wi:k] n. (一)星期,(一)周 +1253. suppressed [sə ˈ pres] vt. 抑制,取消 +1254. subroutine ['sʌ bru:'ti:n] n. 子程序 +1255. bracketed ['brækə tid] a. 加括号的 +1256. manually ['mænjuə li] ad. 用手,手动地 +1257. preset [pri:'set] vt. 预置 +1258. autoindex [ˈ ɔ :tə uˈ indeks]n. 自动变址(数) +1259. restrict [riˈ strikt] vt. 约束,限制 +1260. performance [pə 'fɔ :mə ns] n. 性能,实绩 +1261. showing ['ʃ ə uiŋ] n. 显示,表现 +1262. ever [ˈ evə ] ad. 在任何时候,曾经 +1263. distribution [ˌ distriˈ bju:ʃ ə n] n. 分布,分配 +1264. denote [diˈ nə ut] vt. 指示,意味着,代表 +1265. cash [kæʃ ] n. 现金 +1266. repeatedly [riˈ pi:tidli] ad. 重复地 +1267. replicate [ˈ replikeit] vt. 重复,复制 +1268. mega ['megə ] n. 兆,百万 +1269. conform [kə nˈ fɔ :m] vi. 遵从,符合 +1270. rebuild [ri:'bild] v. 重建,修复,改造 +1271. certainty ['sə :tnti] n. 必然,确实 +1272. controller [kə n'trə ulə ] n. 控制器 +1273. pseudo ['sju:də u] a. 假的,伪的,冒充的 +1274. manage ['mænidʒ ] v. 管理,经营,使用 +1275. administrator [ə d'ministreitə ] n. 管理人,行政人员 +1276. ensemble [ɑ:n'sɑ:mbl] n. 总体,集合体 +1277. bus [bʌ s] n. 总线,信息通路 +1278. allowable [ə 'lauə bl] a. 容许的,承认的 +1279. limitations [ˌ limiˈ teiʃ ə n] n. 限制,边界 +1280. restriction [ri'strikʃ ə n] n. 限制,约束,节流 +1281. height [hait] n. 高度 +1282. remainder [ri'meində ] n. 余数,余项,剩余 +1283. traverse ['trævə :s] v. 横渡,横过,横断 +1284. organization [ˌ ɔ :gə nai'zeiʃ ə n] n. 结构,机构,公司 +1285. resulting [ri'zʌ ltiŋ] a. 结果的,合成的 +1286. solution [sə 'lu:ʃ ə n] n. 解,解法,解答 +1287. external [eks'tə :nl] a. 外部的 +1288. adequate ['ædikwit] a. 足够的,充分的 +1289. interpretability n. 配合动作性 +1290. vary [ˈ veə ri] v. 变化,变换 +1291. gap [gæp] n. 间隙,间隔,缝隙 +1292. indexing ['indeksiŋ] n. 变址,标引,加下标 +1293. board [bɔ :d] n. 板,插件板 +1294. package ['pækidʒ ] n. 插件,(软件)包 +1295. insertion [in'sə :ʃ ə n] n. 插入,嵌入,插页 +1296. intervene [ˌ intə 'vi:n] vi 插入,干涉 +1297. conflict ['kɔ nflikt] v. 冲突,碰头 +1298. really [ˈ riə li] a. 真正地,确实地 +1299. overflow [ˌ ə uvə 'flə u,'ə uvə flə u] v. 溢出,上溢 +1300. charge [tʃ ɑ:dʒ ] n. 电荷,充电,负荷 +1301 - 1350 +1301. phone [fə un] n. 电话,电话机,音素 +1302. virtual ['və :tjuə l] a. 虚(拟)的,虚拟 +1303. compose [kə m'pə uz] v. 组成,构成,构图 +1304. snapshot ['snæpʃ ɔ t] n. 抽点打印 +1305. sensitivity [ˌ sensi'tiviti] n. 灵敏度 +1306. familiar [fə 'miljə ] a. 熟悉的,惯用的 +1307. mach [mɑ:k] n. 马赫(速度单位) +1308. incorrect [ˌ inkə 'rekt] a. 错误的,不正确的 +1309. cut [kʌ t] v. 割,切 +1310. lowest ['lə uist] a. 最低的,最小的 +1311. simple ['simpl] a. 简单的 +1312. subsequent ['sʌ bsikwə nt] a. 后来的,其次的 +1313. capitalized ['kæpitə lɑizd] a. 大写的 +1314. compact [kə m'pækt] a. 紧致的,压缩的 +1315. plain [plein] n. 明码 +1316. noted ['nə utid] a. 著名的 +1317. desirable [diˈ zaiə rə bə l] a. 所希望的,称心的 +1318. substitution [ˌ sʌ bsti'tju:ʃ ə n] n. 代替,替换,置换 +1319. consume [kə n'sju:m] v. 消耗,使用 +1320. forget [fə 'get] v. 忘记 +1321. keyed [ki:d] a. 键控的 +1322. overstrike [ə uvə 'straik] n. 过打印 +1323. tornado [tɔ :ˈ neidə u] n. 旋风,龙卷风 +1324. quotation [kwə u'teiʃ ə n] n. 引证,引用(句) +1325. ones [wʌ n] n. 二进制反码 +1326. parse [pɑ:z] vt. (语法)分析 +1327. experience [iks'piə riə ns] vt. & n. 试验 +1328. manufacture [ˌ mænju'fæktʃ ə ] vt. & n. 制造(业),工业 +1329. hundred ['hʌ ndrə d] n. & a. (一)百,百个 +1330. thousand [ˈ θauzə nd] n. & a. (一)千,无数的 +1331. twentieth ['twentiiθ] n. & a. 第二十(的) +1332. understanding [ˌ ʌ ndə ˈ stændiŋ] n. & a. 了解的,聪明的 +1333. hand [hænd] n. & a. 手,手工(动)的 +1334. restricting [ris'triktiŋ] n. & a. 限制(的) +1335. fancy ['fænsi] n. & a. 想象(的),精制的 +1336. wide [waid] a. & ad. 宽的,广阔的 +1337. fine [fain] a. & ad. 微小的,细的 +1338. worry ['wʌ ri] v. & n. (使)烦恼 +1339. somewhat ['sʌ mwɔ t] pron. & ad. 稍微,有点 +1340. quiet ['kwaiə t] a. & n. 静态,静止的 +1341. purge [pə :dʒ ] v. & n. 清除 +1342. mod a. & n. 时髦的 +1343. numeral ['nju:mə rə l] n. & n. 数字的,数码 +1344. whichever [witʃ 'evə ] a. & pron. 无论哪个 +1345. purchase ['pə :tʃ ə s] n. & v. 购买 +1346. care [kɛ ə ] n. & v. 关心,注意 +1347. watch [wɔ tʃ ] n. & v. 监视,观测 +1348. endeavor [inˈ devə ] n. & v. 尽力,力图 +1349. mismatch [ˌ mis'mætʃ ] n. & vt. 失配,不匹配 +1350. printout ['printaut] n. 印出 +1351 - 1400 +1351. ellipsis [i'lipsis] n. 省略符号,省略(法) +1352. ship [ʃ ip] n. 舰,船 +1353. british [ˈ britiʃ ] a. & n. 英国的;英国人 +1354. parallel ['pærə lel] a. 并行 +1355. custom [ˈ kʌ stə m] a. & n. 常规的,惯例;用户 +1356. congratulation [kə nˌ grætjuˈ leiʃ ə n]n. 祝贺 +1357. protection [prə ˈ tekʃ ə n] n. 保护 +1358. glass [glɑ:s] n. 玻璃 +1359. pattern ['pætə n] n. 模式 +1360. insure [in'ʃ uə ] v. 保证,保障 +1361. stopping ['stɔ piŋ] n. 停止,制动(状态) +1362. factory ['fæktə ri] n. 工厂,制造厂 +1363. implement [ˈ implimə nt] n. & vt. 工具;执行,实现 +1364. effort ['efə t] n. 工作,研究计划 +1365. worker [ˈ wə :kə ] n. 工作人员 +1366. ampersand ['æmpə sænd] n. &号(and) +1367. deal [di:l] v. 处理,分配,交易 +1368. power [ˈ pauə ] n. 功率,电源,幂 +1369. difficulty ['difikə lti] n. 困难,难点 +1370. lose [lu:z] n. 失去,损失 +1371. magic [ˈ mædʒ ik] n. 魔术,幻术 +1372. proprietary [prə 'praiə tə ri] a. 专有的 +1373. aware [ə ˈ weə ] a. 知道的,察觉到的 +1374. numerous [ˈ nju:mə rə s] a. 为数众多的,无数的 +1375. vowel [ˈ vauə l] n. 元音,母音 +1376. closely ['klə usli] a. 精密地,仔细地 +1377. accuracy ['ækjurə si] n. 精确度,准确度 +1378. traditional [trə 'diʃ ə nə l] a. 传统的,惯例的 +1379. synchronization [ˌ siŋkrə nai'zeiʃ ə n] n. 同步 +1380. fragment ['frægmə nt] n. 片段,段,分段 +1381. primary [ˈ praimə ri] a. 原始的,主要的 +1382. safely [ˈ seifli] ad. 安全地,确实地 +1383. habit ['hæbit] n. 习惯 +1384. comprise [kə mˈ praiz] vt. 包括,由…组成 +1385. landler n. 兰德勒舞曲 +1386. absence [ˈ æbsə ns] n. 缺少,没有 +1387. revolutionize [ˌ revə 'lu:ʃ ə naiz] vt. 变革,彻底改革 +1388. constantly [ˈ kɔ nstə ntli] ad. 不变地,经常地 +1389. seldom ['seldə m] ad. 不常,很少,难得 +1390. unfortunately [ʌ nˈ fɔ :tʃ ə nitli] ad. 不幸,遗憾地 +1391. expunge [ikˈ spʌ ndʒ ] vt. 擦除,删掉 +1392. security [siˈ kjuə riti] n. 安全性,保密性 +1393. touch [tʌ tʃ ] v. & n. 按,揿,触;触力 +1394. contrast [ˈ kɔ ntrɑ:st] n. 反差,对比,对比度 +1395. invent [inˈ vent] vt. 创造,想象 +1396. reflect [ri'flekt] v. 反射 +1397. undone [ˌ ʌ nˈ dʌ n] a. 未完成的 +1398. unshift [ʌ n'ʃ ift] v. 未移动,不移档 +1399. complex [ˈ kɔ mpleks] a. & n. 复杂的;复数 +1400. complexity [kə mˈ pleksiti] n. 复杂性,复杂度 +1401 - 1450 +1401. creation [kriˈ eiʃ ə n] n. 创造,创作 +1402. unknown [ˌ ʌ nˈ nə un] a. 未知的,无名的 +1403. greatly [ˈ greitli] ad. 大大地,非常 +1404. cost [kɔ st] n. 值,价值,成本 +1405. degrade [diˈ greid] v. 降低,减少,递降 +1406. suggestion [sə 'dʒ estʃ ə n] n. 暗示,提醒 +1407. real [riə l] n. 实数,实的,实型 +1408. experimentation [ikˌ sperimen'teiʃ n] n. 实验(工作,法) +1409. experiment [ikˈ sperimə nt] n. 实验,试验(研究) +1410. substantial [sə bˈ stænʃ ə l] a. 实质的,真正的 +1411. solely ['sə ulli] ad. 独自,单独,只 +1412. announce [ə ˈ nauns] vt. 发表,宣布 +1413. squeeze [skwi:z] v. 挤压 +1414. distribute [di'stribjut] vt. 分布,配线,配给 +1415. negate [ni'geit] vt. 否定,求反,“非” +1416. capture [ˈ kæptʃ ə ] vt. 俘获,捕捉 +1417. father [ˈ fɑ:ðə ] n. 父,上层(树节点的) +1418. reinstate [ˌ ri:inˈ steit] vt. 复原,恢复 +1419. tutorial [ˌ ri:inˈ steit] a. 指导的 +1420. nicety [ˈ naisiti] n. 细节,精细 +1421. roll [rə ul] n. & v. 案卷;卷动,滚动 +1422. exponent [eks'pə unə nt] n. 指数,阶,幂 +1423. exponential [ˌ ekspə u'nenʃ ə l] a. 指数的,幂的,阶的 +1424. 1424. prefer [priˈ fə :] vt. 更喜欢,宁愿 +1425. complicated [ˈ kɔ mplikeitid] v. 使复杂化,使混乱 +1426. reactivate [riˈ æktiveit] v. 使恢复活动 +1427. spread [spred] v. 展开,传播 +1428. synchronize [ˈ siŋkrə naiz] v. 使同步 +1429. formation [fɔ :'meiʃ ə n] n. 构造,结构,形成 +1430. widely ['waidli] ad. 广泛,很远 +1431. comma [ˈ kɔ mə ] n. 逗号“,”,逗点 +1432. very [ˈ veri] ad. 很,非常,最 +1433. unnecessary [ʌ nˈ nesə sə ri] a. 不必要的,多余的 +1434. unchanged [ʌ nˈ tʃ eindʒ d] a. 不变的 +1435. cross [krɔ s] n. 交叉,十字准线 +1436. yet [jet] ad. 还,仍然,至今 +1437. slowly [ˈ slə uli] ad. 缓慢地 +1438. inexperienced [ˌ iniksˈ piə riə nst] a. 不熟练的,外行的 +1439. noninteractive ['nɔ nintə 'æktiv] a. 不相关的,非交互的 +1440. unwanted ['ʌ n'wɔ ntid] a. 不需要的,多余的 +1441. unused [ˌ ʌ nˈ ju:zd] a. 不用的,空着的 +1442. unmarked [ˌ ʌ n'mɑ:kt] a. 没有标记的 +1443. nothing [ˈ nʌ θiŋ] n. 没有任何东西 +1444. chart [tʃ ɑ:t] n. 图(表) +1445. dearly [ˈ diə li] ad. 极,非常,昂贵地 +1446. extremely [ikˈ stri:mli] ad. 极端地,非常 +1447. hardly [ˈ hɑ:dli] ad. 几乎不,未必 +1448. placement ['pleismə nt] n. 布局 +1449. think [θiŋk] v. 考虑,以为,判断 +1450. technical ['teknikə l] a. 技术的,专业的 +1451 - 1500 +1451. idea [ai'diə ] n. 思想,观念 +1452. stamp [stæmp] n. 图章 +1453. indirectly [ˌ indiˈ rektli] ad. 间接地 +1454. equation [iˈ kweiʃ ə n] n. 方程,方程式 +1455. smooth [smu:ð] v. & a. 平滑;平滑的 +1456. attached [ə ˈ tætʃ ] a. 附加的 +1457. average [ˈ ævə ridʒ ] n. 平均,平均数 +1458. quietly [ˈ kwaiə tli] ad. 静静地 +1459. discard [disˈ kɑ:d] v. 删除,废除,放弃 +1460. never [ˈ nevə ] ad. 决不,从来不 +1461. initiate [iˈ niʃ ieit] vt. 开创,起始 +1462. powerful [ˈ pauə fə l] a. 强大的,大功率的 +1463. purpose ['pə :pə s] n. & vt. 目的,用途;打算 +1464. regard [ri'gɑ:d] vt. 考虑,注意,关系 +1465. daily ['deili] a. 每日的,日常的 +1466. possibly [ˈ pɔ sə bli] ad. 可能地,合理地 +1467. potentially [pə 'tenʃ ə li] ad. 可能地,大概地 +1468. moreover [mɔ :ˈ rə uvə ] ad. 况且,并且,此外 +1469. american [ə ˈ merikə n] a. 美国的 +1470. guard [gɑ:d] v. & n. 防护;防护装置 +1471. world [wə :ld] n. 世界,全球 +1472. independent [ˌ indiˈ pendə nt] a. 独立的 +1473. independently [ˌ indiˈ pendə ntli] a. 独立地 +1474. continuously [kə n'tinjuə sli] ad. 连续不断地 +1475. shield ['ʃ i:ld] v. 屏蔽,罩,防护 +1476. glance ['ʃ i:ld] n. 闪烁 +1477. happening ['hæpə niŋ] n. 事件,偶然发生的事 +1478. transaction [træn'zækʃ ə n] n. 事项,事务,学报 +1479. emulation [ˌ emju'leiʃ ə n] n. 仿真,仿效 +1480. strike [straik] v. 敲,击 +1481. dump [dʌ mp] v. (内存信息)转储 +1482. occasionally [ə 'keiʒ ə nə li] ad. 偶尔(地),不时 +1483. tension ['tenʃ ə n] n. 张力 +1484. probable ['prɔ bə bl] a. 概率的,可能的 +1485. talent [ˈ tælə nt] n. 才能,技能,人才 +1486. financial [fə ˈ nænʃ ə l] a. 财务的,金融的 +1487. meter [ˈ mi:tə ] n. 仪表,米 +1488. logged [lɔ :gd] a. 记录的,浸透的 +1489. ware [wɛ ə ] n. 仪器,商品 +1490. disregard [ˌ disri'gɑ:d] vt. 轻视,把…忽略不计 +1491. waiting [ˈ weitiŋ] a. 等待的 +1492. preceding [pri(:)ˈ si:diŋ] a. 先的,以前的 +1493. comparison [kə mˈ pærisə n] n. 比较,对照 +1494. advanced [ə dˈ vɑ:nst] a. 先进的,预先的 +1495. rate [reit] n. 比率,速率,费率 +1496. fly [flai] v. 飞,跳过 +1497. programmable ['prə ugræmə bə l] a. 可编程的 +1498. definable [di'fainə bl] a. 可定义的,可确定的 +1499. readable ['ri:də bl] a. 可读的 +1500. recoverable [ri'kʌ və rə bl] a. 可恢复的,可回收的 +1501 - 1550 +1501. possibility [ˌ pɔ sə ˈ biliti] n. 可能性 +1502. finisher ['finiʃ ə (r)] n. 成品机 +1503. applicable [ˈ æplikə bə l] a. 可适用的,合适的 +1504. printable ['printə bl] a. 可印刷的 +1505. executable ['eksikju:tə bə l] a. 可执行的 +1506. essentially [iˈ senʃ ə li] ad. 实质上,本来 +1507. confuse [kə nˈ fju:z] vt. 使混乱,干扰 +1508. familiarize [fə 'miljuraiz] vt. 使熟悉,使通俗化 +1509. employe [ˌ emplɔ iˈ i:] vt. 使用,花费 +1510. suitable [ˈ su:tə bə l, ˈ sju:-] a. 适合的,相适宜的 +1511. generation [ˌ dʒ enə ˈ reiʃ ə n] n. (世)代,(发展)阶段 +1512. quality [ˈ kwɔ liti] n. 质量,性质,属性 +1513. defective [diˈ fektiv] a. 故障的,有毛病的 +1514. interpretable [in'tə :pritə bl] a. 彼此协作的 +1515. interest [ˈ intrist] n. 兴趣,注意,影响 +1516. fourscore [ˈ fɔ :ˈ skɔ :] n. 八十 +1517. teach [ti:tʃ ] v. 教,讲授 +1518. procedural [prə u'si:dʒ ə rə l] a. 程序上的 +1519. phrase [freiz] n. 短语,成语 +1520. specifically [spiˈ sifikə li] ad. 特别地,逐一地 +1521. penalty ['penə lti] n. 惩罚,罚款,负担 +1522. violate [ˈ vaiə leit] vt. 违犯,妨碍,破坏 +1523. indefinitely [inˈ defə nitli] ad. 无限地,无穷地 +1524. major [ˈ meidʒ ə ] a. 较大的,主要的 +1525. higher ['haiə (r)] a. 较高的 +1526. wise [waiz] a. 聪明的 +1527. becoming [biˈ kʌ miŋ] a. 合适的,相称的 +1528. equally [ˈ i:kwə li] ad. 相等地,相同地 +1529. enjoy [inˈ dʒ ɔ i] vt. 享受,欣赏,喜爱 +1530. forth [fɔ :θ] ad. 向前 +1531. disappear [ˌ disə ˈ piə ] vi. 消失 +1532. crop [krɔ p] v. 切,剪切 +1533. diagonally [dai'ægə nə li] ad. 斜(对) +1534. labeled ['leibld] a. 有标号的 +1535. decision [di'siʒ ə n] n. 判定,决定,决策 +1536. effective [i'fektiv] a. 有效的 +1537. significant [sigˈ nifikə nt] a. 有效的,有意义的 +1538. avail [ə ˈ veil] v. & n. 有益于;利益 +1539. hang [hænd] v. 中止,暂停,挂起 +1540. craze [kreiz] n. & v. 裂纹开裂 +1541. consequently [ˈ kɔ nsikwə ntli] ad. 因此,从而 +1542. introduce [ˈ intrə ˈ dju:s] vt. 引进,引导 +1543. team [ti:m] n. 队,小组 +1544. visual [ˈ viʒ juə l] a. 视觉的,直观的 +1545. acknowledgment [ə kˈ nɔ lidʒ mə nt] n. 接收(收妥),承认 +1546. efficiently [iˈ fiʃ ə ntli] ad. 有效地 +1547. predict [priˈ dikt] vt. 预测,预言 +1548. anticipate [ænˈ tisipeit] vt. 预先考虑,抢…先 +1549. bypass [ˈ baipɑ:s] n. 旁路 +1550. nature [ˈ neitʃ ə ] n. 自然,天然 +1551 - 1600 +1551. natural [ˈ nætʃ ə rə l] a. 自然的 +1552. grant [grɑ:nt] vt. 允许,授权 +1553. logarithm ['lɔ gə ˌ riðə m] n. 对数 +1554. reappears [ˌ ri:ə ˈ piə ] vi. 再现,重现 +1555. reload [ri:'lə ud] vt. 再装入 +1556. occupy [ˈ ɔ kjupai] vt. 占有,充满 +1557. photograph [ˈ fə utə grɑ:f] n. 照片;v.照相 +1558. terminating ['tə :mineitiŋ] n. 终止,终结,收信 +1559. resolve [ri'zɔ lv] v. 分辨,解像 +1560. unsafe ['ʌ n'seif] v. 恢复 +1561. separator ['sepə reitə ] n. 分隔符 +1562. hierarchical [ˌ haiə 'rɑ:kikl] a. 分级的,分层的 +1563. assortment [ə ˈ sɔ :tmə nt] n. 种类,花色品种 +1564. growing ['grə uiŋ] n. 分类,分组,成群 +1565. discussion [di'skʌʃə n] n. 讨论,商议,论述 +1566. alphabet [ˈ ælfə bet] n. 字母,字母表 +1567. scattered ['skætə d] a. 分散的 +1568. eventually [iˈ ventʃ uə li] ad. 终于,最后 +1569. finally [ˈ fainə li] ad. 终于,最后 +1570. subgroup ['sʌ bgru:p] n. 分组,子群 +1571. superimpose [ˌ su:pə rimˈ pə uz, ˌsju:-] vt. 重叠,叠加 +1572. reorganization [ˌ ri:ɔ :gə naiˈ zeiʃ ə n] vt. 重排,改组 +1573. rewrite [ˌ ri:ˈ rait] vt. 重写,再生 +1574. university [ˌ ju:niˈ və :siti] n. (综合性)大学 +1575. deter [diˈ tə :] vt. 阻止,拦住,妨碍 +1576. pool [pu:l] n. & v. 池,坑;共享 +1577. moment [ˈ mə umə nt] n. 矩,力矩,磁矩 +1578. shut [ʃ ʌ t] v. 关闭 +1579. closed [klə uzd] a. 关闭的,闭迹 +1580. respond [riˈ spɔ nd] v. 回答,响应 +1581. repeating [riˈ pi:t] n. 重复,循环 +1582. repetitive [ri'petitiv] a. 重复的 +1583. reenter [ˌ ri:'entə ] v. 重新进入 +1584. rearrange ['ri:ə 'reindʒ ] v. 重新整理,重新排序 +1585. rectangular [rekˈ tæŋgjulə ] a. 矩形的,成直角的 +1586. tag [tæg] n. 特征,标记,标识符 +1587. suppose [sə 'pə uz] v. 假定,推测 +1588. supposed [sə 'pə uzd] a. 假定的,推测的 +1589. manipulating [mə ˈ nipjuleit] v. 操纵,操作 +1590. operator [ˈ ɔ pə reitə ] n. 操作员,运算符 +1591. masking ['mɑ:skiŋ] n. 掩蔽,屏蔽 +1592. price [prais] n. 价格 +1593. demonstrate ['demə nstreit] v. 论证,证明,证实 +1594. importance [imˈ pɔ :tə ns] n. 价值,重要 +1595. pipe [paip] n. 管,导管 +1596. overall [ˈ ə uvə rɔ :l] a. 总共的,全部的 +1597. turnkey ['tə :nki:] n. 总控钥匙 +1598. restricted [ris'triktid] a. 受限制的,受约束的 +1599. suspension [sə ˈ spenʃ ə n] n. 暂停,中止,挂起 +1600. seamless ['si:mlis] a. 无缝的 +1601 - 1650 +1601. clipper ['klipə ] n. 限幅器,钳位器 +1602. unsigned ['ʌ n'saind] a. 无符号的 +1603. unformatted [ʌ n'fɔ :mætid] a. 无格式的 +1604. infinite ['infinit] a. 无限的,无穷的 +1605. useless ['ju:slis] a. 无用的 +1606. limiter ['limitə ] n. 限制(幅)器 +1607. mountain ['mauntin] n. 高山,山脉 +1608. redundant [ri'dʌ ndə nt] a. 冗余的 +1609. dependent [di'pendə nt] a. 相关的 +1610. contiguous [kə n'tigjuə s] a. 相连的,邻接的 +1611. consistent [kə n'sistə nt] a. 相容的,一致的 +1612. multiprocessing ['mʌ ltiˌ prə usesiŋ] n. 多重处理,多道处理 +1613. architecture [ˈ ɑ:kitektʃ ə ] n. 结构,构造 +1614. structural [ˈ strʌ ktʃ ə rə l] a. 结构的,结构上的 +1615. outcome [ˈ autkʌ m] n. 结果,成果,输出 +1616. association [ə ˌ sə usiˈ eiʃ ə n] n. 结合,协会,联想 +1617. opinion [ə ˈ pinjə n] n. 意见,见解,判断 +1618. interpret [inˈ tə :prit] v. 解释 +1619. explanatory [iks'plænə tə ri] a. 解释(性)的 +1620. assemble [ə ˈ sembə l] v. 汇编,装配 +1621. assembler [ə 'semblə ] n. 汇编程序 +1622. cad [kæd]计算机辅助设计 +1623. arithmetic [ə ˈ riθmə tik] n. 算术,运算 +1624. varying ['vɛ ə riŋ] a. 变化的,可变的 +1625. representative [repri'zentə tiv] a. 典型的,表示的 +1626. typical ['tipikə l] a. 典型的,标准的 +1627. sufficient [sə ˈ fiʃ ə nt] a. 充足的,足够的 +1628. blast [blɑ:st] v. & n. 清除;爆炸 +1629. clean [kli:n] a. 清洁的,干净的 +1630. caret [ˈ kærit] n. 插入符号 +1631. socket [ˈ sɔ kit] n. 插座,插孔,插口 +1632. stated ['steitid] a. 规定的 +1633. protocol [ˈ prə utə kɔ l] n. 规约,协议,规程 +1634. presence [ˈ prezə ns] n. 存在,有 +1635. telephone [ˈ telifə un] n. 电话 +1636. social ['sə uʃ ə l] a. 社会的 +1637. equipment [iˈ kwipmə nt] n. 设备,装备,仪器 +1638. lending ['lendiŋ] n. & a. 借给,出租;借出的 +1639. book [buk] n. 书,手册,源程序块 +1640. circumstances [ˈ sə :kə mstə ns] n. 情况,环境,细节 +1641. situation [ˌ sitʃ uˈ eiʃ (ə )n] n. 情况,状况,势态 +1642. desk [desk] n. 书桌,控制台,面板 +1643. please [pli:z] v. 请 +1644. mixture [ˈ mikstʃ ə ] n. 混合物 +1645. representation [ˌ reprizenˈ teiʃ ə n] n. 表示 +1646. esoteric [ˌ esə u'terik] a. 深奥的,奥秘的 +1647. depth [depθ] n. 深度,浓度(颜色的) +1648. final [ˈ fainə l] a. 最终的 +1649. physically [ˈ fizikə li] a. 物理上,实际上 +1650. aid [eid] n. 帮助,辅助程序 +1651 - 1695 +1651. successive [sə kˈ sesiv] a. 逐次的,相继的 +1652. succession [sə kˈ seʃ ə n] n. 逐次性,连续性 +1653. unpack ['ʌ n'pæk] v. 拆开,卸,分开 +1654. chunk [tʃ ʌ ŋk] n. 厚块,大部分 +1655. alignment [ə 'lainmə nt] n. 序列,成直线 +1656. typewriter ['taipˌ raitə ] n. 打字机 +1657. big [big] a. 大的,重要的 +1658. tone [tə un] n. 音调,音色,色调 +1659. sensitive [ˈ sensitiv] a. 敏感的,灵敏的 +1660. reduction [riˈ dʌ kʃ ə n] n. 减化,还原,减少 +1661. indentation [ˌ indenˈ teiʃ ə n] n. 缩进,缩排 +1662. terminology [ˌ tə :miˈ nɔ lə dʒ i] n. 术语 +1663. ascending [ə 'sendiŋ] a. 增长的,向上的 +1664. augment [ɔ :gˈ ment] v. 增加,添加,扩充 +1665. increment ['inkrimə nt] n. 增量,加1,递增 +1666. gain [gein] n. 增益(系数) +1667. stream [stri:m] n. 流 +1668. obsolete ['ɔ bsə ˌ li:t] a. 作废的,过时的 +1669. accommodate [ə 'kɔ mə deit] v. 调节,适应 +1670. motif [mə uˈ ti:f] n. 主题,要点,特色 +1671. subject [ˈ sʌ bdʒ ikt] n. 主题,源 +1672. job [dʒ ɔ b] n. 作业 +1673. differentiate [ˌ difə ˈ renʃ ieit] v. 区别,分辨 +1674. distinction [diˈ stiŋkʃ ə n] n. 区别,相异,特性 +1675. distinguish [diˈ stiŋgwiʃ ] v. 区别,辨识 +1676. locking [lɔ kiŋ] n. 锁定,加锁 +1677. progress [prə u'gres] n. 进度,进展 +1678. fundamental [ˌ fʌ ndə 'mentl] a. 基本的,根本的 +1679. basis [ˈ beisis] n. 基础,座 +1680. underlying [ˌ ʌ ndə ˈ laiiŋ] a. 基础的,根本的 +1681. sound [saund] n. 声音,音响 +1682. vital [ˈ vaitl] a. 生动的,不可缺少的 +1683. national [ˈ næʃ ə n(ə )l] a. 国家的 +1684. sale [seil] n. 销售,销路 +1685. agree [ə ˈ gri:] v. 符合,相同 +1686. iterative ['itə rə tiv] a. 迭代的 +1687. inclusive [inˈ klu:siv] a. 包括的,内含的 +1688. charm [tʃ ɑ:m] n. 吸引力 +1689. hit [hit] v. 命中,瞬时干扰 +1690. course [kɔ :s] n. 过程,航向,课程 +1691. exceeded [ikˈ si:d] a. 过度的,非常的 +1692. numerical [nju:ˈ merikə l] a. 数量的,数字的 +1693. digital ['didʒ itə l] a. 数字的 +1694. combo [ˈ kɔ mbə u] n. 二进位组合码 +1695. cord [kɔ :d] n. 绳子,电线 diff --git a/InfoGenie-frontend/public/toolbox/在线JavaScript执行/app.js b/InfoGenie-frontend/public/toolbox/实用工具/JavaScript编译器/app.js similarity index 100% rename from InfoGenie-frontend/public/toolbox/在线JavaScript执行/app.js rename to InfoGenie-frontend/public/toolbox/实用工具/JavaScript编译器/app.js diff --git a/InfoGenie-frontend/public/toolbox/在线JavaScript执行/index.html b/InfoGenie-frontend/public/toolbox/实用工具/JavaScript编译器/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/在线JavaScript执行/index.html rename to InfoGenie-frontend/public/toolbox/实用工具/JavaScript编译器/index.html diff --git a/InfoGenie-frontend/public/toolbox/在线JavaScript执行/styles.css b/InfoGenie-frontend/public/toolbox/实用工具/JavaScript编译器/styles.css similarity index 100% rename from InfoGenie-frontend/public/toolbox/在线JavaScript执行/styles.css rename to InfoGenie-frontend/public/toolbox/实用工具/JavaScript编译器/styles.css diff --git a/InfoGenie-frontend/public/toolbox/Json编辑器/index.html b/InfoGenie-frontend/public/toolbox/实用工具/Json编辑器/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/Json编辑器/index.html rename to InfoGenie-frontend/public/toolbox/实用工具/Json编辑器/index.html diff --git a/InfoGenie-frontend/public/toolbox/Markdown解析器/index.html b/InfoGenie-frontend/public/toolbox/实用工具/Markdown解析器/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/Markdown解析器/index.html rename to InfoGenie-frontend/public/toolbox/实用工具/Markdown解析器/index.html diff --git a/InfoGenie-frontend/public/toolbox/AI聊天/marked.min.js b/InfoGenie-frontend/public/toolbox/实用工具/Markdown解析器/marked.min.js similarity index 100% rename from InfoGenie-frontend/public/toolbox/AI聊天/marked.min.js rename to InfoGenie-frontend/public/toolbox/实用工具/Markdown解析器/marked.min.js diff --git a/InfoGenie-frontend/public/toolbox/AI聊天/purify.min.js b/InfoGenie-frontend/public/toolbox/实用工具/Markdown解析器/purify.min.js similarity index 100% rename from InfoGenie-frontend/public/toolbox/AI聊天/purify.min.js rename to InfoGenie-frontend/public/toolbox/实用工具/Markdown解析器/purify.min.js diff --git a/InfoGenie-frontend/public/toolbox/做决定转盘/index.html b/InfoGenie-frontend/public/toolbox/实用工具/做决定转盘/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/做决定转盘/index.html rename to InfoGenie-frontend/public/toolbox/实用工具/做决定转盘/index.html diff --git a/InfoGenie-frontend/public/toolbox/白板/index.html b/InfoGenie-frontend/public/toolbox/实用工具/白板/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/白板/index.html rename to InfoGenie-frontend/public/toolbox/实用工具/白板/index.html diff --git a/InfoGenie-frontend/public/toolbox/视频播放器/hls.min.js b/InfoGenie-frontend/public/toolbox/实用工具/视频播放器/hls.min.js similarity index 100% rename from InfoGenie-frontend/public/toolbox/视频播放器/hls.min.js rename to InfoGenie-frontend/public/toolbox/实用工具/视频播放器/hls.min.js diff --git a/InfoGenie-frontend/public/toolbox/视频播放器/index.html b/InfoGenie-frontend/public/toolbox/实用工具/视频播放器/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/视频播放器/index.html rename to InfoGenie-frontend/public/toolbox/实用工具/视频播放器/index.html diff --git a/InfoGenie-frontend/public/toolbox/计算器/app.js b/InfoGenie-frontend/public/toolbox/实用工具/计算器/app.js similarity index 100% rename from InfoGenie-frontend/public/toolbox/计算器/app.js rename to InfoGenie-frontend/public/toolbox/实用工具/计算器/app.js diff --git a/InfoGenie-frontend/public/toolbox/计算器/index.html b/InfoGenie-frontend/public/toolbox/实用工具/计算器/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/计算器/index.html rename to InfoGenie-frontend/public/toolbox/实用工具/计算器/index.html diff --git a/InfoGenie-frontend/public/toolbox/计算器/styles.css b/InfoGenie-frontend/public/toolbox/实用工具/计算器/styles.css similarity index 100% rename from InfoGenie-frontend/public/toolbox/计算器/styles.css rename to InfoGenie-frontend/public/toolbox/实用工具/计算器/styles.css diff --git a/InfoGenie-frontend/public/toolbox/记事本/index.html b/InfoGenie-frontend/public/toolbox/实用工具/记事本/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/记事本/index.html rename to InfoGenie-frontend/public/toolbox/实用工具/记事本/index.html diff --git a/InfoGenie-frontend/public/toolbox/随机数生成器/index.html b/InfoGenie-frontend/public/toolbox/实用工具/随机数生成器/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/随机数生成器/index.html rename to InfoGenie-frontend/public/toolbox/实用工具/随机数生成器/index.html diff --git a/InfoGenie-frontend/public/toolbox/AI聊天/index.html b/InfoGenie-frontend/public/toolbox/网页小玩具/AI聊天/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/AI聊天/index.html rename to InfoGenie-frontend/public/toolbox/网页小玩具/AI聊天/index.html diff --git a/InfoGenie-frontend/public/toolbox/Markdown解析器/marked.min.js b/InfoGenie-frontend/public/toolbox/网页小玩具/AI聊天/marked.min.js similarity index 100% rename from InfoGenie-frontend/public/toolbox/Markdown解析器/marked.min.js rename to InfoGenie-frontend/public/toolbox/网页小玩具/AI聊天/marked.min.js diff --git a/InfoGenie-frontend/public/toolbox/Markdown解析器/purify.min.js b/InfoGenie-frontend/public/toolbox/网页小玩具/AI聊天/purify.min.js similarity index 100% rename from InfoGenie-frontend/public/toolbox/Markdown解析器/purify.min.js rename to InfoGenie-frontend/public/toolbox/网页小玩具/AI聊天/purify.min.js diff --git a/InfoGenie-frontend/public/toolbox/AI聊天/script.js b/InfoGenie-frontend/public/toolbox/网页小玩具/AI聊天/script.js similarity index 100% rename from InfoGenie-frontend/public/toolbox/AI聊天/script.js rename to InfoGenie-frontend/public/toolbox/网页小玩具/AI聊天/script.js diff --git a/InfoGenie-frontend/public/toolbox/AI聊天/style.css b/InfoGenie-frontend/public/toolbox/网页小玩具/AI聊天/style.css similarity index 100% rename from InfoGenie-frontend/public/toolbox/AI聊天/style.css rename to InfoGenie-frontend/public/toolbox/网页小玩具/AI聊天/style.css diff --git a/InfoGenie-frontend/public/toolbox/人生倒计时/index.html b/InfoGenie-frontend/public/toolbox/网页小玩具/人生倒计时/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/人生倒计时/index.html rename to InfoGenie-frontend/public/toolbox/网页小玩具/人生倒计时/index.html diff --git a/InfoGenie-frontend/public/toolbox/网页小玩具/人生倒计时/人生倒计时.html b/InfoGenie-frontend/public/toolbox/网页小玩具/人生倒计时/人生倒计时.html new file mode 100644 index 00000000..ba6eb5c0 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/网页小玩具/人生倒计时/人生倒计时.html @@ -0,0 +1,113 @@ +
    +

    人生倒计时

    +
    +
    今天已过去 小时
    +
    +
    +
    +
    +
    +
    本周已过去
    +
    +
    +
    +
    +
    +
    本月已过去
    +
    +
    +
    +
    +
    +
    今年已过去
    +
    +
    +
    +
    +
    +
    距离春节还有
    +
    +
    +
    +
    +
    +
    距离我的生日还有
    +
    +
    +
    +
    +
    + + + + diff --git a/InfoGenie-frontend/public/toolbox/网页小玩具/代码雨/index.html b/InfoGenie-frontend/public/toolbox/网页小玩具/代码雨/index.html new file mode 100644 index 00000000..96c4d868 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/网页小玩具/代码雨/index.html @@ -0,0 +1,51 @@ + + + + + + 飞雪前端艺术 + + + + + + + + + diff --git a/InfoGenie-frontend/public/toolbox/数字时钟/index.html b/InfoGenie-frontend/public/toolbox/网页小玩具/数字时钟/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/数字时钟/index.html rename to InfoGenie-frontend/public/toolbox/网页小玩具/数字时钟/index.html diff --git a/InfoGenie-frontend/public/toolbox/网页小玩具/粒子圣诞树/粒子圣诞树.html b/InfoGenie-frontend/public/toolbox/网页小玩具/粒子圣诞树/粒子圣诞树.html new file mode 100644 index 00000000..c0c002b5 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/网页小玩具/粒子圣诞树/粒子圣诞树.html @@ -0,0 +1,509 @@ + + + + + + 圣诞快乐 + + + +
    + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/toolbox/网页小玩具/网页挂钟/index.html b/InfoGenie-frontend/public/toolbox/网页小玩具/网页挂钟/index.html new file mode 100644 index 00000000..b4ba4d42 --- /dev/null +++ b/InfoGenie-frontend/public/toolbox/网页小玩具/网页挂钟/index.html @@ -0,0 +1,39 @@ + + + + + + +
    00:00:00
    + + + diff --git a/InfoGenie-frontend/public/toolbox/随机Emoji表情/index.html b/InfoGenie-frontend/public/toolbox/网页小玩具/随机Emoji表情/index.html similarity index 100% rename from InfoGenie-frontend/public/toolbox/随机Emoji表情/index.html rename to InfoGenie-frontend/public/toolbox/网页小玩具/随机Emoji表情/index.html diff --git a/InfoGenie-frontend/scripts/inject-ig-embed.js b/InfoGenie-frontend/scripts/inject-ig-embed.js new file mode 100644 index 00000000..f42ba490 --- /dev/null +++ b/InfoGenie-frontend/scripts/inject-ig-embed.js @@ -0,0 +1,25 @@ +const fs = require('fs'); +const path = require('path'); + +const root = path.join(__dirname, '../public/60sapi'); +const tag = ''; + +function walk(dir) { + for (const f of fs.readdirSync(dir)) { + const p = path.join(dir, f); + if (fs.statSync(p).isDirectory()) walk(p); + else if (f.endsWith('.html')) { + let c = fs.readFileSync(p, 'utf8'); + if (c.includes('ig-embed.js')) continue; + if (!c.includes('')) { + console.warn('skip', p); + continue; + } + c = c.replace('', `${tag}\n`); + fs.writeFileSync(p, c, 'utf8'); + console.log('ok', p); + } + } +} + +walk(root); diff --git a/InfoGenie-frontend/scripts/patch-60s-html-base.js b/InfoGenie-frontend/scripts/patch-60s-html-base.js new file mode 100644 index 00000000..e7275951 --- /dev/null +++ b/InfoGenie-frontend/scripts/patch-60s-html-base.js @@ -0,0 +1,34 @@ +/** + * 为 public/60sapi 下 HTML 注入 sixty-runtime.js,并将硬编码的 60s 域名改为 window.__SIXTY_API_BASE__ + */ +const fs = require('fs'); +const path = require('path'); +const root = path.join(__dirname, '../public/60sapi'); + +function walk(dir) { + for (const f of fs.readdirSync(dir)) { + const p = path.join(dir, f); + const st = fs.statSync(p); + if (st.isDirectory()) walk(p); + else if (f.endsWith('.html')) { + let s = fs.readFileSync(p, 'utf8'); + if (!s.includes('sixty-runtime.js')) { + if (s.includes('ig-embed.js')) { + s = s.replace( + '', + '\n' + ); + } else { + s = s.replace('', '\n'); + } + } + s = s.replace(/fetch\('https:\/\/60s\.api\.shumengya\.top(\/[^']+)'/g, "fetch(window.__SIXTY_API_BASE__+'$1'"); + s = s.replace(/fetch\(`https:\/\/60s\.api\.shumengya\.top/g, 'fetch(`${window.__SIXTY_API_BASE__}'); + s = s.replace(/const API='https:\/\/60s\.api\.shumengya\.top([^']+)'/g, "const API=window.__SIXTY_API_BASE__+'$1'"); + s = s.replace(/const BASE='https:\/\/60s\.api\.shumengya\.top'/g, 'const BASE=window.__SIXTY_API_BASE__'); + fs.writeFileSync(p, s); + } + } +} +walk(root); +console.log('patched 60sapi html'); diff --git a/InfoGenie-frontend/scripts/profile_template_renames.ps1 b/InfoGenie-frontend/scripts/profile_template_renames.ps1 new file mode 100644 index 00000000..5e4ea074 --- /dev/null +++ b/InfoGenie-frontend/scripts/profile_template_renames.ps1 @@ -0,0 +1,141 @@ +# 由 tidy_profile_templates.py 生成:关闭占用该目录的 IDE/资源管理器窗口后执行。 +$ErrorActionPreference = 'Stop' +$base = 'd:\SmyProjects\Frontend-Backend\InfoGenie\infogenie-frontend\public\toolbox\个人主页模板' + +# 阶段 1:改为临时名 +Rename-Item -LiteralPath (Join-Path $base '-色 色致安简洁引导页') -NewName '__tmp_rename_87cc6d7f_0__' +Rename-Item -LiteralPath (Join-Path $base '-色地址发布页源码') -NewName '__tmp_rename_87cc6d7f_1__' +Rename-Item -LiteralPath (Join-Path $base 'Bs缘空的个人主页') -NewName '__tmp_rename_87cc6d7f_2__' +Rename-Item -LiteralPath (Join-Path $base 'Force Yc 第六引导公告网页源码') -NewName '__tmp_rename_87cc6d7f_3__' +Rename-Item -LiteralPath (Join-Path $base 'HTML透明闪动方块导航网站源码') -NewName '__tmp_rename_87cc6d7f_4__' +Rename-Item -LiteralPath (Join-Path $base 'Master 导航页') -NewName '__tmp_rename_87cc6d7f_5__' +Rename-Item -LiteralPath (Join-Path $base 'zyyo个人主页 (1)') -NewName '__tmp_rename_87cc6d7f_6__' +Rename-Item -LiteralPath (Join-Path $base 'zyyo主页') -NewName '__tmp_rename_87cc6d7f_7__' +Rename-Item -LiteralPath (Join-Path $base 'zyyo主页2') -NewName '__tmp_rename_87cc6d7f_8__' +Rename-Item -LiteralPath (Join-Path $base '【原创】Scode源码站原创个人单页') -NewName '__tmp_rename_87cc6d7f_9__' +Rename-Item -LiteralPath (Join-Path $base '东方终焉组') -NewName '__tmp_rename_87cc6d7f_10__' +Rename-Item -LiteralPath (Join-Path $base '东方终焉组 (1)') -NewName '__tmp_rename_87cc6d7f_11__' +Rename-Item -LiteralPath (Join-Path $base '个人主页') -NewName '__tmp_rename_87cc6d7f_12__' +Rename-Item -LiteralPath (Join-Path $base '个人主页2') -NewName '__tmp_rename_87cc6d7f_13__' +Rename-Item -LiteralPath (Join-Path $base '个人主页2 (1)') -NewName '__tmp_rename_87cc6d7f_14__' +Rename-Item -LiteralPath (Join-Path $base '个人主页3') -NewName '__tmp_rename_87cc6d7f_15__' +Rename-Item -LiteralPath (Join-Path $base '个人主页源码') -NewName '__tmp_rename_87cc6d7f_16__' +Rename-Item -LiteralPath (Join-Path $base '个人介绍网页') -NewName '__tmp_rename_87cc6d7f_17__' +Rename-Item -LiteralPath (Join-Path $base '个人名片') -NewName '__tmp_rename_87cc6d7f_18__' +Rename-Item -LiteralPath (Join-Path $base '个人安全团队官方引导html单页') -NewName '__tmp_rename_87cc6d7f_19__' +Rename-Item -LiteralPath (Join-Path $base '个人安全团队官方引导html单页 (1)') -NewName '__tmp_rename_87cc6d7f_20__' +Rename-Item -LiteralPath (Join-Path $base '个简官网') -NewName '__tmp_rename_87cc6d7f_21__' +Rename-Item -LiteralPath (Join-Path $base '二次元自适应动态引导页') -NewName '__tmp_rename_87cc6d7f_22__' +Rename-Item -LiteralPath (Join-Path $base '介绍页') -NewName '__tmp_rename_87cc6d7f_23__' +Rename-Item -LiteralPath (Join-Path $base '全新自适应地址发布页HTML源码') -NewName '__tmp_rename_87cc6d7f_24__' +Rename-Item -LiteralPath (Join-Path $base '动态背景樱花飘落个人主页') -NewName '__tmp_rename_87cc6d7f_25__' +Rename-Item -LiteralPath (Join-Path $base '动态视频导航引导页源码') -NewName '__tmp_rename_87cc6d7f_26__' +Rename-Item -LiteralPath (Join-Path $base '动态雨滴玻璃主页') -NewName '__tmp_rename_87cc6d7f_27__' +Rename-Item -LiteralPath (Join-Path $base '单页') -NewName '__tmp_rename_87cc6d7f_28__' +Rename-Item -LiteralPath (Join-Path $base '卡网导航') -NewName '__tmp_rename_87cc6d7f_29__' +Rename-Item -LiteralPath (Join-Path $base '卡网导航炫酷') -NewName '__tmp_rename_87cc6d7f_30__' +Rename-Item -LiteralPath (Join-Path $base '叮当猫苹果QQ改机型PC官网') -NewName '__tmp_rename_87cc6d7f_31__' +Rename-Item -LiteralPath (Join-Path $base '天神云') -NewName '__tmp_rename_87cc6d7f_32__' +Rename-Item -LiteralPath (Join-Path $base '好看流光风格个人主页源码') -NewName '__tmp_rename_87cc6d7f_33__' +Rename-Item -LiteralPath (Join-Path $base '好看的个人仿QQ单页HTML') -NewName '__tmp_rename_87cc6d7f_34__' +Rename-Item -LiteralPath (Join-Path $base '家个人主页') -NewName '__tmp_rename_87cc6d7f_35__' +Rename-Item -LiteralPath (Join-Path $base '导航') -NewName '__tmp_rename_87cc6d7f_36__' +Rename-Item -LiteralPath (Join-Path $base '导航 1.01') -NewName '__tmp_rename_87cc6d7f_37__' +Rename-Item -LiteralPath (Join-Path $base '尘屿个人主页') -NewName '__tmp_rename_87cc6d7f_38__' +Rename-Item -LiteralPath (Join-Path $base '尽心小屋引导页') -NewName '__tmp_rename_87cc6d7f_39__' +Rename-Item -LiteralPath (Join-Path $base '引导页源码') -NewName '__tmp_rename_87cc6d7f_40__' +Rename-Item -LiteralPath (Join-Path $base '很漂亮个人主页自带音乐源码') -NewName '__tmp_rename_87cc6d7f_41__' +Rename-Item -LiteralPath (Join-Path $base '很漂亮个人主页自带音乐源码 (1)') -NewName '__tmp_rename_87cc6d7f_42__' +Rename-Item -LiteralPath (Join-Path $base '很漂亮的个人主页HTML源码') -NewName '__tmp_rename_87cc6d7f_43__' +Rename-Item -LiteralPath (Join-Path $base '很漂亮的个人主页源码') -NewName '__tmp_rename_87cc6d7f_44__' +Rename-Item -LiteralPath (Join-Path $base '很漂亮的个人主页源码 - 副本') -NewName '__tmp_rename_87cc6d7f_45__' +Rename-Item -LiteralPath (Join-Path $base '拟态个人主页(1)') -NewName '__tmp_rename_87cc6d7f_46__' +Rename-Item -LiteralPath (Join-Path $base '新拟态个人主页网站源码') -NewName '__tmp_rename_87cc6d7f_47__' +Rename-Item -LiteralPath (Join-Path $base '新拟态应用下载页HTML源码') -NewName '__tmp_rename_87cc6d7f_48__' +Rename-Item -LiteralPath (Join-Path $base '毛玻璃UI个人主页源码(开源版)') -NewName '__tmp_rename_87cc6d7f_49__' +Rename-Item -LiteralPath (Join-Path $base '毛玻璃个人引导页源码') -NewName '__tmp_rename_87cc6d7f_50__' +Rename-Item -LiteralPath (Join-Path $base '江东个人主页') -NewName '__tmp_rename_87cc6d7f_51__' +Rename-Item -LiteralPath (Join-Path $base '渐淡背景导航页源码') -NewName '__tmp_rename_87cc6d7f_52__' +Rename-Item -LiteralPath (Join-Path $base '漂亮的个人主页HTML源码') -NewName '__tmp_rename_87cc6d7f_53__' +Rename-Item -LiteralPath (Join-Path $base '炫酷个人引导页主页自适应HTML源码') -NewName '__tmp_rename_87cc6d7f_54__' +Rename-Item -LiteralPath (Join-Path $base '炫酷引导') -NewName '__tmp_rename_87cc6d7f_55__' +Rename-Item -LiteralPath (Join-Path $base '炫酷引导 (1)') -NewName '__tmp_rename_87cc6d7f_56__' +Rename-Item -LiteralPath (Join-Path $base '炫酷黑色系列源码') -NewName '__tmp_rename_87cc6d7f_57__' +Rename-Item -LiteralPath (Join-Path $base '琳琅De个人主页源码') -NewName '__tmp_rename_87cc6d7f_58__' +Rename-Item -LiteralPath (Join-Path $base '精址发布页') -NewName '__tmp_rename_87cc6d7f_59__' +Rename-Item -LiteralPath (Join-Path $base '素颜个人导航网.zip') -NewName '__tmp_rename_87cc6d7f_60__' +Rename-Item -LiteralPath (Join-Path $base '素颜引导页2.0') -NewName '__tmp_rename_87cc6d7f_61__' +Rename-Item -LiteralPath (Join-Path $base '自适应星空背景个人导航单页') -NewName '__tmp_rename_87cc6d7f_62__' +Rename-Item -LiteralPath (Join-Path $base '蓝色简洁引导页') -NewName '__tmp_rename_87cc6d7f_63__' +Rename-Item -LiteralPath (Join-Path $base '连心个人主页') -NewName '__tmp_rename_87cc6d7f_64__' +Rename-Item -LiteralPath (Join-Path $base '酷黑风个人引导页') -NewName '__tmp_rename_87cc6d7f_65__' +Rename-Item -LiteralPath (Join-Path $base '黄色简洁好看的地址发布页源码') -NewName '__tmp_rename_87cc6d7f_66__' + +# 阶段 2:改为最终名 +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_0__') -NewName '葫芦侠-绿色简洁引导页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_1__') -NewName '永久地址发布页,收藏我回家不迷路!' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_2__') -NewName 'Bs缘空的个人主页 空忆工作室 缘空科技' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_3__') -NewName '公告' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_4__') -NewName '旗下站点 - 琳琅天上 网址大全' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_5__') -NewName 'Website Guide' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_6__') -NewName 'ZYYO' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_7__') -NewName 'ZYYO引导页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_8__') -NewName 'ZYYO 好好相遇,慢慢生活' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_9__') -NewName 'Scode源码站-网站源码站长资讯站长源码站长工具游戏源码SEO教程建站教程SCODE1.COM' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_10__') -NewName 'Touhou Project - 终焉项目组' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_11__') -NewName 'Touhou Project - 终焉项目组-2' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_12__') -NewName '南淮花酱MyIndex' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_13__') -NewName '求职简历' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_14__') -NewName '正在跳转葫芦侠' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_15__') -NewName 'ZYYO-2' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_16__') -NewName '个人主页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_17__') -NewName '个人介绍' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_18__') -NewName '蝶痕-蝶影留痕' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_19__') -NewName '演示htpp' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_20__') -NewName '演示htpp-2' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_21__') -NewName '筱健的小窝-欢迎来到筱健的官网!' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_22__') -NewName '织音云' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_23__') -NewName '小凡联系方式' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_24__') -NewName '天环网络科技工作室' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_25__') -NewName '碎念个人引导页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_26__') -NewName '动态视频App导航下载引导页 - 源码来自 ( )' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_27__') -NewName 'ZYYO-3' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_28__') -NewName '导航页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_29__') -NewName '低价导航' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_30__') -NewName '518货源站' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_31__') -NewName '叮当猫苹果QQ改机型 - iPhone11在线' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_32__') -NewName '风也温柔 天神云' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_33__') -NewName '织音云zhiyinidc.com' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_34__') -NewName '欢迎来到1人个人主页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_35__') -NewName '个人主页-2' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_36__') -NewName '曦婉丫丫' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_37__') -NewName '导航' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_38__') -NewName '尘屿小站' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_39__') -NewName '永久地址发布页,收藏我回家不迷路!-2' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_40__') -NewName '鲨鱼导航迎接页面' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_41__') -NewName 'Yun Shi 的 个人主页欢迎来到我的主场~' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_42__') -NewName 'Yun Shi 的 个人主页欢迎来到我的主场~-2' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_43__') -NewName '天神个人网页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_44__') -NewName 'YUN SHI个人网页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_45__') -NewName 'YUN SHI个人网页-2' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_46__') -NewName '个人主页-3' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_47__') -NewName '个人主页-4' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_48__') -NewName '应用名称 - 下载页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_49__') -NewName '毛玻璃拟态UI - 个人主页(开源版)' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_50__') -NewName '个人简约引导页单页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_51__') -NewName '江东cc个人主页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_52__') -NewName '渐淡背景导航页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_53__') -NewName '123' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_54__') -NewName '小白' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_55__') -NewName '炫酷引导页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_56__') -NewName '炫酷引导页-2' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_57__') -NewName '演示 - 演示' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_58__') -NewName '琳琅De主页 - 突破自己,琳琅天上' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_59__') -NewName '最新地址发布页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_60__') -NewName '素颜导航网官网永久发布页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_61__') -NewName '天神引导页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_62__') -NewName '织音云-2' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_63__') -NewName '蓝色简洁永久发布页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_64__') -NewName 'Evan毕业于IT专业' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_65__') -NewName 'Anle 一款酷黑风个人引导页' +Rename-Item -LiteralPath (Join-Path $base '__tmp_rename_87cc6d7f_66__') -NewName 'XXX永久地址发布页,收藏我回家不迷路!' diff --git a/InfoGenie-frontend/scripts/tidy_profile_templates.py b/InfoGenie-frontend/scripts/tidy_profile_templates.py new file mode 100644 index 00000000..bd4d6a47 --- /dev/null +++ b/InfoGenie-frontend/scripts/tidy_profile_templates.py @@ -0,0 +1,234 @@ +# -*- coding: utf-8 -*- +"""筛选个人主页模板:删除非静态项,并按网页 title 重命名顶层文件夹。""" +from __future__ import annotations + +import re +import shutil +import sys +import uuid +from pathlib import Path + +BASE = Path( + r"d:\SmyProjects\Frontend-Backend\InfoGenie\infogenie-frontend\public\toolbox\个人主页模板" +) + +# 无 HTML 无法作为静态页;PHP 文件较多视为需服务端,非纯静态 +PHP_THRESHOLD = 5 + + +def count_html(root: Path) -> int: + n = 0 + for p in root.rglob("*"): + if p.is_file() and p.suffix.lower() in (".html", ".htm"): + n += 1 + return n + + +def count_php(root: Path) -> int: + return sum(1 for p in root.rglob("*.php") if p.is_file()) + + +def extract_title_from_text(text: str) -> str | None: + for pattern in ( + r"]*>([^<]*)", + r"]*>([^<]*)", + ): + m = re.search(pattern, text, re.I | re.DOTALL) + if m: + raw = m.group(1) + raw = re.sub(r"<[^>]+>", "", raw) + title = re.sub(r"\s+", " ", raw).strip() + title = re.sub(r'[<>:"/\\|?*]', "", title) + title = title.strip(" -_|") + if title and len(title) < 100: + return title + return None + + +def read_html(path: Path) -> str: + for enc in ("utf-8", "utf-8-sig", "gbk", "gb2312"): + try: + return path.read_text(encoding=enc) + except (UnicodeDecodeError, OSError): + continue + return path.read_text(encoding="utf-8", errors="ignore") + + +def find_entry_html(folder: Path) -> Path | None: + for name in ("index.html", "index.htm"): + for p in folder.rglob(name): + if p.is_file(): + return p + for p in folder.rglob("*"): + if p.is_file() and p.suffix.lower() in (".html", ".htm"): + return p + return None + + +def sanitize_folder_name(name: str) -> str: + for c in '<>:"/\\|?*': + name = name.replace(c, "") + name = name.strip(" .") + if len(name) > 120: + name = name[:120].rstrip() + return name or "未命名模板" + + +def ps_single_quote(s: str) -> str: + return "'" + s.replace("'", "''") + "'" + + +def write_rename_ps1(renames: list[tuple[str, str]], out_path: Path) -> None: + """两阶段重命名,避免 A→B 与 B→A 等占用冲突。""" + pairs = [(o, n) for o, n in renames if o != n] + tag = uuid.uuid4().hex[:8] + lines = [ + "# 由 tidy_profile_templates.py 生成:关闭占用该目录的 IDE/资源管理器窗口后执行。", + "$ErrorActionPreference = 'Stop'", + f"$base = {ps_single_quote(str(BASE))}", + "", + "# 阶段 1:改为临时名", + ] + mids: list[tuple[str, str, str]] = [] + for i, (old, new) in enumerate(pairs): + mid = f"__tmp_rename_{tag}_{i}__" + mids.append((old, mid, new)) + lines.append( + f"Rename-Item -LiteralPath (Join-Path $base {ps_single_quote(old)}) " + f"-NewName {ps_single_quote(mid)}" + ) + lines.extend(["", "# 阶段 2:改为最终名"]) + for _old, mid, new in mids: + lines.append( + f"Rename-Item -LiteralPath (Join-Path $base {ps_single_quote(mid)}) " + f"-NewName {ps_single_quote(new)}" + ) + out_path.write_text("\n".join(lines) + "\n", encoding="utf-8-sig") + + +def compute_renames(remaining: list[Path]) -> list[tuple[str, str]]: + used: set[str] = {c.name for c in remaining} + renames: list[tuple[str, str]] = [] + for folder in remaining: + entry = find_entry_html(folder) + if not entry: + continue + try: + text = read_html(entry) + except OSError: + continue + title = extract_title_from_text(text) + if not title: + continue + new_name = sanitize_folder_name(title) + if new_name == folder.name: + continue + final = new_name + if final in used and final != folder.name: + i = 2 + while f"{new_name}-{i}" in used: + i += 1 + final = f"{new_name}-{i}" + used.discard(folder.name) + used.add(final) + renames.append((folder.name, final)) + return renames + + +def main() -> None: + dry = "--apply" not in sys.argv + write_script = "--write-rename-script" in sys.argv + rename_only = "--rename-only" in sys.argv + script_path = Path(__file__).resolve().parent / "profile_template_renames.ps1" + + if not BASE.is_dir(): + print(f"Missing base: {BASE}") + sys.exit(1) + + if rename_only: + remaining = sorted([c for c in BASE.iterdir() if c.is_dir()], key=lambda x: x.name) + renames = compute_renames(remaining) + write_rename_ps1(renames, script_path) + print(f"已写入重命名脚本: {script_path}") + print("请在关闭占用该文件夹的程序后,在 PowerShell 中执行:") + print(f" powershell -ExecutionPolicy Bypass -File \"{script_path}\"") + return + + children = [c for c in BASE.iterdir() if c.is_dir()] + to_delete: list[tuple[Path, str, int, int]] = [] + for child in children: + h, p = count_html(child), count_php(child) + if h == 0: + to_delete.append((child, "no_html", h, p)) + elif p >= PHP_THRESHOLD: + to_delete.append((child, "php_heavy", h, p)) + + print("=== 将删除(非静态或无可展示 HTML)===") + for path, reason, h, p in sorted(to_delete, key=lambda x: x[0].name): + print(f" [{reason}] html={h} php={p} {path.name}") + + if dry: + print("\n[DRY RUN] 加参数 --apply 执行删除与重命名\n") + + delete_set = {p for p, _, _, _ in to_delete} + + if not dry: + for path, _, _, _ in to_delete: + shutil.rmtree(path, ignore_errors=False) + print(f"已删除: {path.name}") + + # 重命名:dry-run 时排除即将删除的目录 + remaining = sorted( + [c for c in BASE.iterdir() if c.is_dir() and (dry and c not in delete_set or not dry)], + key=lambda x: x.name, + ) + renames = compute_renames(remaining) + + print("=== 计划重命名(按页面 title)===") + for old, new in renames: + if old != new: + print(f" {old}\n -> {new}") + + if dry: + if write_script: + write_rename_ps1(renames, script_path) + print(f"\n已写入重命名脚本: {script_path}") + return + + write_rename_ps1(renames, script_path) + print(f"\n已写入重命名脚本(若本机重命名失败可手动执行): {script_path}") + + pairs = [(o, n) for o, n in renames if o != n] + tag = uuid.uuid4().hex[:8] + mids: list[tuple[str, str, str]] = [] + for i, (old_name, new_name) in enumerate(pairs): + mid = f"__tmp_rename_{tag}_{i}__" + mids.append((old_name, mid, new_name)) + + for old_name, mid, new_name in mids: + src = BASE / old_name + dst = BASE / mid + if not src.is_dir(): + continue + try: + src.rename(dst) + except OSError as e: + print(f"阶段1 重命名失败(可稍后运行脚本): {old_name} -> {mid} {e}") + + for old_name, mid, new_name in mids: + src = BASE / mid + dst = BASE / new_name + if not src.is_dir(): + continue + if dst.exists(): + print(f"跳过(目标已存在): {mid} -> {new_name}") + continue + try: + src.rename(dst) + print(f"重命名: {old_name} -> {new_name}") + except OSError as e: + print(f"阶段2 重命名失败(可稍后运行脚本): {mid} -> {new_name} {e}") + + +if __name__ == "__main__": + main() diff --git a/InfoGenie-frontend/scripts/verify-60sapi-paths.js b/InfoGenie-frontend/scripts/verify-60sapi-paths.js new file mode 100644 index 00000000..84836789 --- /dev/null +++ b/InfoGenie-frontend/scripts/verify-60sapi-paths.js @@ -0,0 +1,18 @@ +const fs = require('fs'); +const path = require('path'); +const { API_ITEM_STATIC_HTML } = require('../src/config/Api60sConfig.js'); + +const pub = path.join(__dirname, '../public'); +const bad = []; +for (const [id, p] of Object.entries(API_ITEM_STATIC_HTML)) { + const rel = p.replace(/^\//, ''); + const full = path.join(pub, rel); + if (!fs.existsSync(full)) bad.push({ id, p, full }); +} +if (bad.length === 0) { + console.log(`全部 ${Object.keys(API_ITEM_STATIC_HTML).length} 个静态路径对应文件均存在`); +} else { + console.log('缺失文件数:', bad.length); + console.log(JSON.stringify(bad, null, 2)); +} +process.exit(bad.length ? 1 : 0); diff --git a/InfoGenie-frontend/setting.json b/InfoGenie-frontend/setting.json index 022d8942..8a077536 100755 --- a/InfoGenie-frontend/setting.json +++ b/InfoGenie-frontend/setting.json @@ -1,8 +1,8 @@ { - "网站名字": "✨ 万象口袋 ✨", + "网站名字": "万象口袋", "网站描述": "🎨 一个跨平台的多功能聚合软件应用", "站长": "👨‍💻 by-万象口袋", "备案号": "📄 蜀ICP备2025151694号", - "网站页尾": "✨ 万象口袋 ✨ | Copyright © 2025-2025 ✨", + "网站页尾": "万象口袋 | Copyright © 2025-2025", "网站logo": "assets/logo.png" } \ No newline at end of file diff --git a/InfoGenie-frontend/src/App.js b/InfoGenie-frontend/src/App.js index 9efb2b4d..53d1301f 100755 --- a/InfoGenie-frontend/src/App.js +++ b/InfoGenie-frontend/src/App.js @@ -6,11 +6,14 @@ import styled from 'styled-components'; // 页面组件 import HomePage from './pages/HomePage'; import LoginPage from './pages/LoginPage'; +import AuthCallbackPage from './pages/AuthCallbackPage'; import Api60sPage from './pages/Api60sPage'; +import Api60sItemPage from './pages/Api60sItemPage'; import SmallGamePage from './pages/SmallGamePage'; import AiModelPage from './pages/AiModelPage'; import UserProfilePage from './pages/UserProfilePage'; -import AboutPage from './pages/AboutPage'; +import AdminPage from './pages/AdminPage'; +import ToolboxPage from './pages/ToolboxPage'; // 公共组件 import Header from './components/Header'; @@ -50,11 +53,14 @@ function App() { {/* 主要页面 */} } /> } /> + } /> } /> + } /> } /> } /> - } /> + } /> } /> + } /> {/* 通配符路由 - 所有未匹配的路径都重定向到首页 */} } /> diff --git a/InfoGenie-frontend/src/assets/fonts/MinecraftAE.ttf b/InfoGenie-frontend/src/assets/fonts/MinecraftAE.ttf deleted file mode 100644 index 330c0743..00000000 Binary files a/InfoGenie-frontend/src/assets/fonts/MinecraftAE.ttf and /dev/null differ diff --git a/InfoGenie-frontend/src/assets/fonts/kaiti1.ttf b/InfoGenie-frontend/src/assets/fonts/kaiti1.ttf deleted file mode 100644 index e3c7007c..00000000 Binary files a/InfoGenie-frontend/src/assets/fonts/kaiti1.ttf and /dev/null differ diff --git a/InfoGenie-frontend/src/components/Footer.js b/InfoGenie-frontend/src/components/Footer.js index f72ff585..bedce638 100755 --- a/InfoGenie-frontend/src/components/Footer.js +++ b/InfoGenie-frontend/src/components/Footer.js @@ -31,39 +31,6 @@ const FooterTitle = styled.h3` font-weight: bold; `; -const FooterDescription = styled.p` - font-size: 14px; - line-height: 1.6; - margin-bottom: 16px; - color: rgba(255, 255, 255, 0.9); -`; - -const FooterLinks = styled.div` - display: flex; - justify-content: center; - gap: 24px; - margin-bottom: 24px; - flex-wrap: wrap; - - @media (max-width: 768px) { - gap: 16px; - } -`; - -const FooterLink = styled.a` - color: rgba(255, 255, 255, 0.9); - text-decoration: none; - font-size: 14px; - transition: all 0.2s ease; - padding: 8px 16px; - border-radius: 6px; - - &:hover { - background: rgba(255, 255, 255, 0.1); - color: white; - } -`; - const FooterDivider = styled.div` height: 1px; background: rgba(255, 255, 255, 0.2); @@ -81,10 +48,6 @@ const Copyright = styled.p` margin-bottom: 8px; `; -const ICP = styled.p` - margin: 0; -`; - const Footer = () => { const currentYear = new Date().getFullYear(); @@ -92,7 +55,7 @@ const Footer = () => { - ✨ 万象口袋 ✨ + 万象口袋 diff --git a/InfoGenie-frontend/src/components/FullscreenEmbed.js b/InfoGenie-frontend/src/components/FullscreenEmbed.js new file mode 100644 index 00000000..8c1db4a1 --- /dev/null +++ b/InfoGenie-frontend/src/components/FullscreenEmbed.js @@ -0,0 +1,306 @@ +import React, { useState, useEffect, useCallback, useRef } from 'react'; +import { createPortal } from 'react-dom'; +import styled, { keyframes, css } from 'styled-components'; +import { FiArrowLeft, FiRefreshCw, FiAlertCircle } from 'react-icons/fi'; + +const slideUp = keyframes` + from { transform: translateY(100%); opacity: 0; } + to { transform: translateY(0); opacity: 1; } +`; + +const slideDown = keyframes` + from { transform: translateY(0); opacity: 1; } + to { transform: translateY(100%); opacity: 0; } +`; + +const spin = keyframes` + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +`; + +const fadeIn = keyframes` + from { opacity: 0; } + to { opacity: 1; } +`; + +const Overlay = styled.div` + position: fixed; + inset: 0; + z-index: 999999; + display: flex; + flex-direction: column; + background: #fff; + font-family: inherit; + animation: ${({ $closing }) => $closing ? css`${slideDown} 0.25s ease-in forwards` : css`${slideUp} 0.3s ease-out`}; +`; + +const Header = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 0 16px; + height: 52px; + flex-shrink: 0; + background: ${({ $color }) => $color}; + color: #fff; + box-shadow: 0 2px 8px rgba(0,0,0,0.12); + user-select: none; + -webkit-tap-highlight-color: transparent; +`; + +const HeaderTitle = styled.h1` + flex: 1; + margin: 0; + font-size: 16px; + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +`; + +const HeaderBtn = styled.button` + display: flex; + align-items: center; + justify-content: center; + gap: 5px; + height: 34px; + padding: 0 14px; + border: none; + border-radius: 8px; + background: rgba(255,255,255,0.18); + color: #fff; + font-size: 13px; + font-weight: 500; + cursor: pointer; + transition: background 0.2s; + flex-shrink: 0; + &:hover { background: rgba(255,255,255,0.3); } + &:active { background: rgba(255,255,255,0.1); } +`; + +const IframeWrapper = styled.div` + position: relative; + flex: 1; + overflow: hidden; +`; + +const StyledIframe = styled.iframe` + display: block; + width: 100%; + height: 100%; + border: none; + background: #fff; +`; + +const LoadingOverlay = styled.div` + position: absolute; + inset: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 16px; + background: #fff; + animation: ${fadeIn} 0.15s ease-out; + z-index: 2; +`; + +const Spinner = styled.div` + width: 36px; + height: 36px; + border: 3px solid #e5e7eb; + border-top-color: ${({ $color }) => $color}; + border-radius: 50%; + animation: ${spin} 0.7s linear infinite; +`; + +const LoadingText = styled.p` + margin: 0; + font-size: 14px; + color: #9ca3af; +`; + +const ErrorOverlay = styled.div` + position: absolute; + inset: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 16px; + background: #fff; + z-index: 2; + padding: 24px; + text-align: center; +`; + +const ErrorIcon = styled(FiAlertCircle)` + color: #ef4444; + font-size: 48px; +`; + +const ErrorTitle = styled.h2` + margin: 0; + font-size: 18px; + font-weight: 600; + color: #1f2937; +`; + +const ErrorDesc = styled.p` + margin: 0; + font-size: 14px; + color: #6b7280; + max-width: 320px; + line-height: 1.5; +`; + +const RetryButton = styled.button` + display: flex; + align-items: center; + gap: 6px; + padding: 10px 24px; + border: none; + border-radius: 10px; + background: linear-gradient(135deg, #4ade80 0%, #22c55e 100%); + color: #fff; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: transform 0.15s, box-shadow 0.15s; + &:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(74,222,128,0.35); } +`; + +const LOAD_TIMEOUT_MS = 20000; + +/** + * 全屏网页嵌入组件 + * + * @param {string} title - 顶栏标题 + * @param {string} url - 嵌入的网页地址 + * @param {function} onClose - 关闭回调 + * @param {string} headerColor - 顶栏背景色 (默认 #4ade80) + * @param {string} iframeAllow - iframe allow 属性 + * @param {function} onIframeLoad - iframe 加载完成的额外回调 + * @param {boolean} autoFocus - 加载完成后自动聚焦 iframe (游戏场景) + * @param {boolean} injectToken - 自动向 iframe 注入 localStorage token + */ +const FullscreenEmbed = ({ + title, + url, + onClose, + headerColor = '#4ade80', + iframeAllow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share', + onIframeLoad, + autoFocus = false, + injectToken = false, +}) => { + const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); + const [closing, setClosing] = useState(false); + const iframeRef = useRef(null); + const timerRef = useRef(null); + + const handleClose = useCallback(() => { + setClosing(true); + setTimeout(() => onClose(), 230); + }, [onClose]); + + useEffect(() => { + const prev = document.body.style.overflow; + document.body.style.overflow = 'hidden'; + + const onKey = (e) => { if (e.key === 'Escape') handleClose(); }; + document.addEventListener('keydown', onKey); + + timerRef.current = setTimeout(() => { + if (loading) setError(true); + }, LOAD_TIMEOUT_MS); + + return () => { + document.body.style.overflow = prev; + document.removeEventListener('keydown', onKey); + clearTimeout(timerRef.current); + }; + }, [handleClose, loading]); + + const handleIframeLoaded = useCallback((e) => { + clearTimeout(timerRef.current); + setLoading(false); + setError(false); + + if (injectToken) { + try { + const token = localStorage.getItem('token'); + if (token && e.target.contentWindow) { + e.target.contentWindow.localStorage.setItem('token', token); + } + } catch { /* cross-origin, ignore */ } + } + + if (autoFocus && e.target) e.target.focus(); + if (onIframeLoad) onIframeLoad(e); + }, [autoFocus, injectToken, onIframeLoad]); + + const handleRetry = useCallback(() => { + setLoading(true); + setError(false); + clearTimeout(timerRef.current); + timerRef.current = setTimeout(() => { + if (loading) setError(true); + }, LOAD_TIMEOUT_MS); + if (iframeRef.current) { + iframeRef.current.src = url; + } + }, [url, loading]); + + return createPortal( + +
    + + + 返回 + + {title} + + + +
    + + + { clearTimeout(timerRef.current); setError(true); }} + /> + + {loading && !error && ( + + + 正在加载 {title}… + + )} + + {error && ( + + + 页面加载失败 + 无法加载「{title}」,请检查网络连接后重试 + + + 重新加载 + + + )} + +
    , + document.body + ); +}; + +export default FullscreenEmbed; diff --git a/InfoGenie-frontend/src/components/Header.js b/InfoGenie-frontend/src/components/Header.js index 11d6b66a..3125bb33 100755 --- a/InfoGenie-frontend/src/components/Header.js +++ b/InfoGenie-frontend/src/components/Header.js @@ -1,8 +1,11 @@ -import React, { useState } from 'react'; +import React, { useState, useRef, useCallback } from 'react'; import { Link, useNavigate, useLocation } from 'react-router-dom'; import styled from 'styled-components'; -import { FiUser, FiMenu, FiX, FiLogOut, FiInfo } from 'react-icons/fi'; +import { FiUser, FiMenu, FiX, FiLogOut } from 'react-icons/fi'; import { useUser } from '../contexts/UserContext'; +import toast from 'react-hot-toast'; + +const logoSrc = `${process.env.PUBLIC_URL}/assets/logo.png`; const HeaderContainer = styled.header` background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); @@ -23,20 +26,21 @@ const HeaderContent = styled.div` justify-content: space-between; `; -const Logo = styled(Link)` +const Logo = styled.div` display: flex; align-items: center; font-size: 20px; font-weight: bold; text-decoration: none; color: white; + cursor: pointer; + user-select: none; .logo-icon { margin-right: 8px; width: 36px; height: 36px; object-fit: cover; - border-radius: 50%; } @media (max-width: 768px) { @@ -296,12 +300,129 @@ const MobileNavLink = styled(Link).withConfig({ } `; +const AdminModal = styled.div` + position: fixed; + inset: 0; + background: rgba(0,0,0,0.6); + display: flex; + align-items: center; + justify-content: center; + z-index: 10000; + backdrop-filter: blur(4px); +`; + +const AdminModalContent = styled.div` + background: linear-gradient(135deg, #e8f5e8 0%, #f1f8e9 100%); + padding: 32px; + border-radius: 18px; + width: 340px; + max-width: 90vw; + box-shadow: 0 20px 40px rgba(0,0,0,0.25); + text-align: center; +`; + +const AdminModalTitle = styled.h3` + margin: 0 0 8px; + font-size: 20px; + color: #1b5e20; +`; + +const AdminModalDesc = styled.p` + margin: 0 0 20px; + font-size: 13px; + color: #6b7280; +`; + +const AdminInput = styled.input` + width: 100%; + padding: 12px 16px; + border: 2px solid #e5e7eb; + border-radius: 10px; + font-size: 15px; + font-family: inherit; + transition: border-color 0.2s; + &:focus { border-color: #4ade80; outline: none; } +`; + +const AdminSubmit = styled.button` + width: 100%; + margin-top: 14px; + padding: 12px; + border: none; + border-radius: 10px; + background: linear-gradient(135deg, #4ade80, #22c55e); + color: #fff; + font-size: 15px; + font-weight: 600; + cursor: pointer; + transition: transform 0.15s; + &:hover { transform: translateY(-1px); } +`; + +const AdminCancel = styled.button` + width: 100%; + margin-top: 8px; + padding: 10px; + border: none; + border-radius: 10px; + background: transparent; + color: #6b7280; + font-size: 13px; + cursor: pointer; + &:hover { color: #374151; } +`; + +const ADMIN_TOKEN = 'shumengya520'; + const Header = () => { - const { user, isLoggedIn, logout, getQQAvatar } = useUser(); + const { user, isLoggedIn, logout } = useUser(); const [isMenuOpen, setIsMenuOpen] = useState(false); + const [showAdminModal, setShowAdminModal] = useState(false); + const [adminInput, setAdminInput] = useState(''); const navigate = useNavigate(); const location = useLocation(); - + + // logo 五次点击检测 + const clickCountRef = useRef(0); + const clickTimerRef = useRef(null); + + const handleLogoClick = useCallback((e) => { + e.preventDefault(); + clickCountRef.current += 1; + clearTimeout(clickTimerRef.current); + + if (clickCountRef.current >= 5) { + clickCountRef.current = 0; + // 如果已登录管理员,直接进入 + if (localStorage.getItem('admin_token') === ADMIN_TOKEN) { + navigate('/admin'); + } else { + setAdminInput(''); + setShowAdminModal(true); + } + return; + } + + // 2 秒内未达到 5 次则重置,并正常跳转首页 + clickTimerRef.current = setTimeout(() => { + clickCountRef.current = 0; + }, 2000); + + navigate('/'); + }, [navigate]); + + const handleAdminSubmit = () => { + if (adminInput === ADMIN_TOKEN) { + localStorage.setItem('admin_token', ADMIN_TOKEN); + setShowAdminModal(false); + toast.success('管理员验证通过'); + navigate('/admin'); + } else { + toast.error('令牌错误'); + setAdminInput(''); + } + }; + const isActive = (path) => { return location.pathname.startsWith(path); }; @@ -324,15 +445,16 @@ const Header = () => { <> - - InfoGenie Logo + + InfoGenie Logo 万象口袋 @@ -340,18 +462,18 @@ const Header = () => { {isLoggedIn && user ? ( <> - {getQQAvatar(user.email) ? ( + {user.avatarUrl ? ( { e.target.style.display = 'none'; e.target.nextSibling.style.display = 'inline'; }} /> ) : null} - - {user.username || user.email} + + {user.username || user.account} @@ -385,16 +507,16 @@ const Header = () => { 首页 - 聚合应用 + 60sAPI 休闲游戏 - - AI工具 + + 工具箱 - - 关于 + + AI应用 个人中心 @@ -409,16 +531,16 @@ const Header = () => { alignItems: 'center', gap: '12px' }}> - {getQQAvatar(user.email) ? ( + {user.avatarUrl ? ( ) : ( )} - {user.username || user.email} + {user.username || user.account}
    { )} + + {showAdminModal && ( + setShowAdminModal(false)}> + e.stopPropagation()}> + 🔐 管理员验证 + 请输入管理员令牌以进入后台 + setAdminInput(e.target.value)} + onKeyDown={e => e.key === 'Enter' && handleAdminSubmit()} + autoFocus + /> + 验证并进入 + setShowAdminModal(false)}>取消 + + + )} ); }; diff --git a/InfoGenie-frontend/src/components/LoginRequired.js b/InfoGenie-frontend/src/components/LoginRequired.js new file mode 100644 index 00000000..6efc07e1 --- /dev/null +++ b/InfoGenie-frontend/src/components/LoginRequired.js @@ -0,0 +1,81 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import styled from 'styled-components'; +import { FiUser } from 'react-icons/fi'; + +const Wrapper = styled.div` + background: white; + position: absolute; + top: 0; left: 0; right: 0; bottom: 0; + min-height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + padding: 60px 40px; +`; + +const Icon = styled.div` + font-size: 64px; + margin-bottom: 24px; +`; + +const Title = styled.h2` + font-size: 24px; + font-weight: bold; + color: #2e7d32; + margin-bottom: 16px; +`; + +const Text = styled.p` + color: #666; + font-size: 16px; + line-height: 1.6; + margin-bottom: 24px; +`; + +const Button = styled.button` + background: linear-gradient(135deg, #81c784 0%, #a5d6a7 100%); + color: white; + border: none; + padding: 14px 32px; + border-radius: 16px; + font-size: 16px; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + display: inline-flex; + align-items: center; + gap: 8px; + box-shadow: 0 4px 16px rgba(129, 199, 132, 0.3); + + &:hover { + transform: translateY(-2px); + box-shadow: 0 8px 24px rgba(129, 199, 132, 0.4); + } +`; + +const LoginRequired = ({ + title = '需要登录访问', + description = '该功能需要登录后才能使用,请先登录您的账户。', + icon = '🔒', +}) => { + const navigate = useNavigate(); + + return ( + +
    + {icon} + {title} + {description} + +
    +
    + ); +}; + +export default LoginRequired; diff --git a/InfoGenie-frontend/src/components/Navigation.js b/InfoGenie-frontend/src/components/Navigation.js index 449dbf66..fdb827b6 100755 --- a/InfoGenie-frontend/src/components/Navigation.js +++ b/InfoGenie-frontend/src/components/Navigation.js @@ -1,7 +1,7 @@ -import React from 'react'; +import React, { useEffect, useRef } from 'react'; import { Link, useLocation } from 'react-router-dom'; import styled from 'styled-components'; -import { FiHome, FiActivity, FiGrid, FiCpu, FiUser } from 'react-icons/fi'; +import { FiHome, FiActivity, FiGrid, FiTool, FiCpu, FiUser } from 'react-icons/fi'; const NavigationContainer = styled.nav` position: fixed; @@ -22,11 +22,23 @@ const NavigationContainer = styled.nav` const NavList = styled.div` display: flex; - justify-content: space-around; + flex-direction: row; + flex-wrap: nowrap; + justify-content: flex-start; align-items: center; - max-width: 500px; - margin: 0 auto; - padding: 0 16px; + gap: 6px; + width: 100%; + max-width: none; + margin: 0; + padding: 0 10px 0 10px; + box-sizing: border-box; + overflow-x: auto; + overflow-y: hidden; + -webkit-overflow-scrolling: touch; + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } `; const NavItem = styled(Link).withConfig({ @@ -38,8 +50,9 @@ const NavItem = styled(Link).withConfig({ text-decoration: none; color: ${props => props.isActive ? '#66bb6a' : '#6b7280'}; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); - padding: 10px 14px; - border-radius: 16px; + flex-shrink: 0; + padding: 8px 12px; + border-radius: 14px; min-width: 64px; position: relative; overflow: hidden; @@ -84,8 +97,8 @@ const NavItem = styled(Link).withConfig({ } .nav-icon { - font-size: 22px; - margin-bottom: 6px; + font-size: 20px; + margin-bottom: 4px; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); position: relative; z-index: 1; @@ -93,9 +106,10 @@ const NavItem = styled(Link).withConfig({ } .nav-text { - font-size: 11px; + font-size: 10px; font-weight: ${props => props.isActive ? '600' : '500'}; - line-height: 1; + line-height: 1.15; + white-space: nowrap; position: relative; z-index: 1; text-shadow: ${props => props.isActive ? '0 1px 2px rgba(102, 187, 106, 0.2)' : 'none'}; @@ -145,6 +159,13 @@ const NavItem = styled(Link).withConfig({ const Navigation = () => { const location = useLocation(); + const activeItemRef = useRef(null); + + useEffect(() => { + const el = activeItemRef.current; + if (!el || typeof el.scrollIntoView !== 'function') return; + el.scrollIntoView({ inline: 'center', behavior: 'smooth', block: 'nearest' }); + }, [location.pathname]); const navItems = [ { @@ -156,17 +177,22 @@ const Navigation = () => { { path: '/60sapi', icon: FiActivity, - text: '聚合应用' + text: '60sAPI' }, { path: '/smallgame', icon: FiGrid, text: '休闲游戏' }, + { + path: '/toolbox', + icon: FiTool, + text: '工具箱' + }, { path: '/aimodel', icon: FiCpu, - text: 'AI工具' + text: 'AI应用' }, { path: '/profile', @@ -192,6 +218,7 @@ const Navigation = () => { return ( diff --git a/InfoGenie-frontend/src/components/SmallGameIcons.js b/InfoGenie-frontend/src/components/SmallGameIcons.js new file mode 100644 index 00000000..3e756014 --- /dev/null +++ b/InfoGenie-frontend/src/components/SmallGameIcons.js @@ -0,0 +1,146 @@ +import React from 'react'; + +const accent = '#22c55e'; +const soft = 'rgba(74, 222, 128, 0.18)'; +const stroke = 1.8; + +function SvgBox({ children, ...rest }) { + return ( + + {children} + + ); +} + +/** 按 SMALL_GAMES 的 id 渲染矢量图标(纯 SVG,无 Emoji) */ +export function SmallGameIcon({ gameId }) { + switch (gameId) { + case '2048': + return ( + + + + + + + ); + case 'white-tile': + return ( + + + + + + ); + case 'tetris': + return ( + + + + + + + ); + case 'snake': + return ( + + + + + + ); + case 'minesweeper': + return ( + + + + + + + ); + case 'dodge-leaves': + return ( + + + + + ); + case 'plane': + return ( + + + + + + ); + case 'parkour': + return ( + + + + + + + ); + case 'floppybird': + return ( + + + + + + ); + case 'h5cube': + return ( + + + + + + ); + case 'sokoban': + return ( + + + + + + + ); + default: + return ( + + + + + ); + } +} + +export default SmallGameIcon; diff --git a/InfoGenie-frontend/src/config/Api60sConfig.js b/InfoGenie-frontend/src/config/Api60sConfig.js new file mode 100644 index 00000000..365410fa --- /dev/null +++ b/InfoGenie-frontend/src/config/Api60sConfig.js @@ -0,0 +1,254 @@ +/** + * 60s API 聚合接口配置 + * 基于 https://docs.60s-api.viki.moe/ 文档整理 + * 所有 endpoint 均为 /v2/ 前缀的相对路径,配合 apiBaseUrl 使用 + */ + +// 可选的 API 数据源列表,前端可切换 +export const API_SOURCES = [ + { id: 'self', label: '萌芽节点', baseUrl: 'https://60s.api.shumengya.top' }, + { id: 'official', label: '官方节点', baseUrl: 'https://60s.viki.moe' }, +]; + +// 默认 API 数据源 +export const DEFAULT_SOURCE_ID = 'self'; + +/** + * 渲染类型枚举 + * list — 有序列表(热搜榜单、新闻条目等) + * text — 单条文本(段子、一言、KFC文案等) + * image — 图片展示(壁纸、摸鱼日历等) + * info — 键值对信息(天气、汇率、农历等) + * table — 表格数据(油价、金价等) + * tool — 需要用户输入的工具(翻译、百科等) + * embed — 内嵌 iframe(工具箱项目) + */ + +// ========== 周期资讯 ========== +const PERIODIC_NEWS = [ + { id: '60s', title: '每天60s读懂世界', icon: '🌍', endpoint: '/v2/60s', type: 'list', desc: '每日新闻精选' }, + { id: 'ai-news', title: 'AI资讯快报', icon: '🤖', endpoint: '/v2/ai-news', type: 'list', desc: '每日AI前沿动态' }, + { id: 'bing', title: '必应每日壁纸', icon: '🖼️', endpoint: '/v2/bing', type: 'image', desc: '每日精选壁纸' }, + { id: 'exchange-rate', title: '当日货币汇率', icon: '💱', endpoint: '/v2/exchange-rate', type: 'info', desc: '实时国际汇率' }, + { id: 'today-in-history', title: '历史上的今天', icon: '📅', endpoint: '/v2/today-in-history', type: 'list', desc: '历史事件回顾' }, + { id: 'epic', title: 'Epic免费游戏', icon: '🎮', endpoint: '/v2/epic', type: 'list', desc: '本周免费领取' }, + { id: 'lunar', title: '农历信息', icon: '🌙', endpoint: '/v2/lunar', type: 'info', desc: '今日农历详情' }, + { id: 'moyu', title: '摸鱼日历', icon: '🐟', endpoint: '/v2/moyu', type: 'image', desc: '假期倒计时' }, +]; + +// ========== 热门榜单 ========== +const HOT_RANKINGS = [ + { id: 'bili', title: '哔哩哔哩热搜', icon: '📺', endpoint: '/v2/bili', type: 'list' }, + { id: 'douyin', title: '抖音热搜', icon: '🎵', endpoint: '/v2/douyin', type: 'list' }, + { id: 'rednote', title: '小红书热搜', icon: '🍠', endpoint: '/v2/rednote', type: 'list' }, + { id: 'weibo', title: '微博热搜', icon: '📱', endpoint: '/v2/weibo', type: 'list' }, + { id: 'zhihu', title: '知乎热门', icon: '💡', endpoint: '/v2/zhihu', type: 'list' }, + { id: 'toutiao', title: '今日头条', icon: '📰', endpoint: '/v2/toutiao', type: 'list' }, + { id: 'baidu-hot', title: '百度热搜', icon: '🔍', endpoint: '/v2/baidu/hot', type: 'list' }, + { id: 'baidu-teleplay', title: '百度电视剧榜', icon: '📺', endpoint: '/v2/baidu/teleplay', type: 'list' }, + { id: 'baidu-tieba', title: '百度贴吧话题', icon: '💬', endpoint: '/v2/baidu/tieba', type: 'list' }, + { id: 'dongchedi', title: '懂车帝热搜', icon: '🚗', endpoint: '/v2/dongchedi', type: 'list' }, + { id: 'quark', title: '夸克热搜', icon: '🔎', endpoint: '/v2/quark', type: 'list' }, + { id: 'hacker-news-top', title: 'HackerNews 热门', icon: '💻', endpoint: '/v2/hacker-news/top', type: 'list' }, + { id: 'hacker-news-new', title: 'HackerNews 最新', icon: '💻', endpoint: '/v2/hacker-news/new', type: 'list' }, + { id: 'ncm-rank', title: '网易云音乐榜单', icon: '🎶', endpoint: '/v2/ncm-rank/list', type: 'list' }, + { id: 'maoyan-movie', title: '猫眼实时票房', icon: '🎬', endpoint: '/v2/maoyan/realtime/movie', type: 'list' }, + { id: 'maoyan-tv', title: '猫眼电视热度', icon: '📺', endpoint: '/v2/maoyan/realtime/tv', type: 'list' }, + { id: 'maoyan-web', title: '猫眼网剧热度', icon: '💻', endpoint: '/v2/maoyan/realtime/web', type: 'list' }, + { id: 'douban-movie', title: '豆瓣一周口碑电影', icon: '🎬', endpoint: '/v2/douban/weekly/movie', type: 'list' }, + { id: 'douban-tv-cn', title: '豆瓣国产剧集', icon: '📺', endpoint: '/v2/douban/weekly/tv_chinese', type: 'list' }, + { id: 'douban-tv-global', title: '豆瓣海外剧集', icon: '🌏', endpoint: '/v2/douban/weekly/tv_global', type: 'list' }, +]; + +// ========== 实用功能 ========== +const PRACTICAL_TOOLS = [ + { id: 'weather', title: '实时天气', icon: '🌤️', endpoint: '/v2/weather/realtime', type: 'tool', + params: [{ key: 'city', label: '城市', placeholder: '例如:北京' }] }, + { id: 'weather-forecast', title: '天气预报', icon: '⛅', endpoint: '/v2/weather/forecast', type: 'tool', + params: [{ key: 'city', label: '城市', placeholder: '例如:上海' }] }, + { id: 'fanyi', title: '在线翻译', icon: '🌍', endpoint: '/v2/fanyi', type: 'tool', + params: [{ key: 'text', label: '翻译内容', placeholder: '输入需要翻译的文本' }, { key: 'to', label: '目标语言', placeholder: '如 en、ja、ko,留空自动识别' }] }, + { id: 'baike', title: '百度百科', icon: '📚', endpoint: '/v2/baike', type: 'tool', + params: [{ key: 'q', label: '搜索词', placeholder: '输入要查询的词条' }] }, + { id: 'ip', title: 'IP查询', icon: '🌐', endpoint: '/v2/ip', type: 'info', desc: '查询当前公网IP' }, + { id: 'qrcode', title: '二维码生成', icon: '📱', endpoint: '/v2/qrcode', type: 'tool', + params: [{ key: 'text', label: '内容', placeholder: '输入链接或文本' }], responseType: 'image' }, + { id: 'hash', title: '哈希工具', icon: '🗜️', endpoint: '/v2/hash', type: 'tool', + params: [{ key: 'text', label: '内容', placeholder: '输入需要哈希的文本' }] }, + { id: 'password', title: '随机密码生成', icon: '🔒', endpoint: '/v2/password', type: 'info', desc: '生成安全随机密码' }, + { id: 'password-check', title: '密码强度检测', icon: '🔐', endpoint: '/v2/password/check', type: 'tool', + params: [{ key: 'text', label: '密码', placeholder: '输入需要检测的密码' }] }, + { id: 'color-random', title: '随机颜色', icon: '🌈', endpoint: '/v2/color/random', type: 'info', desc: '随机生成一种颜色' }, + { id: 'color-palette', title: '配色方案', icon: '🎨', endpoint: '/v2/color/palette', type: 'tool', + params: [{ key: 'color', label: '基础色', placeholder: '如 #4ade80' }] }, + { id: 'health', title: '身体健康分析', icon: '🏥', endpoint: '/v2/health', type: 'tool', + params: [{ key: 'height', label: '身高(cm)', placeholder: '170' }, { key: 'weight', label: '体重(kg)', placeholder: '65' }] }, + { id: 'fuel-price', title: '今日油价', icon: '⛽', endpoint: '/v2/fuel-price', type: 'info', desc: '全国油价实时查询' }, + { id: 'gold-price', title: '今日金价', icon: '🥇', endpoint: '/v2/gold-price', type: 'info', desc: '实时黄金价格' }, + { id: 'lyric', title: '歌词搜索', icon: '🎵', endpoint: '/v2/lyric', type: 'tool', + params: [{ key: 'keyword', label: '歌曲名', placeholder: '输入歌曲名称' }] }, + { id: 'whois', title: 'Whois查询', icon: '🔍', endpoint: '/v2/whois', type: 'tool', + params: [{ key: 'domain', label: '域名', placeholder: '如 example.com' }] }, + { id: 'chemical', title: '化学元素查询', icon: '⚗️', endpoint: '/v2/chemical', type: 'tool', + params: [{ key: 'q', label: '元素', placeholder: '如 Fe 或 铁' }] }, +]; + +// ========== 消遣娱乐 ========== +const ENTERTAINMENT = [ + { id: 'duanzi', title: '随机段子', icon: '😂', endpoint: '/v2/duanzi', type: 'text' }, + { id: 'hitokoto', title: '随机一言', icon: '💭', endpoint: '/v2/hitokoto', type: 'text' }, + { id: 'kfc', title: '疯狂星期四', icon: '🍗', endpoint: '/v2/kfc', type: 'text' }, + { id: 'fabing', title: '发病文学', icon: '📖', endpoint: '/v2/fabing', type: 'tool', + params: [{ key: 'name', label: '对象名', placeholder: '输入名字' }] }, + { id: 'luck', title: '今日运势', icon: '⭐', endpoint: '/v2/luck', type: 'text' }, + { id: 'answer', title: '答案之书', icon: '📘', endpoint: '/v2/answer', type: 'text' }, + { id: 'changya', title: '随机唱歌', icon: '🎤', endpoint: '/v2/changya', type: 'text', desc: '随机一段哼唱' }, + { id: 'dad-joke', title: '英文冷笑话', icon: '😄', endpoint: '/v2/dad-joke', type: 'text' }, + { id: 'awesome-js', title: 'JS趣味题', icon: '💻', endpoint: '/v2/awesome-js', type: 'text' }, +]; + +// 所有分类(主题色统一为清新绿系,与全站渐变一致;工具箱已独立页面) +export const API_CATEGORIES = [ + { id: 'periodic', title: '周期资讯', icon: '📰', color: '#15803d', items: PERIODIC_NEWS }, + { id: 'rankings', title: '热门榜单', icon: '🔥', color: '#166534', items: HOT_RANKINGS }, + { id: 'tools', title: '实用功能', icon: '🛠️', color: '#22c55e', items: PRACTICAL_TOOLS }, + { id: 'fun', title: '消遣娱乐', icon: '🎉', color: '#059669', items: ENTERTAINMENT }, +]; + +// ========== 工具箱(public/toolbox 下按目录分类)========== +// 注意:public/toolbox/个人主页模板 为临时放置资源,不加入下列列表,也不在工具箱展示。 +// offlineOk:安装 PWA 或在线缓存后,页面与脚本均可本地加载、无需外网即可使用(播放网络流等仍要联网) +const TOOLBOX_IMAGE = [ + { id: 'tb-img-ico', title: 'PNG 转 ICO', icon: '📦', link: '/toolbox/图片处理/图片png转ico格式/index.html', desc: '图标格式转换', offlineOk: true }, + { id: 'tb-img-pixel', title: '图片像素化', icon: '🧩', link: '/toolbox/图片处理/图片像素化处理/index.html', desc: '马赛克风格处理', offlineOk: true }, + { id: 'tb-img-bw', title: '图片黑白', icon: '⬛', link: '/toolbox/图片处理/图片黑白处理/index.html', desc: '灰度转换', offlineOk: true }, + { id: 'tb-img-round', title: '图片圆角', icon: '🔲', link: '/toolbox/图片处理/图片圆角处理/index.html', desc: '圆角裁剪', offlineOk: true }, + { id: 'tb-img-b64', title: '图片转 Base64', icon: '🔀', link: '/toolbox/图片处理/图片转Base64编码/index.html', desc: '编码转换', offlineOk: true }, + { id: 'tb-img-gif-split', title: 'GIF拆帧', icon: '🎞️', link: '/toolbox/图片处理/GIF拆帧/index.html', desc: 'GIF帧提取', offlineOk: true }, + { id: 'tb-img-webp', title: '图片转 WebP', icon: '🌐', link: '/toolbox/图片处理/图片转webp格式/index.html', desc: 'WebP格式转换', offlineOk: true }, +]; + +const TOOLBOX_UTIL = [ + { id: 'tb-whiteboard', title: '在线白板', icon: '🀆', link: '/toolbox/实用工具/白板/index.html', desc: '自由绘制', offlineOk: true }, + { id: 'tb-notepad', title: '记事本', icon: '🗒️', link: '/toolbox/实用工具/记事本/index.html', desc: '轻量编辑', offlineOk: true }, + { id: 'tb-video', title: '视频播放器', icon: '▶️', link: '/toolbox/实用工具/视频播放器/index.html', desc: '本地视频播放(网络流需联网)', offlineOk: true }, + { id: 'tb-json', title: 'JSON 编辑器', icon: '📑', link: '/toolbox/实用工具/Json编辑器/index.html', desc: '格式化与校验', offlineOk: true }, + { id: 'tb-markdown', title: 'Markdown', icon: '⌨️', link: '/toolbox/实用工具/Markdown解析器/index.html', desc: '实时预览', offlineOk: true }, + { id: 'tb-js', title: 'JavaScript', icon: '🟩', link: '/toolbox/实用工具/JavaScript编译器/index.html', desc: '本地运行脚本', offlineOk: true }, + { id: 'tb-random-num', title: '随机数', icon: '🎲', link: '/toolbox/实用工具/随机数生成器/index.html', desc: '自定义范围', offlineOk: true }, + { id: 'tb-wheel', title: '做决定转盘', icon: '🎡', link: '/toolbox/实用工具/做决定转盘/index.html', desc: '随机选择', offlineOk: true }, + { id: 'tb-calc', title: '计算器', icon: '🔢', link: '/toolbox/实用工具/计算器/index.html', desc: '基础运算', offlineOk: true }, +]; + +const TOOLBOX_WEB_TOY = [ + { id: 'tb-ai-chat', title: 'AI 聊天', icon: '🤖', link: '/toolbox/网页小玩具/AI聊天/index.html', desc: '需调用云端大模型,无法离线使用', offlineOk: false }, + { id: 'tb-clock', title: '数字时钟', icon: '🕐', link: '/toolbox/网页小玩具/数字时钟/index.html', desc: '全屏时钟', offlineOk: true }, + { id: 'tb-countdown', title: '人生倒计时', icon: '⏲️', link: '/toolbox/网页小玩具/人生倒计时/index.html', desc: '可视化倒计时', offlineOk: true }, + { id: 'tb-emoji', title: '随机 Emoji', icon: '😊', link: '/toolbox/网页小玩具/随机Emoji表情/index.html', desc: '随机表情', offlineOk: true }, + { id: 'tb-code-rain', title: '代码雨', icon: '💻', link: '/toolbox/网页小玩具/代码雨/index.html', desc: '炫酷代码雨效果', offlineOk: true }, + { id: 'tb-wall-clock', title: '网页挂钟', icon: '🕰️', link: '/toolbox/网页小玩具/网页挂钟/index.html', desc: '在线挂钟', offlineOk: true }, + { id: 'tb-christmas-tree', title: '粒子圣诞树', icon: '🎄', link: '/toolbox/网页小玩具/粒子圣诞树/粒子圣诞树.html', desc: '炫酷圣诞树特效', offlineOk: true }, +]; + +const TOOLBOX_LEARNING = [ + { id: 'tb-study-html-div', title: 'div 标签指南', icon: '📐', link: '/toolbox/学习工具/HTML的div标签指南/index.html', desc: 'HTML 入门', offlineOk: true }, + { id: 'tb-study-html-fmt', title: 'HTML 格式大全', icon: '📋', link: '/toolbox/学习工具/HTML格式大全/index.html', desc: '标签速查', offlineOk: true }, + { id: 'tb-study-doc-tpl', title: '网页模板', icon: '📄', link: '/toolbox/学习工具/文档类网页模板/index.html', desc: '文档类模板', offlineOk: true }, + { id: 'tb-study-en', title: '计算机英语词汇', icon: '📖', link: '/toolbox/学习工具/计算机英语词汇学习/index.html', desc: '词汇学习', offlineOk: true }, + { id: 'tb-study-cpc-app', title: '入党申请书', icon: '📝', link: '/toolbox/学习工具/入党申请书/index.html', desc: '范文与模板', offlineOk: true }, +]; + +/** 工具箱分类(不含个人主页模板临时目录) */ +export const TOOLBOX_CATEGORIES = [ + { id: 'image', title: '图片处理', icon: '🖼️', color: '#4ade80', items: TOOLBOX_IMAGE }, + { id: 'util', title: '实用工具', icon: '🛠️', color: '#22c55e', items: TOOLBOX_UTIL }, + { id: 'webtoy', title: '网页小玩具', icon: '🎪', color: '#34d399', items: TOOLBOX_WEB_TOY }, + { id: 'study', title: '学习工具', icon: '📚', color: '#059669', items: TOOLBOX_LEARNING }, +]; + +/** 扁平列表(统计、兼容旧引用) */ +export const TOOLBOX_ITEMS = TOOLBOX_CATEGORIES.flatMap((c) => c.items); + +/** + * 各 API 项 id → public 目录下静态页路径(与文件名一致) + * 供 /60sapi/:itemId 路由嵌入展示 + */ +export const API_ITEM_STATIC_HTML = { + // 周期资讯 + '60s': '/60sapi/周期资讯/每天60s读懂世界.html', + 'ai-news': '/60sapi/周期资讯/AI资讯快报.html', + bing: '/60sapi/周期资讯/必应每日壁纸.html', + 'exchange-rate': '/60sapi/周期资讯/当日货币汇率.html', + 'today-in-history': '/60sapi/周期资讯/历史上的今天.html', + epic: '/60sapi/周期资讯/Epic免费游戏.html', + lunar: '/60sapi/周期资讯/农历信息.html', + moyu: '/60sapi/周期资讯/摸鱼日历.html', + // 热门榜单 + bili: '/60sapi/热门榜单/哔哩哔哩热搜.html', + douyin: '/60sapi/热门榜单/抖音热搜.html', + rednote: '/60sapi/热门榜单/小红书热搜.html', + weibo: '/60sapi/热门榜单/微博热搜.html', + zhihu: '/60sapi/热门榜单/知乎热门.html', + toutiao: '/60sapi/热门榜单/今日头条.html', + 'baidu-hot': '/60sapi/热门榜单/百度热搜.html', + 'baidu-teleplay': '/60sapi/热门榜单/百度电视剧榜.html', + 'baidu-tieba': '/60sapi/热门榜单/百度贴吧话题.html', + dongchedi: '/60sapi/热门榜单/懂车帝热搜.html', + quark: '/60sapi/热门榜单/夸克热搜.html', + 'hacker-news-top': '/60sapi/热门榜单/HackerNews热门.html', + 'hacker-news-new': '/60sapi/热门榜单/HackerNews最新.html', + 'ncm-rank': '/60sapi/热门榜单/网易云音乐榜单.html', + 'maoyan-movie': '/60sapi/热门榜单/猫眼实时票房.html', + 'maoyan-tv': '/60sapi/热门榜单/猫眼电视热度.html', + 'maoyan-web': '/60sapi/热门榜单/猫眼网剧热度.html', + 'douban-movie': '/60sapi/热门榜单/豆瓣一周口碑电影.html', + 'douban-tv-cn': '/60sapi/热门榜单/豆瓣国产剧集.html', + 'douban-tv-global': '/60sapi/热门榜单/豆瓣海外剧集.html', + // 实用功能 + weather: '/60sapi/实用功能/实时天气.html', + 'weather-forecast': '/60sapi/实用功能/天气预报.html', + fanyi: '/60sapi/实用功能/在线翻译.html', + baike: '/60sapi/实用功能/百度百科.html', + ip: '/60sapi/实用功能/IP查询.html', + qrcode: '/60sapi/实用功能/二维码生成.html', + hash: '/60sapi/实用功能/哈希工具.html', + password: '/60sapi/实用功能/随机密码生成.html', + 'password-check': '/60sapi/实用功能/密码强度检测.html', + 'color-random': '/60sapi/实用功能/随机颜色.html', + 'color-palette': '/60sapi/实用功能/配色方案.html', + health: '/60sapi/实用功能/身体健康分析.html', + 'fuel-price': '/60sapi/实用功能/今日油价.html', + 'gold-price': '/60sapi/实用功能/今日金价.html', + lyric: '/60sapi/实用功能/歌词搜索.html', + whois: '/60sapi/实用功能/Whois查询.html', + chemical: '/60sapi/实用功能/化学元素查询.html', + // 消遣娱乐(目录名为「娱乐消遣」) + duanzi: '/60sapi/娱乐消遣/随机段子.html', + hitokoto: '/60sapi/娱乐消遣/随机一言.html', + kfc: '/60sapi/娱乐消遣/疯狂星期四.html', + fabing: '/60sapi/娱乐消遣/发病文学.html', + luck: '/60sapi/娱乐消遣/今日运势.html', + answer: '/60sapi/娱乐消遣/答案之书.html', + changya: '/60sapi/娱乐消遣/随机唱歌.html', + 'dad-joke': '/60sapi/娱乐消遣/英文冷笑话.html', + 'awesome-js': '/60sapi/娱乐消遣/JS趣味题.html', +}; + +/** 根据 itemId 查找分类与条目(用于标题、主题色) */ +export function findApiItemMeta(itemId) { + for (const cat of API_CATEGORIES) { + const item = cat.items.find((i) => i.id === itemId); + if (item) return { category: cat, item }; + } + return null; +} + +const Api60sConfig = { + API_SOURCES, + DEFAULT_SOURCE_ID, + API_CATEGORIES, + TOOLBOX_CATEGORIES, + TOOLBOX_ITEMS, + API_ITEM_STATIC_HTML, +}; +export default Api60sConfig; diff --git a/InfoGenie-frontend/src/config/StaticPageConfig.js b/InfoGenie-frontend/src/config/StaticPageConfig.js index 08ae388a..49951776 100755 --- a/InfoGenie-frontend/src/config/StaticPageConfig.js +++ b/InfoGenie-frontend/src/config/StaticPageConfig.js @@ -1,9 +1,10 @@ // 静态页面配置文件 // 统一管理所有静态网页的链接和配置信息 -//AI工具 +// AI 应用(列表与 public/aimodelapp 静态页对应;提示词在 shared/ai-prompts.js) export const AI_MODEL_APPS = [ { + id: 'ai-variable-naming', title: 'AI变量命名助手', description: '智能变量命名工具,帮助开发者快速生成规范的变量名', link: '/aimodelapp/AI变量命名助手/index.html', @@ -12,6 +13,7 @@ export const AI_MODEL_APPS = [ IsShow: true }, { + id: 'ai-poetry', title: 'AI写诗小助手', description: 'AI创作诗歌助手,体验古典诗词的魅力', link: '/aimodelapp/AI写诗小助手/index.html', @@ -20,6 +22,7 @@ export const AI_MODEL_APPS = [ IsShow: true }, { + id: 'ai-name-analysis', title: 'AI姓名评测', description: '基于AI的姓名分析和评测工具', link: '/aimodelapp/AI姓名评测/index.html', @@ -27,7 +30,8 @@ export const AI_MODEL_APPS = [ icon: '👤', IsShow: true }, - { + { + id: 'ai-translation', title: 'AI翻译官', description: '基于AI的翻译工具', link: '/aimodelapp/AI语言翻译助手/index.html', @@ -35,7 +39,8 @@ export const AI_MODEL_APPS = [ icon: '🌍', IsShow: true }, - { + { + id: 'ai-classical-conversion', title: 'AI文章转文言文', description: '基于AI的文章转文言文工具', link: '/aimodelapp/AI文章转文言文/index.html', @@ -43,7 +48,8 @@ export const AI_MODEL_APPS = [ icon: '🖊️', IsShow: true }, - { + { + id: 'ai-expression-maker', title: 'AI生成表情包', description: '基于AI的生成表情包工具', link: '/aimodelapp/AI生成表情包/index.html', @@ -52,6 +58,7 @@ export const AI_MODEL_APPS = [ IsShow: true }, { + id: 'ai-linux-command', title: 'AI生成Linux命令', description: '基于AI的生成Linux命令工具', link: '/aimodelapp/AI生成Linux命令/index.html', @@ -60,6 +67,7 @@ export const AI_MODEL_APPS = [ IsShow: true }, { + id: 'ai-markdown-formatting', title: 'AI文章排版', description: '将您的文章添加Emoji美化,并排版成markdown格式', link: '/aimodelapp/AI文章排版/index.html', @@ -68,6 +76,7 @@ export const AI_MODEL_APPS = [ IsShow: true }, { + id: 'ai-kinship-calculator', title: 'AI亲戚称呼计算器', description: '基于AI的中国亲戚关系查询工具', link: '/aimodelapp/AI中国亲戚称呼计算器/index.html', @@ -80,205 +89,87 @@ export const AI_MODEL_APPS = [ //休闲游戏 export const SMALL_GAMES = [ { + id: '2048', title: '2048', description: '经典数字合并游戏,挑战你的数学思维', link: '/smallgame/2048/index.html', - gradient: 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)', - icon: '🔢', IsShow: true }, { + id: 'white-tile', title: '别踩白方块', description: '节奏感游戏,考验你的反应速度和手指协调', link: '/smallgame/别踩白方块/index.html', - gradient: 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)', - icon: '⬛', IsShow: true }, { + id: 'tetris', title: '俄罗斯方块', description: '十分解压的方块消除游戏,永恒的经典之作', link: '/smallgame/俄罗斯方块/index.html', - gradient: 'linear-gradient(135deg, #4ade80 0%, #22c55e 100%)', - icon: '🧩', IsShow: true }, { + id: 'snake', title: '贪吃蛇', description: '有趣的贪吃蛇游戏,考验你的操作速度和策略', link: '/smallgame/贪吃蛇/index.html', - gradient: 'linear-gradient(135deg,rgb(37, 132, 240) 0%, #f5576c 100%)', - icon: '🐍', IsShow: true }, { + id: 'minesweeper', title: '扫雷', description: '经典扫雷游戏,考验你的思维能力和策略', link: '/smallgame/扫雷/index.html', - gradient: 'linear-gradient(135deg,rgb(37, 132, 240) 0%, #f5576c 100%)', - icon: '💣', IsShow: true }, { + id: 'dodge-leaves', title: '躲树叶', description: '躲避掉落的树叶,加油坚持到最后', link: '/smallgame/躲树叶/index.html', - gradient: 'linear-gradient(135deg,rgba(26, 231, 70, 1) 0%, #14d9fcff 100%)', - icon: '🌳', IsShow: true }, { + id: 'plane', title: '打飞机', description: '用子弹击落飞来的敌机,坚持到最后', link: '/smallgame/打飞机/index.html', - gradient: 'linear-gradient(135deg,rgba(240, 96, 204, 1) 0%, #ff405aff 100%)', - icon: '✈️', IsShow: true }, { + id: 'parkour', title: '跑酷', description: '躲避障碍物,吃掉更多的金币', link: '/smallgame/跑酷/index.html', - gradient: 'linear-gradient(135deg,rgba(64, 61, 255, 1) 0%, #28eaf8ff 100%)', - icon: '🏃‍♂️', + IsShow: true + }, + { + id: 'floppybird', + title: 'Floppy Bird', + description: '经典像素飞行,躲避管道与障碍', + link: '/smallgame/floppybird/index.html', + IsShow: true + }, + { + id: 'h5cube', + title: '网页魔方', + description: '3D 魔方,双击即可开始', + link: '/smallgame/h5cube/index.html', + IsShow: true + }, + { + id: 'sokoban', + title: '推箱子', + description: '经典推箱子益智,考验空间与策略', + link: '/smallgame/推箱子/推箱子.html', IsShow: true }, ]; -//聚合应用 -export const API_60S_CATEGORIES = [ - { - title: '热搜榜单', - icon: '🔥', - color: '#ff6b6b', - description: '实时追踪各大平台热门话题,掌握最新网络动态和流行趋势', - apis: [ - { title: '哔哩哔哩热搜', link: '/60sapi/热搜榜单/哔哩哔哩热搜榜/index.html', icon: '📺', IsShow: true }, - { title: '抖音热搜榜', link: '/60sapi/热搜榜单/抖音热搜榜/index.html', icon: '🎵', IsShow: true }, - { title: '小红书热搜榜', link: '/60sapi/热搜榜单/小红书热点/index.html', icon: '🍠', IsShow: true }, - { title: '百度热搜榜', link: '/60sapi/热搜榜单/百度实时热搜/index.html', icon: '🔍', IsShow: true }, - { title: '微博热搜榜', link: '/60sapi/热搜榜单/微博热搜榜/index.html', icon: '📱', IsShow: true }, - { title: '今日头条热搜', link: '/60sapi/热搜榜单/头条热搜榜/index.html', icon: '📰', IsShow: true }, - { title: '懂车帝热搜榜', link: '/60sapi/热搜榜单/懂车帝热搜/index.html', icon: '🚗', IsShow: true }, - { title: '知乎热门话题', link: '/60sapi/热搜榜单/知乎热门话题/index.html', icon: '💡', IsShow: true }, - { title: '猫眼票房排行', link: '/60sapi/热搜榜单/猫眼票房排行榜/index.html', icon: '🎬', IsShow: true }, - { title: '猫眼电视热搜', link: '/60sapi/热搜榜单/猫眼电视收视排行/index.html', icon: '📺', IsShow: true }, - { title: '猫眼电影票房', link: '/60sapi/热搜榜单/猫眼电影实时票房/index.html', icon: '🎬', IsShow: true }, - { title: '猫眼网剧热搜', link: '/60sapi/热搜榜单/猫眼网剧实时热度/index.html', icon: '💻', IsShow: true }, - { title: '网易云榜单', link: '/60sapi/热搜榜单/网易云榜单/index.html', icon: '🎶', IsShow: true }, - { title: 'HackerNews', link: '/60sapi/热搜榜单/Hacker News 榜单/index.html', icon: '💻', IsShow: true }, - { title: '百度电视剧热搜', link: '/60sapi/热搜榜单/百度电视剧榜/index.html', icon: '📺', IsShow: true }, - { title: '百度贴吧热搜', link: '/60sapi/热搜榜单/百度贴吧话题榜/index.html', icon: '💬', IsShow: true }, - - ] - }, - { - title: '日更资讯', - icon: '📰', - color: '#81c784', - description: '每日精选优质内容,提供最新资讯和实用信息', - apis: [ - { title: '每日必应壁纸', link: '/60sapi/日更资讯/必应每日壁纸/index.html', icon: '🖼️', IsShow: true }, - { title: '历史上的今天', link: '/60sapi/日更资讯/历史上的今天/index.html', icon: '📅', IsShow: true }, - { title: '每日国际汇率', link: '/60sapi/日更资讯/每日国际汇率/index.html', icon: '💱', IsShow: true }, - { title: '每日60s新闻', link: '/60sapi/日更资讯/每天60s读懂世界/index.html', icon: '🌍', IsShow: true } - ] - }, - { - title: '实用功能', - icon: '🛠️', - color: '#45b7d1', - description: '集成多种便民工具,让生活和工作更加便捷高效', - apis: [ - { title: '百度百科词条', link: '/60sapi/实用功能/百度百科词条/index.html', icon: '📚', IsShow: true }, - { title: '查询公网IP', link: '/60sapi/实用功能/公网IP地址/index.html', icon: '🌐', IsShow: true }, - { title: '哈希解压压缩', link: '/60sapi/实用功能/哈希解压压缩/index.html', icon: '🗜️', IsShow: true }, - { title: '链接OG信息', link: '/60sapi/实用功能/链接OG信息/index.html', icon: '🔗', IsShow: false }, - { title: '密码强度检测', link: '/60sapi/实用功能/密码强度检测/index.html', icon: '🔐', IsShow: true }, - { title: '农历信息', link: '/60sapi/实用功能/农历信息/index.html', icon: '📅', IsShow: true }, - { title: '配色方案', link: '/60sapi/实用功能/配色方案/index.html', icon: '🎨', IsShow: true }, - { title: '身体健康分析', link: '/60sapi/实用功能/身体健康分析/index.html', icon: '🏥', IsShow: true }, - { title: '二维码生成', link: '/60sapi/实用功能/生成二维码/index.html', icon: '📱', IsShow: true }, - { title: '随机密码生成器', link: '/60sapi/实用功能/随机密码生成器/index.html', icon: '🔒', IsShow: true }, - { title: '随机颜色生成器', link: '/60sapi/实用功能/随机颜色/index.html', icon: '🌈', IsShow: true }, - { title: '天气预报', link: '/60sapi/实用功能/天气预报/index.html', icon: '🌤️', IsShow: true }, - { title: 'EpicGames免费游戏', link: '/60sapi/实用功能/EpicGames免费游戏/index.html', icon: '🎮', IsShow: true }, - { title: '在线机器翻译', link: '/60sapi/实用功能/在线翻译/index.html', icon: '🌍', IsShow: false }, - //新增的 - { title: '在线白板', link: '/toolbox/白板/index.html', icon: '🀆', IsShow: true }, - { title: '记事本', link: '/toolbox/记事本/index.html', icon: '🗒️', IsShow: true }, - { title: '视频播放器', link: '/toolbox/视频播放器/index.html', icon: '▶️', IsShow: true }, - { title: '图片转Base64编码', link: '/toolbox/图片转Base64编码/index.html', icon: '🔀', IsShow: true }, - { title: '在线JavaScript执行', link: '/toolbox/在线JavaScript执行/index.html', icon: '🟩', IsShow: true }, - { title: 'Json编辑器', link: '/toolbox/Json编辑器/index.html', icon: '📑', IsShow: true }, - { title: 'Markdown解析器', link: '/toolbox/Markdown解析器/index.html', icon: '⌨︎', IsShow: true }, - { title: 'AI聊天', link: '/toolbox/AI聊天/index.html', icon: '🤖', IsShow: true }, - { title: '随机数生成器', link: '/toolbox/随机数生成器/index.html', icon: '🎲', IsShow: true }, - { title: '图片黑白处理', link: '/toolbox/图片黑白处理/index.html', icon: '🖻', IsShow: true }, - { title: '图片圆角处理', link: '/toolbox/图片圆角处理/index.html', icon: '🖼', IsShow: true }, - - ] - }, - { - title: '娱乐消遣', - icon: '🎉', - color: '#f7b731', - description: '轻松有趣的娱乐内容,为您的闲暇时光增添乐趣', - apis: [ - { title: '哼歌一曲', link: '/60sapi/娱乐消遣/随机唱歌音频/index.html', icon: '🎤', IsShow: true }, - { title: '随机发病文学', link: '/60sapi/娱乐消遣/随机发病文学/index.html', icon: '📖', IsShow: false }, - { title: '段子游乐场', link: '/60sapi/娱乐消遣/随机搞笑段子/index.html', icon: '😂', IsShow: true }, - { title: '冷笑话大全', link: '/60sapi/娱乐消遣/随机冷笑话/index.html', icon: '😄', IsShow: true }, - { title: '随机一言', link: '/60sapi/娱乐消遣/随机一言/index.html', icon: '💭', IsShow: true }, - { title: '水晶球占卜', link: '/60sapi/娱乐消遣/随机运势/index.html', icon: '⭐', IsShow: true }, - { title: 'JavaScript趣味题', link: '/60sapi/娱乐消遣/随机JavaScript趣味题/index.html', icon: '💻', IsShow: true }, - { title: '疯狂星期四', link: '/60sapi/娱乐消遣/随机KFC文案/index.html', icon: '🍗', IsShow: true }, - { title: '真理之道', link: '/60sapi/娱乐消遣/随机答案之书/index.html', icon: '📘', IsShow: true }, - { title: '随机Emoji', link: '/toolbox/随机Emoji表情/index.html', icon: '😊', IsShow: true }, - - { title: '人生倒计时', link: '/toolbox/人生倒计时/index.html', icon: '⏲️', IsShow: true }, - { title: '数字时钟', link: '/toolbox/数字时钟/index.html', icon: '⏲︎', IsShow: true }, - { title: '做决定转盘', link: '/toolbox/做决定转盘/index.html', icon: '🎡', IsShow: true }, - - ] - } -]; - -// 辅助函数:根据分类名获取配置 -export const getApiCategoryByName = (categoryName) => { - return API_60S_CATEGORIES.find(category => category.title === categoryName); -}; - -// 辅助函数:根据游戏名获取配置 -export const getGameByName = (gameName) => { - return SMALL_GAMES.find(game => game.title === gameName); -}; - -// 辅助函数:根据AI应用名获取配置 -export const getAiAppByName = (appName) => { - return AI_MODEL_APPS.find(app => app.title === appName); -}; - -// 辅助函数:获取所有静态页面链接 -export const getAllStaticLinks = () => { - const aiLinks = AI_MODEL_APPS.map(app => app.link); - const gameLinks = SMALL_GAMES.map(game => game.link); - const apiLinks = API_60S_CATEGORIES.flatMap(category => - category.apis.map(api => api.link) - ); - - return [...aiLinks, ...gameLinks, ...apiLinks]; -}; - -// 默认导出配置对象 const StaticPageConfig = { AI_MODEL_APPS, SMALL_GAMES, - API_60S_CATEGORIES, - getApiCategoryByName, - getGameByName, - getAiAppByName, - getAllStaticLinks }; export default StaticPageConfig; diff --git a/InfoGenie-frontend/src/config/env.js b/InfoGenie-frontend/src/config/env.js index f02e490a..241da19f 100644 --- a/InfoGenie-frontend/src/config/env.js +++ b/InfoGenie-frontend/src/config/env.js @@ -1,56 +1,73 @@ -// 环境配置文件 -// 统一管理所有环境变量配置 - -// 获取环境变量中的 API URL,如果为空则使用当前域名 -const getApiUrl = () => { - // 优先使用环境变量 +const resolveApiUrl = () => { + const env = process.env.NODE_ENV; const envApiUrl = process.env.REACT_APP_API_URL; - - // 如果环境变量存在且不为空,使用环境变量 - if (envApiUrl && envApiUrl.trim() !== '') { - return envApiUrl; + + if (env === 'production') { + if (envApiUrl && envApiUrl.trim() !== '') return envApiUrl; + return 'https://infogenie.api.shumengya.top'; } - - // 否则使用当前域名(Docker 环境) - return window.location.origin; + + if (envApiUrl && envApiUrl.trim() !== '') return envApiUrl; + return 'http://127.0.0.1:5002'; +}; + +const resolveAuthUrl = () => { + const env = process.env.NODE_ENV; + const envAuthUrl = process.env.REACT_APP_AUTH_URL; + + if (env === 'production') { + if (envAuthUrl && envAuthUrl.trim() !== '') return envAuthUrl; + return 'https://auth.shumengya.top'; + } + + if (envAuthUrl && envAuthUrl.trim() !== '') return envAuthUrl; + return 'https://auth.shumengya.top'; +}; + +const resolveAuthApiUrl = () => { + const env = process.env.NODE_ENV; + const envAuthApiUrl = process.env.REACT_APP_AUTH_API_URL; + + if (env === 'production') { + if (envAuthApiUrl && envAuthApiUrl.trim() !== '') return envAuthApiUrl; + return 'https://auth.api.shumengya.top'; + } + + if (envAuthApiUrl && envAuthApiUrl.trim() !== '') return envAuthApiUrl; + return 'https://auth.api.shumengya.top'; }; -// 统一环境配置 const config = { - API_URL: getApiUrl(), // Docker 环境: 使用当前域名,开发环境可通过 .env 配置 - //API_URL: 'http://127.0.0.1:5002', // 本地开发环境(在 .env.development 中配置) - //API_URL: 'https://infogenie.api.shumengya.top', // 原生产环境(在 .env.production 中配置) + API_URL: resolveApiUrl(), + AUTH_URL: resolveAuthUrl(), + AUTH_API_URL: resolveAuthApiUrl(), DEBUG: process.env.REACT_APP_DEBUG === 'true', - LOG_LEVEL: 'debug' + LOG_LEVEL: 'debug', }; -// 导出配置对象 export const ENV_CONFIG = { - // API相关配置 API_URL: config.API_URL, - - // 调试相关配置 + AUTH_URL: config.AUTH_URL, + AUTH_API_URL: config.AUTH_API_URL, DEBUG: config.DEBUG, LOG_LEVEL: config.LOG_LEVEL, - - // 应用信息 APP_NAME: 'InfoGenie', - APP_VERSION: '1.0.0' + APP_VERSION: '2.2.3', + CLIENT_ID: 'infogenie', + CLIENT_NAME: '万象口袋', }; -// 兼容性函数:模拟 process.env 的行为 export const getEnvVar = (key, defaultValue = '') => { switch (key) { - case 'REACT_APP_API_URL': - return ENV_CONFIG.API_URL; - default: - return process.env[key] || defaultValue; + case 'REACT_APP_API_URL': return ENV_CONFIG.API_URL; + case 'REACT_APP_AUTH_URL': return ENV_CONFIG.AUTH_URL; + case 'REACT_APP_AUTH_API_URL': return ENV_CONFIG.AUTH_API_URL; + default: return process.env[key] || defaultValue; } }; -// 将配置暴露到window对象上,以便子应用(iframe)可以访问 if (typeof window !== 'undefined') { window.ENV_CONFIG = ENV_CONFIG; } -export default ENV_CONFIG; \ No newline at end of file +export default ENV_CONFIG; diff --git a/InfoGenie-frontend/src/contexts/UserContext.js b/InfoGenie-frontend/src/contexts/UserContext.js index b0b228e8..8b305fea 100755 --- a/InfoGenie-frontend/src/contexts/UserContext.js +++ b/InfoGenie-frontend/src/contexts/UserContext.js @@ -1,4 +1,4 @@ -import React, { createContext, useContext, useState, useEffect } from 'react'; +import React, { createContext, useContext, useState, useEffect, useCallback } from 'react'; import { authAPI } from '../utils/api'; import toast from 'react-hot-toast'; @@ -6,142 +6,85 @@ const UserContext = createContext(); export const useUser = () => { const context = useContext(UserContext); - if (!context) { - throw new Error('useUser must be used within a UserProvider'); - } + if (!context) throw new Error('useUser must be used within a UserProvider'); return context; }; export const UserProvider = ({ children }) => { const [user, setUser] = useState(() => { - // 从localStorage恢复用户信息 try { - const savedUser = localStorage.getItem('user'); - return savedUser ? JSON.parse(savedUser) : null; - } catch { - return null; - } + const saved = localStorage.getItem('user'); + return saved ? JSON.parse(saved) : null; + } catch { return null; } }); const [isLoading, setIsLoading] = useState(true); - const [isLoggedIn, setIsLoggedIn] = useState(() => { - // 从localStorage恢复登录状态和token - return localStorage.getItem('token') !== null; - }); + const [isLoggedIn, setIsLoggedIn] = useState(() => localStorage.getItem('token') !== null); - // 检查登录状态 - const checkLoginStatus = async () => { - try { - const token = localStorage.getItem('token'); - if (!token) { - setUser(null); - setIsLoggedIn(false); - return; - } - - const response = await authAPI.checkLogin(); - if (response.data.success && response.data.logged_in) { - const userData = response.data.user; - setUser(userData); - setIsLoggedIn(true); - // 保存到localStorage - localStorage.setItem('user', JSON.stringify(userData)); - } else { - setUser(null); - setIsLoggedIn(false); - // 清除localStorage - localStorage.removeItem('user'); - localStorage.removeItem('token'); - } - } catch (error) { - console.error('检查登录状态失败:', error); - setUser(null); - setIsLoggedIn(false); - // 清除localStorage - localStorage.removeItem('user'); - localStorage.removeItem('token'); - } finally { - setIsLoading(false); - } - }; - - // 登录 - const login = async (loginData) => { - try { - const response = await authAPI.login(loginData); - if (response.data.success) { - const userData = response.data.user; - const token = response.data.token; - setUser(userData); - setIsLoggedIn(true); - // 保存到localStorage - localStorage.setItem('user', JSON.stringify(userData)); - localStorage.setItem('token', token); - toast.success('登录成功!'); - return { success: true }; - } else { - toast.error(response.data.message || '登录失败'); - return { success: false, message: response.data.message }; - } - } catch (error) { - console.error('登录失败:', error); - const message = error.response?.data?.message || '登录失败,请重试'; - toast.error(message); - return { success: false, message }; - } - }; - - // 登出 - const logout = async () => { - try { - await authAPI.logout(); - setUser(null); - setIsLoggedIn(false); - // 清除localStorage - localStorage.removeItem('user'); - localStorage.removeItem('token'); - toast.success('已成功登出'); - } catch (error) { - console.error('登出失败:', error); - // 即使登出请求失败,也清除本地状态 - setUser(null); - setIsLoggedIn(false); - // 清除localStorage - localStorage.removeItem('user'); - localStorage.removeItem('isLoggedIn'); - toast.error('登出失败'); - } - }; - - // 获取QQ头像URL - const getQQAvatar = (email) => { - if (!email) return null; - - const qqDomains = ['qq.com', 'vip.qq.com', 'foxmail.com']; - const domain = email.split('@')[1]?.toLowerCase(); - - if (qqDomains.includes(domain)) { - const qqNumber = email.split('@')[0]; - if (/^\d+$/.test(qqNumber)) { - return `https://q1.qlogo.cn/g?b=qq&nk=${qqNumber}&s=100`; - } - } - - return null; - }; - - // 组件挂载时检查登录状态 - useEffect(() => { - checkLoginStatus(); + const clearSession = useCallback(() => { + setUser(null); + setIsLoggedIn(false); + localStorage.removeItem('user'); + localStorage.removeItem('token'); + localStorage.removeItem('expiresAt'); }, []); + const fetchMe = useCallback(async () => { + const token = localStorage.getItem('token'); + if (!token) { clearSession(); return false; } + + const expiresAt = localStorage.getItem('expiresAt'); + if (expiresAt && new Date(expiresAt) < new Date()) { + clearSession(); + return false; + } + + try { + const res = await authAPI.me(); + const userData = res.data.user; + setUser(userData); + setIsLoggedIn(true); + localStorage.setItem('user', JSON.stringify(userData)); + return true; + } catch (err) { + console.error('获取用户信息失败:', err); + if (err.response?.status === 401 || err.response?.status === 403) { + clearSession(); + } + return false; + } + }, [clearSession]); + + const handleSSOCallback = useCallback((token, expiresAt, account, username) => { + localStorage.setItem('token', token); + if (expiresAt) localStorage.setItem('expiresAt', expiresAt); + setUser({ account, username }); + setIsLoggedIn(true); + localStorage.setItem('user', JSON.stringify({ account, username })); + toast.success('登录成功!'); + }, []); + + const logout = useCallback(() => { + clearSession(); + toast.success('已成功登出'); + }, [clearSession]); + + useEffect(() => { + const init = async () => { + setIsLoading(true); + await fetchMe(); + setIsLoading(false); + }; + init(); + }, [fetchMe]); + const value = { user, isLoading, isLoggedIn, - login, + handleSSOCallback, + fetchMe, logout, - checkLoginStatus, - getQQAvatar + clearSession, }; return ( @@ -151,4 +94,4 @@ export const UserProvider = ({ children }) => { ); }; -export default UserContext; \ No newline at end of file +export default UserContext; diff --git a/InfoGenie-frontend/src/index.js b/InfoGenie-frontend/src/index.js index 58d8827d..3473f3a9 100755 --- a/InfoGenie-frontend/src/index.js +++ b/InfoGenie-frontend/src/index.js @@ -10,23 +10,15 @@ root.render( ); -// 注册Service Worker -if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { - window.addEventListener('load', () => { - const publicUrl = (process.env.PUBLIC_URL || '').replace(/\/$/, ''); - const swUrl = `${publicUrl}/sw.js`; - - navigator.serviceWorker - .register(swUrl) - .then(registration => { - console.log('ServiceWorker registration successful with scope: ', registration.scope); - }) - .catch(error => { - console.error('ServiceWorker registration failed: ', error); - }); - }); -} else if (process.env.NODE_ENV !== 'production' && 'serviceWorker' in navigator) { +// 临时关闭 Service Worker,避免旧缓存导致白屏或加载到坏包 +if ('serviceWorker' in navigator) { navigator.serviceWorker.getRegistrations().then(registrations => { registrations.forEach(registration => registration.unregister()); }); } + +if ('caches' in window) { + caches.keys().then(keys => { + keys.forEach(key => caches.delete(key)); + }); +} diff --git a/InfoGenie-frontend/src/pages/AboutPage.js b/InfoGenie-frontend/src/pages/AboutPage.js deleted file mode 100644 index fb4ff570..00000000 --- a/InfoGenie-frontend/src/pages/AboutPage.js +++ /dev/null @@ -1,292 +0,0 @@ -import React from 'react'; -import styled from 'styled-components'; -import { FiInfo, FiGlobe, FiDownload, FiStar, FiHeart } from 'react-icons/fi'; - -const AboutContainer = styled.div` - min-height: calc(100vh - 140px); - padding: 20px 0; - opacity: 0; - transform: translateY(20px); - animation: pageEnter 0.8s ease-out forwards; - - @keyframes pageEnter { - 0% { - opacity: 0; - transform: translateY(20px); - } - 100% { - opacity: 1; - transform: translateY(0); - } - } -`; - -const Container = styled.div` - max-width: 800px; - margin: 0 auto; - padding: 0 16px; -`; - -const PageHeader = styled.div` - text-align: center; - margin-bottom: 40px; -`; - -const PageTitle = styled.h1` - color: white; - font-size: 40px; - font-weight: 700; - margin-bottom: 10px; - text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); - - @media (max-width: 768px) { - font-size: 33.6px; - } -`; - -const PageDescription = styled.p` - color: rgba(255, 255, 255, 0.8); - font-size: 18px; - max-width: 600px; - margin: 0 auto; -`; - -const AboutCard = styled.div` - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - padding: 40px; - box-shadow: 0 8px 32px rgba(168, 230, 207, 0.3); - backdrop-filter: blur(10px); - border: 1px solid rgba(168, 230, 207, 0.2); - margin-bottom: 24px; -`; - -const AppIcon = styled.div` - width: 100px; - height: 100px; - display: flex; - align-items: center; - justify-content: center; - margin: 0 auto 24px; - - img { - width: 100%; - height: 100%; - object-fit: contain; - border-radius: 8px; - } -`; - -const AppName = styled.h2` - font-size: 32px; - font-weight: bold; - color: #2e7d32; - text-align: center; - margin-bottom: 8px; -`; - -const AppVersion = styled.div` - text-align: center; - margin-bottom: 24px; -`; - -const VersionBadge = styled.span` - background: linear-gradient(135deg, #81c784 0%, #a5d6a7 100%); - color: white; - padding: 6px 16px; - border-radius: 20px; - font-size: 14px; - font-weight: 600; - box-shadow: 0 2px 8px rgba(129, 199, 132, 0.3); -`; - -const AppDescription = styled.p` - color: #4a4a4a; - font-size: 16px; - line-height: 1.6; - text-align: center; - margin-bottom: 32px; -`; - -const LinksSection = styled.div` - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: 16px; - margin-bottom: 32px; -`; - -const LinkCard = styled.a` - background: rgba(129, 199, 132, 0.1); - border: 1px solid rgba(129, 199, 132, 0.3); - border-radius: 16px; - padding: 20px; - text-decoration: none; - color: inherit; - transition: all 0.3s ease; - display: flex; - align-items: center; - gap: 12px; - - &:hover { - transform: translateY(-2px); - box-shadow: 0 4px 16px rgba(129, 199, 132, 0.2); - background: rgba(129, 199, 132, 0.15); - border-color: #81c784; - } -`; - -const LinkIcon = styled.div` - width: 40px; - height: 40px; - background: linear-gradient(135deg, #81c784 0%, #a5d6a7 100%); - border-radius: 10px; - display: flex; - align-items: center; - justify-content: center; - color: white; - font-size: 18px; - flex-shrink: 0; -`; - -const LinkContent = styled.div` - flex: 1; -`; - -const LinkTitle = styled.div` - font-weight: 600; - color: #2e7d32; - margin-bottom: 4px; -`; - -const LinkUrl = styled.div` - font-size: 14px; - color: #666; - word-break: break-all; -`; - -const FeatureSection = styled.div` - margin-top: 32px; -`; - -const FeatureTitle = styled.h3` - font-size: 20px; - font-weight: bold; - color: #2e7d32; - margin-bottom: 16px; - display: flex; - align-items: center; - gap: 8px; -`; - -const FeatureList = styled.ul` - list-style: none; - padding: 0; - margin: 0; -`; - -const FeatureItem = styled.li` - color: #4a4a4a; - font-size: 14px; - margin-bottom: 8px; - padding-left: 20px; - position: relative; - - &:before { - content: '✓'; - position: absolute; - left: 0; - color: #10b981; - font-weight: bold; - } - - &:last-child { - margin-bottom: 0; - } -`; - -const FooterText = styled.div` - text-align: center; - color: #666; - font-size: 14px; - margin-top: 24px; - padding-top: 24px; - border-top: 1px solid rgba(129, 199, 132, 0.2); - display: flex; - align-items: center; - justify-content: center; - gap: 8px; -`; - -const AboutPage = () => { - return ( - - - - 关于我们 - - 了解万象口袋的更多信息和功能特色(,,・ω・,,) - - - - - - InfoGenie Logo - - - 万象口袋 - - - v2.2.3 - - - - 一款跨平台式聚合应用,集成了多种实用工具和娱乐功能, - 为用户提供便捷的一站式服务体验。 - - - - - - - - - Web端在线体验 - - - - - - - - - 最新版下载地址 - - - - - - - - 主要功能 - - - 聚合应用 - 提供天气预报,平台热搜,百度百科等实用工具 - 休闲游戏 - 迷你解压小游戏即点即玩 - AI工具 - AI翻译,AI写诗,文章转换功能体验 - 用户系统 - 个人中心、签到奖励等 - 跨平台 - 支持Web、Windows、Android平台使用 - 响应式设计 - 完美适配各种设备屏幕 - - - - - - 感谢您使用万象口袋,我们将持续为您提供更好的服务 - - - - - ); -}; - -export default AboutPage; \ No newline at end of file diff --git a/InfoGenie-frontend/src/pages/AdminPage.js b/InfoGenie-frontend/src/pages/AdminPage.js new file mode 100644 index 00000000..04196955 --- /dev/null +++ b/InfoGenie-frontend/src/pages/AdminPage.js @@ -0,0 +1,730 @@ +import React, { useState, useEffect, useCallback, useMemo } from 'react'; +import { useNavigate, Navigate } from 'react-router-dom'; +import styled from 'styled-components'; +import toast from 'react-hot-toast'; +import { FiShield, FiLogOut, FiMonitor, FiUsers, FiCpu, FiGrid, FiBox, FiTool, FiRefreshCw, FiSave } from 'react-icons/fi'; +import { PageWrapper, Container } from '../styles/shared'; +import { ENV_CONFIG } from '../config/env'; +import { API_CATEGORIES, TOOLBOX_ITEMS, API_SOURCES } from '../config/Api60sConfig'; +import { AI_MODEL_APPS } from '../config/StaticPageConfig'; +import { fetchAIModelDisabledSet, filterAIModelApps } from '../utils/aiModelVisibility'; + +const ADMIN_TOKEN = 'shumengya520'; + +const AdminHeader = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + padding: 20px 0; + border-bottom: 2px solid rgba(255,255,255,0.2); + margin-bottom: 30px; +`; + +const AdminTitle = styled.h1` + display: flex; + align-items: center; + gap: 12px; + font-size: 24px; + color: #fff; + text-shadow: 0 2px 8px rgba(0,0,0,0.2); +`; + +const LogoutBtn = styled.button` + display: flex; + align-items: center; + gap: 6px; + padding: 10px 20px; + border: none; + border-radius: 10px; + background: rgba(239,68,68,0.8); + color: #fff; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: background 0.2s; + &:hover { background: rgba(239,68,68,1); } +`; + +const StatsGrid = styled.div` + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 16px; + margin-bottom: 30px; +`; + +const StatCard = styled.div` + background: rgba(255,255,255,0.95); + border-radius: 14px; + padding: 20px; + box-shadow: 0 4px 12px rgba(0,0,0,0.08); + display: flex; + align-items: center; + gap: 16px; +`; + +const StatIcon = styled.div` + width: 48px; + height: 48px; + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + font-size: 22px; + color: #fff; + background: ${({ $bg }) => $bg || 'linear-gradient(135deg, #4ade80, #22c55e)'}; + flex-shrink: 0; +`; + +const StatInfo = styled.div``; +const StatLabel = styled.div`font-size: 13px; color: #6b7280;`; +const StatValue = styled.div`font-size: 22px; font-weight: 700; color: #1f2937;`; + +const SectionTitle = styled.h2` + font-size: 18px; + color: #fff; + margin-bottom: 16px; + text-shadow: 0 1px 4px rgba(0,0,0,0.15); +`; + +const InfoCard = styled.div` + background: rgba(255,255,255,0.95); + border-radius: 14px; + padding: 24px; + box-shadow: 0 4px 12px rgba(0,0,0,0.08); + margin-bottom: 24px; +`; + +const InfoRow = styled.div` + display: flex; + justify-content: space-between; + padding: 10px 0; + border-bottom: 1px solid #f3f4f6; + &:last-child { border-bottom: none; } +`; + +const InfoLabel = styled.span`color: #6b7280; font-size: 14px;`; +const InfoValue = styled.span`color: #1f2937; font-weight: 600; font-size: 14px;`; + +const ActionGrid = styled.div` + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 12px; + margin-bottom: 24px; +`; + +const ActionBtn = styled.button` + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 14px 20px; + border: none; + border-radius: 12px; + background: linear-gradient(135deg, #4ade80, #22c55e); + color: #fff; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: transform 0.15s, box-shadow 0.15s; + &:hover { transform: translateY(-2px); box-shadow: 0 6px 16px rgba(74,222,128,0.3); } + &:disabled { opacity: 0.5; cursor: not-allowed; transform: none; } +`; + +const SixtyHint = styled.p` + font-size: 13px; + color: #6b7280; + line-height: 1.55; + margin: 0 0 12px; +`; + +const SixtyCatTitle = styled.h3` + font-size: 15px; + color: #166534; + margin: 18px 0 10px; + &:first-of-type { margin-top: 4px; } +`; + +const SixtyGrid = styled.div` + display: grid; + grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); + gap: 8px 14px; +`; + +const SixtyItem = styled.label` + display: flex; + align-items: center; + gap: 8px; + font-size: 13px; + color: #374151; + cursor: pointer; + user-select: none; + padding: 6px 8px; + border-radius: 8px; + background: #f9fafb; + border: 1px solid #f3f4f6; + input { flex-shrink: 0; accent-color: #22c55e; } +`; + +const SixtyActions = styled.div` + display: flex; + gap: 12px; + margin-top: 20px; + flex-wrap: wrap; + align-items: center; +`; + +const AiField = styled.div` + margin-bottom: 14px; + max-width: 560px; +`; + +const AiLabel = styled.label` + display: block; + font-size: 12px; + font-weight: 600; + color: #374151; + margin-bottom: 6px; +`; + +const AiInput = styled.input` + width: 100%; + padding: 10px 12px; + border-radius: 8px; + border: 1px solid #e5e7eb; + font-size: 14px; + box-sizing: border-box; + font-family: inherit; +`; + +const AdminPage = () => { + const navigate = useNavigate(); + const [sysInfo, setSysInfo] = useState(null); + const [loading, setLoading] = useState(false); + const [disabled60s, setDisabled60s] = useState([]); + const [loading60s, setLoading60s] = useState(true); + const [saving60s, setSaving60s] = useState(false); + const [aiBase, setAiBase] = useState(''); + const [aiKey, setAiKey] = useState(''); + const [aiModel, setAiModel] = useState('deepseek-chat'); + const [aiKeySet, setAiKeySet] = useState(false); + const [aiKeyHint, setAiKeyHint] = useState(''); + const [loadingAi, setLoadingAi] = useState(false); + const [savingAi, setSavingAi] = useState(false); + const [sixtySrcId, setSixtySrcId] = useState('self'); + const [savingSixtySrc, setSavingSixtySrc] = useState(false); + const [disabledAIModels, setDisabledAIModels] = useState([]); + const [loadingAIModels, setLoadingAIModels] = useState(true); + const [savingAIModels, setSavingAIModels] = useState(false); + + const disabled60sSet = useMemo(() => new Set(disabled60s), [disabled60s]); + const disabledAIModelsSet = useMemo(() => new Set(disabledAIModels), [disabledAIModels]); + + const load60sConfig = useCallback(async () => { + setLoading60s(true); + try { + const r = await fetch(`${ENV_CONFIG.API_URL}/api/site/60s-disabled`); + if (!r.ok) throw new Error(`HTTP ${r.status}`); + const d = await r.json(); + setDisabled60s(Array.isArray(d.disabled) ? d.disabled.map(String) : []); + } catch (e) { + console.error(e); + setDisabled60s([]); + toast.error('无法加载 60s 展示配置,请确认后端已启动'); + } + setLoading60s(false); + }, []); + + const fetchSysInfo = useCallback(async () => { + setLoading(true); + try { + const res = await fetch(`${ENV_CONFIG.API_URL}/`); + const data = await res.json(); + setSysInfo(data); + } catch (e) { + console.error('获取系统信息失败:', e); + } + setLoading(false); + }, []); + + const loadAiRuntime = useCallback(async () => { + if (localStorage.getItem('admin_token') !== ADMIN_TOKEN) return; + setLoadingAi(true); + try { + const token = localStorage.getItem('admin_token') || ''; + const r = await fetch(`${ENV_CONFIG.API_URL}/api/admin/site/ai-runtime`, { + headers: { 'X-Site-Admin-Token': token }, + }); + if (!r.ok) throw new Error(String(r.status)); + const d = await r.json(); + setAiBase(d.api_base || ''); + setAiModel(d.default_model || 'deepseek-chat'); + setAiKeySet(!!d.api_key_set); + setAiKeyHint(d.api_key_hint || ''); + setAiKey(''); + } catch (e) { + console.error(e); + toast.error('无法加载 AI 上游配置'); + } + setLoadingAi(false); + }, []); + + useEffect(() => { fetchSysInfo(); }, [fetchSysInfo]); + useEffect(() => { load60sConfig(); }, [load60sConfig]); + useEffect(() => { loadAiRuntime(); }, [loadAiRuntime]); + + const load60sSource = useCallback(async () => { + try { + const r = await fetch(`${ENV_CONFIG.API_URL}/api/site/60s-source`); + if (!r.ok) throw new Error(String(r.status)); + const d = await r.json(); + setSixtySrcId(d.source_id || 'self'); + } catch (e) { + console.error(e); + } + }, []); + + useEffect(() => { load60sSource(); }, [load60sSource]); + + const setItemVisible = (itemId, visible) => { + setDisabled60s((prev) => { + const s = new Set(prev); + if (visible) s.delete(itemId); + else s.add(itemId); + return Array.from(s).sort(); + }); + }; + + const save60sConfig = async () => { + const token = localStorage.getItem('admin_token') || ''; + setSaving60s(true); + try { + const r = await fetch(`${ENV_CONFIG.API_URL}/api/admin/site/60s-disabled`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + 'X-Site-Admin-Token': token, + }, + body: JSON.stringify({ disabled: disabled60s }), + }); + let data = {}; + try { + data = await r.json(); + } catch { /* ignore */ } + if (!r.ok) { + throw new Error(data.message || data.error || `HTTP ${r.status}`); + } + toast.success(`已保存到后端(当前隐藏 ${disabled60s.length} 项)`); + } catch (e) { + toast.error( + e.message?.includes('forbidden') || e.message === 'forbidden' + ? '令牌无效:请确认后端 INFOGENIE_SITE_ADMIN_TOKEN 与管理员口令一致' + : (e.message || '保存失败'), + ); + } + setSaving60s(false); + }; + + const saveAiRuntime = async () => { + const token = localStorage.getItem('admin_token') || ''; + setSavingAi(true); + try { + const r = await fetch(`${ENV_CONFIG.API_URL}/api/admin/site/ai-runtime`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + 'X-Site-Admin-Token': token, + }, + body: JSON.stringify({ + api_base: aiBase.trim(), + api_key: aiKey.trim(), + default_model: aiModel.trim() || 'deepseek-chat', + default_provider: 'deepseek', + }), + }); + const data = await r.json().catch(() => ({})); + if (!r.ok) throw new Error(data.message || data.error || `HTTP ${r.status}`); + toast.success('AI 上游配置已保存'); + await loadAiRuntime(); + } catch (e) { + toast.error(e.message || '保存失败'); + } + setSavingAi(false); + }; + + const save60sSource = async () => { + const token = localStorage.getItem('admin_token') || ''; + setSavingSixtySrc(true); + try { + const r = await fetch(`${ENV_CONFIG.API_URL}/api/admin/site/60s-source`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + 'X-Site-Admin-Token': token, + }, + body: JSON.stringify({ source_id: sixtySrcId }), + }); + const data = await r.json().catch(() => ({})); + if (!r.ok) throw new Error(data.message || data.error || `HTTP ${r.status}`); + toast.success(`60s 节点已保存:${data.label || sixtySrcId}`); + await load60sSource(); + } catch (e) { + toast.error(e.message || '保存失败'); + } + setSavingSixtySrc(false); + }; + + const loadAIModelConfig = useCallback(async () => { + setLoadingAIModels(true); + try { + const r = await fetch(`${ENV_CONFIG.API_URL}/api/site/ai-model-disabled`); + if (!r.ok) throw new Error(`HTTP ${r.status}`); + const d = await r.json(); + setDisabledAIModels(Array.isArray(d.disabled) ? d.disabled.map(String) : []); + } catch (e) { + console.error(e); + setDisabledAIModels([]); + toast.error('无法加载 AI 应用配置,请确认后端已启动'); + } + setLoadingAIModels(false); + }, []); + + useEffect(() => { loadAIModelConfig(); }, [loadAIModelConfig]); + + const saveAIModelConfig = async () => { + const token = localStorage.getItem('admin_token') || ''; + setSavingAIModels(true); + try { + const r = await fetch(`${ENV_CONFIG.API_URL}/api/admin/site/ai-model-disabled`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + 'X-Site-Admin-Token': token, + }, + body: JSON.stringify({ disabled: disabledAIModels }), + }); + const data = await r.json().catch(() => ({})); + if (!r.ok) throw new Error(data.message || data.error || `HTTP ${r.status}`); + toast.success(`AI 应用配置已保存,隐藏 ${disabledAIModels.length} 个应用`); + } catch (e) { + toast.error(e.message || '保存失败'); + } + setSavingAIModels(false); + }; + + const setAIModelVisible = (appId, visible) => { + if (visible) { + setDisabledAIModels(prev => prev.filter(id => id !== appId)); + } else { + setDisabledAIModels(prev => [...prev, appId]); + } + }; + + // 所有 Hook 调用完毕后再做条件判断 + const storedToken = localStorage.getItem('admin_token'); + if (storedToken !== ADMIN_TOKEN) { + return ; + } + + const handleLogout = () => { + localStorage.removeItem('admin_token'); + navigate('/', { replace: true }); + }; + + const handleClearBuildCache = () => { + if ('caches' in window) { + caches.keys().then(names => { + names.forEach(name => caches.delete(name)); + }); + } + alert('缓存已清除,请刷新页面'); + }; + + const handleClearLocalStorage = () => { + const savedAdmin = localStorage.getItem('admin_token'); + const savedUser = localStorage.getItem('token'); + localStorage.clear(); + if (savedAdmin) localStorage.setItem('admin_token', savedAdmin); + if (savedUser) localStorage.setItem('token', savedUser); + alert('本地存储已清理(保留登录状态)'); + }; + + const gameCount = 8; + const apiCount = API_CATEGORIES.reduce((sum, c) => sum + c.items.length, 0); + const toolboxCount = TOOLBOX_ITEMS.length; + const aiCount = AI_MODEL_APPS.filter((a) => a.IsShow !== false).length; + + return ( + + + + 管理员后台 + 退出后台 + + + + + + + 60sAPI + {apiCount} + + + + + + 休闲游戏 + {gameCount} + + + + + + 工具箱 + {toolboxCount} + + + + + + AI 应用 + {aiCount} + + + + + + 认证中心 + 已接入 + + + + + 系统信息 + + + 前端环境 + {ENV_CONFIG.ENV || 'development'} + + + API 地址 + {ENV_CONFIG.API_URL} + + + 认证中心 + {ENV_CONFIG.AUTH_URL || '未配置'} + + + 认证中心 API + {ENV_CONFIG.AUTH_API_URL || '未配置'} + + + 后端状态 + + {loading ? '检测中...' : sysInfo ? '在线' : '离线'} + + + {sysInfo && ( + <> + + 后端版本 + {sysInfo.version || sysInfo.name || '-'} + + + 后端描述 + {sysInfo.description || sysInfo.message || '-'} + + + )} + + 浏览器 + {navigator.userAgent.split(' ').slice(-2).join(' ')} + + + 屏幕分辨率 + {window.screen.width} × {window.screen.height} + + + + 快捷操作 + + + 刷新后端状态 + + + 清除 Service Worker 缓存 + + + 清理本地存储 + + window.open(ENV_CONFIG.AUTH_URL, '_blank')}> + 打开认证中心 + + + + AI 应用上游(DeepSeek 兼容 OpenAI Chat) + + + 此处配置会写入数据库表 site_ai_runtime,并优先于服务端 ai_config.json。 + API Base 示例:https://api.deepseek.com(后端会自动拼接 /chat/completions)。 + 各 AI 应用的提示词已放在前端 public/aimodelapp/shared/ai-prompts.js,统一经 /api/aimodelapp/chat 调用。 + 密钥留空表示不修改已保存的 API Key。 + + {loadingAi ? ( + 正在加载… + ) : ( + <> + + API Base URL + setAiBase(e.target.value)} + placeholder="https://api.deepseek.com" + autoComplete="off" + /> + + + API Key{aiKeySet ? `(已配置:${aiKeyHint})` : ''} + setAiKey(e.target.value)} + placeholder={aiKeySet ? '留空保留原密钥;填写则覆盖' : '必填,保存后仅显示脱敏尾号'} + autoComplete="new-password" + /> + + + 默认模型 ID + setAiModel(e.target.value)} + placeholder="deepseek-chat" + autoComplete="off" + /> + + + + {savingAi ? '保存中…' : '保存 AI 配置'} + + + 重新加载 + + + + )} + + + 60s 数据源节点 + + + 选择 60s 类接口的上游根地址(与 Api60sConfig.API_SOURCES 对齐)。前台列表仅展示当前节点,用户不可切换;静态页通过 iframe 参数注入 base。 + + + {API_SOURCES.map((s) => ( + + setSixtySrcId(s.id)} + /> + + {s.label}{' '} + + ({s.baseUrl.replace(/^https?:\/\//, '')}) + + + + ))} + + + + {savingSixtySrc ? '保存中…' : '保存节点'} + + + 重新加载 + + + + + 60s API 前台展示 + + + 勾选表示在前台展示该功能;取消勾选将写入后端表 site_60s_disabled,用户无法在列表与详情中打开(直接 URL 也会被拦)。 + 保存时需在后端配置环境变量 INFOGENIE_SITE_ADMIN_TOKEN,取值与当前管理员口令(连点 Logo 解锁)一致。 + + {loading60s ? ( + 正在加载配置… + ) : ( + <> + {API_CATEGORIES.map((cat) => ( +
    + {cat.icon} {cat.title} + + {cat.items.map((item) => ( + + setItemVisible(item.id, e.target.checked)} + /> + {item.icon} {item.title} + + ))} + +
    + ))} + + + {saving60s ? '保存中…' : '保存到后端'} + + + 重新加载 + + + + )} +
    + + AI 应用前台展示 + + + 勾选表示在前台展示该AI应用;取消勾选将写入后端表 site_ai_model_disabled,用户无法在列表中看到或打开该应用。 + 保存时需在后端配置环境变量 INFOGENIE_SITE_ADMIN_TOKEN,取值与当前管理员口令(连点 Logo 解锁)一致。 + + {loadingAIModels ? ( + 正在加载配置… + ) : ( + <> + + {AI_MODEL_APPS.map((app) => ( + + setAIModelVisible(app.id, e.target.checked)} + /> + {app.icon} {app.title} + + ))} + + + + {savingAIModels ? '保存中…' : '保存到后端'} + + + 重新加载 + + + + )} + +
    +
    + ); +}; + +export default AdminPage; diff --git a/InfoGenie-frontend/src/pages/AiModelPage.js b/InfoGenie-frontend/src/pages/AiModelPage.js index df64c735..cb5c9cd1 100755 --- a/InfoGenie-frontend/src/pages/AiModelPage.js +++ b/InfoGenie-frontend/src/pages/AiModelPage.js @@ -1,548 +1,87 @@ import React, { useState, useEffect } from 'react'; -import { useNavigate } from 'react-router-dom'; -import { createPortal } from 'react-dom'; import styled from 'styled-components'; -import { FiCpu, FiUser, FiExternalLink, FiArrowLeft } from 'react-icons/fi'; import { useUser } from '../contexts/UserContext'; import { AI_MODEL_APPS } from '../config/StaticPageConfig'; +import { fetchAIModelDisabledSet, filterAIModelApps } from '../utils/aiModelVisibility'; // eslint-disable-next-line no-unused-vars import api from '../utils/api'; +import { + PageWrapper, + Container, + PageHeader, + PageTitle, + FeatureGrid, + FeatureCard, + FeatureCardIcon, + FeatureCardTitle, + FeatureCardDesc, +} from '../styles/shared'; +import FullscreenEmbed from '../components/FullscreenEmbed'; +import LoginRequired from '../components/LoginRequired'; -const AiContainer = styled.div` - min-height: calc(100vh - 140px); - padding: 20px 0; - opacity: 0; - transform: translateY(20px); - animation: pageEnter 0.8s ease-out forwards; - position: relative; - - @keyframes pageEnter { - 0% { - opacity: 0; - transform: translateY(20px); - } - 100% { - opacity: 1; - transform: translateY(0); - } +const Grid = styled(FeatureGrid)``; + +const Card = styled(FeatureCard)` + &::before { + background: ${({ $gradient }) => $gradient || 'linear-gradient(90deg, #4ade80, #86efac)'}; } `; -const Container = styled.div` - max-width: 1200px; - margin: 0 auto; - padding: 0 16px; +const CardEmoji = styled(FeatureCardIcon)` + font-size: 32px; + background: transparent; + border: none; + width: auto; + height: auto; `; -const PageHeader = styled.div` - text-align: center; - margin-bottom: 40px; -`; +const CardTitle = styled(FeatureCardTitle)``; -const PageTitle = styled.h1` - color: white; - font-size: 40px; - font-weight: 700; - margin-bottom: 10px; - text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); - - .title-emoji { - margin: 0 8px; - } - - @media (max-width: 768px) { - font-size: 33.6px; - } -`; +const CardDesc = styled(FeatureCardDesc)``; -const PageDescription = styled.p` - color: rgba(255, 255, 255, 0.8); - font-size: 18px; - max-width: 600px; - margin: 0 auto; -`; - -const LoginPrompt = styled.div` - background: white; - border-radius: 0; - padding: 60px 40px; - text-align: center; - box-shadow: none; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - min-height: 100vh; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -`; - -const AppGrid = styled.div` - display: grid; - grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); - gap: 24px; - margin-bottom: 40px; - - @media (max-width: 768px) { - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); - gap: 16px; - margin-bottom: 32px; - } - - @media (max-width: 480px) { - grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); - gap: 12px; - margin-bottom: 24px; - } -`; - -const AppCard = styled.div` +const StatusCard = styled.div` background: white; border-radius: 16px; - padding: 24px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); - transition: all 0.3s ease; - cursor: pointer; - border: 2px solid transparent; - position: relative; - - &:hover { - transform: translateY(-4px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); - border-color: #4ade80; - } - - @media (max-width: 768px) { - padding: 18px; - border-radius: 12px; - } - - @media (max-width: 480px) { - padding: 16px; - border-radius: 10px; - } + padding: 60px 40px; + text-align: center; + box-shadow: 0 2px 8px rgba(0,0,0,0.06); + margin-bottom: 32px; `; -const AppHeader = styled.div` - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 16px; -`; - -const AppTitle = styled.h3` - font-size: 20px; - font-weight: bold; - color: #1f2937; - margin: 0; - - @media (max-width: 768px) { - font-size: 18px; - } - - @media (max-width: 480px) { - font-size: 16px; - } -`; - -const AppIcon = styled.div` - font-size: 24px; - color: #4ade80; - - @media (max-width: 768px) { - font-size: 22px; - } - - @media (max-width: 480px) { - font-size: 20px; - } -`; - -const AppDescription = styled.p` - color: #6b7280; - font-size: 14px; - line-height: 1.5; - margin-bottom: 16px; - - @media (max-width: 768px) { - font-size: 13px; - margin-bottom: 14px; - line-height: 1.4; - } - - @media (max-width: 480px) { - font-size: 12px; - margin-bottom: 12px; - line-height: 1.3; - } -`; - -const AppFooter = styled.div` - display: flex; - align-items: center; - justify-content: space-between; -`; - -const AppTheme = styled.div` - width: 40px; - height: 40px; - border-radius: 8px; - display: flex; - align-items: center; - justify-content: center; - font-size: 24px; - background: rgba(74, 222, 128, 0.1); - border: 1px solid rgba(74, 222, 128, 0.3); - - @media (max-width: 768px) { - width: 36px; - height: 36px; - font-size: 20px; - border-radius: 6px; - } - - @media (max-width: 480px) { - width: 32px; - height: 32px; - font-size: 18px; - border-radius: 5px; - } -`; - -const LaunchButton = styled.button` - background: linear-gradient(135deg, #4ade80 0%, #22c55e 100%); - color: white; - border: none; - padding: 8px 16px; - border-radius: 8px; - font-size: 14px; - font-weight: 600; - cursor: pointer; - transition: all 0.2s ease; - display: flex; - align-items: center; - gap: 6px; - - &:hover { - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(74, 222, 128, 0.3); - } - - @media (max-width: 768px) { - padding: 7px 14px; - font-size: 13px; - border-radius: 6px; - gap: 5px; - } - - @media (max-width: 480px) { - padding: 6px 12px; - font-size: 12px; - border-radius: 5px; - gap: 4px; - } -`; - -const LoginIcon = styled.div` - font-size: 64px; - margin-bottom: 24px; -`; - -const LoginTitle = styled.h2` - font-size: 24px; - font-weight: bold; - color: #1f2937; - margin-bottom: 16px; -`; - -const LoginText = styled.p` - color: #6b7280; - font-size: 16px; - line-height: 1.6; - margin-bottom: 24px; -`; - -const LoginButton = styled.button` - background: linear-gradient(135deg, #4ade80 0%, #22c55e 100%); - color: white; - border: none; - padding: 14px 32px; - border-radius: 8px; - font-size: 16px; - font-weight: 600; - cursor: pointer; - transition: all 0.2s ease; - display: inline-flex; - align-items: center; - gap: 8px; - - &:hover { - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(74, 222, 128, 0.3); - } -`; - -// 独立全屏嵌套网页组件 -const FullscreenEmbeddedPage = ({ app, onClose }) => { - useEffect(() => { - // 禁用页面滚动 - document.body.style.overflow = 'hidden'; - - // 键盘事件监听 - const handleKeyDown = (e) => { - if (e.key === 'Escape') { - onClose(); - } - }; - - document.addEventListener('keydown', handleKeyDown); - - return () => { - // 恢复页面滚动 - document.body.style.overflow = 'auto'; - document.removeEventListener('keydown', handleKeyDown); - }; - }, [onClose]); - - const fullscreenStyles = { - position: 'fixed', - top: 0, - left: 0, - width: '100vw', - height: '100vh', - backgroundColor: '#ffffff', - zIndex: 999999, - display: 'flex', - flexDirection: 'column', - fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif', - margin: 0, - padding: 0, - boxSizing: 'border-box', - // 重置所有可能的继承样式 - fontSize: '16px', - lineHeight: '1.5', - color: '#333', - textAlign: 'left', - textDecoration: 'none', - textTransform: 'none', - letterSpacing: 'normal', - wordSpacing: 'normal', - textShadow: 'none', - boxShadow: 'none', - border: 'none', - borderRadius: 0, - outline: 'none', - transform: 'none', - transition: 'none', - animation: 'none', - filter: 'none', - backdropFilter: 'none', - opacity: 1, - visibility: 'visible', - overflow: 'hidden' - }; - - const headerStyles = { - backgroundColor: '#4ade80', - color: '#ffffff', - padding: '12px 20px', - display: 'flex', - alignItems: 'center', - justifyContent: 'space-between', - boxShadow: '0 2px 8px rgba(0,0,0,0.1)', - flexShrink: 0, - minHeight: '56px', - boxSizing: 'border-box', - margin: 0, - border: 'none', - borderRadius: 0, - fontSize: '16px', - fontWeight: 'normal', - textAlign: 'left', - textDecoration: 'none', - textTransform: 'none', - letterSpacing: 'normal', - wordSpacing: 'normal', - textShadow: 'none', - transform: 'none', - transition: 'none', - animation: 'none', - filter: 'none', - backdropFilter: 'none', - opacity: 1, - visibility: 'visible', - overflow: 'visible' - }; - - const titleStyles = { - fontSize: '18px', - fontWeight: '500', - margin: 0, - padding: 0, - color: '#ffffff', - textAlign: 'left', - textDecoration: 'none', - textTransform: 'none', - letterSpacing: 'normal', - wordSpacing: 'normal', - textShadow: 'none', - boxShadow: 'none', - border: 'none', - borderRadius: 0, - outline: 'none', - transform: 'none', - transition: 'none', - animation: 'none', - filter: 'none', - backdropFilter: 'none', - opacity: 1, - visibility: 'visible', - overflow: 'visible', - boxSizing: 'border-box' - }; - - const backButtonStyles = { - backgroundColor: 'rgba(255, 255, 255, 0.15)', - color: '#ffffff', - border: 'none', - padding: '8px 16px', - borderRadius: '6px', - cursor: 'pointer', - display: 'flex', - alignItems: 'center', - gap: '6px', - fontSize: '14px', - fontWeight: '500', - transition: 'background-color 0.2s ease', - margin: 0, - textAlign: 'center', - textDecoration: 'none', - textTransform: 'none', - letterSpacing: 'normal', - wordSpacing: 'normal', - textShadow: 'none', - boxShadow: 'none', - outline: 'none', - transform: 'none', - animation: 'none', - filter: 'none', - backdropFilter: 'none', - opacity: 1, - visibility: 'visible', - overflow: 'visible', - boxSizing: 'border-box' - }; - - const iframeStyles = { - width: '100%', - height: 'calc(100vh - 56px)', - border: 'none', - backgroundColor: '#ffffff', - flexGrow: 1, - margin: 0, - padding: 0, - boxSizing: 'border-box', - fontSize: '16px', - lineHeight: '1.5', - color: '#333', - textAlign: 'left', - textDecoration: 'none', - textTransform: 'none', - letterSpacing: 'normal', - wordSpacing: 'normal', - textShadow: 'none', - boxShadow: 'none', - borderRadius: 0, - outline: 'none', - transform: 'none', - transition: 'none', - animation: 'none', - filter: 'none', - backdropFilter: 'none', - opacity: 1, - visibility: 'visible', - overflow: 'hidden' - }; - - const handleBackButtonHover = (e) => { - e.target.style.backgroundColor = 'rgba(255, 255, 255, 0.25)'; - }; - - const handleBackButtonLeave = (e) => { - e.target.style.backgroundColor = 'rgba(255, 255, 255, 0.15)'; - }; - - // 在iframe加载时注入token - const handleIframeLoad = (e) => { - try { - const iframe = e.target; - const token = localStorage.getItem('token'); - - if (iframe && iframe.contentWindow && token) { - // 将token传递给iframe - iframe.contentWindow.localStorage.setItem('token', token); - } - } catch (error) { - console.error('iframe通信错误:', error); - } - }; - - return ( -
    -
    -

    {app.title}

    - -
    -