第8讲:$.ajax方法使用详解

jQuery对象上面定义了Ajax方法($.ajax()),用来处理Ajax操作。调用该方法后,浏览器就会向服务器发出一个HTTP请求。ajax方法有很多属性,但并非每次调用都要使用所有属性,本讲详细介绍了每个属性的作用,并给出具体的调用案例,分别从服务器返回文本格式数据,JSON格式数据及xml格式数据。

$.ajax方法使用规范

$.ajax()方法常用参数列表

属性名称

说明

type

设置请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。

async

设置是否异步,默认值: true。默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。

url

发送请求的地址

data

请求到服务器的参数,将自动转换为请求字符串格式,格式:{参数名1:值1,参数名2:值2.....}

success

要求为Function类型的参数,请求成功后调用的回调函数,格式:function(data[, textStatus]){} ,data:由服务器返回,并根据dataType参数进行处理后的数据,textStatus描述状态的字符串,可以省略。

error

要求为Function类型的参数,请求失败时被调用的函数。function(){alert('服务器异常!')}

dataType

预期服务器返回的数据类型。可选值为:text,json,xml,html,script,jsonp

complete

要求为Function类型的参数,请求完成后调用的回调函数(无论请求成功或失败时均调用)。

ajax方法有很多属性,但并不是每次调用都需要使用,根据情况使用部分参数即可

具体案例演示

前端代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JQuery中ajax支持应用</title>
    <!--加载JQuery库-->
    <script src="../js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript">
        function send(){
            var userName = $("#userName").val();
            console.log("userName=" + userName);
            var url = "/ajaxProj/t4AjaxServlet"
            $.ajax({
                type:'post',    //post或者get
                async:true,     //异步为true,同步为false
                url: url,
                //需要提交到后台的参数,键值对格式,多个参数逗号分隔
                data:{
                    userName:userName,
                    id:1,
                    age:15,
                    action:'text'
                },
                success:function (data){
                    //响应成功执行该函数
                    console.log("执行成功:"+data);
                    $("#fonts").text(data);
                },
                error:function (data){
                    //响应失败执行该函数,比如404,500,405等
                    console.log("执行失败:" + data);

                },complete:function(){
                    //不管执行成功,还是执行失败,最后都会执行
                    console.log("执行结束");
                },
                dataType:"text"
            });
        }
        function sendJson(){
            var userName = $("#userName").val();
            console.log("userName=" + userName);
            var url = "/ajaxProj/t4AjaxServlet"
            $.ajax({
                type:'post',    //post或者get
                async:true,     //异步为true,同步为false
                url: url,
                //需要提交到后台的参数,键值对格式,多个参数逗号分隔
                data:{
                    userName:userName,
                    id:1,
                    age:15,
                    action:'json'
                },
                success:function (data){
                    //响应成功执行该函数
                    console.log("执行成功:"+data);
                    var li = "<table>"
                    li += "<tr><td align='right'>id:</td><td>"+data.id+"</td></tr>"
                    li += "<tr><td align='right'>用户名称:</td><td>"+data.userName+"</td></tr>"
                    li += "<tr><td align='right'>用户年龄:</td><td>"+data.age+"</td></tr>"
                    li += "</table>";
                    $("#fonts").html(li);
                },
                error:function (data){
                    //响应失败执行该函数,比如404,500,405等
                    console.log("执行失败:" + data);

                },complete:function(){
                    //不管执行成功,还是执行失败,最后都会执行
                    console.log("执行结束");
                },
                dataType:"json"
            });
        }
        function sendXml(){
            var userName = $("#userName").val();
            console.log("userName=" + userName);
            var url = "/ajaxProj/t4AjaxServlet"
            $.ajax({
                type:'post',    //post或者get
                async:true,     //异步为true,同步为false
                url: url,
                //需要提交到后台的参数,键值对格式,多个参数逗号分隔
                data:{
                    userName:userName,
                    id:1,
                    age:15,
                    action:'xml'
                },
                success:function (data){
                    //响应成功执行该函数
                    console.log("执行成功:"+data);
                    let membersData = data.getElementsByTagName("person");
                    console.log(membersData);
                    let id = membersData[0].childNodes[0].firstChild.nodeValue;
                    let userName = membersData[0].childNodes[1].firstChild.nodeValue;
                    let age = membersData[0].childNodes[2].firstChild.nodeValue;
                    let li = "<table>"
                    li += "<tr><td align='right'>id:</td><td>"+id+"</td></tr>"
                    li += "<tr><td align='right'>用户名称:</td><td>"+userName+"</td></tr>"
                    li += "<tr><td align='right'>用户年龄:</td><td>"+age+"</td></tr>"
                    li += "</table>";
                    $("#fonts").html(li);
                },
                error:function (data){
                    //响应失败执行该函数,比如404,500,405等
                    console.log("执行失败:" + data);

                },complete:function(){
                    //不管执行成功,还是执行失败,最后都会执行
                    console.log("执行结束");
                },
                dataType:"xml"
            });
        }
    </script>
