JavaWeb.MVC购物车(第二部分)

前言:接上一篇文章,本篇文章写了订单结算,查看订单,查看订单详情的功能,同时修改了一点上一篇文章的代码,完善了购物车项目,感兴趣的朋友们可以看一看,也希望大家可以为我提一点建议(●'◡'●)。

目录

购物车项目 

运行效果:  

1.业务逻辑层代码的编写

biz(接口)代码

 biz.impl代码

2.数据库访问层代码的编写

dao(接口)代码

dao.impl代码

3.实体类(pojo)代码

4.表示层代码的编写

5.filter的使用

6.jsp界面代码


购物车项目 

 

运行效果:  

我的登陆密码是加密的,在登陆代码里有写 

在首页选择商品加入购物车后点击购物车按钮,跳转页面 

 商品数量可以加减,我这里商品数量有限购条件,有的商品限购五件,点击清空购物车在商品会被全部删除。点击订单结算购物车会被清空,但会生成一个订单项,点击查看订单可以看到。

 

这是生成的订单项 ,点击查看详情可以看到详细的购买记录

 

 这是订单详情

1.业务逻辑层代码的编写

biz(接口)代码

IOrderBiz:


	int maxPK();
	
	int insert(Order order);
	
	List<Order> list(int userId);

IOrderItemBiz:

int maxPk();
	
	int insert(OrderItem item);
	
	List<OrderItem> list(Integer id);

 biz.impl代码

OrderBizImpl:

package com.zking.biz.impl;

import java.util.List;

import com.zking.biz.IOrderBiz;
import com.zking.dao.IOrderDao;
import com.zking.dao.impl.OrderDaoImpl;
import com.zking.pojo.Order;

public class OrderBizImpl implements IOrderBiz{

	private IOrderDao orderDao = new OrderDaoImpl();
			
	
	@Override
	public int maxPK() {
	  return orderDao.maxPK();
	}

	@Override
	public int insert(Order order) {
		return orderDao.insert(order);
	}

	@Override
	public List<Order> list(int userId) {
		return orderDao.list(userId);
	}

}

OrderItemBizImpl:

package com.zking.biz.impl;

import java.util.List;

import com.zking.biz.IOrderItemBiz;
import com.zking.dao.IOrderItemDao;
import com.zking.dao.impl.OrderItemDaoImpl;
import com.zking.pojo.OrderItem;


public class OrderItemBizImpl implements IOrderItemBiz{

	private IOrderItemDao orderItemDao = new OrderItemDaoImpl();
	
	@Override
	public int maxPk() {
		return orderItemDao.maxPk();
	}

	@Override
	public int insert(OrderItem item) {
		return orderItemDao.insert(item);
	}

	@Override
	public List<OrderItem> list(Integer id) {
			return orderItemDao.list(id);
	}


}

2.数据库访问层代码的编写

dao(接口)代码

IOrderDao:

int maxPK();
	
	int insert(Order order);
	
	List<Order> list(int userId);

IOrderItemDao:

int maxPk();
	
	int insert(OrderItem item);
	
	List<OrderItem> list(Integer id);

dao.impl代码

OrderDaoImpl:

package com.zking.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.zking.dao.IOrderDao;
import com.zking.pojo.Order;
import com.zking.utli.DBHelper;

public class OrderDaoImpl implements IOrderDao{

	private Connection con;
	private PreparedStatement ps;
	private ResultSet rs;
	
