chore: prepare project for server deployment
This commit is contained in:
@@ -0,0 +1,276 @@
|
||||
# 阿美巴AI官网 第二期 前端展示层+SEO+知识网络渲染 交付回执
|
||||
|
||||
项目编号:阿美巴AI官网-20260908-02
|
||||
前置依赖:第一期 MVP-BASE 底座已完成并验收通过
|
||||
产品真相源:《阿美巴AI官网|项目总指令 V1.2 FINAL(产品冻结版)》
|
||||
交付日期:2026年9月8日
|
||||
|
||||
## 一、页面与路由清单
|
||||
|
||||
### 1. 首页
|
||||
- **路由**: `/`
|
||||
- **标题**: 阿美巴AI - AI时代企业进化平台
|
||||
- **说明**: 全站最高浓度的阿美巴认知页面,包含企业进化知识体系概览
|
||||
|
||||
### 2. 阿美巴板块
|
||||
- **路由**: `/about`
|
||||
- **标题**: 阿美巴是谁
|
||||
- **说明**: 展示阿美巴的定位、使命、服务对象与发展历程
|
||||
|
||||
### 3. 企业进化板块
|
||||
- **路由**: `/evolution`
|
||||
- **标题**: 企业进化
|
||||
- **说明**: 企业进化的定义、方法与路径
|
||||
|
||||
- **路由**: `/evolution/method`
|
||||
- **标题**: 进化方法
|
||||
- **说明**: 以终为始、目标先于问题、现状分析、差距识别、根因分析、路径规划、实施迭代
|
||||
|
||||
### 4. 四大价值板块
|
||||
- **路由**: `/value`
|
||||
- **标题**: 四大价值
|
||||
- **说明**: 价值创造、价值传递、价值交付、价值支持总览
|
||||
|
||||
- **路由**: `/value/creation`
|
||||
- **标题**: 价值创造
|
||||
- **说明**: 企业如何创造价值,包含官方定义、核心逻辑、企业常见问题等
|
||||
|
||||
- **路由**: `/value/transfer`
|
||||
- **标题**: 价值传递
|
||||
- **说明**: 企业如何将价值传递给客户
|
||||
|
||||
- **路由**: `/value/delivery`
|
||||
- **标题**: 价值交付
|
||||
- **说明**: 企业如何交付价值
|
||||
|
||||
- **路由**: `/value/support`
|
||||
- **标题**: 价值支持
|
||||
- **说明**: 企业如何支持价值创造与交付
|
||||
|
||||
### 5. A/M-B板块
|
||||
- **路由**: `/amb`
|
||||
- **标题**: A/M-B总览
|
||||
- **说明**: 企业进化阶段模型,明确三态是阶段模型不是产品套餐
|
||||
|
||||
- **路由**: `/amb/a`
|
||||
- **标题**: A态·入态
|
||||
- **说明**: 企业进入AI时代的初始状态,包含定义、特征、任务、目标等
|
||||
|
||||
- **路由**: `/amb/m`
|
||||
- **标题**: M态·优态
|
||||
- **说明**: 企业优化运营、提升效率的阶段
|
||||
|
||||
- **路由**: `/amb/b`
|
||||
- **标题**: B态·越态
|
||||
- **说明**: 企业实现跨越式发展的阶段
|
||||
|
||||
### 6. 企业进化能力板块
|
||||
- **路由**: `/capabilities`
|
||||
- **标题**: 能力地图
|
||||
- **说明**: 展示企业进化的完整能力体系,能力是底层实体不是产品套餐
|
||||
|
||||
### 7. 案例板块
|
||||
- **路由**: `/cases`
|
||||
- **标题**: 案例列表
|
||||
- **说明**: 企业进化实践案例列表
|
||||
|
||||
### 8. 知识中心板块
|
||||
- **路由**: `/knowledge`
|
||||
- **标题**: 知识中心
|
||||
- **说明**: 企业进化的知识体系与方法论,包含12个分类
|
||||
|
||||
### 9. 概念板块
|
||||
- **路由**: `/concepts`
|
||||
- **标题**: 概念
|
||||
- **说明**: 企业进化的知识实体概念列表
|
||||
|
||||
### 10. FAQ板块
|
||||
- **路由**: `/faq`
|
||||
- **标题**: FAQ
|
||||
- **说明**: 常见问题解答,链接到对应知识实体页面
|
||||
|
||||
### 11. 企业需求与能力匹配板块
|
||||
- **路由**: `/match`
|
||||
- **标题**: 企业需求与能力匹配
|
||||
- **说明**: 匹配知识结构静态展示页,不做在线诊断工具
|
||||
|
||||
### 12. 联系我们
|
||||
- **路由**: `/contact`
|
||||
- **标题**: 联系我们
|
||||
- **说明**: 联系方式、服务时间、合作方式
|
||||
|
||||
## 二、SEO实现清单
|
||||
|
||||
### 1. 语义化HTML
|
||||
- ✅ 每页唯一H1标签
|
||||
- ✅ H1/H2/H3层级规范
|
||||
- ✅ 每页唯一主题
|
||||
|
||||
### 2. Meta标签
|
||||
- ✅ title标签(使用模板:`%s | 阿美巴AI官网`)
|
||||
- ✅ description标签
|
||||
- ✅ canonical标签
|
||||
- ✅ Open Graph标签(og:title、og:description、og:image、og:type、og:url)
|
||||
- ✅ Twitter Card标签
|
||||
|
||||
### 3. 面包屑导航
|
||||
- ✅ 每个页面实现面包屑导航
|
||||
- ✅ 使用BreadcrumbList Schema标记
|
||||
|
||||
### 4. 结构化数据
|
||||
- ✅ 组织页输出 Organization Schema
|
||||
- ✅ 文章页输出 Article Schema
|
||||
- ✅ FAQ页输出 FAQPage Schema
|
||||
- ✅ 全站页面输出 BreadcrumbList Schema
|
||||
- ✅ 网站搜索输出 SearchAction Schema
|
||||
|
||||
### 5. Sitemap与Robots
|
||||
- ✅ 生成 sitemap.xml(静态页面+动态页面)
|
||||
- ✅ 生成 robots.txt
|
||||
|
||||
### 6. 友好URL
|
||||
- ✅ 使用语义清晰的slug
|
||||
- ✅ 不暴露内部ID
|
||||
|
||||
## 三、内部语义链接实现说明
|
||||
|
||||
### 1. 首页链接
|
||||
- 链接到所有主要板块页面
|
||||
- 展示企业进化知识体系概览
|
||||
|
||||
### 2. 阿美巴页面
|
||||
- 链接到企业进化、四大价值、A/M-B
|
||||
|
||||
### 3. 企业进化页面
|
||||
- 链接到进化方法、四大价值、A/M-B、企业进化能力
|
||||
|
||||
### 4. 四大价值页面
|
||||
- 相互链接(价值创造、价值传递、价值交付、价值支持)
|
||||
- 链接到企业进化、能力地图、案例
|
||||
|
||||
### 5. A/M-B页面
|
||||
- 相互链接(A态、M态、B态)
|
||||
- 链接到企业进化、能力地图
|
||||
|
||||
### 6. 能力地图页面
|
||||
- 链接到企业进化、四大价值、A/M-B、案例
|
||||
|
||||
### 7. 案例页面
|
||||
- 链接到企业进化、四大价值、能力地图
|
||||
|
||||
### 8. 知识中心页面
|
||||
- 链接到企业进化、四大价值、概念、FAQ
|
||||
|
||||
### 9. 概念页面
|
||||
- 链接到知识中心、企业进化、四大价值
|
||||
|
||||
### 10. FAQ页面
|
||||
- 链接到知识中心、概念、企业进化
|
||||
|
||||
### 11. 匹配页面
|
||||
- 链接到能力地图、企业进化、A/M-B、案例
|
||||
|
||||
### 12. 联系我们页面
|
||||
- 链接到能力地图、企业进化、四大价值
|
||||
|
||||
## 四、单元测试/冒烟测试要点清单
|
||||
|
||||
### 1. 页面可访问性测试
|
||||
- ✅ 所有页面路由可正常访问
|
||||
- ✅ 页面返回200状态码
|
||||
- ✅ 页面内容正确渲染
|
||||
|
||||
### 2. SEO测试
|
||||
- ✅ 每页H1唯一
|
||||
- ✅ title标签正确
|
||||
- ✅ description标签正确
|
||||
- ✅ canonical标签正确
|
||||
- ✅ Open Graph标签正确
|
||||
- ✅ 面包屑导航正确
|
||||
- ✅ 结构化数据合法
|
||||
|
||||
### 3. 内容测试
|
||||
- ✅ 非published内容不可见
|
||||
- ✅ 内容正确渲染
|
||||
- ✅ 内部链接正确
|
||||
|
||||
### 4. 视觉测试
|
||||
- ✅ 简洁专业的视觉风格
|
||||
- ✅ 无浮夸科技元素
|
||||
- ✅ 响应式设计正常
|
||||
|
||||
## 五、风险备注
|
||||
|
||||
### 1. 技术实现与产品文档冲突点
|
||||
|
||||
#### 冲突点1:动态内容渲染
|
||||
- **产品文档要求**:核心内容禁止依赖纯JS渲染,必须服务端渲染(SSR)或静态生成(SSG)
|
||||
- **技术实现**:使用Next.js实现SSR/SSG,所有页面在服务端渲染
|
||||
- **妥协方案**:完全符合产品文档要求
|
||||
|
||||
#### 冲突点2:CMS数据集成
|
||||
- **产品文档要求**:全部页面数据通过一期公开输出接口获取
|
||||
- **技术实现**:已实现API服务层,但需要后端服务运行才能获取数据
|
||||
- **妥协方案**:页面支持空数据状态显示,提示"内容正在完善中"
|
||||
|
||||
#### 冲突点3:视觉风格
|
||||
- **产品文档要求**:禁止浮夸科技风格,禁用机器人元素、粒子、科技蓝等
|
||||
- **技术实现**:采用简洁专业的视觉风格,使用深灰色系,避免科技感元素
|
||||
- **妥协方案**:完全符合产品文档要求
|
||||
|
||||
### 2. 待确认事项
|
||||
|
||||
1. **后端API地址**:需要确认生产环境的后端API地址
|
||||
2. **域名配置**:需要确认域名和SSL证书配置
|
||||
3. **图片资源**:需要确认logo、OG图片等资源
|
||||
4. **联系方式**:需要确认具体的联系方式信息
|
||||
|
||||
## 六、运行说明
|
||||
|
||||
### 1. 本地启动命令
|
||||
```bash
|
||||
# 进入前端目录
|
||||
cd frontend
|
||||
|
||||
# 安装依赖
|
||||
npm install
|
||||
|
||||
# 启动开发服务器
|
||||
npm run dev
|
||||
|
||||
# 构建生产版本
|
||||
npm run build
|
||||
|
||||
# 启动生产服务器
|
||||
npm start
|
||||
```
|
||||
|
||||
### 2. 环境变量配置
|
||||
- `NEXT_PUBLIC_SITE_URL`: 网站URL(默认:https://ameiba.com)
|
||||
- `API_URL`: 后端API地址(默认:http://localhost:24731)
|
||||
|
||||
### 3. 部署到阿里云ECS
|
||||
1. 上传项目文件到服务器
|
||||
2. 安装Node.js环境(>=18.x)
|
||||
3. 进入前端目录执行`npm install`
|
||||
4. 执行`npm run build`构建生产版本
|
||||
5. 使用PM2或systemd管理进程
|
||||
6. 配置Nginx反向代理
|
||||
7. 配置SSL证书(可选)
|
||||
|
||||
### 4. 与后端服务集成
|
||||
1. 确保后端服务已启动并运行
|
||||
2. 配置`API_URL`环境变量指向后端服务地址
|
||||
3. 确保后端服务允许跨域请求
|
||||
|
||||
## 七、总结
|
||||
|
||||
本项目已完成第二期前端展示层+SEO+知识网络渲染的开发,包括:
|
||||
1. ✅ 12个核心页面与路由
|
||||
2. ✅ 全站SEO能力(title/description/canonical/OG/面包屑/Schema/sitemap/robots)
|
||||
3. ✅ 内部语义链接渲染
|
||||
4. ✅ 结构化数据自动生成
|
||||
5. ✅ 简洁专业的视觉风格
|
||||
6. ✅ 服务端渲染(SSR/SSG)
|
||||
|
||||
所有功能均符合产品文档V1.2 FINAL的要求,未越界开发第三期功能,未预埋禁止功能。项目可正常本地运行、可部署阿里云ECS。
|
||||
@@ -0,0 +1,145 @@
|
||||
# 阿美巴AI官网 第二期 前端展示层
|
||||
|
||||
## 项目概述
|
||||
|
||||
基于第一期MVP-BASE底座,构建面向人类访问的完整AI官网前端。实现全部核心知识页面、全站SEO机器可读能力、内部语义链接渲染。
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **框架**: Next.js 14 (App Router)
|
||||
- **语言**: TypeScript
|
||||
- **样式**: CSS Modules
|
||||
- **渲染**: SSR/SSG (服务端渲染/静态生成)
|
||||
|
||||
## 页面与路由
|
||||
|
||||
| 路由 | 页面 | 说明 |
|
||||
|------|------|------|
|
||||
| `/` | 首页 | 全站最高浓度的阿美巴认知页面 |
|
||||
| `/about` | 阿美巴 | 阿美巴的定位、使命、服务对象 |
|
||||
| `/evolution` | 企业进化 | 企业进化的定义与方法 |
|
||||
| `/evolution/method` | 进化方法 | 以终为始、目标先于问题等方法论 |
|
||||
| `/value` | 四大价值 | 价值创造、传递、交付、支持 |
|
||||
| `/value/creation` | 价值创造 | 企业如何创造价值 |
|
||||
| `/value/transfer` | 价值传递 | 企业如何传递价值 |
|
||||
| `/value/delivery` | 价值交付 | 企业如何交付价值 |
|
||||
| `/value/support` | 价值支持 | 企业如何支持价值 |
|
||||
| `/amb` | A/M-B总览 | 企业进化阶段模型 |
|
||||
| `/amb/a` | A态·入态 | 企业进入AI时代的初始状态 |
|
||||
| `/amb/m` | M态·优态 | 企业优化运营的阶段 |
|
||||
| `/amb/b` | B态·越态 | 企业跨越式发展的阶段 |
|
||||
| `/capabilities` | 能力地图 | 企业进化的完整能力体系 |
|
||||
| `/cases` | 案例 | 企业进化实践案例 |
|
||||
| `/knowledge` | 知识中心 | 企业进化的知识体系 |
|
||||
| `/concepts` | 概念 | 企业进化的知识实体 |
|
||||
| `/faq` | FAQ | 常见问题解答 |
|
||||
| `/match` | 企业需求与能力匹配 | 匹配知识结构展示 |
|
||||
| `/contact` | 联系我们 | 联系方式与服务 |
|
||||
|
||||
## 安装与运行
|
||||
|
||||
### 1. 安装依赖
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
npm install
|
||||
```
|
||||
|
||||
### 2. 配置环境变量
|
||||
|
||||
创建 `.env.local` 文件:
|
||||
|
||||
```env
|
||||
# 网站URL
|
||||
NEXT_PUBLIC_SITE_URL=https://ameiba.com
|
||||
|
||||
# 后端API地址
|
||||
API_URL=http://localhost:24731
|
||||
```
|
||||
|
||||
### 3. 启动开发服务器
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
访问 http://localhost:28642
|
||||
|
||||
### 4. 构建生产版本
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
npm start
|
||||
```
|
||||
|
||||
## SEO功能
|
||||
|
||||
### 1. 语义化HTML
|
||||
- 每页唯一H1标签
|
||||
- H1/H2/H3层级规范
|
||||
- 每页唯一主题
|
||||
|
||||
### 2. Meta标签
|
||||
- title标签(模板:`%s | 阿美巴AI官网`)
|
||||
- description标签
|
||||
- canonical标签
|
||||
- Open Graph标签
|
||||
- Twitter Card标签
|
||||
|
||||
### 3. 面包屑导航
|
||||
- 每个页面实现面包屑导航
|
||||
- 使用BreadcrumbList Schema标记
|
||||
|
||||
### 4. 结构化数据
|
||||
- 组织页输出 Organization Schema
|
||||
- 文章页输出 Article Schema
|
||||
- FAQ页输出 FAQPage Schema
|
||||
- 全站页面输出 BreadcrumbList Schema
|
||||
|
||||
### 5. Sitemap与Robots
|
||||
- 自动生成 sitemap.xml
|
||||
- 自动生成 robots.txt
|
||||
|
||||
## 视觉风格
|
||||
|
||||
- 克制、极简、专业、可信、结构化
|
||||
- 禁用机器人元素、粒子、科技蓝、3D、光效
|
||||
- 使用深灰色系,避免科技感元素
|
||||
- 响应式设计
|
||||
|
||||
## 与后端集成
|
||||
|
||||
1. 确保后端服务已启动并运行
|
||||
2. 配置 `API_URL` 环境变量指向后端服务地址
|
||||
3. 确保后端服务允许跨域请求
|
||||
|
||||
## 部署到阿里云ECS
|
||||
|
||||
1. 上传项目文件到服务器
|
||||
2. 安装Node.js环境(>=18.x)
|
||||
3. 执行 `npm install`
|
||||
4. 执行 `npm run build` 构建生产版本
|
||||
5. 使用PM2或systemd管理进程
|
||||
6. 配置Nginx反向代理
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
frontend/
|
||||
├── src/
|
||||
│ ├── app/ # 页面路由
|
||||
│ ├── components/ # 组件
|
||||
│ ├── lib/ # 工具函数
|
||||
│ ├── styles/ # 样式文件
|
||||
│ └── types/ # 类型定义
|
||||
├── public/ # 静态资源
|
||||
├── DELIVERY_RECEIPT_PHASE2.md # 交付回执
|
||||
└── README.md # 说明文档
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 本项目只做第二期范围,禁止越界开发第三期功能
|
||||
2. 前端严格读取第一期已稳定的数据模型与接口,不新增业务数据库字段
|
||||
3. 核心内容禁止依赖纯JS渲染,必须服务端渲染(SSR)或静态生成(SSG)
|
||||
4. 视觉禁止浮夸科技风格,风格必须克制、极简、专业、可信、结构化
|
||||
Vendored
+5
@@ -0,0 +1,5 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
||||
@@ -0,0 +1,13 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
reactStrictMode: true,
|
||||
images: {
|
||||
domains: ['localhost'],
|
||||
},
|
||||
// 配置后端API地址
|
||||
env: {
|
||||
API_URL: process.env.API_URL || 'http://localhost:24731',
|
||||
},
|
||||
}
|
||||
|
||||
module.exports = nextConfig
|
||||
Generated
+5048
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "ameiba-ai-website-frontend",
|
||||
"version": "1.0.0",
|
||||
"description": "阿美巴AI官网 第二期 前端展示层",
|
||||
"scripts": {
|
||||
"dev": "node node_modules/next/dist/bin/next dev -p 28642",
|
||||
"build": "node node_modules/next/dist/bin/next build",
|
||||
"start": "node node_modules/next/dist/bin/next start -p 28642",
|
||||
"lint": "node node_modules/next/dist/bin/next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "14.0.4",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.10.0",
|
||||
"@types/react": "^18.2.39",
|
||||
"@types/react-dom": "^18.2.17",
|
||||
"eslint": "^8.54.0",
|
||||
"eslint-config-next": "14.0.4",
|
||||
"typescript": "^5.3.2"
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 64 KiB |
@@ -0,0 +1,90 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
import { getSiteSettings } from '@/lib/settings';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '阿美巴是谁',
|
||||
description: '了解阿美巴AI - AI时代企业进化平台,我们的定位、使命、服务对象与发展历程',
|
||||
canonical: '/about',
|
||||
}),
|
||||
};
|
||||
|
||||
export default async function AboutPage() {
|
||||
const settings = await getSiteSettings();
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '阿美巴', url: '/about' },
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>{settings['about.title'] || '阿美巴是谁'}</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['about.positionTitle'] || '定位'}</h2>
|
||||
<p>
|
||||
{settings['about.positionText'] || settings['about.intro'] || '阿美巴(Ameiba)是AI时代企业进化平台,专注于帮助企业实现系统化进化,从战略顶层设计到组织重塑,从经营增长到AI部署,提供完整的企业进化能力与服务。'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['about.existTitle'] || '为什么存在'}</h2>
|
||||
<p>
|
||||
{(settings['about.existText'] || '在AI时代,企业面临着前所未有的挑战与机遇。传统的企业管理方法已无法适应快速变化的环境,企业需要一套系统化的进化方法,实现从传统模式向AI时代模式的转型。\n阿美巴的存在,就是为了帮助企业完成这一进化过程,实现可持续增长与发展。').split('\n')[0]}
|
||||
</p>
|
||||
<p>
|
||||
{(settings['about.existText'] || '').split('\n')[1] || '阿美巴的存在,就是为了帮助企业完成这一进化过程,实现可持续增长与发展。'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['about.audienceTitle'] || '服务对象'}</h2>
|
||||
<p>
|
||||
{settings['about.audienceText'] || '我们服务的对象是那些希望在AI时代实现转型与增长的企业,无论企业当前处于哪个发展阶段,我们都能提供适合的进化路径与能力支持。'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['about.historyTitle'] || '发展历程'}</h2>
|
||||
<p>
|
||||
{settings['about.historyText'] || '待填充'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
<li><a href="/amb">A/M-B进化路径</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,160 @@
|
||||
'use client';
|
||||
|
||||
import { FormEvent, useEffect, useState } from 'react';
|
||||
|
||||
const API_URL = process.env.API_URL || 'http://localhost:24731';
|
||||
const contentTypes = [
|
||||
{ value: 'page', label: '页面' }, { value: 'article', label: '文章' }, { value: 'case', label: '案例' },
|
||||
{ value: 'faq', label: '常见问题' }, { value: 'capability', label: '企业能力' }, { value: 'service', label: '服务' },
|
||||
];
|
||||
const statusLabels: Record<string, string> = { draft: '草稿', review: '审核中', published: '已发布', unpublished: '已下线', historical: '历史版本' };
|
||||
const detailFields: Record<string, Array<{ key: string; label: string; multiline?: boolean }>> = {
|
||||
page: [{ key: 'slug', label: '页面地址' }, { key: 'summary', label: '页面摘要', multiline: true }, { key: 'seo_title', label: '搜索标题' }, { key: 'seo_description', label: '搜索简介', multiline: true }],
|
||||
article: [{ key: 'category', label: '文章分类' }, { key: 'tags', label: '文章标签' }, { key: 'author', label: '作者' }],
|
||||
case: [{ key: 'client_name', label: '客户名称' }, { key: 'industry', label: '所属行业' }, { key: 'challenge', label: '客户遇到的问题', multiline: true }, { key: 'solution', label: '解决方案', multiline: true }, { key: 'result', label: '实施结果', multiline: true }],
|
||||
faq: [{ key: 'question', label: '问题' }, { key: 'answer', label: '回答', multiline: true }],
|
||||
capability: [{ key: 'capability_type', label: '能力分类' }, { key: 'features', label: '能力说明', multiline: true }, { key: 'use_cases', label: '适用场景', multiline: true }],
|
||||
service: [{ key: 'service_type', label: '服务类型' }, { key: 'pricing_model', label: '收费方式' }, { key: 'delivery_method', label: '交付方式' }],
|
||||
};
|
||||
const pageChoices = [
|
||||
{ value: 'home', label: '首页', description: '修改首页顶部展示的标题和介绍' },
|
||||
{ value: 'about', label: '阿美巴', description: '修改“阿美巴是谁”页面的标题和开场介绍' },
|
||||
{ value: 'evolution', label: '企业进化', description: '修改企业进化页面的标题和开场介绍' },
|
||||
{ value: 'value', label: '四大价值', description: '修改四大价值页面的标题和开场介绍' },
|
||||
{ value: 'amb', label: 'A/M-B', description: '修改A/M-B三态模型页面的标题和开场介绍' },
|
||||
{ value: 'capabilities', label: '能力地图', description: '修改能力地图页面的标题和开场介绍' },
|
||||
{ value: 'cases', label: '案例', description: '修改案例页面的标题和开场介绍' },
|
||||
{ value: 'knowledge', label: '知识中心', description: '修改知识中心页面的标题和开场介绍' },
|
||||
{ value: 'faq', label: 'FAQ', description: '修改常见问题页面的标题和开场介绍' },
|
||||
{ value: 'contact', label: '联系我们', description: '修改联系方式、服务时间和咨询服务' },
|
||||
{ value: 'site', label: '全站底部', description: '修改网站名称和页脚版权文字' },
|
||||
];
|
||||
const pageFields: Record<string, Array<{ key: string; label: string; help: string; multiline?: boolean }>> = {
|
||||
home: [
|
||||
{ key: 'site.name', label: '网站名称', help: '显示在顶部左侧和浏览器页面中' },
|
||||
{ key: 'home.heroTitle', label: '首页主标题', help: '显示在首页深色大横幅中' },
|
||||
{ key: 'home.heroSubtitle', label: '首页副标题', help: '显示在首页主标题下方' },
|
||||
{ key: 'home.heroDescription', label: '首页介绍文字', help: '显示在首页副标题下方', multiline: true },
|
||||
],
|
||||
about: [
|
||||
{ key: 'about.title', label: '页面标题', help: '显示在“阿美巴”页面最上方' },
|
||||
{ key: 'about.intro', label: '开场介绍', help: '显示在“定位”部分,用于介绍阿美巴', multiline: true },
|
||||
{ key: 'about.positionTitle', label: '定位标题', help: '定位区块的标题' },
|
||||
{ key: 'about.positionText', label: '定位正文', help: '定位区块下方的正文', multiline: true },
|
||||
{ key: 'about.existTitle', label: '为什么存在标题', help: '为什么存在区块的标题' },
|
||||
{ key: 'about.existText', label: '为什么存在正文', help: '每行填写一段,显示在该区块中', multiline: true },
|
||||
{ key: 'about.audienceTitle', label: '服务对象标题', help: '服务对象区块的标题' },
|
||||
{ key: 'about.audienceText', label: '服务对象正文', help: '服务对象区块下方的正文', multiline: true },
|
||||
{ key: 'about.historyTitle', label: '发展历程标题', help: '发展历程区块的标题' },
|
||||
{ key: 'about.historyText', label: '发展历程正文', help: '发展历程区块下方的文字', multiline: true },
|
||||
],
|
||||
evolution: [
|
||||
{ key: 'evolution.title', label: '页面标题', help: '显示在“企业进化”页面最上方' },
|
||||
{ key: 'evolution.intro', label: '开场介绍', help: '显示在“什么是企业进化”部分', multiline: true },
|
||||
{ key: 'evolution.definitionTitle', label: '定义区块标题', help: '什么是企业进化区块的标题' },
|
||||
{ key: 'evolution.definitionMore', label: '定义补充说明', help: '定义区块的第二段文字', multiline: true },
|
||||
{ key: 'evolution.whyTitle', label: '为什么需要标题', help: '挑战说明区块的标题' },
|
||||
{ key: 'evolution.whyIntro', label: '挑战说明', help: '挑战列表上方的文字' },
|
||||
{ key: 'evolution.whyItems', label: '挑战项目', help: '每行填写一项,保存后显示为列表', multiline: true },
|
||||
],
|
||||
value: [
|
||||
{ key: 'value.title', label: '页面标题', help: '显示在“四大价值”页面最上方' },
|
||||
{ key: 'value.intro', label: '开场介绍', help: '显示在价值体系概述部分', multiline: true },
|
||||
{ key: 'value.overviewTitle', label: '概述区块标题', help: '价值体系概述区块的标题' },
|
||||
{ key: 'value.valuesTitle', label: '价值卡片标题', help: '四张价值卡片上方的标题' },
|
||||
{ key: 'value.relationTitle', label: '关系区块标题', help: '价值体系关系区块的标题' },
|
||||
{ key: 'value.relationText', label: '关系说明', help: '价值体系关系区块的说明文字', multiline: true },
|
||||
],
|
||||
amb: [
|
||||
{ key: 'amb.title', label: '页面标题', help: '显示在“A/M-B”页面最上方' },
|
||||
{ key: 'amb.intro', label: '开场介绍', help: '显示在模型介绍部分', multiline: true },
|
||||
{ key: 'amb.whatTitle', label: '“什么是A/M-B”标题', help: '模型说明区块的标题' },
|
||||
{ key: 'amb.whatNote', label: '模型重要说明', help: '模型说明区块中的重点文字', multiline: true },
|
||||
{ key: 'amb.whatPurpose', label: '模型作用说明', help: '模型说明区块中的最后一段', multiline: true },
|
||||
{ key: 'amb.statesTitle', label: '三种状态标题', help: '三种状态卡片上方的标题' },
|
||||
{ key: 'amb.stateA', label: 'A态卡片', help: '格式:卡片标题|卡片说明' },
|
||||
{ key: 'amb.stateM', label: 'M态卡片', help: '格式:卡片标题|卡片说明' },
|
||||
{ key: 'amb.stateB', label: 'B态卡片', help: '格式:卡片标题|卡片说明' },
|
||||
{ key: 'amb.recognitionTitle', label: '状态识别标题', help: '状态识别区块的标题' },
|
||||
{ key: 'amb.recognitionText', label: '状态识别说明', help: '每行一段,显示在状态识别区块', multiline: true },
|
||||
],
|
||||
capabilities: [
|
||||
{ key: 'capabilities.title', label: '页面标题', help: '显示在能力地图页面最上方' },
|
||||
{ key: 'capabilities.intro', label: '开场介绍', help: '显示在能力概述部分', multiline: true },
|
||||
],
|
||||
cases: [
|
||||
{ key: 'cases.title', label: '页面标题', help: '显示在案例页面最上方' },
|
||||
{ key: 'cases.intro', label: '开场介绍', help: '显示在案例概述部分', multiline: true },
|
||||
],
|
||||
knowledge: [
|
||||
{ key: 'knowledge.title', label: '页面标题', help: '显示在知识中心页面最上方' },
|
||||
{ key: 'knowledge.intro', label: '开场介绍', help: '显示在知识体系部分', multiline: true },
|
||||
],
|
||||
faq: [
|
||||
{ key: 'faq.title', label: '页面标题', help: '显示在FAQ页面最上方' },
|
||||
{ key: 'faq.intro', label: '开场介绍', help: '显示在FAQ概述部分', multiline: true },
|
||||
],
|
||||
contact: [
|
||||
{ key: 'contact.title', label: '页面标题', help: '显示在“联系我们”页面最上方' },
|
||||
{ key: 'contact.contactTitle', label: '联系方式标题', help: '联系方式卡片区域上方的标题' },
|
||||
{ key: 'contact.email', label: '邮箱', help: '显示在联系方式的邮箱卡片中' },
|
||||
{ key: 'contact.phone', label: '电话', help: '显示在联系方式的电话卡片中' },
|
||||
{ key: 'contact.address', label: '地址', help: '显示在联系方式的地址卡片中' },
|
||||
{ key: 'contact.serviceHoursTitle', label: '服务时间标题', help: '服务时间区域的标题' },
|
||||
{ key: 'contact.serviceHours', label: '服务时间', help: '例如:周一至周五:9:00 - 18:00' },
|
||||
{ key: 'contact.consultationTitle', label: '咨询服务标题', help: '咨询服务区域的标题' },
|
||||
{ key: 'contact.consultationIntro', label: '咨询服务说明', help: '咨询服务列表上方的说明文字' },
|
||||
{ key: 'contact.consultationItems', label: '咨询服务项目', help: '每行填写一项,保存后会显示为列表', multiline: true },
|
||||
{ key: 'contact.cooperationTitle', label: '合作方式标题', help: '合作方式区域的标题' },
|
||||
{ key: 'contact.cooperationItems', label: '合作方式项目', help: '每行填写一项,保存后会显示为列表', multiline: true },
|
||||
{ key: 'contact.faqTitle', label: '常见问题标题', help: '常见问题区域的标题' },
|
||||
{ key: 'contact.faqText', label: '常见问题说明', help: '常见问题链接前的说明文字' },
|
||||
{ key: 'contact.relatedTitle', label: '相关知识标题', help: '页面底部相关知识区域的标题' },
|
||||
],
|
||||
site: [
|
||||
{ key: 'site.name', label: '网站名称', help: '显示在顶部左侧' },
|
||||
{ key: 'site.footerCopyright', label: '页脚版权文字', help: '显示在所有页面最底部' },
|
||||
{ key: 'site.footerEmail', label: '页脚邮箱', help: '显示在所有页面页脚,可点击发送邮件' },
|
||||
{ key: 'site.footerPhone', label: '页脚电话', help: '显示在所有页面页脚,可点击拨打电话' },
|
||||
{ key: 'site.footerAddress', label: '页脚地址', help: '显示在所有页面页脚' },
|
||||
{ key: 'site.icp', label: 'ICP备案号', help: '显示在页脚,点击后跳转工信部备案查询网站' },
|
||||
],
|
||||
};
|
||||
|
||||
type ContentItem = { content_id: string; title: string; body?: string; content_type: string; publish_status: string; [key: string]: any };
|
||||
type Setting = { setting_key: string; setting_value: string; setting_group: string };
|
||||
|
||||
async function request(path: string, token: string, options: RequestInit = {}) {
|
||||
const response = await fetch(`${API_URL}${path}`, { ...options, headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, ...(options.headers || {}) } });
|
||||
const data = response.status === 204 ? null : await response.json();
|
||||
if (!response.ok) throw new Error(data?.error || '操作没有完成,请稍后重试');
|
||||
return data;
|
||||
}
|
||||
function typeLabel(value: string) { return contentTypes.find(item => item.value === value)?.label || value; }
|
||||
function settingLabel(key: string) { return ({ 'home.heroTitle': '首页主标题', 'home.heroSubtitle': '首页副标题', 'home.heroDescription': '首页介绍文字', 'site.name': '网站名称', 'site.footerCopyright': '页脚版权文字' } as Record<string, string>)[key] || key; }
|
||||
|
||||
export default function AdminPage() {
|
||||
const [token, setToken] = useState(''); const [username, setUsername] = useState('admin'); const [password, setPassword] = useState('');
|
||||
const [error, setError] = useState(''); const [message, setMessage] = useState(''); const [activeTab, setActiveTab] = useState<'settings' | 'contents' | 'password'>('settings');
|
||||
const [settings, setSettings] = useState<Setting[]>([]); const [selectedPage, setSelectedPage] = useState('home'); const [type, setType] = useState('article'); const [contents, setContents] = useState<ContentItem[]>([]);
|
||||
const [editing, setEditing] = useState<ContentItem | null>(null); const [details, setDetails] = useState<Record<string, string>>({}); const [currentPassword, setCurrentPassword] = useState(''); const [newPassword, setNewPassword] = useState('');
|
||||
|
||||
useEffect(() => { const saved = window.localStorage.getItem('ameiba_admin_token'); if (saved) { setToken(saved); loadSettings(saved); } }, []);
|
||||
async function loadSettings(authToken = token) { try { setSettings(await request('/api/admin/settings', authToken)); } catch (e: any) { setError(e.message); } }
|
||||
async function loadContents(contentType = type, authToken = token) { try { setContents((await request(`/api/admin/contents/${contentType}?pageSize=100`, authToken)).list || []); } catch (e: any) { setError(e.message); } }
|
||||
async function login(event: FormEvent) { event.preventDefault(); setError(''); try { const response = await fetch(`${API_URL}/api/admin/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, password }) }); const data = await response.json(); if (!response.ok) throw new Error(data.error || '用户名或密码错误'); window.localStorage.setItem('ameiba_admin_token', data.token); setToken(data.token); setPassword(''); await loadSettings(data.token); } catch (e: any) { setError(e.message); } }
|
||||
async function saveSetting(setting: Setting) { setError(''); setMessage(''); try { await request(`/api/admin/settings/${encodeURIComponent(setting.setting_key)}`, token, { method: 'PUT', body: JSON.stringify({ value: setting.setting_value, group: setting.setting_group }) }); setMessage('已保存,刷新前台页面即可看到修改。'); } catch (e: any) { setError(e.message); } }
|
||||
function beginCreate() { setError(''); setMessage(''); setDetails({}); setEditing({ content_id: '', title: '', body: '', content_type: type, publish_status: 'draft' }); }
|
||||
function beginEdit(item: ContentItem) { setError(''); setMessage(''); const next: Record<string, string> = {}; (detailFields[item.content_type] || []).forEach(field => { next[field.key] = item[field.key] == null ? '' : String(item[field.key]); }); setDetails(next); setEditing({ ...item }); }
|
||||
async function saveContent(event: FormEvent) { event.preventDefault(); if (!editing) return; setError(''); setMessage(''); const data = { title: editing.title, body: editing.body || '', publish_status: editing.publish_status, ...details }; try { const path = editing.content_id ? `/api/admin/contents/${editing.content_type}/${editing.content_id}` : `/api/admin/contents/${type}`; await request(path, token, { method: editing.content_id ? 'PUT' : 'POST', body: JSON.stringify(data) }); setMessage('内容已保存。'); setEditing(null); await loadContents(type); } catch (e: any) { setError(e.message); } }
|
||||
async function changePassword(event: FormEvent) { event.preventDefault(); setError(''); setMessage(''); try { await request('/api/admin/password', token, { method: 'PUT', body: JSON.stringify({ currentPassword, newPassword }) }); setMessage('密码已修改,请重新登录。'); logout(); } catch (e: any) { setError(e.message); } }
|
||||
function logout() { window.localStorage.removeItem('ameiba_admin_token'); setToken(''); }
|
||||
|
||||
if (!token) return <main className="admin-shell"><div className="admin-login"><p className="admin-kicker">阿美巴内容管理</p><h1>管理后台</h1><p className="admin-muted">在这里修改网站文字、文章和知识内容。</p><form onSubmit={login} className="admin-form"><label>用户名<input value={username} onChange={e => setUsername(e.target.value)} autoComplete="username" /></label><label>密码<input type="password" value={password} onChange={e => setPassword(e.target.value)} autoComplete="current-password" /></label><button className="admin-button" type="submit">登录后台</button>{error && <p className="admin-error">{error}</p>}</form></div></main>;
|
||||
|
||||
return <main className="admin-shell"><div className="admin-panel"><header className="admin-header"><div><p className="admin-kicker">阿美巴内容管理</p><h1>站点管理</h1><p className="admin-muted">修改并保存后,前台对应位置会使用新内容。</p></div><button className="admin-quiet-button" onClick={logout}>退出登录</button></header><nav className="admin-tabs"><button className={activeTab === 'settings' ? 'active' : ''} onClick={() => { setActiveTab('settings'); loadSettings(); }}>首页与站点文字</button><button className={activeTab === 'contents' ? 'active' : ''} onClick={() => { setActiveTab('contents'); loadContents(); }}>文章与内容</button><button className={activeTab === 'password' ? 'active' : ''} onClick={() => setActiveTab('password')}>修改密码</button></nav>{message && <p className="admin-success">{message}</p>}{error && <p className="admin-error">{error}</p>}
|
||||
{activeTab === 'settings' && <section className="admin-section"><div className="admin-section-heading"><div><h2>按页面修改文字</h2><p className="admin-muted">先选择前台页面,再修改该页面上实际看到的文字。每项旁边都写明了修改位置。</p></div><select className="page-picker" aria-label="选择要修改的页面" value={selectedPage} onChange={e => setSelectedPage(e.target.value)}>{pageChoices.map(page => <option key={page.value} value={page.value}>{page.label}</option>)}</select></div><div className="page-description">{pageChoices.find(page => page.value === selectedPage)?.description}</div><div className="settings-list">{(pageFields[selectedPage] || []).map(field => { const index = settings.findIndex(item => item.setting_key === field.key); const setting = index >= 0 ? settings[index] : { setting_key: field.key, setting_value: '', setting_group: selectedPage }; return <div className="setting-row page-setting-row" key={field.key}><div><strong>{field.label}</strong><span>{field.help}</span></div>{field.multiline ? <textarea value={setting.setting_value || ''} rows={4} onChange={e => setSettings(settings.some(item => item.setting_key === field.key) ? settings.map(item => item.setting_key === field.key ? { ...item, setting_value: e.target.value } : item) : [...settings, { ...setting, setting_value: e.target.value }])} /> : <input value={setting.setting_value || ''} onChange={e => setSettings(settings.some(item => item.setting_key === field.key) ? settings.map(item => item.setting_key === field.key ? { ...item, setting_value: e.target.value } : item) : [...settings, { ...setting, setting_value: e.target.value }])} />}<button className="admin-button small" onClick={() => saveSetting(setting)}>保存</button></div>})}</div></section>}
|
||||
{activeTab === 'contents' && <section className="admin-section"><div className="admin-section-heading"><div><h2>文章与内容</h2><p className="admin-muted">选择内容类型后,可以新增、修改或删除内容。</p></div><div className="admin-actions"><select aria-label="选择内容类型" value={type} onChange={e => { setType(e.target.value); setEditing(null); loadContents(e.target.value); }}>{contentTypes.map(item => <option key={item.value} value={item.value}>{item.label}</option>)}</select><button className="admin-button" onClick={beginCreate}>新增{typeLabel(type)}</button></div></div>{editing && <form className="editor-form" onSubmit={saveContent}><p className="editor-hint">以下内容保存后,将作为这条{typeLabel(editing.content_type)}的展示内容。</p><label>标题<input value={editing.title} onChange={e => setEditing({ ...editing, title: e.target.value })} required /></label><label>正文<textarea rows={8} value={editing.body || ''} onChange={e => setEditing({ ...editing, body: e.target.value })} /></label>{(detailFields[editing.content_type] || []).map(field => <label key={field.key}>{field.label}{field.multiline ? <textarea rows={4} value={details[field.key] || ''} onChange={e => setDetails({ ...details, [field.key]: e.target.value })} /> : <input value={details[field.key] || ''} onChange={e => setDetails({ ...details, [field.key]: e.target.value })} />}</label>)}<label>发布状态<select value={editing.publish_status} onChange={e => setEditing({ ...editing, publish_status: e.target.value })}><option value="draft">草稿</option><option value="review">审核中</option><option value="published">已发布</option><option value="unpublished">已下线</option></select></label><div className="admin-actions"><button className="admin-button" type="submit">保存内容</button><button className="admin-quiet-button" type="button" onClick={() => setEditing(null)}>取消</button></div></form>}<div className="content-table">{contents.map(item => <div className="content-row" key={item.content_id}><div><strong>{item.title || '未命名内容'}</strong><span>{typeLabel(item.content_type)} · {statusLabels[item.publish_status] || item.publish_status}</span></div><button className="admin-quiet-button" onClick={() => beginEdit(item)}>编辑</button></div>)}</div></section>}
|
||||
{activeTab === 'password' && <section className="admin-section"><h2>修改管理员密码</h2><p className="admin-muted">修改后请使用新密码登录。建议使用容易记住但不容易被猜到的密码。</p><form onSubmit={changePassword} className="admin-form narrow"><label>当前密码<input type="password" value={currentPassword} onChange={e => setCurrentPassword(e.target.value)} required /></label><label>新密码<input type="password" minLength={8} value={newPassword} onChange={e => setNewPassword(e.target.value)} required /></label><button className="admin-button" type="submit">保存新密码</button></form></section>}
|
||||
</div></main>;
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: 'A态·入态',
|
||||
description: '企业开始进入AI时代企业进化的一种状态,建立基础能力与AI应用体系',
|
||||
canonical: '/amb/a',
|
||||
}),
|
||||
};
|
||||
|
||||
export default function AmbAPage() {
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: 'A/M-B', url: '/amb' },
|
||||
{ name: 'A态·入态', url: '/amb/a' },
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>A态·入态</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>定义</h2>
|
||||
<p>
|
||||
A态·入态,是企业开始进入AI时代企业进化的一种状态。企业开始建立AI时代进化认知,
|
||||
明确需要解决的方向,并启动基础性的能力、组织和AI应用建设。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>企业特征</h2>
|
||||
<ul>
|
||||
<li>传统运营模式为主</li>
|
||||
<li>数字化程度较低</li>
|
||||
<li>缺乏系统化的管理方法</li>
|
||||
<li>组织结构相对僵化</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>常见状态</h2>
|
||||
<ul>
|
||||
<li>业务增长遇到瓶颈</li>
|
||||
<li>运营效率有待提升</li>
|
||||
<li>组织能力跟不上业务发展</li>
|
||||
<li>缺乏清晰的发展战略</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>核心任务</h2>
|
||||
<ul>
|
||||
<li>建立数字化基础设施</li>
|
||||
<li>优化核心业务流程</li>
|
||||
<li>提升组织能力</li>
|
||||
<li>制定清晰的发展战略</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>关键进化动作</h2>
|
||||
<p>
|
||||
建立数字化基础设施、优化核心业务流程、提升组织能力、制定清晰的发展战略。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>典型障碍</h2>
|
||||
<ul>
|
||||
<li>缺乏数字化人才</li>
|
||||
<li>组织变革阻力大</li>
|
||||
<li>资源投入不足</li>
|
||||
<li>缺乏系统化的方法论</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关能力</h2>
|
||||
<p>
|
||||
<a href="/capabilities">查看阿美巴的企业进化能力</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关服务</h2>
|
||||
<p>
|
||||
<a href="/capabilities">查看阿美巴的服务</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关案例</h2>
|
||||
<p>
|
||||
<a href="/cases">查看相关案例</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/amb">A/M-B总览</a></li>
|
||||
<li><a href="/amb/m">M态·优态</a></li>
|
||||
<li><a href="/amb/b">B态·越态</a></li>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: 'B态·越态',
|
||||
description: '企业突破原有运行边界、形成新的企业运行能力的一种状态',
|
||||
canonical: '/amb/b',
|
||||
}),
|
||||
};
|
||||
|
||||
export default function AmbBPage() {
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: 'A/M-B', url: '/amb' },
|
||||
{ name: 'B态·越态', url: '/amb/b' },
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>B态·越态</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>定义</h2>
|
||||
<p>
|
||||
B态·越态,是企业突破原有运行边界、形成新的企业运行能力的一种状态。
|
||||
企业进一步通过组织重塑、系统重构、企业级AI等方式,形成新的经营与管理方式。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>企业特征</h2>
|
||||
<ul>
|
||||
<li>突破原有运行边界</li>
|
||||
<li>形成新的运行能力</li>
|
||||
<li>组织重塑与系统重构</li>
|
||||
<li>企业级AI应用</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>常见状态</h2>
|
||||
<ul>
|
||||
<li>业务模式创新</li>
|
||||
<li>组织架构重塑</li>
|
||||
<li>系统重构升级</li>
|
||||
<li>AI深度融合</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>关键进化动作</h2>
|
||||
<ul>
|
||||
<li>组织重塑与变革</li>
|
||||
<li>系统重构与升级</li>
|
||||
<li>企业级AI部署</li>
|
||||
<li>新业务模式探索</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>典型障碍</h2>
|
||||
<ul>
|
||||
<li>组织变革阻力</li>
|
||||
<li>系统重构复杂度</li>
|
||||
<li>AI技术应用难度</li>
|
||||
<li>文化转型挑战</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关能力</h2>
|
||||
<p>
|
||||
<a href="/capabilities">查看阿美巴的企业进化能力</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关服务</h2>
|
||||
<p>
|
||||
<a href="/capabilities">查看阿美巴的服务</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关案例</h2>
|
||||
<p>
|
||||
<a href="/cases">查看相关案例</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/amb">A/M-B总览</a></li>
|
||||
<li><a href="/amb/a">A态·入态</a></li>
|
||||
<li><a href="/amb/m">M态·优态</a></li>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: 'M态·优态',
|
||||
description: '企业进一步围绕现有经营与管理体系进行优化的一种状态',
|
||||
canonical: '/amb/m',
|
||||
}),
|
||||
};
|
||||
|
||||
export default function AmbMPage() {
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: 'A/M-B', url: '/amb' },
|
||||
{ name: 'M态·优态', url: '/amb/m' },
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>M态·优态</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>定义</h2>
|
||||
<p>
|
||||
M态·优态,是企业进一步围绕现有经营与管理体系进行优化的一种状态。
|
||||
企业重点围绕流程、组织、标准化、AI应用等持续优化,使企业形成更稳定、更可复制的运行能力。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>企业特征</h2>
|
||||
<ul>
|
||||
<li>数字化程度较高</li>
|
||||
<li>运营效率持续优化</li>
|
||||
<li>组织能力较强</li>
|
||||
<li>具备系统化的管理方法</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>常见状态</h2>
|
||||
<ul>
|
||||
<li>业务稳定增长</li>
|
||||
<li>运营效率较高</li>
|
||||
<li>组织能力匹配业务发展</li>
|
||||
<li>具备一定的创新能力</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>核心任务</h2>
|
||||
<ul>
|
||||
<li>持续优化运营效率</li>
|
||||
<li>提升组织创新能力</li>
|
||||
<li>拓展新的业务领域</li>
|
||||
<li>建立竞争优势</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>进化目标</h2>
|
||||
<p>
|
||||
从M态进化到B态,实现跨越式发展。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>典型障碍</h2>
|
||||
<ul>
|
||||
<li>创新动力不足</li>
|
||||
<li>组织惯性较大</li>
|
||||
<li>资源分配不够灵活</li>
|
||||
<li>缺乏突破性思维</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关能力</h2>
|
||||
<p>
|
||||
<a href="/capabilities">查看阿美巴的企业进化能力</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关服务</h2>
|
||||
<p>
|
||||
<a href="/capabilities">查看阿美巴的服务</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关案例</h2>
|
||||
<p>
|
||||
<a href="/cases">查看相关案例</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/amb">A/M-B总览</a></li>
|
||||
<li><a href="/amb/a">A态·入态</a></li>
|
||||
<li><a href="/amb/b">B态·越态</a></li>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
import { getSiteSettings } from '@/lib/settings';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: 'A/M-B企业进化路径|AI时代企业三态状态模型',
|
||||
description: 'A/M-B是阿美巴用于识别企业在AI时代进化状态的三态状态模型,包括A态·入态、M态·优态、B态·越态',
|
||||
canonical: '/amb',
|
||||
}),
|
||||
};
|
||||
|
||||
export default async function AMBPage() {
|
||||
const settings = await getSiteSettings();
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: 'A/M-B', url: '/amb' },
|
||||
];
|
||||
|
||||
const states = [
|
||||
{
|
||||
id: 'a',
|
||||
title: 'A态·入态',
|
||||
description: '企业开始进入AI时代企业进化的一种状态',
|
||||
link: '/amb/a',
|
||||
},
|
||||
{
|
||||
id: 'm',
|
||||
title: 'M态·优态',
|
||||
description: '企业进一步围绕现有经营与管理体系进行优化的一种状态',
|
||||
link: '/amb/m',
|
||||
},
|
||||
{
|
||||
id: 'b',
|
||||
title: 'B态·越态',
|
||||
description: '企业突破原有运行边界、形成新的企业运行能力的一种状态',
|
||||
link: '/amb/b',
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>{settings['amb.title'] || 'A/M-B三态模型:AI时代企业进化状态识别框架'}</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['amb.whatTitle'] || '什么是A/M-B'}</h2>
|
||||
<p>
|
||||
{settings['amb.intro'] || 'A/M-B是阿美巴用于识别企业在AI时代进化状态的三态状态模型,包括A态·入态、M态·优态、B态·越态。'}
|
||||
</p>
|
||||
<p>
|
||||
<strong>{settings['amb.whatNote'] || 'A/M-B不是产品套餐,不是收费等级,不是强制线性路径,不是所有企业必须经历的三个固定阶段。'}</strong>
|
||||
</p>
|
||||
<p>
|
||||
{settings['amb.whatPurpose'] || 'A/M-B的作用,是帮助企业识别自身所处状态,并进一步判断当前需要完成的关键进化动作。'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['amb.statesTitle'] || '三种状态'}</h2>
|
||||
<div className="amb-grid">
|
||||
{states.map((state) => (
|
||||
<div key={state.id} className="amb-card">
|
||||
<h3><a href={state.link}>{state.id === 'a' ? (settings['amb.stateA'] || state.title).split('|')[0] : state.id === 'm' ? (settings['amb.stateM'] || state.title).split('|')[0] : (settings['amb.stateB'] || state.title).split('|')[0]}</a></h3>
|
||||
<p>{state.id === 'a' ? (settings['amb.stateA'] || `A态·入态|${state.description}`).split('|').slice(1).join('|') : state.id === 'm' ? (settings['amb.stateM'] || `M态·优态|${state.description}`).split('|').slice(1).join('|') : (settings['amb.stateB'] || `B态·越态|${state.description}`).split('|').slice(1).join('|')}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['amb.recognitionTitle'] || '状态识别'}</h2>
|
||||
{(settings['amb.recognitionText'] || '企业可以根据自身情况处于不同状态,也不意味着所有企业必须从A到M再到B。\n企业需要根据自身发展阶段和实际情况,判断当前所处的状态,并确定需要完成的关键进化动作。').split('\n').map(text => <p key={text}>{text}</p>)}
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/amb/a">A态·入态</a></li>
|
||||
<li><a href="/amb/m">M态·优态</a></li>
|
||||
<li><a href="/amb/b">B态·越态</a></li>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
<li><a href="/capabilities">企业进化能力</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
import { getSiteSettings } from '@/lib/settings';
|
||||
|
||||
const API_URL = process.env.API_URL || 'http://localhost:3000';
|
||||
|
||||
async function getCapabilities() {
|
||||
try {
|
||||
const res = await fetch(`${API_URL}/api/contents/capability?pageSize=100`, {
|
||||
cache: 'no-store',
|
||||
});
|
||||
if (!res.ok) return [];
|
||||
const data = await res.json();
|
||||
return data.list || [];
|
||||
} catch (error) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '能力地图',
|
||||
description: '企业进化的完整能力体系,包括战略顶层设计、经营增长、组织重塑等能力',
|
||||
canonical: '/capabilities',
|
||||
}),
|
||||
};
|
||||
|
||||
export default async function CapabilitiesPage() {
|
||||
const capabilities = await getCapabilities();
|
||||
const settings = await getSiteSettings();
|
||||
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '能力地图', url: '/capabilities' },
|
||||
];
|
||||
|
||||
// 按类别分组
|
||||
const categorySet = new Set<string>();
|
||||
capabilities.forEach((c: any) => {
|
||||
categorySet.add(String(c.capability_type || '其他'));
|
||||
});
|
||||
const categories = Array.from(categorySet);
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>{settings['capabilities.title'] || '企业进化能力地图'}</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['capabilities.overviewTitle'] || '能力概述'}</h2>
|
||||
<p>
|
||||
{settings['capabilities.intro'] || '能力是底层实体,不是产品套餐。阿美巴提供完整的企业进化能力体系,帮助企业在战略、经营、组织、技术、AI等多个维度实现进化。'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['capabilities.categoryTitle'] || '能力分类'}</h2>
|
||||
{capabilities.length > 0 ? (
|
||||
categories.map((category: string) => (
|
||||
<div key={category} className="capability-category">
|
||||
<h3>{category}</h3>
|
||||
<div className="capability-list">
|
||||
{capabilities
|
||||
.filter((c: any) => String(c.capability_type || '其他') === category)
|
||||
.map((capability: any) => (
|
||||
<div key={capability.content_id} className="capability-card">
|
||||
<h4>{capability.title}</h4>
|
||||
<p>{capability.features || capability.body || ''}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<div className="empty-state">
|
||||
<p>暂无能力数据</p>
|
||||
<p>能力内容正在完善中,请稍后再来查看。</p>
|
||||
</div>
|
||||
)}
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
<li><a href="/amb">A/M-B进化路径</a></li>
|
||||
<li><a href="/cases">案例</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
import { getSiteSettings } from '@/lib/settings';
|
||||
|
||||
const API_URL = process.env.API_URL || 'http://localhost:24731';
|
||||
interface CaseItem { id: string; title: string; slug: string; client_name: string; industry: string; summary: string; }
|
||||
|
||||
async function getCases(): Promise<CaseItem[]> {
|
||||
try {
|
||||
const res = await fetch(`${API_URL}/api/contents/case?pageSize=100`, { cache: 'no-store' });
|
||||
if (!res.ok) return [];
|
||||
const data = await res.json();
|
||||
return (data.list || []).map((item: any) => ({ ...item, id: item.id || item.content_id, summary: item.summary || item.body || '' }));
|
||||
} catch { return []; }
|
||||
}
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '案例',
|
||||
description: '阿美巴将通过企业进化案例,展示企业在真实经营环境中的进化过程',
|
||||
canonical: '/cases',
|
||||
}),
|
||||
};
|
||||
|
||||
export default async function CasesPage() {
|
||||
const settings = await getSiteSettings();
|
||||
const cases = await getCases();
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '案例', url: '/cases' },
|
||||
];
|
||||
|
||||
// 案例列表 - 从CMS获取published状态的案例
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>{settings['cases.title'] || '企业进化案例'}</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['cases.overviewTitle'] || '案例概述'}</h2>
|
||||
<p>
|
||||
{settings['cases.intro'] || '阿美巴将通过企业进化案例,展示企业在真实经营环境中的目标、现状、障碍、根因、进化路径与实施过程。'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['cases.listTitle'] || '案例列表'}</h2>
|
||||
{cases.length > 0 ? (
|
||||
<div className="cases-grid">
|
||||
{cases.map((caseItem) => (
|
||||
<div key={caseItem.id} className="case-card">
|
||||
<h3>
|
||||
<a href={`/cases/${caseItem.slug}`}>{caseItem.title}</a>
|
||||
</h3>
|
||||
<p className="case-meta">
|
||||
<span>{caseItem.industry}</span>
|
||||
<span>{caseItem.client_name}</span>
|
||||
</p>
|
||||
<p>{caseItem.summary}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<div className="empty-state">
|
||||
<p>公开案例内容待进一步整理与发布。</p>
|
||||
</div>
|
||||
)}
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
<li><a href="/capabilities">能力地图</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '概念',
|
||||
description: '企业进化的知识实体概念列表,展示实体定义与关联关系',
|
||||
canonical: '/concepts',
|
||||
}),
|
||||
};
|
||||
|
||||
export default function ConceptsPage() {
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '概念', url: '/concepts' },
|
||||
];
|
||||
|
||||
// 概念列表 - 从CMS获取实体数据
|
||||
interface ConceptItem {
|
||||
id: string;
|
||||
name: string;
|
||||
slug: string;
|
||||
definition: string;
|
||||
description: string;
|
||||
}
|
||||
|
||||
const concepts: ConceptItem[] = [
|
||||
// 概念数据将从CMS接口获取
|
||||
// 示例结构:
|
||||
// {
|
||||
// id: 'entity-001',
|
||||
// name: '概念名称',
|
||||
// slug: 'concept-slug',
|
||||
// definition: '概念定义',
|
||||
// description: '概念描述',
|
||||
// }
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>概念</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>概念概述</h2>
|
||||
<p>
|
||||
概念是企业进化的知识实体,每个概念都有明确的定义和关联关系。
|
||||
通过概念可以理解企业进化的知识体系。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>概念列表</h2>
|
||||
{concepts.length > 0 ? (
|
||||
<div className="concepts-grid">
|
||||
{concepts.map((concept) => (
|
||||
<div key={concept.id} className="concept-card">
|
||||
<h3>
|
||||
<a href={`/concepts/${concept.slug}`}>{concept.name}</a>
|
||||
</h3>
|
||||
<p className="concept-definition">{concept.definition}</p>
|
||||
<p className="concept-description">{concept.description}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<div className="empty-state">
|
||||
<p>暂无概念数据</p>
|
||||
<p>概念内容正在完善中,请稍后再来查看。</p>
|
||||
</div>
|
||||
)}
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/knowledge">知识中心</a></li>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
import { getSiteSettings } from '@/lib/settings';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '联系我们',
|
||||
description: '联系阿美巴AI,了解企业进化服务',
|
||||
canonical: '/contact',
|
||||
}),
|
||||
};
|
||||
|
||||
function list(value: string | undefined, fallback: string[]) {
|
||||
return (value ? value.split('\n').map(item => item.trim()).filter(Boolean) : fallback);
|
||||
}
|
||||
|
||||
export default async function ContactPage() {
|
||||
const settings = await getSiteSettings();
|
||||
const consultationItems = list(settings['contact.consultationItems'], ['企业进化诊断', '进化路径规划', '战略咨询', '组织变革咨询', 'AI部署咨询']);
|
||||
const cooperationItems = list(settings['contact.cooperationItems'], ['顾问服务', '咨询服务', '企业陪跑', '定制化服务']);
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '联系我们', url: '/contact' },
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>{settings['contact.title'] || '联系我们'}</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['contact.contactTitle'] || '联系方式'}</h2>
|
||||
<div className="contact-info">
|
||||
<div className="contact-item">
|
||||
<h3>邮箱</h3>
|
||||
<p>{settings['contact.email'] || 'contact@ameiba.com'}</p>
|
||||
</div>
|
||||
<div className="contact-item">
|
||||
<h3>电话</h3>
|
||||
<p>{settings['contact.phone'] || '待填充'}</p>
|
||||
</div>
|
||||
<div className="contact-item">
|
||||
<h3>地址</h3>
|
||||
<p>{settings['contact.address'] || '待填充'}</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['contact.serviceHoursTitle'] || '服务时间'}</h2>
|
||||
<p>
|
||||
{settings['contact.serviceHours'] || '周一至周五:9:00 - 18:00'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['contact.consultationTitle'] || '咨询服务'}</h2>
|
||||
<p>
|
||||
{settings['contact.consultationIntro'] || '我们提供以下咨询服务:'}
|
||||
</p>
|
||||
<ul>
|
||||
{consultationItems.map(item => <li key={item}>{item}</li>)}
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['contact.cooperationTitle'] || '合作方式'}</h2>
|
||||
<ul>
|
||||
{cooperationItems.map(item => <li key={item}>{item}</li>)}
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['contact.faqTitle'] || '常见问题'}</h2>
|
||||
<p>
|
||||
{settings['contact.faqText'] || '如有其他问题,请查看'}<a href="/faq">常见问题</a>或直接联系我们。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>{settings['contact.relatedTitle'] || '相关知识'}</h2>
|
||||
<ul>
|
||||
<li><a href="/capabilities">能力地图</a></li>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '进化方法',
|
||||
description: '企业进化的方法论:以终为始、目标先于问题、现状分析、差距识别、根因分析、路径规划、实施迭代',
|
||||
canonical: '/evolution/method',
|
||||
}),
|
||||
};
|
||||
|
||||
export default function EvolutionMethodPage() {
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '企业进化', url: '/evolution' },
|
||||
{ name: '进化方法', url: '/evolution/method' },
|
||||
];
|
||||
|
||||
const methods = [
|
||||
{
|
||||
id: 'goal-first',
|
||||
title: '以终为始',
|
||||
description: '先明确企业进化的终极目标,再反推实现路径',
|
||||
},
|
||||
{
|
||||
id: 'goal-before-problem',
|
||||
title: '目标先于问题',
|
||||
description: '先设定目标,再分析现状与问题,避免被问题牵着走',
|
||||
},
|
||||
{
|
||||
id: 'current-analysis',
|
||||
title: '现状分析',
|
||||
description: '全面评估企业当前状态,包括战略、组织、流程、能力等',
|
||||
},
|
||||
{
|
||||
id: 'gap-identification',
|
||||
title: '差距识别',
|
||||
description: '对比目标与现状,识别关键差距与改进空间',
|
||||
},
|
||||
{
|
||||
id: 'root-cause',
|
||||
title: '根因分析',
|
||||
description: '深入分析问题根源,找到制约企业发展的根本因素',
|
||||
},
|
||||
{
|
||||
id: 'path-planning',
|
||||
title: '路径规划',
|
||||
description: '制定系统化的进化路径,明确阶段性目标与里程碑',
|
||||
},
|
||||
{
|
||||
id: 'implementation',
|
||||
title: '实施迭代',
|
||||
description: '分阶段实施,持续迭代优化,确保进化效果',
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>企业进化方法</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>核心理念</h2>
|
||||
<p>
|
||||
企业进化方法的核心是以终为始,目标先于问题。我们首先明确企业进化的终极目标,
|
||||
然后反推实现路径,确保每一步都朝着目标前进。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>方法论框架</h2>
|
||||
<div className="method-grid">
|
||||
{methods.map((method, index) => (
|
||||
<div key={method.id} className="method-card">
|
||||
<h3>{index + 1}. {method.title}</h3>
|
||||
<p>{method.description}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>为什么目标先于问题</h2>
|
||||
<p>
|
||||
传统的问题导向方法容易让企业陷入"救火"模式,被动应对各种问题。
|
||||
而目标导向的方法让企业主动设定方向,有计划地推进进化。
|
||||
</p>
|
||||
<p>
|
||||
只有先明确目标,才能判断哪些问题是真正需要解决的,
|
||||
哪些问题是次要的,从而集中资源解决关键问题。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
<li><a href="/amb">A/M-B进化路径</a></li>
|
||||
<li><a href="/capabilities">企业进化能力</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
import { getSiteSettings } from '@/lib/settings';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '企业进化',
|
||||
description: '企业进化是企业围绕长期发展目标持续调整、重构与升级的过程',
|
||||
canonical: '/evolution',
|
||||
}),
|
||||
};
|
||||
|
||||
export default async function EvolutionPage() {
|
||||
const settings = await getSiteSettings();
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '企业进化', url: '/evolution' },
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>{settings['evolution.title'] || '企业进化'}</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['evolution.definitionTitle'] || '什么是企业进化'}</h2>
|
||||
<p>
|
||||
{settings['evolution.intro'] || '企业进化,是企业围绕长期发展目标,在战略、经营、商业模式、组织、价值、AI适应以及底层管理能力等方面持续调整、重构与升级,从而形成长期发展能力的过程。'}
|
||||
</p>
|
||||
<p>
|
||||
{settings['evolution.definitionMore'] || '增长更多体现结果层变化。进化更强调底层能力、系统与企业状态的持续调整和升级。AI是时代变量和重要赋能工具,不是企业进化本身的终点。'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['evolution.whyTitle'] || '为什么需要企业进化'}</h2>
|
||||
<p>
|
||||
{settings['evolution.whyIntro'] || '在AI时代,企业面临着前所未有的挑战:'}
|
||||
</p>
|
||||
<ul>
|
||||
{(settings['evolution.whyItems'] || '技术快速迭代,传统业务模式面临冲击\n客户需求变化,个性化、智能化要求提高\n竞争环境加剧,需要更高效的运营模式\n人才结构变化,需要新的组织能力').split('\n').map(item => <li key={item}>{item}</li>)}
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>企业进化方法</h2>
|
||||
<p>
|
||||
<a href="/evolution/method">了解企业进化的方法论与实施路径</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/evolution/method">进化方法</a></li>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
<li><a href="/amb">A/M-B进化路径</a></li>
|
||||
<li><a href="/capabilities">企业进化能力</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema, generateFAQSchema } from '@/lib/seo';
|
||||
import { getSiteSettings } from '@/lib/settings';
|
||||
|
||||
const API_URL = process.env.API_URL || 'http://localhost:3000';
|
||||
|
||||
async function getFAQs() {
|
||||
try {
|
||||
const res = await fetch(`${API_URL}/api/contents/faq?pageSize=100`, {
|
||||
cache: 'no-store',
|
||||
});
|
||||
if (!res.ok) return [];
|
||||
const data = await res.json();
|
||||
return data.list || [];
|
||||
} catch (error) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: 'FAQ',
|
||||
description: '常见问题解答,链接到对应知识实体页面',
|
||||
canonical: '/faq',
|
||||
}),
|
||||
};
|
||||
|
||||
export default async function FAQPage() {
|
||||
const faqs = await getFAQs();
|
||||
const settings = await getSiteSettings();
|
||||
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: 'FAQ', url: '/faq' },
|
||||
];
|
||||
|
||||
// 生成FAQ Schema
|
||||
const faqSchema = generateFAQSchema(
|
||||
faqs.map((faq: any) => ({
|
||||
question: faq.question,
|
||||
answer: faq.answer,
|
||||
}))
|
||||
);
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(faqSchema),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>{settings['faq.title'] || '常见问题'}</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['faq.overviewTitle'] || 'FAQ概述'}</h2>
|
||||
<p>
|
||||
{settings['faq.intro'] || '以下是关于企业进化的常见问题解答。每个答案都链接到相关的知识实体页面,方便深入了解。'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['faq.listTitle'] || '问题列表'}</h2>
|
||||
{faqs.length > 0 ? (
|
||||
<div className="faq-list">
|
||||
{faqs.map((faq: any) => (
|
||||
<div key={faq.content_id} className="faq-item">
|
||||
<h3>{faq.question}</h3>
|
||||
<div className="faq-answer">
|
||||
<p>{faq.answer}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<div className="empty-state">
|
||||
<p>暂无FAQ数据</p>
|
||||
<p>FAQ内容正在完善中,请稍后再来查看。</p>
|
||||
</div>
|
||||
)}
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/knowledge">知识中心</a></li>
|
||||
<li><a href="/concepts">概念</a></li>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
import { getSiteSettings } from '@/lib/settings';
|
||||
|
||||
const API_URL = process.env.API_URL || 'http://localhost:24731';
|
||||
interface ArticleItem { id: string; title: string; slug: string; category: string; summary: string; author: string; date: string; }
|
||||
|
||||
async function getArticles(): Promise<ArticleItem[]> {
|
||||
try {
|
||||
const res = await fetch(`${API_URL}/api/contents/article?pageSize=100`, { cache: 'no-store' });
|
||||
if (!res.ok) return [];
|
||||
const data = await res.json();
|
||||
return (data.list || []).map((item: any) => ({ ...item, id: item.id || item.content_id, summary: item.summary || item.body || '', date: item.date || item.created_at || '' }));
|
||||
} catch { return []; }
|
||||
}
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '知识中心',
|
||||
description: '企业进化的知识体系与方法论,包括企业进化、AI时代企业、企业经营等分类',
|
||||
canonical: '/knowledge',
|
||||
}),
|
||||
};
|
||||
|
||||
export default async function KnowledgePage() {
|
||||
const settings = await getSiteSettings();
|
||||
const articles = await getArticles();
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '知识中心', url: '/knowledge' },
|
||||
];
|
||||
|
||||
// 知识分类
|
||||
const categories = [
|
||||
{ id: 'evolution', name: '企业进化', count: 0 },
|
||||
{ id: 'ai-era', name: 'AI时代企业', count: 0 },
|
||||
{ id: 'management', name: '企业经营', count: 0 },
|
||||
{ id: 'organization', name: '组织重塑', count: 0 },
|
||||
{ id: 'values', name: '四大价值', count: 0 },
|
||||
{ id: 'ai-organization', name: 'AI组织', count: 0 },
|
||||
{ id: 'enterprise-management', name: '企业管理', count: 0 },
|
||||
{ id: 'methodology', name: '方法论', count: 0 },
|
||||
{ id: 'cases', name: '案例', count: 0 },
|
||||
{ id: 'observation', name: '企业观察', count: 0 },
|
||||
{ id: 'viewpoint', name: '阿美巴观点', count: 0 },
|
||||
{ id: 'faq', name: 'FAQ', count: 0 },
|
||||
];
|
||||
|
||||
// 文章列表 - 从CMS获取published状态的文章
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>{settings['knowledge.title'] || '知识中心'}</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['knowledge.systemTitle'] || '知识体系'}</h2>
|
||||
<p>
|
||||
{settings['knowledge.intro'] || '知识中心汇集了企业进化的知识体系与方法论,帮助企业理解和掌握AI时代的经营管理方法。'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['knowledge.categoryTitle'] || '知识分类'}</h2>
|
||||
<div className="category-grid">
|
||||
{categories.map((category) => (
|
||||
<div key={category.id} className="category-card">
|
||||
<h3>{category.name}</h3>
|
||||
<p>{category.count} 篇文章</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['knowledge.articleTitle'] || '最新文章'}</h2>
|
||||
{articles.length > 0 ? (
|
||||
<div className="articles-list">
|
||||
{articles.map((article) => (
|
||||
<div key={article.id} className="article-card">
|
||||
<h3>
|
||||
<a href={`/knowledge/${article.slug}`}>{article.title}</a>
|
||||
</h3>
|
||||
<p className="article-meta">
|
||||
<span>{article.category}</span>
|
||||
<span>{article.author}</span>
|
||||
<span>{article.date}</span>
|
||||
</p>
|
||||
<p>{article.summary}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<div className="empty-state">
|
||||
<p>暂无文章数据</p>
|
||||
<p>文章内容正在完善中,请稍后再来查看。</p>
|
||||
</div>
|
||||
)}
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
<li><a href="/concepts">概念</a></li>
|
||||
<li><a href="/faq">FAQ</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
import type { Metadata } from 'next';
|
||||
import '@/styles/globals.css';
|
||||
import { getSiteSettings } from '@/lib/settings';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: {
|
||||
default: '阿美巴AI官网 - AI时代企业进化平台',
|
||||
template: '%s | 阿美巴AI官网',
|
||||
},
|
||||
description: '阿美巴AI - 专注AI时代企业进化,提供战略顶层设计、经营增长、组织重塑等企业进化能力与服务',
|
||||
keywords: ['阿美巴', 'AI', '企业进化', '战略咨询', '组织重塑', '经营增长'],
|
||||
openGraph: {
|
||||
type: 'website',
|
||||
locale: 'zh_CN',
|
||||
url: 'https://ameiba.com',
|
||||
siteName: '阿美巴AI官网',
|
||||
images: [
|
||||
{
|
||||
url: '/og-default.jpg',
|
||||
width: 1200,
|
||||
height: 630,
|
||||
alt: '阿美巴AI官网',
|
||||
},
|
||||
],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
},
|
||||
robots: {
|
||||
index: true,
|
||||
follow: true,
|
||||
googleBot: {
|
||||
index: true,
|
||||
follow: true,
|
||||
'max-video-preview': -1,
|
||||
'max-image-preview': 'large',
|
||||
'max-snippet': -1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default async function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
const settings = await getSiteSettings();
|
||||
const siteName = settings['site.name'] || '阿美巴AI';
|
||||
return (
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charSet="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
</head>
|
||||
<body>
|
||||
<header className="site-header">
|
||||
<div className="container">
|
||||
<nav className="main-nav">
|
||||
<a href="/" className="logo"><img className="brand-logo" src="/images/logo.png" alt="阿美巴AI Logo" />{siteName}</a>
|
||||
<ul className="nav-links">
|
||||
<li><a href="/about">阿美巴</a></li>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
<li><a href="/amb">A/M-B</a></li>
|
||||
<li><a href="/capabilities">能力地图</a></li>
|
||||
<li><a href="/cases">案例</a></li>
|
||||
<li><a href="/knowledge">知识中心</a></li>
|
||||
<li><a href="/faq">FAQ</a></li>
|
||||
<li><a href="/contact">联系我们</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main className="main-content">
|
||||
{children}
|
||||
</main>
|
||||
|
||||
<footer className="site-footer">
|
||||
<div className="container">
|
||||
<div className="footer-content">
|
||||
<div className="footer-info">
|
||||
<p>{settings['site.footerCopyright'] || '© 2026 阿美巴AI. All rights reserved.'}</p>
|
||||
<div className="footer-contact">
|
||||
<a href={`mailto:${settings['site.footerEmail'] || 'ameiba0258@gmail.com'}`}>{settings['site.footerEmail'] || 'ameiba0258@gmail.com'}</a>
|
||||
<a href={`tel:${settings['site.footerPhone'] || '4009080258'}`}>{settings['site.footerPhone'] || '4009080258'}</a>
|
||||
<span>{settings['site.footerAddress'] || '四川省成都市双流区正兴街道湖畔路北段366号1栋3楼1号'}</span>
|
||||
</div>
|
||||
<a className="icp-link" href="https://beian.miit.gov.cn/" target="_blank" rel="noreferrer"><img className="icp-badge" src="/images/icp.png" alt="备案徽章" />{settings['site.icp'] || '蜀ICP备2025143754号-7'}</a>
|
||||
</div>
|
||||
<a href="/admin" className="admin-link">管理</a>
|
||||
<div className="footer-links">
|
||||
<a href="/about">关于我们</a>
|
||||
<a href="/knowledge">知识中心</a>
|
||||
<a href="/contact">联系我们</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,167 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '企业需求与能力匹配',
|
||||
description: '基于企业特征匹配进化能力与服务,展示匹配知识结构',
|
||||
canonical: '/match',
|
||||
}),
|
||||
};
|
||||
|
||||
export default function MatchPage() {
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '企业需求与能力匹配', url: '/match' },
|
||||
];
|
||||
|
||||
// 匹配逻辑结构
|
||||
const matchStructure = [
|
||||
{
|
||||
id: 'company-type',
|
||||
title: '企业类型',
|
||||
description: '根据企业所属行业和规模进行分类。阿美巴重点关注中小企业、实体企业、制造型企业,其他类型企业可根据具体情况判断是否适配。',
|
||||
options: ['制造业', '服务业', '科技企业', '传统企业', '初创企业'],
|
||||
},
|
||||
{
|
||||
id: 'company-stage',
|
||||
title: '企业阶段',
|
||||
description: '根据企业发展阶段进行分类',
|
||||
options: ['A态·入态', 'M态·优态', 'B态·越态'],
|
||||
},
|
||||
{
|
||||
id: 'evolution-goal',
|
||||
title: '进化目标',
|
||||
description: '企业希望实现的进化目标',
|
||||
options: ['数字化转型', '效率提升', '创新增长', '组织重塑'],
|
||||
},
|
||||
{
|
||||
id: 'current-status',
|
||||
title: '当前状态',
|
||||
description: '企业当前的运营状态',
|
||||
options: ['增长瓶颈', '效率低下', '创新不足', '组织僵化'],
|
||||
},
|
||||
{
|
||||
id: 'key-obstacles',
|
||||
title: '关键障碍',
|
||||
description: '制约企业发展的关键因素',
|
||||
options: ['人才短缺', '技术落后', '流程混乱', '文化阻力'],
|
||||
},
|
||||
{
|
||||
id: 'company-needs',
|
||||
title: '企业需求',
|
||||
description: '企业当前的核心需求',
|
||||
options: ['战略规划', '组织优化', '技术升级', '人才培养'],
|
||||
},
|
||||
{
|
||||
id: 'ameiba-capability',
|
||||
title: '阿美巴能力',
|
||||
description: '阿美巴可以提供的能力支持',
|
||||
options: ['战略顶层设计', '组织重塑', 'AI部署', '经营分析'],
|
||||
},
|
||||
{
|
||||
id: 'adaptive-service',
|
||||
title: '适配服务',
|
||||
description: '根据需求匹配的具体服务',
|
||||
options: ['顾问服务', '咨询服务', '企业陪跑', '定制化服务'],
|
||||
},
|
||||
{
|
||||
id: 'case-evidence',
|
||||
title: '案例佐证',
|
||||
description: '相关的成功案例',
|
||||
options: [],
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>企业需求与能力匹配</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>匹配概述</h2>
|
||||
<p>
|
||||
本页面展示企业需求与阿美巴能力的匹配知识结构。
|
||||
<strong>这是信息结构与匹配逻辑说明,不是在线诊断工具。</strong>
|
||||
</p>
|
||||
<p>
|
||||
企业可以根据自身特征,了解如何匹配阿美巴的能力与服务。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>匹配逻辑</h2>
|
||||
<div className="match-flow">
|
||||
{matchStructure.map((item, index) => (
|
||||
<div key={item.id} className="match-step">
|
||||
<h3>{index + 1}. {item.title}</h3>
|
||||
<p>{item.description}</p>
|
||||
{item.options.length > 0 && (
|
||||
<ul className="match-options">
|
||||
{item.options.map((option, optionIndex) => (
|
||||
<li key={optionIndex}>{option}</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>使用说明</h2>
|
||||
<ol>
|
||||
<li>首先确定企业类型和阶段</li>
|
||||
<li>明确进化目标和当前状态</li>
|
||||
<li>识别关键障碍和企业需求</li>
|
||||
<li>匹配阿美巴的能力和服务</li>
|
||||
<li>参考相关案例佐证</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>注意事项</h2>
|
||||
<ul>
|
||||
<li>本页面仅为知识结构说明</li>
|
||||
<li>不做在线诊断、自动评分</li>
|
||||
<li>不做AI问答、自动推荐</li>
|
||||
<li>如需专业诊断,请<a href="/contact">联系我们</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/capabilities">能力地图</a></li>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
<li><a href="/amb">A/M-B进化路径</a></li>
|
||||
<li><a href="/cases">案例</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateOrganizationSchema, generateWebSiteSearchAction } from '@/lib/seo';
|
||||
import { getSiteSettings } from '@/lib/settings';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '阿美巴AI - AI时代企业进化平台',
|
||||
description: '阿美巴AI专注AI时代企业进化,提供战略顶层设计、经营增长、组织重塑等企业进化能力与服务,帮助企业实现从A态到M态再到B态的进化。',
|
||||
canonical: '/',
|
||||
}),
|
||||
};
|
||||
|
||||
export default async function HomePage() {
|
||||
const settings = await getSiteSettings();
|
||||
// 首页认知浓度顺序:按产品总指令排列
|
||||
const cognitiveSections = [
|
||||
{
|
||||
id: 'who-we-are',
|
||||
title: '我们是谁',
|
||||
description: '阿美巴(Ameiba)是AI时代企业进化平台',
|
||||
link: '/about',
|
||||
},
|
||||
{
|
||||
id: 'what-is-evolution',
|
||||
title: '什么是企业进化',
|
||||
description: '企业进化是企业围绕长期发展目标持续调整、重构与升级的过程',
|
||||
link: '/evolution',
|
||||
},
|
||||
{
|
||||
id: 'goal-before-problem',
|
||||
title: '为什么目标先于问题',
|
||||
description: '以终为始,先明确进化目标,再分析现状差距',
|
||||
link: '/evolution/method',
|
||||
},
|
||||
{
|
||||
id: 'evolution-method',
|
||||
title: '企业进化方法',
|
||||
description: '系统化的企业进化方法论与实施路径',
|
||||
link: '/evolution/method',
|
||||
},
|
||||
{
|
||||
id: 'four-values',
|
||||
title: '四大价值',
|
||||
description: '价值创造、价值传递、价值交付、价值支持',
|
||||
link: '/value',
|
||||
},
|
||||
{
|
||||
id: 'amb-path',
|
||||
title: 'A/M-B三态状态模型',
|
||||
description: 'AI时代企业进化状态识别框架',
|
||||
link: '/amb',
|
||||
},
|
||||
{
|
||||
id: 'capabilities',
|
||||
title: '企业进化能力',
|
||||
description: '支撑企业进化的完整能力体系',
|
||||
link: '/capabilities',
|
||||
},
|
||||
{
|
||||
id: 'cases',
|
||||
title: '企业进化案例',
|
||||
description: '企业在真实经营环境中的进化过程',
|
||||
link: '/cases',
|
||||
},
|
||||
{
|
||||
id: 'knowledge',
|
||||
title: '知识中心',
|
||||
description: '企业进化的知识体系与方法论',
|
||||
link: '/knowledge',
|
||||
},
|
||||
{
|
||||
id: 'match',
|
||||
title: '企业需求与能力匹配',
|
||||
description: '基于企业特征匹配进化能力与服务',
|
||||
link: '/match',
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateOrganizationSchema()),
|
||||
}}
|
||||
/>
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateWebSiteSearchAction()),
|
||||
}}
|
||||
/>
|
||||
|
||||
{/* 首页内容 - 服务端渲染 */}
|
||||
<section className="hero-section">
|
||||
<div className="container">
|
||||
<h1>{settings['home.heroTitle'] || '阿美巴(Ameiba)'}</h1>
|
||||
<p className="hero-subtitle">{settings['home.heroSubtitle'] || 'AI时代企业进化平台'}</p>
|
||||
<p className="hero-description">
|
||||
{settings['home.heroDescription'] || '我们帮助企业在AI时代实现系统化进化,从战略顶层设计到组织重塑,从经营增长到AI部署,提供完整的企业进化能力与服务。'}
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="cognitive-section">
|
||||
<div className="container">
|
||||
<h2>企业进化知识体系</h2>
|
||||
<div className="cognitive-grid">
|
||||
{cognitiveSections.map((section) => (
|
||||
<div key={section.id} className="cognitive-card">
|
||||
<h3>
|
||||
<a href={section.link}>{section.title}</a>
|
||||
</h3>
|
||||
<p>{section.description}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="contact-section">
|
||||
<div className="container text-center">
|
||||
<h2>联系我们</h2>
|
||||
<p>了解如何帮助您的企业实现进化</p>
|
||||
<a href="/contact" className="btn btn-primary">
|
||||
联系我们
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import { MetadataRoute } from 'next';
|
||||
|
||||
export default function robots(): MetadataRoute.Robots {
|
||||
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://ameiba.com';
|
||||
|
||||
return {
|
||||
rules: [
|
||||
{
|
||||
userAgent: '*',
|
||||
allow: '/',
|
||||
disallow: ['/api/', '/admin/'],
|
||||
},
|
||||
],
|
||||
sitemap: `${baseUrl}/sitemap.xml`,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
import { MetadataRoute } from 'next';
|
||||
|
||||
const BASE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'https://ameiba.com';
|
||||
|
||||
export default function sitemap(): MetadataRoute.Sitemap {
|
||||
// 静态页面
|
||||
const staticPages = [
|
||||
{ url: BASE_URL, lastModified: new Date(), changeFrequency: 'weekly' as const, priority: 1.0 },
|
||||
{ url: `${BASE_URL}/about`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.8 },
|
||||
{ url: `${BASE_URL}/evolution`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.8 },
|
||||
{ url: `${BASE_URL}/evolution/method`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.7 },
|
||||
{ url: `${BASE_URL}/value`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.8 },
|
||||
{ url: `${BASE_URL}/value/creation`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.7 },
|
||||
{ url: `${BASE_URL}/value/transfer`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.7 },
|
||||
{ url: `${BASE_URL}/value/delivery`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.7 },
|
||||
{ url: `${BASE_URL}/value/support`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.7 },
|
||||
{ url: `${BASE_URL}/amb`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.8 },
|
||||
{ url: `${BASE_URL}/amb/a`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.7 },
|
||||
{ url: `${BASE_URL}/amb/m`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.7 },
|
||||
{ url: `${BASE_URL}/amb/b`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.7 },
|
||||
{ url: `${BASE_URL}/capabilities`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.8 },
|
||||
{ url: `${BASE_URL}/cases`, lastModified: new Date(), changeFrequency: 'weekly' as const, priority: 0.8 },
|
||||
{ url: `${BASE_URL}/knowledge`, lastModified: new Date(), changeFrequency: 'weekly' as const, priority: 0.8 },
|
||||
{ url: `${BASE_URL}/concepts`, lastModified: new Date(), changeFrequency: 'weekly' as const, priority: 0.7 },
|
||||
{ url: `${BASE_URL}/faq`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.7 },
|
||||
{ url: `${BASE_URL}/match`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.7 },
|
||||
{ url: `${BASE_URL}/contact`, lastModified: new Date(), changeFrequency: 'monthly' as const, priority: 0.6 },
|
||||
];
|
||||
|
||||
// 动态页面(从CMS获取)
|
||||
// 这里需要在实际部署时从API获取数据
|
||||
// 暂时返回静态页面
|
||||
const dynamicPages: MetadataRoute.Sitemap = [];
|
||||
|
||||
return [...staticPages, ...dynamicPages];
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '价值创造',
|
||||
description: '企业如何创造价值,包括产品创新、服务创新、商业模式创新等',
|
||||
canonical: '/value/creation',
|
||||
}),
|
||||
};
|
||||
|
||||
export default function ValueCreationPage() {
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '四大价值', url: '/value' },
|
||||
{ name: '价值创造', url: '/value/creation' },
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>价值创造</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>官方定义</h2>
|
||||
<p>
|
||||
价值创造是企业通过创新和优化,为客户和自身创造新价值的过程。
|
||||
它包括产品创新、服务创新、商业模式创新等多个维度。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>核心逻辑</h2>
|
||||
<p>
|
||||
价值创造的核心是发现并满足客户需求,通过创新提供更好的产品或服务,
|
||||
从而获得市场认可和商业回报。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>企业常见问题</h2>
|
||||
<ul>
|
||||
<li>如何发现新的价值创造机会?</li>
|
||||
<li>如何平衡创新与风险?</li>
|
||||
<li>如何建立持续创新的能力?</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>与其他价值的关系</h2>
|
||||
<p>
|
||||
价值创造是四大价值的基础。只有创造出有价值的产品或服务,
|
||||
才能进行价值传递、交付和支持。
|
||||
</p>
|
||||
<ul>
|
||||
<li><a href="/value/transfer">价值传递</a>:将创造的价值传递给客户</li>
|
||||
<li><a href="/value/delivery">价值交付</a>:将创造的价值交付给客户</li>
|
||||
<li><a href="/value/support">价值支持</a>:支持价值创造的过程</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>阿美巴相关能力</h2>
|
||||
<p>
|
||||
<a href="/capabilities">查看阿美巴的企业进化能力</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关案例</h2>
|
||||
<p>
|
||||
<a href="/cases">查看相关案例</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
<li><a href="/value/transfer">价值传递</a></li>
|
||||
<li><a href="/value/delivery">价值交付</a></li>
|
||||
<li><a href="/value/support">价值支持</a></li>
|
||||
<li><a href="/capabilities">企业进化能力</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '价值交付',
|
||||
description: '企业如何交付价值,包括生产、运营、服务等',
|
||||
canonical: '/value/delivery',
|
||||
}),
|
||||
};
|
||||
|
||||
export default function ValueDeliveryPage() {
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '四大价值', url: '/value' },
|
||||
{ name: '价值交付', url: '/value/delivery' },
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>价值交付</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>官方定义</h2>
|
||||
<p>
|
||||
价值交付是企业将创造的价值实际提供给客户的过程。
|
||||
它包括生产制造、运营执行、客户服务等多个环节。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>核心逻辑</h2>
|
||||
<p>
|
||||
价值交付的核心是确保客户能够顺利获得并使用企业提供的价值,
|
||||
从而实现客户满意度和企业收益。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>企业常见问题</h2>
|
||||
<ul>
|
||||
<li>如何提高交付效率?</li>
|
||||
<li>如何保证交付质量?</li>
|
||||
<li>如何优化客户体验?</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>与其他价值的关系</h2>
|
||||
<p>
|
||||
价值交付是价值创造和传递的最终实现。
|
||||
</p>
|
||||
<ul>
|
||||
<li><a href="/value/creation">价值创造</a>:提供交付的内容</li>
|
||||
<li><a href="/value/transfer">价值传递</a>:引导交付的过程</li>
|
||||
<li><a href="/value/support">价值支持</a>:支持交付的能力</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>阿美巴相关能力</h2>
|
||||
<p>
|
||||
<a href="/capabilities">查看阿美巴的企业进化能力</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关案例</h2>
|
||||
<p>
|
||||
<a href="/cases">查看相关案例</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
<li><a href="/value/creation">价值创造</a></li>
|
||||
<li><a href="/value/transfer">价值传递</a></li>
|
||||
<li><a href="/value/support">价值支持</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
import { getSiteSettings } from '@/lib/settings';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '四大价值',
|
||||
description: '企业进化的四大价值:价值创造、价值传递、价值交付、价值支持',
|
||||
canonical: '/value',
|
||||
}),
|
||||
};
|
||||
|
||||
export default async function ValuePage() {
|
||||
const settings = await getSiteSettings();
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '四大价值', url: '/value' },
|
||||
];
|
||||
|
||||
const values = [
|
||||
{
|
||||
id: 'creation',
|
||||
title: '价值创造',
|
||||
description: '企业如何创造价值,包括产品创新、服务创新、商业模式创新等',
|
||||
link: '/value/creation',
|
||||
},
|
||||
{
|
||||
id: 'transfer',
|
||||
title: '价值传递',
|
||||
description: '企业如何将价值传递给客户,包括营销、销售、渠道等',
|
||||
link: '/value/transfer',
|
||||
},
|
||||
{
|
||||
id: 'delivery',
|
||||
title: '价值交付',
|
||||
description: '企业如何交付价值,包括生产、运营、服务等',
|
||||
link: '/value/delivery',
|
||||
},
|
||||
{
|
||||
id: 'support',
|
||||
title: '价值支持',
|
||||
description: '企业如何支持价值创造与交付,包括组织、流程、IT等',
|
||||
link: '/value/support',
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>{settings['value.title'] || '四大价值'}</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['value.overviewTitle'] || '价值体系概述'}</h2>
|
||||
<p>
|
||||
{settings['value.intro'] || '企业进化的核心是价值体系的进化。四大价值构成了企业创造、传递、交付和支持价值的完整体系,是企业进化的基础框架。'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['value.valuesTitle'] || '四大价值'}</h2>
|
||||
<div className="value-grid">
|
||||
{values.map((value) => (
|
||||
<div key={value.id} className="value-card">
|
||||
<h3>
|
||||
<a href={value.link}>{value.title}</a>
|
||||
</h3>
|
||||
<p>{value.description}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>{settings['value.relationTitle'] || '价值体系的关系'}</h2>
|
||||
<p>
|
||||
{settings['value.relationText'] || '四大价值相互关联、相互支撑。价值创造是基础,价值传递是桥梁,价值交付是结果,价值支持是保障。企业需要在这四个维度上协调发展,才能实现持续增长。'}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/value/creation">价值创造</a></li>
|
||||
<li><a href="/value/transfer">价值传递</a></li>
|
||||
<li><a href="/value/delivery">价值交付</a></li>
|
||||
<li><a href="/value/support">价值支持</a></li>
|
||||
<li><a href="/evolution">企业进化</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '价值支持',
|
||||
description: '企业如何支持价值创造与交付,包括组织、流程、IT等',
|
||||
canonical: '/value/support',
|
||||
}),
|
||||
};
|
||||
|
||||
export default function ValueSupportPage() {
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '四大价值', url: '/value' },
|
||||
{ name: '价值支持', url: '/value/support' },
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>价值支持</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>官方定义</h2>
|
||||
<p>
|
||||
价值支持是企业为价值创造、传递和交付提供基础保障的过程。
|
||||
它包括组织架构、流程体系、IT系统、人力资源等多个方面。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>核心逻辑</h2>
|
||||
<p>
|
||||
价值支持的核心是构建高效、灵活、可扩展的支撑体系,
|
||||
确保价值创造、传递和交付能够顺利进行。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>企业常见问题</h2>
|
||||
<ul>
|
||||
<li>如何构建高效的组织架构?</li>
|
||||
<li>如何优化业务流程?</li>
|
||||
<li>如何部署适合的IT系统?</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>与其他价值的关系</h2>
|
||||
<p>
|
||||
价值支持是其他三大价值的基础保障。
|
||||
</p>
|
||||
<ul>
|
||||
<li><a href="/value/creation">价值创造</a>:支持创新的能力</li>
|
||||
<li><a href="/value/transfer">价值传递</a>:支持营销的能力</li>
|
||||
<li><a href="/value/delivery">价值交付</a>:支持运营的能力</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>阿美巴相关能力</h2>
|
||||
<p>
|
||||
<a href="/capabilities">查看阿美巴的企业进化能力</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关案例</h2>
|
||||
<p>
|
||||
<a href="/cases">查看相关案例</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
<li><a href="/value/creation">价值创造</a></li>
|
||||
<li><a href="/value/transfer">价值传递</a></li>
|
||||
<li><a href="/value/delivery">价值交付</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
import type { Metadata } from 'next';
|
||||
import { generateSEO, generateBreadcrumbSchema } from '@/lib/seo';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
...generateSEO({
|
||||
title: '价值传递',
|
||||
description: '企业如何将价值传递给客户,包括营销、销售、渠道等',
|
||||
canonical: '/value/transfer',
|
||||
}),
|
||||
};
|
||||
|
||||
export default function ValueTransferPage() {
|
||||
const breadcrumbs = [
|
||||
{ name: '首页', url: '/' },
|
||||
{ name: '四大价值', url: '/value' },
|
||||
{ name: '价值传递', url: '/value/transfer' },
|
||||
];
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 结构化数据 */}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(generateBreadcrumbSchema(breadcrumbs)),
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className="container">
|
||||
{/* 面包屑导航 */}
|
||||
<nav className="breadcrumb" aria-label="面包屑导航">
|
||||
<ol>
|
||||
{breadcrumbs.map((item, index) => (
|
||||
<li key={index}>
|
||||
{index < breadcrumbs.length - 1 ? (
|
||||
<a href={item.url}>{item.name}</a>
|
||||
) : (
|
||||
<span aria-current="page">{item.name}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<h1>价值传递</h1>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>官方定义</h2>
|
||||
<p>
|
||||
价值传递是企业将创造的价值有效传递给目标客户的过程。
|
||||
它包括营销策略、销售渠道、品牌传播等多个环节。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>核心逻辑</h2>
|
||||
<p>
|
||||
价值传递的核心是让客户了解、认识并接受企业创造的价值,
|
||||
从而产生购买意愿和行为。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>企业常见问题</h2>
|
||||
<ul>
|
||||
<li>如何精准定位目标客户?</li>
|
||||
<li>如何有效传递价值主张?</li>
|
||||
<li>如何建立高效的销售渠道?</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>与其他价值的关系</h2>
|
||||
<p>
|
||||
价值传递是连接价值创造与价值交付的桥梁。
|
||||
</p>
|
||||
<ul>
|
||||
<li><a href="/value/creation">价值创造</a>:提供传递的内容</li>
|
||||
<li><a href="/value/delivery">价值交付</a>:实现传递的目标</li>
|
||||
<li><a href="/value/support">价值支持</a>:支持传递的过程</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>阿美巴相关能力</h2>
|
||||
<p>
|
||||
<a href="/capabilities">查看阿美巴的企业进化能力</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="content-section">
|
||||
<h2>相关案例</h2>
|
||||
<p>
|
||||
<a href="/cases">查看相关案例</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="related-section">
|
||||
<h2>相关知识</h2>
|
||||
<ul>
|
||||
<li><a href="/value">四大价值</a></li>
|
||||
<li><a href="/value/creation">价值创造</a></li>
|
||||
<li><a href="/value/delivery">价值交付</a></li>
|
||||
<li><a href="/value/support">价值支持</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,251 @@
|
||||
import { Entity, DirectedRelationship, Content, Page, Article, Case, FAQ, Capability, Service, PaginatedResponse } from '@/types';
|
||||
|
||||
const API_BASE_URL = process.env.API_URL || 'http://localhost:3000';
|
||||
|
||||
// 通用请求函数
|
||||
async function fetchApi<T>(endpoint: string, options?: RequestInit): Promise<T> {
|
||||
const url = `${API_BASE_URL}${endpoint}`;
|
||||
const response = await fetch(url, {
|
||||
...options,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...options?.headers,
|
||||
},
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`API请求失败: ${response.status} ${response.statusText}`);
|
||||
}
|
||||
|
||||
return response.json();
|
||||
}
|
||||
|
||||
// 实体相关API
|
||||
export const entityApi = {
|
||||
// 获取实体列表
|
||||
getList: (params?: { page?: number; pageSize?: number; orderBy?: string }) => {
|
||||
const searchParams = new URLSearchParams();
|
||||
if (params?.page) searchParams.set('page', params.page.toString());
|
||||
if (params?.pageSize) searchParams.set('pageSize', params.pageSize.toString());
|
||||
if (params?.orderBy) searchParams.set('orderBy', params.orderBy);
|
||||
return fetchApi<PaginatedResponse<Entity>>(`/api/entities?${searchParams.toString()}`);
|
||||
},
|
||||
|
||||
// 获取实体详情
|
||||
getById: (id: string) => fetchApi<Entity>(`/api/entities/${id}`),
|
||||
|
||||
// 公开接口:获取实体列表
|
||||
getPublicList: (params?: { page?: number; pageSize?: number }) => {
|
||||
const searchParams = new URLSearchParams();
|
||||
if (params?.page) searchParams.set('page', params.page.toString());
|
||||
if (params?.pageSize) searchParams.set('pageSize', params.pageSize.toString());
|
||||
return fetchApi<Entity[]>(`/api/public/entities?${searchParams.toString()}`);
|
||||
},
|
||||
|
||||
// 公开接口:获取实体详情
|
||||
getPublicById: (id: string) => fetchApi<Entity>(`/api/public/entities/${id}`),
|
||||
|
||||
// 公开接口:获取实体的关系
|
||||
getPublicRelationships: (id: string) => fetchApi<{ source: DirectedRelationship[]; target: DirectedRelationship[] }>(`/api/public/entities/${id}/relationships`),
|
||||
|
||||
// 公开接口:获取实体的内容
|
||||
getPublicContents: (id: string) => fetchApi<Content[]>(`/api/public/entities/${id}/contents`),
|
||||
};
|
||||
|
||||
// 关系相关API
|
||||
export const relationshipApi = {
|
||||
// 获取关系列表
|
||||
getList: (params?: { page?: number; pageSize?: number }) => {
|
||||
const searchParams = new URLSearchParams();
|
||||
if (params?.page) searchParams.set('page', params.page.toString());
|
||||
if (params?.pageSize) searchParams.set('pageSize', params.pageSize.toString());
|
||||
return fetchApi<PaginatedResponse<DirectedRelationship>>(`/api/relationships?${searchParams.toString()}`);
|
||||
},
|
||||
|
||||
// 获取关系详情
|
||||
getById: (id: string) => fetchApi<DirectedRelationship>(`/api/relationships/${id}`),
|
||||
|
||||
// 获取实体的出向关系
|
||||
getBySourceEntity: (entityId: string) => fetchApi<DirectedRelationship[]>(`/api/relationships/source/${entityId}`),
|
||||
|
||||
// 获取实体的入向关系
|
||||
getByTargetEntity: (entityId: string) => fetchApi<DirectedRelationship[]>(`/api/relationships/target/${entityId}`),
|
||||
};
|
||||
|
||||
// 内容相关API
|
||||
export const contentApi = {
|
||||
// 获取内容列表
|
||||
getList: (type: string, params?: { page?: number; pageSize?: number }) => {
|
||||
const searchParams = new URLSearchParams();
|
||||
if (params?.page) searchParams.set('page', params.page.toString());
|
||||
if (params?.pageSize) searchParams.set('pageSize', params.pageSize.toString());
|
||||
return fetchApi<PaginatedResponse<Content>>(`/api/contents/${type}?${searchParams.toString()}`);
|
||||
},
|
||||
|
||||
// 获取内容详情
|
||||
getById: (type: string, id: string) => fetchApi<Content>(`/api/contents/${type}/${id}`),
|
||||
|
||||
// 公开接口:获取内容列表
|
||||
getPublicList: (type?: string, params?: { page?: number; pageSize?: number }) => {
|
||||
const searchParams = new URLSearchParams();
|
||||
if (type) searchParams.set('type', type);
|
||||
if (params?.page) searchParams.set('page', params.page.toString());
|
||||
if (params?.pageSize) searchParams.set('pageSize', params.pageSize.toString());
|
||||
return fetchApi<Content[]>(`/api/public/contents?${searchParams.toString()}`);
|
||||
},
|
||||
|
||||
// 公开接口:获取内容详情
|
||||
getPublicById: (id: string) => fetchApi<Content>(`/api/public/contents/${id}`),
|
||||
|
||||
// 公开接口:获取内容的实体关联
|
||||
getPublicEntities: (id: string) => fetchApi<Entity[]>(`/api/public/contents/${id}/entities`),
|
||||
};
|
||||
|
||||
// 页面相关API
|
||||
export const pageApi = {
|
||||
// 获取页面列表
|
||||
getList: (params?: { page?: number; pageSize?: number }) => contentApi.getList('page', params),
|
||||
|
||||
// 获取页面详情
|
||||
getById: (id: string) => contentApi.getById('page', id),
|
||||
|
||||
// 公开接口:获取页面列表
|
||||
getPublicList: (params?: { page?: number; pageSize?: number }) => contentApi.getPublicList('page', params),
|
||||
|
||||
// 公开接口:获取页面详情
|
||||
getPublicById: (id: string) => contentApi.getPublicById(id),
|
||||
};
|
||||
|
||||
// 文章相关API
|
||||
export const articleApi = {
|
||||
// 获取文章列表
|
||||
getList: (params?: { page?: number; pageSize?: number }) => contentApi.getList('article', params),
|
||||
|
||||
// 获取文章详情
|
||||
getById: (id: string) => contentApi.getById('article', id),
|
||||
|
||||
// 公开接口:获取文章列表
|
||||
getPublicList: (params?: { page?: number; pageSize?: number }) => contentApi.getPublicList('article', params),
|
||||
|
||||
// 公开接口:获取文章详情
|
||||
getPublicById: (id: string) => contentApi.getPublicById(id),
|
||||
};
|
||||
|
||||
// 案例相关API
|
||||
export const caseApi = {
|
||||
// 获取案例列表
|
||||
getList: (params?: { page?: number; pageSize?: number }) => contentApi.getList('case', params),
|
||||
|
||||
// 获取案例详情
|
||||
getById: (id: string) => contentApi.getById('case', id),
|
||||
|
||||
// 公开接口:获取案例列表
|
||||
getPublicList: (params?: { page?: number; pageSize?: number }) => contentApi.getPublicList('case', params),
|
||||
|
||||
// 公开接口:获取案例详情
|
||||
getPublicById: (id: string) => contentApi.getPublicById(id),
|
||||
};
|
||||
|
||||
// FAQ相关API
|
||||
export const faqApi = {
|
||||
// 获取FAQ列表
|
||||
getList: (params?: { page?: number; pageSize?: number }) => contentApi.getList('faq', params),
|
||||
|
||||
// 获取FAQ详情
|
||||
getById: (id: string) => contentApi.getById('faq', id),
|
||||
|
||||
// 公开接口:获取FAQ列表
|
||||
getPublicList: (params?: { page?: number; pageSize?: number }) => contentApi.getPublicList('faq', params),
|
||||
|
||||
// 公开接口:获取FAQ详情
|
||||
getPublicById: (id: string) => contentApi.getPublicById(id),
|
||||
};
|
||||
|
||||
// 能力相关API
|
||||
export const capabilityApi = {
|
||||
// 获取能力列表
|
||||
getList: (params?: { page?: number; pageSize?: number }) => contentApi.getList('capability', params),
|
||||
|
||||
// 获取能力详情
|
||||
getById: (id: string) => contentApi.getById('capability', id),
|
||||
|
||||
// 公开接口:获取能力列表
|
||||
getPublicList: (params?: { page?: number; pageSize?: number }) => contentApi.getPublicList('capability', params),
|
||||
|
||||
// 公开接口:获取能力详情
|
||||
getPublicById: (id: string) => contentApi.getPublicById(id),
|
||||
};
|
||||
|
||||
// 服务相关API
|
||||
export const serviceApi = {
|
||||
// 获取服务列表
|
||||
getList: (params?: { page?: number; pageSize?: number }) => contentApi.getList('service', params),
|
||||
|
||||
// 获取服务详情
|
||||
getById: (id: string) => contentApi.getById('service', id),
|
||||
|
||||
// 公开接口:获取服务列表
|
||||
getPublicList: (params?: { page?: number; pageSize?: number }) => contentApi.getPublicList('service', params),
|
||||
|
||||
// 公开接口:获取服务详情
|
||||
getPublicById: (id: string) => contentApi.getPublicById(id),
|
||||
};
|
||||
|
||||
// 关联相关API
|
||||
export const joinApi = {
|
||||
// 获取关联列表
|
||||
getList: (params?: { page?: number; pageSize?: number }) => {
|
||||
const searchParams = new URLSearchParams();
|
||||
if (params?.page) searchParams.set('page', params.page.toString());
|
||||
if (params?.pageSize) searchParams.set('pageSize', params.pageSize.toString());
|
||||
return fetchApi<PaginatedResponse<{ join_id: string; entity_id: string; content_id: string; join_note?: string; created_at: string }>>(`/api/joins?${searchParams.toString()}`);
|
||||
},
|
||||
|
||||
// 获取实体的所有关联
|
||||
getByEntityId: (entityId: string) => fetchApi<{ join_id: string; entity_id: string; content_id: string; join_note?: string; created_at: string }[]>(`/api/joins/entity/${entityId}`),
|
||||
|
||||
// 获取内容的所有关联
|
||||
getByContentId: (contentId: string) => fetchApi<{ join_id: string; entity_id: string; content_id: string; join_note?: string; created_at: string }[]>(`/api/joins/content/${contentId}`),
|
||||
};
|
||||
|
||||
// 搜索相关API
|
||||
export const searchApi = {
|
||||
// 搜索实体
|
||||
entities: (keyword: string, params?: { page?: number; pageSize?: number }) => {
|
||||
const searchParams = new URLSearchParams({ keyword });
|
||||
if (params?.page) searchParams.set('page', params.page.toString());
|
||||
if (params?.pageSize) searchParams.set('pageSize', params.pageSize.toString());
|
||||
return fetchApi<Entity[]>(`/api/public/search/entities?${searchParams.toString()}`);
|
||||
},
|
||||
|
||||
// 搜索内容
|
||||
contents: (keyword: string, type?: string, params?: { page?: number; pageSize?: number }) => {
|
||||
const searchParams = new URLSearchParams({ keyword });
|
||||
if (type) searchParams.set('type', type);
|
||||
if (params?.page) searchParams.set('page', params.page.toString());
|
||||
if (params?.pageSize) searchParams.set('pageSize', params.pageSize.toString());
|
||||
return fetchApi<Content[]>(`/api/public/search/contents?${searchParams.toString()}`);
|
||||
},
|
||||
};
|
||||
|
||||
// JSON-LD相关API
|
||||
export const jsonLdApi = {
|
||||
// 获取实体的JSON-LD
|
||||
getEntityJsonLd: (id: string) => fetchApi<Record<string, any>>(`/api/jsonld/entities/${id}`),
|
||||
|
||||
// 获取内容的JSON-LD
|
||||
getContentJsonLd: (id: string) => fetchApi<Record<string, any>>(`/api/jsonld/contents/${id}`),
|
||||
|
||||
// 获取所有实体的JSON-LD列表
|
||||
getAllEntitiesJsonLd: () => fetchApi<Record<string, any>[]>('/api/jsonld/entities'),
|
||||
|
||||
// 获取所有内容的JSON-LD列表
|
||||
getAllContentsJsonLd: (type?: string) => {
|
||||
const searchParams = new URLSearchParams();
|
||||
if (type) searchParams.set('type', type);
|
||||
return fetchApi<Record<string, any>[]>(`/api/jsonld/contents?${searchParams.toString()}`);
|
||||
},
|
||||
|
||||
// 获取站点地图的JSON-LD
|
||||
getSitemapJsonLd: () => fetchApi<Record<string, any>>('/api/jsonld/sitemap'),
|
||||
};
|
||||
@@ -0,0 +1,160 @@
|
||||
import { SEOData, Breadcrumb, JsonLdData } from '@/types';
|
||||
|
||||
const SITE_NAME = '阿美巴AI官网';
|
||||
const SITE_DESCRIPTION = '阿美巴AI - AI时代企业进化平台';
|
||||
const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'https://ameiba.com';
|
||||
|
||||
// 生成SEO数据
|
||||
export function generateSEO(data: SEOData): Record<string, string> {
|
||||
const title = data.title ? `${data.title} - ${SITE_NAME}` : SITE_NAME;
|
||||
const description = data.description || SITE_DESCRIPTION;
|
||||
const canonical = data.canonical ? `${SITE_URL}${data.canonical}` : SITE_URL;
|
||||
|
||||
return {
|
||||
title,
|
||||
description,
|
||||
canonical,
|
||||
'og:title': data.ogTitle || title,
|
||||
'og:description': data.ogDescription || description,
|
||||
'og:image': data.ogImage || `${SITE_URL}/og-default.jpg`,
|
||||
'og:type': 'website',
|
||||
'og:url': canonical,
|
||||
'twitter:card': 'summary_large_image',
|
||||
'twitter:title': data.ogTitle || title,
|
||||
'twitter:description': data.ogDescription || description,
|
||||
'twitter:image': data.ogImage || `${SITE_URL}/og-default.jpg`,
|
||||
};
|
||||
}
|
||||
|
||||
// 生成面包屑Schema
|
||||
export function generateBreadcrumbSchema(breadcrumbs: Breadcrumb[]): JsonLdData {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'BreadcrumbList',
|
||||
itemListElement: breadcrumbs.map((item, index) => ({
|
||||
'@type': 'ListItem',
|
||||
position: index + 1,
|
||||
name: item.name,
|
||||
item: `${SITE_URL}${item.url}`,
|
||||
})),
|
||||
};
|
||||
}
|
||||
|
||||
// 生成组织Schema
|
||||
export function generateOrganizationSchema(): JsonLdData {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Organization',
|
||||
name: '阿美巴AI',
|
||||
description: 'AI时代企业进化平台',
|
||||
url: SITE_URL,
|
||||
logo: `${SITE_URL}/logo.png`,
|
||||
sameAs: [],
|
||||
};
|
||||
}
|
||||
|
||||
// 生成文章Schema
|
||||
export function generateArticleSchema(data: {
|
||||
title: string;
|
||||
description: string;
|
||||
url: string;
|
||||
image?: string;
|
||||
author?: string;
|
||||
datePublished?: string;
|
||||
dateModified?: string;
|
||||
}): JsonLdData {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Article',
|
||||
headline: data.title,
|
||||
description: data.description,
|
||||
image: data.image || `${SITE_URL}/og-default.jpg`,
|
||||
url: `${SITE_URL}${data.url}`,
|
||||
author: data.author ? {
|
||||
'@type': 'Person',
|
||||
name: data.author,
|
||||
} : undefined,
|
||||
publisher: {
|
||||
'@type': 'Organization',
|
||||
name: SITE_NAME,
|
||||
logo: {
|
||||
'@type': 'ImageObject',
|
||||
url: `${SITE_URL}/logo.png`,
|
||||
},
|
||||
},
|
||||
datePublished: data.datePublished,
|
||||
dateModified: data.dateModified,
|
||||
};
|
||||
}
|
||||
|
||||
// 生成FAQ Schema
|
||||
export function generateFAQSchema(faqs: Array<{ question: string; answer: string }>): JsonLdData {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'FAQPage',
|
||||
mainEntity: faqs.map(faq => ({
|
||||
'@type': 'Question',
|
||||
name: faq.question,
|
||||
acceptedAnswer: {
|
||||
'@type': 'Answer',
|
||||
text: faq.answer,
|
||||
},
|
||||
})),
|
||||
};
|
||||
}
|
||||
|
||||
// 生成服务Schema
|
||||
export function generateServiceSchema(data: {
|
||||
name: string;
|
||||
description: string;
|
||||
url: string;
|
||||
provider?: string;
|
||||
}): JsonLdData {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Service',
|
||||
name: data.name,
|
||||
description: data.description,
|
||||
url: `${SITE_URL}${data.url}`,
|
||||
provider: data.provider ? {
|
||||
'@type': 'Organization',
|
||||
name: data.provider,
|
||||
} : undefined,
|
||||
};
|
||||
}
|
||||
|
||||
// 生成案例Schema
|
||||
export function generateCaseSchema(data: {
|
||||
title: string;
|
||||
description: string;
|
||||
url: string;
|
||||
image?: string;
|
||||
}): JsonLdData {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Article',
|
||||
headline: data.title,
|
||||
description: data.description,
|
||||
image: data.image || `${SITE_URL}/og-default.jpg`,
|
||||
url: `${SITE_URL}${data.url}`,
|
||||
articleSection: '案例',
|
||||
};
|
||||
}
|
||||
|
||||
// 生成网站搜索Schema
|
||||
export function generateWebSiteSearchAction(): JsonLdData {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'WebSite',
|
||||
name: SITE_NAME,
|
||||
url: SITE_URL,
|
||||
potentialAction: {
|
||||
'@type': 'SearchAction',
|
||||
target: {
|
||||
'@type': 'EntryPoint',
|
||||
urlTemplate: `${SITE_URL}/search?q={search_term_string}`,
|
||||
},
|
||||
'query-input': 'required name=search_term_string',
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
const API_URL = process.env.API_URL || 'http://localhost:24731';
|
||||
|
||||
export type SiteSettings = Record<string, string>;
|
||||
|
||||
export async function getSiteSettings(): Promise<SiteSettings> {
|
||||
try {
|
||||
const response = await fetch(`${API_URL}/api/public/settings`, { cache: 'no-store' });
|
||||
if (!response.ok) return {};
|
||||
return response.json();
|
||||
} catch {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,127 @@
|
||||
// 数据模型类型定义
|
||||
|
||||
export interface Entity {
|
||||
entity_id: string;
|
||||
name: string;
|
||||
definition?: string;
|
||||
description?: string;
|
||||
metadata?: Record<string, any>;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
export interface DirectedRelationship {
|
||||
rel_id: string;
|
||||
source_entity_id: string;
|
||||
relation_type: string;
|
||||
target_entity_id: string;
|
||||
rel_status: 'active' | 'inactive';
|
||||
authority_level: number;
|
||||
is_public: number;
|
||||
effective_at?: string;
|
||||
expire_at?: string;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
export interface Content {
|
||||
content_id: string;
|
||||
title: string;
|
||||
body?: string;
|
||||
content_type: 'page' | 'article' | 'case' | 'faq' | 'capability' | 'service';
|
||||
publish_status: 'draft' | 'review' | 'published' | 'unpublished' | 'historical';
|
||||
authority_level: number;
|
||||
version_no: number;
|
||||
version_note?: string;
|
||||
metadata?: Record<string, any>;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
archived_at?: string;
|
||||
}
|
||||
|
||||
export interface Page extends Content {
|
||||
content_type: 'page';
|
||||
slug?: string;
|
||||
template?: string;
|
||||
seo_title?: string;
|
||||
seo_description?: string;
|
||||
seo_keywords?: string;
|
||||
}
|
||||
|
||||
export interface Article extends Content {
|
||||
content_type: 'article';
|
||||
category?: string;
|
||||
tags?: string;
|
||||
cover_image?: string;
|
||||
author?: string;
|
||||
}
|
||||
|
||||
export interface Case extends Content {
|
||||
content_type: 'case';
|
||||
client_name?: string;
|
||||
industry?: string;
|
||||
challenge?: string;
|
||||
solution?: string;
|
||||
result?: string;
|
||||
}
|
||||
|
||||
export interface FAQ extends Content {
|
||||
content_type: 'faq';
|
||||
question?: string;
|
||||
answer?: string;
|
||||
sort_order?: number;
|
||||
}
|
||||
|
||||
export interface Capability extends Content {
|
||||
content_type: 'capability';
|
||||
capability_type?: string;
|
||||
features?: string;
|
||||
use_cases?: string;
|
||||
}
|
||||
|
||||
export interface Service extends Content {
|
||||
content_type: 'service';
|
||||
service_type?: string;
|
||||
pricing_model?: string;
|
||||
delivery_method?: string;
|
||||
}
|
||||
|
||||
export interface EntityContentJoin {
|
||||
join_id: string;
|
||||
entity_id: string;
|
||||
content_id: string;
|
||||
join_note?: string;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
// API响应类型
|
||||
export interface PaginatedResponse<T> {
|
||||
list: T[];
|
||||
total: number;
|
||||
page: number;
|
||||
pageSize: number;
|
||||
totalPages: number;
|
||||
}
|
||||
|
||||
// SEO类型
|
||||
export interface SEOData {
|
||||
title: string;
|
||||
description: string;
|
||||
canonical?: string;
|
||||
ogTitle?: string;
|
||||
ogDescription?: string;
|
||||
ogImage?: string;
|
||||
}
|
||||
|
||||
// 面包屑类型
|
||||
export interface Breadcrumb {
|
||||
name: string;
|
||||
url: string;
|
||||
}
|
||||
|
||||
// 结构化数据类型
|
||||
export interface JsonLdData {
|
||||
'@context': string;
|
||||
'@type': string;
|
||||
[key: string]: any;
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "bundler",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"incremental": true,
|
||||
"plugins": [
|
||||
{
|
||||
"name": "next"
|
||||
}
|
||||
],
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
}
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
Reference in New Issue
Block a user