Spring Boot集成EasyPoi实现导入导出操作

文章目录

  • Spring Boot集成EasyPoi实现导入导出操作
    • 0 简要说明
    • 1 环境搭建
      • 1.1 项目目录
      • 1.2 依赖管理
      • 2.3 关于swagger处理
      • 2.4 关于切面处理耗时
        • 1 自定义注解
        • 2 定义切面类
        • 3 如何使用
      • 2.5 核心导入操作
      • 2.6 核心导出操作
    • 2 最佳实线
      • 2.1 导入操作
        • 1 实体类说明
        • 2 业务层
        • 3 效果
        • 3 控制层
      • 2.2 导出操作
      • 2.3 大数据量处理
    • 4 问题
      • 4.1 日期类型字段特殊处理
      • 4.2 文件上传
      • 4.3 指定导出路径

参考博客
1.官网

Spring Boot集成EasyPoi实现导入导出操作

0 简要说明

Excel自适应xls和xlsx两种格式,word只支持docx模式
主要特点

1.设计精巧,使用简单
2.接口丰富,扩展简单
3.默认值多,write less do more
4.spring mvc支持,web导出可以简单明了

在这里插入图片描述

1 环境搭建

1.1 项目目录

在这里插入图片描述

1.2 依赖管理

        <!--Spring 环境--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>xerces</groupId><artifactId>xercesImpl</artifactId><version>2.9.1</version></dependency><!--MySQL 驱动包--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.31</version></dependency><!--自动配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!--实体类优化--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--接口平台--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.7</version></dependency><!--commons-lang3工具包--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency><!--Mybatis Plus 扩展包--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>3.5.1</version></dependency><!--Mybatis Plus 依赖包--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><!--easypoi--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version></dependency><!--easyexcel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.9.1</version></dependency><!--接口平台--><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>

2.3 关于swagger处理

依赖

        <!--接口平台--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.7</version></dependency><!--接口平台--><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>

配置类

package com.geekmice.springbootselfexercise.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;/*** @BelongsProject: spring-boot-scaffold* @BelongsPackage: com.geekmice.sbhelloworld.com.geekmice.sbpagehelper.config* @Author: pingmingbo* @CreateTime: 2023-07-30  15:45* @Description: TODO* @Version: 1.0*/
@Configuration
public class Knife4jConfig {@Bean(value = "defaultApi2")public Docket customDocket() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.geekmice.springbootselfexercise.controller")).build();}/*** 构建 api文档的详细信息函数* @return*/private ApiInfo apiInfo() {return new ApiInfoBuilder().title("现货交易").version("1.0.0").description("现货交易详情").contact(new Contact("geekmice","http://geekmice.cn","2437690868@qq.com")).build();}
}

访问地址:http://localhost:端口号/doc.html
在这里插入图片描述

2.4 关于切面处理耗时

1 自定义注解

package com.geekmice.springbootselfexercise.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @author PMB*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodExporter {
}

2 定义切面类

package com.geekmice.springbootselfexercise.aspect;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;/*** @BelongsProject: spring-boot-scaffold* @BelongsPackage: com.geekmice.com.geekmice.sbpagehelper.utils* @Author: pmb* @CreateTime: 2023-07-26  21:52* @Description: TODO* @Version: 1.0*/
@Aspect
@Component
@Slf4j
public class MethodExporterAspect {@Around("@annotation(com.geekmice.springbootselfexercise.annotation.MethodExporter)")public Object methodExporter(ProceedingJoinPoint point) throws Throwable {long start = System.currentTimeMillis() / 1000;Object proceed = point.proceed();long end = System.currentTimeMillis() / 1000;log.info("【耗时:】{}s", (end - start));return proceed;}
}

3 如何使用

直接在控制层方法上面添加注解,调用接口即可生效

    @PostMapping(value = "uploadFileByEasyPoi")@MethodExporter@ApiOperation(value = "通过easypoi上传文件")public AjaxResult uploadFileByEasyPoi(@RequestPart MultipartFile file){userService.uploadFileByEasyPoi(file);return AjaxResult.success();}

在这里插入图片描述

