Thanks to visit codestin.com
Credit goes to github.com

Skip to content

ZJU-Charger/ZJU-Charger

logo 𝐙𝐉𝐔 𝐂𝐡𝐚𝐫𝐠𝐞𝐫 | 便捷高效的充电桩查询助手

Star Badge License Badge Contributors Badge Issues Badge Pull Requests Badge Last Commit Badge Code Size Badge

Markdown Quality Check Python (Ruff Action) pages-build-deployment

logo

你是否也曾骑着没电的小龟,慢吞吞地骑到充电桩,却发现一个空余的桩位都没有?😫 你是否也曾被充电桩服务商离谱的 UI 界面与复杂的查询接口所困扰?😠

ZJU Charger 基于 FastAPI 开发,瞄准校内充电桩不好找、供应商入口不一、使用状态查询不便三大痛点,为你提供一个简洁、易用、扩展性强的充电桩查询方案。

目前支持网站在线分校区、分服务商查询(普查)、iOS 快捷指令查询特定站点状态(精准查)、钉钉 Webhook 机器人等功能。

访问 https://charger.philfan.cn/ 查看效果。

免责声明:本项目仅用于学习交流,不得用于商业盈利与非法用途。使用本项目所造成的任何后果,由使用者自行承担,作者不承担任何责任。请遵守相关法律法规。

News

  • 2025.12.11 - 网站累计访问用户突破 3000 人,感谢所有用户的使用与支持!
  • 2025.12.07 - 修复 CVE-2025-55182;支持紫金创业园站点;支持望月社区站点
  • 2025.12.05 - 支持堕落街服务商,校准并支持西溪校区站点;最新介绍推文详见 ZJU Charger:便捷高效的充电桩查询助手
  • 2025.12.02 - 重构前端 UI 并支持尼普顿智慧生活公众号查询
  • 2025.11.30 - GitHub 达到 50 Star,感谢支持!校内公众号宣传贴
  • 2025.12.01 - 支持 iOS 快捷指令,增加华家池校区 CC98 宣传贴(十大)
  • 2025.11.29 - 完成后端页面开发,网站上线 CC98 宣传贴(十大第一)
  • 2025.11.28 - 发现脚本,制作可视化 CC98 宣传贴

功能特性

前端功能

Next.js 框架开发:App Router + TypeScript + shadcn/ui, 开源在 Phil-Fan/zju-charger-frontend 这个仓库。

  • 校区切换:点击校区卡片切换校区,不同校区信息一键查询。 campus_01 campus_02 campus_03
  • 站点排序:开启定位后,实时显示站点距离,可按照距离优先或者空闲数量优先对站点进行排序。 sort
  • 站点导航:长按或双击地图站点可选择导航,一键跳转到高德/系统地图 APP,找到充电桩不再困难。 navigate
  • 站点关注:常去某站点?点击星标关注站点,显示并保存在列表最上方。通过 localStorage 实现。 watchlist
  • 明暗切换:点击右上角按钮切换颜色模式,明暗样式任你选择。 light dark
  • 前端定时自动刷新。
  • 夜间提示。
  • 绿/橙/红三色编码空闲、紧张、故障状态。
  • 英文界面支持。

后端功能

  • FastAPI 统一 API 接口,使用 slowapi 实现接口限流功能
  • 多服务商架构支持,可同时异步抓取多个服务商的充电桩数据(目前支持了尼普顿服务商)
  • BackgroundFetcher 后台定时抓取任务,自动写入 Supabase 缓存
  • Supabase 数据库支持,记录历史使用情况数据(可选)

快捷指令

ZJU Charger.shortcut

支持快速查询关注的几个站点的状态,并可以添加到主屏幕,方便随时查看。 操作步骤详见 Script 快捷指令文档

shortcut

钉钉 Webhook 机器人

dingbot

文档

详细的文档请查看 docs 目录:

系统架构

在开发层面,目标实现高内聚、低耦合、易于扩展。

flowchart TD

    A["iOS 快捷指令<br/>1. 关注点快速查询"]

    B["Next.js Web App<br/>App Router"]

    C["FastAPI API 服务<br/>(*只读 Supabase*)"]

    D["钉钉机器人<br/>全部"]

    H["Background Fetcher<br/>ProviderManager"]

    F1["NeptuneProvider<br/>尼普顿服务商"]
    F2["其他服务商<br/>可扩展..."]

    G["Supabase 数据库"]

    %% 连接关系
    A --> |查询| C

    B <--> |AJAX| C

    D --> |webhook| C

    C --> |读取数据| G
    H --> |写入缓存| G
    H --> |调度| F1
    H --> |调度| F2
Loading

所有查询来源(Web、钉钉、脚本)只调用 FastAPI,从 Supabase 读取最近一次抓取的 latest 数据;后台抓取线程(BackgroundFetcher)在独立线程中运行 ProviderManager,异步刷新数据库缓存。前后端因此做到完全解耦,API 不再直连服务商。

项目结构

project/
├── fetcher/
│   ├── provider_manager.py   # 服务商管理器
│   ├── providers/
│   │   ├── provider_base.py  # 服务商抽象基类
│   │   └── neptune.py        # 尼普顿服务商实现
│   └── station.py            # 共享 Station 模型(CSV 解析 + hash 生成)
├── db/
│   ├── client.py             # Supabase 客户端初始化
│   ├── station_repo.py       # stations 表 CRUD
│   ├── usage_repo.py         # latest/usage 表读写
│   ├── pipeline.py           # record_usage_data 数据管道
│   └── __init__.py           # 统一暴露 initialize/get/batch 接口
├── server/
│   ├── api.py                # FastAPI 主服务(直接调用 db/ 仓库)
│   ├── config.py             # 环境变量配置(支持服务商配置)
│   ├── run_server.py         # 服务器启动脚本
│   └── logging_config.py     # 日志配置
├── ding/
│   ├── bot.py                # 钉钉机器人封装
│   ├── webhook.py            # 钉钉 webhook 路由
│   └── commands.py           # 命令解析和执行
├── frontend/                 # Next.js + shadcn 前端
│   ├── package.json          # pnpm scripts、依赖、biome 配置
│   ├── src/app/              # Next App Router 页面、layout、错误页
│   ├── src/components/       # shadcn ui + 业务组件(Header/Map/List 等)
│   └── src/lib|hooks|types   # 校区配置、API 客户端、状态 hooks、坐标工具
├── script/                   # iOS 快捷指令
│   ├── README.md             # 快捷指令使用说明
│   └── *.shortcut            # 快捷指令文件
├── serve.sh                  # 快速启动脚本(基于 uv 同步依赖并调用 server.run_server)
├── pyproject.toml            # Python 依赖声明 + uv/Ruff 配置
└── uv.lock                   # uv 生成的锁定文件

许可证

使用 GPLv3 许可证,见 LICENSE 文件

贡献

欢迎提交 Issue 和 Pull Request!

请查看:

star history

致谢

后端

前端

其他

感谢所有贡献者!

GitHub contributors

About

便捷高效的充电桩查询助手

Topics

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Languages