第一:概念
购物车全过程的理解:
 1.新建一个购物车类,这样,这个类里面就可以封装商品对象和商品数量了。
 2.每种商品都是一个购物车
 3.把所有的购物车放在一起,也就是放在一个map集合中,这样也就是购买多个商品(一个或者多个),商品放在后一起提交订单。
 4.重点:每次添加商品其实就是往map集合中添加一个购物车对象(购物车对象是根据购物车这个实体类创建的)
 5.重点:购物完成之后把这个map集合放在sesison域中
 6.也就是说第一次购买商品的时候创建一个map集合,第一次购买某个商品的时候创建一个购物车对象car。把每个商品car都放在集合map中。最终把集合放在session中
 7.为什么要使用集合存放购物车?因为集合是长度可变的数组,因此可以完成商品的添加和移除。
第二:代码
1.购物车类
package com.entity;
//购物车类
public class CarItem {
 private Flower flower;
 private int count;
 public Flower getFlower() {
  return flower;
 }
 public void setFlower(Flower flower) {
  this.flower = flower;
 }
 public int getCount() {
  return count;
 }
 public void setCount(int count) {
  this.count = count;
 }
 
}
2:购物车的实现、json计算小计和总计
package com.action;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.comm.FormatDate;
import com.dao.FlowerDao;
import com.dao.impl.FlowerDaoImpl;
import com.entity.CarItem;
import com.entity.Flower;
import com.entity.Orders;
import com.entity.UserInfo;
import com.google.common.collect.Iterables;
public class FlowerServlet extends HttpServlet{
 FlowerDao fdao= new FlowerDaoImpl();
@SuppressWarnings("unused")
 @Override
 protected void service(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
   req.setCharacterEncoding("gbk");
   String op=req.getParameter("op");
   if(op==null){
    this.IndexFlower(req, resp);
   }else
   if(op.equals("searchoneflower")){
    this.DetailsFlower(req, resp);
   }else
   if(op.equals("addflower")){
    this.ShopFlower(req, resp);
   }else
   if(op.equals("kong")){
    ClearCart(req,resp);
   }else
   if(op.equals("tj")){
    TjCart(req,resp);
   }else
   if(op.equals("clearone")){
    this.ClearOne(req, resp);
   }else
   if(op.equals("updateCount")){
    this.UpdateCount(req, resp);
   }else
   if(op.equals("SearcAll")){
    SearchPage(req,resp);
   }else
  if(op.equals("AdminSearchAll")){
   AdminSearchAll(req,resp);
   }
  
   /*if(op.equals("SearcAll")){
    SearcAll(req,resp);
   }*/
 }
 
 @SuppressWarnings("unchecked")
 protected void IndexFlower(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  //req.setCharacterEncoding("utf-8");
  FlowerDao fdao = new FlowerDaoImpl();
  //1.首页鲜花
    ArrayList<Flower> flist=(ArrayList<Flower>)fdao.SearchFlower(); 
  //2.首页蛋糕
    ArrayList<Flower> fclist=(ArrayList<Flower>)fdao.findCake(); 
  //3.查找新礼蓝
    ArrayList<Flower> fllist=(ArrayList<Flower>)fdao.findLiLan();
  //4.判断
    if(flist!=null&&flist.size()>0&&fclist!=null&&fclist.size()>0&&fllist!=null&&fllist.size()>0){
     HttpSession session=req.getSession();
     session.setAttribute("flist", flist);
     session.setAttribute("fclist", fclist);
     session.setAttribute("fllist", fllist);
     resp.sendRedirect("index.jsp");
    }else{
     resp.sendRedirect("error.jsp");
    }
 }
 
 
 
   
 //1.在首页查询鲜花详情
 protected void DetailsFlower(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  String flowerId=req.getParameter("flowerId");
  Flower flower=fdao.DetailsFlower(Integer.parseInt(flowerId));
  if(flower!=null){
   HttpSession session=req.getSession();
   session.setAttribute("flower", flower);
   resp.sendRedirect("details.jsp");
  }else{
   resp.sendRedirect("flowerServlet");
  } 
 }
 
