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

|
|
||||||
|
|
||||||
## ✨ 功能特点
|
## ✨ 功能特点
|
||||||
|
|
||||||
- **📍 多点位置设置**
|
- **📍 多点位置设置**
|
||||||
- 通过地址搜索添加位置
|
- 通过地址搜索添加位置(支持输入提示和自动补全)
|
||||||
- 直接在地图上点击添加位置
|
- 直接在地图上点击添加位置
|
||||||
- 支持输入提示和自动补全
|
- 支持删除和管理已添加的位置
|
||||||
|
|
||||||
- **🎯 智能中心计算**
|
- **🎯 智能中心计算**
|
||||||
- 使用球面几何算法计算多点中心
|
- 使用球面几何算法计算多点中心
|
||||||
@ -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
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
|
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,8 +362,7 @@ 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 {
|
||||||
log.Printf("解析POI响应失败: %v", err)
|
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