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:
Ethanfly 2026-01-09 18:59:41 +08:00
parent 1bf109ca6d
commit 6940d5c3ca
5 changed files with 219 additions and 53 deletions

143
README.md
View File

@ -2,14 +2,12 @@
一个帮助多人寻找最佳聚会地点的地图应用。输入多个参与者的位置自动计算几何中心并在中心点附近搜索咖啡馆、餐厅、KTV 等聚会场所。 一个帮助多人寻找最佳聚会地点的地图应用。输入多个参与者的位置自动计算几何中心并在中心点附近搜索咖啡馆、餐厅、KTV 等聚会场所。
![Preview](preview.png)
## ✨ 功能特点 ## ✨ 功能特点
- **📍 多点位置设置** - **📍 多点位置设置**
- 通过地址搜索添加位置 - 通过地址搜索添加位置(支持输入提示和自动补全)
- 直接在地图上点击添加位置 - 直接在地图上点击添加位置
- 支持输入提示和自动补全 - 支持删除和管理已添加的位置
- **🎯 智能中心计算** - **🎯 智能中心计算**
- 使用球面几何算法计算多点中心 - 使用球面几何算法计算多点中心
@ -18,70 +16,102 @@
- **🔍 周边搜索** - **🔍 周边搜索**
- 支持自定义搜索关键词 - 支持自定义搜索关键词
- 可调节搜索半径500米-10公里 - 可调节搜索半径500米-10公里
- 预设常用场所类型咖啡馆、餐厅、KTV等 - 预设常用场所类型咖啡馆、餐厅、网咖、棋牌室、KTV等
- 搜索结果支持名称/地址筛选
- **🗺️ 地图可视化** - **🗺️ 地图可视化**
- 深色主题地图 - 深色主题地图
- 清晰的标记和信息展示 - 清晰的标记和信息展示
- 搜索范围可视化 - 搜索范围可视化
- 半透明信息窗口
- **🧭 导航功能**
- 点击搜索结果可查看详情
- 一键跳转高德地图导航
## 🚀 快速开始 ## 🚀 快速开始
### 前置要求 ### 方式一:下载可执行文件(推荐)
1. 从 Releases 下载对应系统的可执行文件
2. 创建 `config.json` 配置文件
3. 运行程序
### 方式二:从源码构建
#### 前置要求
- Go 1.21+ - Go 1.21+
- 高德地图开发者账号和 Web 服务 API Key - 高德地图开发者账号
### 获取高德地图 API Key #### 获取高德地图 API Key
1. 访问 [高德开放平台](https://lbs.amap.com/) 1. 访问 [高德开放平台](https://lbs.amap.com/)
2. 注册/登录开发者账号 2. 注册/登录开发者账号
3. 进入「控制台」→「应用管理」→「创建新应用」 3. 进入「控制台」→「应用管理」→「创建新应用」
4. 添加 Key选择「Web 服务」类型 4. 添加两个 Key
5. 复制生成的 Key - **Web服务** 类型 - 用于后端 API 调用
- **Web端(JS API)** 类型 - 用于前端地图展示
5. JS API Key 需要配置安全密钥
### 安装步骤 #### 安装步骤
1. 克隆项目
```bash ```bash
# 克隆项目
git clone https://github.com/yourusername/meeting-point.git git clone https://github.com/yourusername/meeting-point.git
cd meeting-point cd meeting-point
```
2. 安装依赖 # 安装依赖
```bash
go mod download go mod download
```
3. 配置 API Key # 复制配置文件
复制配置文件模板并填入你的 Key
```bash
cp config.example.json config.json 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 ```json
{ {
"amap_key": "你的高德地图API_Key", "amap_key": "你的Web服务API_Key",
"amap_js_key": "你的JS_API_Key",
"amap_js_secret": "你的JS_API安全密钥",
"port": "8080" "port": "8080"
} }
``` ```
或者使用环境变量: | 字段 | 必填 | 说明 |
```bash |------|------|------|
export AMAP_KEY="你的高德地图API_Key" | `amap_key` | ✅ | 高德 Web 服务 API Key用于后端地理编码和 POI 搜索 |
export PORT="8080" | `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** - 高性能后端语言 - **Go** - 高性能后端语言
- **Gin** - Web 框架 - **Gin** - Web 框架
- **embed** - 静态资源嵌入(单文件部署)
- **高德地图 Web API** - 地理编码、POI 搜索 - **高德地图 Web API** - 地理编码、POI 搜索
### 前端 ### 前端
- **原生 JavaScript** - 无框架依赖 - **原生 JavaScript** - 无框架依赖
- **高德地图 JS API** - 地图展示和交互 - **高德地图 JS API 2.0** - 地图展示和交互
- **CSS3** - 现代化 UI 设计 - **CSS3** - 现代化深色主题 UI
### API 端点 ### API 端点
@ -134,11 +168,13 @@ go run main.go
``` ```
meeting-point/ meeting-point/
├── main.go # 后端主程序 ├── main.go # 后端主程序(包含嵌入的静态资源)
├── go.mod # Go 模块文件 ├── go.mod # Go 模块文件
├── go.sum # 依赖锁定文件 ├── go.sum # 依赖锁定文件
├── config.json # 配置文件(需创建) ├── config.json # 配置文件(需创建)
├── config.example.json # 配置文件模板 ├── config.example.json # 配置文件模板
├── build.bat # Windows 构建脚本
├── build-linux.bat # Linux 构建脚本
├── README.md # 项目说明 ├── README.md # 项目说明
├── templates/ ├── templates/
│ └── index.html # 前端页面模板 │ └── index.html # 前端页面模板
@ -149,22 +185,34 @@ meeting-point/
└── app.js # 前端逻辑 └── app.js # 前端逻辑
``` ```
## 🔧 配置说明 ## 🐧 Linux 部署
### config.json ```bash
# 上传可执行文件和配置文件到服务器
```json # 设置执行权限
chmod +x meeting-point-linux-amd64
# 创建配置文件
cat > config.json << 'EOF'
{ {
"amap_key": "高德地图API Key", "amap_key": "你的Web服务API_Key",
"port": "服务端口默认8080" "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
View 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
View 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

31
main.go
View File

@ -1,9 +1,12 @@
package main package main
import ( import (
"embed"
"encoding/json" "encoding/json"
"fmt" "fmt"
"html/template"
"io" "io"
"io/fs"
"log" "log"
"math" "math"
"net/http" "net/http"
@ -14,6 +17,12 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
//go:embed templates/*
var templatesFS embed.FS
//go:embed static/*
var staticFS embed.FS
// Config 配置结构 // Config 配置结构
type Config struct { type Config struct {
AmapKey string `json:"amap_key"` // Web服务API Key AmapKey string `json:"amap_key"` // Web服务API Key
@ -120,9 +129,13 @@ func main() {
r := gin.Default() r := gin.Default()
// 静态文件服务 // 从嵌入的文件系统加载模板
r.Static("/static", "./static") tmpl := template.Must(template.New("").ParseFS(templatesFS, "templates/*.html"))
r.LoadHTMLGlob("templates/*") r.SetHTMLTemplate(tmpl)
// 从嵌入的文件系统提供静态文件
staticSubFS, _ := fs.Sub(staticFS, "static")
r.StaticFS("/static", http.FS(staticSubFS))
// 路由 // 路由
r.GET("/", indexHandler) r.GET("/", indexHandler)
@ -137,7 +150,10 @@ func main() {
port = "8080" 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) r.Run(":" + port)
} }
@ -151,6 +167,8 @@ func loadConfig() {
if err != nil { if err != nil {
log.Printf("解析配置文件失败: %v", err) log.Printf("解析配置文件失败: %v", err)
} }
} else {
log.Printf("警告: 未找到 config.json 配置文件,请确保配置文件存在")
} }
// 环境变量覆盖 // 环境变量覆盖
@ -164,6 +182,10 @@ func loadConfig() {
if config.Port == "" { if config.Port == "" {
config.Port = "8080" config.Port = "8080"
} }
if config.AmapKey == "" {
log.Printf("警告: 未配置高德地图 API Key请在 config.json 中配置 amap_key")
}
} }
func indexHandler(c *gin.Context) { func indexHandler(c *gin.Context) {
@ -340,7 +362,6 @@ func searchPOIHandler(c *gin.Context) {
defer resp.Body.Close() defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body) body, _ := io.ReadAll(resp.Body)
log.Printf("高德POI搜索响应: %s", string(body))
var amapResp AmapPOIResponse var amapResp AmapPOIResponse
if err := json.Unmarshal(body, &amapResp); err != nil { if err := json.Unmarshal(body, &amapResp); err != nil {

BIN
meeting-point-linux-amd64 Normal file

Binary file not shown.