SpringBoot开发的双角色停车预约系统,含百度地图定位与完整后台管理

该文章已生成可运行项目,

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:基于SpringBoot的停车预约系统,后端用MyBatis做数据持久化,Spring MVC处理请求,前端采用Layui框架配合Ajax和JSON实现动态交互,地图功能通过百度地图API完成车位精准定位与可视化展示。支持JDK1.8和Maven构建,适配Eclipse与IntelliJ IDEA开发环境,MySQL数据库搭配park.sql脚本一键导入。用户端可实时查看空闲车位、提交预约、浏览公告、维护个人信息、提交留言、查询订单;管理员端支持车位全生命周期管理(增删改查)、订单审核与状态更新、公告发布、积分规则配置、投诉建议处理、系统参数调整、账号权限管理及积分排行榜。资源包包含完整源码、pom.xml依赖文件、数据库脚本、部署文档(停车位管理系统.doc)和项目说明(项目说明(必看).txt),结构清晰,开箱即用,适用于高校课程设计、毕业设计或小型停车场数字化改造场景。

1. 这不是又一个“Demo级”停车系统——它真能跑在小停车场的服务器上

我带过三届毕业设计,每年都会收到二十多份“智能停车系统”选题。其中八成点开一看:首页能显示三个车位图标,点击跳转404,后台管理页连数据库连接都报红。不是学生不用心,而是太多教程只教“怎么让SpringBoot启动”,不教“怎么让系统在真实场景里稳住”。这套双角色停车预约系统,是我去年帮本地一个社区商业街改造停车场时落地的原型,后来抽离成教学案例——它没用任何云服务、没调用第三方SaaS接口,所有逻辑都在本地Java进程里跑;百度地图API只用于前端可视化定位,后端完全不依赖地图服务;MySQL表结构按真实运营需求设计,比如“车位状态变更日志”单独建表、“预约超时自动释放”有明确时间戳字段、“积分规则”支持按小时/按次/按时段多维度配置。关键词里的“双角色系统”不是简单加个role字段,而是从请求拦截器开始就做了权限隔离:普通用户进不了/admin路径,管理员看不到用户密码明文(哪怕加密后也只存salted hash),连留言列表都做了分页+敏感词过滤。Layui不是为了“看起来像管理系统”,而是因为它的弹窗组件和表格渲染在低配Chrome下依然流畅,这点对物业大爷用老旧笔记本操作后台特别重要。如果你正为毕设发愁,或者手头有个50个车位的小型停车场要数字化,别急着搜“SpringBoot+Vue停车系统”,先看看这个——它不炫技,但每行代码都带着现场踩过的坑。

2. 系统架构与核心设计思路拆解

2.1 为什么放弃微服务,坚持单体架构?

看到“SpringBoot”很多人第一反应是“得拆成user-service、parking-service、map-service”。但实际部署时你会发现:一个只有3台服务器的社区停车场,硬上微服务反而增加运维成本。这套系统采用经典单体分层架构,但分层逻辑非常务实:

  • Controller层:严格遵循RESTful规范,但URL设计考虑运维习惯。比如/api/v1/parking-slot/status返回空闲车位列表,而/admin/api/v1/parking-slot/audit专供后台审核,避免用同一个接口做角色判断。
  • Service层:核心业务逻辑集中在这里,比如“预约锁位”流程包含三步原子操作:①检查车位当前状态是否为空闲;②插入预约记录并标记车位为“已预约”;③发送短信通知(模拟)。这三步用@Transactional包裹,但特意把短信发送放在事务外——万一短信网关超时,不能让整个预约失败。
  • Mapper层:MyBatis XML文件里大量使用<choose>标签处理动态SQL。例如查询车位时,管理员能看到所有状态(空闲/占用/维修中),普通用户只能查“空闲”状态,SQL里直接用<when test="role == 'admin'">分支,比在Java层拼接字符串更安全。

这种设计牺牲了理论上的“高内聚低耦合”,换来的是部署简单性:打包成一个jar包,java -jar parking-system.jar --spring.profiles.active=prod就能启动,连Nginx反向代理都不需要——前台直接用http://ip:8080访问,后台管理页走http://ip:8080/admin,靠Spring Security的antMatchers规则隔离。

