微聊测试报告

news2025/6/21 1:05:55

文章目录

  • 微聊测试用例
    • 功能测试
      • 自动化测试
        • 注册页面
        • 登录页面
        • 会话窗口
        • 朋友圈界面
  • 界面测试
    • 注册页面
    • 登录页面
    • 会话页面
    • 朋友圈页面
  • 兼容性测试
    • PC
    • Pad
    • 手机
    • 浏览器
  • 性能测试
  • 安全测试
    • 密码保存是否安全
    • SQL注入
    • 服务器错发
  • 网络
    • 有网
    • 弱网
    • 断网


​👑作者主页:Java冰激凌


​概述:

本次测试旨在评估微聊的功能,包括用户界面、消息传递、安全性等方面。测试环境为Windows 10操作系统,使用Google Chrome浏览器进行测试。


测试方法:

本次测试采用黑盒测试方法,即不考虑系统内部的实现细节,只关注用户在使用过程中是否能够顺利完成任务。测试人员通过模拟真实用户的操作,对聊天室的各项功能进行了测试。


微聊测试用例

微聊测试用例已上传致Gitee平台 点击链接查看点击跳转
在这里插入图片描述


功能测试

自动化测试

注册页面

测试用例:
在这里插入图片描述
自动化测试代码:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)//设置优先级需要的
public class RegisterTest {
    private static WebDriver webDriver;

    @BeforeAll
    public static void Genter(){
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        webDriver = new ChromeDriver(options);
        webDriver.get("http://192.144.216.100:1120/register.html");
    }

    /**
     * 校验当前页面title是否正确
     */
    @Test
    @Order(1)
    public void title() throws InterruptedException {
        Assertions.assertEquals("注册",webDriver.getTitle());
    }

    /**
     * 注册用户 注册成功后是否成功跳转到登录页面
     * @throws InterruptedException
     */
    @Test
    @Order(2)
    public void input() throws InterruptedException {
        sleep(500);
        WebElement username = webDriver.findElement(By.cssSelector("#username"));
        WebElement password = webDriver.findElement(By.cssSelector("#password"));
        username.sendKeys("小1");
        password.sendKeys("123");
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(500);
        Alert alert = webDriver.switchTo().alert();//确认弹窗
        alert.accept();//点击确认按钮
        Assertions.assertEquals("登录页面",webDriver.getTitle());
        webDriver.close();
    }
}

测试结果:在注册功能测试中响应较快 体验良好 暂未发现错误

登录页面

测试用例:
在这里插入图片描述
自动化测试代码:

/**
 * @Author: 冰激凌
 * @Date: 2023-07-13 21:13
 **/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)//设置优先级需要的
public class LoginTest {
    private WebDriver webDriver;

    @BeforeEach
    public void Genter(){
        webDriver = new ChromeDriver();
        webDriver.get("http://192.144.216.100:1120/login.html");
    }

    @AfterEach
    public void close(){
        webDriver.quit();
    }

    /**
     * 测试点击注册是否可以跳转到注册页面
     */
    @Test
    @Order(1)
    public void reg() throws InterruptedException {
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();
        //获取并切换到当前的窗口
        webDriver.switchTo().window(webDriver.getWindowHandle());
        sleep(500);
        Assertions.assertEquals("注册",webDriver.getTitle());
    }

    /**
     * 测试点击联系作者是否可以跳转到联系作者
     */
    @Test
    @Order(2)
    public void connection() throws InterruptedException {
//        webDriver.navigate().back();//后退
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
    }

    public static Stream<Arguments> Generator () {
        return Stream.of(Arguments.arguments("冰激凌","010822"));
    }

    @Order(3)
    @ParameterizedTest
    @MethodSource("Generator")
    public void login(String username,String password) throws InterruptedException {
//        webDriver.navigate().back();//后退
//        sleep(1000);
        WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
        WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
        usernameInput.sendKeys(username);
        passwordInput.sendKeys(password);
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(1000);
//        webDriver.switchTo().window(webDriver.getWindowHandle());
        Assertions.assertEquals("微聊",webDriver.getTitle());
    }

