JSP复习笔记——第10章 连接数据库 之 jsp+DAO实现留言管理程序

案例-jsp+DAO实现留言管理程序
----------------Note.java------------------------

package org.sky.darkness.note.vo ;

public class Note {
private int id ;
private String title ;
private String author ;
private String content ;

public void setId(int id) {
this.id = id ;
}
public void setTitle(String title) {
this.title = title ;
}
public void setAuthor(String author) {
this.author = author ;
}
public void setContent(String content) {
this.content = content ;
}

public int getId() {
return this.id ;
}
public String getTitle() {
return this.title ;
}
public String getAuthor() {
return this.author ;
}
public String getContent() {
return this.content ;
}
};

----------------------Person.java--------------------------

package org.sky.darkness.note.vo ;

public class Person
{
private String id ;
private String name ;
private String password ;

public void setId(String id) {
this.id = id ;
}
public void setName(String name) {
this.name = name ;
}
public void setPassword(String password) {
this.password = password ;
}

public String getId() {
return this.id ;
}
public String getName() {
return this.name ;
}
public String getPassword() {
return this.password ;
}
};

----------------NoteDAO.java-------------

package org.sky.darkness.note.dao ;

import java.util.* ;
import org.sky.darkness.note.vo.* ;

public interface NoteDAO
{
// 增加操作
public void insert(Note note) throws Exception ;
// 修改操作
public void update(Note note) throws Exception ;
// 删除操作
public void delete(int id) throws Exception ;
// 按ID查询,主要为更新使用
public Note queryById(int id) throws Exception ;
// 查询全部
public List queryAll() throws Exception ;
// 模糊查询
public List queryByLike(String cond) throws Exception ;
};

----------------------------PersonDAO.java-----------------------------------

package org.sky.darkness.note.dao ;

import org.sky.darkness.note.vo.* ;

public interface PersonDAO {
// 做登陆验证
public boolean login(Person person) throws Exception ;
};


---------------- PersonDAOImpl.java--------------
package org.sky.darkness.note.dao.impl ;

import java.sql.* ;
import org.sky.darkness.note.vo.* ;
import org.sky.darkness.note.dbc.* ;
import org.sky.darkness.note.dao.* ;

public class PersonDAOImpl implements PersonDAO
{
/*
功能:
• 判断是否是正确的用户名或密码
• 从数据库中取出用户的真实姓名
*/
public boolean login(Person person) throws Exception {
boolean flag = false ;
String sql = "SELECT name FROM person WHERE id=? and password=?" ;
PreparedStatement pstmt = null ;
DataBaseConnection dbc = null ;
dbc = new DataBaseConnection() ;
try {
pstmt = dbc.getConnection().prepareStatement(sql) ;
pstmt.setString(1,person.getId()) ;
pstmt.setString(2,person.getPassword()) ;
ResultSet rs = pstmt.executeQuery() ;
if (rs.next()) {
flag = true ;
person.setName(rs.getString(1)) ;
}
rs.close() ;
pstmt.close() ;
} catch (Exception e) {
throw new Exception("操作出现错误!!!") ;
} finally {
dbc.close() ;
}

return flag ;
}
};


------------- NoteDAOImpl.java-------------------------------------

package org.sky.darkness.note.dao.impl ;

import java.sql.* ;
import java.util.* ;
import org.sky.darkness.note.vo.* ;
import org.sky.darkness.note.dao.* ;
import org.sky.darkness.note.dbc.* ;

