Java入门基础学习笔记50——ATM系统

news2024/11/24 5:04:11

1、项目演示;

2、项目技术实现;

1)面向对象编程:

每个账户都是一个对象,所以要设计账户类Account,用于创建账户对象封装账户信息。ATM同样是一个对象,需要设计ATM类,代表ATM管理系统,负责对账户的处理。

2)使用集合容器:

ATM管理类中需要提供一个容器用于存储系统全部账户对象的信息,我们选ArrayList集合。

3)程序流程控制:

需要结合分支、循环、跳转关键字等程序流程控制的知识,用来控制系统的业务流程。

4)使用常见的API:

登录信息的内容比较,数据的分析、处理等都需要常用的API来解决,如使用String。

3、能得到哪些收获;

1)收获面向对象编程的能力;

2)清晰、缜密的业务分析能力、数据处理能力;

3)熟练使用程序流程语句来控制计算机完成自己的想法;

4)良好的编码习惯,一定的编码经验,让基础知识形成体系,为后续java的高级技术的学习做有力的支撑。

ATM系统架构搭建、欢迎页设计:

系统架构搭建:

1)定义一个账户类Account,至少包括(卡号、姓名、性别、密码、余额、每次取现额度)。

2)定义一个ATM类,用来代表ATM系统,负责提供所有的业务需求,比如:展示ATM系统的欢迎页、卡通账户、转账……

3)定义一个测试类,负责对我们开发的ATM系统进行测试。

系统欢迎页设计:

在ATM类中设计一个方法start(),方法里负责展示欢迎页面。

架构实现:

Account类:

package cn.ensource;

public class Account {
    private String cardId;      // 卡号
    private String userName;    // 性别
    private char sex;           // 性别
    private String passWord;    // 密码
    private double money;       // 余额
    private double limit;       // 限额
    

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public double getLimit() {
        return limit;
    }

    public void setLimit(double limit) {
        this.limit = limit;
    }
}

ATM类:

package cn.ensource;

import java.util.ArrayList;
import java.util.Scanner;

public class ATM {
    private ArrayList<Account> accountList = new ArrayList<>();   // 成员变量要私有
    private Scanner scanner = new Scanner(System.in);
    /** 启动ATM系统,展示欢迎界面*/
    public void start() {
        while (true) {
            System.out.println("====欢迎您进入到ATM系统====");
            System.out.println("1. 用户登录");
            System.out.println("2. 用户开户");
            System.out.println("请选择:");

            String choice = scanner.next();
            switch (choice) {
                case "1":
                    // 用户登录
                    break;
                case "2":
                    // 用户开户
                    break;
                default:
                    System.out.println("没有该操作");
            }
        }
    }
}

测试类:

package cn.ensource;

public class Test {
    public static void main(String[] args) {
        // 1. 创建一个ATM对象,代表ATM系统
        ATM atm = new ATM();
        atm.start();
    }
}

开户功能:

就是新增一个用户,也就是往系统的账户集合中添加一个账户对象。

账户要求:

用户信息包括:姓名、性别、密码、每次取现额度、卡号。

注意:卡号是由系统自动生成的,要求是8位的数字组成的(且卡号不能重复)。