2.5 核心导入操作

    @Overridepublic void uploadFileByEasyPoi(MultipartFile file) {InputStream inputStream;try {inputStream = file.getInputStream();} catch (IOException e) {log.error("error msg 【{}】", e);throw new IllegalArgumentException(e);}try {List<UserDomain> result = ExcelImportUtil.importExcel(inputStream, UserDomain.class, new ImportParams());for (UserDomain userDomain : result) {log.info("导入数据:【{}】", userDomain.toString());}this.saveBatch(result);log.info("录入结束");} catch (Exception e) {log.error("error msg 【{}】", e);throw new IllegalArgumentException(e);}}

2.6 核心导出操作

ExcelExportUtil是easypoi里面工具类

    public void downloadFileByEasyPoi() {List<UserDomain> list = new ArrayList(16);for (int i = 0; i < 10; i++) {UserDomain item = UserDomain.builder().userName(RandomStringUtils.randomAlphabetic(6)).address(RandomStringUtils.randomAlphabetic(10)).birthday(new Date()).sex("男").build();list.add(item);}Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), UserDomain.class, list);FileOutputStream outputStream;try {outputStream = new FileOutputStream("D:\\easypoi.xlsx");workbook.write(outputStream);} catch (FileNotFoundException e) {log.error("error msg 【{}】", e);throw new IllegalArgumentException(e);} catch (IOException e) {log.error("error msg 【{}】", e);throw new IllegalArgumentException(e);}}

2 最佳实线

2.1 导入操作

1 实体类说明

关于注解说明
easypoi起因就是Excel的导入导出,最初的模板是实体和Excel的对应,model–row,filed–col 这样利用注解我们可以和容易做到excel到导入导出
经过一段时间发展,现在注解有5个类分别是
@Excel 作用到filed上面,是对Excel一列的一个描述
@ExcelCollection 表示一个集合,主要针对一对多的导出,比如一个老师对应多个科目,科目就可以用集合表示
@ExcelEntity 表示一个继续深入导出的实体,但他没有太多的实际意义,只是告诉系统这个对象里面同样有导出的字段
@ExcelIgnore 和名字一样表示这个字段被忽略跳过这个导导出
@ExcelTarget 这个是作用于最外层的对象,描述这个对象的id,以便支持一个对象可以针对不同导出做出不同处理

package com.geekmice.springbootselfexercise.domain;import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelIgnore;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.util.Date;/*** (User)实体类** @author pingmingbo* @since 2023-08-06 09:51:28*/
@Data
@ApiModel
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "user")
public class UserDomain implements Serializable {private static final long serialVersionUID = 723356122339609354L;/*** 编号*/@ApiModelProperty(value = "编号")@ExcelIgnore@TableId(type = IdType.AUTO)private Long id;/*** 用户名*/@ApiModelProperty(value = "用户名")@Excel(name = "用户名")@TableField(value = "user_name")private String userName;/*** 生日*/@ApiModelProperty(value = "生日")@Excel(name="生日")@TableField(value = "birthday")private Date birthday;/*** 性别*/@Excel(name = "性别")@ApiModelProperty(value = "性别")@TableField(value = "sex")private String sex;/*** 地址*/@ApiModelProperty(value = "地址")@Excel(name = "地址")@TableField(value = "address")private String address;}

2 业务层

public interface UserService extends IService<UserDomain> {void uploadFileByEasyPoi(MultipartFile file);
}package com.geekmice.springbootselfexercise.service.impl;import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.geekmice.springbootselfexercise.dao.UserDao;
import com.geekmice.springbootselfexercise.domain.UserDomain;
import com.geekmice.springbootselfexercise.service.UserService;
import com.sun.corba.se.impl.corba.ExceptionListImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** (User)表服务实现类** @author pingmingbo* @since 2023-08-06 09:51:28*/
@Service("userService")
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserDao, UserDomain> implements UserService {@Resourceprivate UserDao userDao;@Overridepublic void uploadFileByEasyPoi(MultipartFile file) {InputStream inputStream;try {inputStream = file.getInputStream();} catch (IOException e) {log.error("error msg 【{}】", e);throw new IllegalArgumentException(e);}try {List<UserDomain> result = ExcelImportUtil.importExcel(inputStream, UserDomain.class, new ImportParams());for (UserDomain userDomain : result) {log.info("导入数据:【{}】", userDomain.toString());}this.saveBatch(result);log.info("录入结束");} catch (Exception e) {log.error("error msg 【{}】", e);throw new IllegalArgumentException(e);}}
}

