使用Shiro做权限认证(2)

用Docker-Compose三节点部署生产级Doris集群:从配置文件到故障转移 本文详细介绍了如何使用Docker-Compose部署一个生产级的三节点Apache Doris集群。内容涵盖从核心架构理解、配置文件编写到集群初始化验证的全过程,并重点讲解了如何实现高可用、数据持久化、健康检查以及故障转移等生产级运维关键点,为中小团队提供了一种在容器化便利性与系统稳定性间取得平衡的可靠部署方案。 阅读详情

在第一节中,我们重新定义了Realm,重新注册了securityManager。SecurityUtils会按照我们的期望工作了。如何用securityManager将我们的应用程序管理起来呢。
shiro只是提供安全控制的API,并不能识别我们应用程序中哪些是需要安全控制的资源,这部分的定义是需要我们自己来完成的。也就是说我们在需要安全控制的资源处加入安全控制的代码。

shiro提供了多种安全控制的判断方式:
编程实现:通过写if/else授权代码块完成:

Subject subject = SecurityUtils.getSubject();  
if(subject.hasRole(“admin”)) {  
    //有权限  
} else {  
    //无权限  
} 

注解实现:通过在执行的Java方法上放置相应的注解完成:

@RequiresRoles("admin")  
public void hello() {  
    //有权限  
} 

注解式,你需要在你的应用程序中启用AOP 支持才能生效。

JSP/GSP标签实现:在JSP/GSP页面通过相应的标签完成:

<shiro:hasRole name="admin">  
<!— 有权限 —>  
</shiro:hasRole>   

URL过滤实现:在 web应用中对url进行控制,需要启动shirofilter过滤