系统开户功能:createAccount方法。

    /** 系统开户功能 */
    private void createAccount() {
        System.out.println("==系统开户操作==");
        // 1. 创建账户对象,用于封装用户的开户信息
        Account account = new Account();

        // 2. 需要用户输入自己的开户信息,赋值给账户对象
        System.out.println("请您输入您的账户名称:");
        String name = scanner.next();
        account.setUserName(name);

        while (true) {
            System.out.println("请您输入您的性别:");
            char sex = scanner.next().charAt(0);
            if (sex == '男' || sex == '女') {
                account.setSex(sex);
                break;   // 跳出死循环
            }else {
                System.out.println("您输入的性别有误,只能是男或女。");
            }
        }

        while (true) {
            System.out.println("请您输入您的账户密码:");
            String passWord = scanner.next();
            System.out.println("请您输入您的确认密码:");
            String confirmPassWord = scanner.next();

            if (confirmPassWord.equals(passWord)) {
                account.setPassWord(confirmPassWord);
                break;    // 跳出死循环
            }else {
                System.out.println("您输入的2次密码不一致,请您确认!");
            }
        }

        System.out.println("请您输入您的取现额度:");
        double limit = scanner.nextDouble();
        account.setLimit(limit);

        // 重点:我们需要为这个账户生成一个卡号,肯定是由系统自动生成
        // 不能与其他账户的卡号重复,会在下节课详细讲解


        // 3. 把账户对象存入账户集合中去
        accountList.add(account);
        System.out.println("恭喜您," + account.getUserName() + "开户成功!您的卡号是:");
    }
====欢迎您进入到ATM系统====
1. 用户登录
2. 用户开户
请选择:
2
==系统开户操作==
请您输入您的账户名称:
changchunhua
请您输入您的性别:
男
请您输入您的账户密码:
123456
请您输入您的确认密码:
123456
请您输入您的取现额度:
5000
恭喜您,changchunhua先生开户成功!您的卡号是:
====欢迎您进入到ATM系统====
1. 用户登录
2. 用户开户
请选择:

为开户的账户生成一个新卡号:

新卡号要求是一个8位的数字,且不能与其他账户对象的卡号重复。

新卡号得到后,需要赋值给当前账户对象。

package cn.ensource;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM {
    private ArrayList<Account> accountList = new ArrayList<>();   // 成员变量要私有
    private Scanner scanner = new Scanner(System.in);

    /** 启动ATM系统,展示欢迎界面*/
    public void start() {
        while (true) {
            System.out.println("====欢迎您进入到ATM系统====");
            System.out.println("1. 用户登录");
            System.out.println("2. 用户开户");
            System.out.println("请选择:");

            String choice = scanner.next();
            switch (choice) {
                case "1":
                    // 用户登录
                    break;
                case "2":
                    // 用户开户
                    createAccount();
                    break;
                default:
                    System.out.println("没有该操作");
            }
        }
    }

    /** 系统开户功能 */
    private void createAccount() {
        System.out.println("==系统开户操作==");
        // 1. 创建账户对象,用于封装用户的开户信息
        Account account = new Account();

        // 2. 需要用户输入自己的开户信息,赋值给账户对象
        System.out.println("请您输入您的账户名称:");
        String name = scanner.next();
        account.setUserName(name);

        while (true) {
            System.out.println("请您输入您的性别:");
            char sex = scanner.next().charAt(0);
            if (sex == '男' || sex == '女') {
                account.setSex(sex);
                break;   // 跳出死循环
            }else {
                System.out.println("您输入的性别有误,只能是男或女。");
            }
        }

        while (true) {
            System.out.println("请您输入您的账户密码:");
            String passWord = scanner.next();
            System.out.println("请您输入您的确认密码:");
            String confirmPassWord = scanner.next();

            if (confirmPassWord.equals(passWord)) {
                account.setPassWord(confirmPassWord);
                break;    // 跳出死循环
            }else {
                System.out.println("您输入的2次密码不一致,请您确认!");
            }
        }

        System.out.println("请您输入您的取现额度:");
        double limit = scanner.nextDouble();
        account.setLimit(limit);

        // 重点:我们需要为这个账户生成一个卡号,肯定是由系统自动生成
        // 不能与其他账户的卡号重复,会在下节课详细讲解
        String newCardId = createCardId();
        account.setCardId(newCardId);

        // 3. 把账户对象存入账户集合中去
        accountList.add(account);
        System.out.println("恭喜您," + account.getUserName() + "开户成功!您的卡号是:" + account.getCardId());
    }

    /** 返回一个8位数字的卡号,而且这个卡号不能与其他账户的卡号重复*/
    private String createCardId() {
        while (true) {
            // 1. 定义一个String类型的变量记住8位数字作为一个卡号
            String cardId = "";
            // 2. 使用一个循环,循环8次,每次产生一个随机数给我们的CardId连接起来
            Random r = new Random();
            for (int i = 0; i < 8; i++) {
                int data = r.nextInt(10);
                cardId += data;
            }
            // 3. 判断CardId中记住的卡号,是否与其他账户的卡号重复,没有重复才可以作为一个新卡号返回
            Account acc = getAccountByCardId(cardId);
            if (acc == null) {
                // 说明cardId没有找到账户对象,因此CardId没有与其他卡号重复,可以返回它作为一个新卡号
                return cardId;
            }
        }

    }

    /** 根据卡号查询对象返回*/
    private Account getAccountByCardId(String cardId) {
        for (int i = 0; i < accountList.size() ; i++) {
            Account acc = accountList.get(i);
            // 判断这个账户对象acc中的卡号是否是我们要找的卡号
            if(acc.getCardId().equals(cardId)) {
                return acc;
            }
        }
        return null;   //查无此账户,这个卡号不存在的
    }
}

实现登录功能:

1)如果系统中没有任何账户对象,则不允许用户登录;

2)让用户输入登录的卡号,先判断卡号是否正确,如果不正确要给出提示;

3)如果卡号正确,要让用输入账号密码,如果密码不正确要给出提示,如果密码也正确,则给出登录成功的提示;

    /** 用户登录操作*/
    private void login() {
        System.out.println("==系统登录==");
        // 1. 判断系统中是否存在账户对象,存在才能登录,不存在,结束登录登录
        if(accountList.size() == 0) {
            System.out.println("当前系统中无任何账户,请先开户,再登录!");
            return;    // 退出登录操作
        }

        // 2. 系统中存在账户对象,可以开始进行登录操作
        while (true) {
            System.out.println("请您输入您的登录卡号: ");
            String cardId = scanner.next();

            // 判断这个卡号是否存在
            Account acc = getAccountByCardId(cardId);
            if(acc == null) {
                // 说明这个卡号不存在
                System.out.println("您输入的卡号不存在!");
            }else {
                while (true) {
                    // 卡号存在了,接着让用户输入密码
                    System.out.println("请您输入您的密码:");
                    String passWord = scanner.next();
                    if(acc.getPassWord().equals(passWord)) {
                        // 密码正确,就是登录成功了
                        System.out.println("恭喜您," + acc.getUserName() + "成功登录了系统,您的卡号是:" + cardId);
                        // ....
                    }else {
                        System.out.println("您输入的密码不正确,请确认!");
                    }
                }
            }

        }

    }

用户操作页设计、查询账户、退出账户功能分析:

1)用户登录成功后,需要进入用户操作页。

2)查询就是直接展示当前成功的用户的账户信息。

3)退出账户就是从我们登录等后的页面回到欢迎页面。

    /** 用户登录操作*/
    private void login() {
        System.out.println("==系统登录==");
        // 1. 判断系统中是否存在账户对象,存在才能登录,不存在,结束登录登录
        if(accountList.size() == 0) {
            System.out.println("当前系统中无任何账户,请先开户,再登录!");
            return;    // 退出登录操作
        }

        // 2. 系统中存在账户对象,可以开始进行登录操作
        while (true) {
            System.out.println("请您输入您的登录卡号: ");
            String cardId = scanner.next();

            // 判断这个卡号是否存在
            Account acc = getAccountByCardId(cardId);
            if(acc == null) {
                // 说明这个卡号不存在
                System.out.println("您输入的卡号不存在!");
            }else {
                while (true) {
                    // 卡号存在了,接着让用户输入密码
                    System.out.println("请您输入您的密码:");
                    String passWord = scanner.next();
                    if(acc.getPassWord().equals(passWord)) {
                        loginAcc = acc;      // 这个账户登录成功了,交给一个loginAcc变量记住
                        // 密码正确,就是登录成功了
                        System.out.println("恭喜您," + acc.getUserName() + "成功登录了系统,您的卡号是:" + cardId);
                        // 登录后的操作页面,将其设计为一个独立方法
                        showUserCommand();
                        return;
                    }else {
                        System.out.println("您输入的密码不正确,请确认!");
                    }
                }
            }

        }

    }

    /** 展示登录后的操作界面 */
    private void showUserCommand() {
        while (true) {
            System.out.println(loginAcc.getUserName() + "您可以选择如下功能进行账户的处理====");
            System.out.println("1. 查询账户");
            System.out.println("2. 存款");
            System.out.println("3. 取款");
            System.out.println("4. 转账");
            System.out.println("5. 密码修改");
            System.out.println("6. 退出");
            System.out.println("7. 注销当前账户");
            System.out.println("请选择: ");
            String choice = scanner.next();
            switch (choice) {
                case "1":
                    // 查询当前账户
                    showAccountInfo();
                    break;
                case "2":
                    // 存款
                    break;
                case "3":
                    // 取款
                    break;
                case "4":
                    // 转账
                    break;
                case "5":
                    // 密码修改
                    break;
                case "6":
                    // 退出
                    System.out.println(loginAcc.getUserName() + "您退出系统成功");
                    return;   // 退出当前方法
                case "7":
                    // 注销当前账户
                    break;
                default:
                    System.out.println("您当前选择的操作是不存在的,请确认!");
            }
        }

    }

return;  是退出当前方法

    /**
     * 展示当前登录账户的信息
     */
    private void showAccountInfo() {
        System.out.println("==当前账户信息如下==");
        System.out.println("卡号: " + loginAcc.getCardId());
        System.out.println("户主: " + loginAcc.getUserName());
        System.out.println("性别: " + loginAcc.getSex());
        System.out.println("余额: " + loginAcc.getMoney());
        System.out.println("取现额度: " + loginAcc.getLimit());
    }

用户存款功能:

1)就是用户为自己的账户存钱,存钱后更新账户的余额即可。

    /**
     * 存钱
     */
    private void depositMoney() {
        System.out.println("==存钱操作==");
        System.out.println("请您输入存款金额:");
        double money = scanner.nextDouble();   // -5000, 网页判断

        // 更新当前账户的余额
        loginAcc.setMoney(loginAcc.getMoney() + money);
        System.out.println("恭喜您!你存钱:" + money + "成功,存钱的余额是:" + loginAcc.getMoney());
    }

用户取款功能:

1)就是从自己的账户中取钱,取钱的要求:

1、需要判断账户的余额是否大于等于100元,如果够,让用户输入取款金额;

2、需要判断取款金额是否超过了档次限额,以及余额是否足够。

    /**
     * 取钱
     */
    private void drawMoney() {
        System.out.println("==取钱操作==");
        // 1. 判断账户余额是否大于100元,如果不够100元,就不让取钱
        if(loginAcc.getMoney() < 100) {
            System.out.println("您的账户不足100元,不允许取钱!");
        }

        // 2. 让用户输入取款金额
        while (true) {
            System.out.println("请您输入取款金额:");
            double money = scanner.nextDouble();

            // 3. 判断账户的余额是否足够,足够才能取的
            if(loginAcc.getMoney() >= money) {
                // 账户中的余额是充足的
                // 4. 需要判断取款金额是否超过了限额
                if (loginAcc.getLimit() < money) {
                    System.out.println("您当前的取款金额超过了取钱限额" + loginAcc.getLimit());
                }else if(
                        // 代表可以取钱了
                        loginAcc.setMoney(loginAcc.getMoney() - money);
                        System.out.println("您取款:" + money + "成功,取款后的余额是:" + loginAcc.getMoney());
                )
            }else {
                // 否则余额不足
                System.out.println("余额不足,您的账户的余额是:" + loginAcc.getMoney());
            }
        }

    }

转账功能:

把自己的钱转给别人,转账前的判断:

1、自己账户是否有钱,系统中是否有其他账户;

2、接下来用户输入对方卡号,判断对方账户是否存在,账户如果存在,还需要认证对方账户的户主姓氏;

3、然后就可以转账了。

 /**
     * 转账
     */
    private void transferMoney() {
        System.out.println("==用户转账==");
        // 1. 判断系统中是否存在其他账户
        if(accountList.size() < 2) {
            System.out.println("当前系统中只有您一个账户,无法为其他账户转账");
            return;
        }

        // 2. 判断自己的账户是否有钱,钱够不够
        if(loginAcc.getMoney() == 0) {
            System.out.println("您自己都没钱,就别转了!");
            return;
        }

        // 3. 真正可以转账了
        while (true) {
            System.out.println("请您输入对方的卡号:");
            String cardId = scanner.next();

            // 4. 判断这个卡号是否正确
            Account acc = getAccountByCardId(cardId);
            if(acc == null) {
                System.out.println("您输入的对方的卡号不存在");
            }else {
                // 对方账户存在,继续让用户确认姓氏
                String name = "*" + acc.getUserName().substring(1);
                System.out.println("请您输入[" + name + "]的姓氏:");
                String preName = scanner.next();
                // 判断这个姓氏是否正确
                if(acc.getUserName().startsWith(preName)) {
                    // 认证通过了,真正可以转账了
                    while (true) {
                        System.out.println("请您输入转账给对方的金额:");
                        double money = scanner.nextDouble();
                        // 判断金额没有超过自己的余额,不需要考虑限额
                        if(loginAcc.getMoney() >= money) {
                            // 转给对方了
                            // 更新自己账户的余额
                            // 更新对方账户的余额
                            loginAcc.setMoney(loginAcc.getMoney() - money);  // 自己账户
                            acc.setMoney(acc.getMoney() + money);   // 对方账户
                            return;   // 跳出转账方法

                        }else {
                            System.out.println("您余额不足,无法转给对方这么多钱,最多可以转给对方" + loginAcc.getMoney());
                        }
                    }
                }else {
                    System.out.println("对不起,您认证的姓氏有问题!");
                }
            }
        }
    }

测试:

存在自己转账给自己的问题,需要在代码中进行判断。

销户功能:

1)销户是从系统中删除当前账户,销户的要求:

1、首先要询问用户是否确定要销户,如果不确定,则回到操作界面。

2、如果确定,要判断用户的账户中是否有钱,有则不允许销户,并回到操作界面。

3、如果没钱,则完成销户,并回到欢迎页。

    /**
     * 销户操作
     */
    private boolean deleteAccount() {
        System.out.println("==进行销户操作==");
        // 1. 问问用户是否确认销户操作
        System.out.println("请问您确认销户操作?y/n");
        String choice = scanner.next();
        switch (choice) {
            case "y":
                // 用户确实要注销
                // 判断用户的账户是否有钱,loginAcc
                if (loginAcc.getMoney() == 0) {
                    // 真的销户
                    accountList.remove(loginAcc);
                    System.out.println("您好!您的账户已经成功销户!");
                    return true;   // 销户成功
                } else {
                    System.out.println("对不起,您的账户中有存钱金额,不允许销户!");
                    return false;
                }
            default:
                System.out.println("好的,您的账户保留!");
                return false;
        }
    }

修改密码功能:

就是更改账户的密码,修改密码的要求:

1)需要先验证用户当前的密码;

2)认证通过之后,需要让用户输入2次新密码;

3)两次新密码都一样,则更新账户密码,并回到欢迎界面。

