JSP新闻论坛系统完整源码包.zip

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

简介:这套资源提供了完整的功能模块,包含新闻发布和论坛互动平台。开发者可以通过JSP、Servlet、JavaBean和MVC设计模式结合数据库技术,实现新闻的发布、分类、搜索和展示,以及用户的注册、登录、发帖、回帖和论坛管理等核心功能。资源不仅适合初学者学习Java Web开发,也是提升Web开发技能的好素材。 jsp新闻、论坛源码

1. JSP动态网页技术介绍

1.1 JSP技术概述

JSP(JavaServer Pages)是一种基于Java的动态网页技术,能够将服务器端逻辑嵌入到HTML页面中。开发者可以通过编写Java代码片段在HTML标签之间插入,从而实现动态内容的生成。JSP页面在服务器端执行,生成标准的HTML代码返回给客户端浏览器,为用户提供动态交互式网页。

1.2 JSP的基本工作原理

JSP页面在第一次被请求时,服务器会将其转换为一个Servlet,然后编译并执行这个Servlet。JSP规范中定义了多种内置对象,如request, response, session等,这些对象帮助开发者访问客户端信息和服务器信息,无需自己编写底层代码。

<%@ page import="java.util.*" %>
<html>
<head>
    <title>Hello World</title>
</head>
<body>
    <% 
        out.println("Hello, World!");
        // 使用request对象获取GET参数
        String name = request.getParameter("name");
        out.println("Hello, " + name + "!");
    %>
</body>
</html>

1.3 JSP与传统Servlet的比较

与传统的Servlet相比,JSP简化了代码的书写,使得开发人员可以更专注于页面逻辑的实现。JSP将业务逻辑从Servlet代码中分离出来,把与HTML标签混合在一起的Java代码分离出来,使得页面设计和内容生成更加清晰、易于管理和维护。但是,过度混入Java代码到JSP中也会降低页面的可读性和重用性,因此合理设计MVC结构,分离职责是提高项目质量的关键。

2. 新闻发布系统的功能实现

2.1 系统需求分析

2.1.1 功能模块划分

在设计一个新闻发布系统时,首先需要对系统进行需求分析,进而划分功能模块。新闻发布系统的核心功能模块通常包括以下几个部分:

  • 后台管理模块 :系统管理员可以进行新闻的发布、编辑、删除等操作,并且能够管理用户权限,查看访问统计信息等。
  • 前端展示模块 :为普通用户提供新闻浏览、搜索以及评论等功能。
  • 用户管理模块 :支持用户的注册、登录、信息修改以及密码找回等功能。
  • 评论管理模块 :管理员可以对用户评论进行管理,包括审核、删除等。

2.1.2 用户界面设计

用户界面设计需要遵循直观、易用、美观的原则。考虑到用户体验,设计时应注重以下几个方面:

  • 导航栏清晰 :将新闻分类、最新动态等重要信息以导航栏的形式呈现给用户,方便用户快速跳转。
  • 界面布局合理 :新闻列表、详情页面等需要布局合理,确保内容清晰易读。
  • 响应式设计 :为了适配多种显示设备,如手机、平板和PC等,界面应采用响应式设计。
  • 操作简便 :提供明显的按钮或链接,如“发布评论”、“分享新闻”等,方便用户进行操作。

2.2 新闻发布流程实现

2.2.1 后台管理功能

后台管理功能是新闻发布系统的核心部分,以下是该模块的主要功能实现步骤:

  1. 用户登录验证 :在后台管理首页设置用户登录验证环节,要求管理员输入正确的账号和密码才能进入后台。
  2. 新闻内容管理 :提供新闻添加、编辑、删除的界面。利用表单(Form)收集新闻标题、正文、作者、发布日期等信息。
  3. 评论审核 :在管理界面列出所有新闻的评论,并提供审核、删除等操作。
  4. 用户管理 :管理用户账户,包括创建新用户、编辑用户信息、重置密码、删除用户等。

2.2.2 前端展示效果