    /**
     * 输入错误的账号密码测试
     */
    @Order(4)
    @ParameterizedTest
    @MethodSource("Generator")
    public void loginError(String username,String password) throws InterruptedException {
//        sleep(1000);
//        webDriver.findElement(By.cssSelector("body > div.client-container > div.toolbar > span.tool-button > a > img")).click();
        WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
        WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
        usernameInput.sendKeys(username);
        passwordInput.sendKeys(password + 1);
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(1000);
        Alert alert = webDriver.switchTo().alert();
        Assertions.assertNotNull(alert);
    }
}

测试结果:在测试登录功能中 测试了多项指标 整体体验效果较好 在高并发的情况下服务器出现了少量的卡顿导致响应不及时 但并不影响用户体验

会话窗口

测试用例
在这里插入图片描述
自动化测试代码:

/**
 * @Author: 冰激凌
 * @Date: 2023-07-13 22:32
 **/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)//设置优先级需要的
public class ClientTest {
    private WebDriver webDriver;

    @BeforeEach
    public void Genter(){
        webDriver = new ChromeDriver();
        webDriver.get("http://192.144.216.100:1120/login.html");
    }

    @AfterEach
    public void close(){
        webDriver.quit();
    }

    public static Stream<Arguments> Generator () {
        return Stream.of(Arguments.arguments("冰激凌","010822"));
    }

    /**
     * 当前用户名是否正确
     * @param username
     * @param password
     * @throws InterruptedException
     */
    @ParameterizedTest
    @MethodSource("Generator")
    public void isUsername(String username,String password) throws InterruptedException {
        WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
        WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
        usernameInput.sendKeys(username);
        passwordInput.sendKeys(password);
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(1000);
        WebElement element = webDriver.findElement(By.cssSelector("body > div.client-container > div.main > div.left > div.user"));
        String innerhtml = element.getAttribute("innerHTML");
        Assertions.assertEquals(username,innerhtml);
    }

    /**
     * 测试登录后发送消息以及添加好友功能
     * @param username
     * @param password
     * @throws InterruptedException
     */
    @ParameterizedTest
    @MethodSource("Generator")
    public void client(String username,String password) throws InterruptedException {
        webDriver.manage().window().maximize();//页面放大
        WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
        WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
        usernameInput.sendKeys(username);
        passwordInput.sendKeys(password);
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(500);
        webDriver.findElement(By.xpath("//*[@id=\"session-list\"]/li[7]")).click();
        sleep(100);
        //获取到当前会话中的所有消息
        List<WebElement> webElements = webDriver.findElements(By.cssSelector("body > div.client-container > div.main > div.right > div.message-show div"));
        //获取到消息的个数
        int count = webElements.size();
        //选中输入框
        WebElement input = webDriver.findElement(By.cssSelector("body > div.client-container > div.main > div.right > textarea"));
        //在输入框输入消息
        input.sendKeys("馒头!晚上约个饭");
        sleep(100);
        //发送
        input.sendKeys(Keys.ENTER);
        sleep(500);
        //再次获取所有的消息个数
        List<WebElement> webElements1 = webDriver.findElements(By.cssSelector("body > div.client-container > div.main > div.right > div.message-show div"));
        //获取到消息的个数
        int count1 = webElements1.size();
        //如果count + 1 == count 则代表发送成功
        Assertions.assertNotEquals(count,count1);
        webDriver.findElement(By.cssSelector("body > div.client-container > div.main > div.left > div.search > input")).sendKeys("小s");
        webDriver.findElement(By.cssSelector("body > div.client-container > div.main > div.left > div.search > button")).click();
        sleep(500);
        Alert alert = webDriver.switchTo().alert();//确认弹窗
        alert.accept();//点击确认按钮
        sleep(500);
        webDriver.findElement(By.cssSelector("body > div.client-container > div.main > div.left > div.tab > div.tab-friend")).click();
        List<WebElement> webElements2 = webDriver.findElements(By.cssSelector("#friend-list li"));
        boolean flg = false;
        WebElement friend = null;
        for(WebElement element : webElements2){
            if(element.getAttribute("friend-id").equals("47")){
                flg = true;
                friend = element;
                break;
            }
        }
        Assertions.assertEquals(true,flg);
        friend.click();

    }
}

