{"id":49609115,"url":"https://github.com/hwdemtv/smart-link-manager","last_synced_at":"2026-05-04T15:06:30.235Z","repository":{"id":344388463,"uuid":"1175664922","full_name":"hwdemtv/smart-link-manager","owner":"hwdemtv","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-05T04:32:49.000Z","size":2810,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-05T05:16:04.399Z","etag":null,"topics":["eea-t","generative-engine-optimization","geo-optimization","json-ld","seo-optimized","short-link","structured-data"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hwdemtv.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"docs/security.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-08T02:10:21.000Z","updated_at":"2026-04-05T04:32:54.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hwdemtv/smart-link-manager","commit_stats":null,"previous_names":["hwdemtv/smart-link-manager"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hwdemtv/smart-link-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwdemtv%2Fsmart-link-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwdemtv%2Fsmart-link-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwdemtv%2Fsmart-link-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwdemtv%2Fsmart-link-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hwdemtv","download_url":"https://codeload.github.com/hwdemtv/smart-link-manager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hwdemtv%2Fsmart-link-manager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32612392,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"ssl_error","status_checked_at":"2026-05-04T10:08:02.005Z","response_time":58,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["eea-t","generative-engine-optimization","geo-optimization","json-ld","seo-optimized","short-link","structured-data"],"created_at":"2026-05-04T15:06:27.066Z","updated_at":"2026-05-04T15:06:30.216Z","avatar_url":"https://github.com/hwdemtv.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Smart Link Manager (SLM) 🚀\n\n![License](https://img.shields.io/badge/license-MIT-blue.svg)\n![Node.js](https://img.shields.io/badge/Node.js-18+-339933?logo=node.js)\n![React](https://img.shields.io/badge/React-19-61DAFB?logo=react)\n![TypeScript](https://img.shields.io/badge/TypeScript-5-3178C6?logo=typescript)\n![MySQL](https://img.shields.io/badge/MySQL-8.0-4479A1?logo=mysql)\n![SEO Optimized](https://img.shields.io/badge/SEO-Optimized-success?style=flat-square\u0026logo=google)\n![GEO Ready](https://img.shields.io/badge/GEO-Ready-blueviolet?style=flat-square\u0026logo=openai)\n\n**Smart Link Manager (智链管理)** 是一款面向企业级应用的现代化 **SaaS 架构** 短链接管理与数据分析平台。深度集成 **SEO (搜索引擎优化)** 与 **GEO (生成式引擎优化)** 策略，提供极致的 2ms 跳转性能、深度的数据洞察以及全方位的 **JSON-LD** 结构化数据映射，助力您的品牌在 AI 搜索时代脱颖而出。\n\n---\n\n## ✨ 核心特性\n\n### 🚀 高性能与可扩展性\n- **极致跳转性能**：基于 Node.js 异步非阻塞架构，核心跳转决策仅需 **~2ms**。\n- **10万级大数据支撑**：通过服务端分页与搜索重构，首屏加载耗时降低 80%，轻松驾驭海量数据。\n- **自定义域名绑定**：支持绑定自有域名，配合 DNS CNAME 验证实现品牌化短链。\n\n### 📊 数据分析与洞察\n- **全维度数据分析**：内置 `AnalyticsDashboard`，提供访问走势、地域分布（Treemap）、设备画像及实时点击热力图。\n- **A/B 测试分流**：支持为单个短链配置多目标 URL，按比例动态分流，助力营销转化优化。\n\n### 🔍 SEO 与社交治理\n- **AI 智能提炼**：一键通过 AI 生成符合 SEO 规范的标题与描述。\n- **元数据重定向**：支持自定义 Canonical URL 与状态码 (301/302/307/308)。\n- **Open Graph 支持**：自定义社交分享预览图、视频等 OG 标签。\n\n### 🛡️ 安全与合规\n- **链接有效性检查**：内置网盘（百度/阿里/夸克）专项探测及通用 URL 巡检，支持一键手动校验。\n- **企业级安全架构**：scrypt 密码哈希、JWT 强校验、动态速率限制、系统黑名单。\n- **IP 匿名化**：统计链路仅保留城市信息，不持久化存储原始访问 IP。\n\n### 🌐 国际化与用户体验\n- **全量国际化 (i18n)**：深度适配中英双语，涵盖界面、反馈及安全二维码验证页面。\n- **分组与标签体系**：支持海量链接的分类管理与标签多维过滤。\n- **回收站机制**：软删除设计，误删可恢复。\n\n### 💎 SaaS 商业化能力\n- **多层级订阅管理**：支持 Free / Pro / Business / Enterprise 四档套餐。\n- **API Key 管理**：支持创建多个 API Key，可设置过期时间与使用统计。\n- **配额精准控制**：链接数、域名数、API Key 数量按套餐限制。\n\n---\n\n## 🛠️ 技术栈\n\n### 前端 (Frontend)\n- **Framework**: [React 19](https://react.dev/) + [Vite 7](https://vitejs.dev/)\n- **Styling**: Tailwind CSS 4 + shadcn/ui (赛博美学暗色主题)\n- **API 通讯**: [tRPC 11](https://trpc.io/) + [TanStack Query 5](https://tanstack.com/query/latest)\n- **状态管理**: TanStack Query (服务端状态) + React Context (客户端状态)\n- **表单校验**: [React Hook Form](https://react-hook-form.com/) + [Zod](https://zod.dev/)\n- **数据可视化**: [Recharts](https://recharts.org/) (图表) + [TanStack Virtual](https://tanstack.com/virtual/latest) (虚拟列表)\n- **i18n**: [react-i18next](https://react.i18next.com/)\n- **路由**: [Wouter](https://github.com/molefrog/wouter)\n\n### 后端 (Backend)\n- **Runtime**: Node.js 18+\n- **Framework**: [Express 4](https://expressjs.com/)\n- **API 层**: [tRPC 11](https://trpc.io/) (类型安全 RPC) + REST API (开放集成)\n- **ORM**: [Drizzle ORM](https://orm.drizzle.team/)\n- **Database**: MySQL 8.0 (推荐) / SQLite\n- **认证安全**: JWT (jose) + HttpOnly Cookies + scrypt 密码哈希\n- **校验**: Zod 严格校验 (前后端共享)\n- **地理位置**: [MaxMind GeoIP](https://www.maxmind.com/) (IP 地理解析)\n- **任务队列**: [Bull](https://github.com/OptimalBits/bull) (基于 Redis)\n- **对象存储**: AWS S3 SDK (可选)\n\n### 开发工具\n- **包管理**: pnpm 10+\n- **测试**: Vitest + Playwright\n- **代码格式化**: Prettier\n- **类型检查**: TypeScript 5.7\n\n---\n\n## 📂 项目结构\n\n```text\nsmart-link-manager/\n├── client/                    # 前端 React 应用\n│   ├── src/\n│   │   ├── _core/             # 系统底座 (tRPC 客户端, i18n, Auth Hooks)\n│   │   ├── components/        # UI 组件\n│   │   │   ├── admin/         # 管理后台组件 (用户/IP黑名单/链接管理)\n│   │   │   ├── dashboard/     # 仪表盘组件 (链接表格/分组侧边栏/分析面板)\n│   │   │   └── ui/            # shadcn/ui 基础组件\n│   │   ├── hooks/             # 自定义 Hooks (useLinkFilters, useLinkMutations)\n│   │   ├── lib/               # 工具函数\n│   │   ├── locales/           # 国际化资源 (zh.json / en.json)\n│   │   ├── pages/             # 业务页面\n│   │   │   ├── Dashboard.tsx  # 主仪表盘\n│   │   │   ├── Analytics.tsx  # 数据分析\n│   │   │   ├── Domains.tsx    # 域名管理\n│   │   │   ├── ApiKeys.tsx    # API Key 管理\n│   │   │   ├── LicenseSettings.tsx # 授权管理\n│   │   │   └── ...\n│   │   └── types/             # TypeScript 类型定义\n│   └── index.html             # 入口 HTML\n├── server/                    # 后端 API 服务\n│   ├── _core/                 # 核心模块\n│   │   ├── index.ts           # Express 服务入口\n│   │   ├── trpc.ts            # tRPC 路由配置\n│   │   ├── context.ts         # 请求上下文与认证\n│   │   ├── auth.ts            # 认证工具函数\n│   │   └── sdk.ts             # 授权中心 SDK\n│   ├── routers/               # tRPC 分模块路由\n│   │   ├── links.ts           # 短链接 CRUD + 批量操作\n│   │   ├── domains.ts         # 域名验证与管理\n│   │   ├── admin.ts           # 管理员操作\n│   │   └── user.ts            # 用户配置\n│   ├── db.ts                  # 数据库操作层 (Drizzle)\n│   ├── restRouter.ts          # REST API v1.1 (OpenAPI)\n│   ├── redirectHandler.ts     # 核心跳转引擎 (SSR 元数据)\n│   ├── licenseService.ts      # 套餐配额服务\n│   ├── aiSeoService.ts        # AI SEO 元数据生成\n│   ├── linkChecker.ts         # 链接有效性检测\n│   └── geoIpResolver.ts       # IP 地理解析\n├── drizzle/                   # 数据库 Schema 与迁移\n│   └── schema.ts              # 表结构定义\n├── shared/                    # 前后端共享模块\n│   ├── errorCodes.ts          # 错误码常量\n│   └── validators/            # Zod 校验 Schema\n├── docs/                      # 系统文档\n│   ├── api.md                 # API 规范\n│   ├── security.md            # 安全白皮书\n│   └── changelog.md           # 更新日志\n├── tests/                     # E2E 测试 (Playwright)\n├── DEPLOYMENT.md              # 部署指南\n├── CLAUDE.md                  # Claude Code 开发指南\n└── package.json\n```\n\n---\n\n## 🚀 快速启动\n\n### 环境要求\n- Node.js 18+ (推荐 20+)\n- pnpm 10+\n- MySQL 8.0+ (或 SQLite 用于开发测试)\n\n### 1. 克隆与安装\n\n```bash\ngit clone https://github.com/your-repo/smart-link-manager.git\ncd smart-link-manager\npnpm install\n```\n\n### 2. 环境变量配置\n\n在项目根目录创建 `.env` 文件：\n\n```env\n# 数据库连接\nDATABASE_URL=mysql://用户名:密码@localhost:3306/数据库名\n\n# JWT 密钥 (生产环境必须 32 位以上)\nJWT_SECRET=your-super-secret-key-at-least-32-chars\n\n# 应用标识 (用于生成短链接)\nVITE_APP_ID=http://localhost:3000\n\n# 可选：默认管理员账号\nDEFAULT_ADMIN_USERNAME=admin\nDEFAULT_ADMIN_PASSWORD=your-secure-password\n```\n\n### 3. 数据库初始化\n\n```bash\npnpm run db:push\n```\n\n### 4. 启动开发服务器\n\n```bash\npnpm run dev\n```\n\n访问 `http://localhost:3000` 即可使用。\n\n### 5. 生产构建\n\n```bash\npnpm run build\npnpm run start\n```\n\n详细部署方案请参考 [DEPLOYMENT.md](DEPLOYMENT.md)。\n\n---\n\n## 📚 系统文档索引\n\n| 文档 | 描述 |\n|------|------|\n| [API 规范](docs/api.md) | REST API v1.1 详细接口说明 |\n| [部署指南](DEPLOYMENT.md) | 宝塔面板 Docker/Node 部署全流程 |\n| [安全说明](docs/security.md) | 企业级安全防护机制白皮书 |\n| [更新日志](docs/changelog.md) | 版本迭代历史 |\n| [SEO \u0026 GEO 优化报告](docs/seo-geo-report.md) | 搜索引擎与 AI 搜索优化成果 |\n| [SEO 优化方案](docs/seo-optimization-plan.md) | 搜索引擎优化实施细节 |\n\n### Learning Center (学习中心)\n\n| 文档 | 描述 |\n|------|------|\n| [什么是短链接？](docs/what-is-url-shortener.md) | 短链接定义与工作原理 |\n| [短链接工作原理](docs/how-it-works.md) | 技术实现细节 |\n| [短链接的优势](docs/benefits.md) | 业务价值分析 |\n| [SEO 最佳实践](docs/best-practices.md) | 搜索引擎优化指南 |\n| [API 开发手册](docs/api-guide.md) | 开发者集成指南 |\n\n---\n\n## 🏗️ 开发规范\n\n### 国际化 (i18n)\n\n项目遵循**深度国际化治理规范**，所有新开发的组件必须遵循以下原则：\n\n1. **禁止硬编码**：所有可见文本必须存放在 `client/src/locales/` 下。\n2. **命名空间化**：使用 `analytics`, `dashboard`, `admin` 等命名空间。\n3. **动态调用**：通过 `useTranslation` Hook 的 `t()` 函数进行引用。\n\n```tsx\n// ✅ 正确示例\nconst { t } = useTranslation('dashboard');\nreturn \u003cspan\u003e{t('links.createSuccess')}\u003c/span\u003e;\n\n// ❌ 错误示例\nreturn \u003cspan\u003e创建成功\u003c/span\u003e;\n```\n\n### tRPC 路由规范\n\n```tsx\n// 使用 protectedProcedure 需要用户登录\nprotectedProcedure.input(createLinkSchema).mutation(async ({ ctx, input }) =\u003e {\n  // ctx.user 自动注入当前用户信息\n});\n\n// 使用 publicProcedure 无需认证\npublicProcedure.query(async () =\u003e {\n  return { status: 'ok' };\n});\n```\n\n### 数据库操作\n\n所有数据库操作集中在 `server/db.ts`，使用 Drizzle ORM：\n\n```ts\n// 查询示例\nconst links = await db.select().from(linksTable).where(eq(linksTable.userId, userId));\n\n// 插入示例\nawait db.insert(linksTable).values(newLink);\n```\n\n---\n\n## 📄 开源协议\n\n本项目基于 [MIT License](LICENSE) 开源。\n\n---\n\n## 🗄️ 数据模型\n\n系统核心数据表结构如下：\n\n| 表名 | 描述 |\n|------|------|\n| `users` | 用户信息与订阅状态 |\n| `links` | 短链接主表 (含 SEO、A/B 测试、软删除等) |\n| `domains` | 自定义域名与验证状态 |\n| `link_groups` | 链接分组 |\n| `link_stats` | 点击统计 (设备、地域、来源等) |\n| `link_checks` | 链接有效性检查记录 |\n| `api_keys` | API Key 管理 |\n| `notifications` | 系统通知 |\n| `audit_logs` | 操作审计日志 |\n| `ip_blacklist` | IP 黑名单 |\n\n详细的 Schema 定义请参考 `drizzle/schema.ts`。\n\n---\n\n## 🔌 API 快速参考\n\n### REST API (开放集成)\n\n```bash\n# 认证\ncurl -H \"Authorization: Bearer YOUR_API_KEY\" https://your-domain/api/v1/links\n\n# 创建短链接\ncurl -X POST https://your-domain/api/v1/links \\\n  -H \"Authorization: Bearer YOUR_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"originalUrl\": \"https://example.com\", \"shortCode\": \"mycode\"}'\n```\n\n### tRPC API (内部使用)\n\n```ts\n// 前端调用示例\nconst { data } = trpc.links.list.useQuery({ page: 1, limit: 20 });\nconst mutation = trpc.links.create.useMutation();\nawait mutation.mutateAsync({ originalUrl: 'https://example.com' });\n```\n\n完整 API 文档请参考 [docs/api.md](docs/api.md)。\n\n---\n\n## 🧪 测试\n\n```bash\n# 运行单元测试\npnpm run test\n\n# 运行 E2E 测试\nnpx playwright test\n```\n\n---\n\n## 🤝 贡献指南\n\n1. Fork 本仓库\n2. 创建特性分支 (`git checkout -b feature/amazing-feature`)\n3. 提交更改 (`git commit -m 'feat: add amazing feature'`)\n4. 推送到分支 (`git push origin feature/amazing-feature`)\n5. 提交 Pull Request\n\n请确保：\n- 代码通过 TypeScript 类型检查 (`pnpm run check`)\n- 新增功能有对应的测试用例\n- 遵循现有的代码风格和国际化规范\n\n---\n\n## 📞 支持\n\n- **问题反馈**: [GitHub Issues](https://github.com/your-repo/smart-link-manager/issues)\n- **功能建议**: [GitHub Discussions](https://github.com/your-repo/smart-link-manager/discussions)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhwdemtv%2Fsmart-link-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhwdemtv%2Fsmart-link-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhwdemtv%2Fsmart-link-manager/lists"}