javaWeb之后端ServIet进行数据库的更新和验证码的添加

一一、对数据库的更新:

一、流程:

      在展示页面中的更新id传到后端获取这条id所对应的数据并将数据回显到前端所展示的页面上的表单上,然后用户对其修改,修改后将前端的页面的数据传到后端完成对数据的更新,再将更新后的数据传递给数据库。

      先根据id查询数据库中的这条信息,查到后回显到对应的页面的表单的内容上,再让用户对其修改,再将修改的内容传递到后端后提交给数据库端。

二、注解接口代码:

    @Update("update student set name=#{name},sex=#{sex},age=#{age},major=#{major},time=# 
    {time}where id=#{id}")
    int updateStudent(Student student);
    @Select("select * from student where id=#{id}")
    Student selectById(String id);

三、前端展示页面的代码:

import Model.Student;

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 java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

@WebServlet("/showlist")
public class showlist extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doPost(req, resp);
    }

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

        List<Student> all = (List<Student>)req.getAttribute("all");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter stu = resp.getWriter();
        stu.write("<!Doctype html>");
        stu.write("<html lang='en'>");
        stu.write("<head>");
        stu.write("<meta charset='utf-8'>");
        stu.write("<meta name='viewport',content='width=device-width,initial-scale=1.0'>");
        stu.write("<title>学生信息管理</title>");
        stu.write("<style>");
        stu.write("body { font-family: '微软雅黑'; background-color: #e0f7fa; margin: 0; padding: 0; display: flex; justify-content: center; align-items: center; margin-top: 150px; }");
        stu.write(".container { background-color: #ffffff; padding: 30px; border-radius: 12px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); width: 90%; max-width: 800px; text-align: center; }");
        stu.write("h1 { color: #00796b; margin-bottom: 20px; }");
        stu.write(".btn { display: block; width: 100%; padding: 12px; margin: 10px 0; font-size: 18px; color: #ffffff; background-color: #00796b; border: none; border-radius: 6px; cursor: pointer; }");
        stu.write(".btn:hover { background-color: #004d40; }");
        stu.write("table { width: 100%; border-collapse: collapse; margin-top: 20px; }");
        stu.write("th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }");
        stu.write("th { background-color: #e0f7fa; color: black; }");
        stu.write("tr:nth-child(even) { background-color: lightyellow; }");
        stu.write("tr:hover { background-color: #e0f7fa; }");
        stu.write("</style>");
        stu.write("</head>");
        stu.write("<body>");
        stu.write("<div class='container'>");
        stu.write("<h1>学生信息管理</h1>");
        stu.write("<div><a href='insert'>添加信息</a></div>");


        // 显示学生信息表格
        stu.write("<table>");
        stu.write("<tr><th>id</th><th>姓名</th><th>性别</th><th>年龄</th><th>专业</th><th>时间</th><th>操作一</th><th>操作二</th></tr>");
        for (int i = 0; i < all.size(); i++) {
            stu.write("<tr>");
            stu.write("<td>"+all.get(i).getId()+"</td>");
            stu.write("<td>");
            stu.write(all.get(i).getName());
            stu.write("</td>");
            stu.write("<td>");
            stu.write(all.get(i).getSex());
            stu.write("</td>");
            stu.write("<td>"+all.get(i).getAge()+"</td>");
            stu.write("<td>");
            stu.write(all.get(i).getMajor());
            stu.write("</td>");
            stu.write("<td>");
            stu.write(all.get(i).getTime());
            stu.write("</td>");
            stu.write("<td>");
            stu.write("<a onclick=\"if(confirm('确定删除吗?')) return true; return false;\" href=delone?id="+all.get(i).getId()+">删除</a>");
            stu.write("</td>");
            stu.write("<td>");
            stu.write("<a href=updateUi?id="+all.get(i).getId()+">更新</a>");//更新的代码
            stu.write("</td>");
            stu.write("</tr>");
        }
        stu.write("</table>");
        stu.write("</div>");
        stu.write("</body>");
        stu.write("</html>");
    }
}

四、UI层更新后端动态页面代码:


import Dao.StudentDao;
import Model.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

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 java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