前端展示是用户直接接触的部分,以下是实现前端展示效果的主要步骤:

  1. 新闻列表展示 :将新闻标题、摘要、发布时间、图片等内容以列表形式展示给用户,支持按照时间、热度等条件进行排序。
  2. 新闻详情页面 :为每篇新闻提供独立的详情页面,显示新闻全文、作者信息、评论区等。
  3. 用户评论交互 :允许用户对新闻内容进行评论,评论列表应展示用户信息、评论内容和评论时间,并提供分页加载功能。
  4. 搜索与筛选 :提供搜索框和筛选按钮,允许用户根据关键词、日期等条件进行新闻搜索和筛选。

在本章节中,通过详细解析功能需求分析和流程实现,为新闻发布系统的开发奠定了坚实的基础。接下来的内容会深入探讨如何优化新闻发布系统的性能,以及如何提升用户体验。在下一章中,将详细介绍如何设计和实现一个高效互动的论坛平台。

3. 论坛互动平台的核心功能

在本章节中,我们将深入探讨论坛互动平台的核心功能,包括论坛功能需求与架构设计以及交互功能的开发。这两个方面是构建成功论坛系统的关键,它们不仅满足了用户的基本需求,还提升了用户体验和互动性。

3.1 论坛功能需求与架构设计

3.1.1 用户注册与登录系统

用户注册与登录系统是论坛平台的基本功能,允许用户创建账户并登录。设计一个安全而高效的注册登录系统是保障论坛安全与用户信息不外泄的重要环节。它通常包括以下几个核心部分:

  • 用户信息收集 :用户注册时需要填写如用户名、密码、邮箱等基本信息。
  • 数据验证 :对用户输入的信息进行格式验证,如邮箱格式、密码强度等。
  • 密码加密 :将用户密码通过哈希算法加密存储,提高安全性。
  • 会话管理 :用户登录后,通过Session和Cookie进行会话管理,确保用户在登录状态下进行操作。
  • 验证码机制 :防止机器自动注册或登录,采用验证码机制进行安全验证。

3.1.2 论坛版块管理

论坛版块管理是论坛结构化的核心。版块相当于论坛的分类,用户可以根据不同的兴趣点进入不同的版块进行交流。版块的管理包括:

  • 版块创建与设置 :管理员可以创建新的版块,并设置版块的名称、描述、权限等。
  • 帖子分类 :将帖子准确归类到相应的版块下,方便用户浏览。
  • 版块权限管理 :对不同版块设置不同的浏览与发帖权限,比如普通用户、版主、管理员等。
  • 版块活动管理 :组织和管理版块内的活动、投票、公告发布等。

3.2 交互功能的开发

3.2.1 帖子发布与回复机制

帖子发布与回复机制是论坛中最活跃的部分,用户的互动主要发生在这一环节。帖子的发布流程一般如下:

  • 用户输入帖子内容 :用户输入标题和正文,并选择相应的版块进行发布。
  • 内容过滤与预处理 :系统对帖子内容进行过滤,防止恶意代码注入等安全问题。
  • 数据存储 :将帖子信息存储到数据库中,便于检索与展示。
  • 用户回复 :其他用户对帖子进行回复,形成交流的链条。

在JSP中,我们可以通过表单提交来处理帖子的发布,以下是一个简单的示例:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>发帖页面</title>
</head>
<body>
    <form action="postSubmit.jsp" method="post">
        <label for="title">标题:</label><br>
        <input type="text" id="title" name="title" required><br>
        <label for="content">内容:</label><br>
        <textarea id="content" name="content" rows="10" cols="50" required></textarea><br>
        <input type="submit" value="发布帖子">
    </form>
</body>
</html>

3.2.2 用户权限与角色管理

用户权限与角色管理是维护论坛秩序、保障用户体验的重要机制。主要涉及的角色包括普通用户、版主、管理员等。具体权限管理措施包括:

  • 角色定义 :定义不同角色的权限范围,如版主可以管理版块内的帖子,管理员可以管理所有版块。
  • 权限分配 :根据用户在论坛中的行为,如活跃度、经验等,分配相应的权限。
  • 权限验证 :在用户进行特定操作时,进行权限验证,阻止未授权操作。
  • 权限修改与撤销 :管理员可以根据需要修改或撤销用户的权限。

