B/S系统期末复习宝典——代码部分(一)

1、JSP编程:

(1)

<%!String[] receiverName = { "hanyongmeng", "huangyun" };
	String[] receiverAddress = { "北京市昌平区金燕龙办公楼", "北京市昌平区建材城西路金燕龙办公楼" };
	double[] money = { 44.5, 59 };
	String[] receiverPhone = { "15207545526", "13041019968" };%>
	<table border="1">
		<tr>
			<td width="120" align="center">收件人姓名</td>
			<td width="380" align="center">地 址</td>
			<td width="80" align="center">价格</td>
			<td width="180" align="center">联系电话</td>
		</tr>
		<%
			for (int i = 0; i < receiverName.length; i++) {
out.println("<tr><td align='center'>" + receiverName[i] 
+ "</td><td  align='center'>"+ receiverAddress[i] 
+ "</td><td  align='center'>" + money[i] 
+ "</td><td  align='center'>"+ receiverPhone[i] + "</td></tr>");
			}
		%>

(2)



<form action="show.jsp" method="post" > 
 用户名:<input type="text" name="uname" /><br/>  
密码:<input type="password" name="upwd" /><br/>  
兴趣:<br/>  
足球<input type="checkbox" name="hobby" value="足球"/>  
篮球<input type="checkbox" name="hobby" value="篮球"/>  
羽毛球<input type="checkbox" name="hobby" value="羽毛球"/><br/>  
<input type="submit" value="注册" />  </form>

<% request.setCharacterEncoding("UTF-8");  
String name = request.getParameter("uname");  
 String pwd = request.getParameter("upwd"); 
 String[] hobbies = request.getParameterValues("hobby"); %> 
 您注册的信息如下:<br/> 
 用户名:<%=name %> <br/>  
密码:<%=pwd %> <br/> 
 爱好: <%  if(hobbies != null) 
 { 
for(int i=0 ; i<hobbies.length ;i++) 
 { 
 out.print(hobbies[i]+"&nbsp"); 
 } 
 } %>

(3)

 <form action="check.jsp" method="post" > 
 用户名:<input type="text" name="uname" /><br/> 
 密码:<input type="password" name="upwd" /><br/> 
 <input type="submit" value="登录" />  </form>

<%  request.setCharacterEncoding("UTF-8"); 
 String name = request.getParameter("uname");
 String pwd = request.getParameter("upwd"); 
if(name.equals("张三") && pwd.equals("abc")) 
 { response.sendRedirect("success.jsp"); 
 } 
 %>

 登录成功!<br/> 
 欢迎您:<br/> 
 <%  String name = request.getParameter("uname"); 
 out.print(name);  %> 


2、javaBean(利用DBUtil.java和JDBC技术)

(1)


<p>当前用户:${sessionScope.user.getName()}</p>
	<table border="1">
		<%
			String sql = "select * from orders";
			ResultSet rs = DBUtil.executeQuery(sql, null);
		%>
		<tr>
			<td width="120" align="center">收件人姓名</td>
			<td width="380" align="center">地 址</td>
			<td width="80" align="center">价格</td>
			<td width="180" align="center">联系电话</td>
		</tr>
		<%
			while (rs.next()) {
out.println("<tr><td align='center'>" 
+ rs.getString("receiverName") + "</td><td  align='center'>"
+ rs.getString("receiverAddress") + "</td><td  align='center'>" 
+ rs.getDouble("money") + "</td><td  align='center'>" 
+ rs.getString("receiverPhone") + "</td></tr>");
			}
		%>
	</table>

(2)

<% 
request.setCharacterEncoding("UTF-8"); 
String username = request.getParameter("uname"); 
String password = request.getParameter("upwd"); 
Connection con = null; PreparedStatement pstmt = null; 
try {
Class.forName("oracle.jdbc.OracleDriver"); 
con=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:XE", "system", "sa"); 
String loginSql = "insert into login(username,password) values(?,?)"; 
pstmt = con.prepareStatement(loginSql); 
pstmt.setString(1,username); pstmt.setString(2, password); 
 pstmt.executeUpdate(); out.println("<h1>注册成功!</h>")}catch (SQLException e) 
{ e.printStackTrace(); }
 %> 