@WebServlet("/updateUi")
public class UpdateUI extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        PrintWriter writer = resp.getWriter();
        String id = req.getParameter("id");
        System.out.println("id = " + id);
        InputStream in = null;
        SqlSession sqlSession = null;
        try {
            in = Resources.getResourceAsStream("config/mybatis_config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
            sqlSession = sqlSessionFactory.openSession();
            StudentDao mapper = sqlSession.getMapper(StudentDao.class);

            Student student = mapper.selectById(id);
            String sname = student.getName();
            String ssex = student.getSex();
            Integer sage = (Integer.valueOf(student.getAge()));
            String smajor = student.getMajor();
            String stime = student.getTime();

            writer.write("<!DOCTYPE html>");
            writer.write("<html>");
            writer.write("<head>");
            writer.write("<meta charset='UTF-8'>");
            writer.write("<meta name='viewport' content='width=device-width, initial-scale=1.0'>");
            writer.write("<title>修改学生信息</title>");
            writer.write("<style>");
            writer.write("body { font-family:'微软雅黑'; background-color:#e0f7fa; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; }");
            writer.write(".container { background-color: #fff; padding: 20px; border-radius: 10px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); width: 35%; text-align: center;height:76%; }");
            writer.write("h1 { color: #00796b;margin-bottom: 50px; }");
            writer.write("label { display: block; margin-bottom: 5px; font-weight: bold; }");
            writer.write("input[type='text'] { padding: 14px; font-size: large; border: 1px solid #ccc; border-radius: 5px;margin-bottom: 20px;}");
            writer.write(".btn { display: inline-block; width: 100px; padding: 10px; margin-top: 40px; margin-left: 30px; font-size: 16px; color: #fff; background-color: #4CAF50; border: none; border-radius: 5px; cursor: pointer; text-decoration: none; }");
            writer.write(".btn:hover { background-color: #45a049; }");
            writer.write(".btn-reset { background-color: #f44336; }");
            writer.write(".btn-reset:hover { background-color: #e53935; }");
            writer.write("span { width: 100px; text-align:center; margin-right: 10px;font-size: large; }");
            writer.write("</style>");
            writer.write("</head>");
            writer.write("<body>");
            writer.write("<div class='container'>");
            writer.write("<h1>修改学生信息</h1>");
            writer.write("<form action='updateok' method='post'>");
            writer.write("<span>学号:</span><input type='text' name='id' value='" + id + "' readonly><br>");
            writer.write("<span>姓名:</span><input type='text' name='sname' value='" + sname + "'><br>");
            writer.write("<span>性别:</span><input type='text' name='ssex' value='" + ssex + "'><br>");
            writer.write("<span>年龄:</span><input type='text' name='sage' value='" + sage + "'><br>");
            writer.write("<span>专业:</span><input type='text' name='smajor' value='" + smajor + "'><br>");
            writer.write("<span>时间:</span><input type='text' name='stime' value='" + stime + "'><br>");
            writer.write("<button type='submit' class='btn'>提交</button>");
            writer.write("<button type='reset' class='btn btn-reset'>重置</button>");
            writer.write("</form>");
            writer.write("</div>");
            writer.write("</body>");
            writer.write("</html>");
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
            if (in != null) {
                in.close();
            }
        }
    }
}

五、ServIet层更新后端动态页面代码:


import Dao.StudentDao;
import Model.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

@WebServlet("/updateok")
public class UpdateOk extends HttpServlet {


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

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        String id = req.getParameter("id") ;
        String sname = req.getParameter("sname");
        String ssex = req.getParameter("ssex");
        String sage = req.getParameter("sage");
        String smajor = req.getParameter("smajor");
        String stime = req.getParameter("stime");
        Student student = new Student();
        student.setName(sname);
        student.setSex(ssex);
        student.setAge(Integer.valueOf(sage));
        student.setMajor(smajor);
        student.setTime(stime);
        student.setId(Integer.valueOf(id));
        //根据学号获取学生信息
        InputStream in = Resources.getResourceAsStream("config/mybatis_config.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(in);//构建工厂
        SqlSession sqlSession = build.openSession();//参数为true时,自动提交事务
        StudentDao mapper = sqlSession.getMapper(StudentDao.class);//获取接口的实现类
        int i = mapper.updateStudent(student);
        System.out.println("i = " + i);
        sqlSession.commit();
        Commit(req, resp, sqlSession, mapper, i);
    }

