swoft速学:加载bean、属性注入;案例:商品参数过滤

InternVL 3.5 深度解析:开源多模态模型的新里程碑 InternVL 3.5是由上海人工智能实验室OpenGVLab团队推出的开源多模态大模型,在推理能力、效率和灵活性方面取得突破。该模型采用ViT-MLP-LLM架构,包含60亿参数的InternViT-6B视觉编码器和多种规格的语言模型骨干。核心创新包括:1)Cascade RL强化学习框架,通过离线热身和在线强化两阶段训练提升推理能力;2)ViR视觉分辨率路由器,动态调整图像处理分辨率以优化计算效率;3)DvD动态视觉token压缩技术。模型系列涵盖2B到241B参数规模,满足从边缘设备到高性能计算的不 阅读详情

1、我们有一个ProductController.php,代码如下:

<?php
namespace App\Controllers\Api;

use App\Models\Entity\Product;
use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;


/**
 * @Controller(prefix="/product")
 */
class ProductController{

    /**
     * @RequestMapping(route="{id}", method=RequestMethod::GET)
     * @param int $id
     * @return mixed
     */
    public function detail(int $id)
    {
        return Product::findById($id)->getResult();
    }
}

浏览器访问 http://localhost/product/2 或者 http://localhost/product/1 ,页面响应商品1或商品2的数据。
这里写图片描述

需求来了

要对商品统一打个8折

Product::findById($id)->getResult();
#方法一 获取到商品数据之后,把价格字段 * 0.8

但聪明的你,可能会想到专门写个类来处理这种情况。

比如,如下类ProductFilter.php:

<?php

namespace App\Filter;

use App\Models\Entity\Product;

class ProductFilter
{
    // 折扣率
    public $discount_rate = 0.8;

    public function filter(Product $product)
    {
        if (!$product){
            return null;
        }

        // 重新计算商品价格
        $price = $product->getPrice() * $this->discount_rate;
        // 设置新的价格
        $product->setPrice($price);

        return $product;
    }
}

然后在控制器中,调用上类的filter()方法来处理:

        // 把商品对象交给ProductFilter处理一下
        $filter = new ProductFilter();
        $product = $filter->filter(Product::findById($id)->getResult()) ;

        return $product;

使用@Bean

<?php

namespace App\Filter;

use App\Models\Entity\Product;
use \Swoft\Bean\Annotation\Bean;

/**
 * @Bean("ProductFilter")
 */ 
class ProductFilter
{
    // 折扣率
    public $discount_rate = 0.8;

    public function filter(Product $product)
    {
        if (!$product){
            return null;
        }

        // 重新计算商品价格
        $price = $product->getPrice() * $this->discount_rate;
        // 设置新的价格
        $product->setPrice($price);

        return $product;
    }
}

给刚才ProductFilter类打上了@Bean("ProductFilter")注解。

打上了这个注解之后,在我们控制器里使用的时候就不必实例化这个类了,那怎么搞呢?

$filter = BeanFactory::getBean('ProductFilter');
$product = $filter->filter(Product::findById($id)->getResult()) ;

使用BeanFactory::getBean('xxx')来加载Bean。

获取Bean的方法很多,其他参考官网:https://doc.swoft.org/master/zh-CN/core/container.html

使用@Inject 属性注入的方式 加载Bean

在控制里:

    /**
     * @Inject(name="ProductFilter")
     */
    public $product_filter;

给product_filter属性打上了@Inject注解。

然后使用:

$product = $this->product_filter->filter(Product::findById($id)->getResult()) ;
双目视觉实战:用Bouguet算法实现极线校正的完整代码解析 本文详细解析了Bouguet算法在双目视觉极线校正中的完整实现流程与性能调优技巧。通过旋转平分策略和基线对齐,Bouguet方法显著降低图像畸变并提升匹配精度,相比传统Hartley校正法平均重投影误差降低53%。文章涵盖从相机标定到OpenCV实战的全过程,并分享工业级调参策略,帮助开发者实现高精度立体视觉系统。 阅读详情

相关推荐

Mamba vs YOLO:目标检测选型指南(附实际项目对比)

本文深入对比了Mamba和YOLO在目标检测领域的性能差异与应用场景。通过实际项目数据,分析了两者在城市交通监控、工业质检等场景下的表现,提供了详细的选型指南和部署优化建议,帮助开发者根据实时性、精度等需求选择最适合的解决方案。

weixin_29062255的博客 367

Swoft 容器注入 - Inject 关键字的使用

