修改前端 项目改名
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
InfoGenie 后端主应用入口
|
||||
Created by: 神奇万事通
|
||||
Created by: 万象口袋
|
||||
Date: 2025-09-02
|
||||
"""
|
||||
|
||||
@@ -50,7 +50,7 @@ def create_app():
|
||||
def index():
|
||||
"""API根路径"""
|
||||
return jsonify({
|
||||
'message': '✨ 神奇万事通 API 服务运行中 ✨',
|
||||
'message': '✨ 万象口袋 API 服务运行中 ✨',
|
||||
'version': '1.0.0',
|
||||
'timestamp': datetime.now().isoformat(),
|
||||
'endpoints': {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# InfoGenie 后端 Docker 镜像构建脚本
|
||||
# Created by: 神奇万事通
|
||||
# Created by: 万象口袋
|
||||
# Date: 2025-09-16
|
||||
|
||||
set -e
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
InfoGenie 配置文件
|
||||
Created by: 神奇万事通
|
||||
Created by: 万象口袋
|
||||
Date: 2025-09-02
|
||||
"""
|
||||
|
||||
@@ -38,7 +38,7 @@ class Config:
|
||||
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')
|
||||
MAIL_DEFAULT_SENDER = ('InfoGenie 万象口袋', os.environ.get('MAIL_USERNAME') or 'your-email@qq.com')
|
||||
|
||||
# API 配置
|
||||
API_RATE_LIMIT = '100 per hour' # API调用频率限制
|
||||
@@ -52,9 +52,9 @@ class Config:
|
||||
|
||||
# 应用信息
|
||||
APP_INFO = {
|
||||
'name': '✨ 神奇万事通 ✨',
|
||||
'name': '✨ 万象口袋 ✨',
|
||||
'description': '🎨 一个多功能的聚合软件应用 💬',
|
||||
'author': '👨💻 by-神奇万事通',
|
||||
'author': '👨💻 by-万象口袋',
|
||||
'version': '1.0.0',
|
||||
'icp': '📄 蜀ICP备2025151694号'
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
AI模型应用服务模块
|
||||
Created by: 神奇万事通
|
||||
Created by: 万象口袋
|
||||
Date: 2025-01-15
|
||||
"""
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
用户认证模块
|
||||
Created by: 神奇万事通
|
||||
Created by: 万象口袋
|
||||
Date: 2025-09-02
|
||||
"""
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ def send_verification_email(email, verification_type='register'):
|
||||
<body>
|
||||
<div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px;">
|
||||
<div style="text-align: center; margin-bottom: 30px;">
|
||||
<h1 style="color: #66bb6a; margin: 0;">InfoGenie 神奇万事通</h1>
|
||||
<h1 style="color: #66bb6a; margin: 0;">InfoGenie 万象口袋</h1>
|
||||
<p style="color: #666; font-size: 14px; margin: 5px 0;">欢迎注册InfoGenie</p>
|
||||
</div>
|
||||
|
||||
@@ -101,7 +101,7 @@ def send_verification_email(email, verification_type='register'):
|
||||
<body>
|
||||
<div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px;">
|
||||
<div style="text-align: center; margin-bottom: 30px;">
|
||||
<h1 style="color: #66bb6a; margin: 0;">InfoGenie 神奇万事通</h1>
|
||||
<h1 style="color: #66bb6a; margin: 0;">InfoGenie 万象口袋</h1>
|
||||
<p style="color: #666; font-size: 14px; margin: 5px 0;">安全登录验证</p>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
用户管理模块
|
||||
Created by: 神奇万事通
|
||||
Created by: 万象口袋
|
||||
Date: 2025-09-02
|
||||
"""
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"name": "infogenie-frontend",
|
||||
"version": "1.0.0",
|
||||
"description": "✨ 神奇万事通 - 前端React应用",
|
||||
"description": "✨ 万象口袋 - 前端React应用",
|
||||
"keywords": ["react", "api", "mobile-first", "responsive"],
|
||||
"author": "神奇万事通",
|
||||
"author": "万象口袋",
|
||||
"license": "MIT",
|
||||
"private": true,
|
||||
"homepage": "/",
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
/* 农历主题背景样式 - 动态调节版本 */
|
||||
/* 农历主题背景样式 - 柔和版本 */
|
||||
body {
|
||||
background: linear-gradient(135deg,
|
||||
#fff8dc 0%, /* 玉米丝色 */
|
||||
#ffd700 20%, /* 金黄色 */
|
||||
#ffcc00 40%, /* 亮金色 */
|
||||
#daa520 60%, /* 深金色 */
|
||||
#b8860b 80%, /* 暗金色 */
|
||||
#fff8dc 100% /* 玉米丝色 */
|
||||
#f8f9fa 0%, /* 浅灰白 */
|
||||
#fff3e0 20%, /* 淡橙色 */
|
||||
#fef7e0 40%, /* 极淡黄 */
|
||||
#f3e5ab 60%, /* 柔和金色 */
|
||||
#e8dcc6 80%, /* 米色 */
|
||||
#f8f9fa 100% /* 浅灰白 */
|
||||
);
|
||||
background-size: 400% 400%;
|
||||
animation: goldenShift 25s ease infinite;
|
||||
animation: gentleShift 30s ease infinite;
|
||||
background-attachment: fixed;
|
||||
min-height: 100vh;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
@keyframes goldenShift {
|
||||
@keyframes gentleShift {
|
||||
0% { background-position: 0% 50%; }
|
||||
25% { background-position: 100% 50%; }
|
||||
50% { background-position: 100% 100%; }
|
||||
@@ -23,7 +23,7 @@ body {
|
||||
100% { background-position: 0% 50%; }
|
||||
}
|
||||
|
||||
/* 动态颜色调节系统 */
|
||||
/* 动态颜色调节系统 - 柔和版本 */
|
||||
.adaptive-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
@@ -31,9 +31,9 @@ body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background:
|
||||
radial-gradient(circle at 20% 30%, rgba(255, 255, 255, 0.1) 0%, transparent 50%),
|
||||
radial-gradient(circle at 80% 70%, rgba(255, 255, 255, 0.15) 0%, transparent 50%),
|
||||
linear-gradient(45deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.2) 100%);
|
||||
radial-gradient(circle at 20% 30%, rgba(255, 255, 255, 0.3) 0%, transparent 50%),
|
||||
radial-gradient(circle at 80% 70%, rgba(255, 255, 255, 0.25) 0%, transparent 50%),
|
||||
linear-gradient(45deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.3) 100%);
|
||||
pointer-events: none;
|
||||
z-index: 1;
|
||||
animation: adaptiveShift 60s ease infinite;
|
||||
|
||||
@@ -8,34 +8,26 @@
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
|
||||
line-height: 1.6;
|
||||
color: #2c3e50;
|
||||
color: #1a1a1a;
|
||||
overflow-x: hidden;
|
||||
animation: textColorShift 25s ease infinite;
|
||||
}
|
||||
|
||||
@keyframes textColorShift {
|
||||
0% {
|
||||
color: #2c3e50;
|
||||
text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.8);
|
||||
}
|
||||
25% {
|
||||
color: #1a252f;
|
||||
text-shadow: 2px 2px 4px rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
50% {
|
||||
color: #34495e;
|
||||
text-shadow: 1px 1px 3px rgba(255, 255, 255, 0.7);
|
||||
}
|
||||
75% {
|
||||
color: #2c3e50;
|
||||
text-shadow: 2px 2px 4px rgba(255, 255, 255, 0.8);
|
||||
}
|
||||
100% {
|
||||
color: #2c3e50;
|
||||
text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.8);
|
||||
}
|
||||
/* 结果容器 - 优化可读性版本 */
|
||||
.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;
|
||||
@@ -106,22 +98,21 @@ body {
|
||||
}
|
||||
}
|
||||
|
||||
/* 头部 - 动态调节版本 */
|
||||
/* 头部 - 优化可读性版本 */
|
||||
.header {
|
||||
text-align: center;
|
||||
margin-bottom: 40px;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
backdrop-filter: blur(25px);
|
||||
-webkit-backdrop-filter: blur(25px);
|
||||
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(255, 255, 255, 0.2);
|
||||
border: 1px solid rgba(0, 0, 0, 0.1);
|
||||
box-shadow:
|
||||
0 8px 32px 0 rgba(31, 38, 135, 0.2),
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.4);
|
||||
0 8px 32px 0 rgba(0, 0, 0, 0.1),
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.8);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
animation: headerColorShift 25s ease infinite;
|
||||
}
|
||||
|
||||
@keyframes headerColorShift {
|
||||
@@ -204,78 +195,23 @@ body {
|
||||
.title {
|
||||
font-size: 3.2em;
|
||||
font-weight: 800;
|
||||
color: #2c3e50;
|
||||
color: #1a1a1a;
|
||||
margin-bottom: 10px;
|
||||
text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.8), 0 0 4px rgba(255, 255, 255, 0.6);
|
||||
text-shadow: 1px 1px 3px rgba(255, 255, 255, 0.8);
|
||||
letter-spacing: 2px;
|
||||
animation: titleGlow 4s ease-in-out infinite alternate, titleColorShift 25s ease infinite;
|
||||
}
|
||||
|
||||
@keyframes titleColorShift {
|
||||
0% {
|
||||
color: #2c3e50;
|
||||
text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.8), 0 0 4px rgba(255, 255, 255, 0.6);
|
||||
}
|
||||
25% {
|
||||
color: #3498db;
|
||||
text-shadow: 1px 1px 3px rgba(255, 255, 255, 0.9), 0 0 6px rgba(52, 152, 219, 0.4);
|
||||
}
|
||||
50% {
|
||||
color: #e74c3c;
|
||||
text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.7), 0 0 5px rgba(231, 76, 60, 0.3);
|
||||
}
|
||||
75% {
|
||||
color: #f39c12;
|
||||
text-shadow: 1px 1px 3px rgba(255, 255, 255, 0.8), 0 0 6px rgba(243, 156, 18, 0.4);
|
||||
}
|
||||
100% {
|
||||
color: #2c3e50;
|
||||
text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.8), 0 0 4px rgba(255, 255, 255, 0.6);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes titleGlow {
|
||||
0% {
|
||||
text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.8), 0 0 4px rgba(255, 255, 255, 0.6);
|
||||
color: #2c3e50;
|
||||
}
|
||||
100% {
|
||||
text-shadow: 2px 2px 4px rgba(255, 255, 255, 0.9), 0 0 8px rgba(255, 255, 255, 0.7);
|
||||
color: #3498db;
|
||||
}
|
||||
}
|
||||
/* 移除标题颜色动画,保持稳定的可读性 */
|
||||
|
||||
.subtitle {
|
||||
font-size: 1.3em;
|
||||
color: #7f8c8d;
|
||||
color: #555555;
|
||||
margin-bottom: 30px;
|
||||
font-weight: 600;
|
||||
text-shadow: 0 1px 2px rgba(255, 255, 255, 0.8);
|
||||
animation: subtitleColorShift 25s ease infinite;
|
||||
}
|
||||
|
||||
@keyframes subtitleColorShift {
|
||||
0% {
|
||||
color: #7f8c8d;
|
||||
text-shadow: 0 1px 2px rgba(255, 255, 255, 0.8);
|
||||
}
|
||||
25% {
|
||||
color: #9b59b6;
|
||||
text-shadow: 0 1px 3px rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
50% {
|
||||
color: #e67e22;
|
||||
text-shadow: 0 1px 2px rgba(255, 255, 255, 0.7);
|
||||
}
|
||||
75% {
|
||||
color: #27ae60;
|
||||
text-shadow: 0 1px 3px rgba(255, 255, 255, 0.8);
|
||||
}
|
||||
100% {
|
||||
color: #7f8c8d;
|
||||
text-shadow: 0 1px 2px rgba(255, 255, 255, 0.8);
|
||||
}
|
||||
}
|
||||
/* 移除副标题颜色动画,保持稳定的可读性 */
|
||||
|
||||
/* 日期选择器 */
|
||||
.date-selector {
|
||||
@@ -298,84 +234,35 @@ body {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
color: #0f1419;
|
||||
color: #2c2c2c;
|
||||
font-weight: 600;
|
||||
font-size: 1em;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.6);
|
||||
animation: labelColorShift 25s ease infinite;
|
||||
text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.8);
|
||||
}
|
||||
|
||||
@keyframes labelColorShift {
|
||||
0% {
|
||||
color: #0f1419;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.6);
|
||||
}
|
||||
25% {
|
||||
color: #1a252f;
|
||||
text-shadow: 2px 2px 3px rgba(0, 0, 0, 0.7);
|
||||
}
|
||||
50% {
|
||||
color: #2c3e50;
|
||||
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
75% {
|
||||
color: #0f1419;
|
||||
text-shadow: 2px 2px 2px rgba(0, 0, 0, 0.6);
|
||||
}
|
||||
100% {
|
||||
color: #0f1419;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.6);
|
||||
}
|
||||
}
|
||||
/* 移除标签颜色动画,保持稳定的可读性 */
|
||||
|
||||
.label-icon {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.date-input {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
background: rgba(255, 255, 255, 0.9);
|
||||
backdrop-filter: blur(10px);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||
border: 1px solid rgba(0, 0, 0, 0.2);
|
||||
border-radius: 15px;
|
||||
padding: 12px 16px;
|
||||
color: #0a0f14;
|
||||
color: #1a1a1a;
|
||||
font-size: 1em;
|
||||
font-weight: 500;
|
||||
transition: all 0.3s ease;
|
||||
box-shadow:
|
||||
0 4px 15px rgba(31, 38, 135, 0.1),
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.2);
|
||||
animation: inputColorShift 25s ease infinite;
|
||||
0 4px 15px rgba(0, 0, 0, 0.1),
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.8);
|
||||
}
|
||||
|
||||
@keyframes inputColorShift {
|
||||
0% {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
border-color: rgba(255, 255, 255, 0.3);
|
||||
color: #0a0f14;
|
||||
}
|
||||
25% {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: rgba(255, 255, 255, 0.4);
|
||||
color: #1a252f;
|
||||
}
|
||||
50% {
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
border-color: rgba(255, 255, 255, 0.35);
|
||||
color: #2c3e50;
|
||||
}
|
||||
75% {
|
||||
background: rgba(255, 255, 255, 0.18);
|
||||
border-color: rgba(255, 255, 255, 0.38);
|
||||
color: #0a0f14;
|
||||
}
|
||||
100% {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
border-color: rgba(255, 255, 255, 0.3);
|
||||
color: #0a0f14;
|
||||
}
|
||||
}
|
||||
/* 移除输入框颜色动画,保持稳定的可读性 */
|
||||
|
||||
.date-input:focus {
|
||||
outline: none;
|
||||
@@ -395,11 +282,11 @@ body {
|
||||
}
|
||||
|
||||
.query-btn {
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
background: linear-gradient(135deg, #f0f0f0, #e0e0e0);
|
||||
backdrop-filter: blur(15px);
|
||||
-webkit-backdrop-filter: blur(15px);
|
||||
color: #0a0f14;
|
||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||
color: #1a1a1a;
|
||||
border: 1px solid rgba(0, 0, 0, 0.2);
|
||||
padding: 12px 28px;
|
||||
border-radius: 20px;
|
||||
cursor: pointer;
|
||||
@@ -411,40 +298,13 @@ body {
|
||||
gap: 8px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
|
||||
text-shadow: 0 1px 3px rgba(255, 255, 255, 0.8);
|
||||
box-shadow:
|
||||
0 4px 15px rgba(31, 38, 135, 0.2),
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.3);
|
||||
animation: buttonColorShift 25s ease infinite;
|
||||
0 4px 15px rgba(0, 0, 0, 0.1),
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.8);
|
||||
}
|
||||
|
||||
@keyframes buttonColorShift {
|
||||
0% {
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
border-color: rgba(255, 255, 255, 0.3);
|
||||
color: #0a0f14;
|
||||
}
|
||||
25% {
|
||||
background: rgba(255, 255, 255, 0.25);
|
||||
border-color: rgba(255, 255, 255, 0.4);
|
||||
color: #1a252f;
|
||||
}
|
||||
50% {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: rgba(255, 255, 255, 0.35);
|
||||
color: #2c3e50;
|
||||
}
|
||||
75% {
|
||||
background: rgba(255, 255, 255, 0.22);
|
||||
border-color: rgba(255, 255, 255, 0.38);
|
||||
color: #0a0f14;
|
||||
}
|
||||
100% {
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
border-color: rgba(255, 255, 255, 0.3);
|
||||
color: #0a0f14;
|
||||
}
|
||||
}
|
||||
/* 移除按钮颜色动画,保持稳定的可读性 */
|
||||
|
||||
.query-btn::before {
|
||||
content: '';
|
||||
@@ -466,12 +326,12 @@ body {
|
||||
}
|
||||
|
||||
.query-btn:hover {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: rgba(255, 255, 255, 0.4);
|
||||
transform: translateY(-3px);
|
||||
background: linear-gradient(135deg, #e8e8e8, #d8d8d8);
|
||||
border-color: rgba(0, 0, 0, 0.3);
|
||||
transform: translateY(-2px);
|
||||
box-shadow:
|
||||
0 8px 25px rgba(31, 38, 135, 0.3),
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.4);
|
||||
0 8px 25px rgba(0, 0, 0, 0.15),
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
|
||||
.btn-icon {
|
||||
@@ -590,10 +450,10 @@ body {
|
||||
|
||||
.loading-text p {
|
||||
font-size: 1.2em;
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
color: #1a1a1a;
|
||||
font-weight: 600;
|
||||
margin: 0;
|
||||
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
|
||||
text-shadow: 0 1px 3px rgba(255, 255, 255, 0.8);
|
||||
}
|
||||
|
||||
.loading-dots {
|
||||
@@ -604,7 +464,7 @@ body {
|
||||
.loading-dots span {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
background: rgba(255, 255, 255, 0.7);
|
||||
background: #4a4a4a;
|
||||
border-radius: 50%;
|
||||
animation: glassDotsFloat 1.4s ease-in-out infinite both;
|
||||
backdrop-filter: blur(2px);
|
||||
@@ -1016,15 +876,18 @@ body {
|
||||
}
|
||||
}
|
||||
|
||||
/* 手机端适配 (767px以下) */
|
||||
/* 手机端适配 (767px以下) - 优化手机端体验 */
|
||||
@media (max-width: 767px) {
|
||||
.container {
|
||||
padding: 15px;
|
||||
margin: 10px auto;
|
||||
max-width: 95%;
|
||||
}
|
||||
|
||||
.header {
|
||||
padding: 25px 20px;
|
||||
padding: 25px 15px;
|
||||
margin-bottom: 25px;
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
.header-icon {
|
||||
@@ -1034,16 +897,19 @@ body {
|
||||
.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 {
|
||||
@@ -1053,16 +919,19 @@ body {
|
||||
}
|
||||
|
||||
.date-input {
|
||||
padding: 10px 14px;
|
||||
font-size: 0.95em;
|
||||
padding: 14px 16px;
|
||||
font-size: 16px; /* 防止iOS缩放 */
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.query-btn {
|
||||
padding: 10px 24px;
|
||||
font-size: 0.95em;
|
||||
padding: 14px 24px;
|
||||
font-size: 16px;
|
||||
width: 100%;
|
||||
max-width: 200px;
|
||||
justify-content: center;
|
||||
border-radius: 15px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.update-time {
|
||||
@@ -1101,7 +970,8 @@ body {
|
||||
|
||||
.item-label {
|
||||
min-width: auto;
|
||||
font-size: 0.9em;
|
||||
font-size: 0.95em;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.item-value {
|
||||
@@ -1360,7 +1230,7 @@ body {
|
||||
|
||||
.hour-label {
|
||||
font-weight: 600;
|
||||
color: #ffffff;
|
||||
color: #1a1a1a;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
@@ -1373,7 +1243,7 @@ body {
|
||||
}
|
||||
|
||||
.hour-text {
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
color: #2c2c2c;
|
||||
}
|
||||
|
||||
/* 时辰宜忌响应式优化 */
|
||||
|
||||
@@ -382,7 +382,7 @@ function showSuccessMessage(message) {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
backdrop-filter: blur(15px);
|
||||
-webkit-backdrop-filter: blur(15px);
|
||||
color: rgba(255, 255, 255, 0.95);
|
||||
color: #1a1a1a;
|
||||
padding: 12px 20px;
|
||||
border-radius: 25px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||
|
||||
@@ -9,13 +9,29 @@
|
||||
|
||||
body {
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
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;
|
||||
@@ -26,11 +42,12 @@ body {
|
||||
.header {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
background: rgba(255, 255, 255, 0.95);
|
||||
border-radius: 15px;
|
||||
padding: 20px 15px;
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
|
||||
backdrop-filter: blur(10px);
|
||||
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 {
|
||||
@@ -52,43 +69,47 @@ body {
|
||||
}
|
||||
|
||||
/* 日期显示 */
|
||||
.date-info {
|
||||
background: rgba(255, 255, 255, 0.95);
|
||||
border-radius: 12px;
|
||||
padding: 15px;
|
||||
margin-bottom: 15px;
|
||||
.date-section {
|
||||
background: rgba(255, 255, 255, 0.9);
|
||||
border-radius: 16px;
|
||||
padding: 20px;
|
||||
margin-bottom: 20px;
|
||||
text-align: center;
|
||||
box-shadow: 0 3px 15px rgba(0, 0, 0, 0.08);
|
||||
box-shadow: 0 6px 24px rgba(76, 175, 80, 0.12);
|
||||
border: 1px solid rgba(139, 195, 74, 0.2);
|
||||
}
|
||||
|
||||
.date-info h2 {
|
||||
font-size: 1.3rem;
|
||||
color: #2c3e50;
|
||||
margin-bottom: 5px;
|
||||
.date-display h2 {
|
||||
font-size: 1.4rem;
|
||||
color: #2e7d32;
|
||||
margin-bottom: 8px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.date-info .date-text {
|
||||
color: #7f8c8d;
|
||||
font-size: 0.9rem;
|
||||
.date-display .date-text {
|
||||
color: #558b2f;
|
||||
font-size: 1rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* 加载状态 */
|
||||
.loading {
|
||||
text-align: center;
|
||||
padding: 30px 15px;
|
||||
background: rgba(255, 255, 255, 0.95);
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 3px 15px rgba(0, 0, 0, 0.08);
|
||||
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);
|
||||
}
|
||||
|
||||
.spinner {
|
||||
width: 35px;
|
||||
height: 35px;
|
||||
border: 3px solid #ecf0f1;
|
||||
border-top: 3px solid #667eea;
|
||||
.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 1s linear infinite;
|
||||
margin: 0 auto 15px;
|
||||
animation: spin 1.2s linear infinite;
|
||||
margin: 0 auto 20px;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
@@ -98,40 +119,49 @@ body {
|
||||
|
||||
/* 历史事件容器 */
|
||||
.events-container {
|
||||
background: rgba(255, 255, 255, 0.95);
|
||||
border-radius: 15px;
|
||||
padding: 15px;
|
||||
margin-bottom: 15px;
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
|
||||
backdrop-filter: blur(10px);
|
||||
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: 8px;
|
||||
margin-bottom: 20px;
|
||||
gap: 12px;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.stat-item {
|
||||
background: rgba(102, 126, 234, 0.1);
|
||||
border-radius: 10px;
|
||||
padding: 12px;
|
||||
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.4rem;
|
||||
font-size: 1.5rem;
|
||||
font-weight: 700;
|
||||
color: #667eea;
|
||||
color: #558b2f;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.stat-label {
|
||||
color: #7f8c8d;
|
||||
font-size: 0.8rem;
|
||||
margin-top: 3px;
|
||||
color: #689f38;
|
||||
font-size: 0.85rem;
|
||||
margin-top: 4px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* 事件列表 */
|
||||
@@ -142,18 +172,20 @@ body {
|
||||
}
|
||||
|
||||
.event-card {
|
||||
background: rgba(255, 255, 255, 0.9);
|
||||
border-radius: 12px;
|
||||
padding: 15px;
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
|
||||
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 #667eea;
|
||||
border-left: 4px solid #81c784;
|
||||
position: relative;
|
||||
border: 1px solid rgba(139, 195, 74, 0.15);
|
||||
}
|
||||
|
||||
.event-card:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
|
||||
transform: translateY(-3px);
|
||||
box-shadow: 0 8px 24px rgba(76, 175, 80, 0.15);
|
||||
border-left-color: #66bb6a;
|
||||
}
|
||||
|
||||
/* 事件类型标签 */
|
||||
@@ -170,25 +202,25 @@ body {
|
||||
|
||||
.event-type.birth {
|
||||
background: #e8f5e8;
|
||||
color: #27ae60;
|
||||
color: #2e7d32;
|
||||
}
|
||||
|
||||
.event-type.death {
|
||||
background: #fdf2e9;
|
||||
color: #e67e22;
|
||||
background: #fff3e0;
|
||||
color: #f57c00;
|
||||
}
|
||||
|
||||
.event-type.event {
|
||||
background: #ebf3fd;
|
||||
color: #3498db;
|
||||
background: #f1f8e9;
|
||||
color: #558b2f;
|
||||
}
|
||||
|
||||
/* 事件年份 */
|
||||
.event-year {
|
||||
font-size: 1.1rem;
|
||||
font-weight: 700;
|
||||
color: #667eea;
|
||||
margin-bottom: 8px;
|
||||
color: #558b2f;
|
||||
margin-bottom: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
@@ -220,20 +252,22 @@ body {
|
||||
.event-link {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
color: #667eea;
|
||||
gap: 6px;
|
||||
color: #558b2f;
|
||||
text-decoration: none;
|
||||
font-size: 0.8rem;
|
||||
font-size: 0.85rem;
|
||||
font-weight: 500;
|
||||
padding: 6px 12px;
|
||||
background: rgba(102, 126, 234, 0.1);
|
||||
border-radius: 15px;
|
||||
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(102, 126, 234, 0.2);
|
||||
background: rgba(139, 195, 74, 0.25);
|
||||
transform: translateX(2px);
|
||||
color: #2e7d32;
|
||||
}
|
||||
|
||||
.event-link::after {
|
||||
@@ -371,18 +405,19 @@ body {
|
||||
|
||||
/* 滚动条样式 */
|
||||
::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
width: 8px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
background: rgba(139, 195, 74, 0.1);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: rgba(102, 126, 234, 0.5);
|
||||
border-radius: 3px;
|
||||
background: rgba(139, 195, 74, 0.5);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: rgba(102, 126, 234, 0.7);
|
||||
background: rgba(139, 195, 74, 0.7);
|
||||
}
|
||||
@@ -296,66 +296,131 @@ body {
|
||||
|
||||
/* 手机端 */
|
||||
@media (max-width: 480px) {
|
||||
body {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.container {
|
||||
padding: 10px;
|
||||
padding: 8px;
|
||||
margin: 8px;
|
||||
max-width: calc(100vw - 16px);
|
||||
width: calc(100vw - 16px);
|
||||
}
|
||||
|
||||
.header {
|
||||
padding: 15px;
|
||||
margin-bottom: 20px;
|
||||
padding: 12px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.header h1 {
|
||||
font-size: 1.8rem;
|
||||
font-size: 1.6rem;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.header p {
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.rates-grid {
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 6px;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 8px;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.rate-card {
|
||||
padding: 8px;
|
||||
padding: 10px 6px;
|
||||
border-radius: 8px;
|
||||
min-width: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.currency-code {
|
||||
font-size: 0.85rem;
|
||||
font-size: 0.8rem;
|
||||
margin-bottom: 4px;
|
||||
gap: 4px;
|
||||
gap: 3px;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.currency-flag {
|
||||
font-size: 1rem;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.exchange-rate {
|
||||
font-size: 0.9rem;
|
||||
font-size: 0.85rem;
|
||||
margin-bottom: 3px;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.currency-name {
|
||||
font-size: 0.7rem;
|
||||
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: 15px;
|
||||
padding: 12px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.currency-selector select {
|
||||
min-width: 100%;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/* 大屏幕优化 */
|
||||
|
||||
@@ -460,19 +460,48 @@ footer {
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
body {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.container {
|
||||
margin: 8px auto;
|
||||
padding: 6px;
|
||||
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.6rem;
|
||||
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: 10px;
|
||||
margin-bottom: 8px;
|
||||
gap: 8px;
|
||||
padding: 12px;
|
||||
margin-bottom: 10px;
|
||||
gap: 10px;
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.hot-rank-container {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.hot-rank {
|
||||
@@ -484,36 +513,72 @@ footer {
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
|
||||
.hot-content-wrapper {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.hot-title {
|
||||
font-size: 0.85rem;
|
||||
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-meta-row {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.hot-media-row {
|
||||
.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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -449,18 +449,42 @@ footer {
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
body {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.container {
|
||||
margin: 8px auto;
|
||||
padding: 14px;
|
||||
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.6rem;
|
||||
font-size: 1.5rem;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.update-time {
|
||||
font-size: 0.8rem;
|
||||
padding: 6px 12px;
|
||||
}
|
||||
|
||||
.topic-item {
|
||||
padding: 14px;
|
||||
margin-bottom: 10px;
|
||||
margin-bottom: 12px;
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.topic-header {
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.topic-rank {
|
||||
@@ -469,15 +493,66 @@ footer {
|
||||
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-cover {
|
||||
width: 80px;
|
||||
height: 60px;
|
||||
.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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,19 +4,19 @@
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="#667eea" />
|
||||
<meta name="description" content="✨ 神奇万事通 - 一个多功能的聚合软件应用,提供60s API、小游戏、AI模型等丰富功能" />
|
||||
<meta name="keywords" content="60s API,热搜榜单,小游戏,AI模型,实时资讯,工具集合" />
|
||||
<meta name="author" content="神奇万事通" />
|
||||
<meta name="description" content="✨ 万象口袋 - 一个多功能的聚合软件应用,提供聚合应用、小游戏、AI模型工具等丰富功能" />
|
||||
<meta name="keywords" content="聚合应用,热搜榜单,小游戏,AI模型,实时资讯,工具集合" />
|
||||
<meta name="author" content="万象口袋" />
|
||||
|
||||
<!-- Open Graph / Facebook -->
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="神奇万事通" />
|
||||
<meta property="og:description" content="🎨 一个多功能的聚合软件应用 💬" />
|
||||
<meta property="og:title" content="万象口袋" />
|
||||
<meta property="og:description" content="🎨一个跨平台的多功能聚合软件应用" />
|
||||
|
||||
<!-- Twitter -->
|
||||
<meta property="twitter:card" content="summary_large_image" />
|
||||
<meta property="twitter:title" content="神奇万事通" />
|
||||
<meta property="twitter:description" content="🎨 一个多功能的聚合软件应用 💬" />
|
||||
<meta property="twitter:title" content="万象口袋" />
|
||||
<meta property="twitter:description" content="🎨一个跨平台的多功能聚合软件应用" />
|
||||
|
||||
<!-- Favicon -->
|
||||
<link rel="icon" href="%PUBLIC_URL%/assets/logo.png" />
|
||||
@@ -31,7 +31,7 @@
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<title>神奇万事通</title>
|
||||
<title>万象口袋</title>
|
||||
|
||||
<style>
|
||||
/* 加载动画 */
|
||||
@@ -52,30 +52,30 @@
|
||||
}
|
||||
|
||||
#loading .loading-logo {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
margin-bottom: 24px;
|
||||
animation: pulse 2s infinite;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
#loading .loading-text {
|
||||
font-size: 24px;
|
||||
font-size: 34px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
#loading .loading-desc {
|
||||
font-size: 14px;
|
||||
opacity: 0.8;
|
||||
font-size: 20px;
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
#loading .loading-spinner {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 4px solid rgba(255, 255, 255, 0.3);
|
||||
border-top: 4px solid white;
|
||||
width: 56px;
|
||||
height: 56px;
|
||||
border: 6px solid rgba(255, 255, 255, 0.3);
|
||||
border-top: 6px solid #ffffff;
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
@@ -91,8 +91,25 @@
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
#loading .loading-logo { width: 48px; height: 48px; }
|
||||
#loading .loading-text { font-size: 20px; }
|
||||
#loading .loading-logo {
|
||||
width: 67px;
|
||||
height: 67px;
|
||||
}
|
||||
|
||||
#loading .loading-text {
|
||||
font-size: 28px;
|
||||
}
|
||||
|
||||
#loading .loading-desc {
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
#loading .loading-spinner {
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
border: 4px solid rgba(255, 255, 255, 0.3);
|
||||
border-top: 4px solid #ffffff;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
@@ -101,9 +118,9 @@
|
||||
|
||||
<!-- 加载动画 -->
|
||||
<div id="loading">
|
||||
<img class="loading-logo" src="%PUBLIC_URL%/assets/logo.png" alt="神奇万事通" />
|
||||
<div class="loading-text">神奇万事通</div>
|
||||
<div class="loading-desc">🎨 多功能聚合应用 💬</div>
|
||||
<img class="loading-logo" src="%PUBLIC_URL%/assets/logo.png" alt="万象口袋" />
|
||||
<div class="loading-text">万象口袋</div>
|
||||
<div class="loading-desc">🎨 一个跨平台的多功能聚合应用(´。• ω •。`) 💬</div>
|
||||
<div class="loading-spinner"></div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"short_name": "神奇万事通",
|
||||
"name": "✨ 神奇万事通 - 多功能聚合应用",
|
||||
"description": "🎨 一个多功能的聚合软件应用,提供60s API、小游戏、AI模型等丰富功能",
|
||||
"short_name": "万象口袋",
|
||||
"name": "✨ 万象口袋 - 多功能聚合应用",
|
||||
"description": "🎨 一个多功能的聚合软件应用,提供聚合应用、休闲小游戏、AI模型工具等丰富功能",
|
||||
"icons": [
|
||||
{
|
||||
"src": "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>✨</text></svg>",
|
||||
@@ -29,7 +29,7 @@
|
||||
"categories": ["utilities", "productivity", "entertainment"],
|
||||
"screenshots": [
|
||||
{
|
||||
"src": "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 800'><rect width='400' height='800' fill='%23667eea'/><text x='200' y='400' text-anchor='middle' fill='white' font-size='32'>神奇万事通</text></svg>",
|
||||
"src": "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 800'><rect width='400' height='800' fill='%23667eea'/><text x='200' y='400' text-anchor='middle' fill='white' font-size='32'>万象口袋</text></svg>",
|
||||
"type": "image/svg+xml",
|
||||
"sizes": "400x800",
|
||||
"form_factor": "narrow"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"网站名字": "✨ 神奇万事通 ✨",
|
||||
"网站描述": "🎨 一个多功能的聚合软件应用 💬",
|
||||
"站长": "👨💻 by-神奇万事通",
|
||||
"网站名字": "✨ 万象口袋 ✨",
|
||||
"网站描述": "🎨 一个跨平台的多功能聚合软件应用",
|
||||
"站长": "👨💻 by-万象口袋",
|
||||
"备案号": "📄 蜀ICP备2025151694号",
|
||||
"网站页尾": "✨ 神奇万事通 ✨ | Copyright © 2025-2025 ✨",
|
||||
"网站页尾": "✨ 万象口袋 ✨ | Copyright © 2025-2025 ✨",
|
||||
"网站logo": "assets/logo.png"
|
||||
}
|
||||
@@ -2,10 +2,11 @@ import React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
const FooterContainer = styled.footer`
|
||||
background: #1f2937;
|
||||
color: #d1d5db;
|
||||
background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%);
|
||||
color: white;
|
||||
padding: 40px 0 80px; /* 底部留出导航栏空间 */
|
||||
margin-top: 60px;
|
||||
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
|
||||
|
||||
@media (min-width: 769px) {
|
||||
padding: 40px 0 20px;
|
||||
@@ -34,7 +35,7 @@ const FooterDescription = styled.p`
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
margin-bottom: 16px;
|
||||
color: #9ca3af;
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
`;
|
||||
|
||||
const FooterLinks = styled.div`
|
||||
@@ -50,26 +51,29 @@ const FooterLinks = styled.div`
|
||||
`;
|
||||
|
||||
const FooterLink = styled.a`
|
||||
color: #d1d5db;
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
transition: color 0.2s ease;
|
||||
transition: all 0.2s ease;
|
||||
padding: 8px 16px;
|
||||
border-radius: 6px;
|
||||
|
||||
&:hover {
|
||||
color: #4ade80;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
color: white;
|
||||
}
|
||||
`;
|
||||
|
||||
const FooterDivider = styled.div`
|
||||
height: 1px;
|
||||
background: #374151;
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
margin: 24px 0;
|
||||
`;
|
||||
|
||||
const FooterBottom = styled.div`
|
||||
text-align: center;
|
||||
font-size: 12px;
|
||||
color: #6b7280;
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
line-height: 1.5;
|
||||
`;
|
||||
|
||||
@@ -88,14 +92,10 @@ const Footer = () => {
|
||||
<FooterContainer>
|
||||
<FooterContent>
|
||||
<FooterInfo>
|
||||
<FooterTitle>✨ 神奇万事通 ✨</FooterTitle>
|
||||
<FooterTitle>✨ 万象口袋 ✨</FooterTitle>
|
||||
</FooterInfo>
|
||||
|
||||
<FooterLinks>
|
||||
<FooterLink href="/60sapi">📡API聚合应用</FooterLink>
|
||||
<FooterLink href="/smallgame">🎮玩玩小游戏</FooterLink>
|
||||
<FooterLink href="/aimodel">🤖AI工具</FooterLink>
|
||||
</FooterLinks>
|
||||
|
||||
|
||||
<FooterDivider />
|
||||
|
||||
|
||||
@@ -236,12 +236,12 @@ const Header = () => {
|
||||
<HeaderContent>
|
||||
<Logo to="/">
|
||||
<img className="logo-icon" src="/assets/logo.png" alt="InfoGenie Logo" />
|
||||
神奇万事通
|
||||
万象口袋
|
||||
</Logo>
|
||||
|
||||
<Nav>
|
||||
<NavLink to="/60sapi">API聚合应用</NavLink>
|
||||
<NavLink to="/smallgame">玩玩小游戏</NavLink>
|
||||
<NavLink to="/60sapi">聚合应用</NavLink>
|
||||
<NavLink to="/smallgame">休闲游戏</NavLink>
|
||||
<NavLink to="/aimodel">AI工具</NavLink>
|
||||
<NavLink to="/profile">个人中心</NavLink>
|
||||
</Nav>
|
||||
@@ -292,19 +292,19 @@ const Header = () => {
|
||||
</MobileMenuHeader>
|
||||
|
||||
<MobileNavLink to="/" onClick={handleMenuClose}>
|
||||
🏠首页
|
||||
首页
|
||||
</MobileNavLink>
|
||||
<MobileNavLink to="/60sapi" onClick={handleMenuClose}>
|
||||
📡API聚合应用
|
||||
聚合应用
|
||||
</MobileNavLink>
|
||||
<MobileNavLink to="/smallgame" onClick={handleMenuClose}>
|
||||
🎮玩玩小游戏
|
||||
休闲游戏
|
||||
</MobileNavLink>
|
||||
<MobileNavLink to="/aimodel" onClick={handleMenuClose}>
|
||||
🤖AI工具
|
||||
AI工具
|
||||
</MobileNavLink>
|
||||
<MobileNavLink to="/profile" onClick={handleMenuClose}>
|
||||
👤个人中心
|
||||
个人中心
|
||||
</MobileNavLink>
|
||||
|
||||
{isLoggedIn && user ? (
|
||||
@@ -345,7 +345,7 @@ const Header = () => {
|
||||
</>
|
||||
) : (
|
||||
<MobileNavLink to="/login" onClick={handleMenuClose}>
|
||||
👤 登录注册
|
||||
登录注册
|
||||
</MobileNavLink>
|
||||
)}
|
||||
</MobileMenuContent>
|
||||
|
||||
@@ -79,12 +79,12 @@ const Navigation = () => {
|
||||
{
|
||||
path: '/60sapi',
|
||||
icon: FiActivity,
|
||||
text: 'API聚合应用'
|
||||
text: '聚合应用'
|
||||
},
|
||||
{
|
||||
path: '/smallgame',
|
||||
icon: FiGrid,
|
||||
text: '玩玩小游戏'
|
||||
text: '休闲游戏'
|
||||
},
|
||||
{
|
||||
path: '/aimodel',
|
||||
|
||||
@@ -8,7 +8,7 @@ export const AI_MODEL_APPS = [
|
||||
description: '智能变量命名工具,帮助开发者快速生成规范的变量名',
|
||||
link: '/aimodelapp/AI变量命名助手/index.html',
|
||||
gradient: 'linear-gradient(135deg, #4ade80 0%, #22c55e 100%)',
|
||||
icon: '🤖',
|
||||
icon: '💻',
|
||||
IsShow: true
|
||||
},
|
||||
{
|
||||
@@ -40,7 +40,7 @@ export const AI_MODEL_APPS = [
|
||||
description: '基于AI的文章转文言文工具',
|
||||
link: '/aimodelapp/AI文章转文言文/index.html',
|
||||
gradient: 'linear-gradient(135deg,rgb(186, 248, 70) 0%,rgb(255, 208, 0) 100%)',
|
||||
icon: '📝',
|
||||
icon: '🖊️',
|
||||
IsShow: true
|
||||
},
|
||||
{
|
||||
@@ -48,7 +48,7 @@ export const AI_MODEL_APPS = [
|
||||
description: '基于AI的生成表情包工具',
|
||||
link: '/aimodelapp/AI生成表情包/index.html',
|
||||
gradient: 'linear-gradient(135deg,rgb(186, 248, 70) 0%,rgb(34, 157, 238) 100%)',
|
||||
icon: '📸',
|
||||
icon: '🫡',
|
||||
IsShow: true
|
||||
},
|
||||
{
|
||||
@@ -61,7 +61,7 @@ export const AI_MODEL_APPS = [
|
||||
},
|
||||
];
|
||||
|
||||
//玩玩小游戏
|
||||
//休闲游戏
|
||||
export const SMALL_GAMES = [
|
||||
{
|
||||
title: '2048',
|
||||
@@ -105,7 +105,7 @@ export const SMALL_GAMES = [
|
||||
},
|
||||
];
|
||||
|
||||
//API聚合应用
|
||||
//聚合应用
|
||||
export const API_60S_CATEGORIES = [
|
||||
{
|
||||
title: '热搜榜单',
|
||||
@@ -146,7 +146,7 @@ export const API_60S_CATEGORIES = [
|
||||
{ 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: 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 },
|
||||
@@ -165,7 +165,7 @@ export const API_60S_CATEGORIES = [
|
||||
color: '#f7b731',
|
||||
apis: [
|
||||
{ title: '随机唱歌音频', link: '/60sapi/娱乐消遣/随机唱歌音频/index.html', icon: '🎤', IsShow: true },
|
||||
{ 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 },
|
||||
|
||||
@@ -330,14 +330,14 @@ const AiModelPage = () => {
|
||||
AI工具
|
||||
</PageTitle>
|
||||
<PageDescription>
|
||||
AI大模型工具,提供一些小功能
|
||||
<strong>AI大模型工具,提供一些生成式大语言模型的小功能(´,,•ω•,,)♡</strong>
|
||||
</PageDescription>
|
||||
</PageHeader>
|
||||
|
||||
{!isLoggedIn ? (
|
||||
<LoginPrompt>
|
||||
<LoginIcon>🔒</LoginIcon>
|
||||
<LoginTitle>需要登录访问</LoginTitle>
|
||||
<LoginTitle>需要登录访问Σ(°ロ°)</LoginTitle>
|
||||
<LoginText>
|
||||
AI模型功能需要登录后才能使用,请先登录您的账户。
|
||||
<br />
|
||||
@@ -434,7 +434,7 @@ const AiModelPage = () => {
|
||||
萌芽币消费提示
|
||||
</h3>
|
||||
<p style={{ lineHeight: '1.6', color: '#374151' }}>
|
||||
每次使用AI功能将消耗<b>100萌芽币</b>,无论成功与否。当萌芽币余额不足时,无法使用AI功能。
|
||||
每次使用AI功能将消耗<b>100萌芽币</b>,无论成功与否。当萌芽币余额不足时,无法使用AI工具功能。
|
||||
</p>
|
||||
<p style={{ lineHeight: '1.6', color: '#374151' }}>
|
||||
您可以通过<b>每日签到</b>获得300萌芽币。详细的萌芽币余额和使用记录将显示在各AI应用的右上角。
|
||||
|
||||
@@ -3,6 +3,8 @@ import styled from 'styled-components';
|
||||
import { FiExternalLink, FiArrowLeft } from 'react-icons/fi';
|
||||
import { API_60S_CATEGORIES } from '../config/StaticPageConfig';
|
||||
|
||||
|
||||
//================css样式================
|
||||
const Api60sContainer = styled.div`
|
||||
min-height: calc(100vh - 140px);
|
||||
padding: 20px 0;
|
||||
@@ -51,19 +53,29 @@ const CategoryTitle = styled.h2`
|
||||
|
||||
const CategoryGrid = styled.div`
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
|
||||
gap: 12px;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 16px;
|
||||
|
||||
@media (max-width: 768px) {
|
||||
@media (max-width: 1200px) {
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 14px;
|
||||
}
|
||||
|
||||
@media (max-width: 900px) {
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 14px;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 10px;
|
||||
gap: 12px;
|
||||
}
|
||||
`;
|
||||
|
||||
const ApiCard = styled.div`
|
||||
background: rgba(255, 255, 255, 0.98);
|
||||
border-radius: 16px;
|
||||
padding: 16px;
|
||||
padding: 20px 16px;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
transition: all 0.2s ease;
|
||||
@@ -72,10 +84,15 @@ const ApiCard = styled.div`
|
||||
overflow: hidden;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
cursor: pointer;
|
||||
min-height: 80px;
|
||||
min-height: 90px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
@media (max-width: 768px) {
|
||||
padding: 16px 12px;
|
||||
min-height: 80px;
|
||||
}
|
||||
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
@@ -197,6 +214,7 @@ const EmbeddedFrame = styled.iframe`
|
||||
position: relative;
|
||||
z-index: 1000;
|
||||
`;
|
||||
//================css样式================
|
||||
|
||||
const Api60sPage = () => {
|
||||
const [mounted, setMounted] = useState(false);
|
||||
@@ -247,8 +265,10 @@ const Api60sPage = () => {
|
||||
<Api60sContainer>
|
||||
<Container>
|
||||
<Header>
|
||||
<Title>API聚合应用</Title>
|
||||
<Subtitle>提供丰富的实时数据接口,涵盖热搜榜单、日更资讯、实用工具和娱乐功能</Subtitle>
|
||||
<Title>聚合应用</Title>
|
||||
<Subtitle>
|
||||
提供各大社交平台最新的实时数据,让您摆脱平台大数据算法的干扰,走出信息茧房,涵盖热搜榜单、日更资讯、实用工具和娱乐消遣四大板块
|
||||
</Subtitle>
|
||||
</Header>
|
||||
</Container>
|
||||
</Api60sContainer>
|
||||
@@ -259,10 +279,10 @@ const Api60sPage = () => {
|
||||
<Api60sContainer>
|
||||
<Container>
|
||||
<Header>
|
||||
<Title>API聚合应用</Title>
|
||||
<Subtitle>
|
||||
提供丰富的实时数据接口,涵盖热搜榜单、日更资讯、实用工具和娱乐功能
|
||||
</Subtitle>
|
||||
<Title>聚合应用</Title>
|
||||
<Subtitle>
|
||||
<strong>提供各大社交平台最新的实时数据,让您摆脱平台大数据算法的干扰,走出信息茧房,涵盖热搜榜单、日更资讯、实用工具和娱乐消遣四大板块(˘•ω•˘)</strong>
|
||||
</Subtitle>
|
||||
</Header>
|
||||
|
||||
{apiCategories.length === 0 ? (
|
||||
|
||||
@@ -3,6 +3,7 @@ import { Link } from 'react-router-dom';
|
||||
import styled from 'styled-components';
|
||||
import { FiActivity, FiGrid, FiCpu, FiTrendingUp } from 'react-icons/fi';
|
||||
|
||||
//================css样式================
|
||||
const HomeContainer = styled.div`
|
||||
min-height: calc(100vh - 140px);
|
||||
padding: 20px 0;
|
||||
@@ -172,7 +173,7 @@ const ModuleFeature = styled.li`
|
||||
margin-bottom: 0;
|
||||
}
|
||||
`;
|
||||
|
||||
//================css样式================
|
||||
|
||||
|
||||
const HomePage = () => {
|
||||
@@ -181,24 +182,25 @@ const HomePage = () => {
|
||||
{
|
||||
path: '/60sapi',
|
||||
icon: FiActivity,
|
||||
title: 'API聚合应用',
|
||||
description: '实时获取各种热门数据,资讯信息和实用工具',
|
||||
title: '聚合应用',
|
||||
description: '实时获取最新热门数据,资讯和实用工具',
|
||||
features: [
|
||||
'娱乐消遣板块',
|
||||
'实用功能板块',
|
||||
'日更咨询板块',
|
||||
'热搜榜单板块',
|
||||
'🎯娱乐消遣板块',
|
||||
'🔧实用功能板块',
|
||||
'📰日更咨询板块',
|
||||
'🔥热搜榜单板块',
|
||||
]
|
||||
},
|
||||
{
|
||||
path: '/smallgame',
|
||||
icon: FiGrid,
|
||||
title: '玩玩小游戏',
|
||||
title: '休闲游戏',
|
||||
description: '轻松有趣的休闲小游戏合集',
|
||||
features: [
|
||||
'2048',
|
||||
'俄罗斯方块',
|
||||
'别踩白方块',
|
||||
'🔢2048小游戏',
|
||||
'🧩俄罗斯方块',
|
||||
'🐍经典贪吃蛇',
|
||||
'◼️别踩白方块',
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -207,31 +209,37 @@ const HomePage = () => {
|
||||
title: 'AI工具',
|
||||
description: '智能AI工具和模型应用',
|
||||
features: [
|
||||
'AI写诗达人',
|
||||
'AI变量命名小助手',
|
||||
'AI姓名评测',
|
||||
'🌍翻译助手',
|
||||
'📝写诗达人',
|
||||
"🖊️文章转文言文",
|
||||
"🫡表情包制作",
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
//<em> </em>
|
||||
return (
|
||||
<HomeContainer>
|
||||
<HeroSection>
|
||||
<HeroContent>
|
||||
<HeroTitle>
|
||||
<span className="title-emoji">✨</span>
|
||||
神奇万事通
|
||||
万象口袋
|
||||
<span className="title-emoji">✨</span>
|
||||
</HeroTitle>
|
||||
<HeroSubtitle>
|
||||
🎨 一个多功能的聚合软件应用 💬
|
||||
<strong>💡一个跨平台的聚合式应用</strong>
|
||||
<br />
|
||||
提供各种API聚合应用、娱乐小游戏、AI大模型工具等丰富功能,目标是用一个应用解决用户的各种需求。
|
||||
模仿微信小程序那样,用户可以在一个应用中完成多个功能,而不需要下载多个APP
|
||||
集成了热搜榜单,日更资讯、休闲游戏、AI大模型工具等丰富功能。
|
||||
像微信小程序一样,把分散的功能汇聚在一个应用中,让你无需下载一个又一个app。
|
||||
<br />
|
||||
<strong>🎯功能繁多却不显得臃肿</strong>
|
||||
<br />
|
||||
「Windows」端仅约18MB;「Android」端仅约15MB;平均内存占用仅48MB
|
||||
相比市面上的软件更小巧、更轻便,却能承载更多可能。
|
||||
</HeroSubtitle>
|
||||
<HeroButton to="/60sapi">
|
||||
<FiTrendingUp />
|
||||
开始探索
|
||||
开始探索吧( •ω• )♡
|
||||
</HeroButton>
|
||||
</HeroContent>
|
||||
</HeroSection>
|
||||
|
||||
@@ -264,10 +264,10 @@ const SmallGamePage = () => {
|
||||
<Container>
|
||||
<PageHeader>
|
||||
<PageTitle>
|
||||
玩玩小游戏
|
||||
休闲游戏
|
||||
</PageTitle>
|
||||
<PageDescription>
|
||||
轻松有趣的休闲小游戏合集,即点即玩,无需下载
|
||||
<strong>好玩的休闲小游戏合集,即点即玩,无需下载,支持离线游玩(,,・ω・,,)</strong>
|
||||
</PageDescription>
|
||||
</PageHeader>
|
||||
|
||||
|
||||
@@ -7,13 +7,38 @@ import { userAPI } from '../utils/api';
|
||||
|
||||
const ProfileContainer = styled.div`
|
||||
min-height: calc(100vh - 140px);
|
||||
padding: 20px;
|
||||
padding: 20px 0;
|
||||
background: linear-gradient(135deg, rgba(74, 222, 128, 0.05) 0%, rgba(34, 197, 94, 0.05) 100%);
|
||||
`;
|
||||
|
||||
const Container = styled.div`
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: 0 20px;
|
||||
`;
|
||||
|
||||
const PageHeader = styled.div`
|
||||
text-align: center;
|
||||
margin-bottom: 40px;
|
||||
`;
|
||||
|
||||
const PageTitle = styled.h1`
|
||||
color: white;
|
||||
font-size: 32px;
|
||||
font-weight: 700;
|
||||
margin-bottom: 10px;
|
||||
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
|
||||
|
||||
@media (max-width: 768px) {
|
||||
font-size: 24px;
|
||||
}
|
||||
`;
|
||||
|
||||
const PageDescription = styled.p`
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
font-size: 18px;
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
`;
|
||||
|
||||
const ProfileHeader = styled.div`
|
||||
@@ -398,9 +423,15 @@ const UserProfilePage = () => {
|
||||
return (
|
||||
<ProfileContainer>
|
||||
<Container>
|
||||
<PageHeader>
|
||||
<PageTitle>个人中心</PageTitle>
|
||||
<PageDescription>
|
||||
<strong>管理您的个人信息、查看萌芽币余额和签到记录(,,・ω・,,)</strong>
|
||||
</PageDescription>
|
||||
</PageHeader>
|
||||
<LoginPrompt>
|
||||
<LoginIcon>🔒</LoginIcon>
|
||||
<LoginTitle>需要登录访问</LoginTitle>
|
||||
<LoginTitle>需要登录才能访问Σ(°ロ°)</LoginTitle>
|
||||
<LoginText>
|
||||
个人中心需要登录后才能查看,请先登录您的账户。
|
||||
<br />
|
||||
@@ -449,6 +480,10 @@ const UserProfilePage = () => {
|
||||
return (
|
||||
<ProfileContainer>
|
||||
<Container>
|
||||
<PageHeader>
|
||||
<PageTitle>个人中心</PageTitle>
|
||||
<PageDescription>管理您的个人信息、查看萌芽币余额和签到记录</PageDescription>
|
||||
</PageHeader>
|
||||
<ProfileHeader>
|
||||
<Avatar>
|
||||
{qqAvatarUrl && !avatarError ? (
|
||||
|
||||
@@ -22,6 +22,24 @@ body {
|
||||
color: #333;
|
||||
background: #f5f7fa;
|
||||
overflow-x: hidden;
|
||||
/* 隐藏滚动条但保持滚动功能 */
|
||||
scrollbar-width: none; /* Firefox */
|
||||
-ms-overflow-style: none; /* IE and Edge */
|
||||
}
|
||||
|
||||
/* 隐藏 Webkit 浏览器的滚动条 */
|
||||
body::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* 全局隐藏所有元素的滚动条 */
|
||||
* {
|
||||
scrollbar-width: none; /* Firefox */
|
||||
-ms-overflow-style: none; /* IE and Edge */
|
||||
}
|
||||
|
||||
*::-webkit-scrollbar {
|
||||
display: none; /* Chrome, Safari, Opera */
|
||||
}
|
||||
|
||||
/* 移动端适配 */
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# ✨ InfoGenie 神奇万事通
|
||||
# ✨ InfoGenie 万象口袋
|
||||
|
||||
> 🎨 一个多功能的聚合软件应用 💬
|
||||
|
||||
@@ -278,7 +278,7 @@ npm start
|
||||
|
||||
## 📞 联系方式
|
||||
|
||||
- **开发者**: 神奇万事通
|
||||
- **开发者**: 万象口袋
|
||||
- **项目地址**: https://github.com/shumengya/InfoGenie
|
||||
- **演示地址**: https://infogenie.shumengya.top
|
||||
- **API地址**: https://infogenie.api.shumengya.top
|
||||
@@ -293,7 +293,7 @@ npm start
|
||||
|
||||
<div align="center">
|
||||
|
||||
**✨ 感谢使用 InfoGenie 神奇万事通 ✨**
|
||||
**✨ 感谢使用 InfoGenie 万象口袋 ✨**
|
||||
|
||||
🎨 *一个多功能的聚合软件应用* 💬
|
||||
|
||||
|
||||
303
项目架构说明.md
Normal file
303
项目架构说明.md
Normal file
@@ -0,0 +1,303 @@
|
||||
# ✨ InfoGenie 万象口袋
|
||||
|
||||
> 🎨 一个多功能的聚合软件应用 💬
|
||||
|
||||
## 📋 项目概述
|
||||
|
||||
InfoGenie 是一个前后端分离的多功能聚合应用,提供实时数据接口、休闲游戏、AI工具等丰富功能。
|
||||
|
||||
### 🌐 部署环境
|
||||
|
||||
- **前端部署地址**: https://infogenie.shumengya.top
|
||||
- **后端部署地址**: https://infogenie.api.shumengya.top
|
||||
|
||||
### 🏗️ 技术架构
|
||||
|
||||
#### 前端技术栈
|
||||
- **核心框架**: React 18.2.0 + React Router DOM 6.15.0
|
||||
- **样式方案**: Styled Components 6.0.7 (CSS-in-JS)
|
||||
- **HTTP客户端**: Axios 1.5.0
|
||||
- **UI组件**: React Icons 4.11.0 + React Hot Toast 2.4.1
|
||||
- **状态管理**: React Context API
|
||||
- **构建工具**: Create React App
|
||||
- **PWA支持**: Service Worker
|
||||
|
||||
#### 后端技术栈
|
||||
- **Web框架**: Flask 2.3.3 (轻量、灵活、可扩展)
|
||||
- **数据库**: MongoDB + PyMongo 4.5.0 (文档型数据存储)
|
||||
- **认证机制**: JWT Token (PyJWT 2.8.0,7天有效期)
|
||||
- **密码安全**: Werkzeug 2.3.7 (高强度密码哈希)
|
||||
- **跨域支持**: Flask-CORS 4.0.0
|
||||
- **API限流**: Flask-Limiter 3.5.0 (防止API滥用)
|
||||
- **环境配置**: python-dotenv 1.0.0
|
||||
- **邮件服务**: 基于SMTP协议的原生实现
|
||||
|
||||
#### 架构特点
|
||||
- **前后端分离**: RESTful API架构,无状态通信
|
||||
- **混合架构**: React SPA + 静态HTML页面无缝集成
|
||||
- **模块化设计**: Flask蓝图 + React组件化
|
||||
- **容器化部署**: Docker + docker-compose支持
|
||||
- **多环境配置**: 开发/测试/生产环境分离
|
||||
|
||||
### 🌟 主要功能
|
||||
|
||||
#### 📡 60s API 模块
|
||||
- **热搜榜单**: 抖音、微博、猫眼票房、头条、网易云、知乎、HackerNews等实时热搜
|
||||
- **日更资讯**: 60秒读懂世界、必应每日壁纸、历史上的今天、每日国际汇率
|
||||
- **实用功能**: 百度百科词条、公网IP地址、哈希解压压缩、链接OG信息、农历信息、生成二维码、天气预报、EpicGames免费游戏
|
||||
- **娱乐消遣**: 随机唱歌音频、随机发病文学、随机搞笑段子、随机冷笑话、随机一言、随机运势、随机JavaScript趣味题、随机KFC文案
|
||||
|
||||
#### 🎮 小游戏模块
|
||||
- 2048游戏
|
||||
- 别踩白方块
|
||||
- 俄罗斯方块
|
||||
- 移动端优化
|
||||
- 即点即玩
|
||||
|
||||
#### 🤖 AI模型模块
|
||||
- **AI变量命名助手**: 智能生成编程变量名
|
||||
- **AI写诗小助手**: 基于主题创作诗歌
|
||||
- **AI姓名评测**: 姓名寓意分析和评分
|
||||
- **萌芽币消费系统**: 每次AI调用消耗100萌芽币
|
||||
- **多模型支持**: 集成DeepSeek、Kimi等AI服务
|
||||
- **需要登录验证**: JWT Token认证
|
||||
|
||||
#### 👤 用户系统
|
||||
- **邮箱验证注册**: QQ邮箱验证码注册登录
|
||||
- **用户资料管理**: 头像、用户名等个人信息
|
||||
- **签到系统**: 每日签到获取经验值和萌芽币
|
||||
- **等级系统**: 基于经验值的用户等级计算
|
||||
- **萌芽币管理**: 虚拟货币系统,用于AI功能消费
|
||||
- **使用统计**: AI调用次数和萌芽币消费记录
|
||||
|
||||
## 🏛️ 架构设计亮点
|
||||
|
||||
### 🔄 混合架构创新
|
||||
- **React SPA核心层**: 处理用户认证、全局状态管理和主要导航逻辑
|
||||
- **静态HTML模块**: 大量功能模块使用原生HTML/CSS/JS实现,降低加载时间
|
||||
- **通信机制**: 通过postMessage API实现SPA与静态页面的数据交换
|
||||
|
||||
### 🧩 模块化设计
|
||||
- **前端组件化**: 基于React的原子设计系统,从原子级别到页面级别
|
||||
- **后端蓝图架构**: Flask蓝图实现功能模块解耦,提高可维护性
|
||||
- **装饰器模式**: 横切关注点(认证、萌芽币消费)集中处理
|
||||
|
||||
### 🔒 安全与性能
|
||||
- **多层次认证**: JWT Token + 邮箱验证码双因素认证
|
||||
- **API限流保护**: 防止暴力攻击和资源耗尽
|
||||
- **性能优化**: 代码分割、懒加载、PWA缓存策略
|
||||
- **数据安全**: 密码哈希存储、敏感配置外部化
|
||||
|
||||
### 🚀 部署与扩展
|
||||
- **容器化部署**: Docker + docker-compose支持
|
||||
- **多环境配置**: 开发/测试/生产环境分离
|
||||
- **微服务友好**: 模块化设计便于未来微服务拆分
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 📋 环境要求
|
||||
|
||||
- **Python**: 3.8+
|
||||
- **Node.js**: 14+
|
||||
- **MongoDB**: 4.0+
|
||||
- **npm**: 6.0+
|
||||
|
||||
### 📦 安装依赖
|
||||
|
||||
#### 后端依赖
|
||||
```bash
|
||||
cd InfoGenie-backend
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
#### 前端依赖
|
||||
```bash
|
||||
cd InfoGenie-frontend
|
||||
npm install
|
||||
```
|
||||
|
||||
主要依赖包:
|
||||
- React 18.2.0
|
||||
- React Router DOM 6.15.0
|
||||
- Styled Components 6.0.7
|
||||
- Axios 1.5.0
|
||||
- React Hot Toast 2.4.1
|
||||
- React Icons 4.11.0
|
||||
|
||||
### 🖥️ 前端部署
|
||||
|
||||
1. 进入前端目录:`cd InfoGenie-frontend`
|
||||
2. 安装依赖:`npm install`
|
||||
3. 构建生产环境应用:`npm run build`
|
||||
4. 将 `build` 目录下的所有文件上传到前端服务器的网站根目录
|
||||
|
||||
也可以直接运行 `InfoGenie-frontend/build_frontend.bat` 脚本进行构建。
|
||||
|
||||
### ⚙️ 后端部署
|
||||
|
||||
#### 方式一:传统部署
|
||||
1. 进入后端目录:`cd InfoGenie-backend`
|
||||
2. 安装依赖:`pip install -r requirements.txt`
|
||||
3. 配置环境变量或创建 `.env` 文件:
|
||||
```env
|
||||
# 数据库配置
|
||||
MONGO_URI=mongodb://localhost:27017/infogenie
|
||||
|
||||
# 邮件服务配置
|
||||
MAIL_USERNAME=your_email@qq.com
|
||||
MAIL_PASSWORD=your_email_auth_code
|
||||
MAIL_SERVER=smtp.qq.com
|
||||
MAIL_PORT=587
|
||||
|
||||
# 应用配置
|
||||
SECRET_KEY=your_secret_key_here
|
||||
SESSION_COOKIE_SECURE=True
|
||||
FLASK_ENV=production
|
||||
|
||||
# AI服务配置
|
||||
DEEPSEEK_API_KEY=your_deepseek_api_key
|
||||
KIMI_API_KEY=your_kimi_api_key
|
||||
```
|
||||
4. 使用 Gunicorn 启动应用:
|
||||
```bash
|
||||
gunicorn -w 4 -b 0.0.0.0:5000 "app:create_app()"
|
||||
```
|
||||
|
||||
#### 方式二:Docker部署(推荐)
|
||||
1. 进入后端目录:`cd InfoGenie-backend`
|
||||
2. 构建Docker镜像:
|
||||
```bash
|
||||
docker build -t infogenie-backend .
|
||||
```
|
||||
3. 使用docker-compose启动:
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
4. 或者直接运行构建脚本:
|
||||
```bash
|
||||
./build_docker.sh # Linux/Mac
|
||||
# 或
|
||||
build_docker.bat # Windows
|
||||
```
|
||||
|
||||
#### 环境配置说明
|
||||
- **开发环境**: 使用 `.env` 文件配置本地开发环境
|
||||
- **生产环境**: 使用 `.env.production` 文件或环境变量注入
|
||||
- **反向代理**: 配置Nginx将 `https://infogenie.api.shumengya.top` 反向代理到后端服务
|
||||
|
||||
### ⚙️ 配置说明
|
||||
|
||||
#### 前端配置
|
||||
|
||||
前端通过环境变量配置API基础URL:
|
||||
|
||||
- 开发环境:`.env.development` 文件中设置 `REACT_APP_API_URL=http://localhost:5000`
|
||||
- 生产环境:`.env.production` 文件中设置 `REACT_APP_API_URL=https://infogenie.api.shumengya.top`
|
||||
|
||||
#### 后端配置
|
||||
|
||||
后端通过 `config.py` 和环境变量进行配置:
|
||||
|
||||
- MongoDB连接:通过环境变量 `MONGO_URI` 设置
|
||||
- 邮件服务:通过环境变量 `MAIL_USERNAME` 和 `MAIL_PASSWORD` 设置(支持QQ邮箱)
|
||||
- 认证配置:支持QQ邮箱验证登录
|
||||
- CORS配置:在 `app.py` 中配置允许的前端域名
|
||||
|
||||
#### 60sAPI配置
|
||||
|
||||
60sAPI模块的静态文件位于 `frontend/60sapi` 目录,通过后端的静态文件服务提供访问。
|
||||
|
||||
各API模块的接口地址已配置为 `https://infogenie.api.shumengya.top/api/60s`。
|
||||
|
||||
#### 项目结构
|
||||
|
||||
```
|
||||
InfoGenie/
|
||||
├── InfoGenie-backend/ # 后端Python Flask应用
|
||||
│ ├── app.py # 主应用入口
|
||||
│ ├── config.py # 配置文件
|
||||
│ ├── requirements.txt # Python依赖
|
||||
│ ├── Dockerfile # Docker构建文件
|
||||
│ ├── docker-compose.yml # Docker编排文件
|
||||
│ ├── .env # 环境变量配置
|
||||
│ ├── modules/ # 功能模块
|
||||
│ │ ├── auth.py # 用户认证
|
||||
│ │ ├── user_management.py # 用户管理
|
||||
│ │ ├── email_service.py # 邮件服务
|
||||
│ │ └── aimodelapp.py # AI模型应用
|
||||
│ ├── test/ # 测试文件
|
||||
│ └── 后端架构文档.md # 后端架构文档
|
||||
├── InfoGenie-frontend/ # 前端应用
|
||||
│ ├── src/ # React源码
|
||||
│ │ ├── components/ # 公共组件
|
||||
│ │ ├── pages/ # 页面组件
|
||||
│ │ ├── contexts/ # React Context
|
||||
│ │ ├── utils/ # 工具函数
|
||||
│ │ └── styles/ # 全局样式
|
||||
│ ├── public/ # 静态资源
|
||||
│ │ ├── 60sapi/ # 60s API静态页面
|
||||
│ │ ├── aimodelapp/ # AI模型应用页面
|
||||
│ │ └── smallgame/ # 小游戏页面
|
||||
│ ├── package.json # 前端依赖
|
||||
│ ├── setting.json # 前端配置
|
||||
│ └── 前端架构文档.md # 前端架构文档
|
||||
├── README.md # 项目说明
|
||||
├── LICENSE # 许可证
|
||||
└── 项目架构说明.txt # 项目架构说明
|
||||
```
|
||||
|
||||
#### 前端依赖
|
||||
```bash
|
||||
cd frontend/react-app
|
||||
npm install
|
||||
```
|
||||
|
||||
### 🎯 启动服务
|
||||
|
||||
#### 方式一:使用启动器(推荐)
|
||||
```bash
|
||||
# 双击运行 启动器.bat
|
||||
# 选择相应的启动选项
|
||||
```
|
||||
|
||||
#### 方式二:手动启动
|
||||
|
||||
**启动后端服务**
|
||||
```bash
|
||||
cd InfoGenie-backend
|
||||
python app.py
|
||||
# 后端服务: http://localhost:5002
|
||||
```
|
||||
|
||||
**启动前端服务**
|
||||
```bash
|
||||
cd InfoGenie-frontend
|
||||
npm start
|
||||
# 前端服务: http://localhost:3000
|
||||
```
|
||||
|
||||
## 📞 联系方式
|
||||
|
||||
- **开发者**: 万象口袋
|
||||
- **项目地址**: https://github.com/shumengya/InfoGenie
|
||||
- **演示地址**: https://infogenie.shumengya.top
|
||||
- **API地址**: https://infogenie.api.shumengya.top
|
||||
- **反馈邮箱**: 请通过GitHub Issues反馈
|
||||
- **ICP备案**: 蜀ICP备2025151694号
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
|
||||
**✨ 感谢使用 InfoGenie 万象口袋 ✨**
|
||||
|
||||
🎨 *一个多功能的聚合软件应用* 💬
|
||||
|
||||
*支持Web、Windows、Android多平台*
|
||||
|
||||
</div>
|
||||
|
||||
10
项目架构说明.txt
10
项目架构说明.txt
@@ -1,10 +0,0 @@
|
||||
1.一个前后端分离的网站项目,前端使用React框架,后端使用Python3.13.2的Flask框架,采用模块化架构避免单个文件过大
|
||||
前端代码放在frontend文件夹,后端代码放在backend文件夹,确保代码结构清晰有少量中文注释,便于后期扩展维护
|
||||
2.前端网页要适配手机竖屏端和电脑端,主要先适配手机端用户体验
|
||||
3.后端目前需要一个连接MongoDB数据库来储存用户登录数据,
|
||||
用户数据储存在MongoDB的InfoGenie数据库的userdata集合中 玩家数据库储存模板在玩家数据模板.json文件里
|
||||
|
||||
软件app前端分三个主要模块
|
||||
60sapi模块:为静态页面,又分四个子模块:热搜榜单,日更资讯,实用功能,娱乐消遣
|
||||
smallgame模块:为静态页面
|
||||
aimodelapp模块: 为静态页面 (需要登录验证才能进入使用)(暂时不弄)
|
||||
Reference in New Issue
Block a user