Bridesmade:网络和移动项目中的JavaScript技术应用

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

简介:《新娘制作:网络与移动项目的JavaScript实践》是一本探讨JavaScript如何在现代网络和移动平台上实现多样化功能的书籍。本书通过“Bridesmade”这一项目案例,深入分析了JavaScript在网页动态效果、DOM操作、异步通信、库使用、响应式设计、移动端适配以及模块化和ES6语法等方面的应用。阅读本书,读者将学会如何利用JavaScript提升前端交互质量,优化用户体验,以及如何开发出适应不同设备和平台的应用程序。 Bridesmade:网络和移动项目

1. JavaScript基础及应用

JavaScript简介

JavaScript是一种高级的、解释型的编程语言,自1995年由Netscape公司开发以来,已经成为网页交互的行业标准。它能够使网页变得动态和具有交互性,是前端开发不可或缺的技术之一。

基本语法和数据类型

JavaScript的基本语法和结构包括变量声明、数据类型、运算符、控制流语句等。其中,数据类型包括原始类型(如数字、字符串和布尔值)和对象类型(如数组、函数和对象本身)。

// 示例:声明变量和基本数据类型
let name = "IT Blog"; // 字符串类型
let age = 30;         // 数字类型
let isAuthor = true;  // 布尔类型

函数和作用域

函数是JavaScript的核心概念之一,它允许你将代码组织成独立、可复用的块。函数可以作为参数传递,也可以作为值返回。作用域决定了变量和函数的可见性和生命周期。

// 示例:函数声明和作用域
function greet() {
  console.log("Hello, " + name);
}

let name = "World";
greet(); // 输出: Hello, World

function greetInScope() {
  let name = "IT World";
  console.log("Hello, " + name);
}

greetInScope(); // 输出: Hello, IT World

在学习基础的同时,了解如何将JavaScript应用到实际问题解决中是非常关键的。例如,操作DOM元素、使用事件监听器、进行简单的表单验证等。通过实际操作,开发者能更深入理解语言的特性和实践技巧。

2. DOM操作技术

2.1 JavaScript与DOM的交互基础

2.1.1 DOM的结构和节点

文档对象模型(DOM)是 JavaScript 操作网页文档的核心接口。DOM 将 HTML 或 XML 文档视为树形结构,每一个元素、属性、文本都是树上的节点(Node),这些节点按照层级关系组织在一起。

例如,当 HTML 文档被加载到浏览器中时,它会生成一个由节点组成的树结构,如下:

graph TD
    html[<html>] --> head[<head>]
    html --> body[<body>]
    head --> title[<title>]
    body --> div[<div>] --> p[<p>]
    body --> script[<script>]

每个节点都代表了文档中的一个部分,比如 html 节点是根节点,包含了整个文档的内容; head body 节点是其子节点,分别包含了文档的头部和主体部分。

2.1.2 JavaScript操作DOM的方法

JavaScript 提供了大量操作 DOM 的方法,比如 getElementById , querySelector , querySelectorAll 等,这些方法能够帮助我们获取、创建、修改或删除 DOM 节点。

下面是一个简单的示例,使用 document.getElementById 方法来获取页面中的元素:

var element = document.getElementById('myElement');

接着,我们可以使用 innerHTML 属性来读取或修改元素中的 HTML 内容:

console.log(element.innerHTML); // 读取内容
element.innerHTML = '新的内容'; // 修改内容

2.2 DOM动态内容管理

2.2.1 创建和插入新元素

在DOM操作中,我们经常需要动态地添加内容。可以使用 document.createElement 方法创建新的元素节点:

var newElement = document.createElement('div'); // 创建一个div元素
newElement.textContent = '我是新创建的元素'; // 给元素添加文本
document.body.appendChild(newElement); // 将新创建的元素添加到body末尾

2.2.2 删除和替换元素

有时候我们需要从DOM中删除元素或者替换它们。使用 removeChild replaceChild 方法可以实现这些操作:

var elementToRemove = document.getElementById('elementToRemove');
document.body.removeChild(elementToRemove); // 删除指定元素

