## GitHub 同步说明
| 项 | 内容 |
|:---|:---|
| 仓库 | https://github.com/fnvtk/cunkebao_v3 |
| 分支 | develop |
| 方向 | 本地 → GitHub(单向 push) |
| 是否拉取远程 | 否(未 fetch / pull / merge) |
| 是否改本地文件 | 否(仅 git add/commit,未编辑任何源文件正文) |
| 基准 commit | 0643e78a |
| 变更规模 | 709 files, +26436 / -3407 lines |
## 目录变更统计
| 目录 | 文件数 | 说明 |
|:---|---:|:---|
| 开发文档/ | 404 | 四端进行中/已完成需求、接口文档、官网需求、部署脚本 |
| Server/ | 95 | 后端 API、迁移脚本、触客宝/超管/存客宝服务 |
| Cunkebao/ | 85 | 移动端 H5、设备绑定、客服、转号审批等 |
| Touchkebao/ | 68 | PC 工作台、AI 获客、算力中心、Glass UI |
| SuperAdmin/ | 33 | 超管项目中心、算力计费、内容库 |
| 官网/ | 19 | 新增存客宝官网静态页(index/pricing/solutions 等) |
| .cursor/ | 3 | Cursor 规则与 Skill |
| .obsidian/ | 2 | Obsidian 工作区配置 |
## 重点新增/更新(本地为准)
- 官网/: 完整静态站点(index、pricing、manual、solutions、api)
- 开发文档/1、需求/修改/*_进行中_20260530.md(存客宝/触客宝/AI数智员工)
- 开发文档/1、需求/官网需求.md
- 开发文档/5、接口/开发进度_接口文档.md 等接口文档迭代
- Touchkebao Glass UI 与 P0 收尾、通道获客算力
- SuperAdmin 算力计费规则、项目工作台
## 刻意未上传(本地保留)
- node_modules/
- .DS_Store、.smart-env/
- .开发文档_nested_git_backup/(旧嵌套 git 备份)
- **/__pycache__/
## 验收
GitHub 浏览: https://github.com/fnvtk/cunkebao_v3/tree/develop
Co-authored-by: Cursor <cursoragent@cursor.com>
123 lines
3.0 KiB
TypeScript
123 lines
3.0 KiB
TypeScript
import React, { useEffect, useState } from "react";
|
|
import { NavBar } from "antd-mobile";
|
|
import { ArrowLeftOutlined } from "@ant-design/icons";
|
|
import { useNavigate } from "react-router-dom";
|
|
import { getSafeAreaHeight } from "@/utils/common";
|
|
|
|
interface NavCommonProps {
|
|
title: string | React.ReactNode;
|
|
/** 副标题,渲染在 title 下方 */
|
|
subtitle?: string | React.ReactNode;
|
|
backFn?: () => void;
|
|
right?: React.ReactNode;
|
|
left?: React.ReactNode;
|
|
/** 启用毛玻璃头部背景(白底 + 模糊);默认 false 保持旧风格 */
|
|
glass?: boolean;
|
|
/** 标题使用品牌渐变文字(蓝→绿/蓝→紫);默认 false */
|
|
gradient?: boolean | "brand" | "primary";
|
|
/** 主色调(用于返回按钮 hover 等) */
|
|
tone?: "blue" | "green" | "purple" | "pink" | "cyan";
|
|
}
|
|
|
|
const NavCommon: React.FC<NavCommonProps> = ({
|
|
title,
|
|
subtitle,
|
|
backFn,
|
|
right,
|
|
left,
|
|
glass = false,
|
|
gradient = false,
|
|
tone = "blue",
|
|
}) => {
|
|
const navigate = useNavigate();
|
|
const [paddingTop, setPaddingTop] = useState("0px");
|
|
useEffect(() => {
|
|
setPaddingTop(getSafeAreaHeight() + "px");
|
|
}, []);
|
|
|
|
const wrapperClass = glass ? "ckb-nav-glass" : "";
|
|
const gradientClass =
|
|
gradient === true || gradient === "brand"
|
|
? "ckb-gradient-text-brand"
|
|
: gradient === "primary"
|
|
? "ckb-gradient-text"
|
|
: "";
|
|
|
|
const toneColor =
|
|
tone === "green"
|
|
? "#22c55e"
|
|
: tone === "purple"
|
|
? "#8b5cf6"
|
|
: tone === "pink"
|
|
? "#ec4899"
|
|
: tone === "cyan"
|
|
? "#06b6d4"
|
|
: "var(--ckb-primary, #1677ff)";
|
|
|
|
const titleNode =
|
|
typeof title === "string" ? (
|
|
<div style={{ display: "flex", flexDirection: "column", alignItems: "center", lineHeight: 1.2 }}>
|
|
<span
|
|
className={gradientClass}
|
|
style={{
|
|
fontSize: 16,
|
|
fontWeight: 700,
|
|
color: gradientClass ? undefined : "var(--ckb-text-primary, #0f172a)",
|
|
}}
|
|
>
|
|
{title}
|
|
</span>
|
|
{subtitle && (
|
|
<span
|
|
style={{
|
|
fontSize: 11,
|
|
color: "var(--ckb-text-muted, #94a3b8)",
|
|
marginTop: 2,
|
|
}}
|
|
>
|
|
{subtitle}
|
|
</span>
|
|
)}
|
|
</div>
|
|
) : (
|
|
title
|
|
);
|
|
|
|
return (
|
|
<div
|
|
className={wrapperClass}
|
|
style={{
|
|
paddingTop,
|
|
background: glass ? undefined : "#fff",
|
|
}}
|
|
>
|
|
<NavBar
|
|
back={null}
|
|
left={
|
|
left ? (
|
|
left
|
|
) : (
|
|
<div className="nav-title">
|
|
<ArrowLeftOutlined
|
|
style={{ color: toneColor, fontSize: 18 }}
|
|
onClick={() => {
|
|
if (backFn) {
|
|
backFn();
|
|
} else {
|
|
navigate(-1);
|
|
}
|
|
}}
|
|
/>
|
|
</div>
|
|
)
|
|
}
|
|
right={right}
|
|
>
|
|
{titleNode}
|
|
</NavBar>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default NavCommon;
|