3 效果

在这里插入图片描述

JDBC Connection [HikariProxyConnection@880330951 wrapping com.mysql.cj.jdbc.ConnectionImpl@55e295a5] will not be managed by Spring
==> Preparing: INSERT INTO user ( user_name, sex, address ) VALUES ( ?, ?, ? )
==> Parameters: pDwITO(String), 男(String), gqrkCeEpHh(String)
==> Parameters: TvOJNo(String), 男(String), BsAivNwjhP(String)
==> Parameters: miTVeL(String), 男(String), SMZOmxceID(String)
==> Parameters: siFTKf(String), 男(String), LcBfUNnITp(String)
==> Parameters: KGnyWX(String), 男(String), JXPbQboTdH(String)
==> Parameters: RyZYiE(String), 男(String), TydYPZxLah(String)
==> Parameters: JrcAnl(String), 男(String), bCttkDXCAN(String)
==> Parameters: nYMiAc(String), 男(String), uGXhBfyKgK(String)
==> Parameters: nDgzmK(String), 男(String), ZunMUZSYXa(String)
==> Parameters: xdLspA(String), 男(String), CLNrrpNHPw(String)
2023-08-06 14:00:51.218 INFO 9244 — [nio-8081-exec-3] c.g.s.service.impl.UserServiceImpl : 录入结束
在这里插入图片描述

3 控制层

    @PostMapping(value = "uploadFileByEasyPoi")@MethodExporter@ApiOperation(value = "通过easypoi上传文件")public AjaxResult uploadFileByEasyPoi(@RequestPart MultipartFile file){userService.uploadFileByEasyPoi(file);return AjaxResult.success();}

2.2 导出操作

核心代码

    @Overridepublic void downloadFileByEasyPoi() {List<UserDomain> list = new ArrayList(16);for (int i = 0; i < 10; i++) {UserDomain item = UserDomain.builder().userName(RandomStringUtils.randomAlphabetic(6)).address(RandomStringUtils.randomAlphabetic(10)).birthday(new Date()).sex("男").build();list.add(item);}Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), UserDomain.class, list);FileOutputStream outputStream;try {outputStream = new FileOutputStream("D:\\easypoi.xlsx");workbook.write(outputStream);} catch (FileNotFoundException e) {log.error("error msg 【{}】", e);throw new IllegalArgumentException(e);} catch (IOException e) {log.error("error msg 【{}】", e);throw new IllegalArgumentException(e);}}

2.3 大数据量处理

大数据导出是当我们的导出数量在几万,到上百万的数据时,一次从数据库查询这么多数据加载到内存然后写入会对我们的内存和CPU都产生压力,这个时候需要我们像分页一样处理导出分段写入Excel缓解Excel的压力 EasyPoi提供的是两个方法 *强制使用 xssf版本的Excel *

        <dependency><groupId>xerces</groupId><artifactId>xercesImpl</artifactId><version>2.9.1</version></dependency>

importExcelBySax方法

/*** Excel 通过SAX解析方法,适合大数据导入,不支持图片* 导入 数据源本地文件,不返回校验结果 导入 字 段类型 Integer,Long,Double,Date,String,Boolean* * @param inputstream* @param pojoClass* @param params* @param handler*/public static void importExcelBySax(InputStream inputstream, Class<?> pojoClass,ImportParams params, IReadHandler handler) {new SaxReadExcel().readExcel(inputstream, pojoClass, params, handler);}
    @Overridepublic void uploadBigFileByEasyPoi(MultipartFile file) {InputStream inputStream;try {inputStream = file.getInputStream();} catch (IOException e) {log.error("error msg 【{}】", e);throw new IllegalArgumentException(e);}ExcelImportUtil.importExcelBySax(inputStream,UserDomain.class,new ImportParams(),new UserHandler<UserDomain>());}

10w条数据,35s
与正常导入,10w数据,20s

4 问题

4.1 日期类型字段特殊处理

format属性指定一下日期格式

    @Excel(name="生日",format = "yyyy-MM-dd")private Date birthday;