var newElement = document.createElement('span');
newElement.textContent = '替换文本';
var oldElement = document.getElementById('oldElement');
oldElement.parentNode.replaceChild(newElement, oldElement); // 替换指定元素

2.3 DOM事件处理技术

2.3.1 事件流和事件类型

事件是用户操作或者浏览器行为触发的行为,比如点击、滚动、加载等。事件流描述了事件从被触发到被处理的顺序。

W3C定义了三种事件模型,包括捕获事件模型、冒泡事件模型和同时使用捕获和冒泡的模型。JavaScript中事件监听器使用 addEventListener 方法,它允许我们在事件的任何阶段添加监听器。

element.addEventListener('click', function(e) {
    console.log('元素被点击');
}, false); // false 表示事件冒泡

2.3.2 事件委托和事件绑定高级技巧

事件委托是一种事件处理技术,它利用了事件冒泡的原理。通过将事件监听器绑定到父元素上,可以管理其内部子元素的事件,这样做可以减少事件监听器的数量,提高性能。

document.body.addEventListener('click', function(e) {
    if (e.target.matches('.child')) {
        console.log('子元素被点击');
    }
});

在这个例子中,无论点击多少个子元素 .child ,我们只需要一个监听器,事件会冒泡到父元素并被处理。

以上介绍的内容和代码示例只是DOM操作技术中的一部分,接下来将深入探讨如何处理更复杂的动态内容管理和事件处理策略。

3. Ajax与异步通信实践

3.1 Ajax技术基础

3.1.1 Ajax的概念和作用

Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术。使用Ajax,Web应用可以异步地(Asynchronous)与服务器交换数据并更新部分网页内容,这样就可以实现异步通信,提高用户体验。

Ajax的核心技术包括JavaScript、XMLHttpRequest对象、DOM操作等。JavaScript负责与用户交互,XMLHttpRequest对象用于和服务器进行数据交换,而DOM操作则用于更新页面上的内容。

3.1.2 原生JavaScript实现Ajax

下面通过一个简单的例子,使用原生JavaScript实现一个基础的Ajax请求:

function ajaxRequest() {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
            console.log(xhr.responseText);
        }
    };
    xhr.open("GET", "***", true);
    xhr.send();
}

在这段代码中: - XMLHttpRequest 是Ajax的核心,它允许浏览器向服务器发起HTTP请求。 - onreadystatechange 事件处理器会在HTTP请求完成前被触发。 - xhr.readyState 表示请求的状态,其中4表示请求完成。 - xhr.status 包含响应的状态码,200代表成功。 - xhr.open 方法初始化一个请求,第一个参数是请求类型"GET",第二个参数是请求的URL。 - xhr.send 方法发送请求到服务器。

这个例子展示了使用原生JavaScript发起一个简单的GET请求,接下来将展示如何处理POST请求以及如何处理JSON格式的数据。

3.2 异步通信的高级应用

3.2.1 跨域请求解决方案

浏览器出于安全考虑,限制了不同域之间的AJAX请求,这被称为同源策略。当需要发起跨域请求时,需要一些特定的技术来绕过这一限制。

JSONP(JSON with Padding) 是一种老旧但广泛支持的方法,它通过动态创建 <script> 标签的方式来绕过同源策略,允许跨域请求:

function jsonpCallback(data) {
    console.log(data);
}

var script = document.createElement('script');
script.src = '***';
document.head.appendChild(script);

在这个例子中,我们创建了一个 <script> 元素,并设置其 src 属性为目标API URL,附加一个回调函数名作为参数。服务器端需要返回JavaScript代码,例如: jsonpCallback({"key": "value"}) ,当这个脚本被加载时, jsonpCallback 函数会被执行,并且数据作为参数传入。

CORS(Cross-Origin Resource Sharing) 是官方推荐的跨域解决方案,服务器端需要设置 Access-Control-Allow-Origin 响应头来指定哪些域可以访问资源。现代浏览器都支持CORS。

3.2.2 使用Promise和async/await优化异步代码