 //2.把鲜花添加到购物车
 @SuppressWarnings("unused")
 protected void ShopFlower(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  HttpSession session=req.getSession();
  //1.判断是否已经登陆
  Object obj=session.getAttribute("u");
  if(obj==null){
   System.out.println("没有登陆成功,没有用户");
   resp.sendRedirect("login.jsp");
   return;
  }
  //2.进行添加到购物车的操作
  CarItem car=null;
  int flowerId=Integer.parseInt(req.getParameter("flowerId"));
  Flower flower=(Flower) session.getAttribute("flower");
  Map mycart=(Map)session.getAttribute("mycart");//创建map结合当做购物车,并把session容器中的内容放在map容器中。这里已经不是第一次购买了。
  if(mycart==null){//第一次购购物,购物车为空
   mycart=new HashMap();//第一次购物的时候给他一个购物
   System.out.println("第一次使用购物车");
  }
    
  if(mycart.keySet().contains(flowerId)){//如果这次添加的商品在购物车里出现过
   System.out.println("重复购买该商品");
   car=(CarItem) mycart.get(flower.getFlowerId());
   car.setCount(car.getCount()+1);  
  }else{//第一次买
   System.out.println("第一次购买该商品");
   car = new CarItem();
   car.setFlower(flower);
   car.setCount(1);
  }
   
  
  mycart.put(flowerId, car);//每个商品对象都是购物车里的一员。该商品对象必须包含商品的主键和数量,因此创建一个新的实体类
  System.out.println("种类:"+mycart.size());;
  session.setAttribute("mycart", mycart);//此session用于保存商品对象
  resp.sendRedirect("shopCart.jsp");
  
 }
 
 
 //3.清空购物车
 protected void ClearCart(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  HttpSession session=req.getSession();
  session.removeAttribute("mycart");
  resp.sendRedirect("flowerServlet");
 }
  
 //4.提交购物车
 protected void TjCart(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  HttpSession session=req.getSession();
  //1.判断当前是否登陆
  Object obj=session.getAttribute("u");
  if(obj==null){
   resp.sendRedirect("login.jsp");
   return;
  }
  //2.判断购物车是否有商品
  Object obj2=session.getAttribute("mycart");
  if(obj2==null){
   PrintWriter out=resp.getWriter();
   out.print("<script>alert('请先去首页添加商品');location.href='flowerServlet'</script>");
   return;
  }
  //3.提交购物车
  resp.sendRedirect("order.jsp");
 }
 
 
/* //5.清除点单中的某个商品,清除mycart这个session容器里的某一个值。
 protected void ClearOne(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  String flowerId=req.getParameter("flowerId");
  HttpSession session=req.getSession();
  Map map=(Map) session.getAttribute("mycart");//用map集合接收购物车
  Set set=map.keySet();
  Map map1=new HashMap();//新建一个map1集合用于接收筛选后的map集合
  Object[] arr= set.toArray();
  for(int x=0;x<arr.length;x++){
   if(arr[x].toString().equals(flowerId)){
    map.remove(arr[x]);//如果是要删除的就删除
   }else{
    map1.put(arr[x], map.get(arr[x]));//如果不是要删除的就把内容从map集合存到map1集合中
   }
  }
  session.setAttribute("mycart", map1);//键不变,还是原来购物车的那个键,值变成新的了。
  if(map!=null&&map.size()>0){
    resp.sendRedirect("shopCart.jsp");//如果map集合不为空说明该订单里还有商品,因此显示该订单里的商品
  }else{
    resp.sendRedirect("flowerServlet");//如果map集合为空说明该订单下没有商品了,就直接跳到首页 
  }
  }
 */
 