public class NoteDAOImpl implements NoteDAO {
// 增加操作
public void insert(Note note) throws Exception {
String sql = "INSERT INTO note(id,title,author,content) VALUES(note_sequ.nextVal,?,?,?)" ;
PreparedStatement pstmt = null ;
DataBaseConnection dbc = null ;
dbc = new DataBaseConnection() ;
try {
pstmt = dbc.getConnection().prepareStatement(sql) ;
pstmt.setString(1,note.getTitle()) ;
pstmt.setString(2,note.getAuthor()) ;
pstmt.setString(3,note.getContent()) ;
pstmt.executeUpdate() ;
pstmt.close() ;
} catch (Exception e) {
// System.out.println(e) ;
throw new Exception("操作中出现错误!!!") ;
} finally {
dbc.close() ;
}
}
// 修改操作
public void update(Note note) throws Exception {
String sql = "UPDATE note SET title=?,author=?,content=? WHERE id=?" ;
PreparedStatement pstmt = null ;
DataBaseConnection dbc = null ;
dbc = new DataBaseConnection() ;
try {
pstmt = dbc.getConnection().prepareStatement(sql) ;
pstmt.setString(1,note.getTitle()) ;
pstmt.setString(2,note.getAuthor()) ;
pstmt.setString(3,note.getContent()) ;
pstmt.setInt(4,note.getId()) ;
pstmt.executeUpdate() ;
pstmt.close() ;
} catch (Exception e) {
throw new Exception("操作中出现错误!!!") ;
} finally {
dbc.close() ;
}
}
// 删除操作
public void delete(int id) throws Exception {
String sql = "DELETE FROM note WHERE id=?" ;
PreparedStatement pstmt = null ;
DataBaseConnection dbc = null ;
dbc = new DataBaseConnection() ;
try {
pstmt = dbc.getConnection().prepareStatement(sql) ;
pstmt.setInt(1,id) ;
pstmt.executeUpdate() ;
pstmt.close() ;
} catch (Exception e) {
throw new Exception("操作中出现错误!!!") ;
} finally {
dbc.close() ;
}
}
// 按ID查询,主要为更新使用
public Note queryById(int id) throws Exception {
Note note = null ;
String sql = "SELECT id,title,author,content FROM note WHERE id=?" ;
PreparedStatement pstmt = null ;
DataBaseConnection dbc = null ;
dbc = new DataBaseConnection() ;
try {
pstmt = dbc.getConnection().prepareStatement(sql) ;
pstmt.setInt(1,id) ;
ResultSet rs = pstmt.executeQuery() ;
if(rs.next()) {
note = new Note() ;
note.setId(rs.getInt(1)) ;
note.setTitle(rs.getString(2)) ;
note.setAuthor(rs.getString(3)) ;
note.setContent(rs.getString(4)) ;
}
rs.close() ;
pstmt.close() ;
} catch (Exception e) {
throw new Exception("操作中出现错误!!!") ;
} finally {
dbc.close() ;
}
return note ;
}
// 查询全部
public List queryAll() throws Exception {
List all = new ArrayList() ;
String sql = "SELECT id,title,author,content FROM note" ;
PreparedStatement pstmt = null ;
DataBaseConnection dbc = null ;
dbc = new DataBaseConnection() ;
try {
pstmt = dbc.getConnection().prepareStatement(sql) ;
ResultSet rs = pstmt.executeQuery() ;
while(rs.next()) {
Note note = new Note() ;
note.setId(rs.getInt(1)) ;
note.setTitle(rs.getString(2)) ;
note.setAuthor(rs.getString(3)) ;
note.setContent(rs.getString(4)) ;
all.add(note) ;
}
rs.close() ;
pstmt.close() ;
} catch (Exception e) {
System.out.println(e) ;
throw new Exception("操作中出现错误!!!") ;
} finally {
dbc.close() ;
}
return all ;
}
// 模糊查询
public List queryByLike(String cond) throws Exception {
List all = new ArrayList() ;
String sql = "SELECT id,title,author,content FROM note WHERE title LIKE ? or AUTHOR LIKE ? or CONTENT LIKE ?" ;
PreparedStatement pstmt = null ;
DataBaseConnection dbc = null ;
dbc = new DataBaseConnection() ;
try {
pstmt = dbc.getConnection().prepareStatement(sql) ;
pstmt.setString(1,"%"+cond+"%") ;
pstmt.setString(2,"%"+cond+"%") ;
pstmt.setString(3,"%"+cond+"%") ;
ResultSet rs = pstmt.executeQuery() ;
while(rs.next()) {
Note note = new Note() ;
note.setId(rs.getInt(1)) ;
note.setTitle(rs.getString(2)) ;
note.setAuthor(rs.getString(3)) ;
note.setContent(rs.getString(4)) ;
all.add(note) ;
}
rs.close() ;
pstmt.close() ;
} catch (Exception e) {
System.out.println(e) ;
throw new Exception("操作中出现错误!!!") ;
} finally {
dbc.close() ;
}
return all ;
}
};

