0%

EasyExcel写入多Sheet页:分组数据的高效处理方案

在实际开发中,经常需要按分组(如城市、部门、日期)将数据分别写入 Excel 的不同 Sheet 页,既便于数据归类,也方便用户查看。EasyExcel 作为阿里巴巴开源的高效 Excel 处理工具,提供了简洁的 API 支持多 Sheet 写入。本文将详细讲解多 Sheet 写入的实现步骤、核心代码及优化技巧,以 “按城市分组写入” 为例展开说明。

核心原理

EasyExcel 写入多 Sheet 页的核心逻辑是:

  1. 创建一个全局的 ExcelWriter 对象,关联目标文件和数据模型(实体类);
  2. 为每个分组创建一个 WriteSheet 对象(指定 Sheet 索引和名称);
  3. 通过 ExcelWriter 向每个 WriteSheet 写入对应分组的数据;
  4. 所有 Sheet 写入完成后,调用 finish() 方法关闭资源,完成文件生成。

环境准备

依赖配置

在 Maven 项目的 pom.xml 中引入 EasyExcel 依赖:

阅读全文 »

Spring Security 实现用户单设备登录控制

在许多系统中,为了安全性考虑,需要限制用户只能在一个设备上登录。Spring Security 提供了完善的会话管理机制,可以轻松实现这一需求,主要通过控制用户并发会话数量来实现。

两种单设备登录策略

1. 后来者登录,顶掉之前的登录者(默认行为)

这种策略允许新登录挤掉旧登录,适用于用户可能在不同设备间切换的场景。

1
2
3
4
5
6
7
8
9
10
11
12
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.csrf().disable()
// 会话管理配置
.sessionManagement()
// 设置最大会话数为1,即同一用户只能有一个有效会话
.maximumSessions(1);
}

效果:当用户在新设备登录时,系统会自动使该用户在其他设备上的旧会话失效,旧会话的用户在后续操作时会被要求重新登录。

2. 不允许后来者登录,保留当前登录

这种策略更严格,一旦用户在某个设备登录,其他设备的登录尝试会被拒绝。

1
2
3
4
5
6
7
8
9
10
11
12
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.csrf().disable()
.sessionManagement()
.maximumSessions(1)
// 关键配置:当达到最大会话数时,阻止新的登录
.maxSessionsPreventsLogin(true);
}

效果:如果用户已经在一个设备登录,当尝试在第二个设备登录时,会收到登录失败的提示,无法成功登录。

阅读全文 »

Scala 文件操作:读写与系统命令交互

Scala 提供了简洁的 API 用于文件读写和系统命令执行,既可以利用 Java 的 IO 类库,也可以使用 Scala 标准库中的工具(如 scala.io.Source)。此外,Scala 对系统命令的支持尤为便捷,能轻松实现命令执行、管道和重定向。本文将详细介绍 Scala 的文件操作和系统命令交互方式。

文件读取:scala.io.Source

Scala 标准库的 scala.io.Source 是读取文本文件的首选工具,支持从文件、URL、输入流等多种来源读取数据。

读取文件的所有行

使用 Source.fromFile 打开文件,getLines 方法获取所有行(返回 Iterator[String]):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import scala.io.Source
import java.io.File

object FileReader {
def main(args: Array[String]): Unit = {
// 打开文件(指定路径和编码)
val source: Source = Source.fromFile(new File("data.txt"), "UTF-8")

try {
// 读取所有行(返回迭代器)
val lines: Iterator[String] = source.getLines()

// 遍历行并打印
println("文件内容:")
lines.foreach(println)
} finally {
// 关闭资源(避免内存泄漏)
source.close()
}
}
}

关键说明

  • Source.fromFile 的第一个参数可以是文件路径字符串("data.txt")或 java.io.File 对象。
  • 第二个参数指定编码(如 "UTF-8"),默认使用系统编码。
  • 必须在 finally 块中调用 source.close(),确保资源释放。

读取整个文件为字符串

使用 mkString 方法直接将文件内容转换为单个字符串:

阅读全文 »

Git 协议详解:四种数据传输传输方式对比

Git 作为分布式版本控制系统,支持多种协议进行仓库数据的传输和同步。了解不同协议的特点和适用场景,有助于选择更高效、安全的协作方式。Git 主要支持四种协议:本地协议(Local)HTTP 协议SSH 协议Git 协议

本地协议(Local Protocol)

本地协议通过本地文件系统或网络文件共享(如 NFS)访问仓库,远程仓库本质上是本地硬盘或局域网中的一个目录。

1. 基本用法

1
2
3
4
5
6
7
8
# 克隆本地仓库(绝对路径)
git clone file:///opt/git/project.git

# 克隆本地仓库(相对路径)
git clone ./../project.git

# 为现有仓库添加本地远程
git remote add local /opt/git/project.git

2. 特点

  • 优点
    • 简单直观,适合本地单机或局域网内的小型团队。
    • 无需额外配置服务,直接通过文件系统访问。
    • 传输速度快(本地磁盘或局域网传输)。
  • 缺点
    • 不适合跨网络的远程协作(如异地团队)。
    • 权限管理依赖文件系统(如 Linux 文件权限),不够灵活。
    • 多人同时操作可能导致文件锁定或冲突。

3. 适用场景

  • 个人本地多仓库同步。
  • 局域网内的小型团队临时协作。

HTTP 协议

HTTP 协议是最常用的协议之一,通过 http://https:// 访问仓库,支持用户名 / 密码认证。

1. 基本用法

阅读全文 »

Nginx 多端适配配置:基于 User-Agent 的动态资源分发

在移动互联网时代,网站通常需要为 PC 端、移动端(手机、平板)提供不同的页面或服务。Nginx 可通过解析客户端的User-Agent头(浏览器标识),自动将请求导向对应的资源或服务,实现多端适配。本文详细讲解 Nginx 多端适配的配置方法、场景示例及优化技巧。

多端适配原理:解析 User-Agent

客户端发起请求时,会在 HTTP 头中携带User-Agent(UA)信息,包含设备类型、浏览器版本等(如:

  • PC 端:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
  • 移动端:Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148

Nginx 通过$http_user_agent变量获取 UA 信息,结合正则匹配判断设备类型,进而分发到对应的资源或服务。

基础配置:静态资源多端适配

若 PC 端和移动端的静态资源(HTML、CSS、JS)存放在不同目录,可通过root指令动态切换根目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name example.com;

location / {
# 默认指向PC端资源目录
root /var/www/pc;

# 匹配移动端UA,切换到移动端资源目录
if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry|iPad)') {
root /var/www/mobile;
}

# 索引页设置
index index.html index.htm;
}
}

配置说明

  • 正则匹配规则~*表示不区分大小写匹配,(Android|iPhone|...)涵盖主流移动设备的 UA 特征;
  • 目录结构
    • PC 端资源:/var/www/pc/index.html
    • 移动端资源:/var/www/mobile/index.html
  • 访问效果:PC 端访问example.com加载pc/index.html,移动端访问则加载mobile/index.html

进阶配置:反向代理多端服务

若 PC 端和移动端对应不同的后端服务(如 PC 端 API 和移动端 API),可通过proxy_pass反向代理到不同服务:

阅读全文 »