    static void Commit(HttpServletRequest req, HttpServletResponse resp, SqlSession sqlSession, StudentDao mapper, int i) throws ServletException, IOException {
        sqlSession.commit();
        List<Student> all = mapper.findAll();
        req.setAttribute("all",all);
        req.getRequestDispatcher("/showlist").forward(req,resp);

    }
}

六、所需javaBean和数据库可以自由选择,其他所需文件都可以接上篇内容,其中有详解代码和内容

二二、登录页面验证码的添加:

一.了解Session:

1.什么是 Session 对话:

      Session 是一个 Java 中的接口(HttpSession)。Session 就是会话,用来维护一个客户端和服务器之间关联的一种技术。每个客户端都有一个自己的 Session 会话。Session 会话中,我们经常用来保存用户登录后的信息,前面的 Cookie 是保存在客户端,而 Session 是保存在服务器端。

2、Session 的创建和获取

(1)创建和获取 Session,都是通过 request.getSession() 来实现的。

第一次调用:创建 Session 对象;之后的调用:获取之前创建好的 Session 会话对象。

(2)可以用 isNew() 方法来判断一个 Session 是不是刚创建出来的。

true:表示刚创建;   false:表示获取之前创建

(3)每个会话都有一个身份证号,也就是 ID 值,且这个 ID 唯一。getId() 方法获取 Session 对象的 ID 值

3.在目录添加jar包,详细内容如下:

4.测试片段:

代码片段一:
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/arequest")
public class Session1  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //1.开启会话,创建一个会话对象
        HttpSession session = req.getSession();
        //2.会话管理中设置数据,键值对
        session.setAttribute("ok","学习java");
        session.setAttribute("ok1","学习php");
        //3.获取当前值
        System.out.println("session.getAttribute(\"ok\") = " + session.getAttribute("ok"));
        System.out.println("session.getAttribute(\"ok1\") = " + session.getAttribute("ok1"));
    }
}

当搭建好一个基本的Maven环境和web项目之后,装入Tomcat,并且确保可以正常运行时,在Java中创建一个Java类文件,对上述代码进行测试在其对应的服务器网址输入所对应的@WebServlet("/arequest")中的斜杠后内容,再查看后台是否收到此请求内容

测试代码二和测试代码三可以发现,在发出请求后,控制台并没有收到相应的内容,在先发出测试代码一所对应的内容时,在发出其他两个请求就可以收到相应的内容

代码片段二:

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/arequest1")
public class Session2  extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
       //开启会话,向下转型
        HttpServletRequest servletRequest1 = (HttpServletRequest) servletRequest;
        HttpSession session = servletRequest1.getSession();
        Object ok = (String)session.getAttribute("ok");
        Object ok1 = (String)session.getAttribute("ok1");
        System.out.println("ok = " + ok);
        System.out.println("ok1 = " + ok1);

    }
}
代码片段三:

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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/arequest2")
public class Session3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        Object ok = (String)session.getAttribute("ok");
        Object ok1 = (String)session.getAttribute("ok1");
        System.out.println("ok = " + ok);
        System.out.println("ok1 = " + ok1);
    }
}

二、了解Cookie:

1.什么是 cookie

Cookie 是服务器端通知客户端保存键值对的一种技术。

Cookie 是 servlet (服务器)发送到 Web 浏览器(客户端)的少量信息,这些信息由浏览器保存,然后发送回服务器。

客户端有了 Cookie 后,每次请求都会发送 Cookie 给服务器。
每个 Cookie 的大小不能超过 4KB

2.测试代码一:

可以发现先请求测试代码一所对应的内容,再请求二就会出现自己所定义的名称和值,当直接请求测试代码二时,则会收到一些地址值


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/aaaa")
public class Cooke1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //创建一个名字为"username"的Cookie
        Cookie cookie = new Cookie("username", "john_doe");
       //设置它的过期时间
        cookie.setMaxAge(10);
        //发送客户端
        resp.addCookie(cookie);
    }
}

3测试代码二:


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
@WebServlet("/aa")
public class Cooke  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        if (cookies !=null){
            for (Cookie cookie :cookies){
                String name = cookie.getName();
                System.out.println("name = " + name);
                String value = cookie.getValue();
                System.out.println("value = " + value);
            }
        }
    }
}

三、给登录页面添加验证码:

登录页面详解于上篇:

jsp登录页面验证码所对应的代码内容:

css代码:

建议对java文件进行分包可以更好的整理代码和代码结构更清晰,建立验证码对应的Java类:

Java类详细代码内容是:

其中@WebServlet("/code")中斜杠后的内容应该与登录页面src所对应的值相等


import cn.dsna.util.images.ValidateCode;

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 javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/code")
public class code extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ValidateCode validateCode = new ValidateCode(500, 200, 4, 100);//宽度,高度,个数,图中横线数
        String code = validateCode.getCode();
        HttpSession session = req.getSession();
        session.setAttribute("yz",code);
        validateCode.write(resp.getOutputStream());
    }
}

登录页面的详细代码:

import Dao.StudentDao;
import Model.Student;
import Model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

@WebServlet("/loginok")
public class UserRequst extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user = req.getParameter("user");
        String pwd = req.getParameter("pwd");
        String code = req.getParameter("yz");

        System.out.println("code = " + code);
        HttpSession session = req.getSession();
        String yz =(String) session.getAttribute("yz");
        System.out.println("yz = " + yz);
        if (!yz.equals(code)){
           req.getRequestDispatcher("usererror").forward(req,resp);
//            return;
        }
        InputStream in = Resources.getResourceAsStream("config/mybatis_config.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession = build.openSession();
        StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
        User login = studentDao.login(user, pwd);
        if (login==null){
            req.getRequestDispatcher("usererror").forward(req,resp);
        }else {

            InputStream on = Resources.getResourceAsStream("config/mybatis_config.xml");
            SqlSessionFactory build1 = new SqlSessionFactoryBuilder().build(on);
            SqlSession sqlSession1 = build1.openSession();
            StudentDao studentDao1 = sqlSession.getMapper(StudentDao.class);
            List<Student> all = studentDao.findAll();
            req.setAttribute("all",all);
            req.getRequestDispatcher("/showlist").forward(req,resp);
        }
    }
}

此图中的req.getParameter中的内容和登录jsp文件的name内容相同

最终效果展示:

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 新建MySQL数据库 首先需要在本地安装MySQL数据库,并在MySQL Workbench中新建一个数据库,例如名称为photo。 2. 导入数据库表 在新建的photo数据库中,将以下SQL语句用MySQL Workbench中的SQL编辑器执行,以创建一个名为photo的数据表: CREATE TABLE `photo` ( `id` int(11) NOT NULL, `name` varchar(100) NOT NULL, `url` varchar(200) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 3. 配置IntelliJ IDEA项目 在IntelliJ IDEA中创建一个新的Maven Web项目,添加MySQL驱动依赖项,在pom.xml文件中添加以下依赖项: <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> 然后在项目的web.xml文件中添加以下Servlet配置: <servlet> <servlet-name>photoServlet</servlet-name> <servlet-class>com.example.servlet.PhotoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>photoServlet</servlet-name> <url-pattern>/photo</url-pattern> </servlet-mapping> 4. 连接MySQL数据库 在PhotoServlet类中添加以下代码来连接到MySQL数据库: String url = "jdbc:mysql://localhost:3306/photo"; String username = "root"; String password = "123456"; Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, username, password); 在上面的代码中,我们首先创建了一个MySQL连接字符串,并使用用户名和密码连接到数据库,然后使用Class.forName方法将MySQL的JDBC驱动程序加载到应用程序中。 5. 查询照片 在PhotoServlet类的doGet方法中,添加以下代码来查询photo表中的所有照片,并将结果发送给客户端: Statement statement = conn.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM photo"); List<String> photoUrls = new ArrayList<>(); while (resultSet.next()) { String url = resultSet.getString("url"); photoUrls.add(url); } ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(photoUrls); response.setContentType("application/json"); PrintWriter out = response.getWriter(); out.print(json); 在上面的代码中,我们首先使用Java的Statement对象执行SQL查询,并将结果存储在ResultSet对象中。然后我们遍历ResultSet对象,并提取每个照片的URL字段。最后,我们将所有照片URLs的JSON表示发送到客户端。 6. 测试Servlet 在浏览器中输入http://localhost:8080/photo,应该会看到所有照片的URLs的JSON表示。如果出现任何错误,请查看IntelliJ IDEA控制台以查找更具体的错误信息。 以上就是连接MySQL数据库Servlet进行查询照片操作的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值