JSP计算机等级考试查询系统:源代码、论文与答辩指导

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

简介:本项目是一个基于Java Web技术的学生考试成绩查询平台,使用JSP进行前端展示,结合Servlet处理业务逻辑,以及MySQL等数据库进行数据管理。它不仅包括源代码,还有项目论文和答辩PPT,为学习者提供了设计到实现的完整过程。系统设计涵盖了JSP与Servlet的技术应用、数据库的连接与操作、用户界面设计、系统架构与设计模式,以及项目文档的撰写与答辩准备。 JSP

1. JSP技术应用与核心概念

1.1 JSP基本语法

JSP(Java Server Pages)是用于开发动态web内容的Java技术。其基本语法包括脚本元素、指令和动作。脚本元素主要有声明、脚本段和表达式,用于插入Java代码。指令则用于配置JSP页面的处理方式,如page、include和taglib指令。动作则是一组具有特定功能的XML标签,例如<%@page ... %>就是典型的页面指令。

1.2 JSP内置对象

JSP页面中提供了一系列预定义的对象,如request、response、out、session等,它们是JSP容器为开发者提供的访问Web容器功能的接口。这些对象在JSP页面中无需声明即可直接使用。例如,request对象用于接收客户端请求,response对象用于对客户端请求做出响应,out对象用于输出数据到客户端。

1.3 JSP工作原理

JSP的工作原理主要依赖于JSP容器(如Tomcat)的处理。当用户请求一个JSP页面时,容器首先检查JSP文件是否有对应的Servlet类。如果没有,则容器将JSP文件转换成一个Servlet类,然后编译并执行该类。这个过程包括了JSP的转换、编译和执行三个主要步骤。通过这种方式,JSP可以将Java代码与HTML标记混合在一起,实现动态网页内容的生成。

本章我们从JSP的基本概念和工作流程入手,为接下来深入探讨JSP在实际应用中的运用打下了基础。在理解了这些核心概念之后,我们可以在第2章中探讨如何将Servlet技术与JSP相结合,构建更为复杂的Web应用。

2. Servlet技术解析及其在MVC架构中的作用

2.1 Servlet的基本概念和生命周期

Servlet作为一种服务器端的小程序,它运行于支持Java的应用服务器中。Servlet通过HTTP协议接收请求并作出响应,是开发Java Web应用的核心组件之一。其生命周期主要包含初始化、请求处理和销毁三个阶段。

2.1.1 Servlet的初始化

Servlet的初始化通常在Web服务器启动或者第一次请求Servlet时执行。初始化阶段通过调用init()方法完成,开发者可以在该方法中进行资源的加载和环境的初始化。

public void init(ServletConfig config) throws ServletException {
    // 在这里进行初始化操作
}

2.1.2 Servlet的请求处理

对于每个请求,Servlet容器会创建一个新的线程并调用service()方法。在service()方法内部,根据请求类型(GET、POST等)调用相应的方法(doGet、doPost等)来处理请求。

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String method = req.getMethod();
    if ("GET".equals(method)) {
        doGet(req, resp);
    } else if ("POST".equals(method)) {
        doPost(req, resp);
    }
    // ...
}

2.1.3 Servlet的销毁

当Web应用程序卸载或者Servlet容器终止时,Servlet的destroy()方法会被调用。在这个阶段,Servlet可以进行一些清理工作,比如关闭数据库连接,释放资源。

public void destroy() {
    // 在这里进行资源释放操作
}

2.2 Servlet如何处理HTTP请求

Servlet通过service()方法处理客户端的请求。实际上,开发者很少直接重写service()方法,更多的是根据HTTP请求类型覆盖doGet、doPost等具体方法。

2.2.1 GET请求处理

对于GET请求,Servlet通过覆盖doGet()方法来处理。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 获取请求参数
    String param = request.getParameter("param");
    // 处理业务逻辑
    // 设置响应内容类型
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<h1>Hello, World!</h1>"); // 响应结果
}

2.2.2 POST请求处理

对于POST请求,Servlet通过覆盖doPost()方法来处理,处理过程类似于doGet()方法。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 处理POST请求同GET
}

2.3 Servlet在MVC架构中的角色

在MVC(Model-View-Controller)架构中,Servlet充当控制器的角色,负责接收用户请求、调用模型层进行数据处理、并选择视图进行展示。

2.3.1 Servlet作为控制器

Servlet作为控制器,其核心职责是调度。它根据用户的不同请求调用不同的方法,并将处理结果转发到对应的视图。