测试结果:在测试会话界面测试中 功能使用非常简单 基本功能已经完善 在快速处理消息响应下提要较优 在测试添加好友功能时的处理比较特殊 使用的强制添加好友措施 不是非常合理 希望后序继续完善

朋友圈界面

测试用例:
在这里插入图片描述
自动化测试代码:

/**
 * @Author: 冰激凌
 * @Date: 2023-07-14 11:21
 **/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)//设置优先级需要的
public class BlogListTest {
    private WebDriver webDriver;
    @BeforeEach
    public void Genter(){
        webDriver = new ChromeDriver();
        webDriver.get("http://192.144.216.100:1120/login.html");
    }

    @AfterEach
    public void close(){
        webDriver.quit();
    }

    public static Stream<Arguments> Generator () {
        return Stream.of(Arguments.arguments("冰激凌","010822"));
    }

    /**
     * 验证进入朋友圈主页
     * @param username
     * @param password
     * @throws InterruptedException
     */
    @Order(1)
    @ParameterizedTest
    @MethodSource("Generator")
    public void blog(String username,String password) throws InterruptedException {
        webDriver.manage().window().maximize();//页面放大
        WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
        WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
        usernameInput.sendKeys(username);
        passwordInput.sendKeys(password);
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(100);
        webDriver.findElement(By.cssSelector("body > div.client-container > div.toolbar > span.circle-of-friends > button > img")).click();
        sleep(100);
        Assertions.assertEquals("我的朋友圈",webDriver.getTitle());
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();
        sleep(100);
        Assertions.assertEquals("朋友圈列表",webDriver.getTitle());
        webDriver.navigate().back();//后退
        sleep(100);
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        sleep(100);
        Assertions.assertEquals("朋友圈编辑",webDriver.getTitle());
        webDriver.navigate().back();//后退
        sleep(100);
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        sleep(100);
        Assertions.assertEquals("微聊",webDriver.getTitle());
    }

    /**
     * 验证当前登入的用户名是否正确
     * @param username
     * @param password
     * @throws InterruptedException
     */
    @Order(2)
    @ParameterizedTest
    @MethodSource("Generator")
    public void blog_list(String username,String password) throws InterruptedException {
        webDriver.manage().window().maximize();//页面放大
        WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
        WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
        usernameInput.sendKeys(username);
        passwordInput.sendKeys(password);
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(100);
        webDriver.findElement(By.cssSelector("body > div.client-container > div.toolbar > span.circle-of-friends > button > img")).click();
        sleep(500);
        String blogTitle = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.title")).getAttribute("innerHTML");
        webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(4)")).click();
        String curBlogTitle = webDriver.findElement(By.cssSelector("#title")).getAttribute("innerHTML");
        Assertions.assertEquals(blogTitle,curBlogTitle);
    }

    /**
     * 验证修改动态内容
     * @param username
     * @param password
     * @throws InterruptedException
     */
    @Order(3)
    @ParameterizedTest
    @MethodSource("Generator")
    public void blog_list1(String username,String password) throws InterruptedException {
        webDriver.manage().window().maximize();//页面放大
        WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
        WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
        usernameInput.sendKeys(username);
        passwordInput.sendKeys(password);
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(100);
        webDriver.findElement(By.cssSelector("body > div.client-container > div.toolbar > span.circle-of-friends > button > img")).click();
        sleep(300);
        String blogTitle = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.desc")).getAttribute("innerHTML");
        webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(5)")).click();
        sleep(1000);
        String curBlogTitle = webDriver.findElement(By.cssSelector("#editorDiv > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre > span > span")).getAttribute("innerHTML");
        Assertions.assertEquals(blogTitle,curBlogTitle);
    }