/admin/login.html = authc
/admin/index.html = authc
/admin/* = authc
...

以上方式其实都是将资源交付给securityManager进行管理,进而实现安全控制的目的。

[特殊字符] 从零构建携程/飞猪机票价格爬虫:Python异步抓取与反爬对抗实战 在出行决策、竞品分析、价格预测模型训练等场景中,稳定获取携程(Ctrip)和飞猪(Fliggy)的实时机票价格波动数据是刚需。然而,这两大平台均部署了业界顶尖的反爬体系——包括但不限于:动态请求签名(SignToken设备指纹采集(UACanvasWebGL接口参数加密(X-Sign_abtestcookie混淆)频率限制与 IP 封禁(滑动窗口 + 行为检测)目录前言:为什么需要自建机票价格爬虫?一、技术选型与项目架构1.1 核心技术栈1.2 系统架构图(文字描述)1.3 法律与道德声明。 阅读详情

相关推荐

cMake编译 VS2026+opencv4.12.0+opencv_contrib-4.12.0

本文提供了OpenCV 4.12.0集成CUDA、cuDNN和ONNX Runtime的详细编译指南。主要步骤包括:准备Visual Studio 2026、CMake 4.2.0、CUDA 12.6和cuDNN 9.16.0;设置无空格和中文的路径结构;配置关键CMake变量(如开启CUDA支持、指定路径等);以及最终的编译安装过程。注意事项包括:版本一致性检查、cuDNN文件复制、国内用户需手动获取.cache文件等。文章还提供了常见问题解决方案,如通过设置CUDA_NVCC_FLAGS参数解决VS版本

weixin_46624734的博客 1384

使用shiro完成权限判断

一、权限判断 获取到所有权限进行判断,应该从数据库中获取 public class FilterChainDefinitionMapFactory { @Autowired private IPermissionService iPermissionService; public LinkedHashMap<String,String> builderFilter...

weixin_44860790的博客 4033

电力电子新手必看:COT控制模式的工作原理与典型应用场景解析

本文深入解析了COT控制模式的工作原理及其在电力电子领域的典型应用。COT控制(恒定导通时间控制)通过固定导通时间机制,解决了传统滞环控制的问题,特别适用于需要快速瞬态响应和高效率的应用场景,如CPU/GPU供电和便携设备电源管理。文章详细介绍了COT控制的核心流程、技术特点及设计实践中的关键考量,帮助电力电子新手快速掌握这一技术。

weixin_30745553的博客 522

使用Shiro实现权限验证

《使用Shiro实现权限验证》 1. Shiro入门 ApacheShiro是一个功能强大且易于使用的Java安全框架,提供了认证,授权,加密,和会话管理。 Shiro有三大核心组件: Subject:即当前用户,在权限管理的应用程序里往往需要知道谁能够操作什么,谁拥有操作该程序的权利,shiro中则需要通过Subject来提供基础的当前用户信息,Subject 不仅仅代表某个用户,与当前

YanMonarch博客 10万+

SAP ABAP实战:手把手教你用BAPI_BILLINGDOC_CREATEMULTIPLE批量开票(附完整代码与避坑指南)

本文详细解析了SAP ABAP中BAPI_BILLINGDOC_CREATEMULTIPLE批量开票的全流程,包括参数配置、事务控制、错误处理及性能优化。通过实战案例和完整代码示例,帮助开发者高效处理大批量发票生成任务,避免常见陷阱,提升开发效率。

weixin_34101914的博客 266

【ODX介绍】-4.2-UDS诊断$27服务在ODX-D诊断描述文件中如何描述

共25页精讲:附ODX-D XML:UDS $27 Security服务0x61和0x62 Sub-Function,其它Sub-Function可参照其格式。 目录 1 ODX-D描述一个UDS $27 Security服务Sub-Function的结构 2 标签DIAG-SERVICE描述的内容 2.1 举例:DIAG-SERVICE的XML描述 3 标签REQUEST描述的内容 3.1 举例:REQUEST的XML描述 4 标签POS-RESPONSE描述的内容 4.1 举例:PO..

「汽车电子助手」的博客 1122

使用shiro实现简单权限验证

Apache Shiro 是 Java 的一个安全(权限)框架。 Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE 环境,也可以用在 JavaEE 环境。 Shiro 可以完成:认证、授权、加密、会话管理、与Web 集成、缓存等。 下载地址:http://shiro.apache.or Authentication:身份认证/登录,验证用户是不是拥有相应的身份; Auth...

weixin_43836464的博客 651

47、利用组策略配置 Windows 防火墙与 IPsec 全解析

本文深入解析了如何利用组策略配置Windows防火墙与IPsec,涵盖防火墙规则基础、IPsec身份验证与加密机制、服务器和域隔离实现方法、WFAS中新旧IPsec规则的区别与配置流程,并详细说明了防火墙属性与规则的优先级计算方式。同时介绍了证书服务、EFS等未详述的安全功能及相关学习资源,帮助管理员通过组策略有效提升网络安全性。

onion的博客 101

第六节 SpringBoot2.x整合Shiro权限认证项目搭建

1,使用SpringBoot2.x整合Shiro权限认证 Maven3.5 + Jdk8 + Springboot 2.X + IDEA (Eclipse也可以) 创建SpringBoot项目 https://start.spring.io/ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-start.

菜鸟联盟 154

使用 MATLAB/Simulink 构建一个 压水堆核电机组的反应堆控制与功率调节系统 仿真模型

本文通过Simulink构建压水堆核电机组的反应堆控制与功率调节模型,详细介绍了建模流程:从中子点动力学核心方程、反应性反馈模型(控制棒、多普勒和慢化剂效应)、一回路热工模型到完整的闭环控制系统。教程包含系统结构设计、参数设置、模块连接方法,以及典型负荷变化场景的仿真分析,帮助读者理解核反应堆动态特性和控制原理。同时提供了进阶建模建议,如分布参数模型和先进控制策略的应用。该模型为教学简化版,强调核能系统的机理建模与Simulink实现方法,适合核工程与控制领域的学习者参考实践。

amy_mhd的博客 186

从 Non-Unicode 到 Unicode:ABAP 程序切换的坑、原理与工程化落地指南

摘要 老SAP系统中ABAP程序员常假设1字符=1字节,导致大量代码依赖单字节处理逻辑。Unicode系统的引入彻底改变了字符长度、偏移量等底层认知,强制要求程序遵循Unicode规则。关键问题包括:字符/字节语义混淆、结构体访问风险、以及ABAP语言版本的门槛限制。迁移时需要重点关注字符串处理、二进制协议解析等场景,利用UCCHECK、RSUNISCAN_FINAL等工具扫描风险,并通过持续集成机制确保代码质量。建议在Non-Unicode阶段就启用unicode_check参数模拟严格模式,分批次修复问

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3457

Shiro入门2:权限管理入门,用户认证、授权

关于权限管理,用户认证和用户授权的理论知识

机智猫 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

使用Shiro结合springboot完成登录权限认证等操作(2)

顾名思义,SecurityManager是管理着shiro的相关组件相互,实现shiro登陆鉴权等核心功能的安全管理器,shiro中所有和安全相关的一些操作都会在安全管理器中进行操作。可以有一个或多个Realm,realm可以简单的来说就是储存了当前你需要的用户权限等相关的数据,比如角色,权限,用户等相关的信息,我们通常在realm中调用数据库来获取相关数据。授权组件接口定义了一系列关于授权的方法,在前面的示例中我们可以通过一系列的方法来自定义授权和认证等操作。Authorizer(授权组件)

aoyuanyuan0921的博客 831

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

关于shiro的简单使用(2) --- 权限认证

之前已经熟悉了认证登陆,接下来尝试一下权限控制,在此之前,先了解一下权限控制的方式。我接触的权限控制的方式主要有2种,一种是粗粒度URL级别的权限控制,还有一种就是细粒度方法级别权限控制。粗粒度URL级别权限控制,简单来说就是当前用户访问一个URL地址,查 ...

uaucome的博客 375

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

前后分离springboot2.1集成shiro使用redis做权限认证缓存

整整搞了两天,网上好多文章没有标注出小版本,让我很是艰难。这里记录一下。 1:pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"...

huiyunfei的博客 595

Shiro2.整合登陆认证和权限控制

前言 上一篇简单了解Shiro框架的几个比较重要的类,清楚在使用Shiro应该配置哪些。本篇则从实际角度出发开发整合登陆认证和权限控制案例。 本实例环境:IDEA + Maven 本实例采用的主要技术:SpringBoot +Shiro+Thymeleaf 本次学习目标 登陆之后才有权访问控制链接,否则跳转到登录页面; 对Url链接进行权限控制,仅当前用户有该链接的访问权限才能访

学习那点事儿 981

Sringboot2整合shiro实现登录认证、权限控制和记住我功能

Springboot2整合Shiro实现登录认证和记住我功能。

Aiwin的博客 1197

shiro_04_权限认证(2)

上一篇主要介绍了编程性授权,还有两种方式进行授权: 1.注解式授权 2.jsp标签授权 详解看文档 注解式授权: @RequiresAuthentication 要求当前Subject 已经在当前的session 中被验证通过才能被访问或调用。 @RequiresGuest 要求当前的Subject 是一个"guest",也就是说,他们必须是在之前的 session 中没有被验证...

_Sherlock_ 227

小滴课堂 - shiro笔记01 - SpringBoot2.x整合Shiro权限认证项目搭建

5.文章参考链接 a. https://xdclass.net/#/index

hecr_mingong的博客 211

Java权限控制框架看它就够了之Shiro

Java权限控制框架看它就够了共分为三个部分: 1、Java权限控制框架看它就够了之Shiro 2、Java权限控制框架看它就够了之Spring Security 3、Java权限控制框架看它就够了之Spring Security Oauth2 这三个权限框架博客将于近期发布,敬请关注哦!!!!!!!!!!!!!!!!!!!!!!!!!!!! 一、Shiro简介 首先我还是先介绍一波Shiro是做什么的吧。Shiro框架是Apache基金会开源维护的一个Java安全框架。它为...

雲浩的博客 1643

shiro权限管理2--------认证

shiro认证关键点索引 1.Subject-门面 门面进行登录,登录时会组建token,这里的密码其实是明文上送来的 2.SecurityManager-核心 门面登录后,核心处理器会调用认证器的方法,认证期会调用realm的认证方法。 调用realm认证后,比较器会对token和info的账号和密码进行比对 3.Realm-安全数据源 realm认证的方法会根据aut...

良之才的专栏 176

基于ADS122U04与MK24的HVAC高精度温度采集系统设计

工业温度采集是高精度测控系统的核心环节,RTD和热电偶的微弱信号需经高精度ADC转换才能被MCU可靠处理。基于比例式测量与冷端补偿原理,设计者通常需要权衡接口方式、抗干扰能力与系统成本。采用UART接口的24位ADC可显著简化长距离布线,降低SPI共总线带来的串扰和隔离难题,同时配合工业级MCU实现控制算法与通信协议栈的稳定运行。在暖通空调(HVAC)场景中,压缩机排气温度、回风温度等多路传感数据的实时采集,直接关系到系统能效与安全。本文围绕ADS122U04IPWR与MK24FN1M0VDC12的硬件设计

weixin_33829657的博客 252

8、SpringBoot2.0整合Shiro实现登录认证和权限管理(八)

1、添加相关的依赖,spring-boot-starter-data-jpa在 IEDA中创建SpringBoot2.0项目-超详细(一)博客中已经添加,只需添加以下依赖即可: <!--shiro相关--> <dependency> <groupId>org.springframework.boot</groupId> &l...

Rsun2018的博客 669

java域用户权限设置_SpringBoot2 整合 Shiro 框架,实现用户权限管理

一、Shiro简介1、基础概念Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。作为一款安全框架Shiro的设计相当巧妙。Shiro的应用不依赖任何容器,它不仅可以在JavaEE下使用,还可以应用在JavaSE环境中。2、核心角色1)Subject:认证主体代表当前系统的使用者,就是用户,在Shiro的认证中,认证主体通常就是userName和pass...

weixin_32424555的博客 282

shiro放行失效_备忘录九:Spring Boot+Shiro权限管理

一:配置文件 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency>二:Sh...

weixin_35029593的博客 563

shiro整合springboot作为权限控制的学习

2019年7月16 最近在学习shiro关于权限控制这一块,对shiro理解了一些,有一部分知识点还没有弄清楚,先记录一部分的内容,之后会加以补充,直接上代码 1、pom.xm代码 <properties> <java.version>1.8</java.version> <mybatisplus.version>3.0.7....

石懒猪很懒的博客 192
上一篇: 使用Shiro做权限认证(3)
下一篇: 使用Shiro做权限认证(1)
frog4
博客等级 码龄18年 56粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值