Refactor main.go to embed static files and templates, update logging for service start, and enhance README with API Key instructions and deployment steps.
This commit is contained in:
parent
1bf109ca6d
commit
6940d5c3ca
143
README.md
143
README.md
@ -2,14 +2,12 @@
|
||||
|
||||
一个帮助多人寻找最佳聚会地点的地图应用。输入多个参与者的位置,自动计算几何中心,并在中心点附近搜索咖啡馆、餐厅、KTV 等聚会场所。
|
||||
|
||||

|
||||
|
||||
## ✨ 功能特点
|
||||
|
||||
- **📍 多点位置设置**
|
||||
- 通过地址搜索添加位置
|
||||
- 通过地址搜索添加位置(支持输入提示和自动补全)
|
||||
- 直接在地图上点击添加位置
|
||||
- 支持输入提示和自动补全
|
||||
- 支持删除和管理已添加的位置
|
||||
|
||||
- **🎯 智能中心计算**
|
||||
- 使用球面几何算法计算多点中心
|
||||
@ -18,70 +16,102 @@
|
||||
- **🔍 周边搜索**
|
||||
- 支持自定义搜索关键词
|
||||
- 可调节搜索半径(500米-10公里)
|
||||
- 预设常用场所类型(咖啡馆、餐厅、KTV等)
|
||||
- 预设常用场所类型(咖啡馆、餐厅、网咖、棋牌室、KTV等)
|
||||
- 搜索结果支持名称/地址筛选
|
||||
|
||||
- **🗺️ 地图可视化**
|
||||
- 深色主题地图
|
||||
- 清晰的标记和信息展示
|
||||
- 搜索范围可视化
|
||||
- 半透明信息窗口
|
||||
|
||||
- **🧭 导航功能**
|
||||
- 点击搜索结果可查看详情
|
||||
- 一键跳转高德地图导航
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 前置要求
|
||||
### 方式一:下载可执行文件(推荐)
|
||||
|
||||
1. 从 Releases 下载对应系统的可执行文件
|
||||
2. 创建 `config.json` 配置文件
|
||||
3. 运行程序
|
||||
|
||||
### 方式二:从源码构建
|
||||
|
||||
#### 前置要求
|
||||
|
||||
- Go 1.21+
|
||||
- 高德地图开发者账号和 Web 服务 API Key
|
||||
- 高德地图开发者账号
|
||||
|
||||
### 获取高德地图 API Key
|
||||
#### 获取高德地图 API Key
|
||||
|
||||
1. 访问 [高德开放平台](https://lbs.amap.com/)
|
||||
2. 注册/登录开发者账号
|
||||
3. 进入「控制台」→「应用管理」→「创建新应用」
|
||||
4. 添加 Key,选择「Web 服务」类型
|
||||
5. 复制生成的 Key
|
||||
4. 添加两个 Key:
|
||||
- **Web服务** 类型 - 用于后端 API 调用
|
||||
- **Web端(JS API)** 类型 - 用于前端地图展示
|
||||
5. JS API Key 需要配置安全密钥
|
||||
|
||||
### 安装步骤
|
||||
#### 安装步骤
|
||||
|
||||
1. 克隆项目
|
||||
```bash
|
||||
# 克隆项目
|
||||
git clone https://github.com/yourusername/meeting-point.git
|
||||
cd meeting-point
|
||||
```
|
||||
|
||||
2. 安装依赖
|
||||
```bash
|
||||
# 安装依赖
|
||||
go mod download
|
||||
```
|
||||
|
||||
3. 配置 API Key
|
||||
|
||||
复制配置文件模板并填入你的 Key:
|
||||
```bash
|
||||
# 复制配置文件
|
||||
cp config.example.json config.json
|
||||
|
||||
# 编辑 config.json,填入 API Key
|
||||
|
||||
# 启动服务
|
||||
go run main.go
|
||||
```
|
||||
|
||||
编辑 `config.json`:
|
||||
#### 构建可执行文件
|
||||
|
||||
```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": "你的高德地图API_Key",
|
||||
"amap_key": "你的Web服务API_Key",
|
||||
"amap_js_key": "你的JS_API_Key",
|
||||
"amap_js_secret": "你的JS_API安全密钥",
|
||||
"port": "8080"
|
||||
}
|
||||
```
|
||||
|
||||
或者使用环境变量:
|
||||
```bash
|
||||
export AMAP_KEY="你的高德地图API_Key"
|
||||
export PORT="8080"
|
||||
```
|
||||
| 字段 | 必填 | 说明 |
|
||||
|------|------|------|
|
||||
| `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 |
|
||||
|
||||
4. 启动服务
|
||||
```bash
|
||||
go run main.go
|
||||
```
|
||||
### 环境变量
|
||||
|
||||
5. 访问应用
|
||||
环境变量优先级高于配置文件:
|
||||
|
||||
打开浏览器访问 http://localhost:8080
|
||||
- `AMAP_KEY` - 高德 Web 服务 API Key
|
||||
- `PORT` - 服务端口
|
||||
|
||||
## 📖 使用说明
|
||||
|
||||
@ -103,7 +133,10 @@ go run main.go
|
||||
|
||||
- 地图上会显示计算出的中心点(金色星星标记)
|
||||
- 搜索到的场所会以绿色标记显示
|
||||
- 左侧列表会显示详细信息,点击可在地图上定位
|
||||
- 右侧浮动面板显示搜索结果列表
|
||||
- 支持按名称/地址筛选结果
|
||||
- 点击结果项可在地图上定位并显示详情
|
||||
- 点击「导航前往」可跳转高德地图导航
|
||||
|
||||
## 🏗️ 技术架构
|
||||
|
||||
@ -111,13 +144,14 @@ go run main.go
|
||||
|
||||
- **Go** - 高性能后端语言
|
||||
- **Gin** - Web 框架
|
||||
- **embed** - 静态资源嵌入(单文件部署)
|
||||
- **高德地图 Web API** - 地理编码、POI 搜索
|
||||
|
||||
### 前端
|
||||
|
||||
- **原生 JavaScript** - 无框架依赖
|
||||
- **高德地图 JS API** - 地图展示和交互
|
||||
- **CSS3** - 现代化 UI 设计
|
||||
- **高德地图 JS API 2.0** - 地图展示和交互
|
||||
- **CSS3** - 现代化深色主题 UI
|
||||
|
||||
### API 端点
|
||||
|
||||
@ -134,11 +168,13 @@ go run main.go
|
||||
|
||||
```
|
||||
meeting-point/
|
||||
├── main.go # 后端主程序
|
||||
├── main.go # 后端主程序(包含嵌入的静态资源)
|
||||
├── go.mod # Go 模块文件
|
||||
├── go.sum # 依赖锁定文件
|
||||
├── config.json # 配置文件(需创建)
|
||||
├── config.example.json # 配置文件模板
|
||||
├── build.bat # Windows 构建脚本
|
||||
├── build-linux.bat # Linux 构建脚本
|
||||
├── README.md # 项目说明
|
||||
├── templates/
|
||||
│ └── index.html # 前端页面模板
|
||||
@ -149,22 +185,34 @@ meeting-point/
|
||||
└── app.js # 前端逻辑
|
||||
```
|
||||
|
||||
## 🔧 配置说明
|
||||
## 🐧 Linux 部署
|
||||
|
||||
### config.json
|
||||
```bash
|
||||
# 上传可执行文件和配置文件到服务器
|
||||
|
||||
```json
|
||||
# 设置执行权限
|
||||
chmod +x meeting-point-linux-amd64
|
||||
|
||||
# 创建配置文件
|
||||
cat > config.json << 'EOF'
|
||||
{
|
||||
"amap_key": "高德地图API Key",
|
||||
"port": "服务端口,默认8080"
|
||||
"amap_key": "你的Web服务API_Key",
|
||||
"amap_js_key": "你的JS_API_Key",
|
||||
"amap_js_secret": "你的JS_API安全密钥",
|
||||
"port": "8080"
|
||||
}
|
||||
EOF
|
||||
|
||||
# 前台运行
|
||||
./meeting-point-linux-amd64
|
||||
|
||||
# 后台运行
|
||||
nohup ./meeting-point-linux-amd64 > meeting-point.log 2>&1 &
|
||||
|
||||
# 使用 systemd 管理(推荐)
|
||||
# 创建 /etc/systemd/system/meeting-point.service
|
||||
```
|
||||
|
||||
### 环境变量
|
||||
|
||||
- `AMAP_KEY` - 高德地图 API Key(优先级高于配置文件)
|
||||
- `PORT` - 服务端口
|
||||
|
||||
## 📝 开发计划
|
||||
|
||||
- [ ] 添加路线规划功能
|
||||
@ -172,6 +220,7 @@ meeting-point/
|
||||
- [ ] 添加位置分享功能
|
||||
- [ ] 移动端适配优化
|
||||
- [ ] 添加历史记录功能
|
||||
- [ ] Docker 容器化部署
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
|
||||
47
build-linux.bat
Normal file
47
build-linux.bat
Normal file
@ -0,0 +1,47 @@
|
||||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo ========================================
|
||||
echo 会面点 Meeting Point - Linux 构建
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
:: 检查 Go 是否安装
|
||||
where go >nul 2>nul
|
||||
if %ERRORLEVEL% neq 0 (
|
||||
echo [错误] 未找到 Go,请先安装 Go 语言环境
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [1/3] 清理旧构建...
|
||||
if not exist "dist" mkdir dist
|
||||
|
||||
echo [2/3] 编译 Linux (amd64) 可执行文件...
|
||||
set CGO_ENABLED=0
|
||||
set GOOS=linux
|
||||
set GOARCH=amd64
|
||||
go build -ldflags="-s -w" -o dist\meeting-point-linux-amd64 .
|
||||
|
||||
if %ERRORLEVEL% neq 0 (
|
||||
echo [错误] 编译失败
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [3/3] 复制配置文件...
|
||||
copy config.example.json dist\config.json >nul 2>nul
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 构建完成!
|
||||
echo ========================================
|
||||
echo.
|
||||
echo 输出文件: dist\meeting-point-linux-amd64
|
||||
echo.
|
||||
echo Linux 使用方法:
|
||||
echo 1. 上传文件到 Linux 服务器
|
||||
echo 2. chmod +x meeting-point-linux-amd64
|
||||
echo 3. 创建 config.json 配置文件
|
||||
echo 4. ./meeting-point-linux-amd64
|
||||
echo.
|
||||
pause
|
||||
49
build.bat
Normal file
49
build.bat
Normal file
@ -0,0 +1,49 @@
|
||||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo ========================================
|
||||
echo 会面点 Meeting Point - 构建脚本
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
:: 检查 Go 是否安装
|
||||
where go >nul 2>nul
|
||||
if %ERRORLEVEL% neq 0 (
|
||||
echo [错误] 未找到 Go,请先安装 Go 语言环境
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [1/3] 清理旧构建...
|
||||
if exist "dist" rd /s /q "dist"
|
||||
mkdir dist
|
||||
|
||||
echo [2/3] 编译 Windows 可执行文件...
|
||||
set CGO_ENABLED=0
|
||||
set GOOS=windows
|
||||
set GOARCH=amd64
|
||||
go build -ldflags="-s -w" -o dist\meeting-point.exe .
|
||||
|
||||
if %ERRORLEVEL% neq 0 (
|
||||
echo [错误] 编译失败
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [3/3] 复制配置文件...
|
||||
copy config.example.json dist\config.json >nul
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 构建完成!
|
||||
echo ========================================
|
||||
echo.
|
||||
echo 输出目录: dist\
|
||||
echo - meeting-point.exe (可执行文件)
|
||||
echo - config.json (配置文件模板)
|
||||
echo.
|
||||
echo 使用方法:
|
||||
echo 1. 编辑 config.json,填入高德地图 API Key
|
||||
echo 2. 双击运行 meeting-point.exe
|
||||
echo 3. 打开浏览器访问 http://localhost:8080
|
||||
echo.
|
||||
pause
|
||||
33
main.go
33
main.go
@ -1,9 +1,12 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"io"
|
||||
"io/fs"
|
||||
"log"
|
||||
"math"
|
||||
"net/http"
|
||||
@ -14,6 +17,12 @@ import (
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
//go:embed templates/*
|
||||
var templatesFS embed.FS
|
||||
|
||||
//go:embed static/*
|
||||
var staticFS embed.FS
|
||||
|
||||
// Config 配置结构
|
||||
type Config struct {
|
||||
AmapKey string `json:"amap_key"` // Web服务API Key
|
||||
@ -120,9 +129,13 @@ func main() {
|
||||
|
||||
r := gin.Default()
|
||||
|
||||
// 静态文件服务
|
||||
r.Static("/static", "./static")
|
||||
r.LoadHTMLGlob("templates/*")
|
||||
// 从嵌入的文件系统加载模板
|
||||
tmpl := template.Must(template.New("").ParseFS(templatesFS, "templates/*.html"))
|
||||
r.SetHTMLTemplate(tmpl)
|
||||
|
||||
// 从嵌入的文件系统提供静态文件
|
||||
staticSubFS, _ := fs.Sub(staticFS, "static")
|
||||
r.StaticFS("/static", http.FS(staticSubFS))
|
||||
|
||||
// 路由
|
||||
r.GET("/", indexHandler)
|
||||
@ -137,7 +150,10 @@ func main() {
|
||||
port = "8080"
|
||||
}
|
||||
|
||||
log.Printf("服务启动在 http://localhost:%s", port)
|
||||
log.Printf("========================================")
|
||||
log.Printf(" 会面点 Meeting Point")
|
||||
log.Printf(" 服务启动在 http://localhost:%s", port)
|
||||
log.Printf("========================================")
|
||||
r.Run(":" + port)
|
||||
}
|
||||
|
||||
@ -151,6 +167,8 @@ func loadConfig() {
|
||||
if err != nil {
|
||||
log.Printf("解析配置文件失败: %v", err)
|
||||
}
|
||||
} else {
|
||||
log.Printf("警告: 未找到 config.json 配置文件,请确保配置文件存在")
|
||||
}
|
||||
|
||||
// 环境变量覆盖
|
||||
@ -164,6 +182,10 @@ func loadConfig() {
|
||||
if config.Port == "" {
|
||||
config.Port = "8080"
|
||||
}
|
||||
|
||||
if config.AmapKey == "" {
|
||||
log.Printf("警告: 未配置高德地图 API Key,请在 config.json 中配置 amap_key")
|
||||
}
|
||||
}
|
||||
|
||||
func indexHandler(c *gin.Context) {
|
||||
@ -340,8 +362,7 @@ func searchPOIHandler(c *gin.Context) {
|
||||
defer resp.Body.Close()
|
||||
|
||||
body, _ := io.ReadAll(resp.Body)
|
||||
log.Printf("高德POI搜索响应: %s", string(body))
|
||||
|
||||
|
||||
var amapResp AmapPOIResponse
|
||||
if err := json.Unmarshal(body, &amapResp); err != nil {
|
||||
log.Printf("解析POI响应失败: %v", err)
|
||||
|
||||
BIN
meeting-point-linux-amd64
Normal file
BIN
meeting-point-linux-amd64
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user