 ///5.注意:这里是对上面的删除购物车里某个商品的功能的改进,也就是使用另一种思路写的该方法。
 //清除点单中的某个商品,清除mycart这个session容器里的某一个值。
 protected void ClearOne(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  String flowerId=req.getParameter("flowerId");
  HttpSession session=req.getSession();
  Map mycart=(Map) session.getAttribute("mycart");//mycart是存放所有购物车的
     CarItem car= (CarItem) mycart.get(Integer.parseInt(flowerId));//这是要删除的某个具体的购物车
    // System.out.println("输出:"+car.getFlower()+"  "+mycart.size());
     mycart.remove(Integer.parseInt(flowerId));
     //System.out.println("输出:"+car.getFlower()+"  "+mycart.size());
    // session.setAttribute("mycart", mycart);不许要写这句话。因为我们只是修改了里面的值
     if(mycart!=null&&mycart.size()>0){
      resp.sendRedirect("shopCart.jsp");
     }else{
      resp.sendRedirect("flowerServlet");
      
     }
    
  }
 
/* //6.修改购物车中某商品的数量
 protected void UpdateCount(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  String flowerId=req.getParameter("flowerId");
  HttpSession session=req.getSession();
  Map mycart=(Map) session.getAttribute("mycart");
  CarItem car=(CarItem) mycart.get(Integer.parseInt(flowerId));//通过键找值
  String count=req.getParameter("count");
  //System.out.println("数量:"+count);
  if(count.equals("0")){
   mycart.remove(Integer.parseInt(flowerId));
  }else{
   car.setCount(Integer.parseInt(count));
  } 
  session.setAttribute("mycart", mycart);
  resp.sendRedirect("shopCart.jsp");  
 }*/
 //6.修改购物车中某商品的数量,并按照老师的思路,修改数量的同时修改了小计和总计
 protected void UpdateCount(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  String flowerId=req.getParameter("flowerId");
  HttpSession session=req.getSession();
  Map<String,CarItem>  mycart=(Map) session.getAttribute("mycart");
  CarItem car=(CarItem) mycart.get(Integer.parseInt(flowerId));//通过键找值
  String count=req.getParameter("count");
  //System.out.println("数量:"+count);
  if(count.equals("0")){
   mycart.remove(Integer.parseInt(flowerId));
  }else{
   car.setCount(Integer.parseInt(count));
  } 
  session.setAttribute("mycart", mycart);
  
  double xj=car.getCount()*car.getFlower().getCurrentPrice();//小计
  double zj=0;//总计
  for(Entry<String,CarItem> e:mycart.entrySet())
  {
   //xj=e.getValue().getCount()*e.getValue().getFlower().getCurrentPrice();
   zj=zj+(e.getValue().getCount()*e.getValue().getFlower().getCurrentPrice());
  }
  
  /*PrintWriter out=resp.getWriter();
  System.out.println("修改了数量:"+car.getCount());
  out.print(car.getCount());*/
  PrintWriter out =resp.getWriter();
  String json="[{\"xj\":"+xj+",\"zj\":"+zj+"}]";
  System.out.println(json);
  out.print(json);
 }
 
 //没使用分页的查询鲜花
 protected void SearcAll(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  String typeId=req.getParameter("type");
  ArrayList<Flower> flowerList=(ArrayList<Flower>) fdao.SearcAll(Integer.parseInt(typeId));
  if(flowerList!=null&&flowerList.size()>0){
   HttpSession session=req.getSession();
   session.setAttribute("flowerList", flowerList);
   resp.sendRedirect("flower.jsp");
  }else{
   resp.sendRedirect("error.jsp");
  }
 }
 