(3)

public void addLoginInfo(LoginInfo loginInfo) {
 Connection con = null; 
Statement stmt = null; 
try { //加载数据库驱动 
Class.forName("com.mysql.jdbc.Driver"); 
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF8", "root", "123456"); 
stmt = con.createStatement(); 
String loginSql = "insert into login(name,password)values ('" + loginInfo.getName() + "','"+ loginInfo.getPassword() + "')"; stmt.executeUpdate(loginSql); 
System.out.println("<h1>注册成功!</h>"); 
}catch (Exception e) { e.printStackTrace(); 
}finally { try { stmt.close(); con.close(); 
}catch (SQLException e) { e.printStackTrace(); } } }

<% request.setCharacterEncoding("UTF-8"); 
String name = request.getParameter("uname"); 
String password = request.getParameter("upwd"); 
LoginInfo loginInfo = new LoginInfo(); 
loginInfo.setName(name);
loginInfo.setPassword(password); 
LoginControl loginControl = new LoginControl(); 
loginControl.addLoginInfo(loginInfo); %>

3、MVC架构

(1)

 <form action="LoginServlet" method="post" >
            用户名<input type="text" name="name"/><br/>
            密 码<input type="password" name="pwd"/><br/>
            <input type="submit" value="登录" />
 </form>

package cn.qztc.wxm.mvc;
import java.io.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import cn.qztc.wxm.entity.User;
import cn.qztc.wxm.util.DBUtil;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	public void doGet(HttpServletRequest request,HttpServletResponse response)
				throws ServletException, IOException {
			request.setCharacterEncoding("utf-8");
			String name = request.getParameter("name");
			String password = request.getParameter("pwd");
            String sql="select * from user where name=? and password=?";
            System.out.println(name);
            ResultSet rs=DBUtil.executeQuery(sql,new Object[]{name,password});
			try {
				if (rs.next()) {
					User user = new User();
					user.setName(name);
					user.setPassword(password);
					request.getSession().setAttribute("user", user);
					 System.out.println(user);
					response.sendRedirect("jspjavabean.jsp");
				}
				else 
					response.sendRedirect("login.jsp");
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
		}	
}
<p>当前用户:${sessionScope.user.getName()}</p>

(2)


 <form action="RegisterServlet" method="post" >
              用户名:<input type="text" name="uname" /><br/>
              密码:<input type="password" name="upwd" /><br/>
              年龄:<input type="text" name="uage" /><br/>
              地址:<input type="text" name="uaddress" /><br/>
              <input type="submit" value="注册" />
</form>

	protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		HttpSession session = request.getSession();
		String name = request.getParameter("uname");
		String pwd = request.getParameter("upwd");
		String uage = request.getParameter("uage");
		int age = Integer.parseInt(uage);
		String address = request.getParameter("uaddress");
		UserInfo userInfo = new UserInfo(name, pwd, age, address);
		UserInfoDao userInfoDao = new UserInfoDao();
		userInfoDao.addRegisterInfo(userInfo);
		session.setAttribute("userInfo", userInfo);
		request.getRequestDispatcher("welcome.jsp").forward(request, response);
	}
}

   欢迎您<%=((UserInfo)session.getAttribute("userInfo")).getUname()%>


4、三层架构技术(DBUtil)

package cn.qztc.wxm.threetier.servlet;
import java.io.IOException;
import java.util.List;
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 cn.qztc.wxm.entity.Orders;
import cn.qztc.wxm.threetier.service.OrdersService;
@WebServlet("/QueryAllOrdersServlet")
public class QueryAllOrdersServlet extends HttpServlet
{
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException
   {
             this.doPost(request, response);
   }
   protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
   {
             request.setCharacterEncoding("UTF-8");
             OrdersService ordersService = new OrdersService();
             List<Orders> orderslist = ordersService.queryAllOrderslist();
             System.out.println(orderslist);
             request.setAttribute("orderslist", orderslist);
             request.getRequestDispatcher("index.jsp").forward(request, response);
   }
}

	<table border="1">
		<tr>
			<td width="120" align="center">收件人姓名</td>
			<td width="380" align="center">地 址</td>
			<td width="80" align="center">价格</td>
			<td width="180" align="center">联系电话</td>
		</tr>
		<%
