ElasticsearchCRUD使用(二)【简单的文档进行搜索的MVC应用程序】

d2-crud-plus树形菜单 一、api.js import { request } from '@/api/service' const apiPrefix = '接口地址' export function GetList (query) { return request({ url: apiPrefix + '/list', method: 'get', params: query }).then(ret => { ret.data = ret.data ? ret.data : { 阅读详情

搜索Elasticsearch中的文档

该应用程序使用ElasticsearchCRUD访问Elasticsearch。 API可以使用任何DTO或实体类,并将其自动映射到Elasticsearch索引并使用类类型键入。 默认索引是类的类型,所有字符都转换为小写字符。 默认类型是小写字符的类型名称。 如果Elasticsearch需要不同的映射,这可以很容易地改变。 例如,在Elasticsearch中保存为子文档的类需要其索引的映射,即。 使用存储父文档的索引。

在这个例子中使用了一个Skill 类。 这个类被保存在搜索引擎中,具有索引skills和类型skill。

public class Skill
{
  [Required]
  [Range(1, long.MaxValue)]
  public long Id { get; set; }

  [Required]
  public string Name { get; set; }

  [Required]
  public string Description { get; set; }

  public DateTimeOffset Created { get; set; }

  public DateTimeOffset Updated { get; set; }
}

ElasticsearchCRUD Search方法用于使用QueryString进行全文搜索。 该方法从SearchController获取 term(s),并在引擎中执行QueryString搜索。 此搜索不区分大小写。

您可以使用context.Search方法几乎可以进行任何搜索,而不仅仅是查询字符串搜索。 不支持高亮显示的结果,不支持多个索引或多个类型搜索。 所有您需要做的是为搜索构建JSON查询,并从匹配中返回类型的集合。 查询是使用Search类构建的。 Query属性定义可以使用通配符的查询字符串搜索。

public IEnumerable<Skill> QueryString(string term)
{
    var results = _context.Search<Skill>(BuildQueryStringSearch(term));
        return results.PayloadResult.Hits.HitsResult.Select(t => t.Source);
}

private ElasticsearchCRUD.Model.SearchModel.Search BuildQueryStringSearch(string term)
{
    var names = "";
    if (term != null)
    {
        names = term.Replace("+", " OR *");
    }

    var search = new ElasticsearchCRUD.Model.SearchModel.Search
    {
        Query = new Query(new QueryStringQuery(names + "*"))
    };

    return search;
}

搜索方法用于MVC SearchController。 Json被返回,因为jQuery Autocomplete 控件使用了action方法。

public JsonResult Search(string term)
{           
  return Json(_searchProvider.QueryString(term), "Skills", JsonRequestBehavior.AllowGet);
}

Autocomplete(jquery-ui)源方法使用SearchController中的操作方法搜索。 这将对象数组保存到autocomplete控件。 此控件需要控件的每个项中的标签和值属性。 select方法用于从搜索中选择一个结果。 然后将所选项目添加到页面上的其他html控件,以更新或删除HTTP请求。

<fieldset class="form">
    <legend>SEARCH for a document in the search engine</legend>
    <table width="500">
        <tr>
            <th></th>
        </tr>
        <tr>
            <td>
                <label for="autocomplete">Search: </label>
            </td>
        </tr>
        <tr>
            <td>
                <input id="autocomplete" type="text" style="width:500px" />
            </td>
        </tr>
    </table>
</fieldset>

@section scripts
{
    <script type="text/javascript">
        var items;
        $(document).ready(function() {
            $("input#autocomplete").autocomplete({
                source: function(request, response) {
                    $.ajax({
                        url: "search",
                        dataType: "json",
                        data: {
                            term: request.term,
                        },
                        success: function(data) {
                            var itemArray = new Array();
                            for (i = 0; i < data.length; i++) {
                                itemArray[i] = { label: data[i].Name, value: data[i].Name, data: data[i] }
                            }

                            console.log(itemArray);
                            response(itemArray);
                        },
                        error: function(data, type) {
                            console.log(type);
                        }
                    });
                },
                select: function (event, ui) {
                    $("#spanupdateId").text(ui.item.data.Id);
                    $("#spanupdateCreated").text(new Date(parseInt(ui.item.data.Created.substr(6))));
                    $("#spanupdateUpdated").text(new Date(parseInt(ui.item.data.Updated.substr(6))));

                    $("#updateName").text(ui.item.data.Name);
                    $("#updateDescription").text(ui.item.data.Description);
                    $("#updateName").val(ui.item.data.Name);
                    $("#updateDescription").val(ui.item.data.Description);

                    $("#updateId").val(ui.item.data.Id);
                    $("#updateCreated").val(ui.item.data.Created);
                    $("#updateUpdated").val(ui.item.data.Updated);

                    $("#spandeleteId").text(ui.item.data.Id);
                    $("#deleteId").val(ui.item.data.Id);
                    $("#deleteName").text(ui.item.data.Name);

                    console.log(ui.item);
                }
            });
        });
</script>
}

然后可以使用以下控件:
这里写图片描述

Elasticsearch创建,更新和删除

为了方便搜索和提供一些数据,使用ElasticsearchCRUD添加了创建,更新和删除实现。 提供者使用ElasticsearchCRUD的上下文,并在一个批量请求中执行所有待处理的更改到Elasticsearch。 多个索引,类型可以在单个上下文中执行批量请求。 HttpClient类在上下文中心下使用。 在Elasticsearch中添加或更改大量数据时,效果很好。

private const string ConnectionString = "http://localhost:9200/";
private readonly IElasticsearchMappingResolver _elasticsearchMappingResolver = new ElasticsearchMappingResolver();

public void AddUpdateEntity(Skill skill)
{
   using (var context = new ElasticsearchContext(ConnectionString, _elasticsearchMappingResolver))
   {
       context.AddUpdateDocument(skill, skill.Id);
       context.SaveChanges();
   }
}

public void UpdateSkill(long updateId, string updateName, string updateDescription)
{
  using (var context = new ElasticsearchContext(ConnectionString, _elasticsearchMappingResolver))
  {
      var skill = context.GetDocument<Skill>(updateId);
      skill.Updated = DateTime.UtcNow;
      skill.Name = updateName;
      skill.Description = updateDescription;
      context.AddUpdateDocument(skill, skill.Id);
      context.SaveChanges();
  }
}

public void DeleteSkill(long deleteId)
{
   using (var context = new ElasticsearchContext(ConnectionString, _elasticsearchMappingResolver))
   {
       context.DeleteDocument<Skill>(deleteId);
       context.SaveChanges();
   }
}

这可以在SearchController中使用。 HTTP Post Index操作方法中的创建skill文档已经实现了验证。 这调用ElasticsearchCRUD的AddUpdateDocument方法。 如果搜索引擎中已存在具有相同ID的文档,则文档将被覆盖。 通常实体来自主数据库,并保存elasticsearch以进行最佳搜索。 主数据库管理该实体的Ids,因此这不是该用例的问题。

readonly ISearchProvider _searchProvider = new ElasticSearchProvider();

[HttpGet]
public ActionResult Index()
{
   return View();
}

[HttpPost]
public ActionResult Index(Skill model)
{
  if (ModelState.IsValid)
  {
    model.Created = DateTime.UtcNow;
    model.Updated = DateTime.UtcNow;
    _searchProvider.AddUpdateDocument(model);

    return Redirect("Search/Index");
  }

  return View("Index", model);
}

[HttpPost]
public ActionResult Update(long updateId, string updateName, string updateDescription)
{
   _searchProvider.UpdateSkill(updateId, updateName, updateDescription);
   return Redirect("Index");
}

[HttpPost]
public ActionResult Delete(long deleteId)
{
   _searchProvider.DeleteSkill(deleteId);
   return Redirect("Index");
}

然后可以在视图中使用控制器。 视图有3种不同的形式:创建,删除和更新。 当从Autocomplete控件中选择搜索结果时,删除和更新表单将被更新。

<form name="input" action="update" method="post">
    <fieldset class="form">
        <legend>UPDATE an existing document in the search engine</legend>
        <table width="500">
            <tr>
                <th></th>
                <th></th>
            </tr>
            <tr>
                <td>
                    <span>Id:</span>
                </td>
                <td>
                    <span id="spanupdateId">-</span>
                    <input id="updateId" name="updateId" type="hidden" />
                </td>
            </tr>
            <tr>
                <td>
                    <span>Name:</span>
                </td>
                <td>
                    <input id="updateName" name="updateName" type="text" />
                </td>
            </tr>
            <tr>
                <td>
                    <span>Description:</span>
                </td>
                <td>
                    <input id="updateDescription" name="updateDescription" type="text" />
                </td>
            </tr>
            <tr>
                <td>
                    <span>Created:</span>
                </td>
                <td>
                    <span id="spanupdateCreated">-</span>
                    <input id="updateCreated" name="updateCreated" type="hidden" />
                </td>
            </tr>
            <tr>
                <td>
                    <span>Updated:</span>
                </td>
                <td>
                    <span id="spanupdateUpdated">-</span>
                    <input id="updateUpdated" name="updateUpdated" type="hidden" />
                </td>
            </tr>
            <tr>
                <td>
                    <br />
                    <input type="submit" value="Update Skill" style="width: 200px" />
                </td>
                <td></td>
            </tr>
        </table>
    </fieldset>
</form>

<form name="input" action="delete" method="post">
    <fieldset class="form">
        <legend>DELETE an existing document in the search engine</legend>
        <table width="500">
            <tr>
                <th></th>
                <th></th>
            </tr>
            <tr>
                <td>
                    <span id="deleteName">-</span>
                </td>
                <td>
                    <span id="spandeleteId">-</span>
                    <input id="deleteId" name="deleteId" type="hidden" />
                </td>
            </tr>

            <tr>
                <td>
                    <br />
                    <input type="submit" value="Delete Skill" style="width: 200px" />
                </td>
                <td></td>
            </tr>
        </table>
    </fieldset>
</form>

@using (Html.BeginForm("Index", "Search"))
{
    @Html.ValidationSummary(true)

    <fieldset class="form">
        <legend>CREATE a new document in the search engine</legend>
        <table width="500">
            <tr>
                <th></th>
                <th></th>
            </tr>
            <tr>
                <td>
                    @Html.Label("Id:")
                </td>
                <td>
                    @Html.EditorFor(model => model.Id)
                    @Html.ValidationMessageFor(model => model.Id)
                </td>
            </tr>
            <tr>
                <td>
                    @Html.Label("Name:")
                </td>
                <td>
                    @Html.EditorFor(model => model.Name)
                    @Html.ValidationMessageFor(model => model.Name)
                </td>
            </tr>
            <tr>
                <td>
                    @Html.Label("Description:")
                </td>
                <td>
                    @Html.EditorFor(model => model.Description)
                    @Html.ValidationMessageFor(model => model.Description)
                </td>
            </tr>
            <tr>
                <td>
                    <br />
                    <input type="submit" value="Add Skill" style="width:200px" />
                </td>
                <td></td>
            </tr>
        </table>
    </fieldset>
}

然后可以在浏览器中使用该应用程序,如下所示:
这里写图片描述

结论

正如你所看到的,使用具有Elasticsearch的ASP.NET MVC进行全文搜索是非常容易的。 这可以很容易地改变为使用Web API与Angular JS。 由于这些规模很好,性能很好,您可以将其用于几乎任何应用程序。

java+d2-crud-plus导入.xlsx文件 java部分 @AutoLog(value = "学生信息导入") @ApiOperation(value="学生信息导入", notes="学生信息导入") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result<?> importExcel(MultipartFile file) { // 1.自定义一个工具类拿到要解析的文件并解析成要存储的数据 List 阅读详情

相关推荐

Mendix 开发实践指南|Mendix平台概览

低代码开发是一种将编码从文本形式转变为视觉形式的应用开发方法。它提供了一个模型驱动的、拖放式的界面,而不是传统的编码环境,使得各种技能水平的开发者——包括专业开发人员、新手、主题专家、业务利益相关者和决策者——都能使用低代码工具来构建驱动价值的企业业务应用。低代码的核心在于提高开发的可访问性和效率,让更多人能够参与到应用开发中来​​。Mendix适用于多种应用场景,包括企业级应用、移动应用、物联网(IoT)应用和微服务架构等。

多年搬砖的经验分享... 4413

05_Es的CRUD操作、多种复杂搜索查询方式和简单的集群管理

本文章收录于【Elasticsearch 系列】,将详细的讲解 Elasticsearch 整个大体系,包括但不限于ELK讲解、ES调优、海量数据处理等。本文大纲1、document数据格...

华星详谈的博客 1645

RTC时钟芯片替换代码移植-IIC通信

1、问题 RTC时钟芯片由爱普生RX-8010SJ更换成大普INS5710A,两者都是IIC通信,更换大普芯片后时钟不走、以及报掉电错误。仿真分析原因是CPU和RTC芯片收发数据延时不够导致,根据爱普生芯片手册,8010收发数据不采取延时,但大普芯片采用同样方式读取不行(需要加延时) 2、RX-8010SJ手册说明(以读取数据为例) (1)寄存器读操作时序图 指定地址读操作: 1)CPU 发送开始条件[S] 2)CPU 传输RX-8010SJ 的从地址,用R/W 位设定写模式 3)检测从RX-8010

weixin_42851683的博客 2065

代码干货 | Elasticsearch模块——CRUD

ElastICsearch的基本操作:增删改查,有必要了解,以备不时之需. 增删改查是数据库的基础操作方法。ES 虽然不是数据库,但是很多场合下,都被人们当做一个文档型 NoSQL 数据库在使用,原因自然是因为在接口和分布式架构层面的相似性。

CS13522431352的博客 468

树莓派4B保姆级教程:从零配置Python虚拟环境到PySide2开发全流程(含避坑指南)

本文提供树莓派4B上配置Python虚拟环境及PySide2 GUI开发的完整教程。针对armv7l架构的特殊性,详细讲解了从系统准备、虚拟环境创建到PySide2安装的避坑指南,并重点解决了跨平台UI文件处理等常见难题,帮助开发者构建稳定高效的开发环境。

9q8w7e6r5的博客 822

ptrade从零开始学量化第1期【ptrade如何新建策略、新建回测、新建交易】什么是ptrade量化交易?

回测之前需要对开始时间、结束时间、回测资金、回测基准、回测频率几个要素进行设定,设定完毕后点击保存。然后再点击回测按键,系统就会开始运行回测,回测的评价指标、收益曲线、日志都会在界面中展现。可以选择不同的业务类型(比如股票),然后给策略设定一个名称,添加成功后可以在默认策略模板基础上进行策略编写。交易界面点击新增按键进行新增交易操作,策略方案中的对象为所有策略列表中的策略,给本次交易设定名称并点击确定后系统就开始运行交易了。交易开始运行后,可以点击交易详情,查看策略评价指标、交易明细、持仓明细、交易日志。

GJ57017_wx的博客 2480

Elasticsearch基本概念及CRUD常用操作

Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比;ES 里的Index可以看做一个库,而Types相当于表,Documents则相当于表的行。这里Types的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个index下已经只能包含一个typeElasticsearch 7.X 中,Type 的概念已经被删除了。

weixin_44117045的博客 1025

信号转换为图像 时域频域分析

一维信号如何转化为图像?深度学习如何学习 1.当然,直接1d卷积也是可以的。 2. 以信号强度的数值作为纵坐标,以时间为横坐标绘制信号点就可以了。 周霖那个即是 要看看代码是如何做的, 即使是单导联 5000个点,怎么变成50005000的分辨率的 3. 直接把多通道的一维信号合并成二维图像,然后直接按图像卷积的方法去做~~ 2225000这样一个图 ~可以看看语音处理的相关Net,其中比较...

王不留行嘿呦嘿 2万+

crud 筛选项 slot 自定义范围筛选组件配置

template>-- 滑动条容器 -->">-- Element UI 的滑动条组件range 启用范围选择模式 -->-- 设置滑动条的最小值 -->-- 设置滑动条的最大值 -->-- 设置滑动条的步长 -->-- 当滑动条的值发生改变时触发 handleChange 方法 -->-- 设置滑动条的刻度标记 -->props: {min: {default: 0},max: {},step: {default: 1},

weixin_58718109的博客 794

控制障碍函数(Control Barrier Function,CBF) 二、示例

使用一个经典简单的示例讲解CBF的推导

Lyajpunov的博客 6429

基于 Datawhale 开源量化投资学习指南(10):基于 LightGBM 的量化选股

通过本篇文章,我们深入探索了如何运用 LightGBM 机器学习模型实现量化选股。首先,我们通过获取股票的历史数据,进行特征工程和标签制作,将选股问题转化为一个分类问题。接着,我们使用 LightGBM 训练模型,并在验证集和测试集中评估了模型的表现。该选股策略的核心在于结合机器学习算法,从历史数据中寻找能够捕捉股票短期涨跌的关键特征,从而为投资者提供辅助决策支持。虽然本文的模型取得了一定的效果,但这只是量化投资领域的一小部分。

不想宅的冷同学 1346

前端那些事20231211-avue使用-之Crud属性之搜索

前端

qq_41632427的博客 1081

9.27华为OD机试真题 新系统 - 均衡调度 (Java/Py/C/C++/Js/Go)

9.26华为OD机试真题 新系统 - 均衡调度 (Java/Py/C/C++/Js/Go)

算法大师! 480

ElasticsearchCRUD使用(十八)【进行MVC搜索Elasticsearch高亮】

本文介绍如何在MVC应用程序中使用Elasticsearch高亮显示搜索结果。该应用程序执行一个简单的Elasticsearch模糊查询,高亮显示的结果显示在Razor 视图中。在使用高亮显示请求的搜索可以发送到Elasticsearch之前,需要创建一个索引。 FastestAnimal类用于此。public class FastestAnimal { public long Id { g

极客神殿 1595

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ElasticsearchCRUD使用(三)【嵌套文档的MVC】

具有1对n个实体的模型用于与Elasticsearch进行交互的模型具有1到n的关系。 SkillWithListOfDetails类具有SkillDetail对象的列表。 这些类将作为嵌套对象使用SkillDetail列表保存到Elasticsearch。 这个子对象可以像父对象SkillWithListOfDetails中的任何其他属性一样进行搜索。public class SkillWithL

极客神殿 1361

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ElasticsearchCRUD翻译系列之(一): ElasticsearchCRUD 介绍

ELASTICSEARCH CRUD .NETPROVIDER 翻译自(原文地址: https://damienbod.com/2014/09/22/elasticsearch-crud-net-provider/) 本文介绍了ElasticsearchCRUD NuGet包的使用。ElasticsearchCRUD便于你通过对实体的插入、删除、修改从Elasticsearch中查找单个记录...

weixin_30284355的博客 66

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ElasticsearchCRUD使用(十三)【Elasticsearch谷歌地图搜索的MVC应用】

本文介绍如何创建一个使用谷歌地图和Elasticsearch的MVC应用程序进行geo_distance搜索,并找到最近的点(文档)到您的位置。 Elasticsearch索引使用geo_point来定义每个文档的位置。Elasticsearch支持GeoJson格式。Elasticsearch索引和类型使用以下模型创建:public class MapDetail { public lo

极客神殿 2041

探索Elasticsearch的无限可能 —— 强大的ElasticsearchCRUD工具箱

探索Elasticsearch的无限可能 —— 强大的ElasticsearchCRUD工具箱 项目介绍 在大数据时代,高效、灵活的搜索引擎变得至关重要。ElasticsearchCRUD是一个专为.Net开发者设计的强大库,它极大地简化了与Elasticsearch这一分布式搜索和分析引擎交互的复杂度。通过一组全面且易于使用的API,该项目提供了一站式的解决方案,涵盖了从基本的数据创建、读取、...

gitblog_00046的博客 467

ElasticsearchCRUD使用(六)【EF和Elasticsearch的MVC应用程序】

本文演示如何使用实体框架与MS SQL Server作为主数据库和Elasticsearch搜索/选择功能。该应用程序结合了Elasticsearch的功能,用于搜索和快速选择,以及用于CUD事务(创建,更新和删除)的实体框架。设置文档搜索引擎AdventureWorks2012用于填充搜索引擎的数据。可以在这里下载。MS SQL Server是主数据库。数据需要加载到Elasticsearch中,

极客神殿 1548

智慧天气系统 - 可视化大屏(Echarts)&管理系统(HTTP(S)协议)&物联网平台(MQTT协议)

主要技术栈 数据可视化Echarts;管理系统VUE框架; HTTP服务Python Django ,Python Flask; MQTT 物联网服务 Mosquitto;支持主流的MQTT云服务厂商对接:阿里云物联网平台,EMQ物联网平台等; 数据库 Mysql;支持PostgreSQL、MySQL、Oracle、Microsoft SQL Server、SQLite等,还可以定制其它类型数据库; 部署在阿里云主机;支持腾讯云主机,华为云主机,亚马逊云主机等主流云平台,或者私有化部署。

记录项目交付的日常 8085

基于 Python/Vue/D2 实现的CRM管理系统(客户管理,产品管理,商机管理,合同管理,客户公海,权限管理等业务模块)

客户关系管理系统(CRM)是利用信息科学技术,实现市场营销、销售、服务等活动自动化,是企业能更高效地为客户提供满意、周到的服务,以提高客户满意度、忠诚度为目的的一种管理经营方式。客户关系管理既是一种管理理念,又是一种软件技术。以客户为中心的管理理念是CRM实施的基础。

记录项目交付的日常 3134

Elasticsearch入门CRUD(新增、查询、修改、删除)

IT交流互助QQ群:79190545    (Sql Server / Java / Asp.Net / C# / JS / Jquery / Oracle / My Sql / )            -- 欢迎大家进来 聊天,交流 !!。(定期清理 不说话、潜水太深的同学) 1. 项目中引用 Elasticsearch.Net         Elasticsearch 其他版本可

邓杨喜 的专栏 6289

ElasticSearch CRUD实例

# 给索引添加别名 POST http://127.0.0.1:9200/_aliases { "actions":[{"add":{"index":"twitter","alias":"alias1"}}] } # 删除索引的别名 POST http://127.0.0.1:9200/_aliases { "actions":[{"remove":{"index":"twitte...

daicooper的博客 480

elasticsearch学习crud以及高级搜索

ik分词器 ik_max_word:将文本做最细粒度划分。 ik_smart:最粗粒度划分 ik_smart测试 ik_max_word测试 发现问题:狂神说并没有被当做一个词,这就需要自定义配置 ik分词器自定义字典在config文件下的IKAnalyzer.cfg.xml增加自定义字典my.dic 再重新看ik_max_word效果: ik_smart效果: Restful接口: 创建一个索引 PUT /索引名/类型名/文档id 类型: 3.自己设置类型(想mysql新建表)如.

zhjzhj_的博客 244
上一篇: ElasticsearchCRUD使用(一)【介绍】
下一篇: ElasticsearchCRUD使用(三)【嵌套文档的MVC】
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值