public class MyServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取用户请求参数
        String action = request.getParameter("action");
        if ("login".equals(action)) {
            // 调用模型层进行处理
            // ...
            // 转发到登录页面视图
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }
    }
}

2.3.2 控制器与视图的协同

在Servlet控制器中,使用requestdispatcher对象可以将请求转发到不同的视图页面。通常情况下,控制器会根据业务逻辑处理结果选择一个页面进行显示。

request.getRequestDispatcher("/success.jsp").forward(request, response);

通过以上的代码和逻辑分析,我们可以看到Servlet在JSP系统中扮演着重要的角色,它不仅作为HTTP请求的处理者,更是MVC架构中不可或缺的控制器。理解和掌握Servlet的生命周期、HTTP请求处理流程及在MVC架构中的作用,对于开发高性能和高可维护性的Web应用至关重要。

3. 数据库连接与操作,包括JDBC和连接池技术

数据库连接与操作是构建任何需要持久化存储数据的应用系统的关键环节。在JSP计算机等级考试查询系统中,数据库的连接与操作尤为重要,因为它直接关系到数据的准确性和查询速度。本章将详细介绍Java数据库连接(JDBC)技术的使用方法,并探讨连接池技术在提高性能方面的应用。

JDBC基础与连接操作

JDBC(Java Database Connectivity)是一种允许Java程序执行SQL语句的API,它是Java SE的一部分。通过JDBC,开发者可以连接到几乎所有的数据库系统,并在Java应用程序中执行SQL语句。

JDBC驱动程序和数据库连接

JDBC驱动程序是实现JDBC API的接口和数据库之间的桥梁。按照与数据库交互的方式,JDBC驱动程序主要分为四种类型:JDBC-ODBC桥驱动程序、本地API部分Java驱动程序、网络协议部分Java驱动程序和本地协议纯Java驱动程序。

