从零搭建GEO营销系统:定位、活动、优惠券到上线部署实战
GEO营销 部署完整教程|附源码
本文将从零开始讲解如何搭建一个可落地的 GEO营销系统,包括项目思路、功能设计、技术选型、目录结构、核心源码、环境部署、上线发布与优化建议。
这里的 GEO营销 可以理解为面向地理位置、城市、区域、人群标签的精准营销系统,适用于本地生活、连锁门店、区域代理、同城服务、房产、教育培训、餐饮、美业等场景。
一、什么是GEO营销?
GEO营销,全称可以理解为 Geographic Marketing,即基于地理位置的营销方式。
传统营销通常是“广撒网”,例如在全网投放广告、统一发送短信、统一展示活动页面。但不同城市、不同区域、不同门店的用户需求并不一样。例如:
- 北京用户更关注高端服务和效率;
- 三四线城市用户更关注价格和优惠;
- 商场附近用户适合推送到店优惠券;
- 学校周边用户适合教育、餐饮、文具类活动;
- 写字楼周边用户适合咖啡、轻食、健身卡推广。
GEO营销的核心就是:
在正确的地理位置,把正确的内容,推送给正确的人群。
一个完整的GEO营销系统,通常包含以下能力:
- 用户定位;
- 城市识别;
- 区域活动匹配;
- 门店附近推荐;
- 优惠券发放;
- 用户行为记录;
- 营销数据统计;
- 后台活动配置;
- 前端落地页展示;
- API接口服务。
本文将实现一个简化版但完整可运行的GEO营销系统。
二、项目功能说明
本文实现的系统包含以下模块:
1. 用户端功能
用户访问活动页后,系统会:
- 获取用户当前经纬度;
- 根据经纬度判断用户所在城市;
- 查询该城市是否有营销活动;
- 展示附近门店;
- 展示可领取优惠券;
- 记录用户访问行为。
2. 后端接口功能
后端提供以下接口:
| 接口 | 功能 |
|---|---|
/api/location |
根据经纬度获取城市与推荐信息 |
/api/campaigns |
获取当前城市营销活动 |
/api/coupons |
获取优惠券列表 |
/api/track |
记录用户行为 |
/api/stores/nearby |
查询附近门店 |
3. 数据存储
本教程为了便于部署,使用 SQLite 数据库。
如果用于生产环境,可以替换为 MySQL、PostgreSQL 或 MongoDB。
三、技术选型
本项目采用前后端分离架构。
后端技术
- Node.js
- Express
- SQLite
- CORS
- dotenv
前端技术
- HTML
- CSS
- JavaScript
- 浏览器定位 API
- Fetch API
部署方式
- 本地部署
- Linux服务器部署
- PM2守护进程部署
- Nginx反向代理部署
四、项目目录结构
创建项目目录:
geo-marketing-demo
├── server
│ ├── app.js
│ ├── db.js
│ ├── init.sql
│ ├── package.json
│ └── .env
├── public
│ ├── index.html
│ ├── style.css
│ └── main.js
└── README.md
其中:
server:后端服务目录;public:前端页面目录;app.js:Express主服务;db.js:数据库连接;init.sql:初始化SQL;index.html:营销落地页;main.js:前端定位与接口请求逻辑。
五、后端源码
1. 创建后端项目
进入项目目录:
mkdir geo-marketing-demo
cd geo-marketing-demo
mkdir server public
cd server
npm init -y
安装依赖:
npm install express sqlite3 cors dotenv
如果你想在开发环境自动重启服务,可以安装:
npm install nodemon -D
2. package.json
在 server/package.json 中写入:
{
"name": "geo-marketing-server",
"version": "1.0.0",
"description": "GEO营销系统后端服务",
"main": "app.js",
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js",
"init-db": "node db.js"
},
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"express": "^4.18.3",
"sqlite3": "^5.1.7"
},
"devDependencies": {
"nodemon": "^3.1.0"
}
}
3. 环境变量配置
创建 server/.env:
PORT=3000
DB_FILE=./geo_marketing.db
4. 数据库初始化SQL
创建 server/init.sql:
DROP TABLE IF EXISTS campaigns;
DROP TABLE IF EXISTS stores;
DROP TABLE IF EXISTS coupons;
DROP TABLE IF EXISTS user_tracks;
CREATE TABLE campaigns (
id INTEGER PRIMARY KEY AUTOINCREMENT,
city TEXT NOT NULL,
title TEXT NOT NULL,
description TEXT,
banner TEXT,
start_time TEXT,
end_time TEXT,
status INTEGER DEFAULT 1
);
CREATE TABLE stores (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
city TEXT NOT NULL,
address TEXT,
lat REAL NOT NULL,
lng REAL NOT NULL,
phone TEXT
);
CREATE TABLE coupons (
id INTEGER PRIMARY KEY AUTOINCREMENT,
city TEXT NOT NULL,
title TEXT NOT NULL,
amount INTEGER DEFAULT 0,
condition_text TEXT,
status INTEGER DEFAULT 1
);
CREATE TABLE user_tracks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT,
event TEXT,
city TEXT,
lat REAL,
lng REAL,
created_at TEXT DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO campaigns(city, title, description, banner, start_time, end_time, status)
VALUES
('北京', '北京