JavaEE入门——servlet、jsp、jdbc初级应用:超简易的学生作业系统

数据库

在数据库中有三张表
在这里插入图片描述

  1. student表(学生信息表)
    在这里插入图片描述
  2. student_homework表(学生提交作业记录表)
    在这里插入图片描述
  3. teacher_homework表(教师发布作业记录表)
    在这里插入图片描述

数据映射类

新建三个类(student类、studentHomework类、TeacherHomework类)
建立数据映射的目的就是可以方便的将表中的一条记录抽象成java中的一个对象
在这里插入图片描述
下面上代码

  1. student类
public class Student {
    private Long studentId;
    private String studentName;

    public Long getStudentId() {
        return studentId;
    }

    public void setStudentId(Long studentId) {
        this.studentId = studentId;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }
}

  1. StudentHomework类
public class StudentHomework {
    private Long id;
    private Long studentId;
    private Long homeworkId;
    private String homeworkTitle;
    private String homeworkContent;
    private Timestamp creatTime;
    private Timestamp updateTime;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getStudentId() {
        return studentId;
    }

    public void setStudentId(Long studentId) {
        this.studentId = studentId;
    }

    public Long getHomeworkId() {
        return homeworkId;
    }

    public void setHomeworkId(Long homeworkId) {
        this.homeworkId = homeworkId;
    }

    public String getHomeworkTitle() {
        return homeworkTitle;
    }

    public void setHomeworkTitle(String homeworkTitle) {
        this.homeworkTitle = homeworkTitle;
    }

    public String getHomeworkContent() {
        return homeworkContent;
    }

    public void setHomeworkContent(String homeworkContent) {
        this.homeworkContent = homeworkContent;
    }

    public Timestamp getCreatTime() {
        return creatTime;
    }

    public void setCreatTime(Timestamp creatTime) {
        this.creatTime = creatTime;
    }

    public Timestamp getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Timestamp updateTime) {
        this.updateTime = updateTime;
    }
}

  1. TeacherHomework类
public class TeacherHomework {
    private long homeworkId;
    private String homeworkTitle;

    public long getHomeworkId() {
        return homeworkId;
    }

    public void setHomeworkId(long homeworkId) {
        this.homeworkId = homeworkId;
    }

    public String getHomeworkTitle() {
        return homeworkTitle;
    }

    public void setHomeworkTitle(String homeworkTitle) {
        this.homeworkTitle = homeworkTitle;
    }
}

创建数据库操作类

  1. Homeworkjdbc类
public class HomeworkJdbc {
    