4.2 文件上传

修改默认上传大小

  servlet:multipart:max-file-size: 50MBmax-request-size: 50MB

4.3 指定导出路径

核心代码

FileOutputStream outputStream = new FileOutputStream("D:\\test.xlsx"); // 指定输出流位置   workbook.write(outputStream) // 写到workbook中

业务层

        List<UserDomain> list = new ArrayList(16);for (int i = 0; i < 100000; i++) {UserDomain item = UserDomain.builder().userName(RandomStringUtils.randomAlphabetic(6)).address(RandomStringUtils.randomAlphabetic(10)).birthday(new Date()).sex("男").build();list.add(item);}Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), UserDomain.class, list);FileOutputStream outputStream;try {outputStream = new FileOutputStream("D:\\easypoi.xlsx");workbook.write(outputStream);} catch (FileNotFoundException e) {log.error("error msg 【{}】", e);throw new IllegalArgumentException(e);} catch (IOException e) {log.error("error msg 【{}】", e);throw new IllegalArgumentException(e);}log.info("easypoi导出结束");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用抓包工具

Fiddler Fiddler 是一个很好用的抓包工具&#xff0c;可以用于抓取http/https的数据包&#xff0c;常用于Windows系统的抓包&#xff0c;它有个优势就是免费 Charles Charles是由JAVA开发的&#xff0c;可以运行在window Linux MacOS&#xff0c;但它是收费的&#xff0c;和…

httpd+Tomcat(jk)的Web动静分离搭建

动静分离是指将动态请求和静态请求分别交给不同的服务器来处理&#xff0c;可以提高服务器的效率和性能。在Java Web开发中&#xff0c;常见的动态请求处理方式是通过Tomcat来处理&#xff0c;而静态请求则可以通过Apache服务器来处理。本文将详细讲解如何结合Apache和Tomcat来…

面试热题(翻转k个链表)

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值&a…

ctfshow-web7

0x00 前言 CTF 加解密合集 CTF Web合集 0x01 题目 0x02 Write Up 通过尝试&#xff0c;发现是数字型的注入&#xff0c;并且同样是过滤了空格 判断字段 获取一下flag即可 1/**/union/**/select/**/1,flag,3/**/from/**/web7.flag#&passworda以上

Spring接口ApplicationRunner的作用和使用介绍

在Spring框架中&#xff0c;ApplicationRunner接口是org.springframework.boot.ApplicationRunner接口的一部分。它是Spring Boot中用于在Spring应用程序启动完成后执行特定任务的接口。ApplicationRunner的作用是在Spring应用程序完全启动后&#xff0c;执行一些初始化任务或处…

【框架篇】MyBatis 介绍及使用(详细教程)

一&#xff0c;MyBatis 介绍 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff…

Oracle以逗号分隔的字符串拆分为多行数据实例详解

前言 近期在工作中遇到某表某字段是可扩展数据内容&#xff0c;信息以逗号分隔生成的&#xff0c;现需求要根据此字段数据在其它表查询相关的内容展现出来&#xff0c;第一想法是切割数据&#xff0c;以逗号作为切割符&#xff0c;以下为总结的实现方法&#xff0c;以供大家参…

微服务 云原生:基于 Gogs + Drone 进行项目 CI/CD

传统构建部署 以一个简单的前后端项目来说&#xff0c;分别编写前后端的 Dockerfile 文件并构建镜像&#xff0c;然后编写 docker-compose.yml 构建部署&#xff0c;启动运行。 一个简单的例子&#xff1a; 前端&#xff1a; 项目名&#xff1a;kubemanagement-web技术栈&am…

tomcat配置文件和web站点部署(zrlog)简介

一.tomcat/apache-tomcat-8.5.70/conf/server.xml组件类别介绍 1.类别 2.Connector参数 3.host参数 4.Context参数 二.web站点部署(以zrlog为例) 1.将zrlog的war包传到webapps下面 2.在mysql数据库中创建zrlog用户并赋予权限 3.完成安装向导&#xff0c;登录管理界面即可…

[golang gin框架] 45.Gin商城项目-微服务实战之后台Rbac微服务之角色权限关联