    /**
     * 验证发布文章 删除文章等
     * @param username
     * @param password
     * @throws InterruptedException
     */
    @Order(4)
    @ParameterizedTest
    @MethodSource("Generator")
    public void blog_list2(String username,String password) throws InterruptedException {
        webDriver.manage().window().maximize();//页面放大
        WebElement usernameInput = webDriver.findElement(By.cssSelector("#username"));
        WebElement passwordInput = webDriver.findElement(By.cssSelector("#password"));
        usernameInput.sendKeys(username);
        passwordInput.sendKeys(password);
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(100);
        webDriver.findElement(By.cssSelector("body > div.client-container > div.toolbar > span.circle-of-friends > button > img")).click();
        sleep(300);
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        sleep(800);
        webDriver.findElement(By.cssSelector("#title")).sendKeys("自动化测试");
        WebElement element = webDriver.findElement(By.cssSelector("#editorDiv > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll"));
        webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
        sleep(200);
        Alert alert = webDriver.switchTo().alert();//确认弹窗
        alert.accept();//点击确认按钮
        sleep(200);
        String title = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.title")).getAttribute("innerHTML");
        Assertions.assertEquals("自动化测试",title);
        //测试删除
        String time = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.date")).getAttribute("innerHTML");
        sleep(100);
        webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(6)")).click();
        webDriver.switchTo().alert().accept();//确认
        sleep(100);
        webDriver.switchTo().alert().accept();//确认
        sleep(100);
        String curTime = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.date")).getAttribute("innerHTML");
        sleep(200);
        Assertions.assertNotEquals(time,curTime);
    }
}

测试结果:在测试朋友圈功能时 在高并发的体验下载加载编辑页面与发布页面时反应较慢 整体功能比较完善 整体体验较优


界面测试

注册页面

测试用例:用户注册界面
在这里插入图片描述
测试结果:微聊的用户登录界面设计简洁明了,易于操作,位置合理,目的明确


登录页面

测试用例:用户登录界面在这里插入图片描述测试结果:微聊的用户登录界面设计简洁明了,易于操作。所有按钮和菜单都放置在合适的位置,且颜色搭配合理。测试人员没有发现任何UI问题或错误。


会话页面

测试用例:会话页面
在这里插入图片描述
测试结果:会话布局设置合理 功能明确


朋友圈页面

测试用例:朋友圈页面在这里插入图片描述
测试结果:风格与会话页面统一 整体风格较为舒适 布局合理明确


兼容性测试

PC

测试结果:在windows、Linux、Mac系统中使用网页访问效果一致 功能使用正常 兼容测试通过

Pad

测试结果:在安卓、IOS系统中需要开启电脑端模式访问浏览器才可以进行正常使用 体验效果一般 兼容测试通过

手机

测试结果:在安卓、IOS系统中对于页面布局无法正常展示 无法进行正常的使用 兼容测试不通过

浏览器

测试结果:在Chrom、IE内核中的浏览器使用正常 页面布局显示正确 功能使用正常 兼容性测试通过


性能测试

测试用例:同时进行多个会话窗口
测试结果:运行流畅 接收发送消息流畅 使用体验较好


测试用例:频繁切换用户聊天窗口
测试结果:切换流畅 并且可以正确展示历史聊天记录


测试用例:大量用户访问使用是否流畅
测试工具:LoadRunner
测试结果:服务器性能一般 在高并发的使用下页面首次加载出现明显的卡顿 使用体验较差 建议对服务器进行升级


测试用例:浏览页面、发布朋友圈、加载全文是否流畅
测试结果:在少量用户使用的情况下效果良好 加载迅速


安全测试

密码保存是否安全

测试用例:保存密码的数据库是否存在风险
测试结果:本系统中使用的数据库使用了MD5加盐算法保存密码在数据库中 安全系数较高


SQL注入

测试用例:在登录时使用sql注入尝试能否正确登录
测试结果:在MyBatis中使用特殊的方法预防了SQL注入 安全系数较高


服务器错发

测试用例:在高并发的情况下频繁切换与发送消息
测试结果:未出现消息错发与消息错乱的情况 安全系数较高


网络

有网