----------- DAOFactory .java------------------------------------------------

package org.sky.darkness.note.factory ;

import org.sky.darkness.note.dao.* ;
import org.sky.darkness.note.dao.impl.* ;

public class DAOFactory {
public static PersonDAO getPersonDAOInstance() {
return new PersonDAOImpl() ;
}

public static NoteDAO getNoteDAOInstance() {
return new NoteDAOImpl() ;
}
};

----------- DataBaseConnection .java-----------------------------------------------

package org.sky.darkness.note.dbc ;

import java.sql.* ;

public class DataBaseConnection {
private String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ;
private String DBURL = "jdbc:oracle:thin:@localhost:1521:sky" ;
private String DBUSER = "scott" ;
private String DBPASSWORD = "darkness" ;
private Connection conn = null ;

public DataBaseConnection() {
try {
Class.forName(DBDRIVER) ;
this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;
} catch (Exception e) {
}
}

public Connection getConnection() {
return this.conn ;
}

public void close() {
try {
this.conn.close() ;
}
catch (Exception e) {
}
}
};

------------脚本.sql-------------------------------------------------

-- 创建表
-- 用户表(登陆)、留言表

-- 删除表
DROP TABLE person ;
DROP TABLE note ;

-- 删除序列
DROP SEQUENCE note_sequ ;

-- 创建序列
CREATE SEQUENCE note_sequ ;


-- 创建person表
CREATE TABLE person
(
id varchar(20) not null primary key ,
name varchar(20) ,
password varchar(20)
) ;

-- 创建留言表
CREATE TABLE note
(
id int not null primary key , -- sequence
title varchar(20) not null ,
author varchar(20) not null ,
content varchar(50) not null
) ;

-- 插入测试数据
INSERT INTO person VALUES ('darkness','wind','zzzzzz') ;
INSERT INTO person VALUES ('sky','cloud','mmmmmm') ;

-- 事务提交
commit ;


-------------------------login.jsp--------------------------------------------

<%@ page contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>JSP+DAO 留言管理程序——登陆</title>
</head>
<body>
<center>
<h1>留言管理范例 —— JSP + DAO实现</h1>
<hr>
<br>
<%
// 判断是否有错误信息,如果有则打印
// 如果没有此段代码,则显示时会直接打印null
if(request.getAttribute("err")!=null)
{
%>
<h2><%=request.getAttribute("err")%></h2>
<%
}
%>
<form action="login_conf.jsp" method="post">
<table width="80%">
<tr>
<td colspan="2">用户登陆</td>
</tr>
<tr>
<td>用户名:</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<td>密  码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="登陆">
<input type="reset" value="重置">
</td>
</tr>
</table>
</form>
</center>
</body>
</html>


--------------------------- login_conf.jsp------------------------------------
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="org.sky.darkness.note.factory.*"%>
<html>
<head>
<title>JSP+DAO 留言管理程序——登陆</title>
</head>
<body>
<center>
<h1>留言管理范例 —— JSP + DAO实现</h1>
<hr>
<br>
<jsp:useBean id="person" scope="page" class="org.sky.darkness.note.vo.Person"/>
<jsp:setProperty name="person" property="*"/>
<%
try
{
// 跳转
if(DAOFactory.getPersonDAOInstance().login(person))
{
// 设置用户姓名到session范围之中
session.setAttribute("uname",person.getName()) ;
// 用户合法
%>
<jsp:forward page="login_success.jsp"/>
<%
}
else
{
// 用户非法
%>
<jsp:forward page="login.jsp"/>
<%
}
}
catch(Exception e)
{}
%>
</center>
</body>
</html>