角色和权限的关联关系在前面文章中有讲解,见[golang gin框架] 14.Gin 商城项目-RBAC管理之角色和权限关联,角色授权,在这里通过微服务来实现角色对权限的授权操作,这里要实现的有两个功能,一个是进入授权,另一个是,授权提交操作,页面如下: 一.实现后台权限管理Rbac之角色权限关…

手眼标定眼在手上

1、为什么要用手眼标定&#xff08;在贴片机上定位已调通&#xff09; 参考手眼标定特别是眼在手上在网上的文章很多&#xff0c;但很多在实际中调试不通。在定位时候&#xff0c;往往希望相机能返回的是机械的世界坐标&#xff0c;而不是相机的的图像坐标。从而间接计算出相机…

arcgis--数据库构建网络数据集

1、打开arcmap软件&#xff0c;导入数据&#xff0c;如下&#xff1a; 该数据已经过处理&#xff0c;各交点处均被打断&#xff0c;并进行了拓扑检查。 2、在文件夹下新建文件数据库&#xff0c;名称为路网&#xff0c;在数据库下新建要素类&#xff0c;并导入道路shp文件&…

BIO,NIO,AIO总结

文章目录 1. BIO (Blocking I/O)1.1 传统 BIO1.2 伪异步 IO1.3 代码示例 1.4 总结2. NIO (New I/O)2.1 NIO 简介2.2 NIO的特性/NIO与IO区别1)Non-blocking IO&#xff08;非阻塞IO&#xff09;2)Buffer(缓冲区)3)Channel (通道)4)Selector (选择器) 2.3 NIO 读数据和写数据方式…

AWK实战案例——筛选给定时间范围内的日志

时间戳与当地时间 概念&#xff1a; 1.时间戳&#xff1a; 时间戳是指格林威治时间自1970年1月1日&#xff08;00:00:00 GMT&#xff09;至当前时间的总秒数。它也被称为Unix时间戳&#xff08;Unix Timestamp&#xff09;。通俗的讲&#xff0c;时间戳是一份能够表示一份数据…

Godot 4 源码分析 - 增加格式化字符串功能

Godot 4的主要字符串类型为String&#xff0c;已经设计得比较完善了&#xff0c;但有一个问题&#xff0c;格式化这块没怎么考虑。 String中有一个format函数&#xff0c;但这个函数只有两个参数&#xff0c;这咋用&#xff1f; String String::format(const Variant &va…

快速排序和qsort函数详解详解qsort函数

&#x1f495;是非成败转头空&#xff0c;青山依旧在&#xff0c;几度夕阳红&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;快速排序和qsort函数详解 前言&#xff1a; 我们之前学习过冒泡排序&#xff0c;冒泡排序尽管很方便&#xff0c;但也存在一些局限性…

Session与Cookie的区别(五)

储存状态的方式 小明的故事说完了&#xff0c;该来把上面这一段变成网络的实际案例了。其实在网络世界中问题也是一样的。 前面已经提到过我们会把状态存在 Cookie 里面&#xff0c;让 Request 之间能够变得有关联。 假设我们今天要来做一个会员系统&#xff0c;那我要怎么知道…

vue 列表|表格环境中的下拉菜单

elementui组件为vue提供了各式各样的ui组件&#xff0c;但均为各类最为基本的控件&#xff0c;没有提供业务级的使用案例&#xff0c;为此进行扩展补充。 vue-elementui 基本入门使用 一、下拉菜单 下拉菜单与html中的select控件有所差距&#xff0c;select为表单控件的一员页…

windows(iis)服务器部署安装wordpress(php)网站教程

该教程包含iis安装,php安装,mysql安装,php网站部署上线,windows服务部署php网站,只需要这一篇文章就够了。 该教程为iis服务器部署安装wordpress(php)网站教程,同样适用wordpress网站迁移。 配置要求 1、windows服务器安装iis windows服务器安装iis管理器 打开控制面…

项目中使用git vscode GitHubDesktopSetup-x64

一、使用git bash 1.使用git bash拉取gitee项目 1.在本地新建一个文件夹&#xff08;这个文件夹是用来存放从gitee上拉下来的项目的&#xff09; 2.在这个文件夹右键选择 git bash here 3.输入命令 git init (创建/初始化一个新的仓库) 4.输入命令 git remote add origin …