diff --git a/README.md b/README.md index d3885e1..1e08837 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,12 @@ 一个帮助多人寻找最佳聚会地点的地图应用。输入多个参与者的位置,自动计算几何中心,并在中心点附近搜索咖啡馆、餐厅、KTV 等聚会场所。 -![Preview](preview.png) - ## ✨ 功能特点 - **📍 多点位置设置** - - 通过地址搜索添加位置 + - 通过地址搜索添加位置(支持输入提示和自动补全) - 直接在地图上点击添加位置 - - 支持输入提示和自动补全 + - 支持删除和管理已添加的位置 - **🎯 智能中心计算** - 使用球面几何算法计算多点中心 @@ -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 容器化部署 ## 📄 许可证 diff --git a/build-linux.bat b/build-linux.bat new file mode 100644 index 0000000..91d9570 --- /dev/null +++ b/build-linux.bat @@ -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 diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..48778bd --- /dev/null +++ b/build.bat @@ -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 diff --git a/main.go b/main.go index 13fea97..1a57d19 100644 --- a/main.go +++ b/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) diff --git a/meeting-point-linux-amd64 b/meeting-point-linux-amd64 new file mode 100644 index 0000000..8709c6f Binary files /dev/null and b/meeting-point-linux-amd64 differ