List<Orders> orderslist = (List<Orders>) request.getAttribute("orderslist");
			if (orderslist != null)
			{
				for (Orders orders : orderslist)
				{
		%>
		<tr>
			<td><%=orders.getReceiverName()%></td>
			<td><%=orders.getReceiverAddress()%></td>
<td><%=orders.getMoney()%></td> 
			<td><%=orders.getReceiverPhone()%></td></tr>
		<%
			}
			}
		%>
	</table>

OrderDao.java:
public class OrdersDao {
	// 增加订单
	public boolean addOrders(Orders orders) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		// flag用来标记是否增加成功,若增加成功则返回true,若增加失败则返回false
		boolean flag = true;
		try {
			conn = DBUtil.getConnection();
			String sql = "insert into orders(receiverName,receiverAddress,money,receiverPhone)  values(?,?,?,?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, orders.getReceiverName());
			pstmt.setString(2, orders.getReceiverAddress());
			pstmt.setDouble(3, orders.getMoney());
			pstmt.setString(4, orders.getReceiverPhone());
			pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
				flag = false;
			}
		}
		return flag;
	}
	// 根据id删除订单
	public boolean deleteOrdersByNo(int id) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		// flag用来标记是否删除成功,若删除成功则返回true,若删除失败则返回false
		boolean flag = true;
		try {
			conn = DBUtil.getConnection();
			String sql = "delete from orders where id = ? ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, id);
			pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
				flag = false;
			}
		}
		return flag;
	}
	// 修改订单信息:将原来id为id的订单信息,修改为实体类orders中的包含信息
	public boolean updateOrders(Orders orders, int id) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		// flag用来标记是否修改成功,若修改成功则返回true,若修改失败则返回false
		boolean flag = true;
		try {
			conn = DBUtil.getConnection();
			String sql = "update orders set receiverName = ?,receiverAddress = ? ,money=? ,receiverPhone=? where id = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, orders.getReceiverName());
			pstmt.setString(2, orders.getReceiverAddress());
			pstmt.setDouble(3, orders.getMoney());
			pstmt.setString(4, orders.getReceiverPhone());
			pstmt.setInt(5, id);
			pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
				flag = false;
			}
		}
		return flag;
	}
	// 根据id,查询某一个订单
	public Orders queryOrdersByNo(int id) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		Orders orders = null;
		try {
			conn = DBUtil.getConnection();
			String sql = "select receiverName,receiverAddress,money,receiverPhone from orders where id = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, id);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				String receiverName = rs.getString("receiverName");
				String receiverAddress = rs.getString("receiverAddress");
				double money = rs.getDouble("money");
				String receiverPhone = rs.getString("receiverPhone");
				// 将查询到的订单信息封装到orders对象中
				orders = new Orders(receiverName,receiverAddress,money,receiverPhone);
			}
		} catch (Exception 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();
			}
		}
		return orders;
	}
	// 查询全部订单
	public List<Orders> queryAllOrderslist() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<Orders> orderslist = new ArrayList<Orders>();
		try {
	conn = DBUtil.getConnection();
String sql = "select id,receiverName,receiverAddress,money,receiverPhone from orders";
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			while (rs.next()) {
				int id = rs.getInt("id");
				String receiverName = rs.getString("receiverName");
				String receiverAddress = rs.getString("receiverAddress");
				double money = rs.getDouble("money");
				String receiverPhone = rs.getString("receiverPhone");
				Orders orders = new Orders(id, receiverName,receiverAddress,money,receiverPhone);
				orderslist.add(orders);
			}
		} catch (Exception 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();
			}
		}
		return orderslist;
	}
	public boolean isExistByNo(int id) {
		boolean isExist = false;
		Orders orders = this.queryOrdersByNo(id);
		isExist = (orders == null) ? false : true;
		return isExist;
	}
}