</head>
<body>
    <h2 align="center">JQuery中ajax支持应用</h2>
    <hr>
    用户名:<input type="text" name="userName" id="userName">
    <input type="button" value="返回文本内容" onclick="send()">
    <input type="button" value="返回json内容" onclick="sendJson()">
    <input type="button" value="返回xml内容" onclick="sendXml()">
    <hr>
    服务器返回的结果:<font id="fonts" color="red" size="2"></font>
</body>
</html>
后端代码如下:
package com.servlet;

import com.alibaba.fastjson.JSONObject;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "T4AjaxServlet",value = "/t4AjaxServlet")
public class T4AjaxServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //获取返回的值
        String action = request.getParameter("action");
        String userName = request.getParameter("userName");
        String id = request.getParameter("id");
        String age = request.getParameter("age");
        System.out.println("userName=" + userName + ",id=" + id + ",age=" + age);
        //输出
        if(action.equals("text")) {
            out.println("返回结果:userName=" + userName);
        }else if(action.equals("json")){
            //字符串类型的值必须用双引号,如果是数值类型可以省略双引号
            //String msg ="{\"userName\":\"" +userName+ "\",\"id\":\"" + id + "\",\"age\":" + age + "}";
            //System.out.println(msg);
            //out.println(msg);
            //用fastjson包的类实现
            JSONObject person = new JSONObject();
            person.put("id",id);
            person.put("userName",userName);
            person.put("age",age);
            out.println(person.toJSONString());

        }else if(action.equals("xml")){
            StringBuffer sb = new StringBuffer();
            sb.append("<persons>");
            sb.append("<person><id>"+id+"</id><userName>"+userName+"</userName><age>"+age+"</age></person>");
            sb.append("</persons>");
            out.println("<?xml version='1.0' encoding='utf-8' ?>");
            out.println(sb.toString());
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    }
}
运行效果

 

ajax方法还有一些简便写法。

$.get():发出GET请求。
$.getScript():读取一个JavaScript脚本文件并执行。
$.getJSON():发出GET请求,读取一个JSON文件。
$.post():发出POST请求。
$.fn.load():读取一个html文件,并将其放入当前元素之中。

$.post方法参考

            //调用JQuery的post方法提交数据
            let url = "/ajaxProj/collegeServlet"
            $.post(
                url,
                {
                    参数1:值1,
                    参数2:值2,
                    参数3:值3
                },
                function (data){
                    //执行成功返回的结果
                    console.log(data);
                },
                "json"
            );

本人从事软件项目开发20多年,2005年开始从事Java工程师系列课程的教学工作,录制50多门精品视频课程,包含java基础,jspweb开发,SSH,SSM,SpringBoot,SpringCloud,人工智能,在线支付等众多商业项目,每门课程都包含有项目实战,上课PPT,及完整的源代码下载,有兴趣的朋友可以看看我的在线课堂​​​​​​​