    //获取所有学生提交的作业
    public static List<StudentHomework> selectAllStudentHomework() throws ClassNotFoundException {
        String url="jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";

        String drivername = "com.mysql.cj.jdbc.Driver";

        String sqlString = "select * from student_homework ";

        List<StudentHomework>list=new ArrayList<>();
        Class.forName(drivername);//可以省略
        try (Connection connection = DriverManager.getConnection(url, "root", "0016")) {
            //通过连接获取statement
            try (Statement statement = connection.createStatement()) {
                //statement (增、删、改、查)
                try (ResultSet resultSet = statement.executeQuery(sqlString)) {
                    //获取执行结果
                    while (resultSet.next()) {
                        StudentHomework sh = new StudentHomework();
                        sh.setId(resultSet.getLong("id"));
                        sh.setStudentId(resultSet.getLong("student_id"));
                        sh.setHomeworkId(resultSet.getLong("homework_id"));
                        sh.setHomeworkTitle(resultSet.getString("homework_title"));
                        sh.setHomeworkContent(resultSet.getString("homework_content"));
                        sh.setCreatTime(resultSet.getTimestamp("create_time"));
                        sh.setUpdateTime(resultSet.getTimestamp("update_time"));
                        list.add(sh);
                    }
                }

            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
    
    //获取所有教师布置的作业
    public static List<TeacherHomework> selectAllTeacherHomework() throws ClassNotFoundException {
        String url="jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";

        String drivername = "com.mysql.cj.jdbc.Driver";

        String sqlString = "select * from teacher_homework ";

        List<TeacherHomework>list=new ArrayList<>();
        Class.forName(drivername);//可以省略
        try (Connection connection = DriverManager.getConnection(url, "root", "0016")) {
            //通过连接获取statement
            try (Statement statement = connection.createStatement()) {
                //statement (增、删、改、查)
                try (ResultSet resultSet = statement.executeQuery(sqlString)) {
                    //获取执行结果
                    while (resultSet.next()) {
                        TeacherHomework th = new TeacherHomework();
                        th.setHomeworkId(resultSet.getLong("homework_id"));
                        th.setHomeworkTitle(resultSet.getString("homework_title"));
                        list.add(th);
                    }
                }

            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

	//老师布置作业时向数据中添加一条记录
    public static boolean addHomework(TeacherHomework nth) throws ClassNotFoundException {
        String url="jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
        String drivername = "com.mysql.cj.jdbc.Driver";
        Class.forName(drivername);//可以省略
        boolean isSuccess = true;
        try (Connection connection = DriverManager.getConnection(url, "root", "0016")) {
            //通过连接获取statement

            //Preparestatement (增、删、改、查)
            String sqlString = "insert into teacher_homework(homework_id,homework_title) values (?,?)";
            PreparedStatement ps = connection.prepareStatement(sqlString);
            ps.setLong(1,nth.getHomeworkId());
            ps.setString(2,nth.getHomeworkTitle());
            //成功返回false 失败返回true
            isSuccess = ps.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //为了方便后面操作 返回相反的结果
        return !isSuccess;
    }

//学生提交作业时向数据库中添加一条记录
    public static String handHomework(StudentHomework nsh) throws ClassNotFoundException {
        String url="jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
        String drivername = "com.mysql.cj.jdbc.Driver";
        Class.forName(drivername);//可以省略
        String respone = "提交成功";
        List<StudentHomework> shlist = HomeworkJdbc.selectAllStudentHomework();
        List<Student> slist = StudentJdbc.selectAllStudent();
        List<TeacherHomework> thlist = HomeworkJdbc.selectAllTeacherHomework();
        boolean studentExist = false;
        boolean homeworkExist = false;
        //检查学生id
        for(Student s:slist){
            if(s.getStudentId().equals(nsh.getStudentId())){
                studentExist=true;
                break;
            }
        }
        if(!studentExist){
            return  "当前输入的学生id不存在";
        }
        //检查作业是否存在
        for(TeacherHomework th:thlist){
            if(th.getHomeworkId()==nsh.getHomeworkId()){
                homeworkExist=true;
                nsh.setHomeworkTitle(th.getHomeworkTitle());
                break;
            }
        }
        if(!homeworkExist){
            return  "未发现该作业";
        }
        try (Connection connection = DriverManager.getConnection(url, "root", "0016")) {
            //通过连接获取statement
            String sqlString = "insert into student_homework(id,student_id,homework_id,homework_title,homework_content,create_time)values(?,?,?,?,?,?)";
            PreparedStatement ps = connection.prepareStatement(sqlString);
            ps.setLong(1,shlist.size()+1);
            ps.setLong(2,nsh.getStudentId());
            ps.setLong(3,nsh.getHomeworkId());
            ps.setString(4,nsh.getHomeworkTitle());
            ps.setString(5,nsh.getHomeworkContent());
            ps.setTimestamp(6, nsh.getCreatTime());
            //成功返回false 失败返回true
            if(ps.execute()){
                return "提交失败,请检查后再提交";
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //为了方便后面操作 返回相反的结果
            return respone;
    }
}

  1. Studentjdbc类
public class StudentJdbc {
    
    //获取所有的学生的信息
	public static List<Student> selectAllStudent() throws ClassNotFoundException {
        String url="jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";

        String drivername = "com.mysql.cj.jdbc.Driver";

        String sqlString = "select * from student ";

        List<Student>list=new ArrayList<>();
        Class.forName(drivername);//可以省略
        try (Connection connection = DriverManager.getConnection(url, "root", "0016")) {
            //通过连接获取statement
            try (Statement statement = connection.createStatement()) {
                //statement (增、删、改、查)
                try (ResultSet resultSet = statement.executeQuery(sqlString)) {
                    //获取执行结果
                    while (resultSet.next()) {
                        Student student = new Student();
                        student.setStudentId(resultSet.getLong("student_id"));
                        student.setStudentName(resultSet.getString("student_name"));
                        list.add(student);
                    }
                }

            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
//向数据库中添加一个学生
    public static boolean addStudent(Student newStudent) throws ClassNotFoundException {
        String url="jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
        String drivername = "com.mysql.cj.jdbc.Driver";
        List<Student>list=new ArrayList<>();
        Class.forName(drivername);//可以省略
        boolean isSuccess = true;
        try (Connection connection = DriverManager.getConnection(url, "root", "0016")) {
            //通过连接获取statement

                //Preparestatement (增、删、改、查)
                String sqlString = "insert into student(student_id,student_name) values (?,?)";
                PreparedStatement ps = connection.prepareStatement(sqlString);
                ps.setLong(1,newStudent.getStudentId());
                ps.setString(2,newStudent.getStudentName());
                //成功返回false 失败返回true
                isSuccess = ps.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //为了方便后面操作 返回相反的结果
        return !isSuccess;
    }
    public static void main(String[] args) throws ClassNotFoundException {

        List<Student> list=selectAllStudent();
        for(Student student:list){
            System.out.println(student.getStudentId());
        }
    }
}

首页——导航界面

首页是四个简单的按钮
首页
因为首页就是四个按钮,暂时不需要写一个接口,我这里直接写在index.jsp中

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<
<html>
  <head>
    <title>作业系统</title>
  </head>
  <body align="center">
    <h1 >
      作业系统
    </h1>
      <a href="http://localhost:8081/searchallhomwork" >
        <button >教师---作业列表</button>
      </a>
      <br/><br/>
      <a href="http://localhost:8081/searchstudent" >
        <button>教师---学生列表</button>
      </a>
    <br/><br/>
      <a href="http://localhost:8081/searchteacherhomework" >
        <button>教师---发布作业</button>
      </a>
    <br/><br/>
    <a href="http://localhost:8081/handinhomework" >
      <button>学生---提交作业</button>
    </a>

  </body>
</html>

这四个按钮分别指向我后面写的四个接口,用来跳转界面

教师—作业列表

在这里插入图片描述

  1. 创建一个servlet
//这里的@WebSerlet("/")是用来声名接口的
@WebServlet("/searchallhomwork")

//继承HttpServlet重写doGet和doPost来实现GET和POST请求

public class TeacherSearchServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<StudentHomework> studentHomeworkList = null;
        try {
            studentHomeworkList = HomeworkJdbc.selectAllStudentHomework();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
//向req中添加数据(只能添加单一数据,无法实现多数据的传递)
        req.setAttribute("studenthomeworklist",studentHomeworkList);
     //跳转到search.jsp然后传递req(request)和resp(response)
        req.getRequestDispatcher("search.jsp").forward(req,resp);
    }
}
  1. 创建一个search.jsp文件:(具体解释看代码中的注释)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>家庭作业</title>
</head>
<body>

<!-- 第一个表格用来展示教师布置过的作业-->

<h1 align="center">
    作业列表
</h1>
<table align="center" width="970" border="1" bgcolor="black" cellpadding="1" cellspacing="1">
    <tr bgcolor="aqua">
        <td align="center">作业编号</td>
        <td align="center">作业标题</td>
    </tr>
    
 <!--jsp代码块
	HomeworkJdbc.selectAllTeacherHomework()此方法将所有老师布置的作业都存为一个TeacherHomework实体对象
	for循环内部可以嵌套一些标签但是标签并不在<%%>--> 
	
    <%
        List<TeacherHomework> tlist = HomeworkJdbc.selectAllTeacherHomework();
        if(null == tlist||tlist.size()<=0){
            out.println("None data.");
        }else{
            for(TeacherHomework th:tlist){
    %>
    <tr align="center" bgcolor="white" height="30">
        <td><%=th.getHomeworkId()%></td>
        <td><%=th.getHomeworkTitle()%></td>
    </tr>
    <%}}%>
</table>


<!--第二个表格是作业提交记录的表格-->
<h1 align="center">
    作业提交记录
</h1>
<table align="center" width="970" border="1" bgcolor="black" cellpadding="1" cellspacing="1">
    <tr bgcolor="aqua">
        <td align="center">ID</td>
        <td align="center">学号</td>
        <td align="center">作业编号</td>
        <td align="center">作业标题</td>
        <td align="center">作业内容</td>
        <td align="center">创建时间</td>
    </tr>

<!--这里的(List<StudentHomework>)request.getAttribute("studenthomeworklist")是用来接收servlet中传来的list对象的-->

    <%
        List<StudentHomework> slist = (List<StudentHomework>)request.getAttribute("studenthomeworklist");
        if(null == slist || slist.size()<=0){
            out.println("None data.");
        }else{
            for(StudentHomework sh: slist){
    %>
    <tr align="center" bgcolor="white" height="30">
        <td><%=sh.getId()%></td>
        <td><%=sh.getStudentId()%></td>
        <td><%=sh.getHomeworkId()%></td>
        <td><%=sh.getHomeworkTitle()%></td>
        <td><%=sh.getHomeworkContent()%></td>
        <td><%=sh.getCreatTime()%></td>
    </tr>
    <%}}%>
</table>
</body>
</html>

教师—学生列表

在这里插入图片描述
输入已存在的id会出现一下界面,然后3s后跳转到导航页面
在这里插入图片描述
创建成功后的界面,然后 3s后跳转到导航界面
在这里插入图片描述
上一个界面我只使用了一个接口来实现
这个界面我使用了两个接口
实际上每次跳转界面都是向一个接口发送请求,然后由服务器来跳转jsp的
但是这次我们有一个提交的需求,所以我们要再写一个接口用来接收提交请求并跳转jsp

  1. 第一个跳转界面接口
@WebServlet("/searchstudent")
public class TeacherSearchStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Student> list = null;
        try {
            list = StudentJdbc.selectAllStudent();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        req.setAttribute("studentlist",list);
        req.getRequestDispatcher("student.jsp").forward(req,resp);
    }
}

  1. 添加学生接口
    这里提交我更倾向于post
    get的话会把提交的参数和属性都在地址栏里标出会泄露信息
    post相对更安全一些些(只是个人比较喜欢哈哈)
@WebServlet("/addstudent")
public class TeacherAddStudentServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Student newStudent = new Student();
        newStudent.setStudentId(Long.parseLong(req.getParameter("studentid")));
        newStudent.setStudentName(req.getParameter("studentname"));
        List<Student> studentList = null;
        try {
            studentList = StudentJdbc.selectAllStudent();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        boolean isExist = false;
        for(Student student:studentList){
            //使用equals方法,这里比较迷我有些地方可以用==但是有些地方只有equals才行 不知道为啥 希望知道的大佬可以留言讲解一下
            if( newStudent.getStudentId().equals(student.getStudentId())){
                isExist = true;
                break;
            }
        }
        resp.setContentType("text/html;charset=UTF-8");
        if(isExist){
            //中文编码
            resp.getWriter().println("该学号已被注册,3s后跳转");
        }else {

            try {
                if(newStudent.getStudentName().equals("")){

                    resp.getWriter().println("姓名不为空,请检查后再添加,3s后跳转");
                }else{
                    if(StudentJdbc.addStudent(newStudent)){
                        resp.getWriter().println("添加成功,3s后跳转");
                    }else {
                        resp.getWriter().println("添加失败,请检查后再添加,3s后跳转");
                    }
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
           
        }
         //延时跳转
        resp.setHeader("refresh","3;URL=index.jsp");
    }
}
  1. 界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>作业系统</title>
</head>
<body>
<h1 align="center">
    学生列表
</h1>
<table align="center" width="970" border="1" bgcolor="black" cellpadding="1" cellspacing="1">
    <tr bgcolor="aqua">
        <td align="center">学号</td>
        <td align="center">姓名</td>
    </tr>
    <%
        List<Student> list = (List<Student>) request.getAttribute("studentlist");
        if(null == list||list.size()<=0){
            out.println("None data.");
        }else{
            for(Student s:list){
    %>
    <tr align="center" bgcolor="white" height="30">
        <td><%=s.getStudentId()%></td>
        <td><%=s.getStudentName()%></td>
    </tr>
    <%}}%>
</table>
<br/>
<br/>
<br/>
<br/>
<h1 align="center">
    添加学生
</h1>

<!-- 注意这个表单 action后填写接口 method填写使用post和get-->
<form align="center" action="/addstudent" method="post">
    学号:<input type="number" name="studentid">
    <br><br><br>
    姓名:<input type="text" name="studentname">
    <br><br>
    <input type="submit" value="添加">
</form>
</body>
</html>

后面的界面大同小异,不多解释,上代码

教师-发布作业

在这里插入图片描述
这里也是有错误检测的

1.界面跳转接口:

@WebServlet("/searchteacherhomework")
public class TeacherHomeworkServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<TeacherHomework> teacherHomeworkList = null;
        try {
            teacherHomeworkList = HomeworkJdbc.selectAllTeacherHomework();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        req.setAttribute("teacherhomeworklist",teacherHomeworkList);
        req.getRequestDispatcher("addhomework.jsp").forward(req,resp);
    }
}

  1. 提交接口
@WebServlet("/addhomework")
public class TeacherAddHomeworkServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        TeacherHomework nth = new TeacherHomework();
        nth.setHomeworkId(Long.parseLong(req.getParameter("homeworkid")));
        nth.setHomeworkTitle(req.getParameter("homeworktitle"));
        List<TeacherHomework> thList = null;
        try {
            thList = HomeworkJdbc.selectAllTeacherHomework();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        boolean isExist = false;
        for(TeacherHomework th:thList){
            //使用equals方法
            if(nth.getHomeworkId()==th.getHomeworkId()){
                isExist = true;
                break;
            }
        }
        resp.setContentType("text/html;charset=UTF-8");
        if(isExist){
            //中文编码
            resp.getWriter().println("该id已被使用,3s后跳转");
            //延时跳转
        }else {
            try {
                if(nth.getHomeworkTitle().equals("")){
                    resp.getWriter().println("id不为空,请检查后再添加,3s后跳转");
                }else{
                    if(HomeworkJdbc.addHomework(nth)){
                        resp.getWriter().println("添加成功,3s后跳转");
                    }else {
                        resp.getWriter().println("添加失败,请检查后再添加,3s后跳转");
                    }
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            //延时跳转
        }
        resp.setHeader("refresh","3;URL=index.jsp");
        }
}

3.界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1 align="center">
    作业列表
</h1>
<table align="center" width="970" border="1" bgcolor="black" cellpadding="1" cellspacing="1">
    <tr bgcolor="aqua">
        <td align="center">作业编号</td>
        <td align="center">作业标题</td>
    </tr>
    <%
        List<TeacherHomework> tlist = (List<TeacherHomework>) request.getAttribute("teacherhomeworklist");
        if(null == tlist||tlist.size()<=0){
            out.println("None data.");
        }else{
            for(TeacherHomework th:tlist){
    %>
    <tr align="center" bgcolor="white" height="30">
        <td><%=th.getHomeworkId()%></td>
        <td><%=th.getHomeworkTitle()%></td>
    </tr>
    <%}}%>
</table>
<br>
<br>
<br>
<br>
<h1 align="center">
    发布作业
</h1>
<form align="center" action="/addhomework" method="post">
    作业编号:<input type="number" name="homeworkid">
    <br><br><br>
    作业名称:<input type="text" name="homeworktitle">
    <br><br><br>
    <input type="submit" value="发布">
</form>
</body>
</html>

作业提交界面

在这里插入图片描述
这个界面虽然没有之前的表格,但是还是需要一个跳转接口的

1.跳转界面的接口:

@WebServlet("/handinhomework")
public class StudentHandInHomeworkServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("handinhomework.jsp").forward(req,resp);
    }
}

2.提交作业接口:

@WebServlet("/submit")
public class StudentAddHomework extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        StudentHomework nsh = new StudentHomework();
        nsh.setStudentId(Long.parseLong(req.getParameter("studentid")));
        nsh.setHomeworkId(Long.parseLong(req.getParameter("homeworkid")));
        nsh.setHomeworkContent(req.getParameter("homeworkcontent"));
        Timestamp dateNow=new Timestamp(System.currentTimeMillis());
        nsh.setCreatTime(dateNow);


        resp.setContentType("text/html;charset=UTF-8");
        try {
            resp.getWriter().println(HomeworkJdbc.handHomework(nsh)+",3s后跳转");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        resp.setHeader("refresh","3;URL=index.jsp");
    }
}

3.界面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>提交作业</title>
</head>
<body>
<h1 align="center">
    学生作业提交
</h1>
<form align="center" action="/submit" method="post">
    学生学号:<input type="number" name="studentid">
    <br><br><br>
    作业编号:<input type="number" name="homeworkid">
    <br><br><br>
    作业内容:<input type="text" name="homeworkcontent">
    <br><br><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

完整项目GitHub地址: https://github.com/word000000/JavaEE02__HomeWorkSystem.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值