/**
     * 更新密码
     */
    private void updatePassWord() {
        System.out.println("==账户密码修改==");
        // 1. 提醒用户认证当前密码
        while (true) {
            System.out.println("请您输入当前账户的密码:");
            String passWord = scanner.next();

            // 2. 认证当前密码是否正确
            if(loginAcc.getPassWord().equals(passWord)) {
                // 认证通过
                // 真正修改密码
                while (true) {
                    System.out.println("请您输入新密码:");
                    String newPassWord = scanner.next();
                    System.out.println("请您输入确认密码:");
                    String confirmPassWord = scanner.next();

                    // 判断两次密码输入一致
                    if(confirmPassWord.equals(newPassWord)) {
                        // 真正修改密码
                        loginAcc.setPassWord(newPassWord);
                        System.out.println("密码修改成功!");
                        return;   // 跳出这个方法
                    }else {
                        System.out.println("您两次输入的密码不一致!");
                    }
                }
            }else {
                System.out.println("您输入的当前密码不正确!")
            }
        }

    }

代码开发好了,要进行测试确认。

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

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

相关文章

打破壁垒,实现多引擎3D内容轻量化交付|点量云流

随着应用场景的不断拓展&#xff0c;传统的视频流技术已难以满足日益复杂的需求。当前市场上的视频流解决方案支持的引擎基本是UE、Unitiy输出的exe3D应用&#xff0c;在处理WebGL等3D内容时&#xff0c;也存在诸多局限性&#xff0c;例如性能限制、跨平台兼容性问题、无法直接…

玩转OpenHarmony PID:教你打造两轮平衡车

简介 此次为大家带来的是OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;系统与PID控制算法相结合并落地的平衡车项目。 PID控制算法是一种经典的&#xff0c;并被广泛应用在控制领域的算法。类似于这种&#xff1a;需要将某一个物理量保持稳定的场合&…

java学习五

Java方法 方法是什么 方法Debug 方法定义注意点 方法总结 方法使用时的常见问题

电商内卷时代,视频号小店凭借一己之力“脱颖而出”

大家好&#xff0c;我是电商笨笨熊 今年618各大电商平台花样百出&#xff1b; 某宝更是直接取消了“预售”&#xff0c;从5月就开始进入618预热期&#xff1b; 不少玩家既开心又难过&#xff0c;市场如此内卷&#xff0c;618确实是个爆发期&#xff0c;但更多的需要不断压低…

数据量较小的表是否有必要添加索引问题分析

目录 前言一、分析前准备1.1、准备测试表和数据1.2、插入测试数据1.3、测试环境说明 二、具体业务分析2.1、单次查询耗时分析2.2、无索引并发查询服务器CPU占用率分析2.3、添加索引并发查询服务器CPU占用率分析 三、总结 前言 在一次节日活动我们系统访问量到达了平时的两倍&am…

普乐蛙VR元宇宙展厅VR航天航空知识长廊

有没有幻想过有生之年可以亲自开战斗机&#xff1f;还是大名鼎鼎的“歼-20”哦&#xff01;上到四五十岁的中年人&#xff0c;下到十几岁的小年轻&#xff0c;无论男女老少&#xff0c;没人能逃得过炫酷到飞起的新一代战斗机&#xff01;快跟上小编的脚步&#xff0c;带你去开V…

2024云曦期中考(部分复现)

目录 一、Web Web_SINGIN 好玩的PHP 渗透的本质 简简单单的文件上传 简简单单的sql ​编辑 二、Crypto Crypto_Singin easy_rsa 三、Misc easy_singin Xjpg 四、Pwn pwn_Sing 五、Reverse babyre easy xor 一、Web Web_SINGIN F12代码中就有flag&#xff0…

构建稳健、高效与安全的企业级API网关

在现代企业信息化建设中&#xff0c;各种微服务架构系统以及不同类型的管理系统广泛兴起&#xff0c;平台中的数据安全逐渐成为企业重视的部分&#xff0c;在iPaaS系统中&#xff0c;一个名为“企业级API网关”的功能出现在大众眼中&#xff0c;随着企业信息化建设的不断深入&a…

ubuntu server 24.04 网络 SSH等基础配置

1 安装参考上一篇: VMware Workstation 虚拟机安装 ubuntu 24.04 server 详细教程 服务器安装图形化界面-CSDN博客 2 网络配置 #安装 sudo apt install net-tools#查看 ifconfig #修改网络配置 sudo vim /etc/netplan/50-cloud-init.yaml network:version: 2ethernets:en…

远程PLC、工控设备异地调试,贝锐蒲公英异地组网方案简单高效

北京宇东宁科技有限公司专门提供非标机电设备&#xff0c;能够用于金属制品的加工制造。设备主要采用西门子的PLC作为控制系统&#xff0c;同时能够连接上位机用于产量、温度、压力、电机运行数据的监控&#xff0c;以及工厂的大屏呈现需求。目前&#xff0c;客户主要是市场上的…

人工智能的阴暗面:犯罪分子如何利用 AI 进行欺诈

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正迅速成为推动各行各业生产力和创新的关键力量&#xff0c;而一些不法分子也开始探索如何将这些先进的工具用于他们自己的非法目的。从网络钓鱼到深度伪造&#xff0c;再到人肉搜索、越狱服务和身份验证系统的…

MySQL-性能分析

1、数据库服务器的优化步骤 2、查看系统性能参数 可以使用show status语句查询一些MySQL数据库服务器的性能参数 执行频率语法格式&#xff1a;show [ global | session ] status like 参数 &#xff1b;常用性能参数如下所示 参数名说明connection连接MySQL服务器的次数upti…

如何使用Unity XR Interaction Toolkit

使用环境&#xff1a; Unity2021.3.21f XR Interaction Toolkit v3.0.0 各类函数可用的&#xff1a; 简单项目配置&#xff1a; 第一步&#xff0c;导包&#xff08;samples可以不用导这么多&#xff0c;两个就够了&#xff09;&#xff1a; 第二步&#xff0c;构建场景&a…

c++|priority_queue

priority_queue 前置知识&#xff1a;仿函数priority_queue的模拟实现 前置知识&#xff1a;仿函数 template<class T> struct Less {bool operator()(const T& x, const T& y) // {return x < y;} };priority_queue的模拟实现 通过对priority_queue的底层…

element ui表格动态合并方法

懒得上代码直接截图了 1. 这种方法适合所有合并项全部在一起的 2.还方法可以选择从哪一列开始合并&#xff0c;或者像目录一样从前往后合并

使用 Elastic AI assistant for Observability 来分析日志

在今天的文章中&#xff0c;我们来参考之前的文章 “Elastic AI Assistant for Observability 和 Microsoft Azure OpenAI 入门” 来使用 Elastic AI assistant 分析日志。在本文章中&#xff0c;我们不使用 Azure clould。这样我们之间来进入主题&#xff0c;以免失去注意力。…

Live800:提升客服服务质量,企业应从这几个方面下功夫

客户服务质量&#xff0c;是企业为客户提供优质服务的一个重要衡量指标。通常来说&#xff0c;一个企业的客服部门在其经营活动中发挥着重要作用&#xff0c;是客户与企业之间沟通的桥梁。良好的客服服务&#xff0c;不仅能够提高客户满意度&#xff0c;还能增强企业品牌的美誉…

pcd点云江湖之处处碰壁:点云文件pcd加载02

江湖好汉&#xff0c;休走&#xff0c;废了半天力气把threejs自带的代码搬迁到自己项目中了&#xff0c;高高兴兴给领导看。领导一句话&#xff0c;顿时无奈&#xff1a;领导曰&#xff1a;点云单色太丑&#xff0c;能不能按照分类展示&#xff1f; 一句话难道英雄好汉&#xf…

Redis主从、哨兵、cluster集群的部署和细节

目录 1. 主从模式 为什么需要主从&#xff1f; 搭建主从架构 2. Sentinel(哨兵)模式 为什么需要哨兵模式&#xff1f; 搭建哨兵集群 哨兵集群 Go语言编程redis哨兵模式 有了哨兵&#xff0c;客户端连接谁&#xff1f; test1&#xff1a;redis节点主从切换 test2&am…