------------------login_success.jsp------------------------------------------
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>JSP+DAO 留言管理程序——登陆</title>
</head>
<body>
<center>
<h1>留言管理范例 —— JSP + DAO实现</h1>
<hr>
<br>
<%
if(session.getAttribute("uname")!=null)
{
// 用户已登陆
%>
<h2>登陆成功</h2>
<h2>欢迎<font color="red" size="12">
<%=session.getAttribute("uname")%>
</font>光临留言程序</h2>
<h3><a href="list_notes.jsp">进入留言管理页面</a></h3>
<%
}
else
{
// 用户未登陆,提示用户登陆,并跳转
response.setHeader("refresh","2;URL=login.jsp") ;
%>
您还未登陆,请先登陆!!!<br>
两秒后自动跳转到登陆窗口!!!<br>
如果没有跳转,请按<a href="login.jsp">这里</a>!!!<br>
<%
}
%>
</center>
</body>
</html>


------------------------insert.jsp------------------------------
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>JSP+DAO 留言管理程序——登陆</title>
</head>
<body>
<center>
<h1>留言管理范例 —— JSP + DAO实现</h1>
<hr>
<br>
<%
if(session.getAttribute("uname")!=null)
{
// 用户已登陆
%>
<form action="insert_do.jsp" method="post">
<table>
<tr>
<td colspan="2">添加新留言</td>
</tr>
<tr>
<td>标题:</td>
<td><input type="text" name="title"></td>
</tr>
<tr>
<td>作者:</td>
<td><input type="text" name="author"></td>
</tr>
<tr>
<td>内容:</td>
<td><textarea name="content" cols="30" rows="6"></textarea></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="添加">
<input type="reset" value="重置">
</td>
</tr>
</table>
</form>
<h3><a href="list_notes.jsp">回到留言列表页</a></h3>
<%
}
else
{
// 用户未登陆,提示用户登陆,并跳转
response.setHeader("refresh","2;URL=login.jsp") ;
%>
您还未登陆,请先登陆!!!<br>
两秒后自动跳转到登陆窗口!!!<br>
如果没有跳转,请按<a href="login.jsp">这里</a>!!!<br>
<%
}
%>
</center>
</body>
</html>


--------------------insert_do.jsp---------------------------------------------------------
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="org.sky.darkness.note.factory.*"%>
<html>
<head>
<title>JSP+DAO 留言管理程序——登陆</title>
</head>
<body>
<center>
<h1>留言管理范例 —— JSP + DAO实现</h1>
<hr>
<br>
<%
// 进行乱码处理
request.setCharacterEncoding("GB2312") ;
%>
<%
if(session.getAttribute("uname")!=null)
{
// 用户已登陆
%>
<jsp:useBean id="note" scope="page" class="org.sky.darkrness.note.vo.Note"/>
<jsp:setProperty name="note" property="*"/>

<%
response.setHeader("refresh","2;URL=list_notes.jsp") ;
try
{
DAOFactory.getNoteDAOInstance().insert(note) ;
%>
留言添加成功,两秒后跳转到留言列表页!!!<br>
如果没有跳转,请按<a href="list_notes.jsp">这里</a>!!!
<%
}
catch(Exception e)
{
%>
留言添加失败,两秒后跳转到留言列表页!!!<br>
如果没有跳转,请按<a href="list_notes.jsp">这里</a>!!!
<%
}
%>
<%
}
else
{
// 用户未登陆,提示用户登陆,并跳转
response.setHeader("refresh","2;URL=login.jsp") ;
%>
您还未登陆,请先登陆!!!<br>
两秒后自动跳转到登陆窗口!!!<br>
如果没有跳转,请按<a href="login.jsp">这里</a>!!!<br>
<%
}
%>
</center>
</body>
</html>


