zoukankan      html  css  js  c++  java
  • 购物车的实现(jsp的session+Java的Map的结合)

    1:电商如此发达的现在,作为一个web开发程序猿,如果不会写购物车,真是有点不好意思找工作。所以抓紧练习啊,从上篇博客中抽离出如何实现购物车的功能。

    2:首先需要理解购物车实现的一些基本步骤。
      2.1:首先考虑我购买的是哪一本书籍或者那一件商品,是不是,这里可以使用id传参确定购买的是那一件商品或者书籍,也可以使用session中取出哪一本书籍,这里采用从session的取出那一件商品或者书籍
           代码如:

          Book book=(Book)session.getAttribute("book");
         2.2:第二考虑如何把书籍放到购物车中
             2.1.1:首先考虑是否有购物车,如果没有,则创建,如果有直接使用
             2.1.2:其次先将购物车从session中拿出来,不存在就创建。
        代码如:

          Map<Integer,CartItem> cart=(Map<Integer,CartItem>)session.getAttribute("cart");
            //如果没有购物车,那么创建,只有第一次访问才会操作
            if(cart==null){
               //new一个购物车
              cart=new HashMap<>();
            }
        2.3:考虑如何把书籍放到购物车中
           2.1.1:第一考虑购物车中是否有该书籍,所以先从购物车中获取该书籍,如果为空,那么没有该书籍
         代码如:

        CartItem item=(CartItem)cart.get(book.getBookid());
           if(item==null){
                 //如果购物车中不存在该书籍,那么创建,且数量默认为1
                   item=new CartItem();
                   //将书籍放到购物车中
                  item.setBook(book);
                  //将书籍的默认数量为1
                  item.setNumber(1);
              }else{
                  //如果购物车中以及有该书籍,那么数量加1
                  item.setNumber(item.getNumber()+1);
              }
        2.4:考虑如何把购物车项(即挑选的书籍是哪一个和书本的数量)放到购物车中
          代码如:

        cart.put(book.getBookid(),item);
        2.5:将购物车放到session中,方便后面取出来
          代码如:

      session.setAttribute("cart", cart);


    3:下面是具体的实现,从创建数据表开始,数据表book字段和数据名称如下所示:

     

    4:下面创建实体类book.java;

     1 package com.bie.po;
     2 
     3 import java.io.Serializable;
     4 
     5 /** 
     6 * @author BieHongLi 
     7 * @version 创建时间:2017年2月27日 上午10:07:21 
     8 * 图书的实体类
     9 */
    10 public class Book implements Serializable{
    11 
    12     //实体类实现序列化,避免后面出现异常
    13     private static final long serialVersionUID = 1L;
    14     private Integer bookid;
    15     private String bookname;
    16     private Double price;
    17     private String author;
    18     private String pic;
    19     private String publish;
    20     public Integer getBookid() {
    21         return bookid;
    22     }
    23     public void setBookid(Integer bookid) {
    24         this.bookid = bookid;
    25     }
    26     public String getBookname() {
    27         return bookname;
    28     }
    29     public void setBookname(String bookname) {
    30         this.bookname = bookname;
    31     }
    32     public Double getPrice() {
    33         return price;
    34     }
    35     public void setPrice(Double price) {
    36         this.price = price;
    37     }
    38     public String getAuthor() {
    39         return author;
    40     }
    41     public void setAuthor(String author) {
    42         this.author = author;
    43     }
    44     public String getPic() {
    45         return pic;
    46     }
    47     public void setPic(String pic) {
    48         this.pic = pic;
    49     }
    50     public String getPublish() {
    51         return publish;
    52     }
    53     public void setPublish(String publish) {
    54         this.publish = publish;
    55     }
    56     @Override
    57     public String toString() {
    58         return "Book [bookid=" + bookid + ", bookname=" + bookname + ", price=" + price + ", author=" + author
    59                 + ", pic=" + pic + ", publish=" + publish + "]";
    60     }
    61     
    62     
    63 }

     5:创建好实体类接下来是写工具类BaseDao.java,用于连接数据库的操作,这些代码就不做多解释了,都已经写烂了。所以工具类一定要熟练书写

      1 package com.bie.utils;
      2 
      3 import java.sql.Connection;
      4 import java.sql.DriverManager;
      5 import java.sql.PreparedStatement;
      6 import java.sql.ResultSet;
      7 import java.sql.SQLException;
      8 
      9 /** 
     10 * @author BieHongLi 
     11 * @version 创建时间:2017年2月27日 上午10:09:00 
     12 * 连接数据库的工具类
     13 */
     14 public class BaseDao {
     15 
     16     private static String driver="com.mysql.jdbc.Driver";
     17     private static String url="jdbc:mysql:///test";
     18     private static String user="root";
     19     private static String password="123456";
     20     
     21     /***
     22      * 连接数据库的方法
     23      * @return
     24      * @throws ClassNotFoundException
     25      * @throws SQLException
     26      */
     27     public static Connection getCon() throws ClassNotFoundException, SQLException{
     28         Class.forName(driver);//加载数据库驱动
     29         System.out.println("测试加载数据库成功");
     30         Connection con=DriverManager.getConnection(url, user, password);
     31         System.out.println("测试数据库链接成功");
     32         return con;
     33     }
     34     
     35     /***
     36      * 关闭数据库的方法
     37      * @param con
     38      * @param ps
     39      * @param rs
     40      */
     41     public static void close(Connection con,PreparedStatement ps,ResultSet rs){
     42         if(rs!=null){//关闭资源,避免出现异常
     43             try {
     44                 rs.close();
     45             } catch (SQLException e) {
     46                 // TODO Auto-generated catch block
     47                 e.printStackTrace();
     48             }
     49         }
     50         if(ps!=null){
     51             try {
     52                 ps.close();
     53             } catch (SQLException e) {
     54                 // TODO Auto-generated catch block
     55                 e.printStackTrace();
     56             }
     57         }
     58         if(con!=null){
     59             try {
     60                 con.close();
     61             } catch (SQLException e) {
     62                 // TODO Auto-generated catch block
     63                 e.printStackTrace();
     64             }
     65         }
     66     }
     67     
     68     /***
     69      * 同意增删改的方法
     70      * @param sql
     71      * @param arr
     72      * @return
     73      */
     74     public static boolean addUpdateDelete(String sql,Object[] arr){
     75         Connection con=null;
     76         PreparedStatement ps=null;
     77         try {
     78             con=BaseDao.getCon();//第一步 :连接数据库的操作
     79             ps=con.prepareStatement(sql);//第二步:预编译
     80             //第三步:设置值
     81             if(arr!=null && arr.length!=0){
     82                 for(int i=0;i<arr.length;i++){
     83                     ps.setObject(i+1, arr[i]);
     84                 }
     85             }
     86             int count=ps.executeUpdate();//第四步:执行sql语句
     87             if(count>0){
     88                 return true;
     89             }else{
     90                 return false;
     91             }
     92         } catch (ClassNotFoundException e) {
     93             // TODO Auto-generated catch block
     94             e.printStackTrace();
     95         } catch (SQLException e) {
     96             // TODO Auto-generated catch block
     97             e.printStackTrace();
     98         }
     99         return false;
    100     }
    101     
    102     public static void main(String[] args) {
    103         try {
    104             BaseDao.getCon();
    105         } catch (ClassNotFoundException e) {
    106             // TODO Auto-generated catch block
    107             e.printStackTrace();
    108         } catch (SQLException e) {
    109             // TODO Auto-generated catch block
    110             e.printStackTrace();
    111         }
    112     }
    113 }

    6:写好工具类就可以进行写dao层(数据交互层),service层(业务逻辑层),先写数据交互层dao层,使用先创建接口再实现接口的方法

     1 package com.bie.dao;
     2 
     3 import java.util.List;
     4 
     5 import com.bie.po.Book;
     6 
     7 /** 
     8 * @author BieHongLi 
     9 * @version 创建时间:2017年2月27日 上午10:11:21 
    10 * 
    11 */
    12 public interface BookDao {
    13 
    14     /***
    15      * 图书的查询的方法
    16      * @param sql
    17      * @param arr
    18      * @return
    19      */
    20     public List<Book> select(String sql,Object[] arr);
    21     
    22     /***
    23      * 按照图书编号进行查询
    24      * @param id
    25      * @return
    26      */
    27     public Book getBook(Integer id);
    28 }
      1 package com.bie.dao.impl;
      2 
      3 import java.sql.Connection;
      4 import java.sql.PreparedStatement;
      5 import java.sql.ResultSet;
      6 import java.sql.SQLException;
      7 import java.util.ArrayList;
      8 import java.util.List;
      9 
     10 import com.bie.dao.BookDao;
     11 import com.bie.po.Book;
     12 import com.bie.utils.BaseDao;
     13 
     14 /** 
     15 * @author BieHongLi 
     16 * @version 创建时间:2017年2月27日 上午10:11:34 
     17 * 
     18 */
     19 public class BookDaoImpl implements BookDao{
     20 
     21     @Override
     22     public List<Book> select(String sql, Object[] arr) {
     23         Connection con=null;
     24         PreparedStatement ps=null;
     25         ResultSet rs=null;
     26         try {
     27             con=BaseDao.getCon();//第一步连接数据库
     28             ps=con.prepareStatement(sql);//第二步:预编译
     29             if(arr!=null){
     30                 for(int i=0;i<arr.length;i++){
     31                     ps.setObject(i+1, arr[i]);
     32                 }
     33             }
     34             //第四步执行sql
     35             rs=ps.executeQuery();
     36             List<Book> list=new ArrayList<Book>();
     37             while(rs.next()){
     38                 Book book=new Book();
     39                 book.setBookid(rs.getInt("bookid"));
     40                 book.setBookname(rs.getString("bookname"));
     41                 book.setPrice(rs.getDouble("price"));
     42                 book.setAuthor(rs.getString("author"));
     43                 book.setPic(rs.getString("pic"));
     44                 book.setPublish(rs.getString("publish"));
     45                 
     46                 list.add(book);
     47             }
     48             return list;
     49         } catch (ClassNotFoundException e) {
     50             // TODO Auto-generated catch block
     51             e.printStackTrace();
     52         } catch (SQLException e) {
     53             // TODO Auto-generated catch block
     54             e.printStackTrace();
     55         }finally{
     56             //关闭资源,避免出现异常
     57             BaseDao.close(con, ps, rs);
     58         }
     59         
     60         return null;
     61     }
     62 
     63     @Override
     64     public Book getBook(Integer id) {
     65         Connection con=null;
     66         PreparedStatement ps=null;
     67         ResultSet rs=null;
     68         try {
     69             con=BaseDao.getCon();//第一步连接数据库
     70             String sql="select * from book where bookid = ? ";
     71             ps=con.prepareStatement(sql);//第二步:预编译
     72             ps.setInt(1, id);
     73             
     74             //第四步执行sql
     75             rs=ps.executeQuery();
     76             while(rs.next()){
     77                 Book books=new Book();
     78                 books.setBookid(rs.getInt("bookid"));
     79                 books.setBookname(rs.getString("bookname"));
     80                 books.setPrice(rs.getDouble("price"));
     81                 books.setAuthor(rs.getString("author"));
     82                 books.setPic(rs.getString("pic"));
     83                 books.setPublish(rs.getString("publish"));
     84                 
     85                 return books;
     86             }
     87         } catch (ClassNotFoundException e) {
     88             // TODO Auto-generated catch block
     89             e.printStackTrace();
     90         } catch (SQLException e) {
     91             // TODO Auto-generated catch block
     92             e.printStackTrace();
     93         }finally{
     94             //关闭资源,避免出现异常
     95             BaseDao.close(con, ps, rs);
     96         }
     97         
     98         return null;
     99     }
    100 
    101 
    102 }

    7:写好dao层(数据交互层),就可以写service层(业务逻辑层),写业务逻辑层service层,也是使用先创建接口再实现接口的方法

     1 package com.bie.service;
     2 
     3 import java.util.List;
     4 
     5 import com.bie.po.Book;
     6 
     7 /** 
     8 * @author BieHongLi 
     9 * @version 创建时间:2017年2月27日 上午10:13:38 
    10 * 
    11 */
    12 public interface BookService {
    13 
    14     /***
    15      * 图书信息查询的方法
    16      * @return
    17      */
    18     public List<Book> select(Book book);
    19     
    20     /***
    21      * 根据id进行查询
    22      * @param id
    23      * @return
    24      */
    25     public Book getBook(Book book);
    26 }
     1 package com.bie.service.impl;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import com.bie.dao.BookDao;
     7 import com.bie.dao.impl.BookDaoImpl;
     8 import com.bie.po.Book;
     9 import com.bie.service.BookService;
    10 
    11 /** 
    12 * @author BieHongLi 
    13 * @version 创建时间:2017年2月27日 上午10:13:52 
    14 * 
    15 */
    16 public class BookServiceImpl  implements BookService{
    17 
    18 private BookDao dao=new BookDaoImpl();
    19     
    20     public List<Book> select(Book book){
    21         //String sql="select * from book ";
    22         StringBuilder sql=new StringBuilder("select * from book where 1=1 ");
    23         //sql语句
    24         List<Object> list=new ArrayList<Object>();
    25         if(book!=null){
    26             
    27             if(book.getBookid()!=null && book.getBookid()!=0){
    28                 sql.append(" and bookid=? ");
    29                 list.add(book.getBookid());
    30             }
    31             /*list.add(book.getBookname());
    32             list.add(book.getPrice());
    33             list.add(book.getAuthor());
    34             list.add(book.getPic());
    35             list.add(book.getPublish());*/
    36         }
    37         
    38         return dao.select(sql.toString(), list.toArray());
    39     }
    40 
    41     @Override
    42     public Book getBook(Book book) {
    43         if(book.getBookid()!=null && book.getBookid()!=0){
    44             return dao.getBook(book.getBookid());
    45         }
    46         return null;
    47     }
    48 
    49     
    50 }

    8:最后按照正常开发的话就是servlet层,但是这里将servlet层的代码写到了jsp里面。所以下面jsp页面才是大戏

      先创建一个book.jsp页面,用于显示从数据库查询到的图书数据

     1 <%@page import="java.util.List"%>
     2 <%@page import="com.bie.service.impl.BookServiceImpl"%>
     3 <%@page import="com.bie.po.Book"%>
     4 <%@ page language="java" contentType="text/html; charset=UTF-8"
     5     pageEncoding="UTF-8"%>
     6 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     7 <html>
     8 <head>
     9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    10 <title>图书列表的页面</title>
    11 </head>
    12 <body>
    13 <%
    14     //图书的实体类创建一个对象
    15     Book book=new Book();
    16     //图书的业务逻辑层层
    17     BookServiceImpl service=new BookServiceImpl();
    18     List<Book> list=service.select(book);
    19 %>
    20 <div style="text-align:right;font-size:36px;">
    21     <a href="docart.jsp">我的购物车</a>
    22 </div>
    23 <table align="center" width="100%">
    24     <tr>
    25         <th>编号</th>
    26         <th>书名</th>
    27         <th>价格</th>
    28         <th>作者</th>
    29         <th>封皮</th>
    30         <th>出版社</th>
    31     </tr>
    32     <%
    33         for(Book b:list){    
    34     %>
    35     <tr align="center">
    36         <td><%=b.getBookid() %></td>
    37         <td><a href="dobook.jsp?id=<%=b.getBookid()%>"><%=b.getBookname() %></a></td>
    38         <td><%=b.getPrice() %></td>
    39         <td><%=b.getAuthor() %></td>
    40         <td><%=b.getPic() %></td>
    41         <td><%=b.getPublish() %></td>
    42     </tr>
    43     <%} %>
    44 </table>
    45 
    46 </body>
    47 </html>

    9:当图书显示出来之后就可以根据图书编号查看图书详情了,接着写dobook.jsp页面和detail.jsp页面,这个显示图书的详细的信息的页面

     1 <%@page import="com.bie.service.impl.BookServiceImpl"%>
     2 <%@page import="com.bie.service.BookService"%>
     3 <%@page import="com.bie.po.Book"%>
     4 <%@ page language="java" contentType="text/html; charset=UTF-8"
     5     pageEncoding="UTF-8"%>
     6 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     7 <html>
     8 <head>
     9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    10 <title>处理图书详细信息的页面</title>
    11 </head>
    12 <body>
    13 <%
    14     Book book=new Book();
    15     String sid=request.getParameter("id");
    16     Integer id=Integer.parseInt(sid);
    17     BookService service=new BookServiceImpl();
    18     book.setBookid(id);
    19     Book books=service.getBook(book);
    20     
    21     session.setAttribute("book", books);
    22     response.sendRedirect("detail.jsp");
    23 %>
    24 </body>
    25 </html>
     1 <%@page import="com.bie.po.Book"%>
     2 <%@ page language="java" contentType="text/html; charset=UTF-8"
     3     pageEncoding="UTF-8"%>
     4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     5 <html>
     6 <head>
     7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     8 <title>图书详细信息的页面</title>
     9 </head>
    10 <body>
    11 <%
    12     Book book=(Book)session.getAttribute("book");
    13 %>
    14 <div style="text-align:right;font-size:36px;">
    15 
    16     <a href="docart.jsp">我的购物车</a>
    17 </div>
    18 <table align="center" cellpadding="20" cellspacing="20">
    19     <tr>
    20         <td>图书编号</td>
    21         <td>图书名称</td>
    22         <td>图书价格</td>
    23         <td>图书作者</td>
    24         <td>图书封皮</td>
    25         <td>图书出版社</td>
    26     </tr>
    27     <tr>
    28         <td><%=book.getBookid() %></td>
    29         <td><%=book.getBookname() %></td>
    30         <td><%=book.getPrice() %></td>
    31         <td><%=book.getAuthor() %></td>
    32         <td><img src="images/<%=book.getPic() %>"></td>
    33         <td><%=book.getPublish() %></td>
    34     </tr>
    35     <tr>
    36         <td colspan="2"></td>
    37         <td><a href="cart.jsp">添加到购物车</a></td>
    38         <td><a href="book.jsp">图书列表</a></td>
    39         
    40         <td colspan="2"></td>
    41     </tr>
    42 </table>
    43 </body>
    44 </html>

    10:写好上面的detail.jsp然后就可以在detail.jsp页面点击添加到购物车,下面实现购物车的功能,也是这个实现购物车的核心部分,参考的话是重点看的内容,当然在写购物车之前还需要创建一个实体类CartItem.java,用于存放图书的信息和购买的数量

     1 package com.bie.po;
     2 
     3 /**
     4  * @author BieHongLi
     5  * @version 创建时间:2017年2月27日 上午10:40:53 
     6  * 购物项
     7  */
     8 public class CartItem {
     9 
    10     private Book book;// 图书对象的成员变量
    11     private Integer number;// 购买的数量;
    12 
    13     public Book getBook() {
    14         return book;
    15     }
    16 
    17     public void setBook(Book book) {
    18         this.book = book;
    19     }
    20 
    21     public Integer getNumber() {
    22         return number;
    23     }
    24 
    25     public void setNumber(Integer number) {
    26         this.number = number;
    27     }
    28 
    29 }
     1 <%@page import="java.util.HashMap"%>
     2 <%@page import="com.bie.po.CartItem"%>
     3 <%@page import="java.util.Map"%>
     4 <%@page import="com.bie.po.Book"%>
     5 <%@ page language="java" contentType="text/html; charset=UTF-8"
     6     pageEncoding="UTF-8"%>
     7 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     8 <html>
     9 <head>
    10 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    11 <title>添加到购物车</title>
    12 </head>
    13 <body>
    14 <%
    15     //购物车功能
    16     //1:首先考虑我购买的是哪一本书籍,这里可以使用id确认也可以使用session中取出哪一本书籍
    17     Book book=(Book)session.getAttribute("book");
    18     
    19     //2:考虑如何把书籍放到购物车中
    20         //2.1:首先考虑是否有购物车,如果没有,则创建,如果有直接使用
    21         //2.2:其次先将购物车从session中拿出来,不存在就创建。
    22     Map<Integer,CartItem> cart=(Map<Integer,CartItem>)session.getAttribute("cart");
    23     //如果没有购物车,那么创建,只有第一次访问才会操作
    24     if(cart==null){
    25         //new一个购物车
    26         cart=new HashMap<>();
    27     }
    28     
    29     //3:考虑如何把书籍放到购物车中
    30         //3.1:第一考虑购物车中是否有该书籍,所以先从购物车中获取该书籍,如果为空,那么没有该书籍
    31     CartItem item=(CartItem)cart.get(book.getBookid());
    32     if(item==null){
    33         //如果购物车中不存在该书籍,那么创建,且数量默认为1
    34         item=new CartItem();
    35         //将书籍放到购物车中
    36         item.setBook(book);
    37         //将书籍的默认数量为1
    38         item.setNumber(1);
    39     }else{
    40         //如果购物车中以及有该书籍,那么数量加1 
    41         item.setNumber(item.getNumber()+1);
    42     }
    43     
    44     //4:考虑如何把购物车项(即挑选的书籍是哪一个和书本的数量)放到购物车中
    45     cart.put(book.getBookid(),item);
    46     
    47     //5:将购物车放到session中,方便后面取出来
    48     session.setAttribute("cart", cart);
    49     
    50     response.sendRedirect("book.jsp");
    51 %>
    52 </body>
    53 </html>

    11:写完上面的就可以查看我的购物车了,在book.jsp页面和detail.jsp页面都有可以点击查看我的购物车的连接,然后就可以查看我的购物车,完成购物车功能。

     1 <%@page import="com.bie.po.CartItem"%>
     2 <%@page import="java.util.Map"%>
     3 <%@ page language="java" contentType="text/html; charset=UTF-8"
     4     pageEncoding="UTF-8"%>
     5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     6 <html>
     7 <head>
     8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     9 <title>我的购物车的页面</title>
    10 </head>
    11 <body>
    12 <table width="100%" align="center" border="1px">
    13     <tr>
    14         <th>书本编号</th>
    15         <th>书本名称</th>
    16         <th>书本单价</th>
    17         <th>书本数量</th>
    18         <th>书本小计</th>
    19     </tr>
    20     <%
    21         //1:将添加到购物车里面的物品显示出来
    22          Map<Integer,CartItem> map=(Map<Integer,CartItem>)session.getAttribute("cart");
    23         //2:将购物车里面的内容遍历出来
    24         double count=0;//显示出总价格
    25         for(Map.Entry<Integer,CartItem> entry : map.entrySet()){
    26             //计算出每一样的书籍一共花了多少钱
    27             double price=entry.getValue().getBook().getPrice() * entry.getValue().getNumber();    
    28             //计算出一共花了多少钱
    29             count=count+price;
    30     %>
    31     <tr align="center">    
    32         <td><%=entry.getKey() %></td>
    33         <td><%=entry.getValue().getBook().getBookname() %></td>
    34         <td><%=entry.getValue().getBook().getPrice() %></td>
    35         <td><%=entry.getValue().getNumber() %></td>
    36         <td><%=entry.getValue().getBook().getPrice() * entry.getValue().getNumber()%></td>
    37         
    38     </tr>
    39     <%} %>
    40     <tr>
    41         <td colspan="4" align="right">价格总计</td>
    42         <td><%=count %></td>
    43     </tr>
    44 </table>
    45 <div style="text-align:center;font-size:36px;">
    46     <a href="book.jsp">图书列表</a>
    47 </div>    
    48 </body>
    49 </html>

    效果如下所示:

    虽然简陋,没有完全实现完,还待改善,继续加油!!!

  • 相关阅读:
    VUE中全局变量的定义和使用
    Pull Request 工作流——更高效的管理代码
    仓储repository概念
    Mysql存储过程历史表备份
    OpenStack一键安装
    VMware虚拟机设置Win10固定ip
    C#_NPOI_Excel各种设置
    pycharm修改镜像
    C#模拟POST上传文件帮助类(支持https、http)
    Windows安装RabbitMQ
  • 原文地址:https://www.cnblogs.com/biehongli/p/6473034.html
Copyright © 2011-2022 走看看