随着JavaScript的发展,Promise和async/await成为了处理异步操作更优雅的方式。

Promise 是一个代表了异步操作最终完成或失败的对象。它允许你将回调函数绑定到异步操作的最终成功值或失败原因上:

function getDataWithPromise() {
    return new Promise((resolve, reject) => {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "***", true);
        xhr.onload = function() {
            if (xhr.status === 200) {
                resolve(xhr.responseText);
            } else {
                reject(Error("Error " + xhr.statusText));
            }
        };
        xhr.onerror = function() {
            reject(Error("Network error"));
        };
        xhr.send();
    });
}

getDataWithPromise().then((response) => {
    console.log(response);
}).catch((error) => {
    console.error(error);
});

async/await 是建立在Promise之上的语法糖,使得异步代码可以像同步代码一样编写:

async function fetchData() {
    try {
        const response = await getDataWithPromise();
        console.log(response);
    } catch (error) {
        console.error(error);
    }
}

fetchData();

async函数总是返回一个Promise。在这个例子中, fetchData 函数中使用 await 关键字等待Promise解决,如果Promise被拒绝,则 catch 块会捕获到错误。

3.3 Ajax在现代Web开发中的角色

3.3.1 Ajax与SPA(单页应用)

单页应用(Single Page Application,SPA)是一种网页应用,它能够在不重新加载整个页面的情况下,通过Ajax动态更新网页内容。通过使用Ajax,SPA可以实现快速的用户界面响应,并且用户体验更加流畅。

在SPA中,通常会有一个路由器(Router)来监听URL的变化,并根据不同的路由请求相应的视图内容。这通常是通过JavaScript动态加载或渲染HTML片段实现的。

3.3.2 Ajax与前后端分离架构

在前后端分离的架构中,前端和后端通过Ajax进行通信。前端负责展示和用户交互,后端则处理业务逻辑和数据存储。这种分离使得前后端可以独立部署和开发,提高了开发效率和系统的可维护性。

在此架构中,前后端通过JSON格式的RESTful API进行数据交互。前端通过Ajax请求获取或发送JSON数据,后端则返回JSON格式的响应。这样一来,前端和后端都可以使用各自最佳的技术栈进行开发。

4. jQuery库在项目中的应用

在前端开发的历史长河中,jQuery曾经是无可争议的王者,其凭借着跨浏览器的兼容性,简洁的语法和强大的功能,赢得了广大开发者的青睐。如今,虽然现代JavaScript框架和库层出不穷,jQuery依然在一些项目中扮演着重要角色。本章节将深入探讨jQuery的核心概念,选择器,插件以及在实际项目中的应用。

4.1 jQuery核心概念和选择器

4.1.1 选择器的种类和用途

jQuery的核心之一就是其强大的选择器功能,使得开发者可以非常轻松地选取DOM元素并进行操作。jQuery选择器主要分为以下几类:

  • 基本选择器:如元素选择器、类选择器、ID选择器等。
  • 属性选择器:根据元素的属性来选择元素。
  • 过滤选择器:可以进一步筛选出特定集合内的元素。
  • 表单选择器:专门用于选取表单元素。
  • 内容选择器:根据内容选取元素。
  • 可见性选择器:根据元素是否可见来选取。

这些选择器可以单独使用,也可以组合使用,为前端开发者提供灵活的元素选取方案。例如,要选取页面中所有的 <div> 元素,可以使用 $("div") ;选取所有拥有 class="active" <li> 元素,可以使用 $("li.active")

// 示例:选取页面中所有的div元素,并添加类"highlight"
$("div").addClass("highlight");

4.1.2 jQuery链式调用和过滤器

链式调用是jQuery的又一亮点,它允许你将多个方法链接在一起,形成一条链,极大提高了代码的可读性和效率。例如:

// 示例:选取所有class为"item"的元素,添加类"selected",然后显示它们
$(".item").addClass("selected").show();

过滤器是在已有jQuery对象的基础上进行筛选,返回新的jQuery对象。常见的过滤器方法有 .filter() , .not() 等。通过过滤器,我们可以轻松地进行更复杂的DOM操作。