OrderService.java:
public class OrdersService {
	// 业务逻辑层依赖于数据访问层
	OrdersDao ordersDao = new OrdersDao();
	// 增加订单
	public boolean addOrders(Orders orders)
	{
		if (ordersDao.isExistByNo(orders.getId()))
		{
			System.out.println("此订单已经存在,不能重复增加!");
			return false;
		}
			return ordersDao.addOrders(orders);
	}
	// 根据id删除订单
	public boolean deleteOrdersByNo(int id)
	{
		if (!ordersDao.isExistByNo(id))
		{
			System.out.println("查无此订单,无法删除!");
			return false;
		}
			return ordersDao.deleteOrdersByNo(id);
	}
	// 修改订单信息:将原来id为id的订单信息,修改为实体类orders中的包含信息
	public boolean updateOrders(Orders orders, int id)
	{
			if (!ordersDao.isExistByNo(id))
		{
			System.out.println("查无此订单,无法修改!");
			return false;
		}
			return ordersDao.updateOrders(orders, id);
	}
	// 根据id,查询某一个订单
	public Orders queryOrdersByNo(int id)
	{
			return ordersDao.queryOrdersByNo(id);
	}
	// 查询全部订单
	public List<Orders> queryAllOrderslist()
	{
		return ordersDao.queryAllOrderslist();
	}
	// 根据id,判断某一个订单是否已经存在
	public boolean isExistByNo(int id)
	{
			return ordersDao.isExistByNo(id);
	}
}

5、三层架构技术+连接池+DBUtil工具实现

(1)

  <form action="AddOrdersServlet" method="post">
      收件人姓名:<input type="text" name="receiverName" /><br/>
     地 址:<input type="text" name="receiverAddress" /><br/>
     价 格:<input type="text" name="money" /><br/>
    联系电话:<input type="text" name="receiverPhone" /><br/>
         <input type="submit" value="增加" /><br/>
         </form>

protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
  request.setCharacterEncoding("UTF-8");
  String receiverName = request.getParameter("receiverName");
String receiverAddress = request.getParameter("receiverAddress");
  double money = Double.parseDouble(request.getParameter("money"));
    String receiverPhone = request.getParameter("receiverPhone");
Orders orders =new Orders(receiverName,receiverAddress,money,receiverPhone);
    OrdersDButilService ordersDButilService = new OrdersDButilService();
    boolean result = ordersDButilService.addOrders(orders);
    if (!result)
{
request.setAttribute("addError", "error");
request.getRequestDispatcher("addOrders.jsp").forward(request, response);
       }else
       {
          response.sendRedirect("QueryAllOrdersServlet");
        }
     }