	@Override
	public int maxPK() {
		try {
            con = DBHelper.getCon();
            ps=con.prepareStatement("select nvl(max(id),0)+1 from car_order ");
            rs=ps.executeQuery();
            if(rs.next()){
             return rs.getInt(1);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBHelper.close(con,ps,rs);
        }
        return 0;
	}

	@Override
	public int insert(Order order) {
		try {
            con = DBHelper.getCon();
            ps=con.prepareStatement("insert into car_order values(?,?,?) ");
            ps.setInt(1, order.getId());
            ps.setInt(2, order.getUserId());
            ps.setInt(3, order.getTotal());
         
           return ps.executeUpdate();
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBHelper.close(con,ps,rs);
        }
		return 0;
	}

	@Override
	public List<Order> list(int userId) {
		List<Order> list = new ArrayList<>();
		try {
            con = DBHelper.getCon();
            ps = con.prepareStatement("select * from car_order where user_id=? ");
            ps.setInt(1, userId);
            rs = ps.executeQuery();
            while(rs.next()) {
            	Order order = new Order();
            	order.setId(rs.getInt(1));
            	order.setUserId(rs.getInt(2));
            	order.setTotal(rs.getInt(3));
            	list.add(order);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBHelper.close(con,ps,rs);
        }
		return list;
	}

}

OrderItemDaoImpl:

package com.zking.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.zking.dao.IGoodsDao;
import com.zking.dao.IOrderItemDao;
import com.zking.pojo.OrderItem;
import com.zking.utli.DBHelper;


public class OrderItemDaoImpl implements IOrderItemDao{

	private IGoodsDao goodsDao = new GoodsDaoImpl();
	
	private Connection con;
	private PreparedStatement ps;
	private ResultSet rs;
	
	@Override
	public int maxPk() {
		try {
            con = DBHelper.getCon();
            ps=con.prepareStatement("select nvl(max(id),0)+1 from car_order_item ");
            rs=ps.executeQuery();
            if(rs.next()){
             return rs.getInt(1);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBHelper.close(con,ps,rs);
        }
        return 0;
	}

	@Override
	public int insert(OrderItem item) {
		try {
            con = DBHelper.getCon();
            ps=con.prepareStatement("insert into car_order_item values(?,?,?,?,?) ");
            ps.setInt(1, item.getId());
            ps.setInt(2, item.getOrderId());
            ps.setInt(3, item.getGoods().getId());
            ps.setInt(4, item.getQuantity());
            ps.setInt(5, item.getTotal());
           return ps.executeUpdate();
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBHelper.close(con,ps,rs);
        }
		return 0;
	}

	@Override
	public List<OrderItem> list(Integer orderId) {
		List<OrderItem> list = new ArrayList<>();
		try {
            con = DBHelper.getCon();
            ps = con.prepareStatement("select * from car_order_item where order_id=? ");
            ps.setInt(1, orderId);
            rs = ps.executeQuery();
            while(rs.next()) {
            	OrderItem item = new OrderItem();
            	item.setId(rs.getInt(1));
            	item.setOrderId(rs.getInt(2));
            	item.setGoods(goodsDao.one(rs.getInt(3)));
            	item.setQuantity(rs.getInt(4));
            	item.setTotal(rs.getInt(5));
            	list.add(item);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBHelper.close(con,ps,rs);
        }
		return list;
	}


}

3.实体类(pojo)代码

Order:

package com.zking.pojo;

public class Order {

	private Integer id;
	private Integer userId;
	private Integer total;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public Integer getTotal() {
		return total;
	}
	public void setTotal(Integer total) {
		this.total = total;
	}
	public Order(Integer id, Integer userId, Integer total) {
		super();
		this.id = id;
		this.userId = userId;
		this.total = total;
	}
	public Order() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Order [id=" + id + ", userId=" + userId + ", total=" + total + "]";
	}
	
	
}

OrderItem:

package com.zking.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

public class OrderItem {

	    private Integer id;
	    private Integer orderId;
	    private Goods goods;
	    private Integer quantity;
	    private Integer total;
		public Integer getId() {
			return id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public Integer getOrderId() {
			return orderId;
		}
		public void setOrderId(Integer orderId) {
			this.orderId = orderId;
		}
		public Goods getGoods() {
			return goods;
		}
		public void setGoods(Goods goods) {
			this.goods = goods;
		}
		public Integer getQuantity() {
			return quantity;
		}
		public void setQuantity(Integer quantity) {
			this.quantity = quantity;
		}
		public Integer getTotal() {
			return total;
		}
		public void setTotal(Integer total) {
			this.total = total;
		}
		public OrderItem(Integer id, Integer orderId, Goods goods, Integer quantity, Integer total) {
			super();
			this.id = id;
			this.orderId = orderId;
			this.goods = goods;
			this.quantity = quantity;
			this.total = total;
		}
		public OrderItem() {
			super();
			// TODO Auto-generated constructor stub
		}
		@Override
		public String toString() {
			return "OrderItem [id=" + id + ", orderId=" + orderId + ", goods=" + goods + ", quantity=" + quantity
					+ ", total=" + total + "]";
		}
	
	    
}

4.表示层代码的编写

CalcServlet:

package com.zking.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 com.zking.biz.IOrderBiz;
import com.zking.biz.IOrderItemBiz;
import com.zking.biz.impl.OrderBizImpl;
import com.zking.biz.impl.OrderItemBizImpl;
import com.zking.pojo.Order;
import com.zking.pojo.OrderItem;
import com.zking.pojo.User;
/**
 * 结算的servlet
 * @author zjjt
 *
 */
@WebServlet("/calc.do")
public class CalcServlet extends HttpServlet{

	    private IOrderBiz orderBiz = new OrderBizImpl();
	    private IOrderItemBiz orderItemBiz = new OrderItemBizImpl();		
	
	    @Override
	    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	        doPost(req, resp);
	    }

	    @Override
	    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	        //购物车在哪里?
	        List<OrderItem> car = (List<OrderItem>)req.getSession().getAttribute("car");
	        //获得用户
	        User user = (User)req.getSession().getAttribute("user");
	        //将数据放到订单
	        if(car.isEmpty()) {
	        	//返回购物车
	        	resp.sendRedirect("car.jsp");
	        	return;
	        }
	        //计算总和
	        int sum=0;
	        for (OrderItem item : car) {
				sum+=item.getTotal();
			}
	        //优先结算订单
	        Order order = new Order();
	        order.setId(orderBiz.maxPK());
	        order.setUserId(user.getId());
	        order.setTotal(sum);
	        //将订单放到数据库
	        int i = orderBiz.insert(order);
	        if(i>0) {
	        	
	        	//如果订单插入成功,则插入订单项
	        	for (OrderItem item : car) {
	        		//item没有id
	        		item.setId(orderItemBiz.maxPk());
	        		//没有订单编号
	        		item.setOrderId(order.getId());
					orderItemBiz.insert(item);
				}
	        }
	        //结算完毕
	        car.clear();
	        //清空价格
	        req.getSession().setAttribute("total", 0);
	        //返回购物车
	        resp.sendRedirect("car.jsp");
	    }	
}

ItemServlet:

package com.zking.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 com.zking.biz.IOrderItemBiz;
import com.zking.biz.impl.OrderItemBizImpl;
import com.zking.pojo.OrderItem;
import com.zking.pojo.User;

@WebServlet("/item.do")
public class ItemServlet extends HttpServlet{

	private IOrderItemBiz orderItemBiz = new OrderItemBizImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //接收订单的id
    	Integer id = Integer.parseInt(req.getParameter("id"));
       //根据订单id查询对应的订单项
       List<OrderItem> list = orderItemBiz.list(id);
       //放到请求作用域中
       req.setAttribute("list", list);
        //返回order.jsp
        req.getRequestDispatcher("item.jsp").forward(req, resp);
    }	
	
}

OrderServlet:

package com.zking.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 com.zking.biz.IOrderBiz;
import com.zking.biz.impl.OrderBizImpl;
import com.zking.pojo.Order;
import com.zking.pojo.User;



@WebServlet("/order.do")
public class OrderServlet extends HttpServlet{

