Next.jsReact后台SaaS

Mapody — Next.js 后台模板

作者 agrosevakmak

Mapody 是一个基于 Next.js 的 SaaS 后台模板,可将 Google Maps 链接抓取为商家数据,经 AI 生成内容后发布为多页网站,并附带编辑器和分析面板。

看看你的网站会是什么样

浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。

2 个预览视图
桌面端首页1 / 2
桌面端截图首屏预览

由服务器浏览器实际访问页面后截取。

全部页面与视图 2

截图用于了解视觉与布局,交互效果请以实际项目为准。

采集于 2026-10-13查看来源

值得关注的模板亮点

从已有项目资料中,快速了解它的特点。

01

粘贴 Google Maps 链接即可抓取商家名称、地址、电话、评价、照片和营业时间

02

调用 OpenAI 生成页面改写、标语、FAQ、图片替代文本和评价情感分析

03

拖拽式多页编辑器,支持预设主题或自定义颜色、字体与样式

04

按站点统计页面浏览量、独立访客、来源和热门页面的分析面板

05

内置联系表单、积分系统、Stripe 升级入口和深色模式

06

邮箱密码与 GitHub OAuth 登录,含邮箱验证和密码重置

模板详细介绍

Mapody 是一个采用 Next.js App Router 与 TypeScript 构建的 SaaS 后台模板,核心流程是把 Google Maps 链接转换为可发布的网站。用户粘贴链接后,模板通过 Apify 抓取商家名称、地址、电话、评价、照片和营业时间,再调用 OpenAI 接口生成页面文案、标语、FAQ、图片替代文本和评价情感分析,随后在拖拽式多页编辑器中调整并一键发布到独立子域。

后台部分包含用户认证(邮箱密码与 GitHub OAuth、邮箱验证、密码重置)、按站点统计的页面浏览量、独立访客、来源和热门页面分析面板、内置联系表单、积分系统与 Stripe 升级入口,以及全局深色模式。数据层使用 PostgreSQL 配合 Prisma,文件上传走 AWS S3,邮件通过 Nodemailer 发送,状态管理使用 Zustand。

该模板依赖多个外部服务,需要自行准备数据库、Apify、OpenAI、AWS S3、SMTP 和 Google Maps Embed 的密钥;仓库采用 MIT 许可,但演示图片、字体、图标等第三方素材以及域名、托管、数据库、支付和 AI 调用等外部服务可能另行收费或受各自条款约束。

Next.js后台SaaS

适合你的项目吗?

适用场景

  • 为本地商家快速生成展示型网站并观察访问数据
  • 作为 SaaS 后台模板,二次开发多租户站点发布与积分计费产品
  • 学习 Next.js App Router 下抓取、AI 生成、编辑器和分析面板的组合方式
  • 在演示环境中验证 Google Maps 抓取与 AI 内容生成流程

适合人群

  • 需要现成 SaaS 后台骨架并愿意接入外部 API 的开发者
  • 熟悉 Next.js、TypeScript、Prisma 和 PostgreSQL 的前端或全栈工程师
  • 希望研究地图数据抓取与 AI 内容生成结合方式的技术团队

上手与定制指南

结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。

  1. 1

    需要 Node.js 18+、PostgreSQL 数据库,以及 Apify、OpenAI、AWS S3、SMTP 和 Google Maps Embed 的密钥

  2. 2

    克隆仓库后执行 npm install,在 .env.local 中配置 DATABASE_URL、NEXTAUTH_SECRET、NEXTAUTH_URL 等变量,可选配置 GitHub OAuth

  3. 3

    运行 npx prisma db push 同步数据库结构,再执行 npm run dev 启动开发服务器

  4. 4

    MIT 许可仅覆盖代码,演示图片、字体、图标等第三方素材及外部服务需单独核对许可与费用

查看仓库使用说明

授权与来源资料

使用条件与限制

免费使用 · 保留许可声明

本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。

使用时需要遵守

  • 允许免费使用、修改、商用和分发该版本代码。
  • 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
  • 代码按现状提供;担保与责任限制以原许可证及适用法律为准。

额外费用与待核对事项

  • 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
  • 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
  • 使用 Google Maps 抓取功能需要自行注册 Apify 账号,属于外部服务依赖,可能产生费用。
  • AI 内容生成功能需要自备 OpenAI API 密钥,调用按 OpenAI 计费,属于外部付费服务。
  • 必须配置 Apify API Token 才能使用抓取功能,需在 Apify 平台注册并获取。
  • 必须配置 OpenAI API Key 才能使用 AI 生成功能,需在 OpenAI 平台注册并获取。
  • 文件上传功能依赖 AWS S3,需要自备 AWS 访问密钥并承担 S3 存储费用。
  • 地图嵌入功能需要 Google Maps API Key,需在 Google Cloud 开通并可能产生费用。
  • 邮件发送依赖自备 SMTP 服务,需要配置邮件服务器账号,可能产生费用。
  • 积分系统设有免费额度上限,超出后需通过 Stripe 付费升级,属于付费升级限制。
  • 需要自备 PostgreSQL 数据库,示例使用 Neon,属于外部服务依赖,可能产生费用。