-------------------update.jsp-------------------------------------
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="org.sky.darkness.note.factory.*"%>
<%@ page import="org.sky.darkness.note.vo.*"%>
<html>
<head>
<title>JSP+DAO 留言管理程序——登陆</title>
</head>
<body>
<center>
<h1>留言管理范例 —— JSP + DAO实现</h1>
<hr>
<br>
<%
// 进行乱码处理
request.setCharacterEncoding("GB2312") ;
%>
<%
if(session.getAttribute("uname")!=null)
{
// 用户已登陆
%>
<%
// 接收参数
int id = 0 ;
try
{
id = Integer.parseInt(request.getParameter("id")) ;
}
catch(Exception e)
{}
%>
<%
Note note = null ;
try
{
note = DAOFactory.getNoteDAOInstance().queryById(id) ;
}
catch(Exception e)
{}
%>
<%
if(note!=null)
{
id = note.getId() ;
String title = note.getTitle() ;
String author = note.getAuthor() ;
String content = note.getContent() ;
%>
<form action="update_do.jsp" method="post">
<table>
<tr>
<td colspan="2">添加新留言</td>
</tr>
<tr>
<td>标题:</td>
<td><input type="text" name="title" value="<%=title%>"></td>
</tr>
<tr>
<td>作者:</td>
<td><input type="text" name="author" value="<%=author%>"></td>
</tr>
<tr>
<td>内容:</td>
<td><textarea name="content" cols="30" rows="6"><%=content%></textarea></td>
</tr>
<tr>
<td colspan="2">
<input type="hidden" name="id" value="<%=id%>">
<input type="submit" value="更新">
<input type="reset" value="重置">
</td>
</tr>
</table>
</form>
<%
}
else
{
%>
没有发现,要更新的内容!!<br>
请确认要更新的留言是否存在!!<br>
<%
}
%>
<h3><a href="list_notes.jsp">回到留言列表页</a></h3>
<%
}
else
{
// 用户未登陆,提示用户登陆,并跳转
response.setHeader("refresh","2;URL=login.jsp") ;
%>
您还未登陆,请先登陆!!!<br>
两秒后自动跳转到登陆窗口!!!<br>
如果没有跳转,请按<a href="login.jsp">这里</a>!!!<br>
<%
}
%>
</center>
</body>
</html>


-----------------------------update_do.jsp--------------------------------
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="org.sky.darkness.note.factory.*"%>
<html>
<head>
<title>JSP+DAO 留言管理程序——登陆</title>
</head>
<body>
<center>
<h1>留言管理范例 —— JSP + DAO实现</h1>
<hr>
<br>
<%
// 进行乱码处理
request.setCharacterEncoding("GB2312") ;
%>
<jsp:useBean id="note" scope="page" class="org.sky.darkness.note.vo.Note"/>
<jsp:setProperty name="note" property="*"/>
<%
if(session.getAttribute("uname")!=null)
{
// 用户已登陆
%>

<%
response.setHeader("refresh","2;URL=list_notes.jsp") ;
try
{
DAOFactory.getNoteDAOInstance().update(note) ;
%>
留言修改成功,两秒后跳转到留言列表页!!!<br>
如果没有跳转,请按<a href="list_notes.jsp">这里</a>!!!
<%
}
catch(Exception e)
{
%>
留言修改失败,两秒后跳转到留言列表页!!!<br>
如果没有跳转,请按<a href="list_notes.jsp">这里</a>!!!
<%
}
%>
<%
}
else
{
// 用户未登陆,提示用户登陆,并跳转
response.setHeader("refresh","2;URL=login.jsp") ;
%>
您还未登陆,请先登陆!!!<br>
两秒后自动跳转到登陆窗口!!!<br>
如果没有跳转,请按<a href="login.jsp">这里</a>!!!<br>
<%
}
%>
</center>
</body>
</html>