 //使用分页查询鲜花
 protected void SearchPage(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  String typeId=req.getParameter("type");
  //实现分页中的上一页和下一页
  int pageNum=0;//初始化当前页
  int pageSize=0;//初始化页大小
  String pn=req.getParameter("pn");
  if(pn==null){
   pageNum=1;
   pageSize=10;
  }
  else{
   pageNum=Integer.parseInt(pn); 
   pageSize=10;
  }
  ArrayList<Flower> flowerList=(ArrayList<Flower>) fdao.searchPage(pageNum, pageSize,(pageNum-1)*pageSize,Integer.parseInt(typeId));
  //实现末页
  int toatlpage=fdao.getTotalPage(pageSize,Integer.parseInt(typeId));
  //System.out.println("总页数:"+toatlpage);
  //跳转
  if(flowerList!=null&&flowerList.size()>0){
   HttpSession session=req.getSession();
   session.setAttribute("flowerList", flowerList);
   session.setAttribute("pageNum", pageNum);
   session.setAttribute("pageSize", pageSize);
   session.setAttribute("toatlpage", toatlpage);
   if(Integer.parseInt(typeId)==0)
   {
    resp.sendRedirect("flower.jsp");
   }
   else if(Integer.parseInt(typeId)==1)
   {
    resp.sendRedirect("cake.jsp");
   }
   else if(Integer.parseInt(typeId)==2)
   {
    resp.sendRedirect("gift.jsp");
   }
   else if(Integer.parseInt(typeId)==3)
   {
    resp.sendRedirect("lvZhiHuaHui.jsp");
   }
   else if(Integer.parseInt(typeId)==4)
   {
    resp.sendRedirect("shangWu.jsp");
   }
  }else{
   resp.sendRedirect("error.jsp");
  }
 }
 protected void AdminSearchAll(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  //实现分页中的上一页和下一页
  int pageNum=0;//初始化当前页
  int pageSize=0;//初始化页大小
  String pn=req.getParameter("pn");
  if(pn==null){
   pageNum=1;
   pageSize=10;
  }
  else{
   pageNum=Integer.parseInt(pn); 
   pageSize=10;
  }
  ArrayList<Flower> flowerList=(ArrayList<Flower>) fdao.AdminsearchPage(pageNum, pageSize);
  int toatlpage=fdao.AdmingetTotalPage(pageSize);
  if(flowerList!=null&&flowerList.size()>0){
   HttpSession session=req.getSession();
   session.setAttribute("flowerList", flowerList);
   session.setAttribute("pageNum", pageNum);
   session.setAttribute("pageSize", pageSize);
   session.setAttribute("toatlpage", toatlpage);
   resp.sendRedirect("Admin/flowerList.jsp");
  }else{
   resp.sendRedirect("error.jsp");
  }
 }
}
3.分页
<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   
    <title>My JSP 'orderList.jsp' starting page</title>
   
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->
  <script type="text/javascript">
    function go(){
     var p=document.getElementById("p").value;
     var maxpage=document.getElementById("maxpage").value;//注意:开始想写个隐藏域,但是js中不支持隐藏域。注意这里通过id获得值不支持使用type="hidde"
     //alert("设计出:"+p+" "+maxpage);
     if(p>maxpage){
     alert("你输入的页数过大,请重写输入");
      //window.history.back();
      return;
     }else{
     window.location.href="../orderServlet?op=AdminfindOrdersPage&pn="+p;
     }
    }
    </script>
 