	private IOrderBiz orderBiz = new OrderBizImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得用户
        User user = (User)req.getSession().getAttribute("user");
       List<Order> list = orderBiz.list(user.getId());
       //放到请求作用域中
       req.setAttribute("list", list);
        //返回order.jsp
        req.getRequestDispatcher("order.jsp").forward(req, resp);
    }	
	
}

5.filter的使用

这一篇文章我修改了filter的使用

package com.zking.filter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebFilter("/*")//所有的请求都会被拦截
public class LoginFilter implements Filter{

	//如果登陆了 正常通行
	//如果没有登陆 返回登陆页面
	//集合中放你不需要拦截的路径
	List<String> list = new ArrayList<>();
	{
		list.add("/login.jsp");
		list.add("login.do");
		list.add(".css");
		list.add(".js");
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//有一些页面需要放行【login.do】
		//强转
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		//拿到路径
		String path = req.getServletPath();
		//判断访问路径是否在list集合中
		boolean f = false;
        for (String p : list) {
			if(path.endsWith(p)) {//是否以p结尾
				f = true;
				break;
			}
		}
		//如果存在list集合中,就放行
		if(f) {
			chain.doFilter(request, response);//放行
			return;
		}
		// 判断是否通行【有没有登陆:session中是否有user属性】
		Object user = req.getSession().getAttribute("user");
		if(user == null) {
			resp.sendRedirect("login.jsp");
			return;
		}else {
			chain.doFilter(request, response);//放行
		}
	}
}