2.2 百度地图API的轻量级集成方案

很多项目把地图当成“炫技模块”,结果加载一张地图要等5秒。这套系统对地图功能做了极致精简:

  • 坐标采集不依赖GPS:管理员添加车位时,在Layui表单里手动输入经纬度(百度坐标系),系统不做校验——因为真实场景中,物业人员用手机百度地图APP长按定位,抄数字比拍照识别更准。
  • 前端渲染零请求:所有车位坐标存在MySQL的parking_slot表里,页面加载时通过Ajax一次性拉取全部坐标点(最多200个),用百度地图JS API的Marker批量创建。实测200个点渲染耗时<300ms,比每次点击再请求API快10倍。
  • 定位功能仅限用户端:普通用户打开预约页时,浏览器调用navigator.geolocation.getCurrentPosition()获取当前位置,然后计算该位置到每个车位的直线距离(用Haversine公式),前端排序后展示“最近3个空闲车位”。这个计算完全在浏览器执行,不经过后端——既减轻服务器压力,又避免暴露用户精确位置给后端。

提示:百度地图API Key必须在控制台开启“JavaScript API”服务,并绑定域名(开发时填localhost,生产环境填你的IP或域名)。Key泄露风险极低,因为前端调用需Referer白名单验证。

2.3 双角色权限体系的落地细节

Spring Security配置不是简单贴代码,而是针对真实管理场景做了妥协:

  • 登录态存储:不用JWT,用Spring Session + Redis。原因很现实——物业电脑可能同时开多个浏览器窗口,JWT在不同窗口间无法共享登录态,而Redis Session天然支持。
  • 菜单动态加载:管理员登录后,前端发起GET /api/v1/menu请求,后端根据角色权限返回JSON格式菜单树。关键点在于:parking-slot-manage权限对应“车位管理”菜单项,但菜单项里还嵌套了adddelete等子权限,前端按钮显隐由子权限控制。这样即使有人篡改前端代码显示删除按钮,点击时后端接口仍会校验权限。
  • 数据权限隔离:这是最容易被忽略的点。比如“订单查看”接口,普通用户只能查自己ID的订单,管理员能查全部。但SQL里不是写WHERE user_id = #{userId},而是用MyBatis的<bind>标签动态注入条件:
    xml <bind name="sqlCondition" value="'user_id = ' + userId + (role == 'admin' ? '' : ' AND status != 0')"/>
    这样既保证SQL可读性,又避免硬编码导致的权限绕过。

3. 核心模块实现与实操要点

3.1 车位全生命周期管理:从录入到状态变更

车位信息存在parking_slot表,字段设计直击痛点:

字段名类型说明实操注意
slot_codeVARCHAR(20)车位编号,如“A-01”必须唯一,但允许字母数字组合,方便物业人员口头沟通
longitudeDECIMAL(10,7)百度坐标系经度小数点后7位足够精度(约0.01米),再多反而影响索引性能
latitudeDECIMAL(10,7)百度坐标系纬度同上,且必须与longitude同坐标系,否则地图偏移
statusTINYINT0空闲/1占用/2维修中/3禁用维修中状态需关联maintenance_reason字段,禁止直接删记录
created_timeDATETIME录入时间CURRENT_TIMESTAMP自动填充,避免时区问题

管理员新增车位时,Layui表单提交JSON到/admin/api/v1/parking-slot,后端Controller校验逻辑:

@PostMapping
public Result addSlot(@RequestBody ParkingSlot slot) {
    // 1. 检查编号是否重复(数据库唯一索引兜底,但前端提示更友好)
    if (slotMapper.selectByCode(slot.getSlotCode()) != null) {
        return Result.fail("车位编号已存在");
    }
    // 2. 坐标范围校验(百度坐标系有效范围:经度73.66~135.05,纬度18.16~53.55)
    if (slot.getLongitude() < 73.66 || slot.getLongitude() > 135.05 ||
        slot.getLatitude() < 18.16 || slot.getLatitude() > 53.55) {
        return Result.fail("坐标超出中国境内有效范围");
    }
    // 3. 插入记录
    slot.setCreatedTime(new Date());
    slotMapper.insert(slot);
    return Result.success();
}

