购物车模块

购物车存储:

保存在session中(本次使用的)

保存在cookie中

保存在数据库中

购物车相关类

购物车结构

CartItem:包含图书和数量,小计

Cart:包含一个Map<String,CartItem>和部分购物车操作方法

修改登录方法,在用户登录成功后,马上在session中添加一辆车

页面负责遍历存在session域中的购物车属性

添加购物车条目

清空购物车条目

指定删除购物车条目

我的购物车

top.jsp中存在一个链接:我的购物车

我的购物车直接访问/jsps/cart/list.jsp,它会显示session中车的所有条目

代码

购物车类

/*** 购物车类* @author cxf**/
public class Cart {private Map<String,CartItem> map = new LinkedHashMap<String,CartItem>();/*** 计算合计* @return*/public double getTotal() {// 合计=所有条目的小计之和BigDecimal total = new BigDecimal("0");for(CartItem cartItem : map.values()) {BigDecimal subtotal = new BigDecimal("" + cartItem.getSubtotal());total = total.add(subtotal);}return total.doubleValue();}/*** 添加条目到车中* @param cartItem*/public void add(CartItem cartItem) {if(map.containsKey(cartItem.getBook().getBid())) {//判断原来车中是否存在该条目CartItem _cartItem = map.get(cartItem.getBook().getBid());//返回原条目_cartItem.setCount(_cartItem.getCount() + cartItem.getCount());//设置老条目的数量为,其自己数量+新条目的数量map.put(cartItem.getBook().getBid(), _cartItem);} else {map.put(cartItem.getBook().getBid(), cartItem);}}/*** 清空所有条目*/public void clear() {map.clear();}/*** 删除指定条目* @param bid*/public void delete(String bid) {map.remove(bid);}/*** 获取所有条目* @return*/public Collection<CartItem> getCartItems() {return map.values();}
}

购物车条目

/*** 购物车条目类* * @author cxf* */
public class CartItem {private Book book;// 商品private int count;// 数量/*** 小计方法* @return* 处理了二进制运算误差问题*/public double getSubtotal() {//小计方法,但它没有对应的成员!BigDecimal d1 = new BigDecimal(book.getPrice() + "");BigDecimal d2 = new BigDecimal(count + "");return d1.multiply(d2).doubleValue();}public Book getBook() {return book;}public void setBook(Book book) {this.book = book;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}
}

servlet

public class CartServlet extends BaseServlet {/*** 添加购物条目* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String add(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** 1. 得到车* 2. 得到条目(得到图书和数量)* 3. 把条目添加到车中*//** 1. 得到车*/Cart cart = (Cart)request.getSession().getAttribute("cart");/** 表单传递的只有bid和数量* 2. 得到条目*   > 得到图书和数量*   > 先得到图书的bid,然后我们需要通过bid查询数据库得到Book*   > 数量表单中有*/String bid = request.getParameter("bid");Book book = new BookService().load(bid);int count = Integer.parseInt(request.getParameter("count"));CartItem cartItem = new CartItem();cartItem.setBook(book);cartItem.setCount(count);/** 3. 把条目添加到车中*/cart.add(cartItem);return "f:/jsps/cart/list.jsp";}/*** 清空购物条目* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String clear(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 1. 得到车* 2. 设置车的clear*/Cart cart = (Cart)request.getSession().getAttribute("cart");cart.clear();return "f:/jsps/cart/list.jsp";}/*** 删除购物条目* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String delete(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** 1. 得到车* 2. 得到要删除的bid*/Cart cart = (Cart)request.getSession().getAttribute("cart");String bid = request.getParameter("bid");cart.delete(bid);return "f:/jsps/cart/list.jsp";}
}

订单模块

订单相关类

Order:订单

OrderItem:订单条目

生成订单

我的订单

加载订单

确认收货

代码

订单类