查看原文依据

Permission is hereby granted, free of charge

许可证原文

- Apify account (for Google Maps scraping)

README 原文

- OpenAI API key (for AI content generation)

README 原文

APIFY_API_TOKEN=""

README 原文

OPENAI_API_KEY=""

README 原文

AWS_ACCESS_KEY_ID=""

README 原文

GOOGLE_MAPS_API_KEY=""

README 原文

SMTP_HOST=""

README 原文

- **Credit System** — Free tier with credit limits, upgradeable via Stripe

README 原文

- PostgreSQL database (e.g. [Neon](https://neon.tech/))

README 原文
https://github.com/agrosevakmak/Mapody/blob/main/LICENSEhttps://github.com/agrosevakmak/Mapody/blob/main/README.md

DeepSeek 根据仓库许可证和 README 整理 ·2026-10-13。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。

项目核对记录与介绍依据

模板资料

来源平台
GitHub
资料与维护参考分
资料较完整 · 85 / 100
技术栈
Next.js · React
网站类型
后台 · SaaS
这个分数如何计算

本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。

这个项目需要核对什么

记录的仓库更新时间
2026-06-08
截图检查日期
2026-10-13

已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。

目录记录的主要技术栈是 Next.js。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。

查看具体选型方法 →

介绍的制作与核对状态

介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。

审核声明: [email protected] · 2026-10-13

查看当时使用的来源资料

SHA-256: 52be202c101458b004733a7cafe054f51570699a1ef591d8efd955fcf0a84c48

2026-10-13T09:28:13.071Z

来源文件 / 仓库
# Mapody

**Turn Google Maps links into beautiful websites in 60 seconds.**

Paste a Google Maps link, and Mapody scrapes the business data, generates AI-powered content, and publishes a multi-page website with analytics, custom themes, and a contact form — all in one click.

[![MIT License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
[![Next.js](https://img.shields.io/badge/Next.js-15-black?logo=next.js)](https://nextjs.org/)
[![TypeScript](https://img.shields.io/badge/TypeScript-5-blue?logo=typescript)](https://www.typescriptlang.org/)
[![Prisma](https://img.shields.io/badge/Prisma-6-2D3748?logo=prisma)](https://www.prisma.io/)
[![Tailwind CSS](https://img.shields.io/badge/Tailwind-3-06B6D4?logo=tailwindcss)](https://tailwindcss.com/)
[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-16-336791?logo=postgresql)](https://www.postgresql.org/)

---

## Features

- **Google Maps Scraping** — Paste any Google Maps link, extract business name, address, phone, reviews, photos, and hours
- **AI Content Generation** — Auto-generate page rewrites, taglines, FAQs, alt text, and sentiment analysis
- **Multi-Page Editor** — Drag-and-drop page manager with live preview
- **Custom Themes** — Choose from preset themes or create your own with custom colors, fonts, and styles
- **Analytics Dashboard** — Track page views, unique visitors, referrers, and top pages per site
- **Contact Forms** — Built-in contact form on every published site with spam protection
- **One-Click Publishing** — Deploy to a unique subdomain instantly
- **User Authentication** — Email/password + GitHub OAuth, email verification, password reset
- **Credit System** — Free tier with credit limits, upgradeable via Stripe
- **Dark Mode** — Full dark mode support across the app

## Tech Stack

| Category | Technology |
|---|---|
| **Framework** | [Next.js 15](https://nextjs.org/) (App Router) |
| **Language** | [TypeScript 5](https://www.typescriptlang.org/) |
| **Styling** | [Tailwind CSS 3](https://tailwindcss.com/) |
| **Database** | [PostgreSQL](https://www.postgresql.org/) via [Neon](https://neon.tech/) |
| **ORM** | [Prisma 6](https://www.prisma.io/) |
| **Authentication** | [NextAuth.js](https://next-auth.js.org/) (JWT + Credentials + GitHub OAuth) |
| **State Management** | [Zustand](https://zustand-demo.pmnd.rs/) |
| **Email** | [Nodemailer](https://nodemailer.com/) |
| **Web Scraping** | [Apify](https://www.apify.com/) (Google Maps scraper) |
| **AI** | OpenAI API (content generation) |
| **File Storage** | AWS S3 (via `@aws-sdk/client-s3`) |
| **Deployment** | [Vercel](https://vercel.com/) |

## Getting Started

### Prerequisites

- Node.js 18+
- PostgreSQL database (e.g. [Neon](https://neon.tech/))
- Apify account (for Google Maps scraping)
- OpenAI API key (for AI content generation)

### Installation

```bash
git clone https://github.com/agrosevakmak/Mapody.git
cd Mapody
npm install
```

### Environment Variables

Create a `.env.local` file:

```env
# Database
DATABASE_URL="postgresql://..."

# Auth
NEXTAUTH_SECRET="your-secret-here"
NEXTAUTH_URL="http://localhost:3000"

# GitHub OAuth (optional)
GITHUB_CLIENT_ID=""
GITHUB_CLIENT_SECRET=""

# Apify (Google Maps scraping)
APIFY_API_TOKEN=""

# OpenAI (AI content generation)
OPENAI_API_KEY=""

# AWS S3 (file uploads)
AWS_ACCESS_KEY_ID=""
AWS_SECRET_ACCESS_KEY=""
AWS_BUCKET_NAME=""
AWS_REGION=""

# SMTP (email delivery)
SMTP_HOST=""
SMTP_PORT="587"
SMTP_USER=""
SMTP_PASSWORD=""
SMTP_FROM="[email protected]"

# Google Maps Embed
GOOGLE_MAPS_API_KEY=""
```

### Setup

```bash
# Run database migrations
npx prisma db push

# Start development server
npm run dev
```

Open [http://localhost:3000](http://localhost:3000).

## Project Structure

```
Mapody/
├── prisma/                  # Database schema & migrations
│   ├── schema.prisma
│   └── migrations/
├── public/                  # Static assets
├── src/
│   ├── app/                 # Next.js App Router pages
│   │   ├── api/             # API routes
│   │   │   ├── ai/          # AI endpoints (rewrite, tagline, faq, alttext, sentiment)
│   │   │   ├── auth/        # Authentication (login, signup, forgot-password, verify)
│   │   │   ├── sites/       # Site CRUD, pages, publish, duplicate
│   │   │   ├── user/        # Profile, credits, theme, preferences
│   │   │   ├── contact/     # Contact form handler
│   │   │   ├── tracking/    # Analytics tracking
│   │   │   ├── upload/      # File upload (S3)
│   │   │   ├── scrape/      # Google Maps scraping proxy
│   │   │   └── analytics/   # Analytics data endpoint
│   │   ├── auth/            # Auth pages (login, signup, forgot-password, verify)
│   │   ├── dashboard/       # User dashboard
│   │   ├── editor/          # Site editor
│   │   ├── preview/         # Site preview
│   │   ├── analytics/       # Analytics dashboard
│   │   ├── pricing/         # Pricing page
│   │   ├── settings/        # User settings
│   │   └── support/         # Support page
│   ├── components/          # React components
│   ├── lib/                 # Utilities & services
│   │   ├── ai.ts            # OpenAI integration
│   │   ├── apify.ts         # Apify scraping client
│   │   ├── auth.ts          # NextAuth config
│   │   ├── email.ts         # Nodemailer email service
│   │   ├── prisma.ts        # Prisma client
│   │   ├── s3.ts            # AWS S3 uploads
│   │   └── utils.ts         # Shared utilities
│   ├── middleware.ts         # Rate limiting middleware
│   ├── store/               # Zustand state management
│   └── types/               # TypeScript declarations
├── .gitignore
├── LICENSE
├── next.config.mjs
├── package.json
├── tailwind.config.ts
└── tsconfig.json
```

## API Routes

| Method | Endpoint | Description |
|---|---|---|
| POST | `/api/scrape` | Scrape Google Maps data from a URL |
| POST | `/api/ai/rewrite` | Generate AI page content |
| POST | `/api/ai/tagline` | Generate a business tagline |
| POST | `/api/ai/faq` | Generate FAQ entries |
| POST | `/api/ai/alttext` | Generate image alt text |
| POST | `/api/ai/sentiment` | Analyze review sentiment |
| GET/POST | `/api/sites` | List or create sites |
| GET/PUT/DELETE | `/api/sites/[id]` | Manage a site |
| POST | `/api/sites/[id]/publish` | Publish a site |
| POST | `/api/sites/[id]/duplicate` | Duplicate a site |
| GET/POST | `/api/sites/[id]/pages` | List or add pages |
| PUT/DELETE | `/api/sites/[id]/pages/[pageId]` | Update or delete a page |
| POST | `/api/contact` | Submit a contact form |
| POST | `/api/tracking` | Record a page view |
| POST | `/api/upload` | Upload a file to S3 |
| GET/PUT | `/api/user/profile` | Get or update user profile |
| GET/POST | `/api/user/credits` | Check or use credits |
| PUT | `/api/user/theme` | Save user theme |
| GET/PUT | `/api/user/preferences` | Get or update preferences |
| POST | `/api/analytics` | Get analytics data |

## Security Features

- **Rate Limiting** — Global middleware with per-route limits (scrape: 5/min, auth: 3/5min, AI: 20/min)
- **Input Validation** — Zod schemas for all API inputs, HTML sanitization on user content
- **Ownership Checks** — All site/page operations verify user ownership
- **Atomic Operations** — Credit deduction uses raw SQL to prevent race conditions
- **Secure Tokens** — OTP generation uses `crypto.randomInt()` instead of `Math.random()`
- **Session Security** — JWT strategy with httpOnly cookies, CSRF protection

## Contributing

Contributions are welcome! Please open an issue or submit a pull request.

## License

This project is licensed under the [MIT License](LICENSE).

---

Built with care by [agrosevakmak](https://github.com/agrosevakmak)
反馈内容错误

看看同类模板

对比同技术栈与用途的模板,找到更适合的视觉与内容结构。