表格是展示用户权限与角色管理关系的一个好方法:

| 角色 | 权限级别 | 可执行操作 | |----------|----------|----------------------------| | 普通用户 | 1 | 查看帖子、发表评论 | | 版主 | 5 | 查看帖子、发表评论、管理帖子 | | 管理员 | 10 | 所有操作 |

通过这些交互功能的开发,论坛可以有效地促进用户间的交流,并提供丰富多样的用户体验。这些功能的实现对于构建一个功能完备、用户友好的论坛互动平台至关重要。

4. JSP内置对象(Request、Response、Session)应用

在Web开发中,JSP内置对象是服务器自动创建并可供我们使用的对象。它们帮助开发者处理HTTP请求、响应和会话管理。在本章节中,我们将深入探讨这些对象的使用方法和技巧,以及它们在Web应用中的关键作用。

4.1 Request对象的使用方法

Request对象是Java Servlet技术中的一个关键组件,它代表客户端的请求信息。在JSP页面中,Request对象经常被用于获取客户端传递的参数,以及处理客户端的请求数据。

4.1.1 获取客户端请求信息

Request对象可以获取HTTP请求中的各种信息,包括请求参数、请求头等。以下是一个示例代码块,展示了如何获取客户端请求的URL和查询参数:

<%
    String url = request.getRequestURL().toString();
    String query = request.getQueryString();
    String method = request.getMethod();
    out.println("URL: " + url);
    out.println("Query String: " + query);
    out.println("HTTP Method: " + method);
%>

在上述代码中, getRequestURL() 方法返回请求的URL,不包括查询字符串; getQueryString() 方法返回请求的查询字符串部分;而 getMethod() 方法返回请求的HTTP方法,如GET、POST等。

4.1.2 处理请求参数

处理请求参数是Request对象的另一个重要用途。下面的代码展示了如何获取表单提交的多个同名参数值:

<%
    String[] hobbies = request.getParameterValues("hobbies");
    if(hobbies != null) {
        for(String hobby : hobbies) {
            out.println("Hobby: " + hobby + "<br>");
        }
    }
%>

在表单提交的场景中,如果存在多个同名的输入字段,例如一个关于兴趣爱好的列表, getParameterValues() 方法将返回一个字符串数组,包含了所有相关的值。对于其他类型的请求参数,如单个表单字段或URL参数,可以使用 getParameter() 方法。

4.2 Response对象的应用技巧

Response对象负责向客户端发送响应,例如设置HTTP响应头、发送错误消息等。掌握Response对象的应用技巧是构建动态Web应用的基础。

4.2.1 页面重定向与数据输出

页面重定向是Web开发中常用的技术,用于将客户端的请求转发到另一个URL。以下是如何使用Response对象进行页面重定向的示例:

<%
    String newLocation = "***";
    response.sendRedirect(newLocation);
%>

在这段代码中, sendRedirect() 方法用于将请求重定向到新的URL地址。注意,页面重定向会立即终止当前页面的执行,并且浏览器会被跳转到新的地址。

另外,Response对象还可以用来输出数据到客户端,这通常用于生成非HTML格式的响应,例如JSON或XML数据。示例如下:

<%
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    String json = "{\"message\":\"Hello, World!\"}";
    response.getWriter().write(json);
%>

上述代码设置了响应的MIME类型为 application/json 并指定了字符编码为 UTF-8 ,之后通过 getWriter() 方法获取输出流,以写入JSON格式的数据。

4.2.2 设置HTTP响应头和状态码

HTTP响应头和状态码是服务器响应客户端请求的重要组成部分。通过Response对象,开发者可以自定义这些信息。以下是如何设置HTTP响应头和状态码的示例:

<%
    response.setHeader("Cache-Control", "no-cache");
    response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
%>

在这个示例中, setHeader() 方法用于添加一个自定义的响应头,这里设置了一个禁止缓存的HTTP头。 setStatus() 方法用于设置HTTP响应状态码,这里设置了304状态码,表示资源未被修改。

4.3 Session对象在会话管理中的作用