public class Order {private String oid;private Date ordertime;// 下单时间private double total;// 合计private int state;// 订单状态有四种:1未付款 2已付款但未发货 3已发货但未确认收货 4已确认交易成功private User owner;// 订单所有者private String address;// 收货地址private List<OrderItem> orderItemList;//当前订单下所有条目...
..
.

订单条目

public class OrderItem {private String iid;private int count;// 数量private double subtotal;// 小计private Order order;// 所属订单private Book book;// 所要购买的图书...

dao层

public class OrderDao {private QueryRunner qr = new TxQueryRunner();/*** 添加订单* @param order*/public void addOrder(Order order) {try {String sql = "insert into orders values(?,?,?,?,?,?)";/** 处理util的Date转换成sql的Timestamp*/Timestamp timestamp = new Timestamp(order.getOrdertime().getTime());Object[] params = {order.getOid(), timestamp, order.getTotal(),order.getState(), order.getOwner().getUid(),order.getAddress()};qr.update(sql, params);} catch(SQLException e) {throw new RuntimeException(e);}}/*** 插入订单条目* @param orderItemList*/public void addOrderItemList(List<OrderItem> orderItemList) {/*** QueryRunner类的batch(String sql, Object[][] params)* 其中params是多个一维数组!* 每个一维数组都与sql在一起执行一次,多个一维数组就执行多次*/try {String sql = "insert into orderitem values(?,?,?,?,?)";/** 把orderItemList转换成两维数组*   把一个OrderItem对象转换成一个一维数组*/Object[][] params = new Object[orderItemList.size()][];// 循环遍历orderItemList,使用每个orderItem对象为params中每个一维数组赋值for(int i = 0; i < orderItemList.size(); i++) {OrderItem item = orderItemList.get(i);params[i] = new Object[]{item.getIid(), item.getCount(), item.getSubtotal(), item.getOrder().getOid(),item.getBook().getBid()}; }qr.batch(sql, params);//执行批处理} catch(SQLException e) {throw new RuntimeException(e);}}/*** 按uid查询订单* @param uid* @return*/public List<Order> findByUid(String uid) {/** 1. 通过uid查询出当前用户的所有List<Order>* 2. 循环遍历每个Order,为其加载他的所有OrderItem*/try {/** 1. 得到当前用户的所有订单*/String sql = "select * from orders where uid=?";List<Order> orderList = qr.query(sql, new BeanListHandler<Order>(Order.class), uid);/** 2. 循环遍历每个Order,为其加载它自己所有的订单条目*/for(Order order : orderList) {loadOrderItems(order);//为order对象添加它的所有订单条目}/** 3. 返回订单列表*/return orderList;} catch(SQLException e) {throw new RuntimeException(e);}}/*** 加载指定的订单所有的订单条目* @param order* @throws SQLException */private void loadOrderItems(Order order) throws SQLException {/** 查询两张表:orderitem、book*/String sql = "select * from orderitem i, book b where i.bid=b.bid and oid=?";/** 因为一行结果集对应的不再是一个javabean,所以不能再使用BeanListHandler,而是MapListHandler*/List<Map<String,Object>> mapList = qr.query(sql, new MapListHandler(), order.getOid());/** mapList是多个map,每个map对应一行结果集* 一行:* {iid=C7AD5492F27D492189105FB50E55CBB6, count=2, subtotal=60.0, oid=1AE8A70354C947F8B81B80ADA6783155, bid=7, bname=精通Hibernate,price=30.0, author=张卫琴, image=book_img/8991366-1_l.jpg, cid=2}* ...* * 我们需要使用一个Map生成两个对象:OrderItem、Book,然后再建立两者的关系(把Book设置给OrderItem)*//** 循环遍历每个Map,使用map生成两个对象,然后建立关系(最终结果一个OrderItem),把OrderItem保存起来*/List<OrderItem> orderItemList = toOrderItemList(mapList);order.setOrderItemList(orderItemList);}/*** 把mapList中每个Map转换成两个对象,并建立关系* @param mapList* @return*/private List<OrderItem> toOrderItemList(List<Map<String, Object>> mapList) {List<OrderItem> orderItemList = new ArrayList<OrderItem>();for(Map<String,Object> map : mapList) {OrderItem item = toOrderItem(map);orderItemList.add(item);}return orderItemList;}/*** 把一个Map转换成一个OrderItem对象* @param map* @return*/private OrderItem toOrderItem(Map<String, Object> map) {OrderItem orderItem = CommonUtils.toBean(map, OrderItem.class);Book book = CommonUtils.toBean(map, Book.class);orderItem.setBook(book);return orderItem;}/*** 加载订单* @param oid* @return*/public Order load(String oid) {try {/** 1. 得到当前用户的所有订单*/String sql = "select * from orders where oid=?";Order order = qr.query(sql, new BeanHandler<Order>(Order.class), oid);/** 2. 为order加载它的所有条目*/loadOrderItems(order);/** 3. 返回订单列表*/return order;} catch(SQLException e) {throw new RuntimeException(e);}}/***  通过oid查询订单状态* @param oid* @return*/public int getStateByOid(String oid) {try {String sql = "select state from orders where oid=?";return (Integer)qr.query(sql, new ScalarHandler(), oid);} catch(SQLException e) {throw new RuntimeException(e);}}/*** 修改订单状态* @param oid* @param state* @return*/public void updateState(String oid, int state) {try {String sql = "update orders set state=? where oid=?";qr.update(sql, state, oid);} catch(SQLException e) {throw new RuntimeException(e);}}
}

service (包含事务)

public class OrderService {private OrderDao orderDao = new OrderDao();/*** 添加订单* 需要处理事务* @param order*/public void add(Order order) {try {// 开启事务JdbcUtils.beginTransaction();orderDao.addOrder(order);//插入订单orderDao.addOrderItemList(order.getOrderItemList());//插入订单中的所有条目// 提交事务JdbcUtils.commitTransaction();} catch(Exception e) {// 回滚事务try {JdbcUtils.rollbackTransaction();} catch (SQLException e1) {}throw new RuntimeException(e);}}/*** 我的订单* @param uid* @return*/public List<Order> myOrders(String uid) {return orderDao.findByUid(uid);}/*** 加载订单* @param oid* @return*/public Order load(String oid) {return orderDao.load(oid);}/*** 确认收货* @param oid* @throws OrderException*/public void confirm(String oid) throws OrderException {/** 1. 校验订单状态,如果不是3,抛出异常*/int state = orderDao.getStateByOid(oid);//获取订单状态if(state != 3) throw new OrderException("订单确认失败,您不是什么好东西!");/** 2. 修改订单状态为4,表示交易成功*/orderDao.updateState(oid, 4);}
}

servlet

public class OrderServlet extends BaseServlet {private OrderService orderService = new OrderService();/*** 确认收货* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String confirm(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** 1. 获取oid参数* 2. 调用service方法*   > 如果有异常,保存异常信息,转发到msg.jsp* 3. 保存成功信息,转发到msg.jsp*/String oid = request.getParameter("oid");try {orderService.confirm(oid);request.setAttribute("msg", "恭喜,交易成功!");} catch (OrderException e) {request.setAttribute("msg", e.getMessage());}return "f:/jsps/msg.jsp";}/*** 加载订单* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String load(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** 1. 得到oid参数* 2. 使用oid调用service方法得到Order* 3. 保存到request域,转发到/jsps/order/desc.jsp*/request.setAttribute("order", orderService.load(request.getParameter("oid")));return "f:/jsps/order/desc.jsp";}/*** 我的订单* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String myOrders(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** 1. 从session得到当前用户,再获取其uid* 2. 使用uid调用orderService#myOrders(uid)得到该用户的所有订单List<Order>* 3. 把订单列表保存到request域中,转发到/jsps/order/list.jsp*/User user = (User)request.getSession().getAttribute("session_user");List<Order> orderList = orderService.myOrders(user.getUid());request.setAttribute("orderList", orderList);return "f:/jsps/order/list.jsp";}/*** 添加订单* 把session中的车用来生成Order对象* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String add(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** 1. 从session中得到cart* 2. 使用cart生成Order对象* 3. 调用service方法完成添加订单* 4. 保存order到request域中,转发到/jsps/order/desc.jsp*/// 从session中获取cartCart cart = (Cart)request.getSession().getAttribute("cart");// 把cart转换成Order对象/** 创建Order对象,并设置属性* * Cart --> Order*/Order order = new Order();order.setOid(CommonUtils.uuid());//设置编号order.setOrdertime(new Date());//设置下单时间order.setState(1);//设置订单状态为1,表示未付款User user = (User)request.getSession().getAttribute("session_user");order.setOwner(user);//设置订单所有者order.setTotal(cart.getTotal());//设置订单的合计,从cart中获取合计/** 创建订单条目集合* * cartItemList --> orderItemList*/List<OrderItem> orderItemList = new ArrayList<OrderItem>();// 循环遍历Cart中的所有CartItem,使用每一个CartItem对象创建OrderItem对象,并添加到集合中for(CartItem cartItem : cart.getCartItems()) {OrderItem oi = new OrderItem();//创建订单条目oi.setIid(CommonUtils.uuid());//设置条目的idoi.setCount(cartItem.getCount());//设置条目的数量oi.setBook(cartItem.getBook());//设置条目的图书oi.setSubtotal(cartItem.getSubtotal());//设置条目的小计oi.setOrder(order);//设置所属订单orderItemList.add(oi);//把订单条目添加到集合中}// 把所有的订单条目添加到订单中order.setOrderItemList(orderItemList);// 清空购物车cart.clear();///** 3. 调用orderService添加订单*/orderService.add(order);/** 4. 保存order到request域,转发到/jsps/order/desc.jsp*/request.setAttribute("order", order);return "/jsps/order/desc.jsp";}
}

支付

在线支付的两种形式

1.电商与银行直连!

*安全/不收手续费/不与小电商合作

2.第三方支付平台

支付宝/易宝/财付通

*不安全/收手续费(1%)/小电商可以与其合作

需要在第三方注册账户

需要认证

本项目有一个测试账户用来测试

易宝支付

1去银行

易宝提供了一个网址(支付网关),重定向到这个地址即可

还需要给这个地址后添加13+1个参数

例:https://www.yeepay.com/app-merchant-proxy/node?p0_Cmd=Buy&p1_MerId=10001126856&p2_Order=123456&p3_Amt=1234.56&p4_Cur=CNY&p5_Pid=&p6_Pcat=&p7_Pdesc=&p8_Url=http://localhost:8080/bookstore/OrderServlet?method=back&p9_SAF=&pa_MP=&pd_FrpId=ICBC-NET-B2C&pr_NeedResponse=1&hmac=dd17580a3ca176ba62d6d348583ba88b

2易宝回调:

点对点:易宝直接访问电商--这里没有客户端什么事了

*这种方式是必须要使用的,我们这种方式是收不到的,因为我们没有固定IP(广域)

*易宝有一个重发机制,如果它访问你,你不给它回信息,它会一直重发

*电商需要返回一个以SUCCESS开头的字符串即可

引导客户端浏览器重定向到电商--是让客户端访问电商

*可以不使用的

hmac:13参数值+keyValue(密钥) + 算法(md5)

*13参数值:自己设置

*keyValue:易宝注册后发的只有自己和易宝知道

*底层为md5的算法:PaymentUtil.buildHmac(14个),它返回hmac

支付(去银行)

重定向:13+1个参数

支付(回馈)

校验访问者是否为易宝

修改订单状态

代码

/*** 支付之去银行* * @param request* @param response* @return* @throws ServletException* @throws IOException*/public String zhiFu(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Properties props = new Properties();InputStream input = this.getClass().getClassLoader().getResourceAsStream("merchantInfo.properties");props.load(input);/** 准备13参数*/String p0_Cmd = "Buy";String p1_MerId = props.getProperty("p1_MerId");String p2_Order = request.getParameter("oid");String p3_Amt = "0.01";String p4_Cur = "CNY";String p5_Pid = "";String p6_Pcat = "";String p7_Pdesc = "";String p8_Url = props.getProperty("p8_Url");String p9_SAF = "";String pa_MP = "";String pd_FrpId = request.getParameter("pd_FrpId");String pr_NeedResponse = "1";/** 计算hmac*/String keyValue = props.getProperty("keyValue");String hmac = PaymentUtil.buildHmac(p0_Cmd, p1_MerId, p2_Order, p3_Amt,p4_Cur, p5_Pid, p6_Pcat, p7_Pdesc, p8_Url, p9_SAF, pa_MP,pd_FrpId, pr_NeedResponse, keyValue);/** 连接易宝的网址和13+1个参数*/StringBuilder url = new StringBuilder(props.getProperty("url"));url.append("?p0_Cmd=").append(p0_Cmd);url.append("&p1_MerId=").append(p1_MerId);url.append("&p2_Order=").append(p2_Order);url.append("&p3_Amt=").append(p3_Amt);url.append("&p4_Cur=").append(p4_Cur);url.append("&p5_Pid=").append(p5_Pid);url.append("&p6_Pcat=").append(p6_Pcat);url.append("&p7_Pdesc=").append(p7_Pdesc);url.append("&p8_Url=").append(p8_Url);url.append("&p9_SAF=").append(p9_SAF);url.append("&pa_MP=").append(pa_MP);url.append("&pd_FrpId=").append(pd_FrpId);url.append("&pr_NeedResponse=").append(pr_NeedResponse);url.append("&hmac=").append(hmac);System.out.println(url);/** 重定向到易宝*/response.sendRedirect(url.toString());return null;}/*** 这个方法是易宝回调方法 我们必须要判断调用本方法的是不是易宝!* * @param request* @param response* @return* @throws ServletException* @throws IOException*/public String back(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** 1. 获取11 + 1*/String p1_MerId = request.getParameter("p1_MerId");String r0_Cmd = request.getParameter("r0_Cmd");String r1_Code = request.getParameter("r1_Code");String r2_TrxId = request.getParameter("r2_TrxId");String r3_Amt = request.getParameter("r3_Amt");String r4_Cur = request.getParameter("r4_Cur");String r5_Pid = request.getParameter("r5_Pid");String r6_Order = request.getParameter("r6_Order");String r7_Uid = request.getParameter("r7_Uid");String r8_MP = request.getParameter("r8_MP");String r9_BType = request.getParameter("r9_BType");String hmac = request.getParameter("hmac");/** 2. 校验访问者是否为易宝!*/Properties props = new Properties();InputStream input = this.getClass().getClassLoader().getResourceAsStream("merchantInfo.properties");props.load(input);String keyValue = props.getProperty("keyValue");boolean bool = PaymentUtil.verifyCallback(hmac, p1_MerId, r0_Cmd,r1_Code, r2_TrxId, r3_Amt, r4_Cur, r5_Pid, r6_Order, r7_Uid,r8_MP, r9_BType, keyValue);if(!bool) {//如果校验失败request.setAttribute("msg", "您不是什么好东西!");return "f:/jsps/msg.jsp";}/** 3. 获取状态订单,确定是否要修改订单状态,以及添加积分等业务操作*/orderService.zhiFu(r6_Order);//有可能对数据库进行操作,也可能不操作!/** 4. 判断当前回调方式*   如果为点对点,需要回馈以success开头的字符串*/if(r9_BType.equals("2")) {response.getWriter().print("success");}/** 5. 保存成功信息,转发到msg.jsp*/request.setAttribute("msg", "支付成功!等待卖家发货!你慢慢等~");return "f:/jsps/msg.jsp";}

serivice

/*** 支付方法* @param oid*/public void zhiFu(String oid) {/** 1. 获取订单的状态*   * 如果状态为1,那么执行下面代码*   * 如果状态不为1,那么本方法什么都不做*/int state = orderDao.getStateByOid(oid);if(state == 1) {// 修改订单状态为2orderDao.updateState(oid, 2);}}

web day25 web day24 小项目练习图书商城, 购物车模块,订单模块,支付(易宝支付)相关推荐

  1. 基于微信小程序小说图书商城管理系统(微信小程序毕业设计)

    基于微信小程序小说图书商城管理系统 小说图书商城后端是基于java编程语言,mysql数据库,ssm框架和idea工具开发,本系统主要分为用户,管理员可以对小说信息,用户信息,小说类别,小说资讯,轮播 ...

  2. Java项目:网上图书商城系统(java+SSM+Jsp+MySQL+Redis+JWT+Shiro+RabbitMQ+EasyUI)

    源码获取:博客首页 "资源" 里下载! 这个项目涉及到Shiro整合JWT.秒杀功能所具备的基本要求(限流.乐观锁.接口隐藏.JMeter高并发测试等等).消息中间件RabbitM ...

  3. springboot毕设项目网上图书商城q3ulr(java+VUE+Mybatis+Maven+Mysql)

    springboot毕设项目网上图书商城q3ulr(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBui ...

  4. 易宝支付Demo,生产中封装成简洁的代付接口,不用request如何获取项目运行时的真实路径...

    最近项目在做融360引流,涉及到了易宝支付的代扣和代付.易宝官方给出的demo只能简单运行,而且都是通过form表单的形式提交,返回XML格式.同时接口代码都写在了JSP中看起来不友好.项目在生成中想 ...

  5. 【SSH网上商城项目实战21】从Demo中看易宝支付的流程

    这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西,就是直接实现支付功能.实现支付功能需要易宝给我们提供的AP ...

  6. 小项目-网上购物商城(无代码)

    序言 此项目为网上购物商城实战训练项目,花费三天用来学习如何使用 Maven创建项目(这个具体的细节老师没讲,只是大致学习了操作的流程),然后一天时间用来做这个小项目.不过第四天上午我的workspa ...

  7. web前端练手小项目——使用js实现2048小游戏

    实现的效果图: 计分规则:每合并一次增加两个分 游戏涉及到的文件: 实现的html代码: <!DOCTYPE html> <html lang="en">& ...

  8. web前端练手小项目——仿照小米商城

    大部分是静态页面,使用的js知识只有一点点 实现的效果: 实现的html代码: <!DOCTYPE html> <html lang="en"> <h ...

  9. Java小项目--小型图书管理系统(含完整代码及工具)

    写在前面 对于一个java项目来说,我理解的整个流程是这样的: (1)进行需求分析 (2)设计数据库(重要) (3)编写java代码 注:数据库设计非常重要,特别是数据类型的定义,表与表之间的关系,如 ...

最新文章

  1. Linux下SVN服务器支持Apache的http和svnserve独立服务器
  2. Pandas读取csv时 设置列名
  3. 知乎大牛网友推荐几个靠谱老师及课程
  4. 一些关于流量和带宽的知识
  5. 观察者模式重复调用mysql问题,2、观察者模式
  6. Collections.sort()自定义排序方式
  7. oracle块空间的使用,Oracle管理存储架构(二)--Oracle管理数据块空间
  8. SQL Server-聚焦APPLY运算符(二十七)
  9. ASP.net(C#)]用DataSet进入对数据源的插入数据、更新数据及刪除数据
  10. 《数据结构C语言版》——栈和队列详解(图文并茂),从零开始的学习
  11. 快速上手,教你开发第一个基于 AutoML 的量化投资决策应用
  12. FPGA中for语句描述的七人投票表决器
  13. CVPR2020——D3VO论文阅读
  14. 1分钟学会系统安装方法,win7 XP win10 win11都变得非常简单
  15. 笔记本电脑清除BIOS密码
  16. PDF阅读软件哪个好用?思路提供
  17. 什么是tv域名?.tv域名不能实名吗?
  18. 在达内学java出来可靠吗_【求解】在达内学习java也有内幕啊 我要曝光!
  19. html 在线播放器,HTML5 Web播放器-Video.js
  20. 宁波初级职称证书查询

热门文章

  1. Oracle trunc()函数详解
  2. js字符串截取为数组
  3. 用DW敲-打地鼠小游戏
  4. a73*2+a53*2指的是什么_蚂蚁庄园11月5日小课堂今日答案 杨花落尽子规啼闻道龙标过五溪中的子规指的是什么|蚂蚁|庄园-游戏资讯...
  5. 文艺青年转行程序员,一路狂奔
  6. 蓝牙耳机哪个牌子好?蓝牙耳机品牌推荐
  7. linux查看usb驱动版本号,linux查看硬件信息及驱动设备相关整理
  8. 小学计算机课画小鸡,《灵活使用“画图”工具画小鸡》教学设计
  9. 【原创】pycharm快捷键汇总
  10. 7.Go语言基本类型 —— 字符类型