Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CQU Maps · 重庆大学校园地图导航系统

一个纯前端静态校园地图网页,全程采用重庆大学官方蓝白主题配色。底图使用百度地图,坐标数据统一采用高德 GCJ02 坐标系,弹窗支持一键跳转百度地图 / 高德地图导航。

如果你想在本地部署,可看以下教程。

一、技术栈

能力 选型 说明
页面结构 HTML5 原生语义化标签
样式 Tailwind CSS CDN + 内嵌自定义样式 统一管控蓝白主题
地图引擎 百度地图 JavaScript API v3.0 需AK密钥(免费申请)
图标 Font Awesome 4.7 在线 CDN(cdnjs 源)
交互逻辑 原生 JavaScript(IIFE) 不依赖前端框架

百度地图 JS API 需要申请免费 AK 密钥,申请教程见下方「第二节」。


二、百度地图密钥申请教程(必读)

百度地图 JS API 需要一个免费的 AK 密钥才能使用。以下是申请步骤:

步骤 1:注册百度账号

访问 https://lbsyun.baidu.com,使用百度账号登录。如果没有百度账号,先注册一个。

步骤 2:进入控制台

登录后点击右上角「控制台」→「应用管理」→「我的应用」。

或直接访问:https://lbsyun.baidu.com/apiconsole/key

步骤 3:创建应用

点击「创建应用」,填写以下信息:

字段 填写内容
应用名称 CQU Maps(自定义)
应用类型 浏览器端
启用服务 勾选「JavaScript API」
Referer白名单 *(或填写你的域名/IP,本地开发填 *

步骤 4:复制 AK 密钥

创建成功后,会看到一串 32 位字符的 AK 密钥,形如 aBcDeFgHiJkLmNoPqRsTuVwXyZ123456

步骤 5:替换代码中的占位符

打开 index.html,找到百度地图 script 标签:

<script type="text/javascript" src="//api.map.baidu.com/api?v=3.0&ak=YOUR_BAIDU_MAP_AK"></script>

YOUR_BAIDU_MAP_AK 替换为你的 AK 密钥,保存后刷新页面即可。


三、目录结构

MAP/
├── index.html        # 页面骨架,引入百度地图JS API + Tailwind + FontAwesome
├── js/
│   ├── data.js       # 全部校园建筑坐标数据(GCJ02坐标系,数组格式)
│   ├── reviews.js    # 附近美食正式评论(审核通过,由 server.ps1 自动维护)
│   ├── pending_reviews.js  # 附近美食待审核评论(暂存,由 server.ps1 自动维护)
│   ├── main.js       # 百度地图初始化、坐标转换、检索、弹窗、导航跳转
│   └── admin.js      # 管理后台逻辑(登录、审核、修改、删除、上传)
├── admin.html        # 管理后台页面(/cqumaps/admin)
├── 校徽_蓝色.svg      # 网页标签页图标(favicon)
├── cartoon.jpg       # 贡献者弹窗中的开发者头像
├── server.ps1        # PowerShell 静态服务器 + 评分评论 API(file://受限时备用)
└── README.md         # 本说明文档

四、快速开始

  1. 按上方「第二节」申请百度地图 AK 密钥。
  2. 打开 index.html,将 YOUR_BAIDU_MAP_AK 替换为你的密钥。
  3. 双击 index.html,或使用本地服务器打开 http://localhost:2345

推荐浏览器:Chrome 90+ / Edge 90+ / Safari 14+。

使用本地服务器(推荐)

如果双击打开后百度地图无法加载(部分浏览器限制 file:// 协议),使用 PowerShell 启动本地服务器:

cd D:\code\MAP
powershell -ExecutionPolicy Bypass -File .\server.ps1

然后浏览器访问 http://localhost:2345


五、坐标系说明(重要)

本项目统一使用 GCJ02(高德/火星坐标系) 存储坐标数据。百度地图底图通过 gcj02ToBd09() 函数自动转换为 BD09 坐标系显示,高德导航直接使用原始 GCJ02 坐标。

坐标系 使用方 本项目中的角色
GCJ02 高德地图 data.js 中统一使用(原始存储格式)
BD09 百度地图 由 GCJ02 自动转换而来(地图显示 + 百度导航跳转)

核心机制data.js 中存储 GCJ02 坐标,main.js 通过 gcj02ToBd09() 转换后用于百度地图显示和百度导航跳转,高德导航直接使用原始坐标。你只需从高德地图拾取坐标填入即可,无需手动转换。

如何获取 GCJ02 坐标

打开 高德地图拾取坐标系统

  1. 搜索或缩放至目标建筑。
  2. 在建筑中心位置点击鼠标左键。
  3. 页面显示的文本形如 106.306933,29.604076,即「经度,纬度」(GCJ02)。
  4. 填入 data.js 的 coord 字段,格式为数组 [经度, 纬度]

注意:高德地图拾取结果为「经度在前,纬度在后」,与 data.js 中 coord 数组格式 [经度, 纬度] 完全一致。坐标系转换、URI 拼接等已在 main.js 内部统一处理。


六、功能清单

  • 顶部导航栏蓝底白字,校区下拉框支持 虎溪校区/A区/B区/C区/两江校区
  • 左侧侧边栏分类筛选标签齐全(全部/教学楼/学生宿舍/食堂/图书馆/运动场馆/行政楼/校门/校医院/剧场/校车站/地标建筑/学院楼/附近美食/快递点)
  • 切换分类标签,地图 marker 与侧边栏列表同步刷新
  • 点击侧边栏建筑条目,地图平滑跳转至点位并自动弹窗
  • 点击地图 marker,弹出建筑信息卡片
  • 弹窗内「百度地图导航」按钮(BD09坐标)+「高德地图导航」按钮(GCJ02坐标)
  • 顶部搜索框实时模糊检索
  • 切换校区后地图中心点、缩放、列表、marker 全部同步切换
  • 桌面端侧边栏常驻左侧(320px)
  • 移动端侧边栏折叠为抽屉,汉堡按钮+遮罩
  • 不同分类 marker 颜色符合色彩规范
  • 侧边栏底部「使用说明」+「贡献者」入口及模态弹窗
  • 网页标签页显示重大校徽图标
  • 控制台无 JS 代码错误
  • 开发者贡献者弹窗
  • 开发评论区功能
  • 完善点位数据

七、添加新建筑点位

只需编辑 js/data.js 一个文件。

步骤 1:定位 BUILDINGS 数组

步骤 2:追加数据对象(坐标用 GCJ02 数组格式)

{
  id: 'd_teaching_09',              // 唯一ID(校区_分类_编号)
  name: '新建教学楼',                // 建筑全称
  category: 'teaching',              // 分类:见下方对照表
  campus: 'd',                       // 校区:d/a/b/c/e
  coord: [106.4530, 29.5800],        // 高德地图拾取 [经度, 纬度](GCJ02)
  desc: '新建成智慧教学楼。'          // 简短介绍
}

分类标识对照表

分类标识 显示名称 标记颜色 图标
teaching 教学楼 #003375 fa-graduation-cap
dormitory 学生宿舍 #4069B2 fa-building
canteen 食堂 #6296D8 fa-cutlery
library 图书馆 #00285C fa-book
sports 运动场馆 #8CB4E8 fa-futbol-o
admin 行政楼 #003375 fa-briefcase
gate 校门 #4069B2 fa-flag
hospital 校医院 #6296D8 fa-hospital-o
theater 剧场 #2F5599 fa-ticket
busstation 校车站 #5A82B8 fa-bus
landmark 地标建筑 #003375 fa-star
college 学院楼 #1A4A8A fa-university
food 附近美食 #7BA8E0 fa-coffee
express 快递点 #4A7CC0 fa-archive

保存后刷新页面即可。


八、新增校区

步骤 1:js/data.js 顶部 CAMPUS_CONFIG 添加

const CAMPUS_CONFIG = {
  d: { name: '虎溪校区', coord: [106.305322, 29.602937], zoom: 16 },
  a: { name: 'A区',     coord: [106.475693, 29.570419], zoom: 16 },
  b: { name: 'B区',     coord: [106.467000, 29.572700], zoom: 17 },
  c: { name: 'C区',     coord: [106.461100, 29.565900], zoom: 17 },
  e: { name: '两江校区', coord: [106.816400, 29.746000], zoom: 16 },
  // 新增校区按相同格式追加即可
  f: { name: '新校区', coord: [经度, 纬度], zoom: 16 }
};

coord 为高德地图拾取的坐标数组 [经度, 纬度](GCJ02)。

步骤 2:index.html 校区下拉框添加选项

<option value="f" class="text-cqu-text">新校区</option>

步骤 3:BUILDINGS 数组追加该校区的建筑(campusf


九、校区标识对照

标识 校区名称
d 虎溪校区
a A区
b B区
c C区
e 两江校区

十、导航跳转接口说明

弹窗内提供两个导航按钮,点击均在新标签页打开,移动端优先唤起对应 APP。

平台 URI 格式 坐标系 经纬度顺序
百度地图 http://api.map.baidu.com/marker?location=纬度,经度&title=建筑名称&output=html BD09 纬度,经度
高德地图 https://uri.amap.com/marker?position=经度,纬度&name=建筑名称&callnative=1 GCJ02 经度,纬度

URI 已在 js/main.jsbuildPopupHtml() 中拼接。百度导航使用 gcj02ToBd09() 转换后的 BD09 坐标,高德导航直接使用 data.js 中的 GCJ02 坐标。


十一、附近美食评分与评论

「附近美食」(category: food)地点弹窗支持打分与评论:

  • 评分范围 0 ~ 5 星,最小单位 0.5 星(点击星星左/右半侧选择半星或整星)。
  • 填写者名称(昵称)为必填项
  • 用户提交后先进入待审核状态(js/pending_reviews.js),提示「已收到您的评分,稍后管理员审核后会将您的评分上传系统」。
  • 管理员在 /cqumaps/admin 审核通过后,记录才会进入 js/reviews.js(正式评论),地图上可见。
  • 侧边栏美食列表会显示该地点的平均评分与评价数。

数据文件

文件 状态 说明
js/pending_reviews.js 待审核 用户新提交的评分评论(window.PENDING_REVIEWS
js/reviews.js 正式 管理员审核通过后的公开评论(window.FOOD_REVIEWS

管理员后台

访问 http://localhost:2345/cqumaps/admin(或 http://localhost:2345/admin.html),输入管理密码登录后即可审核:

  • 上传:将待审核评论移入正式评论,地图页可见
  • 修改:修改昵称 / 评分 / 评论内容后再决定是否上传
  • 删除:删除该条待审核评论

管理密码配置在 server.ps1 顶部的 $adminPassword 变量中(请按需修改,勿将密码提交到公开文档)。

API 说明

方法 路径 说明
GET /api/reviews 获取全部正式评论;可加 ?placeId=a_food_01 按地点过滤
POST /api/reviews 提交评分评论(进入待审核),body 为 JSON
POST /api/admin/login 管理员登录,body 为 {"password": "..."},返回 token
GET /api/admin/pending 获取待审核列表(需登录 token)
POST /api/admin/approve 上传审核通过,body 为 {"id": "p_1"}
POST /api/admin/update 修改待审核评论
POST /api/admin/delete 删除待审核评论

POST /api/reviews 请求示例:

{
  "placeId": "a_food_01",
  "rating": 4.5,
  "comment": "牛肉面很香,推荐!",
  "nickname": "小明"
}

服务端校验:placeId 必须存在于 data.jsrating 必须在 0 ~ 5 且为 0.5 的整数倍、nickname 必填且最长 30 字、comment 最长 500 字。

提交评分与管理员审核都必须通过 server.ps1 启动的本地服务器访问(http://localhost:2345);直接双击 index.html 只能查看已有数据,无法写入。


十二、色彩规范

用途 颜色值
主色(重大官方深蓝) #003375
辅助浅蓝 #4069B2
背景底色 #FFFFFF
侧边栏/面板底色 #F7F9FC
主文字 #1A1A1A
次要文字 #666666
分割线/边框 #E2E8F0
按钮 hover 高亮 #002559

十三、常见问题

Q1:打开后地图显示「百度地图加载失败」? A:说明 AK 密钥未配置或无效。请按「第二节」申请密钥并替换 index.html 中的 YOUR_BAIDU_MAP_AK

Q2:百度地图 AK 配置后仍然加载失败? A:检查以下几点:

  1. AK 密钥是否复制完整(32位字符)
  2. 应用类型是否为「浏览器端」
  3. Referer 白名单是否包含当前域名(本地开发设为 *
  4. 是否启用了「JavaScript API」服务

Q3:地图上标记位置和实际建筑有偏差? A:data.js 中的坐标应使用 GCJ02 坐标系(从高德地图拾取)。请从 高德地图拾取坐标系统 获取坐标后填入,百度地图会自动通过 gcj02ToBd09() 转换显示。

Q4:控制台出现 document.write 警告? A:这是百度地图 JS API 内部实现使用 document.write 加载子脚本导致的,不影响功能,无需处理。

Q5:直接双击打开 index.html(file:// 协议)能用吗? A:可以,但部分浏览器对 file:// 协议有安全限制。若百度地图无法加载,建议使用本地服务器(如本项目附带的 server.ps1)打开 http://localhost:2345


十四、部署到 Linux 服务器(nginx 反代)

评分、评论与管理审核功能需要后端进程支撑,推荐在 Linux 服务器上用 PowerShell 7 运行 server.ps1,再用 nginx 反向代理。

用户浏览器 → nginx(80/443, HTTPS) → 127.0.0.1:2345 → server.ps1 (pwsh)

完整步骤见 deploy/README.md,仓库已附带:

  • deploy/cqumaps.service:systemd 服务(自动监听 http://+:2345/
  • deploy/nginx-cqumaps.conf:nginx 反代配置

要点:

  1. server.ps1 的监听地址可通过环境变量 CQUMAPS_LISTEN 覆盖(本地默认 http://localhost:2345/,服务器上用 http://+:2345/)。
  2. nginx 的 proxy_pass http://127.0.0.1:2345; 后面不能加斜杠,否则会去掉 /cqumaps 前缀导致管理页 404。
  3. 记得把百度地图 AK 的 Referer 白名单加上你的域名;云服务器安全组只放行 80/443。
  4. 管理员密码配置在 server.ps1 顶部 $adminPassword 中,部署前请修改,勿写入公开文档。
  5. 定期备份 js/reviews.jsjs/pending_reviews.js(评分数据就存在这两个文件里)。

十五、致谢

About

CQUMAPS

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages