2024-08-12



import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import java.security.Security;
import java.util.Arrays;
 
public class SM4Utils {
    static {
        Security.addProvider(new BouncyCastleProvider());
    }
 
    public static byte[] encrypt(byte[] key, byte[] data) throws Exception {
        Cipher cipher = Cipher.getInstance("SM4", new BouncyCastleProvider());
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "SM4"));
        return cipher.doFinal(data);
    }
 
    public static byte[] decrypt(byte[] key, byte[] data) throws Exception {
        Cipher cipher = Cipher.getInstance("SM4", new BouncyCastleProvider());
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "SM4"));
        return cipher.doFinal(data);
    }
 
    // 测试加解密
    public static void main(String[] args) throws Exception {
        byte[] key = new byte[16]; // 16字节的SM4密钥
        byte[] data = "测试数据".getBytes("UTF-8");
 
        // 加密
        byte[] encryptedData = encrypt(key, data);
        System.out.println("加密后的数据: " + bytesToHex(encryptedData));
 
        // 解密
        byte[] decryptedData = decrypt(key, encryptedData);
        System.out.println("解密后的数据: " + new String(decryptedData, "UTF-8"));
    }
 
    // 字节数组转16进制字符串
    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexBuilder = new StringBuilder();
        for (byte b : bytes) {
            hexBuilder.append(String.format("%02X", b));
        }
        return hexBuilder.toString();
    }
}

这段代码提供了使用SM4加密算法进行加密和解密的方法,同时包含了密钥生成、加密、解密的简单示例。注意,在实际应用中,密钥生成方式应更安全,并确保密钥的安全存储。

2024-08-12

由于提供完整的系统源代码不符合平台的原创原则,以下是一个简化的Java代码示例,展示如何创建一个简单的智慧工地管理系统的登录功能:




import java.util.Scanner;
 
public class WiseCampusLogin {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean isLoginSuccessful = false;
        int attempts = 0;
 
        // 假设用户名和密码已经硬编码,实际应用中应该从数据库或其他安全存储加载
        final String USERNAME = "admin";
        final String PASSWORD = "password123";
 
        System.out.println("欢迎使用智慧工地管理系统");
        while (!isLoginSuccessful && attempts < 3) {
            System.out.print("请输入用户名: ");
            String username = scanner.nextLine();
            System.out.print("请输入密码: ");
            String password = scanner.nextLine();
 
            if (authenticate(username, password)) {
                isLoginSuccessful = true;
                System.out.println("登录成功!");
                // 进行后续操作...
            } else {
                System.out.println("登录失败,请重试。剩余尝试次数: " + (2 - attempts));
                attempts++;
            }
        }
 
        if (!isLoginSuccessful) {
            System.out.println("登录尝试超过次数限制,系统将自动锁定。");
            // 账户锁定逻辑...
        }
 
        scanner.close();
    }
 
    private static boolean authenticate(String username, String password) {
        final String USERNAME = "admin";
        final String PASSWORD = "password123";
        return username.equals(USERNAME) && password.equals(PASSWORD);
    }
}

这个简化的代码示例展示了一个简单的登录功能,包括用户名和密码的验证。实际的系统可能会涉及更复杂的安全措施和数据库操作。

2024-08-12

在Java中,数组是一种数据结构,用于存储相同类型的多个元素。数组是一种效率较高的存储和随机访问数据的方式。

以下是一些常见的数组操作:

  1. 创建数组



int[] array = new int[5]; // 创建一个长度为5的整数数组
  1. 初始化数组



int[] array = {1, 2, 3, 4, 5}; // 创建并初始化一个整数数组
  1. 访问数组元素



int firstElement = array[0]; // 访问第一个元素
  1. 修改数组元素



array[0] = 10; // 修改第一个元素为10
  1. 获取数组长度



int length = array.length; // 获取数组长度
  1. 遍历数组



for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
}
  1. 数组复制



int[] newArray = Arrays.copyOf(array, 10); // 复制数组到一个新的数组,新数组长度为10
  1. 数组搜索



int index = Arrays.binarySearch(array, 3); // 二分搜索数字3在数组中的位置
  1. 数组排序



Arrays.sort(array); // 对数组进行排序
  1. 数组转换为字符串



String arrayString = Arrays.toString(array); // 将数组转换为字符串表示

这些是数组操作的基本方法,在实际编程中,数组操作可能更复杂,可能涉及到多维数组、动态数组等。

2024-08-12

Seata 是一种高性能微服务分布式事务解决方案。以下是使用 Seata 进行分布式事务管理的基本步骤和示例代码:

  1. 服务端部署 Seata:需要部署 Seata Server。
  2. 客户端集成 Seata:在微服务应用中集成 Seata 客户端。
  3. 配置文件设置:在 resource 目录下添加或修改 file.confregistry.conf 文件。
  4. 使用注解或编程方式启用全局事务:在服务接口方法上使用 @GlobalTransactional 注解。

示例代码:




// 引入Seata相关依赖
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>版本号</version>
</dependency>
 
// 在微服务接口上使用@GlobalTransactional注解
@GlobalTransactional
public void purchase() {
    // 调用微服务A的扣减库存接口
    serviceA.deductStock();
    // 调用微服务B的扣减金额接口
    serviceB.deductMoney();
}

确保 Seata Server 正常运行,并且客户端配置正确指向 Seata Server。在微服务调用中,被 @GlobalTransactional 注解的方法会自动参与到全局事务中,如果任何一个步骤出错,整个事务会进行回滚。

2024-08-12

以下是一个简化的Java代码示例,展示如何创建一个简单的停车场管理系统的入口点:




import java.util.Scanner;
 
public class ParkingSystem {
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
 
        // 假设有三种不同类型的车位:小型车、中型车、和大型车
        int[] parkingSpaces = new int[3]; // 分别记录每种车型的车位数量
 
        System.out.println("欢迎使用停车场管理系统!");
        while (true) {
            System.out.print("请输入车辆类型(1=小型车,2=中型车,3=大型车):");
            int vehicleType = scanner.nextInt();
 
            System.out.print("是否离开停车场?(1=是,其他=否):");
            int isLeaving = scanner.nextInt();
 
            if (isLeaving == 1) {
                // 如果离开停车场,则释放对应车型的车位
                if (vehicleType >= 1 && vehicleType <= 3) {
                    parkingSpaces[vehicleType - 1]++;
                    System.out.println("车位已释放。");
                } else {
                    System.out.println("车辆类型输入错误!");
                }
            } else {
                // 如果不离开停车场,则检查是否有对应车型的车位
                if (vehicleType >= 1 && vehicleType <= 3 && parkingSpaces[vehicleType - 1] > 0) {
                    parkingSpaces[vehicleType - 1]--;
                    System.out.println("车辆通行。");
                } else {
                    System.out.println("没有车位或车型不匹配!");
                }
            }
        }
    }
}

这个简易的代码示例模拟了一个停车场管理系统的核心功能。它使用一个整型数组来跟踪每种车型的车位数量,并允许模拟车辆进入或离开停车场。虽然这不是一个完整的系统,但它展示了如何使用数组和简单的逻辑来管理停车场的车位分配。

2024-08-12



public class ThreadStatesExample {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new MyRunnable());
 
        System.out.println("新建线程: " + t1);
        System.out.println("线程状态: " + t1.getState()); // 新建状态
 
        // 启动线程
        t1.start();
        System.out.println("线程启动后状态: " + t1.getState()); // 可运行或运行中
 
        // 让主线程等待一段时间
        Thread.sleep(100);
 
        // 判断线程是否存活
        if (t1.isAlive()) {
            System.out.println("线程 t1 存活,状态: " + t1.getState()); // 可能是运行中或阻塞
        }
 
        // 让主线程等待线程t1运行结束
        t1.join();
        System.out.println("线程运行结束: " + t1.getState()); // 终止状态
    }
 
    static class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("线程正在运行...");
        }
    }
}

这段代码创建了一个新的线程t1,并展示了如何检查线程的状态。它首先获取线程的初始状态,然后启动线程,并在启动后获取状态。接着,它使用Thread.sleep来等待一段时间,并使用isAlivegetState方法检查线程是否存活以及它的状态。最后,使用join方法等待线程t1运行结束,并在线程结束后打印状态。

2024-08-12

Java 枚举是一个特殊的数据类型,用于定义具有固定常量的集合。枚举可以提供比常量更多的操作方法。

创建枚举的基本语法如下:




public enum Color {
    RED, GREEN, BLUE;
}

枚举实例:




public class TrafficLight {
    Color color;
 
    public TrafficLight(Color color) {
        this.color = color;
    }
 
    public void change() {
        switch(color) {
            case RED:
                color = Color.GREEN;
                break;
            case GREEN:
                color = Color.YELLOW;
                break;
            case BLUE:
                color = Color.RED;
                break;
            // 如果需要,可以添加其他颜色的处理逻辑
        }
    }
 
    public String toString() {
        return this.color.toString();
    }
 
    public static void main(String[] args) {
        TrafficLight light = new TrafficLight(Color.RED);
        System.out.println("Traffic light is: " + light);
        light.change();
        System.out.println("Traffic light changed to: " + light);
    }
}

在上述代码中,我们定义了一个名为TrafficLight的类,它有一个color属性,该属性是Color枚举的一个实例。我们还定义了一个change方法,该方法根据当前的灯光颜色来改变灯光颜色。main方法中创建了一个红色的信号灯实例,并打印其当前颜色,然后调用change方法,并再次打印新颜色。

这只是一个简单的示例,实际应用中枚举可以有更复杂的实现,例如包含方法和属性。

2024-08-12

在实现SM2前端加密和后端解密的过程中,需要遵循以下步骤:

  1. 生成SM2公钥和私钥。
  2. 使用SM2公钥加密数据。
  3. 使用SM2私钥解密数据。

以下是一个简单的Java代码示例,展示了如何使用Bouncy Castle库来实现这个过程:




import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.modes.GMTEncryptingState;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECPrivateKeySpec;
import org.bouncycastle.jce.spec.ECPublicKeySpec;
import java.security.KeyFactory;
import java.security.Security;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
 
public class SM2Example {
    static {
        Security.addProvider(new BouncyCastleProvider());
    }
 
    public static void main(String[] args) throws Exception {
        // 生成SM2公钥和私钥
        ECKeyPairGenerator keyGenerator = new ECKeyPairGenerator();
        keyGenerator.init(new ECKeyPairGenerator.ECKeyGenerationParameters(
                ECDomainParameters.getDomainParameters(ECDomainParameters.SM2),
                new SecureRandom()
        ));
        AsymmetricCipherKeyPair keyPair = keyGenerator.generateKeyPair();
        ECPublicKeyParameters publicKey = (ECPublicKeyParameters) keyPair.getPublic();
        ECPrivateKeyParameters privateKey = (ECPrivateKeyParameters) keyPair.getPrivate();
 
        // 使用SM2公钥加密数据
        byte[] dataToEncrypt = "Hello, SM2 Encryption!".getBytes();
        SM2Engine sm2Engine = new SM2Engine();
        sm2Engine.init(true, new ParametersWithRandom(publicKey, new SecureRandom()));
        byte[] encryptedData = sm2Engine.processBlock(dataToEncrypt, 0, dataToEncrypt.length);
 
        // 使用SM2私钥解密数据
        sm2Engine.init(false, privateKey);
        byte[] decryptedData = sm2Engine.processBlock(encryptedData, 0, encryptedData.length);
 
        // 验证解密数据的正确性
        if (Arrays.equals(dataToEncrypt, decryptedData)) {
            System.out.println("Decryption successful, original data: " + new String(decryptedData));
        } else {
            System.out.print
2024-08-12

在Java中,while循环是一个控制流语句,允许代码重复执行,只要给定的条件为真。其基本语法如下:




while(condition) {
    // code block to be executed
}

其中,condition是一个布尔表达式,当它为真时(也就是等价于true),代码块将被执行。如果条件为假,那么代码块将被跳过。

以下是一些使用Java while循环的示例:

  1. 使用while循环打印1到5的数字:



public class Main {
    public static void main(String[] args) {
        int i = 1;
        while(i <= 5) {
            System.out.println(i);
            i++;
        }
    }
}
  1. 使用while循环计算1到100的整数和:



public class Main {
    public static void main(String[] args) {
        int sum = 0;
        int i = 1;
        while(i <= 100) {
            sum += i;
            i++;
        }
        System.out.println("The sum is: " + sum);
    }
}
  1. 使用while循环检查用户输入,直到输入特定的值(例如,"quit"):



import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter text (Enter 'quit' to stop):");
        while(true) {
            String input = scanner.nextLine();
            if(input.equals("quit")) {
                break;
            }
            System.out.println("You entered: " + input);
        }
        scanner.close();
    }
}

以上就是Java中while循环的一些基本用法。

2024-08-12

下面是一个简单的Java线程池实现示例。这个线程池支持固定大小的线程,并使用队列存储待执行的任务。




import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
 
public class SimpleThreadPool implements Runnable {
 
    private final BlockingQueue<Runnable> taskQueue;
    private final int threadPoolSize;
    private final Thread[] threads;
 
    public SimpleThreadPool(int threadPoolSize) {
        this.threadPoolSize = threadPoolSize;
        this.taskQueue = new LinkedBlockingQueue<>();
        this.threads = new Thread[threadPoolSize];
 
        for (int i = 0; i < threadPoolSize; i++) {
            threads[i] = new Thread(this);
            threads[i].start();
        }
    }
 
    public void execute(Runnable task) {
        try {
            taskQueue.put(task);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
 
    @Override
    public void run() {
        while (true) {
            try {
                Runnable task = taskQueue.take();
                task.run();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                break;
            }
        }
    }
 
    // 测试线程池
    public static void main(String[] args) {
        SimpleThreadPool threadPool = new SimpleThreadPool(5);
        for (int i = 0; i < 10; i++) {
            threadPool.execute(() -> {
                System.out.println("Task executed on thread: " + Thread.currentThread().getName());
            });
        }
    }
}

这个线程池的实现中,我们定义了一个固定大小的threads数组来保存工作线程,使用LinkedBlockingQueue作为任务队列。execute方法用于向任务队列中添加任务,而run方法是线程的执行体,它从任务队列中取出任务并执行。

main方法中,我们创建了一个线程池并提交了10个简单的任务。每个任务只是简单地打印出当前执行任务的线程名。这个示例展示了如何使用线程池来管理并发任务的执行。