6.jsp界面代码

car.jsp(购物车页面):

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css">
<script src="bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
<script src="bootstrap-3.3.7-dist\js\bootstrap.js"></script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>我的购物车</title>
</head>
<body>
<div class="container">
	<h1>
		${user.account},您好, <small>这是首页</small>
	</h1>
	<h1>
		<a href="index.jsp"  class="btn btn-default">继续购买</a>
		<a href="calc.do"  class="btn btn-default">订单结算</a>
		<a href="order.do"  class="btn btn-default">查看订单</a>
		 <a href="clear.do" class="btn btn-default">清空🛒</a>
	</h1>
	<table class="table table-bordered table-striped">
		<tbody>
		<tr>
			<th>商品编号</th>
			<th>商品名称</th>
			<th>商品数量</th>
			<th>商品总价</th>
			<th>商品操作</th>
		</tr>
		<c:forEach items="${car}" var="item">
		<tr>
			<td>${item.goods.id}</td>
			<td>${item.goods.name}</td>
			<td>${item.quantity}</td>
			<td>${item.total}</td>
			<td>
			     <a href="del.do?id=${item.goods.id}" class="btn btn-default">删除</a>
			     <a href="upd.do?id=${item.goods.id}&type=1" class="btn btn-default">+1</a>
			     <a href="upd.do?id=${item.goods.id}&type=-1" class="btn btn-default">-1</a>
			</td>
		</tr>
		</c:forEach>
	</tbody>
	</table>
	 <h1>
        总价: ${total}
    </h1>
	</div>

</body>
</html>

Item.jsp(查看订单详情页面):

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${list == null}">
    <c:redirect url="item.do"/>
</c:if>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css">
    <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
    <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>我的订单项</title>
</head>
<body>
<div class="container">
    <h1>
        ${user.account},您好, <small>这是订单项界面</small>
    </h1>
    <h1>
        <a href="index.jsp" class="btn btn-default">继续购买</a>
        <a href="car.jsp" class="btn btn-default">返回购物车</a>
    </h1>
    <table class="table table-bordered table-striped">
        <tbody>
        <tr>
            <th>订单项编号</th>
            <th>订单项商品名称</th>
            <th>订单项商品单价</th>
            <th>订单项下单数量</th>
            <th>订单项下单总价</th>
        </tr>
        <c:forEach items="${list}" var="item">
        <tr>
            <td>${item.id}</td>
            <td>${item.goods.name}</td>
            <td>${item.goods.price}</td>
            <td>${item.quantity}</td>
            <td>${item.total}</td>
        </tr>
        </c:forEach>
        </tbody>
    </table>
</div>
</body>
</html>

order.jsp(订单页面):

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${list == null}">
    <c:redirect url="order.do"/>
</c:if>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css">
    <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
    <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>我的订单</title>
</head>
<body>

<div class="container">

    <h1>
        ${user.account},您好, <small>这是订单界面</small>
    </h1>
    <h1>
        <a href="index.jsp" class="btn btn-default">继续购买</a>
        <a href="car.jsp" class="btn btn-default">返回购物车</a>
    </h1>
    <table class="table table-bordered table-striped">
        <tbody>
        <tr>
            <th>订单编号</th>
            <th>订单总价</th>
            <th>订单操作</th>
        </tr>
        <c:forEach items="${list}" var="order">
        <tr>
            <td>${order.id}</td>
            <td>${order.total}</td>
            <td>
                <a href="item.do?id=${order.id}" class="btn btn-default">查看详情</a>
            </td>
        </tr>
        </c:forEach>
        </tbody>
    </table>

</div>

</body>
</html>

这个购物车项目算是写完了,欢迎各位大佬为我提一点建议,这篇文章就到这里结束了

  • 31
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 36
    评论
适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值