# 会面点 Meeting Point

一个帮助多人寻找最佳聚会地点的地图应用。输入多个参与者的位置，自动计算几何中心，并在中心点附近搜索咖啡馆、餐厅、KTV 等聚会场所。

## ✨ 功能特点

- **📍 多点位置设置**
  - 通过地址搜索添加位置（支持输入提示和自动补全）
  - 直接在地图上点击添加位置（无需确认，即点即加）
  - 支持删除和管理已添加的位置
  - 启动时自动定位（先 IP 定位快速显示，再精确定位）
  - 右下角定位按钮可随时重新定位

- **🎯 智能中心计算**
  - 使用球面几何算法计算多点中心
  - 准确计算地球曲面上的几何中心

- **🔍 周边搜索**
  - 支持自定义搜索关键词
  - 可调节搜索半径（500米-10公里，默认1公里）
  - 预设常用场所类型（咖啡馆、餐厅、网咖、棋牌室、KTV、电影院、健身房、书店）
  - 搜索结果支持名称/地址筛选
  - 未设置搜索类型时自动弹出设置面板

- **🗺️ 地图可视化**
  - 深色主题地图
  - 清晰的标记和信息展示
  - 搜索范围可视化（橙色圆圈）
  - 半透明信息窗口

- **📱 移动端适配**
  - 完整的响应式设计
  - 底部弹出式设置面板
  - 底部快捷操作栏
  - 触摸优化的交互体验

- **🧭 导航功能**
  - 点击搜索结果可查看详情
  - 一键跳转高德地图导航

- **🔧 智能端口管理**
  - 启动时自动检测端口占用
  - 自动释放被占用的端口

## 🚀 快速开始

### 方式一：下载可执行文件（推荐）

1. 从 Releases 下载对应系统的可执行文件
2. 创建 `config.json` 配置文件
3. 运行程序

### 方式二：从源码构建

#### 前置要求

- Go 1.21+
- 高德地图开发者账号

#### 获取高德地图 API Key

1. 访问 [高德开放平台](https://lbs.amap.com/)
2. 注册/登录开发者账号
3. 进入「控制台」→「应用管理」→「创建新应用」
4. 添加两个 Key：
   - **Web服务** 类型 - 用于后端 API 调用
   - **Web端(JS API)** 类型 - 用于前端地图展示
5. JS API Key 需要配置安全密钥

#### 安装步骤

```bash
# 克隆项目
git clone https://github.com/yourusername/meeting-point.git
cd meeting-point

# 安装依赖
go mod download

# 复制配置文件
cp config.example.json config.json

# 编辑 config.json，填入 API Key

# 启动服务
go run main.go
```

#### 构建可执行文件

```bash
# Windows
go build -ldflags="-s -w" -o meeting-point.exe .

# Linux
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o meeting-point-linux-amd64 .

# macOS
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o meeting-point-darwin-amd64 .
```

## ⚙️ 配置说明

### config.json

```json
{
    "amap_key": "你的Web服务API_Key",
    "amap_js_key": "你的JS_API_Key",
    "amap_js_secret": "你的JS_API安全密钥",
    "port": "9876"
}
```

| 字段 | 必填 | 说明 |
|------|------|------|
| `amap_key` | ✅ | 高德 Web 服务 API Key，用于后端地理编码和 POI 搜索 |
| `amap_js_key` | ❌ | 高德 JS API Key，用于前端地图展示。不填则使用 `amap_key` |
| `amap_js_secret` | ✅ | 高德 JS API 安全密钥，JS API 2.0 必需 |
| `port` | ❌ | 服务端口，默认 8080 |

### 环境变量

环境变量优先级高于配置文件：

- `AMAP_KEY` - 高德 Web 服务 API Key
- `PORT` - 服务端口

## 📖 使用说明

### 添加位置

有两种方式添加参与者位置：

1. **搜索添加**：在搜索框中输入地址或地点名称，从下拉列表中选择
2. **点击添加**：直接在地图上点击想要添加的位置（即点即加）

### 搜索聚会地点

1. 添加至少 2 个位置点
2. 在「搜索类型」中输入或选择想要查找的场所类型
3. 调整搜索半径（默认1公里）
4. 点击「搜索最佳会面点」按钮

### 查看结果

- 地图上会显示计算出的中心点（金色星星标记）
- 搜索到的场所会以绿色标记显示
- 浮动面板显示搜索结果列表（PC端右侧，移动端底部弹出）
- 支持按名称/地址筛选结果
- 点击结果项可在地图上定位并显示详情
- 点击「导航前往」可跳转高德地图导航

## 🏗️ 技术架构

### 后端

- **Go** - 高性能后端语言
- **Gin** - Web 框架
- **embed** - 静态资源嵌入（单文件部署）
- **高德地图 Web API** - 地理编码、POI 搜索

### 前端

- **原生 JavaScript** - 无框架依赖
- **高德地图 JS API 2.0** - 地图展示和交互
- **CSS3** - 现代化深色主题 UI，完整响应式设计

### API 端点

| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/` | 主页面 |
| GET | `/api/config` | 获取配置 |
| POST | `/api/geocode` | 地址转坐标 |
| POST | `/api/center` | 计算中心点 |
| POST | `/api/search` | 搜索周边 POI |
| GET | `/api/tips` | 输入提示 |

## 📁 项目结构

```
meeting-point/
├── main.go              # 后端主程序（包含嵌入的静态资源）
├── go.mod               # Go 模块文件
├── go.sum               # 依赖锁定文件
├── config.json          # 配置文件（需创建）
├── config.example.json  # 配置文件模板
├── build.bat            # Windows 构建脚本
├── build-linux.bat      # Linux 构建脚本
├── README.md            # 项目说明
├── templates/
│   └── index.html       # 前端页面模板
└── static/
    ├── css/
    │   └── style.css    # 样式文件
    └── js/
        └── app.js       # 前端逻辑
```

## 🐧 Linux 部署

```bash
# 上传可执行文件和配置文件到服务器

# 设置执行权限
chmod +x meeting-point-linux-amd64

# 创建配置文件
cat > config.json << 'EOF'
{
    "amap_key": "你的Web服务API_Key",
    "amap_js_key": "你的JS_API_Key",
    "amap_js_secret": "你的JS_API安全密钥",
    "port": "9876"
}
EOF

# 前台运行
./meeting-point-linux-amd64

# 后台运行
nohup ./meeting-point-linux-amd64 > meeting-point.log 2>&1 &

# 使用 systemd 管理（推荐）
# 创建 /etc/systemd/system/meeting-point.service
```

### Systemd 服务配置

```ini
[Unit]
Description=Meeting Point Service
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/meeting-point
ExecStart=/opt/meeting-point/meeting-point-linux-amd64
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
```

## 📝 更新日志

### v1.1.0
- ✅ 完整的移动端适配
- ✅ 点击地图直接添加位置（无需确认）
- ✅ 启动时自动 IP 定位
- ✅ 智能端口占用检测和释放
- ✅ 未设置搜索类型时自动弹出设置面板
- ✅ 搜索半径默认改为1公里
- ✅ 优化浮动按钮样式

### v1.0.0
- 🎉 首次发布
- 多点位置设置
- 智能中心计算
- 周边 POI 搜索
- 高德地图导航

## 📄 许可证

MIT License

## 🤝 贡献

欢迎提交 Issue 和 Pull Request！