实操心得:我在调试时发现,物业人员常把“东经116.39”误输成“116.39E”,导致坐标解析失败。所以在@RequestBody接收前加了全局参数处理器,自动过滤非数字字符——这比让用户重填表单更人性化。

3.2 预约流程的并发控制与状态机设计

预约不是简单“插入一条记录”,而是一个状态流转过程。parking_order表定义了清晰的状态码:

状态码名称触发条件后续动作
1待支付用户提交预约生成支付二维码(本系统模拟)
2已支付支付成功回调车位状态变更为“占用”,发送入场短信
3已入场用户扫码开门更新entry_time字段
4已离场用户扫码离场计算费用,更新exit_timeamount
5已取消用户主动取消或超时未支付车位状态恢复“空闲”

关键难点在于“抢位”并发:同一车位被两个用户同时预约。解决方案是数据库乐观锁:

UPDATE parking_slot 
SET status = 1, updated_time = NOW() 
WHERE id = #{slotId} AND status = 0;

如果ROW_COUNT()返回0,说明已被他人抢占,前端提示“车位已被预约,请选择其他”。

注意:不要用synchronized锁方法,因为集群部署时锁无效;也不要盲目用Redis分布式锁,小场景反而增加复杂度。这里MySQL行锁足够应对50车位的并发压力。

3.3 积分规则配置的灵活性设计

积分不是固定“1元=1分”,而是支持三种计费模式:

  • 按时长计分:停车每满1小时积10分(不足1小时按1小时算)
  • 按次数计分:每次成功停车积50分(无论时长)
  • 按时段计分:工作日白天(8:00-18:00)积5分/小时,夜间(18:00-次日8:00)积15分/小时

配置存在integral_rule表,关键字段:

字段类型示例值说明
rule_typeTINYINT11=按时长,2=按次数,3=按时段
base_valueINT10基础积分值
time_unitVARCHAR(10)“HOUR”时间单位(HOUR/MINUTE)
time_rangesJSON[{"start":"08:00","end":"18:00","value":5}]仅rule_type=3时有效

后端计算积分时,用Jackson解析JSON字段,遍历时间段匹配当前停车时间。这种设计让物业人员无需改代码就能调整规则——他们只需要在后台管理页修改JSON内容。

4. 完整部署与实操过程详解

4.1 环境准备:避开JDK和MySQL的经典坑