<link href="CSS/style.css" rel="stylesheet" type="text/css">
    <link href="../CSS/style.css" rel="stylesheet" type="text/css">
  </head>
  <script type="text/javascript" src="JS/amdinDivControl.js"></script>
  <body>
  <br>
  <form name="form1" method="post" action="DeleteServlet?type=order">
    <table width="605" height="102" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#84C1C1">
      <tr>
        <td width="76" height="35" align="center" bgcolor="#84C1C1" class="font"><input type="submit" name="Submit" value="删除" onClick="deleteE()"></td>
        <td width="105" align="center" bgcolor="#84C1C1" class="font">订单编号</td>
        <td width="106" align="center" bgcolor="#84C1C1" class="font">订单人</td>
        <td width="110" align="center" bgcolor="#84C1C1" class="font">订单总价</td>
        <td width="133" align="center" bgcolor="#84C1C1" class="font">订单状态</td>
        <td width="198" align="center" bgcolor="#84C1C1" class="font">订单时间</td>
      </tr>
      <c:forEach items="${orderList}" var="order">
      <tr>
        <td height="33" align="center" bgcolor="#FFFFFF" class="font"><input type="checkbox" name="checkbox" value="${order.orderId}"></td>
        <td align="center" bgcolor="#FFFFFF" class="font">${order.orderCode }</td>
        <td align="center" bgcolor="#FFFFFF" class="font">${order.userName }</td>
        <td align="center" bgcolor="#FFFFFF" class="font">${order.total }</td>
        <td align="center" bgcolor="#FFFFFF" class="font">${order.orderStatus==1?"正在处理":"完成交易"}</td>
        <td align="center" bgcolor="#FFFFFF" class="font">${order.orderTime}</td>
      </tr>
      </c:forEach>
      <tr>
        <td height="29" colspan="6" align="right" bgcolor="#FFFFFF" class="font">
        <c:choose>
      <c:when test="${pageNum eq 1}">
         <a href="orderServlet?op=AdminfindOrdersPage&pn=${pageNum+1}" style="text-decoration: none;">下一页</a>
         <a href="orderServlet?op=AdminfindOrdersPage&pn=${toatlpage}" style="text-decoration: none;">末页</a>  
      </c:when>
      <c:when test="${pageNum eq toatlpage}">
      <a href="orderServlet?op=AdminfindOrdersPage&pn=${pageNum-1 }"style="text-decoration: none;">上一页</a>
      <a href="orderServlet?op=AdminfindOrdersPage&pn=1" style="text-decoration: none;">首页</a>                       
      </c:when>
      <c:otherwise>
           <a href="orderServlet?op=AdminfindOrdersPage&pn=${pageNum+1}" style="text-decoration: none;">下一页</a>
        <a href="orderServlet?op=AdminfindOrdersPage&pn=${pageNum-1 }"style="text-decoration: none;">上一页</a>
        <a href="orderServlet?op=AdminfindOrdersPage&pn=1" style="text-decoration: none;">首页</a>
        <a href="orderServlet?op=AdminfindOrdersPage&pn=${toatlpage}" style="text-decoration: none;">末页</a>             
      </c:otherwise>
  </c:choose> 
           当前页:<input type="text" value="${pageNum }" readonly="readonly" size="4">&nbsp; 
           共<input type="text" value="${toatlpage }" id="maxpage" readonly="readonly" size="4">页    
           <input type="text" size="4" id="p" value="${pageNum}">           
           <a href="javascript:go()">go</a> 
        </td>
      </tr>
    </table>
  </form>
  </body>
</html>