测试结果:在2g情况下访问缓慢 在3g、4g、5g、wifi情况下访问快速 体验较好

弱网

测试工具:使用fidder模拟弱网情况
测试结果:弱网情况下访问缓慢 但是加载出的内容与预期结果完全一致

断网

测试结果:在断网情况下无法访问网页 对于网络依赖较高

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

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

相关文章

Pinia学习笔记 | 入门 - 映射辅助函数

文章目录 Pinia学习笔记简介Pinia是什么 代码分割机制案例1.挂载PiniaVue3Vue2&#xff1a;安装PiniaVuePlugin插件 2.定义store的两种方式options API 和 composition API使用options API模式定义使用composition API模式 2.业务组件对store的使用创建store实例解构访问Pinia容…

Vue学习笔记 之 Svg图标组件的实现步骤

1、安装依赖 首先需要安装svg-sprite-loader依赖&#xff0c;命令如下&#xff0c;这在在学习的过程中&#xff0c;就是因为没有下载该依赖&#xff0c;导致图标一直无法正常显示。 npm install svg-sprite-loader --save-dev --force2、配置svg图片处理规则 通过使用svg-spri…

【嵌入式Linux内核驱动】SPI子系统 | 硬件原理 | 应用编程 | 内核驱动 | 总体框架

1. 硬件原理 1.1 SPI通信协议 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线 四根通信线&#xff1a;SCK&#xff08;Serial Clock&#xff09;、MOSI&#xff08;Master Output Slave Input&#xff09;、MISO&#xff08…

jmeter主要函数助手功用说明

jmeter中虽然有很多的插件&#xff0c;但是有些需要安装&#xff0c;有些具有一定的局限性。函数助手是一个快捷的工具库。下面记录一下函数助手中一些主要的函数的使用方法。 注&#xff1a;不内容中所有的实例均基于3.2记录 1、_BeanShell 表达式请求值后的值&#xff1a;可…

Hadoop之Hive安装

一、嵌入模式安装 1、下载Hive安装包 https://archive.apache.org/dist/hive/hive-1.2.1/ 2、上传至/root/export/software/ rz apache-hive-1.2.1-bin.tar.gz 3、解压 tar apache-hive-1.2.1-bin.tar.gz -C /root/export/servers/ cd /root/export/servers/apache-hive-1.2.…

openGauss学习笔记-09 openGauss 简单数据管理-创建数据库

文章目录 openGauss学习笔记-09 openGauss 简单数据管理-创建数据库9.1 语法格式9.2 参数说明9.3 示例 openGauss学习笔记-09 openGauss 简单数据管理-创建数据库 数据库安装完成后&#xff0c;默认生成名称为postgres的数据库。您需要自己创建一个新的数据库。 9.1 语法格式…

【Docker】Docker高级网络(NetWork)

【Docker】Docker高级网络(NetWork) 文章目录 【Docker】Docker高级网络(NetWork)1. 概述2. 网络2.1 网桥类型2.2 创建网络自定义桥2.3 查看所有网络2.4 查看特定网络的细节2.5 删除特定网络2.6 多个容器使用指定网络 参考文档&#xff1a;高级网络配置 Docker – 从入门到实践…

手机pdf怎么转换为图片?看看这几个转换方法

手机pdf怎么转换为图片&#xff1f;将手机图片转为PDF有很多好处。首先&#xff0c;PDF文件通常比图片文件更小&#xff0c;可以节省手机存储空间。其次&#xff0c;PDF文件可以更轻松地与他人共享&#xff0c;并且可以在不同设备和操作系统上打开。最后&#xff0c;将图片转换…

superheat | 超级简单的热图绘制解决方案!~(二)(聚类和注释图的添加~)

1写在前面 前面写了superheat的教程&#xff0c;今天写一下第二波&#xff0c;如何进行聚类以及添加注释图吧。&#x1f929; 分分钟提升你的heatmap的颜值哦&#xff01;~&#x1f970; 2用到的包 # devtools::install_github("rlbarter/superheat")library(superhe…

二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”