Session对象用于跟踪用户会话。在Web应用中,用户的每次访问都需要被识别和跟踪,以保持状态。Session对象正是承担这一职责的核心。

4.3.1 会话跟踪机制

在HTTP协议中,每个请求都是独立的,服务器并不知道两个请求是否来自于同一个用户。Session机制通过为每个用户分配一个唯一的标识符来跟踪用户会话。以下是如何使用Session对象进行会话跟踪的示例:

<%
    // 开始一个会话或获取已有的会话对象
    HttpSession session = request.getSession(true);
    // 将用户信息存入会话中
    session.setAttribute("userInfo", "JohnDoe");
    // 从会话中获取用户信息
    String userInfo = (String) session.getAttribute("userInfo");
    out.println("User Info: " + userInfo);
%>

在这个代码示例中, getSession(true) 方法检查是否存在对应的会话,如果没有则创建一个新的。之后,使用 setAttribute() 方法将用户信息保存到会话中,并使用 getAttribute() 方法获取之前存储的用户信息。

4.3.2 Session对象的数据存取与管理

Session对象不仅可以用于跟踪用户的会话,它还可以用于存储用户会话期间需要的数据。以下是如何管理Session数据的示例:

<%
    // 存储用户登录时间
    session.setAttribute("loginTime", new Date());
    // 设置会话的最大存活时间,单位为秒
    session.setMaxInactiveInterval(30 * 60);
    // 销毁会话
    session.invalidate();
%>

在这个代码示例中,首先将用户的登录时间存储到会话中。然后,可以使用 setMaxInactiveInterval() 方法设置会话的最大非活动存活时间。最后,如果需要强制结束会话,可以调用 invalidate() 方法。

总结起来,JSP内置对象Request、Response和Session是构建动态Web应用不可或缺的组件。它们各自具有独特的作用,同时也相互关联,共同实现Web应用中的请求处理、响应发送和会话管理。通过本章节的介绍,读者应该能够熟练运用这些对象来提升Web应用的功能性和用户体验。

5. EL和JSTL在页面逻辑中的应用

5.1 EL表达式的功能与优势

5.1.1 数据的提取和显示

EL(Expression Language)是JSP中一种用于简化页面中Java代码的表达式语言。在JSP页面中,EL可以用来直接访问JavaBean的属性和Map集合中的值,使得数据提取和显示变得更加直接和简洁。

例如,当我们在JSP页面上需要显示用户对象的用户名时,传统方式需要使用Java代码片段:

<%= ((User)session.getAttribute("user")).getUsername() %>

但是使用EL表达式,可以简化为:

${user.username}

这样的表达式不仅易于阅读,而且避免了在JSP页面中编写复杂的Java代码,使得页面更易于维护。

5.1.2 表达式的基本语法和运算

EL表达式的基本语法非常简单,主要包括变量访问和运算符应用。EL表达式支持多种类型的运算符,如算术运算符、关系运算符、逻辑运算符等。

例如,我们要进行两个数值的加法运算,可以这样写:

${1 + 2}

如果要进行条件判断,可以使用逻辑运算符:

${empty user ? '未登录' : user.username}

上述表达式中, empty 是EL中的一个操作符,用于判断某个对象是否为空。若 user 对象为空,则显示“未登录”,否则显示用户的名字。

5.2 JSTL标签库的应用

5.2.1 核心标签库的使用

JSTL(JavaServer Pages Standard Tag Library)是一个自定义标签库,它为JSP页面提供了一组标签,用于实现常见的功能,比如迭代、条件判断、URL处理等。使用JSTL标签可以替代许多传统的JSP脚本元素,提高代码的可读性和可维护性。

一个常见的JSTL使用场景是遍历一个对象集合。例如,展示新闻列表:

<c:forEach var="newsItem" items="${newsList}">
  <h3>${newsItem.title}</h3>
  <p>${newsItem.content}</p>
</c:forEach>

这里的 <c:forEach> 标签用于遍历 newsList 集合,每次迭代 newsItem 都会被设置为集合中的下一个对象。

5.2.2 格式化标签与国际化