讲师课堂链接:https://edu.csdn.net/lecturer/893

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JS组件Bootstrap Table使用方法详解 转载 2016年03月21日 15:06:09 标签: Bootstrap Table 最近客户提出需求,想将原有的管理系统,做下优化,通过手机也能很好展现,想到2个方案: a方案:保留原有的页面,新设计一套适合手机的页面,当手机访问时,进入m.zhy.com(手机页面),pc设备访问时,进入www.zhy.com(pc页面) b方案:采用bootstrap框架,替换原有页面,自动适应手机、平板、PC 设备 采用a方案,需要设计一套界面,并且要得重新写适合页面的接口,考虑到时间及成本问题,故项目采用了b方案 一、效果展示 二、BootStrap table简单介绍 bootStrap table 是一个轻量级的table插件,使用AJAX获取JSON格式的数据,其分页和数据填充很方便,支持国际化 三、使用方法 1、引入js、css [js] view plain copy <!--css样式--> <link href="css/bootstrap/bootstrap.min.css" rel="stylesheet"> <link href="css/bootstrap/bootstrap-table.css" rel="stylesheet"> <!--js--> [removed][removed] [removed][removed] [removed][removed] [removed][removed] 2、table数据填充 bootStrap table获取数据有两种方式,一是通过table 的data-url属性指定数据源,二是通过JavaScript初始化表格时指定url来获取数据 [xhtml] view plain copy ... ... [xhtml] view plain copy $('#table').bootstrapTable({ url: 'data.json' }); 第二种方式交第一种而言在处理复杂数据时更为灵活,一般使用第二种方式来进行table数据填充。 [js] view plain copy $(function () { //1.初始化Table var oTable = new TableInit(); oTable.Init(); //2.初始化Button的点击事件 /* var oButtonInit = new ButtonInit(); oButtonInit.Init(); */ }); var TableInit = function () { var oTableInit = new Object(); //初始化Table oTableInit.Init = function () { $('#tradeList').bootstrapTable({ url: '/VenderManager/TradeList', //请求后台的URL(*) method: 'post', //请求方式(*) toolbar: '#toolbar', //工具按钮用哪个容器 striped: true, //是否显示行间隔色 cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*) pagination: true, //是否显示分页(*) sortable: false, //是否启用排序 sortOrder: "asc", //排序方式 queryParams: oTableInit.queryParams,//传递参数(*) sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*) pageNumber:1, //初始化加载第一页,默认第一页 pageSize: 50, //每页的记录行数(*) pageList: [10, 25, 50, 100], //可供选择的每页的行数(*) strictSearch: true, clickToSelect: true, //是否启用点击选中行 height: 460, //行高,如果没有设置height属性,表格自动根据记录条数觉得表格高度 uniqueId: "id", //每一行的唯一标识,一般为主键列 cardView: false, //是否显示详细视图 detailView: false, //是否显示父子表 columns: [{ field: 'id', title: '序号' }, { field: 'liushuiid', title: '交易编号' }, { field: 'orderid', title: '订单号' }, { field: 'receivetime', title: '交易时间' }, { field: 'price', title: '金额' }, { field: 'coin_credit', title: '投入硬币' }, { field: 'bill_credit', title: '投入纸币' }, { field: 'changes', title: '找零' }, { field: 'tradetype', title: '交易类型' },{ field: 'goodmachineid', title: '货机号' },{ field: 'inneridname', title: '货道号' },{ field: 'goodsName', title: '商品名称' }, { field: 'changestatus', title: '支付' },{ field: 'sendstatus', title: '出货' },] }); }; //得到查询的参数 oTableInit.queryParams = function (params) { var temp = { //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的 limit: params.limit, //页面大小 offset: params.offset, //页码 sdate: $("#stratTime").val(), edate: $("#endTime").val(), sellerid: $("#sellerid").val(), orderid: $("#orderid").val(), CardNumber: $("#CardNumber").val(), maxrows: params.limit, pageindex:params.pageNumber, portid: $("#portid").val(), CardNumber: $("#CardNumber").val(), tradetype:$('input:radio[name="tradetype"]:checked').val(), success:$('input:radio[name="success"]:checked').val(), }; return temp; }; return oTableInit; }; field字段必须与服务器端返回的字段对应才会显示出数据。 3、后台获取数据 a、servlet获取数据 [js] view plain copy BufferedReader bufr = new BufferedReader( new InputStreamReader(request.getInputStream(),"UTF-8")); StringBuilder sBuilder = new StringBuilder(""); String temp = ""; while((temp = bufr.readLine()) != null){ sBuilder.append(temp); } bufr.close(); String json = sBuilder.toString(); JSONObject json1 = JSONObject.fromObject(json); String sdate= json1.getString("sdate");//通过此方法获取前端数据 ... b、springMvc Controller里面对应的方法获取数据 [js] view plain copy public JsonResult GetDepartment(int limit, int offset, string orderId, string SellerId,PortId,CardNumber,Success,maxrows,tradetype) { ... } 4、分页(遇到问题最多的) 使用分页,server端返回的数据必须包括rows和total,代码如下: [js] view plain copy ...gblst = SqlADO.getTradeList(sql,pageindex,maxrows); JSONArray jsonData=new JSONArray(); JSONObject jo=null; for (int i=0,len=gblst.size();i<len;i++) { TradeBean tb = gblst.get(i); if(tb==null) { continue; } jo=new JSONObject(); jo.put("id", i+1); jo.put("liushuiid", tb.getLiushuiid()); jo.put("price", String.format("%1.2f",tb.getPrice()/100.0)); jo.put("mobilephone", tb.getMobilephone()); jo.put("receivetime", ToolBox.getYMDHMS(tb.getReceivetime())); jo.put("tradetype", clsConst.TRADE_TYPE_DES[tb.getTradetype()]); jo.put("changestatus", (tb.getChangestatus()!=0)?"成功":"失败"); jo.put("sendstatus", (tb.getSendstatus()!=0)?"成功":"失败"); jo.put("bill_credit", String.format("%1.2f",tb.getBill_credit()/100.0)); jo.put("changes",String.format("%1.2f",tb.getChanges()/100.0)); jo.put("goodroadid", tb.getGoodroadid()); jo.put("SmsContent", tb.getSmsContent()); jo.put("orderid", tb.getOrderid()); jo.put("goodsName", tb.getGoodsName()); jo.put("inneridname", tb.getInneridname()); jo.put("xmlstr", tb.getXmlstr()); jsonData.add(jo); } int TotalCount=SqlADO.getTradeRowsCount(sql); JSONObject jsonObject=new JSONObject(); jsonObject.put("rows", jsonData);//JSONArray jsonObject.put("total",TotalCount);//总记录数 out.print(jsonObject.toString()); ... 5、分页界面内容介绍 前端获取分页数据,代码如下: [js] view plain copy ...oTableInit.queryParams = function (params) { var temp = { //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的 limit: params.limit, //第几条记录 offset: params.offset, //显示一页多少记录 sdate: $("#stratTime").val(), }; return temp; };... 后端获取分页数据,代码如下: [js] view plain copy ...int pageindex=0; int offset = ToolBox.filterInt(json1.getString("offset")); int limit = ToolBox.filterInt(json1.getString("limit")); if(offset !=0){ pageindex = offset/limit; } pageindex+= 1;//第几页... 以上就是为大家分享的Bootstrap Table使用方法,希望对大家熟练掌握Bootstrap Table使用方法有所帮助。 转自:http://www.jb51.net/article/79033.htm
Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本系列的作者是一位 Ajax 专家,他演示了这些技术如何协同工作 —— 从总体概述到细节的讨论 —— 使高效的 Web 开发成为现实。他还揭开了 Ajax 核心概念的神秘面纱,包括 XMLHttpRequest 对象。 五年前,如果不知道 XML,您就是一只无人重视的丑小鸭。十八个月前,Ruby 成了关注的中心,不知道 Ruby 的程序员只能坐冷板凳了。今天,如果想跟上最新的技术时尚,那您的目标就是 Ajax。 请访问 Ajax 技术资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何新信息都能在这里找到。 但是,Ajax 不仅仅 是一种时尚,它是一种构建网站的强大方法,而且不像学习一种全新的语言那样困难。 目录 第 1 部分: Ajax 简介 3 1.1 老技术,新技巧 4 1.2 XMLHttpRequest 对象 4 1.3 获取 Request 对象 6 1.4 Ajax 世界中的请求/响应 8 1.5 连接 Web 表单 10 第 2 部分: 使用 JavaScriptAjax 发出异步请求 11 1.1 XMLHttpRequest 简介 12 1.2 用 XMLHttpRequest 发送请求 18 1.3 处理服务器响应 22 第 3 部分: Ajax 中的高级请求和响应 28 1.1 深入了解 HTTP 就绪状态 29 1.2 显微镜下的响应数据 33 1.3 深入了解 HTTP 状态代码 36 1.4 其他请求类型 40 第 4 部分: 利用 DOM 进行 Web 响应 44 1.1 Web 程序员和标记 44 1.2 进一步了解 Web 浏览器 46 1.3 对象的值 49 1.4 DOM 简介 52 第 5 部分: 操纵 DOM 55 1.1 跨浏览器、跨语言 55 1.2 节点的概念 56 1.3 节点的属性 56 1.4 节点方法 58 1.5 API 设计问题 63 1.6 通用节点类型 63 1.7 文档节点 64 1.8 元素节点 64 1.9 属性节点 66 1.10 文本节点 67 1.11 什么节点类型? 67 第 6 部分: 建立基于 DOM 的 Web 应用程序 69 1.1 从一个示例应用程序开始 70 1.2 修改图片,麻烦的办法 74 1.3 替换图片,简单的办法 78 1.4 替换图片,(真正)简单的办法 80 1.5 事件处理程序 83 第 7 部分: 在请求和响应中使用 XML 85 1.6 XML:到底用没用? 85 1.7 使用 XML(真正) 86 1.8 从客户机到服务器的 XML 87 1.9 发送 XML:好还是不好? 91 第 8 部分:在请求和响应中使用 XML 92 1.1 服务器(有时)不能响应太多的请求 92 1.2 从服务器接收 XML 94 1.3 解释 XML 的其他可选方法 99 第 9 部分: 使用 Google Ajax Search API 100 1.1 使用公共 API 101 1.2 使用 Google Ajax Search API 的准备工作 101 1.3 Google 的 API 文档 104 1.4 最简单的 Google 搜索 Web 应用程序 104 1.5 Ajax 在哪里? 109 1.6 深度探索 Google 的 Ajax Search API 111 第 10 部分: 使用 JSON 进行数据传输 111 1.1 选择的意义 112 1.2 JSON 基础 113 1.3 在 JavaScript使用 JSON 114 第 11 部分: 借鉴最优秀的 Ajax 应用程序 117 1.1 Google 地图 117 1.2 TaDaList 119 1.3 Campfire 122 1.4 YourMinis 123 1.5 其他 Web 2.0 站点 126 第 11 部分:将 Ajax 带入 Eclipse 的 Ajax Toolkit Framework 的两个工具 127 1.1 Eclipse ATF 127 1.2 Dojo 128 1.3 Zimbra Ajax Toolkit 130 1.4 initiative 在前进 132 第 12 部分:面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序 133 1.5 更好的购物车 133 1.6 Ajax 往返过程 134 1.7 分派 XMLHttpRequest 135 1.8 servlet 请求处理 137 1.9 用 JavaScript 进行响应处理 139 1.10 使用 Ajax 的挑战 141 第 13 部分:面向 Java 开发人员的 Ajax: Ajax 的 Java 对象序列化 143 1.11 从 Java 类产生 XML 144 1.12 自行进行序列化 144 1.13 XML 绑定框架 146 1.14 页面模板系统 148 1.15 不用 XML 的响应数据 149 1.16 JavaScript 对象标注 150 1.17 比较序列化技术 153 第 14部分:面向 Java 开发人员的 Ajax 结合 Direct Web Remoting 使用 Ajax 154 1.1 DWR 是什么? 155 1.2 关于示例 155 1.3 实现目录 156 1.4 测试部署 157 1.5 调用远程对象 158 1.6 实现购物车 160 1.7 调用远程的 Cart 方法 163 1.8 DWR 的利弊 165 第 15部分:面向 Java 开发人员的 Ajax: 探索 Google Web Toolkit 166 1.1 从简单的开始 167 1.2 构建 Weather Reporter 应用程序 168 1.3 用 GWT Shell 进行客户端调试 174 1.4 与服务器端组件进行通信 175 1.5 从客户机调用服务 178 1.6 服务器端验证的需要 179 1.7 用 JSNI 调用本机 JavaScript 181 1.8 为什么使用 GWT? 183
$.ajaxjQuery中的一个方法,用于发送异步HTTP请求。它可以用于上传文件,以下是使用$.ajax上传文件的步骤: 1. 创建一个HTML表单,包含一个文件输入框和一个提交按钮: ```html <form id="myForm" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传"> </form> ``` 2. 使用JavaScript代码监听表单的提交事件,并阻止默认的表单提交行为: ```javascript $('#myForm').submit(function(e) { e.preventDefault(); // 阻止表单默认提交行为 // 在这里编写上传文件的代码 }); ``` 3. 在表单提交事件中,使用$.ajax方法发送POST请求,将文件数据作为FormData对象发送: ```javascript $('#myForm').submit(function(e) { e.preventDefault(); // 阻止表单默认提交行为 var formData = new FormData(this); // 创建FormData对象,将表单数据包装起来 $.ajax({ url: 'upload.php', // 上传文件的服务器端地址 type: 'POST', data: formData, processData: false, // 不处理数据 contentType: false, // 不设置内容类型 success: function(response) { // 上传成功后的处理逻辑 }, error: function(xhr, status, error) { // 上传失败后的处理逻辑 } }); }); ``` 4. 在服务器端接收上传的文件并进行处理。具体的服务器端代码实现因语言和框架而异,这里以PHP为例: ```php <?php $targetDir = "uploads/"; // 上传文件保存的目录 if (!empty($_FILES['file'])) { $tempFile = $_FILES['file']['tmp_name']; $targetFile = $targetDir . $_FILES['file']['name']; move_uploaded_file($tempFile, $targetFile); // 将临时文件移动到目标位置 } ?> ``` 以上就是使用$.ajax上传文件的基本步骤。通过监听表单的提交事件,使用FormData对象将文件数据包装起来,然后通过$.ajax方法发送POST请求到服务器端进行文件上传。服务器端接收到文件后,可以根据具体需求进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CSDN专家-赖老师(软件之家)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值