基于javaweb+mysql的jsp+servlet仿天猫网上商城项目(java+jsp+servlet+mysql+ajax)

基于javaweb+mysql的jsp+servlet仿天猫网上商城项目(java+jsp+servlet+mysql+ajax)

运行环境

Java≥8、MySQL≥5.7、Tomcat≥8

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

基于javaweb+mysql的JSP+Servlet仿天猫网上商城项目(java+jsp+servlet+mysql+ajax)

一、项目简述

功能:

前台:

  • 用户模块

  • 分类模块

  • 商品模块

  • 购物车模块

  • 订单模块

后台:

  • 管理员模块

  • 分类管理模块

  • 商品管理模块

  • 订单模块

二、项目运行

环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持)

项目技术: JSP + C3P0+ Servlert + html+ css + JavaScript + JQuery + Ajax + Fileupload等等。

        productDAO.add(p);
        return "@admin_product_list?cid=" + cid;
    }

    @Override
    public String delete(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了Product delete方法");

        int id = Integer.parseInt(request.getParameter("id"));
        Product p = productDAO.get(id);
        productDAO.delete(id);
        return "@admin_product_list?cid=" + p.getCategory().getId();
    }

    @Override
    public String update(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了Product update方法");

        Map<String, String> params = new HashMap<>();
        InputStream inputStream = super.parseUpload(request, params);

        int cid = Integer.parseInt(params.get("cid"));
        Category c = categoryDAO.get(cid);

        int id = Integer.parseInt(params.get("id"));
        String name = params.get("name");
        String subTitle = params.get("subTitle");
        float originalPrice = Float.parseFloat(params.get("originalPrice"));
        float promotePrice = Float.parseFloat(params.get("promotePrice"));
        int stock = Integer.parseInt(params.get("stock"));

        Product p = new Product();

        p.setId(id);
        p.setName(name);
        p.setSubTitle(subTitle);
        p.setOriginalPrice(originalPrice);
        p.setPromotePrice(promotePrice);
        p.setStock(stock);
        p.setCategory(c);
        p.setCreateDate(new Date());

        productDAO.update(p);
        return "@admin_product_list?cid=" + p.getCategory().getId();
    }

    @Override
    public String edit(HttpServletRequest request, HttpServletResponse response, Page page) {
        }
        return "@admin_category_list";
    }

    @Override
    public String delete(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了category delete方法");
        int id = Integer.parseInt(request.getParameter("id"));
        categoryDAO.delete(id);
        return "@admin_category_list";
    }

    @Override
    public String update(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了category update方法");

        Map<String,String> params = new HashMap<>();
        InputStream is = super.parseUpload(request, params);

        System.out.println(params);
        String name = params.get("name");
        int id = Integer.parseInt(params.get("id"));

        Category c = new Category();
        c.setName(name);
        c.setId(id);
        categoryDAO.update(c);

        File imageFolder = new File(request.getSession().getServletContext().getRealPath("img/category"));
        File file = new File(imageFolder, c.getId() + ".jpg");

        try{
            if(null != is && 0 != is.available()){
                try(
                        FileOutputStream fos = new FileOutputStream(file);
                ){
                    byte[] b = new byte[1024 * 1024];
                    int length = 0;
                    while(-1 != (length = is.read(b))){
                        fos.write(b, 0, length);
                    }
                    fos.flush();
                    //通过以下代码,将文件保存为jsp格式
                    BufferedImage img = ImageUtil.change2jpg(file);
                    ImageIO.write(img, "jpg", file);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

public class BackServletFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        String contextPath = req.getSession().getServletContext().getContextPath();
        String uri = req.getRequestURI();
        //去除uri路径中的项目路径
        uri = StringUtils.remove(uri, contextPath);
        //判断是否为admin_开头
        if(uri.startsWith("/admin_")) {
            String servletPath = StringUtils.substringBetween(uri, "_", "_") +
                    "Servlet";
            String method = StringUtils.substringAfterLast(uri, "_");
            req.setAttribute("method", method);
            req.getRequestDispatcher("/" + servletPath).forward(req, resp);
            return;
        }

        filterChain.doFilter(req, resp);

    }

    @Override
    public void destroy() {

    }
}
package filter;

     * 分类页面
     *
     * @return
     */
    public String category(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了ForeServlet category方法");

        int cid = Integer.parseInt(request.getParameter("cid"));

        // 获取分类对象并为填充产品对象、销量、评价
        Category c = new CategoryDAO().get(cid);
        new ProductDAO().fill(c);
        new ProductDAO().setSaleAndReviewNumber(c.getProducts());

        // 根据获取的排序方式进行排序
        String sort = request.getParameter("sort");
        if (null != sort) {
            switch (sort) {
                case "review":
                    Collections.sort(c.getProducts(), new ProductReviewComparator());
                    break;
                case "date":
                    Collections.sort(c.getProducts(), new ProductDateComparator());
                    break;
                case "saleCount":
                    Collections.sort(c.getProducts(), new ProductSaleCountComparator());
                    break;
                case "price":
                    Collections.sort(c.getProducts(), new ProductPriceComparator());
                    break;
                case "all":
                    Collections.sort(c.getProducts(), new ProductAllComparator());
                    break;
            }
        }

        // 排序完成后,将分类对象添加到域对象 request 中
        request.setAttribute("c", c);
        return "category.jsp";
    }

    /**
     * 搜索功能
     *
     * @param request
     * @param response
     * @param page
     * @return
     */
    public String search(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了ForeServlet search方法");

        // 根据上传的参数生成对应的ProductImage对象
        String type = params.get("type");
        int pid = Integer.parseInt(params.get("pid"));
        Product p = productDAO.get(pid);

        // 生成产品图片对象
        ProductImage pi = new ProductImage();
        pi.setType(type);
        pi.setProduct(p);
        productImageDAO.add(pi);

        // 生成文件
        String filename = pi.getId() + ".jpg";
        String imageFolder = null;
        String imageFolder_small = null;
        String imageFolder_middle = null;

        if(productImageDAO.type_single.equals(pi.getType())){
            imageFolder = request.getSession().getServletContext().getRealPath("img/productSingle");
            imageFolder_small = request.getSession().getServletContext().getRealPath("img/productSingle_small");
            imageFolder_middle = request.getSession().getServletContext().getRealPath("img/productSingle_middle");
        } else {
            imageFolder = request.getSession().getServletContext().getRealPath("img/productDetail");
        }

        File f = new File(imageFolder, filename);
        f.getParentFile().mkdirs();

        // 复制文件
        try{
            if(null != is && 0 != is.available()){
                try(
                        FileOutputStream fos = new FileOutputStream(f);
                        ){
                    byte[] b = new byte[1024 * 1024];
                    int length = 0;

                    while(-1 != (length = is.read(b))){
                        fos.write(b, 0, length);
                    }
                    fos.flush();
        request.setAttribute("page", page);

        return "admin/listProduct.jsp";
    }
}
package servlet;

public abstract class BaseBackServlet extends HttpServlet {

    /* 添加 */
    public abstract String add(HttpServletRequest request, HttpServletResponse response, Page page);
    /* 删除 */
    public abstract String delete(HttpServletRequest request, HttpServletResponse response, Page page);
    /* 更新 */
    public abstract String update(HttpServletRequest request, HttpServletResponse response, Page page);
    /* 修改 */
    public abstract String edit(HttpServletRequest request, HttpServletResponse response, Page page);
    /* 显示 */
    public abstract String list(HttpServletRequest request, HttpServletResponse response, Page page);

            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return is;
    }

}
package servlet;

public class CategoryServlet extends BaseBackServlet {

    @Override
    public String add(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了category add方法");

        Map<String,String> params = new HashMap<>();
        InputStream is = super.parseUpload(request, params);

        System.out.println(params);
        String name = params.get("name");
        Category c = new Category();
        c.setName(name);
        categoryDAO.add(c);

        File imageFolder = new File(request.getSession().getServletContext().getRealPath("img/category"));
        File file = new File(imageFolder, c.getId() + ".jpg");

        try{
            if(null != is && 0 != is.available()){
                try(
                        FileOutputStream fos = new FileOutputStream(file);
                        ){
                    byte[] b = new byte[1024 * 1024];
                    int length = 0;
                    while(-1 != (length = is.read(b))){

        request.setAttribute("p", p);
        request.setAttribute("pisSingle", pisSingle);
        request.setAttribute("pisDetail", pisDetail);

        return "admin/listProductImage.jsp";
    }
}
package servlet;

public class ProductServlet extends BaseBackServlet {

    @Override
    public String add(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了Product add方法");

        Map<String, String> params = new HashMap<>();
        InputStream inputStream = super.parseUpload(request, params);
        System.out.println(params);

        int cid = Integer.parseInt(params.get("cid"));
        Category c = categoryDAO.get(cid);

        String name = params.get("name");
        String subTitle = params.get("subTitle");
        float originalPrice = Float.parseFloat(params.get("originalPrice"));
        float promotePrice = Float.parseFloat(params.get("promotePrice"));
        int stock = Integer.parseInt(params.get("stock"));

        Product p = new Product();

public class OrderServlet extends BaseBackServlet {

    @Override
    public String add(HttpServletRequest request, HttpServletResponse response, Page page) {
        return null;
    }

    @Override
    public String delete(HttpServletRequest request, HttpServletResponse response, Page page) {
        return null;
    }

    @Override
    public String update(HttpServletRequest request, HttpServletResponse response, Page page) {
        return null;
    }

    @Override
    public String edit(HttpServletRequest request, HttpServletResponse response, Page page) {
        return null;
    }

    public String delivery(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了 OrderServlet delivery方法");

        int id = Integer.parseInt(request.getParameter("id"));
        Order o = orderDAO.get(id);
        o.setDeliveryDate(new Date());
        o.setStatus(OrderDAO.waitConfirm);
        orderDAO.update(o);
        return "@admin_order_list";
    }

    @Override
    public String list(HttpServletRequest request, HttpServletResponse response, Page page) {
        // 获取产品属性信息
        List<PropertyValue> pvs = propertyValueDAO.list(p.getId());

        // 获取产品评价信息
        List<Review> reviews = reviewDAO.list(p.getId());

        // 设置产品销量数和评价数
        productDAO.setSaleAndReviewNumber(p);

        request.setAttribute("p", p);
        request.setAttribute("pvs", pvs);
        request.setAttribute("reviews", reviews);

        return "product.jsp";
    }

    /**
     * 分类页面
     *
     * @return
     */
    public String category(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了ForeServlet category方法");

        int cid = Integer.parseInt(request.getParameter("cid"));

        // 获取分类对象并为填充产品对象、销量、评价
        Category c = new CategoryDAO().get(cid);
        new ProductDAO().fill(c);
        new ProductDAO().setSaleAndReviewNumber(c.getProducts());

        // 根据获取的排序方式进行排序
        String sort = request.getParameter("sort");
        if (null != sort) {
            switch (sort) {
                case "review":
                    Collections.sort(c.getProducts(), new ProductReviewComparator());
                    break;
                case "date":
                    Collections.sort(c.getProducts(), new ProductDateComparator());
                    break;
                case "saleCount":
                    Collections.sort(c.getProducts(), new ProductSaleCountComparator());
        order.setReceiver(reciver);
        order.setMobile(mobile);
        order.setUserMessage("默认内容");
        order.setCreateDate(new Date());
        order.setUser(user);
        order.setStatus(OrderDAO.waitPay);

        orderDAO.add(order);

        // 统计总金额并设置每个订单项的所属订单
        float total = 0;
        for (OrderItem oi : ois) {
            oi.setOrder(order);
            orderItemDAO.update(oi);

            total += oi.getProduct().getPromotePrice() * oi.getNumber();
        }

        return "@forealipay?oid=" + order.getId() + "&total=" + total;
    }

    /**
     * 支付界面
     *
     * @param request
     * @param response
     * @param page
     * @return
     */
    public String alipay(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了ForeServlet alipay方法");

        return "alipay.jsp";
    }

    /**
     * 支付完成界面
     * @param request
     * @param response
     * @param page
     * @return
     */
            String imageFolder_single = request.getSession().getServletContext().getRealPath("img/productSingle");
            String imageFolder_small =  request.getSession().getServletContext().getRealPath("img/productSingle_small");
            String imageFolder_middle = request.getSession().getServletContext().getRealPath("img/productSingle_middle");

            File f_single = new File(imageFolder_single, pi.getId() + ".jpg");
            File f_small = new File(imageFolder_small, pi.getId() + ".jpg");
            File f_middle = new File(imageFolder_middle, pi.getId() + ".jpg");
         //   f_single.delete();
          //  f_small.delete();
          //  f_middle.delete();
        } else {
            String imageFolder_detail = request.getSession().getServletContext().getRealPath("img/productDetail");
            File f_detail = new File(imageFolder_detail, pi.getId() + ".jpg");
         //   f_detail.delete();
        }

        return "@admin_productImage_list?pid=" + pi.getProduct().getId();
    }

    @Override
    public String update(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了 ProductImageServlet update方法");
        return "";
    }

    @Override
    public String edit(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了 ProductImageServlet edit方法");
        return "";
    }

    @Override
    public String list(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了 ProductImageServlet list方法");

        int pid = Integer.parseInt(request.getParameter("pid"));
        Product p = productDAO.get(pid);

        List<ProductImage> pisSingle = productImageDAO.list(p, ProductImageDAO.type_single);
        List<ProductImage> pisDetail = productImageDAO.list(p, ProductImageDAO.type_detail);

        request.setAttribute("p", p);
        request.setAttribute("pisSingle", pisSingle);
        request.setAttribute("pisDetail", pisDetail);

        return "admin/listProductImage.jsp";
    }
}
package servlet;
            String redirect = m.invoke(this, req, resp, page).toString();

            /* 根据方法的返回值,进行相应的客户端、服务端跳转,或仅输出字符串 */
            if(redirect.startsWith("@")){
                resp.sendRedirect(redirect.substring(1));
            } else if(redirect.startsWith("%")){
                resp.getWriter().print(redirect.substring(1));
            } else {
                req.getRequestDispatcher(redirect).forward(req, resp);
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    public InputStream parseUpload(HttpServletRequest request, Map<String, String> params){
        InputStream is = null;
        try{
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            //设置上传的文件大小限制为10M
            factory.setSizeThreshold(1024 * 1024);

            List items = upload.parseRequest(request);
            Iterator iter = items.iterator();

            while(iter.hasNext()){
                FileItem item = (FileItem) iter.next();
                if(!item.isFormField()){
                    //获取上传文件的输入流
                    is = item.getInputStream();
                } else {
                    String paramName = item.getFieldName();
                    String paramValue = item.getString();
                    paramValue = new String(paramValue.getBytes("ISO-8859-1"), "UTF-8");
                    params.put(paramName, paramValue);
                }
            }

        } catch (FileUploadException e) {
            e.printStackTrace();

public class ForeServletFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        String contextPath = request.getSession().getServletContext().getContextPath();
        request.getSession().getServletContext().setAttribute("contextPath", contextPath);

        // 从Session对象获取用户信息、购物车信息等
//        User user = (User) request.getSession().getAttribute("user");
//        int cartTotalItemNumber = 0;
//        if(null != user) {
//            List<OrderItem> ois = new OrderItemDAO().listByUser(user.getId());
//            for(OrderItem oi : ois) {
//                cartTotalItemNumber += oi.getNumber();
//            }
//        }
//        request.setAttribute("cartTotalItemNumber", cartTotalItemNumber);

        // 简单搜索栏下显示分类链接
//        List<Category> cs = (List<Category>) request.getAttribute("cs");
//        if(null == cs) {
//            cs = new CategoryDAO().list();
//            request.setAttribute("cs", cs);
//        }

        String uri = request.getRequestURI();
        // 去除uri路径中的项目路径
        uri = StringUtils.remove(uri, contextPath);
        // 判断是否以/fore开头
        if(uri.startsWith("/fore") && !uri.startsWith("/foreServlet")) {
            String method = StringUtils.substringAfterLast(uri, "/fore");
            request.setAttribute("method", method);
            request.getRequestDispatcher("/foreServlet").forward(request, response);
            return;
        }

        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {

    }

    /**
     * 创建订单
     *
     * @param request
     * @param response
     * @param page
     * @return
     * @throws UnsupportedEncodingException
     */
    public String createOrder(HttpServletRequest request, HttpServletResponse response, Page page) throws UnsupportedEncodingException {
        System.out.println("调用了ForeServlet createOrder方法");

        // 防止post方法中文乱码
        request.setCharacterEncoding("UTF-8");

        User user = (User) request.getSession().getAttribute("user");

        List<OrderItem> ois = (List<OrderItem>) request.getSession().getAttribute("ois");
        if (ois.isEmpty())
            return "@login.jsp";

        String address = request.getParameter("address");
        String post = request.getParameter("post");
        String reciver = request.getParameter("reciver");
        String mobile = request.getParameter("mobile");

        Order order = new Order();
        String orderCode = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());

        order.setOrderCode(orderCode);
        order.setAddress(address);
        order.setPost(post);
        order.setReceiver(reciver);
        order.setMobile(mobile);
        order.setUserMessage("默认内容");
        order.setCreateDate(new Date());
        order.setUser(user);
        order.setStatus(OrderDAO.waitPay);

        orderDAO.add(order);

        // 统计总金额并设置每个订单项的所属订单
        float total = 0;
        for (OrderItem oi : ois) {
            oi.setOrder(order);
            orderItemDAO.update(oi);

            total += oi.getProduct().getPromotePrice() * oi.getNumber();
        }

        return "@forealipay?oid=" + order.getId() + "&total=" + total;
    }

     *
     * @param request
     * @param response
     * @param page
     * @return
     */
    public String product(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了 ForeServlet product方法");

        int pid = Integer.parseInt(request.getParameter("pid"));
        Product p = productDAO.get(pid);

        // 获取产品的single图片和detail图片
        List<ProductImage> productSingleImages = productImageDAO.list(p, ProductImageDAO.type_single);
        List<ProductImage> productDetailImages = productImageDAO.list(p, ProductImageDAO.type_detail);
        p.setProductSingleImages(productSingleImages);
        p.setProductDetailImages(productDetailImages);
        //p.setFirstProductImage(productSingleImages.get(0));

        // 获取产品属性信息
        List<PropertyValue> pvs = propertyValueDAO.list(p.getId());

        // 获取产品评价信息
        List<Review> reviews = reviewDAO.list(p.getId());

        // 设置产品销量数和评价数
        productDAO.setSaleAndReviewNumber(p);

        request.setAttribute("p", p);
        request.setAttribute("pvs", pvs);
        request.setAttribute("reviews", reviews);

        return "product.jsp";
    }

    /**
     * 分类页面
     *
     * @return
     */
    public String category(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了ForeServlet category方法");

        int cid = Integer.parseInt(request.getParameter("cid"));

        // 获取分类对象并为填充产品对象、销量、评价
        Category c = new CategoryDAO().get(cid);
        new ProductDAO().fill(c);
        new ProductDAO().setSaleAndReviewNumber(c.getProducts());

        // 根据获取的排序方式进行排序
        String sort = request.getParameter("sort");
    }

    @Override
    public String edit(HttpServletRequest request, HttpServletResponse response, Page page) {
        System.out.println("调用了Product edit方法");

        int id =Integer.parseInt(request.getParameter("id"));
        Product p = productDAO.get(id);
        request.setAttribute("p",p);
        return "admin/editProduct.jsp";
    }

    public String updatePropertyValue(HttpServletRequest request, HttpServletResponse response, Page page){
        System.out.println("调用了Product updatePropertyValue方法");

        int  pvid = Integer.parseInt(request.getParameter("pvid"));
        String value = request.getParameter("value");

        PropertyValue pv = propertyValueDAO.get(pvid);
        pv.setValue(value);

        propertyValueDAO.update(pv);

        return "%success";
    }

    public String editPropertyValue(HttpServletRequest request, HttpServletResponse response, Page page){
        System.out.println("调用了Product editPropertyValue方法");

        int id = Integer.parseInt(request.getParameter("id"));
        Product p = productDAO.get(id);
        request.setAttribute("p", p);

        // 初始化属性,将产品对应的属性全部
        propertyValueDAO.init(p);

        List<PropertyValue> pvs = propertyValueDAO.list(p.getId());

        request.setAttribute("pvs", pvs);

        return "admin/editPropertyValue.jsp";
     * @param page
     * @return
     * @throws UnsupportedEncodingException
     */
    public String changeOrderItem(HttpServletRequest request, HttpServletResponse response, Page page) throws UnsupportedEncodingException {
        System.out.println("调用了ForeServlet changeOrderItem方法");

        User user = (User) request.getSession().getAttribute("user");
        if (null == user)
            return "%fail";

        int pid = Integer.parseInt(request.getParameter("pid"));
        int number = Integer.parseInt(request.getParameter("number"));
        List<OrderItem> ois = orderItemDAO.listByUser(user.getId());
        for (OrderItem oi : ois) {
            if (oi.getProduct().getId() == pid) {
                oi.setNumber(number);
                orderItemDAO.update(oi);
                break;
            }
        }
        return "%success";
    }

    /**
     * 删除订单项
     *
     * @param request
     * @param response
     * @param page
     * @return
     * @throws UnsupportedEncodingException
     */
    public String deleteOrderItem(HttpServletRequest request, HttpServletResponse response, Page page) throws UnsupportedEncodingException {
        System.out.println("调用了ForeServlet deleteOrderItem方法");

        User user = (User) request.getSession().getAttribute("user");
        if (null == user)
            return "%fail";

        int oiid = Integer.parseInt(request.getParameter("oiid"));
        orderItemDAO.delete(oiid);
        return "%success";
    }

    /**
     * 创建订单
     *

请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值