JSTL的格式化标签库支持数字、日期和货币的格式化,这对于多语言和国际化应用尤为重要。例如,根据不同用户的语言习惯显示日期:

<c:forEach var="order" items="${user.orders}">
  <p>Order Date: <fmt:formatDate value="${order.orderDate}" pattern="yyyy-MM-dd"/></p>
</c:forEach>

在上面的例子中, <fmt:formatDate> 标签用于格式化日期数据,其中 pattern 属性定义了日期显示的格式。

通过JSTL的国际化(I18N)标签,开发者可以更方便地处理不同语言环境下的文本信息。例如,显示欢迎信息:

<fmt:message key="greeting"/>

这行代码会查找属性文件中定义的 greeting 键对应的值,并显示出来。如果属性文件根据用户的语言环境进行了相应的本地化处理,则显示的信息将会与用户的语言环境相匹配。

结合以上内容,我们可以看到EL和JSTL在页面逻辑中的应用为JSP开发带来了极大的便利,不仅提高了代码的清晰度和可维护性,还增强了Web应用的国际化支持。在后续的章节中,我们将探讨如何将这些技术与其他Web开发技术相结合,以构建更加健壮和用户友好的Web应用。

6. 数据库技术(MySQL或Oracle)结合使用

6.1 数据库设计与JSP的交互

在现代的Web应用程序中,数据库是存储和检索数据的核心组件。JSP技术常常与数据库结合使用,为网站提供数据支持。数据库设计的好坏直接影响到Web应用的性能和可维护性。本章节首先介绍数据库连接池的配置与应用,随后是SQL语句的执行与优化。

6.1.1 数据库连接池的配置与应用

数据库连接池是管理数据库连接的一种机制,目的是为了减少在高流量环境下频繁建立和销毁数据库连接的开销。在JSP中,我们可以使用连接池来提高数据库操作的性能和效率。以下是连接池的一个典型配置示例:

<Context ...>
    ...
    <Resource name="jdbc/MyLocalDB" auth="Container" type="javax.sql.DataSource"
              maxActive="20" maxIdle="10" maxWait="10000"
              username="dbuser" password="dbpassword" driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/mylocaldb"/>
    ...
</Context>

在上面的配置中,我们定义了一个名为 jdbc/MyLocalDB 的资源,指定了数据库连接的最大活跃数、最大空闲数以及最大等待时间。 username password 指定了访问数据库的凭证,而 driverClassName url 则定义了数据库的驱动程序类名和连接URL。

6.1.2 SQL语句的执行与优化

执行高效且优化的SQL语句对于数据库的性能至关重要。首先,优化的SQL语句可以提高查询速度,减少资源消耗。其次,它还可以帮助减少数据库故障的风险。

一个优化良好的SQL查询应该遵循以下原则:

  • 尽量避免全表扫描,使用索引可以加速查询。
  • 减少不必要的数据检索量,使用SELECT子句中的列名而不是SELECT *。
  • 避免在WHERE子句中使用函数,这会导致索引失效。
  • 对于频繁查询的列,考虑将其作为索引。
  • 使用JOIN代替子查询,以提高效率。
  • 使用EXPLAIN来分析SQL语句的执行计划,找出潜在的性能瓶颈。

下面是一个简单的JSP代码段,演示如何使用JDBC执行SQL查询:

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
    conn = DriverManager.getConnection(dbURL, dbUser, dbPassword);
    stmt = conn.createStatement();
    String sql = "SELECT id, name FROM users WHERE active = 1";
    rs = stmt.executeQuery(sql);
    while (rs.next()) {
        int id = rs.getInt("id");
        String name = rs.getString("name");
        // 处理查询结果...
    }
} catch (SQLException se) {
    // 处理数据库异常...
} finally {
    // 关闭资源...
}

为了确保代码的健壮性,我们在最后的 finally 块中关闭所有打开的资源,包括 Connection , Statement , 和 ResultSet 。这是一个好习惯,可以避免资源泄露和潜在的性能问题。

在本章节中,我们了解了数据库连接池的配置方法和如何执行与优化SQL语句。了解这些知识能够帮助我们构建更高效的Web应用程序。下一节,我们将探讨在JSP项目中如何实现CRUD操作和数据库异常处理策略。