可以借助Swoft下的Bean类操作容器 示例: 将类绑定至容器 use Swoft\Bean\Annotation\Bean; /** * @Bean("imageLogic") */ class ImageLogic extends BaseLogic { /** * 根据id获取图片 * @param int $id * @return array */ public static function getOne(int $id

JineD的博客 1669

华为路由器 VRRP主备配置

3、R3 出口路由器。

一直被模仿,从未被超越 5584

swoft文档

类注解,设置在 Controller 类上,标记当前类是一个http控制器类 显式指定路由前缀: @Controller(prefix="/route") 或 @Controller("/route") 隐式指定路由前缀: @Controller() 默认自动解析 controller class 的名称,并且使用驼峰格式。 比如: /** * action demo * * @Contro...

永远是死循环 2686

Vscode远程免密连接Linux虚拟机,并配置C/C++运行环境

目前想要深入学习在Linux,也为了方便编写C/C++程序。Linux的环境里一般自带有c++的编译环境,如果没有安装gcc和g++等编译器也比较便利。但是在虚拟机里用vim编写C++程序又不得劲,因此打算使用vscode远程连接Linux虚拟机进行学习。为了防止自己以后还要再配置,重复踩坑,因此写下这篇博客用做记录。环境:windows11、VMware17、rocky linux9.1 ( 开源的CentOS9 )

m0_56779872的博客 8676

【Codex安装使用手册】

Codex安装部署使用教程

qq_43392230的博客 4931

swoft操作redis、多实例配置

修改连接池配置 app/config/properties/cache.php 配置文件 return [ 'redis' =&gt; [ 'name' =&gt; 'redis', 'uri' =&gt; [ '127.168.88.88:6379' ], 'm...

2754

Linux新手必看:FinalShell连接不上?从检查IP到配置固定地址的完整排错指南

本文为Linux新手提供了FinalShell连接失败的完整排错指南,涵盖IP检查、SSH服务状态、防火墙配置和静态IP设置等关键步骤。通过详细的命令行操作和配置示例,帮助用户快速解决远程连接问题,提升Linux使用效率。

weixin_30675247的博客 753

swoft框架,开发遇到基本坑

1.看好红色的部分,是提示注解带有单引号《'》的字符,检查下注解URL中是不是带有单引号《'》的符号,如果有,统一改成《""》双引号的。保存就可以了 Stack trace: #0 /server/www/swoft/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php(446): Doctrine\...

派煌篇的博客 7856

探索niri:让你的Linux桌面布局无拘无束

niri是一款基于Wayland的滚动平铺合成器,采用创新的窗口管理方式。它将窗口排列为向右无限延伸的条目,支持独立显示器布局和动态垂直工作区,确保多任务操作流畅性。核心功能包括概要视图、截图界面、屏幕投射、手势操作、窗口分组等,并支持自定义布局和动画效果。niri具备良好的稳定性,兼容xwayland-satellite工具,灵感来自PaperWM但突破了GNOME限制。该项目为追求高效桌面管理的用户提供了全新解决方案,欢迎加入社区交流体验。

weixin_44626085的博客 1815

【DeepSeek R1构建本地RAG知识库】数据结构化清洗-工作流自动清洗

在构建本地RAG知识库时,数据结构化清洗是关键但繁琐的步骤。传统方法效率低且易出错,而低代码/无代码平台如Dify提供了更高效的解决方案。Dify通过可视化工作流设计,集成大模型智能处理,支持多格式输入输出,无需编码即可完成复杂的数据清洗任务。文章详细介绍了数据结构化的核心困境、目标、价值及类型,并比较了TXT与Markdown在RAG系统中的适用性。最后,通过Dify平台实战演示了如何在20分钟内完成规则制度文档的结构化清洗,输出标准化数据,展示了自动化工作流在数据处理中的高效性和便捷性。

少说,多做 1219

Swoft 踩坑笔记十四 - Bean容器

Bean容器怎么说呢。。 以往我们要调用一个类,是不是得new啊? 而Bean呢,是在启动swoft的时候就给你实例化了,会一直存在,你用的时候就不需要去new,这样可以节省资源。听起来好像也没什么,但是如果是百万级的呢? 示例 创建 swoft/app/Controllers/Index/BeanController.php namespace App\Controllers\Index; /...

cjd的博客 3058

[VCS]VCS dump fsdb的精细化控制

本文介绍了VCS FSDB波形dump的精细化控制方法。主要内容包括:1)基本dump方式;2)通过$fsdbDumpoff排除特定层次;3)使用$fsdbDumpvars选择性dump指定模块;4)运行时动态控制dump开关;5)通过文件管理排除列表($fsdbDumpoffFile或自定义读取);6)层次控制策略(剪除整棵树或仅当前层)。这些方法可有效控制波形文件大小,提高仿真效率。

元直的博客 1032

Swoft 源码剖析 - Swoft 中的注解机制

作者:bromine链接:https://www.jianshu.com/p/ef7...來源:简书著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版。Swoft Github: https://github.com/swoft-clou... PHP中的注解 注解(Annotations)是Swoft里面很多重要功能特别...

weixin_33766805的博客 443

深度学习工具包 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")

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Swoft Bean

Bean 什么是Bean呢? Swoft中Bean是一个类的对象实例 每个被Swoft管理的PHP对象称之为Bean Swoft提供了一个IoC容器来初始化对象和获取对象,用来解决对象之间的依赖管理。 以前当我们要调用一个类的时候是需要先使用new关键字对类进行实例化后才能使用,现在有了Bean,当Swoft启动的时候就给实例化并一直存在,当你使用时不再需要再去ne...

JunChow 630

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

swoft速学:HttpServer入门(1):控制器、注解、@RequestMapping

1、Swoft的安装部分,请直接看官网文档 https://doc.swoft.org/master/zh-CN/quickstart/enviroment.html 2、安装完成之后,可以来启动HTTP 服务 php bin/swoft start 浏览器访问 http://localhost/ 就看到了Swoft默认的页面。 3、尝试写一个自己的控制器 在app\Control...

3094

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

swoft Bean容器

Bean容器容器是什么?为什么使用Bean容器?Bean容器注解@Bean@Inject定义bean数组定义注解定义操作Bean实例 容器是什么? 相信很多人听说过依赖注入,依赖注入实现的基础条件离不开容器,容器就是用来管理类依赖和注入的,负责服务的管理和解耦组件,最简单的理解我们可以把容器理解成一个超级大、专门存对象的数组。 为什么使用Bean容器? 传统的PHP框架没有常驻内存,因此每次请求进来都需要把所有用到的类实例化一次,每次实例化对象都需要申请内存,当请求处理完成之后又需要释放,这样不断的申请和

我只是个小学生 能力有限 一直抱着学习的态度 405

swoft 源码解读【转】

官网:https://www.swoft.org/ 源码解读:http://naotu.baidu.com/file/814e81c9781b733e04218ac7a0494e2a?token=f009094c71a791c5 号外号外,欢迎大家 star, 我们开发组定了一个 star 1000+ 就线下聚一次的小目标 继续源...

dianfu2892的博客 292

swoft学习笔记之异常处理

文章目录一、定义异常类二、定义异常处理类三、HTTP异常接管 异常处理包含定义异常类和与之对应的异常处理类,处理类通常包含名字为 handle 的方法 一、定义异常类 <?php namespace App\Exception; Class ApiException extends \Exception { } 二、定义异常处理类 <?php namespace ...

zs_4336的博客 1562

swoft(v2.0.8)之Bean容器踩坑

Bean容器代码 <?php namespace App\Bean; use Swoft\Bean\Annotation\Mapping\Bean; /** *@Bean(name="User", scope=Bean::SINGLETON , alias="u") */ class User { private $name; private $age; ...

u014265398的博客 457

swoft单元测试

1.1 为什么要使用单元测试 在编写代码的过程中,一定会反复调试保证它能够编译通过。但代码通过编译,只是说明了它的语法正确。无法保证它的语义也一定正确,没有任何人可以轻易承诺这段代码的行为一定是正确的。幸运的是,单元测试会为我们的承诺做保证。编写单元测试就是用来验证这段代码的行为是否与我们期望的一致。有了单元测试,我们可以自信地交付自己的代码,减少后顾之忧。总之进行单元测试,会带来以下好处: ...

一二三四吾 1835

swoft速学:数据库配置、实体定义

1、数据库配置 官方文档地址:https://doc.swoft.org/master/zh-CN/db/config.html 默认是给出的主从配置,这里暂不考虑主从,config/properties/db.php代码修改如下: &lt;?php return [ 'master' =&gt; [ 'name' =&gt; 'master', ...

4861

easyswoole使用 从ThinkPHP5.1独立出来的数据库ORM类库

文档地址: https://www.easyswoole.com/Manual/2.x/Cn/_book/Database/think_orm.html 1、安装 cd easyswoole #进入项目目录 composer require topthink/think-orm 2、数据库配置 在Config.php里添加配置项: 'database' =&amp;gt; [ ...

7239

Swoole入门:4种客户端连接服务器的方式介绍

四种客户端连接方式:浏览器连接server.php:<?php//创建Server对象,监听 10.211.55.15:9501端口 $serv = new swoole_server("10.211.55.15", 9501); // 10.211.55.15 是我们Swoole服务器地址//监听数据接收事件 $serv->on('receive', function ($serv, $fd, $

6529

Swoole框架:easyswoole安装

EasySwoole 是一款基于Swoole Server 开发的常驻内存型PHP框架,专为API而生,摆脱传统PHP运行模式在进程唤起和文件加载上带来的性能损失。EasySwoole 高度封装了Swoole Server 而依旧维持Swoole Server 原有特性,支持同时混合监听HTTP、自定义TCP、UDP协议,让开发者以最低的学习成本和精力编写出多进程,可异步,高可用的应用服务。...

5971

swoole设置定时器、easyswoole框架 の Crontab定时器

swoole设置定时器 思考: 比如新闻排行榜、商品排行榜,一般都不是即时生成的。(因为数据量大、并发高) 那么怎么做呢? 1、结合消息队列触发后台一个任务 2、结合定时任务,定时生成一些静态资源 swoole提供了类似JavaScript的setInterval/setTimeout异步高精度定时器,粒度为毫秒级。 https://wiki.swoole.c...

5046
上一篇: swoft速学:HTTP服务: 获取POST参数、简单验证器
下一篇: Swoft速学:中间件 Middleware
学习笔记666
博客等级 码龄12年 1047粉丝 1369原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值