// 示例:选取所有<li>元素,过滤出文本内容包含“error”的元素,并改变其颜色
$("li").filter(function() {
  return $(this).text().indexOf("error") !== -1;
}).css("color", "red");

4.1.3 选择器的性能考量

虽然jQuery选择器极为方便,但在大量DOM元素上使用复杂的选择器可能会导致性能问题。为了优化性能,我们需要注意以下几点:

  • 尽量使用ID选择器,因为它们执行效率高。
  • 避免使用标签选择器和全局选择器( * ),因为它们会遍历整个DOM树。
  • 使用上下文限制搜索范围,比如在已知容器内进行选择。
  • 利用缓存,存储重复使用的jQuery对象。

4.2 jQuery插件和工具函数

4.2.1 常用jQuery插件介绍

jQuery插件是对jQuery库功能的扩展,提供了许多实用功能和效果。下面介绍几个常用的插件:

  • jQuery UI:提供了许多界面控件,如日期选择器、滑动条等。
  • jQuery Mobile:为移动设备提供了一个主题框架。
  • jQuery Validation Plugin:用于表单验证,可以自定义验证规则。

在项目中引入和使用插件时,需要注意版本兼容性,以及插件可能带来的额外加载时间。

4.2.2 jQuery的工具函数和数组操作

jQuery提供了一组实用工具函数,例如 $.each() , $.grep() , $.map() 等,这些工具函数对于处理数组和对象提供了极大的便利。

// 示例:遍历数组并打印每个元素
var arr = [1, 2, 3, 4, 5];
$.each(arr, function(index, value) {
  console.log("Index: " + index + ", Value: " + value);
});

4.3 jQuery在实际项目中的实践

4.3.1 jQuery与表单验证

表单验证是Web应用中不可或缺的一环,使用jQuery可以轻松实现复杂的客户端验证逻辑。下面是一个表单验证的简单示例:

$("#myForm").submit(function(event) {
  var isValid = true;
  // 验证用户名字段是否为空
  if($("#username").val() === "") {
    $("#usernameError").text("用户名不能为空").show();
    isValid = false;
  } else {
    $("#usernameError").text("").hide();
  }

  // 阻止表单提交,如果存在任何验证错误
  if(!isValid) {
    event.preventDefault();
  }
});

4.3.2 jQuery与动画效果实现

jQuery的动画效果功能强大,开发者可以轻松实现滑动、淡入淡出、自定义动画等效果。以下是一个简单的淡入淡出效果的示例:

// 初始隐藏元素
$("#myElement").hide();

// 点击按钮后,元素淡入显示
$("#showButton").click(function() {
  $("#myElement").fadeIn(1000); // 1000毫秒内完成淡入效果
});

// 点击按钮后,元素淡出隐藏
$("#hideButton").click(function() {
  $("#myElement").fadeOut(1000); // 1000毫秒内完成淡出效果
});

表格:对比jQuery与现代JavaScript框架

| 特性/框架 | jQuery | 现代JavaScript框架 | | --------------- | --------------- | --------------------- | | DOM操作 | 简单、直观 | 复杂但更强大 | | 事件处理 | 成熟且全面 | 高效但学习曲线陡峭 | | 动画效果 | 丰富、易用 | 高效、灵活 | | 社区支持 | 拥有大量现成插件 | 社区活跃但更新迅速 | | 现代浏览器兼容性 | 需要polyfills | 内建支持现代浏览器特性 | | 移动端支持 | 需要额外插件 | 内建响应式设计支持 |

结语

尽管时代变迁,技术发展,jQuery依然在前端开发领域占有一席之地。它在Web开发早期为简化DOM操作、事件处理和动画效果做出了卓越贡献。无论你是刚刚接触前端开发,还是在维护遗留项目,对jQuery的了解都是宝贵的资产。在现代前端开发实践中,合理地使用jQuery插件和工具函数,将能为项目带来立竿见影的效率提升和效果增强。

5. 响应式设计的关键技术

