Files
turingflow-brand-002/src/pages/About.tsx
“dongming” faa74086fe first commit
2026-01-21 16:05:30 +08:00

447 lines
17 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { motion } from 'framer-motion';
import { useRef } from 'react';
import {
Target,
Heart,
Award,
Users,
Calendar,
TrendingUp,
Building2,
Globe,
} from 'lucide-react';
import { Header } from '../components/Header';
import { Footer } from '../components/Footer';
import { COMPANY_INFO } from '../lib/constants';
import { usePageTitle } from '../hooks/usePageTitle';
// 发展历程数据
const milestones = [
{
year: '2010',
title: '公司成立',
description: '示例集团在北京成立,开始布局金融服务业务',
icon: Building2,
},
{
year: '2012',
title: '首次战略融资',
description: '完成 A 轮融资,获得知名投资机构认可',
icon: TrendingUp,
},
{
year: '2015',
title: '业务扩展',
description: '成立科技研发子公司,进军科技领域',
icon: Globe,
},
{
year: '2018',
title: '规模扩张',
description: '员工规模突破 200 人,服务客户超过 500 家',
icon: Users,
},
{
year: '2020',
title: '产业投资布局',
description: '成立产业投资基金,全面进入投资领域',
icon: Target,
},
{
year: '2023',
title: '集团化运营',
description: '正式更名为示例集团,形成多元化业务体系',
icon: Award,
},
{
year: '2025',
title: '新里程碑',
description: '管理资产突破 500 亿,员工规模超过 500 人',
icon: Calendar,
},
];
// 核心价值观数据
const coreValues = [
{
icon: Heart,
title: '诚信为本',
description: '诚信是企业发展的基石,我们始终坚守诚信底线,与客户、合作伙伴建立长期信任关系',
color: 'from-red-500 to-red-600',
},
{
icon: Target,
title: '创新驱动',
description: '创新是企业发展的动力,我们持续投入研发,不断推出创新产品和服务',
color: 'from-blue-500 to-blue-600',
},
{
icon: Award,
title: '卓越品质',
description: '品质是企业生存的根本,我们追求卓越,确保每一个项目都达到最高标准',
color: 'from-yellow-500 to-yellow-600',
},
{
icon: Users,
title: '共赢合作',
description: '合作是企业成功的关键,我们与客户、员工、合作伙伴实现互利共赢',
color: 'from-green-500 to-green-600',
},
];
// 团队成员数据
const teamMembers = [
{
name: '张明远',
position: '董事长兼 CEO',
bio: '毕业于清华大学金融系,拥有 20 年金融行业经验,曾任多家知名金融机构高管。',
},
{
name: '李晓峰',
position: '首席财务官 CFO',
bio: '持有注册会计师资格,曾在四大会计师事务所工作 15 年,专业财务管理和资本运作专家。',
},
{
name: '王建华',
position: '首席技术官 CTO',
bio: '计算机科学博士,曾在国内外知名科技公司担任技术负责人,拥有多项技术专利。',
},
{
name: '陈静雅',
position: '首席运营官 COO',
bio: 'MBA 学位,拥有丰富的企业运营管理经验,擅长战略规划和流程优化。',
},
];
// 荣誉资质数据
const honors = [
{ name: '国家级高新技术企业认证', year: '2020' },
{ name: '北京市优秀企业', year: '2021' },
{ name: '中国最佳雇主品牌', year: '2022' },
{ name: '金融科技创新奖', year: '2023' },
{ name: '年度优秀企业', year: '2024' },
{ name: 'ESG 最佳实践奖', year: '2025' },
];
/**
* About 组件 - 关于我们页面
*/
export const About: React.FC = () => {
const timelineRef = useRef<HTMLDivElement>(null);
usePageTitle('关于我们');
return (
<motion.div
className="min-h-screen bg-background"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.5 }}
>
{/* 顶部导航 */}
<Header />
{/* 主内容 */}
<main>
{/* 页面标题区域 */}
<section className="pt-32 pb-16 bg-gradient-to-br from-primary to-primary-light">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<motion.div
className="text-center text-white"
initial={{ opacity: 0, y: 30 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6 }}
>
<h1 className="text-4xl md:text-5xl font-bold mb-4">
</h1>
<p className="text-xl text-white/80 max-w-3xl mx-auto">
2010
</p>
</motion.div>
</div>
</section>
{/* 公司简介 */}
<section className="py-20">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid lg:grid-cols-2 gap-12 items-center">
<motion.div
initial={{ opacity: 0, x: -30 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
>
<h2 className="text-3xl font-bold text-primary-dark mb-6">
</h2>
<div className="space-y-6 text-gray-600 leading-relaxed">
<p>
<strong>{COMPANY_INFO.fullName}</strong>
{COMPANY_INFO.established} {COMPANY_INFO.headquarters}
</p>
<p>
"诚信、创新、共赢"
</p>
<p>
1000
500 亿
</p>
</div>
{/* 核心数据 */}
<div className="mt-8 grid grid-cols-3 gap-6">
<div className="text-center p-4 bg-primary/5 rounded-xl">
<div className="text-2xl font-bold text-primary">15+</div>
<div className="text-sm text-gray-600"></div>
</div>
<div className="text-center p-4 bg-accent/10 rounded-xl">
<div className="text-2xl font-bold text-accent-dark">500+</div>
<div className="text-sm text-gray-600"></div>
</div>
<div className="text-center p-4 bg-green-100 rounded-xl">
<div className="text-2xl font-bold text-green-700">1000+</div>
<div className="text-sm text-gray-600"></div>
</div>
</div>
</motion.div>
<motion.div
className="relative"
initial={{ opacity: 0, x: 30 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6, delay: 0.2 }}
>
<div className="aspect-[4/3] rounded-2xl overflow-hidden shadow-xl">
<img
src="/images/about-office.jpg"
alt="示例集团办公环境"
className="w-full h-full object-cover"
/>
<div className="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent flex items-end justify-center p-8">
<div className="text-center text-white">
<div className="text-4xl font-bold mb-2"></div>
<div className="text-xl opacity-90"> · </div>
</div>
</div>
</div>
{/* 装饰元素 */}
<div className="absolute -bottom-6 -right-6 w-32 h-32 bg-accent/20 rounded-2xl -z-10" />
<div className="absolute -top-6 -left-6 w-24 h-24 bg-primary/10 rounded-2xl -z-10" />
</motion.div>
</div>
</div>
</section>
{/* 发展历程时间线 */}
<section className="py-20 bg-white" ref={timelineRef}>
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<motion.div
className="text-center mb-16"
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
>
<h2 className="text-3xl font-bold text-primary-dark mb-4">
</h2>
<p className="text-lg text-gray-600">
</p>
</motion.div>
{/* 时间线 */}
<div className="relative">
{/* 中轴线 */}
<div className="absolute left-1/2 -translate-x-1/2 w-0.5 h-full bg-gradient-to-b from-primary via-accent to-primary-light hidden md:block" />
{/* 时间线项目 */}
<div className="space-y-12">
{milestones.map((milestone, index) => (
<motion.div
key={milestone.year}
className={`flex items-center gap-8 ${
index % 2 === 0 ? 'md:flex-row' : 'md:flex-row-reverse'
}`}
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: index * 0.1, duration: 0.5 }}
>
{/* 内容区域 */}
<div className="flex-1 text-center md:text-left">
<div
className={`p-6 bg-white rounded-2xl shadow-sm border border-gray-100 hover:shadow-md transition-shadow ${
index % 2 === 0 ? 'md:pr-12' : 'md:pl-12'
}`}
>
<span className="inline-block px-3 py-1 bg-accent/20 text-accent-dark text-sm font-semibold rounded-full mb-3">
{milestone.year}
</span>
<h3 className="text-xl font-semibold text-primary-dark mb-2">
{milestone.title}
</h3>
<p className="text-gray-600">{milestone.description}</p>
</div>
</div>
{/* 中间图标 */}
<div className="hidden md:flex items-center justify-center w-12 h-12 rounded-full bg-primary text-white shadow-lg z-10">
<milestone.icon size={20} />
</div>
{/* 空白区域 */}
<div className="flex-1 hidden md:block" />
</motion.div>
))}
</div>
</div>
</div>
</section>
{/* 企业文化 */}
<section className="py-20 bg-primary-dark text-white">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<motion.div
className="text-center mb-16"
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
>
<h2 className="text-3xl font-bold mb-4"></h2>
<p className="text-lg text-gray-300">
</p>
</motion.div>
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-8">
{coreValues.map((value, index) => (
<motion.div
key={value.title}
className="text-center p-6 rounded-2xl bg-white/5 hover:bg-white/10 transition-colors"
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: index * 0.1, duration: 0.5 }}
whileHover={{ y: -5 }}
>
<div
className={`inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-gradient-to-br ${value.color} text-white mb-5`}
>
<value.icon size={32} />
</div>
<h3 className="text-xl font-semibold mb-3">{value.title}</h3>
<p className="text-gray-300 text-sm leading-relaxed">
{value.description}
</p>
</motion.div>
))}
</div>
</div>
</section>
{/* 团队介绍 */}
<section className="py-20">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<motion.div
className="text-center mb-16"
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
>
<h2 className="text-3xl font-bold text-primary-dark mb-4">
</h2>
<p className="text-lg text-gray-600">
</p>
</motion.div>
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-8">
{teamMembers.map((member, index) => (
<motion.div
key={member.name}
className="text-center p-6 bg-white rounded-2xl shadow-sm border border-gray-100 hover:shadow-lg transition-shadow"
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: index * 0.1, duration: 0.5 }}
whileHover={{ y: -5 }}
>
{/* 团队成员头像 */}
<div className="w-24 h-24 mx-auto mb-4 rounded-full overflow-hidden ring-4 ring-primary/10">
<div className="w-full h-full rounded-full bg-gradient-to-br from-primary to-primary-light flex items-center justify-center text-white text-2xl font-bold shadow-lg">
{member.name.charAt(0)}
</div>
</div>
<h3 className="text-xl font-semibold text-primary-dark">
{member.name}
</h3>
<p className="text-accent font-medium mb-3">{member.position}</p>
<p className="text-gray-600 text-sm leading-relaxed">
{member.bio}
</p>
</motion.div>
))}
</div>
</div>
</section>
{/* 资质荣誉 */}
<section className="py-20 bg-white">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<motion.div
className="text-center mb-16"
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
>
<h2 className="text-3xl font-bold text-primary-dark mb-4">
</h2>
<p className="text-lg text-gray-600">
</p>
</motion.div>
<div className="grid sm:grid-cols-2 lg:grid-cols-3 gap-6">
{honors.map((honor, index) => (
<motion.div
key={honor.name}
className="flex items-center gap-4 p-5 bg-background rounded-xl hover:shadow-md transition-shadow"
initial={{ opacity: 0, x: -20 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
transition={{ delay: index * 0.1, duration: 0.5 }}
whileHover={{ x: 5 }}
>
<div className="flex-shrink-0 w-16 h-16 rounded-lg bg-gradient-to-br from-accent/20 to-accent/10 flex items-center justify-center">
<Award size={28} className="text-accent" />
</div>
<div className="flex-1">
<h4 className="font-medium text-primary-dark">
{honor.name}
</h4>
<p className="text-sm text-gray-500">{honor.year}</p>
</div>
</motion.div>
))}
</div>
</div>
</section>
</main>
{/* 页脚 */}
<Footer />
</motion.div>
);
};
export default About;