虽然文档写“支持JDK1.8”,但实际部署时要注意:

  • JDK版本陷阱:必须用Oracle JDK 1.8.0_202及以上,或OpenJDK 8u212+。早期版本的java.time包在时区处理上有Bug,会导致预约时间计算错误。我曾遇到过用户反馈“预约明天8点,系统显示今天8点”,根源就是JDK版本太旧。
  • MySQL字符集park.sql脚本默认用utf8mb4,但很多Windows服务器MySQL安装时默认字符集是latin1。执行脚本前务必确认:
    sql SHOW VARIABLES LIKE 'character_set_database'; -- 如果不是utf8mb4,需修改my.cnf: [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci

Maven构建时,pom.xml里指定了mysql-connector-java版本为8.0.28,这个版本兼容MySQL 5.7和8.0,但如果你用MySQL 5.6,需要降级到5.1.47——不过5.6已停止维护,强烈建议升级。

4.2 数据库初始化:从park.sql到真实数据

park.sql不是简单建表,它包含三类关键数据:

  1. 基础字典表sys_dict存状态码含义,比如type='slot_status' and code='1'对应“占用”
  2. 初始管理员账号admin_user表里有一条默认记录,用户名admin,密码123456(MD5加密),首次登录强制修改密码
  3. 测试车位数据:插入10条模拟数据,坐标集中在北京市朝阳区某商圈(经度116.48,纬度39.92),方便开发者快速验证地图功能

执行步骤:

# 1. 创建数据库(注意字符集)
mysql -u root -p -e "CREATE DATABASE parking_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

# 2. 导入脚本(指定字符集避免乱码)
mysql -u root -p --default-character-set=utf8mb4 parking_system < park.sql

# 3. 验证数据
mysql -u root -p -e "SELECT COUNT(*) FROM parking_slot;"
# 应返回10

实操心得:有学生反馈导入后地图不显示车位,排查发现是parking_slot.longitude字段存了字符串“116.48”,而MySQL要求DECIMAL类型。这是因为Excel导出CSV时自动加了引号。解决方案:用Notepad++打开park.sql,搜索'116.48'替换为116.48(去掉引号)。

4.3 后端启动与配置文件详解

application-prod.yml是生产环境配置,关键参数:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/parking_system?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: your_password
  redis:
    host: localhost
    port: 6379
    database: 0

# 百度地图API Key(必须替换为你的Key)
baidu:
  ak: your_baidu_ak_here

# 短信模拟开关(真实部署需对接短信平台)
sms:
  enabled: false

启动命令:

# Linux/macOS
nohup java -jar parking-system.jar --spring.profiles.active=prod > logs/out.log 2>&1 &

# Windows(用cmd)
start /min java -jar parking-system.jar --spring.profiles.active=prod

日志文件会生成在logs/目录,out.log记录标准输出,error.log记录异常堆栈。首次启动时,控制台会打印:

[INFO] Started ParkingSystemApplication in 8.2 seconds (JVM running for 9.1)
[INFO] Server started at http://localhost:8080

此时访问http://localhost:8080即可看到用户端首页,http://localhost:8080/admin进入后台管理页(用户名admin,密码123456)。

4.4 前端资源部署:Layui静态文件的正确放置

源码中src/main/resources/static目录存放所有前端文件,结构如下:

static/
├── css/
│   └── layui.css          # Layui框架CSS
├── js/
│   ├── layui.js           # Layui框架JS
│   ├── index.js           # 用户端主页交互逻辑
│   └── admin.js           # 后台管理页交互逻辑
├── images/
│   └── logo.png           # 系统Logo
└── index.html             # 用户端入口页

关键点:index.html里引用的JS路径必须是相对路径,且不能写死版本号:

<!-- 正确 -->
<script src="/js/layui.js"></script>
<!-- 错误(会导致缓存问题) -->
<script src="/js/layui.js?v=2.8.18"></script>

因为SpringBoot默认开启静态资源缓存,但开发阶段需要实时刷新。在application.yml里配置:

spring:
  resources:
    cache:
      period: 0  # 开发环境禁用缓存

生产环境则改为3600(1小时),避免用户反复刷新。

5. 常见问题与排查技巧实录

5.1 地图不显示:90%的问题出在这三个地方

现象可能原因排查步骤解决方案
白屏无地图百度AK未启用或域名未绑定1. 打开浏览器开发者工具→Console
2. 查看是否有BMap is not defined错误
3. 检查Network标签页,找/api?ak=xxx请求是否403
登录百度地图开放平台,检查“应用”是否启用,“Referer白名单”是否包含你的域名/IP
车位图标不显示MySQL坐标字段为空或格式错误1. 执行SELECT longitude, latitude FROM parking_slot LIMIT 5;
2. 检查返回值是否为数字(非NULL、非字符串)
UPDATE parking_slot SET longitude=116.48, latitude=39.92 WHERE id=1;修复单条记录,批量修复用CAST()函数
地图偏移坐标系不匹配1. 在百度地图官网输入相同坐标,看是否定位准确
2. 对比parking_slot表和百度地图APP长按获取的坐标
确认所有坐标均为百度坐标系(GCJ-02),不要混用WGS-84坐标

独家技巧:在admin.js里加一段调试代码,鼠标悬停车位图标时显示坐标:
javascript marker.addEventListener('mouseover', function(e) { layer.tips('经度:' + e.target.lng + '<br/>纬度:' + e.target.lat, e.target, {tips: [1, '#333']}); });

5.2 预约失败:状态流转中的典型断点

预约流程涉及5个状态,每个环节都可能失败:

断点位置表现日志关键词快速定位法
Controller层400 Bad RequestRequired request body is missing检查前端Ajax请求是否设置了contentType: "application/json"
Service层500 Internal Errororg.mybatis.spring.MyBatisSystemException查看error.log,定位SQL语法错误或字段映射问题
Mapper层返回空结果selectBySlotId returned null在MySQL执行相同SQL,确认parking_slot表是否存在对应ID
事务层数据库回滚Transaction rolled back because it has been marked as rollback-only检查Service方法是否抛出未捕获的RuntimeException

最常见问题是“预约成功但车位状态未更新”。这是因为updateParkingSlotStatus()方法里用了@Transactional,但内部调用另一个Service方法时,如果那个方法没加@Transactional,事务传播失效。解决方案:要么把逻辑合并到同一方法,要么在被调用方法上加@Transactional(propagation = Propagation.REQUIRED)

5.3 权限失效:Spring Security的隐藏陷阱

管理员登录后看不到菜单,或普通用户能访问/admin路径:

现象根本原因修复方式
登录后跳转到/login?errorUserDetailsService返回的UserDetails对象中getAuthorities()方法返回空集合检查AdminUserServiceImpl类,确认loadUserByUsername()方法里authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"))已执行
菜单栏空白/api/v1/menu接口返回空数组MenuController里打断点,确认SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取的用户对象不为null,且getAuthorities()包含权限
按钮点击无响应前端Vue/JS未正确解析权限JSON在浏览器Console执行console.log(JSON.parse(sessionStorage.getItem('menu'))), 看返回结构是否符合预期

实操心得:有学生把ROLE_USER写成role_user(小写),导致权限匹配失败。Spring Security默认要求权限字符串以ROLE_开头,且区分大小写。

5.4 性能瓶颈:小系统也要防的慢查询

50个车位看似不多,但订单表数据增长很快。parking_order表在user_idstatus字段上必须建复合索引:

-- 创建索引(避免全表扫描)
CREATE INDEX idx_user_status ON parking_order(user_id, status);
-- 查看执行计划
EXPLAIN SELECT * FROM parking_order WHERE user_id = 123 AND status = 2;

如果Extra列显示Using filesort,说明索引未生效,需调整字段顺序——把等值查询字段放前面,范围查询字段放后面。

另外,integral_rank积分排行榜用定时任务每天凌晨更新,而不是实时计算。SQL语句用INSERT ... SELECT避免锁表:

INSERT INTO integral_rank (user_id, total_score, rank_num) 
SELECT user_id, SUM(score), @rank := @rank + 1 
FROM parking_integral, (SELECT @rank := 0) r 
GROUP BY user_id 
ORDER BY total_score DESC 
ON DUPLICATE KEY UPDATE total_score = VALUES(total_score), rank_num = VALUES(rank_num);

6. 从课程设计到真实落地的扩展建议

这套系统在高校场景的价值,远不止于“完成毕设”。我在指导学生时,会让他们做三件事:

  • 增加微信公众号对接:把/api/v1/order/notify接口改造成微信模板消息推送,用户预约成功后,公众号自动发送“您的车位A-01已锁定,有效期2小时”。技术上只需在WeChatService里调用微信API,比短信更低成本。
  • 接入车牌识别摄像头:在ParkingOrderController里增加/api/v1/order/plate-recognition接口,接收摄像头HTTP POST的JSON数据(含车牌号、时间、图片URL),自动匹配用户预约记录。真实停车场用海康威视SDK,教学版可用OpenCV模拟。
  • 导出Excel报表:用Apache POI生成月度停车报表,包含“各时段车流量热力图”“积分兑换TOP10用户”“投诉处理时效统计”。这不是炫技,而是物业真正需要的数据支撑。

最后分享一个小技巧:系统上线后,我让物业人员每天早上9点用手机拍一张停车场实景照片,上传到/admin/api/v1/photo-upload接口。这些照片自动存到photos/目录,后台管理页按日期展示。三个月后,当街道办来检查“智慧停车改造成效”时,这些照片就是最直观的成果证明——技术可以迭代,但真实场景的照片永远是最有力的证据。

这套系统没有用最新潮的技术栈,但它每一行代码都来自真实停车场的深夜调试。如果你正在为毕设焦虑,或者手头有个小项目要落地,记住:能跑起来的系统,永远比PPT里完美的架构图更有价值。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:基于SpringBoot的停车预约系统,后端用MyBatis做数据持久化,Spring MVC处理请求,前端采用Layui框架配合Ajax和JSON实现动态交互,地图功能通过百度地图API完成车位精准定位与可视化展示。支持JDK1.8和Maven构建,适配Eclipse与IntelliJ IDEA开发环境,MySQL数据库搭配park.sql脚本一键导入。用户端可实时查看空闲车位、提交预约、浏览公告、维护个人信息、提交留言、查询订单;管理员端支持车位全生命周期管理(增删改查)、订单审核与状态更新、公告发布、积分规则配置、投诉建议处理、系统参数调整、账号权限管理及积分排行榜。资源包包含完整源码、pom.xml依赖文件、数据库脚本、部署文档(停车位管理系统.doc)和项目说明(项目说明(必看).txt),结构清晰,开箱即用,适用于高校课程设计、毕业设计或小型停车场数字化改造场景。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

本文章已经生成可运行项目
内容概要:本文系统研究了在有限控制集约束下,三相并网逆变器中电流功率模态模型预测控制(MPC)的等效机理及其性能边界。通过构建精确的预测模型,设计合理的代价函数,并结合Simulink仿真Matlab代码实现,深入分析了电流预测控制功率预测控制两种策略在动态响应速度、稳态精度、谐波抑制能力和抗扰性等方面的差异内在联系。研究揭示了在特定系统参数和运行条件下,两种控制模式之间的等效转化机制,并界定了各自的适用范围性能极限。同时,探讨了多模态控制的切换逻辑、实时性优化及预测模型不确定性对控制性能的影响,旨在提升逆变器在复杂电网环境下的综合控制品质鲁棒性。; 适合人群:具备电力电子、自动控制或新能源并网等相关专业背景,熟悉Matlab/Simulink仿真环境,从事研究生及以上层次科研或从事高端电力电子装备研发的工程技术人员。; 使用场景及目标:①深入理解模型预测控制在并网逆变器中的具体实现方法理论基础;②掌握电流功率模态MPC控制器的设计、仿真建模性能对比评估流程;③为高动态、高精度并网控制系统的方案选型、参数优化工程化应用提供坚实的理论依据和技术参考。; 阅读建议:建议结合所提供的Simulink仿真模型Matlab源代码进行同步实验验证,重点关注预测模型的建立过程、控制律的数学推导以及不同工况下的仿真结果对比分析,宜配合现代控制理论、电力电子变换技术及并网标准等相关资料进行系统性学习。
内容概要:本文针对高渗透率电动汽车随机充电行为对配电网承载能力造成的脆弱性问题,提出了一种基于Matlab代码实现的广义需求响应协同优化研究方法。通过构建涵盖一次设备安全、负荷平稳性、电能质量和系统效率的多维评价指标体系,结合熵权法模糊综合评价模型,科学量化不同渗透率下电动汽车接入对配电网的综合影响。研究深入分析了电动汽车无序充电对电网电能质量、负荷特性及设备安全的冲击机理,揭示了配电网承载能力的脆弱性根源,并通过仿真手段评估系统在多种工况下的响应特性。最终,研究旨在挖掘配电网承载能力极限,提出基于广义需求响应的协同优化策略,以提升电网韧性、运行效率安全稳定性。; 适合人群:具备电力系统基础知识和Matlab编程能力,从事新能源、智能电网、电动汽车等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于评估高比例电动汽车接入对配电网安全性稳定性的影响;②为制定有效的广义需求响应策略提供模型支持仿真工具;③支撑相关课题研究、论文复现科研项目开发。; 阅读建议:文中提供的完整资源可通过指定公众号或百度网盘链接获取,包仿真代码、模型文件参考文献,建议结合目录结构系统学习,并关注后续关于极端工况优化系统可靠性提升的研究方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值