初始提交:菲西尔智能官网 Landing Page - 黑白电影级风格

- Hero 首屏:视频背景 + 主标题
- 场景洞察:6大痛点 + 破局之道(桌面六宫格/移动端全屏沉浸)
- 解决路径:智能叠加五步落地
- 核心服务:AI+物业、AI+资管、AI+CRM
- GEO 生成式引擎优化
- 合作咨询表单
- 移动端响应式布局:竖排/横排切换、滚动动画、背景网格
This commit is contained in:
Omega 2026-04-20 17:13:48 +08:00
parent 4f26ed9f4c
commit b816b85f93
16 changed files with 1241 additions and 0 deletions

40
STATUS.md Normal file
View File

@ -0,0 +1,40 @@
# Landing Page 工作状态
## 项目信息
- 文件路径:/opt/ai-landing/index.html
- 访问地址http://8.153.107.96/ai/
- Nginx 配置:/etc/nginx/sites-available/gitea (location /ai/ alias /opt/ai-landing/)
## 当前进度 (2026-04-20 更新)
### 已完成
- Hero 首屏:视频背景 + 主标题"为现有系统装上大脑"
- 场景洞察板块(原"痛点"6 个痛点卡片 + 破局之道
- 数据沉睡、孤岛效应、人力瓶颈、决策滞后、改造成本高、经验依赖
- 桌面端:六宫格 + hover 光线效果
- 移动端:全屏逐屏浮现 + 居中图标 + 大字标题 + 背景网格
- 解决路径板块(原"思路"):五步落地
- 无缝接入、数据唤醒、流程自动化、统一智能中枢、渐进式落地
- 核心服务板块AI+物业、AI+资管、AI+CRM带图片
- GEO 板块:生成式引擎优化
- 合作咨询板块:表单提交 → /ai/api/consult
- 导航栏文字:场景洞察 解决路径 核心服务 GEO 合作咨询
### 待处理
1. 移动端 icon 和背景显示问题(用户反馈:移动端缺少 icon 和背景)
2. 同步到 Gitea 仓库(尚未创建对应 repo
3. 用户强调:每次新会话必须先读此文件,了解当前工作状态
### 用户偏好(重要)
- 回复格式:纯文本,字号统一且小,禁止使用标题(#)、加粗(**)、代码块(```)
- 用户希望被称为"老板"
- Landing Page 素材:禁止外国人面孔,优先抽象矢量图/SVG
- 设计风格:黑白单色、高对比、电影级动效(缓慢平滑有呼吸感)
- 用户会发手机截图反馈问题,需根据截图调整
## Gitea 信息
- 地址http://localhost:3000 / http://8.153.107.96:3000
- SSH 端口2222
- 管理员root, omega_admin, ether
- 已有仓库ether/ether-admin, ether/ether-docs, ether/ether-pms
- Landing Page 仓库:尚未创建(计划创建 ether/ether-landing 或 ether/fischer-site

BIN
assets/crm.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

BIN
assets/geo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

BIN
assets/hero-bg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

114
assets/hero-brain.svg Normal file
View File

@ -0,0 +1,114 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice">
<defs>
<radialGradient id="glow" cx="50%" cy="45%" r="55%">
<stop offset="0%" stop-color="#1a1a1a"/>
<stop offset="100%" stop-color="#050505"/>
</radialGradient>
<filter id="glowBright" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="6" result="blur"/>
<feMerge>
<feMergeNode in="blur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
<filter id="glowSoft" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="3" result="blur"/>
<feMerge>
<feMergeNode in="blur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</defs>
<rect width="1920" height="1080" fill="url(#glow)"/>
<!-- 大脑轮廓 - 最亮层级 -->
<g stroke="#ffffff" stroke-width="2.5" fill="none" opacity="0.95" filter="url(#glowBright)">
<path d="M720,300 Q680,280 640,300 Q600,330 590,380 Q570,440 590,500 Q610,560 650,600 Q690,640 740,660 Q790,680 840,670 Q890,660 930,630 Q970,600 990,560 Q1010,520 1000,470 Q990,420 970,370 Q950,320 910,290 Q870,260 820,260 Q770,260 720,300Z"/>
<path d="M810,280 Q800,400 810,520 Q820,600 800,660"/>
</g>
<!-- 大脑褶皱 - 次亮层级 -->
<g stroke="#cccccc" stroke-width="1.5" fill="none" opacity="0.7">
<path d="M640,350 Q700,340 760,360"/>
<path d="M620,400 Q680,380 740,400 Q800,420 850,400"/>
<path d="M600,450 Q660,430 720,450 Q780,470 840,440"/>
<path d="M610,500 Q670,480 730,500 Q790,520 850,490"/>
<path d="M630,550 Q690,530 750,550 Q810,570 870,540"/>
<path d="M660,600 Q720,580 780,600 Q840,620 890,590"/>
<path d="M800,310 Q860,300 920,320"/>
<path d="M820,360 Q880,340 940,360"/>
<path d="M840,410 Q900,390 960,410"/>
<path d="M830,460 Q890,440 950,460"/>
<path d="M810,510 Q870,490 930,510"/>
<path d="M790,560 Q850,540 910,560"/>
</g>
<!-- 神经网络连线 - 中等亮度 -->
<g stroke="#888888" stroke-width="1" opacity="0.6">
<line x1="700" y1="380" x2="780" y2="340"/>
<line x1="780" y1="340" x2="860" y2="370"/>
<line x1="860" y1="370" x2="920" y2="330"/>
<line x1="920" y1="330" x2="940" y2="420"/>
<line x1="700" y1="380" x2="660" y2="450"/>
<line x1="660" y1="450" x2="720" y2="480"/>
<line x1="720" y1="480" x2="800" y2="460"/>
<line x1="800" y1="460" x2="860" y2="370"/>
<line x1="800" y1="460" x2="920" y2="330"/>
<line x1="720" y1="480" x2="680" y2="540"/>
<line x1="680" y1="540" x2="760" y2="580"/>
<line x1="760" y1="580" x2="840" y2="550"/>
<line x1="840" y1="550" x2="900" y2="480"/>
<line x1="800" y1="460" x2="900" y2="480"/>
<line x1="780" y1="340" x2="860" y2="420"/>
<line x1="860" y1="420" x2="940" y2="420"/>
<line x1="860" y1="420" x2="840" y2="550"/>
<line x1="900" y1="480" x2="940" y2="420"/>
<line x1="660" y1="450" x2="680" y2="540"/>
<line x1="760" y1="580" x2="780" y2="630"/>
<line x1="840" y1="550" x2="820" y2="630"/>
<!-- 外部发散虚线 - 最暗 -->
<line x1="620" y1="350" x2="700" y2="380" stroke-dasharray="8,5" stroke="#555"/>
<line x1="580" y1="480" x2="660" y2="450" stroke-dasharray="8,5" stroke="#555"/>
<line x1="620" y1="600" x2="680" y2="540" stroke-dasharray="8,5" stroke="#555"/>
<line x1="700" y1="680" x2="760" y2="580" stroke-dasharray="8,5" stroke="#555"/>
<line x1="960" y1="350" x2="920" y2="330" stroke-dasharray="8,5" stroke="#555"/>
<line x1="1000" y1="450" x2="940" y2="420" stroke-dasharray="8,5" stroke="#555"/>
<line x1="980" y1="560" x2="900" y2="480" stroke-dasharray="8,5" stroke="#555"/>
</g>
<!-- 节点 - 分层 -->
<g fill="#ffffff" opacity="0.9" filter="url(#glowSoft)">
<circle cx="860" cy="370" r="7"/>
<circle cx="720" cy="480" r="8"/>
<circle cx="760" cy="580" r="6"/>
</g>
<g fill="#cccccc" opacity="0.8">
<circle cx="700" cy="380" r="5"/>
<circle cx="780" cy="340" r="4"/>
<circle cx="920" cy="330" r="4"/>
<circle cx="940" cy="420" r="5"/>
<circle cx="660" cy="450" r="5"/>
<circle cx="800" cy="460" r="5"/>
<circle cx="680" cy="540" r="4"/>
<circle cx="840" cy="550" r="5"/>
<circle cx="900" cy="480" r="4"/>
<circle cx="860" cy="420" r="4"/>
<circle cx="780" cy="630" r="4"/>
<circle cx="820" cy="630" r="4"/>
</g>
<!-- 外部小节点 -->
<g fill="#666666" opacity="0.6">
<circle cx="620" cy="350" r="3"/>
<circle cx="580" cy="480" r="3"/>
<circle cx="620" cy="600" r="3"/>
<circle cx="700" cy="680" r="3"/>
<circle cx="960" cy="350" r="3"/>
<circle cx="1000" cy="450" r="3"/>
<circle cx="980" cy="560" r="3"/>
</g>
<!-- 光晕圆环 -->
<circle cx="720" cy="480" r="200" fill="none" stroke="#ffffff" stroke-width="0.8" opacity="0.15"/>
<circle cx="720" cy="480" r="280" fill="none" stroke="#ffffff" stroke-width="0.5" opacity="0.08"/>
<circle cx="860" cy="370" r="160" fill="none" stroke="#cccccc" stroke-width="0.8" opacity="0.12"/>
</svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
assets/hero-poster.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

BIN
assets/hero.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 KiB

BIN
assets/prop.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

BIN
assets/server.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
assets/video/hero-bg-1.mp4 Normal file

Binary file not shown.

Binary file not shown.

BIN
assets/video/hero-bg-2.mp4 Normal file

Binary file not shown.

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message></Error>

Binary file not shown.

111
consult-api.py Normal file
View File

@ -0,0 +1,111 @@
#!/usr/bin/env python3
"""轻量表单接收服务 - 收到咨询后推送飞书通知"""
import json, os, re
from http.server import HTTPServer, BaseHTTPRequestHandler
from datetime import datetime
# 飞书机器人 Webhook URL请老板替换为实际地址
FEISHU_WEBHOOK = os.getenv("FEISHU_WEBHOOK_URL", "")
# 本地存储路径
DATA_DIR = "/opt/ai-landing/data"
os.makedirs(DATA_DIR, exist_ok=True)
class Handler(BaseHTTPRequestHandler):
def do_POST(self):
if self.path != "/api/consult":
self._send(404, {"error": "not found"})
return
length = int(self.headers.get("Content-Length", 0))
if length > 50000:
self._send(400, {"error": "payload too large"})
return
body = self.rfile.read(length)
try:
data = json.loads(body)
except Exception:
self._send(400, {"error": "invalid json"})
return
# 验证必填字段
name = data.get("name", "").strip()
phone = data.get("phone", "").strip()
email = data.get("email", "").strip()
message = data.get("message", "").strip()
if not name or not phone:
self._send(400, {"error": "姓名和电话为必填项"})
return
# 手机号简单校验
if not re.match(r"^1\d{10}$", phone):
self._send(400, {"error": "手机号格式不正确"})
return
# 保存到本地
record = {
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"name": name, "phone": phone, "email": email, "message": message
}
self._save(record)
# 推送飞书
if FEISHU_WEBHOOK:
self._push_feishu(record)
self._send(200, {"success": True})
def do_GET(self):
if self.path == "/api/consult/health":
self._send(200, {"ok": True})
return
self._send(405, {"error": "method not allowed"})
def _save(self, record):
path = os.path.join(DATA_DIR, f"{datetime.now().strftime('%Y-%m')}.json")
records = []
if os.path.exists(path):
with open(path) as f:
try: records = json.load(f)
except: records = []
records.append(record)
with open(path, "w") as f:
json.dump(records, f, ensure_ascii=False, indent=2)
def _push_feishu(self, record):
try:
import urllib.request
msg = f"**新咨询收到**\n"
msg += f"姓名:{record['name']}\n"
msg += f"电话:{record['phone']}\n"
if record['email']: msg += f"邮箱:{record['email']}\n"
if record['message']: msg += f"留言:{record['message']}\n"
msg += f"时间:{record['time']}"
payload = json.dumps({"msg_type": "interactive", "card": {
"header": {"title": {"tag": "plain_text", "content": "🔔 官网新咨询"}, "template": "turquoise"},
"elements": [{"tag": "markdown", "content": msg}]
}}).encode()
req = urllib.request.Request(FEISHU_WEBHOOK, data=payload,
headers={"Content-Type": "application/json"})
urllib.request.urlopen(req, timeout=5)
except Exception as e:
print(f"飞书推送失败: {e}")
def _send(self, code, data):
self.send_response(code)
self.send_header("Content-Type", "application/json")
self.send_header("Access-Control-Allow-Origin", "*")
self.send_header("Access-Control-Allow-Methods", "POST, OPTIONS")
self.send_header("Access-Control-Allow-Headers", "Content-Type")
self.end_headers()
self.wfile.write(json.dumps(data).encode())
def log_message(self, fmt, *args):
pass # 静默日志
if __name__ == "__main__":
server = HTTPServer(("127.0.0.1", 4001), Handler)
print("咨询接收服务启动在 :4001")
server.serve_forever()

974
index.html Normal file
View File

@ -0,0 +1,974 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>菲西尔智能 · AI+物业AI+资管AI+CRM 企业级智能叠加</title>
<meta name="description" content="上海菲西尔智能科技有限公司——专注为现有业务系统叠加AI能力。智慧物业智能中枢、房产资管风控大脑、CRM效率跃升、GEO生成式引擎优化。不推倒重来只做智能叠加。">
<meta name="keywords" content="AI+物业,智慧物业,AI+资管,房产资产管理,AI+CRM,智能叠加,企业级AI,GEO优化,生成式引擎优化,上海菲西尔">
<meta name="robots" content="index, follow">
<link rel="canonical" href="http://8.153.107.96/ai/">
<!-- Open Graph -->
<meta property="og:type" content="website">
<meta property="og:title" content="菲西尔智能 · 企业级 AI 叠加">
<meta property="og:description" content="在已经运转良好的业务系统之上叠加 AI 能力。不推倒重来,只做智能叠加。">
<meta property="og:url" content="http://8.153.107.96/ai/">
<meta property="og:site_name" content="菲西尔智能 Fischer Intelligence">
<meta property="og:locale" content="zh_CN">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="菲西尔智能 · 企业级 AI 叠加">
<meta name="twitter:description" content="在已经运转良好的业务系统之上叠加 AI 能力。">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "上海菲西尔智能科技有限公司",
"alternateName": "Fischer Intelligence",
"url": "http://8.153.107.96/ai/",
"description": "专注为现有业务系统叠加AI能力涵盖智慧物业、房产资管、CRM领域",
"address": {
"@type": "PostalAddress",
"addressLocality": "上海",
"addressCountry": "CN"
},
"knowsAbout": ["AI+物业", "智慧物业", "AI+资管", "房产资产管理", "AI+CRM", "GEO优化"]
}
</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;800&family=Noto+Sans+SC:wght@400;600;800;900&display=swap" rel="stylesheet">
<style>
:root {
--bg: #050505;
--text-main: #ffffff;
--text-sub: #999999;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
font-family: 'Inter', 'Noto Sans SC', sans-serif;
background: var(--bg);
color: var(--text-main);
line-height: 1.5;
overflow-x: hidden;
}
/* 导航 */
nav {
position: fixed; top: 0; width: 100%; z-index: 100;
padding: 24px 0; background: rgba(5,5,5,0.85); backdrop-filter: blur(12px);
border-bottom: 1px solid rgba(255,255,255,0.06);
}
.nav-inner { max-width: 1400px; margin: 0 auto; padding: 0 4vw; display: flex; justify-content: space-between; align-items: center; }
.logo { font-size: 15px; font-weight: 700; letter-spacing: 2px; color: #fff; text-transform: uppercase; }
.nav-links a { color: #777; text-decoration: none; font-size: 12px; margin-left: 36px; font-weight: 600; transition: 0.3s; text-transform: uppercase; letter-spacing: 1px; }
.nav-links a:hover { color: #fff; }
/* HERO - 营销视频背景 */
.hero {
position: relative; height: 100vh; width: 100%; overflow: hidden; display: flex; align-items: center; justify-content: center;
}
.hero-video {
position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 0;
filter: brightness(0.85) saturate(1.1);
transform: scale(1.05); /* 留余量给呼吸感缩放 */
animation: heroZoom 20s ease-in-out infinite alternate;
}
@keyframes heroZoom {
from { transform: scale(1.05); }
to { transform: scale(1.12); }
}
/* 视频未加载/移动端降级:静态 poster */
.hero-poster {
position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: -1;
}
/* 极轻的底层渐变,仅保留底部过渡 */
.hero-overlay {
position: absolute; inset: 0;
background: linear-gradient(to bottom, rgba(0,0,0,0.1) 30%, rgba(0,0,0,0.55) 100%);
z-index: 1; pointer-events: none;
}
.hero-content {
position: relative; z-index: 10; text-align: center; max-width: 1000px; padding: 0 20px;
}
h1 {
font-size: clamp(48px, 9vw, 110px);
font-weight: 900; line-height: 1.05; letter-spacing: -3px; margin-bottom: 24px;
text-transform: uppercase;
text-shadow: 0 4px 20px rgba(0,0,0,0.6);
opacity: 0; animation: textReveal 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards 0.2s;
}
.hero-sub {
font-size: clamp(16px, 1.8vw, 22px); font-weight: 400; color: rgba(255,255,255,0.9);
max-width: 700px; margin: 0 auto 48px; line-height: 1.6;
/* 磨砂玻璃效果 */
background: rgba(255,255,255,0.05);
backdrop-filter: blur(20px) saturate(150%);
-webkit-backdrop-filter: blur(20px) saturate(150%);
border: 1px solid rgba(255,255,255,0.08);
border-left: 3px solid rgba(255,255,255,0.4);
border-radius: 8px;
padding: 24px 32px;
opacity: 0; animation: textReveal 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards 0.5s;
text-shadow: 0 2px 8px rgba(0,0,0,0.3);
}
.btn {
display: inline-block; padding: 18px 48px;
background: #fff; color: #000; text-decoration: none; font-size: 14px; font-weight: 700;
border-radius: 0; letter-spacing: 1px; text-transform: uppercase; transition: all 0.3s ease;
opacity: 0; animation: textReveal 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards 0.8s;
}
.btn:hover { transform: translateY(-2px); background: #eee; }
.scroll-indicator {
position: absolute; bottom: 40px; left: 50%; transform: translateX(-50%); z-index: 10;
width: 2px; height: 60px; background: linear-gradient(to bottom, #fff, transparent);
animation: scrollLine 2s infinite;
}
@keyframes scrollLine { 0% { height: 0; opacity: 0; } 50% { height: 60px; opacity: 1; } 100% { height: 60px; opacity: 0; transform: translateY(20px); } }
@keyframes textReveal { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }
/* 通用板块 */
.container { max-width: 1400px; margin: 0 auto; padding: 0 4vw; position: relative; z-index: 2; }
section { padding: 160px 0; background: #050505; border-top: 1px solid rgba(255,255,255,0.06); }
.section-label { font-size: 11px; font-weight: 700; color: #666; letter-spacing: 3px; margin-bottom: 80px; display: block; }
h2 { font-size: clamp(32px, 4vw, 52px); font-weight: 800; line-height: 1.1; margin-bottom: 24px; letter-spacing: -1px; color: #fff; }
/* 痛点板块 */
#pain-points { position: relative; overflow: hidden; }
/* 动态网格背景 */
.pain-grid-bg {
position: absolute; inset: 0; z-index: 0;
background-image:
linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px);
background-size: 80px 80px;
animation: gridMove 30s linear infinite;
}
@keyframes gridMove {
0% { transform: translate(0, 0); }
100% { transform: translate(80px, 80px); }
}
/* 径向光晕 */
.pain-glow {
position: absolute; top: 50%; left: 50%; width: 800px; height: 800px;
transform: translate(-50%, -50%);
background: radial-gradient(circle, rgba(255,255,255,0.03) 0%, transparent 70%);
animation: glowPulse 6s ease-in-out infinite alternate;
z-index: 0;
pointer-events: none;
}
@keyframes glowPulse {
0% { opacity: 0.4; transform: translate(-50%, -50%) scale(0.9); }
100% { opacity: 1; transform: translate(-50%, -50%) scale(1.1); }
}
#pain-points .container { position: relative; z-index: 1; }
.pain-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 2px; }
.pain-item {
background: rgba(255,255,255,0.015);
padding: 48px 40px;
border: 1px solid rgba(255,255,255,0.04);
transition: all 0.6s ease;
position: relative;
overflow: hidden;
min-height: 320px;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
.pain-item::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.15), transparent);
transform: translateX(-100%);
transition: transform 0.8s ease;
}
.pain-item:hover::before { transform: translateX(0); }
.pain-item:hover {
background: rgba(255,255,255,0.03);
border-color: rgba(255,255,255,0.08);
}
/* 顶部 SVG 图标 */
.pain-icon {
position: absolute; top: 32px; left: 40px;
width: 48px; height: 48px;
opacity: 0.15;
transition: opacity 0.5s ease;
}
.pain-item:hover .pain-icon { opacity: 0.35; }
.pain-icon svg { width: 100%; height: 100%; }
.pain-icon svg line, .pain-icon svg path, .pain-icon svg circle, .pain-icon svg rect {
stroke: #fff;
stroke-width: 1.5;
fill: none;
}
/* 编号 */
.pain-num {
font-size: 72px; font-weight: 900; color: rgba(255,255,255,0.04);
line-height: 1; letter-spacing: -3px;
position: absolute; bottom: 32px; right: 40px;
transition: all 0.6s ease;
}
.pain-item:hover .pain-num {
color: rgba(255,255,255,0.08);
transform: translateY(-4px);
}
.pain-item h3 {
font-size: 20px; font-weight: 800; color: #fff; margin-bottom: 12px;
letter-spacing: -0.5px;
}
.pain-item p {
font-size: 14px; color: #666; line-height: 1.7;
}
/* 破局之道 - 全宽特殊卡片 */
.pain-item.highlight {
grid-column: 1 / -1;
min-height: auto;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
gap: 60px;
padding: 64px 80px;
background: rgba(255,255,255,0.03);
border-color: rgba(255,255,255,0.08);
}
.pain-item.highlight h3 {
font-size: 28px; margin-bottom: 8px; margin-left: 0;
}
.pain-item.highlight p {
font-size: 16px; color: #888; margin-left: 0; max-width: 600px;
}
.pain-item.highlight .pain-num {
position: static; font-size: 96px;
}
.pain-item.highlight .highlight-body {
flex: 1; max-width: 600px;
}
/* 思路板块 */
.approach-list { max-width: 900px; margin: 0 auto; }
.approach-item {
display: flex; gap: 40px; padding: 48px 0;
border-bottom: 1px solid rgba(255,255,255,0.06);
align-items: flex-start;
}
.approach-item:last-child { border-bottom: none; }
.approach-step {
font-size: 13px; font-weight: 800; color: #555;
letter-spacing: 2px; text-transform: uppercase;
min-width: 60px; padding-top: 4px;
}
.approach-body h3 {
font-size: 24px; font-weight: 800; color: #fff; margin-bottom: 12px;
letter-spacing: -0.5px;
}
.approach-body p {
font-size: 16px; color: #888; line-height: 1.7; max-width: 600px;
}
/* 业务板块 - 使用本地图片 (修复了路径问题,移除暗黑滤镜) */
.project-row { display: flex; align-items: center; gap: 80px; margin-bottom: 200px; }
.project-row.reverse { flex-direction: row-reverse; }
.project-text { flex: 1; }
.project-text p { font-size: 18px; color: #999; line-height: 1.8; max-width: 550px; margin-top: 20px; }
.project-img {
flex: 1.2; height: 500px; border-radius: 4px; overflow: hidden; position: relative;
background: #111;
}
.project-img img {
width: 100%; height: 100%; object-fit: cover;
/* 移除滤镜,保持清晰明亮 */
filter: brightness(1.0); transition: all 0.6s ease;
}
.project-img:hover img { transform: scale(1.03); }
/* 联系板块 */
.contact-form {
max-width: 600px; margin: 0 auto;
display: grid; grid-template-columns: 1fr 1fr; gap: 20px;
}
.contact-form .full-width { grid-column: 1 / -1; }
.contact-form label {
display: block; font-size: 11px; color: #666; font-weight: 700;
letter-spacing: 2px; text-transform: uppercase; margin-bottom: 8px;
}
.contact-form input, .contact-form textarea {
width: 100%; padding: 16px 20px; background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.1); border-radius: 4px;
color: #fff; font-size: 15px; font-family: inherit;
transition: border-color 0.3s;
}
.contact-form input:focus, .contact-form textarea:focus {
outline: none; border-color: rgba(255,255,255,0.4);
}
.contact-form textarea { min-height: 140px; resize: vertical; }
.contact-form input::placeholder, .contact-form textarea::placeholder {
color: #444;
}
.contact-submit {
grid-column: 1 / -1; text-align: center; margin-top: 12px;
}
.contact-submit button {
padding: 18px 60px; background: #fff; color: #000;
border: none; font-size: 14px; font-weight: 700; letter-spacing: 1px;
text-transform: uppercase; cursor: pointer; transition: all 0.3s;
}
.contact-submit button:hover { background: #eee; transform: translateY(-2px); }
.contact-submit button:disabled { opacity: 0.5; cursor: default; transform: none; }
.form-status {
grid-column: 1 / -1; text-align: center; font-size: 13px;
margin-top: 8px; min-height: 20px;
}
.form-status.ok { color: #4ade80; }
.form-status.err { color: #f87171; }
/* 底部 */
footer { padding: 100px 0; text-align: center; background: #020202; border-top: 1px solid rgba(255,255,255,0.06); }
.tech-by { font-size: 10px; color: #444; letter-spacing: 2px; margin-bottom: 12px; }
.company { font-size: 15px; color: #888; font-weight: 600; }
/* 动效 */
.fade-up { opacity: 0; transform: translateY(40px); transition: all 1s cubic-bezier(0.16, 1, 0.3, 1); }
.fade-up.visible { opacity: 1; transform: translateY(0); }
/* 桌面端:痛点和思路板块用 CSS 原生动画直接可见 */
@media (min-width: 901px) {
#pain-points .fade-up, #approach .fade-up {
opacity: 1; transform: translateY(0);
animation: sectionFadeIn 1.2s cubic-bezier(0.16, 1, 0.3, 1) both;
}
#pain-points .pain-grid > .fade-up:nth-child(1) { animation-delay: 0.15s; }
#pain-points .pain-grid > .fade-up:nth-child(2) { animation-delay: 0.25s; }
#pain-points .pain-grid > .fade-up:nth-child(3) { animation-delay: 0.35s; }
#pain-points .pain-grid > .fade-up:nth-child(4) { animation-delay: 0.45s; }
#pain-points .pain-grid > .fade-up:nth-child(5) { animation-delay: 0.55s; }
#pain-points .pain-grid > .fade-up:nth-child(6) { animation-delay: 0.65s; }
}
@keyframes sectionFadeIn { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }
/* 移动端:痛点和思路板块用 CSS 滚动触发动画 */
@media (max-width: 900px) {
/* 卡片默认微弱可见 */
#pain-points .pain-item {
opacity: 0.08;
}
/* 子元素默认隐藏 */
#pain-points .pain-item .pain-icon,
#pain-points .pain-item h3,
#pain-points .pain-item p,
#pain-points .pain-item .pain-num {
opacity: 0;
}
/* 进入视口后 */
#pain-points .pain-item.in-view {
opacity: 1;
}
#pain-points .pain-item.in-view .pain-icon {
animation: iconPop 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.1s both;
}
#pain-points .pain-item.in-view h3 {
animation: titleSlide 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.15s both;
}
#pain-points .pain-item.in-view p {
animation: textSlide 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.3s both;
}
#pain-points .pain-item.in-view .pain-num {
animation: numReveal 1.2s ease 0.5s both;
}
/* 思路板块同样 */
#approach .approach-item {
opacity: 0.08;
}
#approach .approach-item .approach-step,
#approach .approach-item .approach-body h3,
#approach .approach-item .approach-body p {
opacity: 0;
}
#approach .approach-item.in-view {
opacity: 1;
}
#approach .approach-item.in-view .approach-step {
animation: textSlide 0.6s ease 0.1s both;
}
#approach .approach-item.in-view .approach-body h3 {
animation: titleSlide 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.15s both;
}
#approach .approach-item.in-view .approach-body p {
animation: textSlide 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.25s both;
}
}
@keyframes titleSlide {
from { opacity: 0; transform: translateY(40px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes textSlide {
from { opacity: 0; transform: translateY(25px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes iconPop {
from { opacity: 0; transform: scale(0.6) translateY(20px); }
to { opacity: 0.5; transform: scale(1) translateY(0); }
}
@keyframes numReveal {
from { opacity: 0; transform: translateY(15px); }
to { opacity: 1; transform: translateY(0); }
}
/* 移动端痛点沉浸式布局 */
@media (max-width: 900px) {
/* 痛点半块单列全屏 */
#pain-points {
overflow: visible;
text-align: center;
}
#pain-points .section-label {
margin-bottom: 40px;
}
#pain-points h2 {
font-size: 28px;
margin-bottom: 0;
margin-left: auto;
margin-right: auto;
max-width: 90%;
}
.pain-grid-bg {
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
z-index: 0;
animation: none;
background-image:
linear-gradient(rgba(255,255,255,0.04) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.04) 1px, transparent 1px);
background-size: 60px 60px;
}
.pain-glow {
position: absolute;
top: 50%; left: 50%;
width: 400px; height: 400px;
transform: translate(-50%, -50%);
background: radial-gradient(circle, rgba(255,255,255,0.06) 0%, transparent 70%);
animation: glowPulse 6s ease-in-out infinite alternate;
z-index: 0;
pointer-events: none;
}
.pain-grid {
display: flex;
flex-direction: column;
gap: 0;
position: relative;
z-index: 1;
}
.pain-item {
min-height: 100vh;
min-height: 100dvh;
padding: 80px 28px 60px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
background: transparent;
border: none;
border-top: 1px solid rgba(255,255,255,0.06);
overflow: visible;
position: relative;
z-index: 1;
}
.pain-item::before { display: none; }
.pain-item:hover { background: transparent; }
/* SVG 图标 - 居中放大 */
.pain-icon {
position: relative;
top: auto; right: auto; left: auto;
width: 64px; height: 64px;
opacity: 0.35;
margin-bottom: 40px;
transition: opacity 0.5s ease;
}
.pain-icon svg { width: 100%; height: 100%; }
.pain-icon svg line, .pain-icon svg path, .pain-icon svg circle, .pain-icon svg rect, .pain-icon svg polyline {
stroke: #fff;
stroke-width: 1.5;
fill: none;
}
.pain-item.in-view .pain-icon {
animation: iconPop 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.1s both;
}
/* 横排大字标题 */
.pain-item h3 {
font-size: 36px;
font-weight: 900;
line-height: 1.3;
letter-spacing: 2px;
margin-bottom: 0;
margin-top: 0;
color: #fff;
}
/* 破局之道 */
.pain-item.highlight h3 {
font-size: 40px;
letter-spacing: 4px;
}
/* 描述文字 */
.pain-item p {
font-size: 15px;
color: #888;
line-height: 1.9;
margin-top: 24px;
max-width: 100%;
padding-right: 0;
}
/* 编号 - 超大背景装饰 */
.pain-num {
position: absolute;
bottom: 30px;
right: 24px;
font-size: 100px;
font-weight: 900;
color: rgba(255,255,255,0.04);
letter-spacing: -5px;
line-height: 1;
transition: none;
}
/* 破局之道 - 高潮区域 */
.pain-item.highlight {
min-height: 100vh;
min-height: 100dvh;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 0;
padding: 80px 28px 60px;
background: transparent;
border-top: 1px solid rgba(255,255,255,0.08);
border-bottom: 1px solid rgba(255,255,255,0.06);
}
.pain-item.highlight .pain-num {
font-size: 140px;
color: rgba(255,255,255,0.04);
}
.pain-item.highlight h3 {
font-size: 40px;
letter-spacing: 4px;
}
.pain-item.highlight p {
font-size: 16px;
color: #999;
margin-top: 24px;
padding-right: 0;
max-width: 90%;
}
.pain-item.highlight .highlight-body {
max-width: 100%;
}
.pain-item.highlight .pain-icon {
width: 80px; height: 80px;
margin-bottom: 48px;
}
/* 思路板块移动端 */
.approach-item {
flex-direction: column;
gap: 12px;
padding: 40px 0;
border-top: 1px solid rgba(255,255,255,0.06);
}
.approach-item:first-child {
border-top: none;
}
.approach-step {
font-size: 11px;
letter-spacing: 3px;
}
.approach-body h3 {
font-size: 20px;
}
.approach-body p {
font-size: 14px;
max-width: 100%;
}
/* 业务板块 */
.project-row, .project-row.reverse { flex-direction: column; gap: 40px; margin-bottom: 120px; }
.project-img { width: 100%; height: 300px; }
h1 { font-size: 42px; letter-spacing: -1px; }
.nav-links { display: none; }
}
</style>
</head>
<body>
<nav>
<div class="nav-inner">
<div class="logo">AI X</div>
<div class="nav-links">
<a href="#pain-points">场景洞察</a>
<a href="#approach">解决路径</a>
<a href="#solutions">核心服务</a>
<a href="#geo">GEO</a>
<a href="#contact">合作咨询</a>
</div>
</div>
</nav>
<div class="hero">
<!-- 视频背景 + poster 静态降级 -->
<video class="hero-video" autoplay muted loop playsinline preload="auto" poster="assets/hero-poster.jpg?v=2">
<source src="assets/video/hero-bg-compressed.mp4?v=2" type="video/mp4">
</video>
<div class="hero-overlay"></div>
<div class="hero-content">
<h1>为现有系统<br>装上"大脑"</h1>
<div class="hero-sub">
我们专注于在已经运转良好的业务系统之上叠加 AI 能力。以非侵入式的方式,让原有系统瞬间拥有感知与决策能力。不推倒重来,只做智能叠加。
</div>
<a href="#solutions" class="btn">探索解决方案</a>
</div>
<div class="scroll-indicator"></div>
</div>
<section id="pain-points">
<div class="pain-grid-bg"></div>
<div class="pain-glow"></div>
<div class="container">
<span class="section-label fade-up">WHY IT MATTERS</span>
<h2 class="fade-up" style="max-width: 700px; margin-bottom: 60px;">为什么现有系统<br>需要智能叠加</h2>
<div class="pain-grid">
<div class="pain-item fade-up">
<div class="pain-icon">
<svg viewBox="0 0 48 48">
<rect x="8" y="8" width="14" height="14" rx="2"/>
<rect x="26" y="8" width="14" height="14" rx="2"/>
<rect x="8" y="26" width="14" height="14" rx="2"/>
<rect x="26" y="26" width="14" height="14" rx="2"/>
<line x1="22" y1="15" x2="26" y2="15"/>
<line x1="15" y1="22" x2="15" y2="26"/>
<line x1="33" y1="22" x2="33" y2="26"/>
<line x1="22" y1="33" x2="26" y2="33"/>
</svg>
</div>
<h3>数据沉睡</h3>
<p>物业、资管、CRM 系统积累了大量业务数据,但缺乏智能分析能力。数据停留在记录层面,无法转化为决策依据。</p>
<div class="pain-num">01</div>
</div>
<div class="pain-item fade-up" style="transition-delay: 0.1s;">
<div class="pain-icon">
<svg viewBox="0 0 48 48">
<rect x="4" y="12" width="12" height="24" rx="2"/>
<rect x="18" y="12" width="12" height="24" rx="2"/>
<rect x="32" y="12" width="12" height="24" rx="2"/>
<line x1="10" y1="20" x2="10" y2="30"/>
<line x1="24" y1="20" x2="24" y2="30"/>
<line x1="38" y1="20" x2="38" y2="30"/>
</svg>
</div>
<h3>孤岛效应</h3>
<p>各业务系统独立运行,信息不互通。物业报修、资产台账、客户跟进分属不同平台,管理者需要反复切换系统拼凑全局视图。</p>
<div class="pain-num">02</div>
</div>
<div class="pain-item fade-up" style="transition-delay: 0.2s;">
<div class="pain-icon">
<svg viewBox="0 0 48 48">
<circle cx="24" cy="10" r="6"/>
<path d="M14 42c0-8 4-14 10-14s10 6 10 14"/>
<circle cx="36" cy="16" r="4"/>
<path d="M32 42c0-5 2-9 4-9s4 4 4 9"/>
</svg>
</div>
<h3>人力瓶颈</h3>
<p>客服、招商、维保等高频重复工作消耗大量人力。员工陷入事务性操作,无法聚焦高价值任务。</p>
<div class="pain-num">03</div>
</div>
<div class="pain-item fade-up" style="transition-delay: 0.1s;">
<div class="pain-icon">
<svg viewBox="0 0 48 48">
<circle cx="24" cy="24" r="16"/>
<polyline points="24,12 24,24 32,28"/>
<line x1="8" y1="6" x2="8" y2="14"/>
<line x1="40" y1="6" x2="40" y2="14"/>
<line x1="4" y1="10" x2="4" y2="10"/>
</svg>
</div>
<h3>决策滞后</h3>
<p>空置率分析、租金定价、客户流失预警等依赖人工统计和月度报表,发现问题时往往已经错失最佳干预窗口。</p>
<div class="pain-num">04</div>
</div>
<div class="pain-item fade-up" style="transition-delay: 0.2s;">
<div class="pain-icon">
<svg viewBox="0 0 48 48">
<path d="M24 4L4 14v12c0 11 8 20 20 22 12-2 20-11 20-22V14L24 4z"/>
<line x1="24" y1="18" x2="24" y2="30"/>
<line x1="18" y1="24" x2="30" y2="24"/>
</svg>
</div>
<h3>改造成本高</h3>
<p>传统 AI 方案要求推翻现有系统重建,实施周期长、迁移风险大、员工学习成本极高,导致多数企业望而却步。</p>
<div class="pain-num">05</div>
</div>
<div class="pain-item fade-up" style="transition-delay: 0.25s;">
<div class="pain-icon">
<svg viewBox="0 0 48 48">
<path d="M16 8c0-4 4-6 8-6s8 2 8 6c0 10-8 16-8 16s-8-6-8-16z"/>
<line x1="24" y1="30" x2="24" y2="40"/>
<line x1="18" y1="34" x2="30" y2="34"/>
<circle cx="14" cy="18" r="2"/>
<circle cx="34" cy="18" r="2"/>
</svg>
</div>
<h3>经验依赖</h3>
<p>核心业务决策高度依赖个人经验与直觉,缺乏可复制的标准化模型。人才流动导致能力断层,企业难以规模化扩张。</p>
<div class="pain-num">06</div>
</div>
<div class="pain-item highlight fade-up" style="transition-delay: 0.3s;">
<div class="pain-num"></div>
<div class="highlight-body">
<h3>破局之道</h3>
<p>不推倒重来,不替换系统。在已经运转良好的基础设施之上,叠加一层 AI 能力——让旧系统拥有新大脑。</p>
</div>
</div>
</div>
</div>
</section>
<section id="approach">
<div class="container">
<span class="section-label fade-up">OUR APPROACH</span>
<h2 class="fade-up" style="max-width: 700px; margin-bottom: 60px;">智能叠加<br>五步落地</h2>
<div class="approach-list">
<div class="approach-item fade-up">
<div class="approach-step">Step 1</div>
<div class="approach-body">
<h3>无缝接入</h3>
<p>通过 API 对接现有物业系统、资管平台、CRM无需替换原有软件。AI 层作为智能中间件,读取数据、输出建议、执行自动化任务,对现有业务零干扰。</p>
</div>
</div>
<div class="approach-item fade-up" style="transition-delay: 0.1s;">
<div class="approach-step">Step 2</div>
<div class="approach-body">
<h3>数据唤醒</h3>
<p>将沉睡的业务数据转化为实时洞察。自动识别空置周期异常的物业单元,预测客户续约概率,生成招商定价建议——把事后统计变为事前预警。</p>
</div>
</div>
<div class="approach-item fade-up" style="transition-delay: 0.2s;">
<div class="approach-step">Step 3</div>
<div class="approach-body">
<h3>流程自动化</h3>
<p>将高频重复工作交给 AI Agent。智能客服自动响应业主报修AI 招商助手自动匹配租户需求,维保系统自动规划巡检路线,释放人力聚焦关键决策。</p>
</div>
</div>
<div class="approach-item fade-up" style="transition-delay: 0.15s;">
<div class="approach-step">Step 4</div>
<div class="approach-body">
<h3>统一智能中枢</h3>
<p>跨系统数据在 AI 层融合,形成全局业务视图。管理者通过自然语言即可查询"本月哪些楼宇空置率超标",无需手动汇总多份报表。</p>
</div>
</div>
<div class="approach-item fade-up" style="transition-delay: 0.25s;">
<div class="approach-step">Step 5</div>
<div class="approach-body">
<h3>渐进式落地</h3>
<p>按业务优先级分阶段叠加 AI 能力。从单一场景试点验证效果,逐步扩展到全流程智能化。每一步都可衡量 ROI降低试错成本确保投入产出可控。</p>
</div>
</div>
</div>
</div>
</section>
<section id="solutions">
<div class="container">
<span class="section-label fade-up">CORE BUSINESS</span>
<!-- 物业 - 本地图 (建筑/无人员) -->
<div class="project-row">
<div class="project-text fade-up">
<h2>智慧物业<br>智能中枢</h2>
<p>在现有物业 ERP 之上叠加 AI 调度中枢。通过 API 外挂智能决策层,实现工单自动分发、客诉情感分析。在不改变原有操作流程的前提下,降低 30% 运营成本。</p>
</div>
<div class="project-img fade-up" style="transition-delay: 0.2s;">
<img src="assets/prop.jpg?v=6" alt="Smart Building">
</div>
</div>
<!-- 资管 - 本地图 (服务器/无人员) -->
<div class="project-row reverse">
<div class="project-text fade-up">
<h2>智能资管<br>风控大脑</h2>
<p>无缝接入现有资管平台,外挂智能投研与风控大脑。让历史数据自动转化为预测模型,实现资产自动预警与动态配置。辅助现有流程做出更精准的决策,提升投资回报率。</p>
</div>
<div class="project-img fade-up" style="transition-delay: 0.2s;">
<img src="assets/server.jpg?v=6" alt="Server Data">
</div>
</div>
<!-- CRM - 本地图 (电脑屏幕/无人员) -->
<div class="project-row">
<div class="project-text fade-up">
<h2>CRM 助理<br>效率跃升</h2>
<p>为企业现有 CRM 配备 AI 私人助理。自动捕捉线索、生成对话摘要、推荐跟进策略。销售团队无需学习新软件,在熟悉的界面中即可享受智能化的效率跃升。</p>
</div>
<div class="project-img fade-up" style="transition-delay: 0.2s;">
<img src="assets/crm.jpg?v=6" alt="Team">
</div>
</div>
</div>
</section>
<section id="geo">
<div class="container">
<span class="section-label fade-up">GENERATIVE ENGINE OPTIMIZATION</span>
<div style="display: grid; grid-template-columns: 1.2fr 0.8fr; gap: 80px; align-items: center;">
<div class="fade-up">
<h2 style="margin-bottom: 24px;">GEO<br>生成式引擎优化</h2>
<p style="font-size: 19px; color: #ccc; line-height: 1.6; margin-bottom: 20px;">AI 时代的新型营销与流量基础设施。</p>
<p style="color: #888; line-height: 1.8; font-size: 16px;">通过优化企业在主流大模型和 AI 搜索引擎中的内容结构与权重,确保品牌在用户提问时精准、优先呈现。从传统的“搜索排名”进化为 AI 时代的“答案占位”。</p>
</div>
<!-- GEO - 本地图 (数字地球/无人员) -->
<div class="project-img fade-up" style="transition-delay: 0.2s; height: 450px;">
<img src="assets/geo.jpg?v=6" alt="Network">
</div>
</div>
</div>
</section>
<section id="contact">
<div class="container">
<span class="section-label fade-up">CONTACT</span>
<div class="fade-up" style="text-align:center; margin-bottom:60px;">
<h2>开启智能叠加</h2>
<p style="color:#777; font-size:17px; max-width:500px; margin:16px auto 0; line-height:1.7;">
留下联系方式我们的产品顾问将在24小时内与您取得联系为您定制专属的 AI 叠加方案。
</p>
</div>
<form class="contact-form fade-up" id="consultForm" onsubmit="return false;">
<div>
<label>姓名</label>
<input type="text" name="name" placeholder="您的称呼" required>
</div>
<div>
<label>电话</label>
<input type="tel" name="phone" placeholder="手机号码" required>
</div>
<div class="full-width">
<label>邮箱</label>
<input type="email" name="email" placeholder="选填">
</div>
<div class="full-width">
<label>留言</label>
<textarea name="message" placeholder="简要描述您的需求(选填)"></textarea>
</div>
<div class="contact-submit">
<button type="submit" id="submitBtn">提交咨询</button>
</div>
<div class="form-status" id="formStatus"></div>
</form>
</div>
</section>
<footer>
<div class="container">
<div class="tech-by">TECHNICAL SUPPORT PROVIDED BY</div>
<div class="company">上海菲西尔智能科技有限公司</div>
<div style="margin-top: 12px; font-size: 10px; color: #444; letter-spacing: 1px;">© 2026 SHANGHAI FISCHER INTELLIGENT TECHNOLOGY CO., LTD.</div>
</div>
</footer>
<script>
// 强制视频播放并捕获错误
document.addEventListener('DOMContentLoaded', () => {
const vid = document.querySelector('.hero-video');
if (vid) {
vid.play().catch(e => {
console.warn('Autoplay blocked:', e);
});
}
// 表单提交
const form = document.getElementById('consultForm');
const btn = document.getElementById('submitBtn');
const status = document.getElementById('formStatus');
if (form) {
btn.addEventListener('click', () => {
const name = form.name.value.trim();
const phone = form.phone.value.trim();
const email = form.email.value.trim();
const message = form.message.value.trim();
if (!name || !phone) { status.textContent = '请填写姓名和电话'; status.className = 'form-status err'; return; }
btn.disabled = true; btn.textContent = '提交中...';
fetch('/ai/api/consult', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name, phone, email, message })
}).then(r => r.json()).then(d => {
if (d.success) { status.textContent = '已收到,我们会尽快联系您'; status.className = 'form-status ok'; form.reset(); }
else { status.textContent = d.error || '提交失败,请重试'; status.className = 'form-status err'; }
}).catch(() => { status.textContent = '网络错误,请重试'; status.className = 'form-status err'; })
.finally(() => { btn.disabled = false; btn.textContent = '提交咨询'; });
});
}
});
// 滚动渐显动画
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) entry.target.classList.add('visible');
});
}, { threshold: 0.15, rootMargin: "0px 0px -50px 0px" });
document.querySelectorAll('.fade-up').forEach(el => observer.observe(el));
// 移动端:滚动触发动画(低 threshold 确保全高元素也能触发)
if (window.innerWidth <= 900) {
const mobileItems = document.querySelectorAll('#pain-points .pain-item, #approach .approach-item');
const mobileObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('in-view');
}
});
}, { threshold: 0.1, rootMargin: "0px 0px -10% 0px" });
mobileItems.forEach(item => mobileObserver.observe(item));
// 背景网格视差
const gridBg = document.querySelector('.pain-grid-bg');
const painSection = document.getElementById('pain-points');
if (gridBg && painSection) {
let ticking = false;
window.addEventListener('scroll', () => {
if (!ticking) {
requestAnimationFrame(() => {
const rect = painSection.getBoundingClientRect();
const progress = Math.max(0, Math.min(1, -rect.top / rect.height));
gridBg.style.transform = `translateY(${progress * -60}px)`;
ticking = false;
});
ticking = true;
}
}, { passive: true });
}
}
</script>
</body>
</html>