各位CSDN的uu们你们好呀&#xff0c;今天继续数据结构与算法专栏中的二叉树&#xff0c;下面&#xff0c;让我们进入二叉树的世界吧&#xff01;&#xff01;&#xff01; 二叉树&#xff08;上&#xff09;——“数据结构与算法”_认真学习的小雅兰.的博客-CSDN博客 二叉树链…

TypeScript 中对【泛型】的定义使用方式解读

目录 泛型函数多个泛型参数泛型约束泛型别名泛型接口泛型类 泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性。使用泛型 可以复用类型并且让类型更加灵活 泛型实现类型参…

Pycharm安装 leetcode 插件

目录 本节演示Pycharm安装 leetcode 插件做算法题 打开设置&#xff1a; 点击插件&#xff1a; 搜索leetcode并安装&#xff1a; 点这里的 leetcode&#xff1a; 初次使用点这里&#xff1a; 这里输入账号和密码&#xff1a; 点击确定后还是点登录&#xff1a; 登…

【MySQL】SQL入门(一)

&#x1f697;MySQL学习起始站~ &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 ❤️每章节附章节思维导图&#xff0c;文末附全文思维导图&#xff0c;感谢各位点赞收藏支出~ 一.引入 (1) SQL分类 SQL语句&#xff0c;根据其功能&#xff0c;主要分为四类&#x…

巧妙使用 CSS 渐变来实现波浪动画

目录 一、波浪的原理 二、曲面的绘制 三、波浪动画 四、文字波浪动画 五、总结一下 参考资料 之前看到coco[1]的这样一篇文章&#xff1a;纯 CSS 实现波浪效果&#xff01;[2]&#xff0c;非常巧妙&#xff0c;通过改变border-radius和不断旋转实现的波浪效果&#xff0c…

网络安全—全知识点解析(课程学习笔记)

概括来说&#xff0c;网络安全课程的主要内容包括&#xff1a; 安全基本知识 应用加密学 协议层安全 Windows安全&#xff08;攻击与防御&#xff09; Unix/Linux安全&#xff08;攻击与防御&#xff09; 防火墙技术 入侵监测系统 审计和日志分析 下面分别对每部分知识介绍相应…

Stable Diffusion - ControlNet 插件中扩展局部重绘 InpaintOnly + LaMa 算法与应用

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131643131 LaMa: https://github.com/advimman/lama Paper: Resolution-robust Large Mask Inpainting with Fourier Convolutions LaMa: Large…

哇~~真的是你呀!今天是在LINUX上简单部署LAMP平台。

目录 一、概述 二、PHP安装配置 三、安装 四、启动 五、书写测试页面 六、客户端访问 七、安装论坛 一、概述 LAMP组成&#xff1a; &#xff08;1&#xff09; Linux 其他组件的平台 &#xff08;2&#xff09;Apache提供web服务 &#xff08;3&#xff09;MySQL|Ma…

004-Triple协议底层原理分析

目录 底层分析Http 2.0 底层分析 Http 2.0 为了解决Http 1.0 和 1.1 头信息无法压缩有很多比如空格、换行等无用字符请求和相应不能并行处理&#xff1a;一个Socket连接如果接受到Request 就必须要等到服务返回Response了才能继续发送另一个Request 就更新了Http的协议到2.…

SQL语法与数据库快速入门(1)

目录 数据库简介数据库分类常用数据库简介使用场景MySql 的安装与配置数据库客户端工具MySql 介绍SQL 简介DDL 数据库操作-创建DDL 数据库操作-查看DDL 数据库操作-修改DDL 数据库操作-删除DDL 数据库表操作简介DDL 数据库表操作-创建DDL 数据库表操作-查看DDL 数据库表操作-修…

国内值得去的外企之Google攻略

外企在国内非常的乖&#xff0c;基本上都是正常上下班&#xff0c;更有甚者&#xff0c;上班不到点不进门&#xff0c;下班一到点就跑路&#xff0c;中途还能去楼下咖啡店喝咖啡。 年假多、生活工作平衡、待遇还不错&#xff0c;下班以后同事之间几乎再无联系&#xff0c;如果…