连接池:
public class C3p0Utils {
	private static DataSource ds;
	static {
		ds = new ComboPooledDataSource();
	}
	public static DataSource getDataSource() {
		return ds;
	}
}
OrdersDButilService.java:
public class OrdersDButilService {
	// 业务逻辑层依赖于数据访问层
	OrdersDButilDao ordersDButilDao = new OrdersDButilDao();
	// 增加订单
	public boolean addOrders(Orders orders)
	{
		try {
			if (ordersDButilDao.isExistByNo(orders.getId()))
			{
				System.out.println("此订单已经存在,不能重复增加!");
				return false;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 调用数据访问层的方法,实现增加操作
		try {
			return ordersDButilDao.insert(orders);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	
		return false;
	}
	// 根据id删除订单
	public boolean deleteOrdersByNo(int id)
	{
		try {
			if (!ordersDButilDao.isExistByNo(id))
			{
				System.out.println("查无此订单,无法删除!");
				return false;
			}
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		// 调用数据访问层的方法,实现删除操作
		try {
			return ordersDButilDao.delete(id);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
	// 修改订单信息:将原来id为id的订单信息,修改为实体类orders中的包含信息
	public boolean updateOrders(Orders orders, int id)
	{
				try {
			if (!ordersDButilDao.isExistByNo(id))
			{
				System.out.println("查无此订单,无法修改!");
				return false;
			}
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try {
			return ordersDButilDao.update(orders);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
	// 根据id,查询某一个订单
	public Orders queryOrdersByNo(int id)
	{
		try {
			return ordersDButilDao.find(id);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	// 查询全部订单
	public List<Orders> queryAllOrderslist()
	{
		try {
			return ordersDButilDao.findAll();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	// 根据id,判断某一个订单是否已经存在
	public boolean isExistByNo(int id)
	{	try {
			return ordersDButilDao.isExistByNo(id);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
}

OrdersDButilDao.java:
public class OrdersDButilDao {
	// 查询所有,返回List集合
	public List findAll() throws SQLException {
		
		QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
	
		String sql = "select * from orders";
		List list = (List) runner.query(sql,
         new BeanListHandler(Orders.class));
		return list;
	}
	// 查询单个,返回对象
	public Orders find(int id) throws SQLException {
		QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
		String sql = "select * from orders where id=?";
		Orders orders = (Orders) runner.query(sql, new BeanHandler(Orders.class), new Object[] { id });
		return orders;
	}
	// 添加用户的操作
	public Boolean insert(Orders orders) throws SQLException {
	
		QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
	
		String sql = "insert into orders (receiverName,receiverAddress,money,receiverPhone) values (?,?,?,?)";
Int num =runner.update(sql,newObject[]{orders.getReceiverName(),
orders.getReceiverAddress(),orders.getMoney(),orders.getReceiverPhone()});
		if (num > 0)
			return true;
		return false;
	}
	// 修改用户的操作
	public Boolean update(Orders orders) throws SQLException {
		QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
		String sql = "update  orders set receiverName=?,receiverAddress=?,money=?,receiverPhone=? where id=?";
		int num = runner.update(sql, new Object[] { orders.getReceiverName(),orders.getReceiverAddress(),orders.getMoney(),orders.getReceiverPhone(),orders.getId() });
		if (num > 0)
			return true;
		return false;
	}
	// 删除用户的操作
	public Boolean delete(int id) throws SQLException {
		QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
		String sql = "delete from orders where id=?";
		int num = runner.update(sql, id);
		if (num > 0)
			return true;
		return false;
	}
	public boolean isExistByNo(int id) throws SQLException {
		boolean isExist = false;
		Orders orders = this.find(id);
		isExist = (orders == null) ? false : true;
		return isExist;
	}
}


(2)


public class Example02 {
	public static DataSource ds = null;
	static {
		Properties prop = new Properties();
		try {
			InputStream in = new Example02().getClass().getClassLoader()
					.getResourceAsStream("dbcpconfig.properties");
			prop.load(in);
			ds = BasicDataSourceFactory.createDataSource(prop);
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	} 
	public static void main(String[] args) throws SQLException {
		Connection conn = ds.getConnection();
		DatabaseMetaData metaData = conn.getMetaData();
         System.out.println(metaData.getURL()
              +",UserName="+metaData.getUserName()   
                    +","+metaData.getDriverName());	
    }
}

(3)


public class Example01 {
	public static DataSource ds = null;
	static {
		// 获取DBCP数据源实现类对象
		BasicDataSource bds = new BasicDataSource();
		// 设置连接数据库需要的配置信息
		bds.setDriverClassName("com.mysql.jdbc.Driver");
		bds.setUrl("jdbc:mysql://localhost:3306/jdbc");
		bds.setUsername("root");
		bds.setPassword("itcast");
		// 设置连接池的参数
		bds.setInitialSize(5);
		bds.setMaxActive(5);
		ds = bds;
	}
	public static void main(String[] args) throws SQLException {
		// 获取数据库连接对象
		Connection conn = ds.getConnection();
		//获取数据库连接信息
		DatabaseMetaData metaData = conn.getMetaData();
		//打印数据库连接信息
		System.out.println(metaData.getURL()
             +",UserName="+metaData.getUserName()
             +","+metaData.getDriverName());
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值