-------------------------list_notes.jsp--------------------------
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.*"%>
<%@ page import="org.sky.darkness.note.factory.*"%>
<%@ page import="org.sky.darkness.note.vo.*"%>
<html>
<head>
<title>JSP+DAO 留言管理程序——登陆</title>
</head>
<body>
<center>
<h1>留言管理范例 —— JSP + DAO实现</h1>
<hr>
<br>
<%
// 编码转换
request.setCharacterEncoding("GB2312") ;
if(session.getAttribute("uname")!=null)
{
// 用户已登陆
%>
<%
// 如果有内容,则修改变量i,如果没有,则根据i的值进行无内容提示
int i = 0 ;
String sql = null;
String keyword = request.getParameter("keyword") ;
List all = null ;
try
{
if(keyword==null)
{
all = DAOFactory.getNoteDAOInstance().queryAll() ;
}
else
{
// 有查询条件
all = DAOFactory.getNoteDAOInstance().queryByLike(keyword) ;
}
}
catch(Exception e)
{
System.out.println(e) ;
}
%>
<form action="list_notes.jsp" method="POST">
请输入查询内容:<input type="text" name="keyword">
<input type="submit" value="查询">
</form>
</h3><a href="insert.jsp">添加新留言</a></h3>
<table width="80%" border="1">
<tr>
<td>留言ID</td>
<td>标题</td>
<td>作者</td>
<td>内容</td>
<td>删除</td>
</tr>
<%
Iterator iter = all.iterator() ;
while(iter.hasNext())
{
Note note = (Note)iter.next() ;
i++ ;
// 进行循环打印,打印出所有的内容,以表格形式
// 从数据库中取出内容
int id = note.getId() ;
String title = note.getTitle() ;
String author = note.getAuthor() ;
String content = note.getContent() ;

if(keyword!=null)
{
// 需要将数据返红
title = title.replaceAll(keyword,"<font color=\"red\">"+keyword+"</font>") ;
author = author.replaceAll(keyword,"<font color=\"red\">"+keyword+"</font>") ;
content = content.replaceAll(keyword,"<font color=\"red\">"+keyword+"</font>") ;
}
%>
<tr>
<td><%=id%></td>
<td><a href="update.jsp?id=<%=id%>"><%=title%></a></td>
<td><%=author%></td>
<td><%=content%></td>
<td><a href="delete_do.jsp?id=<%=id%>">删除</a></td>
</tr>
<%
}
// 判断i的值是否改变,如果改变,则表示有内容,反之,无内容
if(i==0)
{
// 进行提示
%>
<tr>
<td colspan="5">没有任何内容!!!</td>
</tr>
<%
}
%>
</table>

<%
}
else
{
// 用户未登陆,提示用户登陆,并跳转
response.setHeader("refresh","2;URL=login.jsp") ;
%>
您还未登陆,请先登陆!!!<br>
两秒后自动跳转到登陆窗口!!!<br>
如果没有跳转,请按<a href="login.jsp">这里</a>!!!<br>
<%
}
%>
</center>
</body>
</html>


------------------------delete_do.jsp-----------------------------------------
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="org.sky.darkness.note.factory.*"%>

<html>
<head>
<title>JSP+DAO 留言管理程序——登陆</title>
</head>
<body>
<center>
<h1>留言管理范例 —— JSP + DAO实现</h1>
<hr>
<br>
<%
if(session.getAttribute("uname")!=null)
{
// 用户已登陆
%>

<%
// 接收参数
int id = 0 ;
try
{
id = Integer.parseInt(request.getParameter("id")) ;
}
catch(Exception e)
{}
%>
<%
response.setHeader("refresh","2;URL=list_notes.jsp") ;
try
{
DAOFactory.getNoteDAOInstance().delete(id) ;
%>
留言删除成功,两秒后跳转到留言列表页!!!<br>
如果没有跳转,请按<a href="list_notes.jsp">这里</a>!!!
<%
}
catch(Exception e)
{
%>
留言删除失败,两秒后跳转到留言列表页!!!<br>
如果没有跳转,请按<a href="list_notes.jsp">这里</a>!!!
<%
}
%>
<%
}
else
{
// 用户未登陆,提示用户登陆,并跳转
response.setHeader("refresh","2;URL=login.jsp") ;
%>
您还未登陆,请先登陆!!!<br>
两秒后自动跳转到登陆窗口!!!<br>
如果没有跳转,请按<a href="login.jsp">这里</a>!!!<br>
<%
}
%>
</center>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值