7. MVC设计模式在用户交互中的应用

7.1 MVC模式简介与原理

7.1.1 MVC模式的组件与职责

MVC(Model-View-Controller)设计模式是一种广泛应用于软件开发领域,特别是在Web应用程序设计中的架构模式。它将应用程序分为三个核心组件:

  • Model(模型) :负责数据和业务逻辑。模型持有应用的数据,同时定义了与这些数据交互的逻辑操作。
  • View(视图) :负责展示。视图是用户看到并与之交互的界面。通常视图会从模型中获取需要展示的数据。
  • Controller(控制器) :负责接收输入并调用模型和视图去完成用户请求。控制器处理事件,响应用户输入,并获取数据,之后选择视图进行显示。

这种分离关注点的设计方法,使得开发者能够更有效地管理和维护代码,提高应用程序的可扩展性和可测试性。

7.1.2 MVC在Web应用中的优势

MVC模式为Web应用程序设计带来了以下优势:

  • 低耦合 :各个组件之间的依赖性降低,使得系统更易于修改和扩展。
  • 可维护性 :由于职责明确,开发者可以更容易地理解代码,并进行维护。
  • 可重用性 :不同视图可以共享同一个模型,同样,模型和视图也可以与不同的控制器一起使用。
  • 灵活的开发 :可以支持多人协作开发,不同的开发人员可以同时进行不同组件的开发工作。

7.2 案例分析:MVC在新闻发布和论坛系统中的应用

7.2.1 模型(Model)的构建与数据管理

模型代表应用程序的数据结构,通常与数据库直接交互。在新闻发布和论坛系统中,模型负责存储文章、用户、评论等数据。

// 示例代码:Model层的Article类
public class Article {
    private int id;
    private String title;
    private String content;
    private Date publishDate;
    // 省略其他属性、构造函数、getter和setter方法

    // 业务逻辑方法,如保存、更新文章等
    public void save() {
        // 与数据库交互保存文章数据的逻辑
    }
    // 其他数据管理相关的逻辑...
}

7.2.2 视图(View)的设计与交互实现

视图是用户界面,负责展示数据(模型)给用户,并收集用户的输入(请求)。通常视图会由HTML、CSS、JavaScript和JSP页面技术构建。

<!-- 示例代码:JSP视图层展示文章内容 -->
<div id="article">
    <h2><%= article.getTitle() %></h2>
    <p><%= article.getContent() %></p>
    <p>Published on: <%= article.getPublishDate() %></p>
</div>

7.2.3 控制器(Controller)的业务逻辑处理

控制器接收用户输入并调用相应的模型和视图组件来完成请求。在JSP/Servlet架构中,控制器通常由Servlet实现。

// 示例代码:Controller层处理文章请求的Servlet
@WebServlet("/article")
public class ArticleServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取请求参数,如文章ID
        String id = request.getParameter("id");
        Article article = articleService.getArticleById(Integer.parseInt(id));
        request.setAttribute("article", article);
        RequestDispatcher dispatcher = request.getRequestDispatcher("article.jsp");
        dispatcher.forward(request, response);
    }
    // doPost方法等其他控制器逻辑...
}

以上代码展示了从请求接收、处理到返回结果的整个MVC工作流程,其中控制器处理用户请求,模型负责数据的业务逻辑,而视图负责向用户展示最终结果。

在实现新闻发布系统和论坛互动平台时,理解并应用MVC设计模式对于构建一个可扩展、易维护的系统至关重要。通过分离逻辑与界面,开发者能够集中精力在各自负责的部分,大大提高了团队开发的效率和项目的可维护性。

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

简介:这套资源提供了完整的功能模块,包含新闻发布和论坛互动平台。开发者可以通过JSP、Servlet、JavaBean和MVC设计模式结合数据库技术,实现新闻的发布、分类、搜索和展示,以及用户的注册、登录、发帖、回帖和论坛管理等核心功能。资源不仅适合初学者学习Java Web开发,也是提升Web开发技能的好素材。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值