5.1 响应式设计概念与原理

响应式设计(Responsive Design)是一种网页设计的方法论,旨在使网站能够自适应不同分辨率的显示设备,提供最佳的用户体验。随着智能设备的普及,用户使用各式各样的设备访问互联网,响应式设计因此变得尤为重要。

5.1.1 响应式设计的目标和挑战

响应式设计的目标是创建一个网站,它能够在不同大小的屏幕上显示相同的内容,但以不同的布局。为了实现这一目标,设计师和开发者必须考虑各种屏幕尺寸和分辨率,确保网站的内容和功能在所有设备上都能正常工作。

响应式设计面临的挑战包括但不限于:

  • 设备种类繁多:不同设备的屏幕尺寸和分辨率差异巨大,需要对各种设备进行适配。
  • 网络连接速度:移动设备用户可能处于不同的网络环境下,响应式设计应考虑带宽限制,优化图片和脚本的加载。
  • 用户交互体验:不同设备的输入方式不同,触摸屏设备用户需要更大和更易于点击的按钮。
  • 内容优先级:在屏幕空间有限的设备上,需要决定哪些内容优先显示。

5.1.2 媒体查询的应用和案例

媒体查询(Media Queries)是CSS3中的一个重要特性,它允许开发者根据不同的媒体特征(如屏幕宽度、高度、分辨率等)来应用不同的样式规则。

媒体查询的基本语法如下:

@media only screen and (max-width: 768px) {
    body {
        background-color: lightblue;
    }
}

以上代码会在屏幕宽度小于或等于768像素时,将 body 的背景色设置为浅蓝色。这是一种常见的用法,用来改变网站在小屏幕设备上的样式。

案例分析

考虑一个简单的网页布局,其头部包含网站标志和导航菜单,内容区域展示文章列表,底部是页脚。以下是一个媒体查询应用的示例:

/* 基础样式 */
body {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

header, footer {
    flex: 0 0 auto;
}

main {
    flex: 1 0 auto;
}

/* 媒体查询 */
@media (max-width: 768px) {
    header {
        padding: 10px;
    }

    nav {
        display: none;
    }

    main {
        padding: 10px;
    }
}

在这个案例中,当屏幕宽度小于768像素时,头部和导航栏的样式发生改变。导航栏默认不显示,以优化屏幕空间利用。这是响应式设计中常见的实践,通过媒体查询让页面根据屏幕大小调整布局,提高移动端的使用体验。

接下来,让我们深入了解响应式布局的实现技术。

6. 移动端适配框架的使用

移动互联网的蓬勃发展使得移动端适配成为了Web开发中的一项重要工作。随着智能手机和平板的种类和分辨率的日益多样化,如何设计出既美观又易用的响应式界面成为了开发者必须面对的挑战。

6.1 移动端开发的需求与挑战

6.1.1 触屏交互设计原则

移动设备的触控操作特点决定了移动端界面的设计和交互需要遵循一系列原则。首先,按钮和链接的大小应该足够大,以便用户能够轻松点击。一般建议最小点击目标为48x48像素。其次,页面元素的布局应该考虑到手指滑动的自然习惯,将常用操作置于用户能够轻松触及的位置。

6.1.2 移动端开发的性能考虑

移动设备相比桌面设备在硬件性能上通常有限。因此,在设计移动端界面时,开发者需要尽量减少页面的复杂性,降低DOM操作的频率,优化图片和脚本资源的加载,以及利用缓存机制来提高页面加载速度和响应速度。

6.2 框架介绍与选型

6.2.1 常用移动端框架概览

在众多移动端适配框架中,比较出名的包括Bootstrap、Foundation、Ionic和Materialize等。Bootstrap是由Twitter开发的前端框架,它提供了一整套响应式、移动优先的前端开发组件,目前是使用最广泛的框架之一。Foundation是ZURB开发的一个响应式前端框架,它在灵活性和定制性上表现优异。Ionic是一个专注于移动应用开发的开源框架,主要面向原生移动应用和渐进式Web应用。Materialize是Google推出的一个轻量级的响应式前端框架,它遵循Material Design的设计规范。

6.2.2 框架的对比和选择依据

选择哪种框架应基于项目的特定需求和团队的技术栈。例如,如果项目需要快速搭建原型,Bootstrap可能是最佳选择;如果设计上需要高度的自定义和灵活性,则可能选择Foundation;如果项目是开发一个混合移动应用,Ionic提供了很多有价值的工具和组件;对于追求高性能的项目,Materialize提供了轻量级的组件和接近原生的体验。

6.3 框架在项目中的应用

6.3.1 框架的初始化与配置

以Bootstrap为例,首先需要在HTML文档的

标签中引入Bootstrap的CSS文件和JavaScript文件。然后,可以初始化一些Bootstrap组件来适配移动端设备,比如导航栏、模态框、轮播图等。配置通常包括响应式导航栏的折叠和展开、屏幕适配的图标字体、以及触摸滑动事件的处理。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Bootstrap Example</title>
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="***">
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="***"></script>
    <script src="***"></script>
    <script src="***"></script>
</head>
<body>
    <!-- Your content here -->
</body>
</html>

6.3.2 框架与项目结合的最佳实践

结合项目实践,Bootstrap可以很好地与Vue、Angular、React等流行的前端框架结合,进一步增强项目的开发效率和可维护性。在初始化项目时,可以通过这些框架提供的CLI工具快速引入Bootstrap。例如,使用Vue CLI创建一个新项目,并通过命令 vue add bootstrap-vue 即可快速集成Bootstrap。

最佳实践还包括遵循框架提供的栅格系统、响应式工具类以及组件的使用规范,保持代码的一致性和可读性。此外,为确保页面在不同设备上具有相同的用户体验,建议进行多设备测试,并根据实际测试结果调整布局和样式。

在本章中,我们探讨了移动端适配框架的使用,从开发需求与挑战讲起,到框架的介绍与选型,最后深入到框架在项目中的具体应用。这些内容将帮助开发者在实际开发中更加得心应手地应对移动端适配的复杂性,提升开发效率和产品质量。

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

简介:《新娘制作:网络与移动项目的JavaScript实践》是一本探讨JavaScript如何在现代网络和移动平台上实现多样化功能的书籍。本书通过“Bridesmade”这一项目案例,深入分析了JavaScript在网页动态效果、DOM操作、异步通信、库使用、响应式设计、移动端适配以及模块化和ES6语法等方面的应用。阅读本书,读者将学会如何利用JavaScript提升前端交互质量,优化用户体验,以及如何开发出适应不同设备和平台的应用程序。

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

内容概要:本文档主要介绍了Intel Edge Peak (EP) 解决方案,涵盖从零到边缘高峰的软件配置服务管理。EP解决方案旨在简化客户的入门门槛,提供一系列工具服务,包括Edge Software Provisioner (ESP),用于构建缓存操作系统镜像软件栈;Device Management System (DMS),用于远程集群或本地集群管理;以及Autonomous Clustering for the Edge (ACE),用于自动化边缘集群的创建管理。文档详细描述了从软件发布、设备制造、运输、安装到最终设备激活的全过程,并强调了在不同应用场景(如公共设施、工业厂房、海上油井移动医院)下的具体部署步骤技术细节。此外,文档还探讨了安全设备注册(FDO)、集群管理、密钥轮换备份等关键操作。 适合人群:具备一定IT基础设施边缘计算基础知识的技术人员,特别是负责边缘设备部署管理的系统集成商运维人员。 使用场景及目标:①帮助系统集成商客户简化边缘设备的初始配置后续管理;②确保设备在不同网络环境下的安全启动注册;③支持大规模边缘设备的自动化集群管理应用程序编排;④提供详细的密钥管理集群维护指南,确保系统的长期稳定运行。 其他说明:本文档是详细描述了Edge Peak技术及其应用案例。文档不仅提供了技术实现的指导,还涵盖了策略配置、安全性扩展性的考虑,帮助用户全面理解实施Intel的边缘计算解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值