j2ee:servlet练习鲜花项目(购物车、分页、ajax、iframe弹出层、jquery、json(计算小计、总计)、map集合高级遍历、图片上传)...相关推荐

  1. php jquery ajax登录,jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)

    弹出层主要用于展示丰富的页面信息,还有一个更好的应用是弹出表单层丰富交互应用.常见的应用有弹出登录表单层,用户提交登录信息,后台验证登录成功后,弹出层消失,主页面局部刷新用户信息.本文我们将给大家介绍 ...

  2. kindeditor java_kindeditor在Java项目中的应用以及图片上传配置

    在官网下载Kindededitor的开发包 在项目中javaweb项目中导入kindeditor必须要使用的Jar包(用于文件上传,除非你的富文本编辑器不使用图片上传)jar包可以在官网的开发包中找到 ...

  3. SpringSSM的教师管理系统--ajax版本,分页,图片上传,jsp页面使用bootstrap布局

    项目的结构 maven的配置 pom.xml 文件 ](maven的配置 pom.xml 文件) <project xmlns="http://maven.apache.org/POM ...

  4. themyleaf 图片上传_javaEE --springboot #实现图片上传和回显 #单文件上传 #多文件上传 #ajax异步文件上传 (非常详细,从创建项目开始)...

    实现文件上传和回显 1.新建一个SpringBoot项目,选择 Spring Web 和 thymeleaf 依赖 .pow.xml文件下的依赖如下 2.根据下图,创建如下文件 3.直接上代码 配置文 ...

  5. c ajax 上传图片,ajax +NodeJS 实现图片上传实例

    前台用jquery的ajax发请求,后台用NodeJS 的multer模块实现图片上传.这个demo给我的感悟是一定要自己能实现出来,而不是看了别人写好就直接"拿来"用 note( ...

  6. 【图片上传与图片显示】 SpringBoot ajax (跨域问题)

    <上传> 前端: uploadImg.html <!DOCTYPE html> <html lang="en" xmlns:th="http ...

  7. UEditor之图片上传如何和真实项目结合

    开心一笑 周末,五六个朋友聚餐,席间,阿凌注意到阿艳沉默少语,不比以往的活波开朗,像有心事.饭后回去的路上,阿凌走到阿艳身边说:"你的电量好像不够了?" 阿艳:"啊,什么 ...

  8. java的图片上传与前端展示实例(Servlet+Jsp)

    java的图片上传与前端展示实例(Servlet+Jsp) 内容前瞻 1.关于路径 2.前端图片上传与展示 3.后台获取并保存 环境 1.前端jsp 2.服务器tomcat 3.服务端servlet ...

  9. Java分布式二手房项目尚好房第五课 图片上传及前端房源展示

    尚好房:图片上传 一.图片存储方案 1.介绍 在实际开发中,我们会有很多处理不同功能的服务器.例如: 应用服务器:负责部署我们的应用 数据库服务器:运行我们的数据库 文件服务器:负责存储用户上传文件的 ...

最新文章

  1. java连接mysql8的坑
  2. 水晶报表弹出用户密码输入框问题的解决
  3. Logstash 父子关系 配置
  4. php 文件上传系统,php需登录文件上传管理系统
  5. spark编译错误解决 Error:(52, 75) not found: value TCLIService
  6. 程序员你造吗?2016年加州将建造子弹头火车,你还在CODE?
  7. Android屏幕适配和文字屏幕适配
  8. python简单代码-用Python代码实现5种最好的、简单的数据可视化!
  9. Ubuntu 挂载windows硬盘突然变成只读了???
  10. batchplot插件用法_autocad批量打印工具2015-BatchPlot(AutoCAD批量打印软件)3.5.9 官方最新版【附使用教程】-东坡下载...
  11. AspNetPager 分页
  12. Unicode与中文互转(反斜杠u(\u)开头的16进制Unicode编码转换成中文汉字
  13. 可恢复保险丝特性测试
  14. iOS Quartz2D 渐变图形 CGGradient CGShading
  15. 销售如何维护客情关系 销售维护客户有什么方法
  16. centos-linux(64位)安装与配置
  17. 各大厂Linux面试题汇总,足够你学习的,不够找我
  18. 实现iServer发布地图
  19. RSD 教程 —— §3.7 查看位置信息
  20. 免费清新风教育教学通用PPT模板

热门文章

  1. 从Level 0到Level 5,自适应学习可分为哪些等级?
  2. 几个免费API接口分享,调用完全不限次数...
  3. c语言编程 显示动物,C语言编程 猜动物
  4. 【Git】连接远程仓库
  5. 【LeetCode】1518. 换酒问题(Java)
  6. Kubernetes(k8s)的RC(Replication Controller)副本控制器
  7. [原创] 我的项目管理之路--6、PMP认证
  8. C#调用杀毒软件MSE扫描指定目录或文件
  9. vue 在线预览、下载word、pdf文件
  10. javascript 如何动态引导web字体文件