在实际应用中,首先需要加载合适的JDBC驱动程序,然后建立与数据库的连接。下面是一个简单的JDBC连接数据库的代码示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JdbcConnection {
    public static void main(String[] args) {
        Connection conn = null;
        try {
            // 加载数据库驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 建立数据库连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/examdb", "username", "password");
            if (conn != null) {
                System.out.println("成功连接数据库!");
            }
        } catch (ClassNotFoundException e) {
            System.out.println("找不到数据库驱动");
            e.printStackTrace();
        } catch (SQLException e) {
            System.out.println("数据库连接失败");
            e.printStackTrace();
        } finally {
            // 关闭数据库连接
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

在上述代码中,我们首先加载了MySQL的JDBC驱动程序,然后通过 DriverManager.getConnection 方法建立了一个连接。这里需要注意的是,连接字符串、用户名和密码需要根据实际情况进行修改。

SQL语句的执行

一旦建立了数据库连接,接下来就可以执行SQL语句来操作数据库了。在JDBC中,通常使用 Statement PreparedStatement 对象来执行SQL语句。

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JdbcQuery {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = ...; // 连接数据库
            String sql = "SELECT * FROM students WHERE name = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "张三");
            rs = pstmt.executeQuery();
            while (rs.next()) {
                // 处理查询结果
                System.out.println(rs.getString("name"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (rs != null) rs.close();
                if (pstmt != null) pstmt.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

在上述代码中, PreparedStatement 是一个预编译的SQL语句,它可以在设置参数之后多次执行,这样可以有效防止SQL注入攻击。

连接池技术

连接池技术是一种提升数据库连接效率的重要方法。它通过预先创建一定数量的数据库连接,并将它们保存在一个“池”中供应用程序使用,减少了频繁创建和关闭连接的开销。

连接池的类型和实现

常用的连接池有HikariCP、C3P0、Apache DBCP等。这些连接池工具提供了丰富的配置选项来优化性能和资源使用。

以HikariCP为例,它被广泛认为是性能最好的连接池之一。下面是一个简单的HikariCP配置示例:

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>4.0.3</version>
</dependency>
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class HikariExample {
    public static void main(String[] args) {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/examdb");
        config.setUsername("username");
        config.setPassword("password");

        // 设置连接池的相关属性
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");

        // 创建数据源对象
        HikariDataSource dataSource = new HikariDataSource(config);
        // 获取连接
        Connection conn = dataSource.getConnection();
        // 使用连接执行业务逻辑
        ...
        // 关闭连接
        conn.close();
    }
}

在这个示例中,我们通过 HikariConfig 类配置了连接数据库的各种参数,并通过它创建了 HikariDataSource 。这个 HikariDataSource 就是一个连接池,它提供了获取和归还连接的方法。

连接池配置的参数包括最大连接数、最小空闲连接、连接超时时间等。通过调整这些参数,可以有效提升应用程序的性能。

总结

数据库连接与操作是JSP计算机等级考试查询系统的关键部分。本章我们介绍了JDBC的基本使用方法,包括驱动程序的加载、数据库连接的建立、SQL语句的执行等。进一步地,我们探讨了连接池技术,并以HikariCP为例详细解释了连接池的配置和使用。通过以上内容的学习,读者应能够熟练运用JDBC进行数据库连接和操作,并能有效地应用连接池技术来提升应用性能。

4. 用户界面设计,HTML/CSS/JavaScript以及AJAX应用

在现代Web应用中,用户界面设计的重要性不言而喻。一个直观、美观且响应迅速的用户界面能够极大地提升用户体验,增强用户对系统的满意度。本章将详细介绍HTML、CSS和JavaScript这三大前端技术的基本用法,以及AJAX技术如何提升用户交互体验。我们将通过代码、表格和流程图等形式,使内容更加直观易懂。

4.1 HTML基础及页面布局

超文本标记语言(HTML)是构建Web页面的基础。它通过标记标签来定义页面的各个部分,包括段落、标题、链接和图片等。了解HTML的基本结构和元素是设计用户界面的首要步骤。

4.1.1 HTML文档结构

HTML文档遵循一定的结构,主要包括文档类型声明、html、head和body四个部分。以下是一个基本的HTML结构:

<!DOCTYPE html>
<html>
<head>
    <title>页面标题</title>
</head>
<body>
    <h1>这是一个标题</h1>
    <p>这是一个段落。</p>
</body>
</html>

4.1.2 HTML元素和标签

HTML元素由开始标签、内容和结束标签组成。例如, <p> 标签用来定义段落:

<p>这是一个段落。</p>

4.1.3 HTML页面布局

页面布局是设计用户界面时的关键环节。通常使用 <div> 元素来组织内容,以及 <header> <footer> <article> <section> 等语义化标签来定义页面的不同部分。

4.2 CSS设计及样式应用

层叠样式表(CSS)用于控制HTML文档的展示。通过CSS可以设置字体、颜色、背景以及页面布局等样式属性。

4.2.1 CSS选择器和属性

CSS选择器用于选择HTML元素,并为其应用样式。基本选择器包括元素选择器、类选择器和ID选择器。

p {
    color: blue;
    font-size: 14px;
}

4.2.2 CSS布局技术

CSS提供了多种布局技术,包括浮动(float)、定位(position)、Flexbox和Grid等。这些技术使得页面布局更加灵活和强大。

.container {
    display: flex;
    justify-content: space-around;
}

4.2.3 CSS预处理器

为了提高CSS的可维护性,通常会使用Sass或Less这样的CSS预处理器。它们增加了变量、嵌套规则等特性。

$primary-color: blue;

.container {
    background-color: $primary-color;
    p {
        color: $primary-color;
    }
}

4.3 JavaScript基础及交互实现

JavaScript是Web开发中不可或缺的脚本语言。它赋予网页动态交互的能力。

4.3.1 JavaScript基本语法

JavaScript的基本语法包括变量声明、数据类型、运算符和控制结构等。以下是一个简单的JavaScript程序:

let message = "Hello, World!";
console.log(message);

4.3.2 DOM操作和事件处理

文档对象模型(DOM)是HTML文档的编程接口。JavaScript可以操作DOM来动态地添加、删除和修改HTML元素。

document.getElementById("myButton").addEventListener("click", function() {
    alert("Button clicked!");
});

4.3.3 JavaScript库和框架

为了提升开发效率,现代前端开发广泛使用JavaScript库和框架,比如jQuery、React和Vue.js。它们提供了更加丰富的功能和更好的开发体验。

4.4 AJAX技术与异步数据交互

异步JavaScript和XML(AJAX)是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术。AJAX使用 XMLHttpRequest 对象或者现代的 fetch API来与服务器异步交换数据。

4.4.1 AJAX请求和响应

通过AJAX发送的请求通常由GET或POST方法组成。服务器响应可以是XML、JSON或纯文本格式。

fetch('***')
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error(error));

4.4.2 AJAX应用实例

在用户界面设计中,AJAX可以用来实现即时搜索、动态内容加载等功能,这些功能不需要用户刷新页面即可完成。

<input type="text" id="searchInput" placeholder="Search...">
<div id="results"></div>

<script>
document.getElementById('searchInput').addEventListener('input', function() {
    let searchTerm = this.value;
    fetch(`***${searchTerm}`)
        .then(response => response.json())
        .then(data => {
            let resultsHtml = data.results.map(item => `<li>${item.name}</li>`).join('');
            document.getElementById('results').innerHTML = resultsHtml;
        })
        .catch(error => console.error(error));
});
</script>

4.5 设计模式在前端的运用

设计模式为开发者提供了一套通用的解决方案模板,用于解决特定问题。在用户界面设计中,如工厂模式、单例模式和观察者模式等设计模式可以用来组织代码,提高代码的可维护性。

4.6 综合应用实例分析

为了将HTML、CSS、JavaScript和AJAX知识综合应用,我们将通过一个实际案例来展示如何设计一个响应式的用户界面。案例将展示从零开始的页面构建,包括布局设计、样式定制以及交互逻辑实现。

4.7 用户界面设计最佳实践

在用户界面设计的最后,我们将总结一些最佳实践和注意事项,比如一致性的设计原则、易用性原则和可访问性原则等。这些实践有助于打造一个既美观又实用的用户界面。

用户界面设计不仅关乎美学,更关乎用户体验。在本章中,我们从基本的HTML标签讲起,逐步深入到复杂的CSS布局、JavaScript交互和AJAX应用,最终为读者展示了一个前端开发的全貌。希望这些知识能够帮助您设计出符合现代Web标准的用户界面,提供一个流畅、高效和愉悦的用户体验。

5. MVC架构和设计模式在系统中的实现

MVC架构的核心概念与价值

模型-视图-控制器(MVC)架构是现代软件工程中广泛应用的一种设计模式。它将应用系统分为三个核心组件:模型(Model),视图(View)和控制器(Controller)。MVC架构通过将业务逻辑从用户界面中分离出来,实现了关注点分离,从而提高应用的可维护性和可扩展性。

模型(Model)

模型是应用的核心部分,它封装了数据以及对数据的操作。在JSP技术中,模型通常是Java Beans或EJBs,它们能够处理数据的读取、存储、修改等操作,并将其转化为业务逻辑。

视图(View)

视图是用户看到并与之交互的界面。在MVC设计中,视图通常由HTML、CSS和JavaScript等技术构建,负责展示模型中的数据。

控制器(Controller)

控制器是模型和视图之间的协调者。它的职责是接收用户的输入,并调用模型和视图去完成用户的请求。控制器通过解析用户的输入,将请求分发到相应的模型和视图组件。

设计模式与MVC架构的融合

设计模式为MVC架构提供了进一步优化其设计的手段。设计模式是为了解决特定问题而形成的模板和最佳实践。它们不是直接的代码实现,而是一系列经过验证的解决方案。

单例模式在MVC中的应用

在控制器组件中,单例模式可以保证控制器的唯一性。这样可以确保所有的用户请求都由同一个控制器实例处理,维护会话状态的一致性。

示例代码
public class MyController {
    private static MyController instance;

    private MyController() {}

    public static synchronized MyController getInstance() {
        if (instance == null) {
            instance = new MyController();
        }
        return instance;
    }

    // 其他方法...
}

工厂模式在MVC中的应用

工厂模式可以用来创建模型和视图的实例。它允许应用程序通过一个通用的接口来创建对象,而不需要关心对象的创建细节。

示例代码
public class ModelFactory {
    public static Model createModel(String type) {
        if (type.equals("User")) {
            return new UserModel();
        } else if (type.equals("Product")) {
            return new ProductModel();
        }
        // 其他模型...
        return null;
    }
}

MVC架构的实现细节

要实现一个有效的MVC架构,需要对各个组件进行细致的设计和编码。

控制器的实现

控制器接收用户请求,并根据请求调用相应的模型处理数据,然后选择一个视图来展示数据。

示例代码
public class MyController {
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String action = request.getParameter("action");

        if ("login".equalsIgnoreCase(action)) {
            // 处理登录逻辑...
        } else if ("register".equalsIgnoreCase(action)) {
            // 处理注册逻辑...
        }
        // 请求转发到视图...
    }
}

视图与模型的交互

视图依赖于模型中的数据,通常是通过模型中的getters方法来获取数据。

示例代码
<!-- login.jsp -->
<html>
<head>
    <title>Login</title>
</head>
<body>
    <form action="controller" method="post">
        Username: <input type="text" name="username" />
        Password: <input type="password" name="password" />
        <input type="submit" value="Login" />
    </form>
</body>
</html>

模型与数据的交互

模型通常需要与数据库进行交互,JDBC或ORM框架(如Hibernate)是常用的解决方案。

示例代码
public class UserModel {
    private String username;
    private String password;

    public UserModel(String username, String password) {
        this.username = username;
        this.password = password;
    }

    // 获取用户名和密码...
}

MVC架构与现代Web应用

随着Web应用的发展,MVC架构也需要不断地进行演进和优化,以满足新的需求。

RESTful API与MVC

RESTful API是一种基于HTTP协议,遵循REST原则的架构风格。在MVC架构中,控制器可以用来处理RESTful API的请求,并返回JSON或XML格式的数据。

示例代码
@RestController
@RequestMapping("/api/users")
public class UserRestController {
    @GetMapping("/{id}")
    public User getUserById(@PathVariable("id") Long id) {
        // 获取用户信息...
    }
}

SPA(单页应用)与MVC

在单页应用中,视图通常由JavaScript框架(如React或Angular)构建,控制器的职责则更多地由前端JavaScript逻辑接管。

性能优化

在MVC架构中,性能优化经常涉及到视图的缓存、数据库的查询优化以及连接池的使用等策略。

代码块
// 数据库连接池的配置示例
DataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("user");
dataSource.setPassword("password");
dataSource.setMaximumPoolSize(10);

MVC架构的设计和实现是构建可维护和可扩展Web应用的关键。通过将业务逻辑与用户界面分离,MVC不仅提高了代码的可读性,还增强了团队协作的效率。设计模式的应用进一步强化了MVC架构的复用性和可扩展性,让整个系统更加灵活和稳定。随着现代Web应用需求的变化,MVC架构也在不断地进行创新和优化,以适应新的挑战。

6. 项目文档撰写和答辩准备技巧

技术文档的重要性

撰写技术文档是项目开发的重要组成部分,它能够清晰地记录项目开发过程中的关键决策、设计思想、技术细节以及注意事项。一份良好的技术文档不仅有助于项目的维护和后期的团队交接,还能在产品发布后为用户或者开发者提供必要的参考资料。

如何撰写技术文档

  1. 文档结构 :确保文档有清晰的结构,通常包括引言、项目概述、系统设计、具体实现、测试结果和附录等部分。
  2. 格式规范 :文档需要保持一致的格式和排版风格,使用统一的术语和符号。
  3. 代码注释 :在关键的代码段落添加详细的注释,并在文档中解释重要代码的功能和工作原理。
  4. 图表辅助 :合理使用图表、流程图等视觉元素,帮助读者更好地理解文档内容。
  5. 版本控制 :文档应该有版本记录,方便追踪修改历史和维护文档的一致性。

用户手册的编写

用户手册是面向最终用户的指导手册,它帮助用户了解如何使用系统或软件产品。用户手册应当简单明了,避免使用专业术语,确保用户可以轻松地找到他们需要的信息。

用户手册撰写建议

  1. 目的明确 :说明手册的目标读者和使用范围。
  2. 功能介绍 :详细列出产品的所有功能和操作步骤。
  3. 实例演示 :提供典型操作的截图和步骤描述,帮助用户理解。
  4. 常见问题 :列出常见问题及其解决方案,便于用户自我排查。
  5. 索引和附录 :提供快速索引和附加信息,如错误代码的含义等。

答辩PPT的准备

答辩PPT是向评审展示项目成果的视觉材料,需要在有限的时间内传达项目的核心内容和亮点。PPT的准备需要精心设计,突出重点,且内容不宜过多。

答辩PPT制作要点

  1. 简洁明了 :使用清晰的标题和简短的文字描述。
  2. 视觉效果 :采用一致的设计风格,使用图表和图片辅助说明。
  3. 逻辑清晰 :遵循问题-解决方案-结果的逻辑框架,让评审快速理解项目的价值。
  4. 重点突出 :重点介绍项目的创新点、技术难点和实施过程中的关键步骤。
  5. 演练准备 :在正式答辩前进行多次演练,熟悉PPT内容,预测并准备可能的问题。

在完成项目后,通过专业的技术文档、详尽的用户手册和精心准备的答辩PPT,可以有效地展示项目成果,提升项目的整体质量和认可度。

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

简介:本项目是一个基于Java Web技术的学生考试成绩查询平台,使用JSP进行前端展示,结合Servlet处理业务逻辑,以及MySQL等数据库进行数据管理。它不仅包括源代码,还有项目论文和答辩PPT,为学习者提供了设计到实现的完整过程。系统设计涵盖了JSP与Servlet的技术应用、数据库的连接与操作、用户界面设计、系统架构与设计模式,以及项目文档的撰写与答辩准备。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值