短链接系统测试报告

目录

项目背景

项目功能

自动化测试

总结


项目背景

随着互联网的发展,链接(URL)变得越来越长且复杂,这不仅影响用户体验,还可能由于字符限制导致在某些平台或应用中无法完整显示。为了解决这一问题,我们推出了“简洁链接”项目,旨在为用户提供一种快速、简便的方式来缩短和美化他们的URL。

项目目标:

  1. 提供简洁的URL服务: 为用户提供简短的、易于分享和记忆的URL,优化在线体验。
  2. 确保链接安全: 通过多种技术手段确保短链接的跳转安全,防止恶意跳转和钓鱼网站。
  3. 优化性能: 确保短链接的生成和跳转过程快速、稳定。
  4. 提供数据分析: 为用户提供短链接的点击量、来源等数据分析,帮助他们更好地了解用户行为和市场趋势。

项目功能:

  1. 短链接生成: 用户可以将长URL转换为简短的自定义链接。
  2. 链接跳转: 用户点击短链接后,将被安全、快速地重定向到原始链接。
  3. 链接管理: 用户可以管理他们的短链接,包括查看统计、编辑和删除链接。
  4. API接口: 提供API接口,方便第三方开发者集成短链接功能。

技术栈: 

SpringCloudAlibaba + MySQL + Redis + RocketMQ + ShardingJDBC

项目演示

项目测试用例

自动化测试

自动化工具类

package com.sfx.shortLink;

import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.time.Duration;

public class DriverUtils {

    private static ChromeDriver driver;

    public static ChromeDriver createDriver() {
        if(driver == null) {
            driver = new ChromeDriver();
            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        }
        return driver;
    }
}

登陆测试

package com.sfx.shortLink;

import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

import java.time.Duration;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ShortLinkLoginTest {

    private static ChromeDriver driver;

    /**
     * 在所有的测试用例执行之前,先要创建驱动
     */
    @BeforeAll
    static void createAndGetDriver() {
        driver = DriverUtils.createDriver();
        driver.get("http://localhost:5173/");
    }

    public void userNameAndPasClear() {
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[1]/div/div/div[2]/input")).clear();
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[2]/div/div/div[2]/input")).clear();
    }


    @Order(2)
    @ParameterizedTest
    @CsvSource({"sfx3214,123456789","dyrrrwww,123456789"})
    public void testLoginSuccess(String username , String password) {
        // /html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[1]/div/div/div[2]/input
        // /html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[2]/div/div/div[2]/input
        // /html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[2]/div/div/div[2]/input
        // 输入正确的用户名和密码
        userNameAndPasClear();
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[1]/div/div/div[2]/input")).sendKeys(username);
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[2]/div/div/div[2]/input")).sendKeys(password);
        driver.findElement(By.xpath("//*[@id=\"app\"]/div[1]/div[1]/div[1]/form/div[2]/div[2]/button/span")).click();
        String exceptedTest = driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[2]/div/div[1]/div/button[1]/span")).getText();
        Assertions.assertEquals(exceptedTest,"创建短链");
        // /html/body/div[1]/div/section/main/div/div/div[2]/div/div[1]/div/button[2]/span
        exceptedTest = driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[2]/div/div[1]/div/button[2]/span")).getText();
        Assertions.assertEquals(exceptedTest,"批量创建");
        driver.navigate().back();
    }

    @Test
    @Order(1)
    public void testLoginFail(String username,String password) {
        // 账户名和密码都为空
        userNameAndPasClear();
        driver.findElement(By.xpath("//*[@id=\"app\"]/div[1]/div[1]/div[1]/form/div[2]/div[2]/button/span")).click();
        String text = driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[1]/h2")).getText();
        Assertions.assertEquals(text,"用户登录");
        // 账户为空,密码不为空
        userNameAndPasClear();
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[2]/div/div/div[2]/input")).sendKeys("123456789");
        Assertions.assertEquals(text,"用户登录");

        // 账户不为空,密码为空
        userNameAndPasClear();
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[1]/div/div/div[2]/input")).sendKeys("sfx3214");
        Assertions.assertEquals(text,"用户登录");

        // 账户都不为空,密码不为空
        userNameAndPasClear();
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[1]/div/div/div[2]/input")).sendKeys("svrfdffed");
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[2]/div/div/div[2]/input")).sendKeys("1234eadfvefdwf56789");
        Assertions.assertEquals(text,"用户登录");

        // 密码小于8位
        userNameAndPasClear();
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[1]/div/div/div[2]/input")).sendKeys("svrfdffed");
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[2]/div/div/div[2]/input")).sendKeys("1");
        Assertions.assertEquals(text,"用户登录");
    }

    @AfterAll
    static void after() {
        driver.quit();
    }
}

注册测试

package com.sfx.shortLink;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class ShortLinkRegisterTest {

    private static ChromeDriver driver;

    /**
     * 在所有的测试用例执行之前,先要创建驱动
     */
    @BeforeAll
    static void createDriver() {
        driver = DriverUtils.createDriver();
        driver.get("http://localhost:5173/");
    }

    public void clear() {
        // 输入用户名
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[1]/div/div/div[2]/input")).clear();
        // 输入邮箱
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[2]/div/div/div[2]/input")).clear();
        // 输入手机号
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[3]/div/div/div[2]/input")).clear();
        // 输入姓名
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[4]/div/div/div[2]/input")).clear();
        // 输入密码
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[5]/div/div/div[2]/input")).clear();
    }

    @Test
    public void testRegisterSuccess() {
        clear();
        // 点击去注册
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[3]/button/span")).click();
        // 输入用户名
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[1]/div/div/div[2]/input")).sendKeys("dyrrrwww");
        // 输入邮箱
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[2]/div/div/div[2]/input")).sendKeys("89@qq.com");
        // 输入手机号
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[3]/div/div/div[2]/input")).sendKeys("13965896936");
        // 输入姓名
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[4]/div/div/div[2]/input")).sendKeys("dyrrrwww");
        // 输入密码
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[5]/div/div/div[2]/input")).sendKeys("123456789");
        // 点击注册
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[6]/div[2]/button/span")).click();
        String exceptedTest = driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[2]/div/div[1]/div/button[1]/span")).getText();
        Assertions.assertEquals(exceptedTest,"创建短链");
        // /html/body/div[1]/div/section/main/div/div/div[2]/div/div[1]/div/button[2]/span
        exceptedTest = driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[2]/div/div[1]/div/button[2]/span")).getText();
        Assertions.assertEquals(exceptedTest,"批量创建");
    }

    @Test
    public void testRegisterFail() {
        //未输入任何一个
        // 点击去注册
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[3]/button/span")).click();

        clear();
        // 点击注册
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[6]/div[2]/button/span")).click();
        String text = driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/h2")).getText();
        Assertions.assertEquals(text,"用户注册");

        clear();
        //不符合手机号格式
        // 输入用户名
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[1]/div/div/div[2]/input")).sendKeys("dyrrrwww");
        // 输入邮箱
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[2]/div/div/div[2]/input")).sendKeys("89@qq.com");
        // 输入手机号
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[3]/div/div/div[2]/input")).sendKeys("1568989");
        // 输入姓名
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[4]/div/div/div[2]/input")).sendKeys("dyrrrwww");
        // 输入密码
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[5]/div/div/div[2]/input")).sendKeys("123456789");
        // 点击注册
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[6]/div[2]/button/span")).click();
         text = driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/h2")).getText();
        Assertions.assertEquals(text,"用户注册");

        //不符合邮箱格式
        clear();
        // 输入用户名
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[1]/div/div/div[2]/input")).sendKeys("dyrrrwww");
        // 输入邮箱
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[2]/div/div/div[2]/input")).sendKeys("89.com");
        // 输入手机号
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[3]/div/div/div[2]/input")).sendKeys("13846789696");
        // 输入姓名
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[4]/div/div/div[2]/input")).sendKeys("dyrrrwww");
        // 输入密码
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[5]/div/div/div[2]/input")).sendKeys("123456789");
        // 点击注册
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[6]/div[2]/button/span")).click();
         text = driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/h2")).getText();
        Assertions.assertEquals(text,"用户注册");

        //密码长度小于8位

        // 输入用户名
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[1]/div/div/div[2]/input")).sendKeys("dyrrrwww");
        // 输入邮箱
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[2]/div/div/div[2]/input")).sendKeys("89@qq.com");
        // 输入手机号
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[3]/div/div/div[2]/input")).sendKeys("13965896936");
        // 输入姓名
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[4]/div/div/div[2]/input")).sendKeys("dyrrrwww");
        // 输入密码
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[5]/div/div/div[2]/input")).sendKeys("111");
        // 点击注册
        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/form/div[6]/div[2]/button/span")).click();
        text = driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/h2")).getText();
        Assertions.assertEquals(text,"用户注册");

    }

    @AfterAll
    static void after() {
        driver.quit();
    }
}

短链接测试

package com.sfx.shortLink;


import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ShortLinkProjectTest {

    private static ChromeDriver driver;

    @BeforeAll
    static void createDriver() {
        driver = DriverUtils.createDriver();
        driver.get("http://localhost:5173/");
        loginSuccess();
    }

    public static void userNameAndPasClear() {
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[1]/div/div/div[2]/input")).clear();
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[2]/div/div/div[2]/input")).clear();
    }

    public static void loginSuccess() {
        // 登陆
        userNameAndPasClear();
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[1]/div/div/div[2]/input")).sendKeys("sfx3214");
        driver.findElement(By.xpath("/html/body/div/div[1]/div[1]/div[1]/form/div[1]/div[2]/div/div/div[2]/input")).sendKeys("123456789");
        driver.findElement(By.xpath("//*[@id=\"app\"]/div[1]/div[1]/div[1]/form/div[2]/div[2]/button/span")).click();
        String exceptedTest = driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[2]/div/div[1]/div/button[1]/span")).getText();
        Assertions.assertEquals(exceptedTest, "创建短链");
        // /html/body/div[1]/div/section/main/div/div/div[2]/div/div[1]/div/button[2]/span
        exceptedTest = driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[2]/div/div[1]/div/button[2]/span")).getText();
        Assertions.assertEquals(exceptedTest, "批量创建");
    }

    @Test
    public void createShortLink() {
        // 点击创建短链
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[2]/div/div[1]/div/button[1]/span")).click();

        // 输入正确的短链,创建成功
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[6]/div/div/div/div/div[2]/div[1]/div/form/div[1]/div/div/div/input")).sendKeys("https://xiaolincoding.com/");
        // 点击描述信息,自动输入描述信息
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[6]/div/div/div/div/div[2]/div[1]/div/form/div[2]/div/div/textarea")).click();
        // 点击确认创建短连接诶
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[6]/div/div/div/div/div[2]/div[1]/div/form/div[5]/div/div/button[1]/span")).click();
    }

    @Test
    public void creatFail() {
        // 没有输入短链,点击确认,创建失败
        // 点击创建短链
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[2]/div/div[1]/div/button[1]/span")).click();
        // 输入正确的短链,创建成功
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[6]/div/div/div/div/div[2]/div[1]/div/form/div[1]/div/div/div/input")).sendKeys("");
        // 点击描述信息,自动输入描述信息
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[6]/div/div/div/div/div[2]/div[1]/div/form/div[2]/div/div/textarea")).click();
        // 点击确认创建短连接诶
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[6]/div/div/div/div/div[2]/div[1]/div/form/div[5]/div/div/button[1]/span")).click();
    }


    @Test
    public void restoreShortLink() {
        // /html/body/div[1]/div/section/main/div/div/div[2]/div/div[2]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[1]/td[3]/div/div/a/span
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[2]/div/div[2]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[1]/td[3]/div/div/a/span")).click();
        String exceptedTest = driver.getCurrentUrl();
        Assertions.assertNotEquals(exceptedTest, "https://xiaolincoding.com/");
    }


    @Test
    public void updateShortLink() {
        // /*[name()='svg']/*[name()='use']
        //  /html/body/div[1]/div/section/main/div/div/div[2]/div/div[2]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[1]/td[8]/div/div/i[2]/svg
        // //*[@id="app"]/div/section/main/div/div/div[2]/div/div[2]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[1]/td[8]/div/div/i[2]//*[name()='svg']/*[name()='path']
        // //*[@id="app"]/*[name()='svg']/*[name()='path']
        driver.findElement(By.xpath("//*[@id=\"app\"]/div/section/main/div/div/div[2]/div/div[2]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[1]/td[8]/div/div/i[2]//*[name()='svg']")).click();

        WebElement element = driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[7]/div/div/div/div/form/div[2]/div/div/textarea"));

        element.clear();
        element.sendKeys("i love you");
        // 点击确认
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[7]/div/div/div/div/form/div[5]/div/div/button[1]/span")).click();
    }

    @Test
    public void recycle() {
        driver.findElement(By.xpath("//*[@id=\"app\"]/div/section/main/div/div/div[2]/div/div[2]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[1]/td[8]/div/div/i[3]//*[name()='svg']")).click();
        driver.findElement(By.xpath("/html/body/div[2]/div[9]/div/div[2]/button[2]")).click();
        // 点击回收站
        driver.findElement(By.xpath("//*[@id=\"app\"]/div/section/main/div/div/div[1]/div[2]/div")).click();
        String text = driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[2]/div/div[2]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[2]/td[3]/div/div/a/span")).getText();
        Assertions.assertEquals(text, "http://nurl.ink:8001/2CQufK");

        // 回收站移除
        driver.findElement(By.xpath("//*[@id=\"app\"]/div/section/main/div/div/div[2]/div/div[2]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[2]/td[8]/div/div/i[2]//*[name()='svg']")).click();

        // 回到默认分组
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[1]/ul/li/div")).click();
        // 验证
        String text1 = driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[2]/div/div[2]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[1]/td[3]/div/div/a/span")).getText();
        System.out.println(text1);

    }


    @Test
    public void shortLinkGroup() {
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[1]/div[1]/div[2]/img")).click();

        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[4]/div/div/div/form/div/div/div/div/input")).sendKeys("新的分组");
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[4]/div/div/footer/span/button[2]")).click();

        WebElement element = driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[1]/ul/li[2]/div"));
        System.out.println(element.getText());
        Assertions.assertEquals(element.getText(), "新的分组\n" +
                "0");
    }


    @Test
    public void shortLinkStats() {
        // 点击短链接统计按钮能够正常查看统计内容
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[2]/div/div[2]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[1]/td[8]/div/div/i[1]//*[name()='svg']")).click();
        WebElement element = driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[3]/div/div/div/div[2]/div[1]/div/div/div/div[2]"));
        Assertions.assertTrue(element.getText() != null);
        //跳转短链接后,统计的值与原先的有变化

        //能否正常的从曲线切换到直方图
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[3]/div/div/div/div[2]/div[2]/div[1]/div/div[1]/div[1]/div/button")).click();

        //能否查看访问记录
        driver.findElement(By.xpath("/html/body/div[1]/div/section/main/div/div/div[3]/div/div/div/div[2]/div[1]/div/div/div/div[3]")).click();
    }


    @AfterAll
    static void after() {
         driver.quit();
    }
}

测试套件

package com.sfx.shortLink;


import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

/**
 * 套件类
 */
@Suite
@SelectClasses({ShortLinkLoginTest.class,ShortLinkProjectTest.class,ShortLinkRegisterTest.class})
public class TestSuite {


}

总结

以上便是本次短链接系统的测试报告~ 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

上位机图像处理和嵌入式模块部署(boost库的使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 作为c程序员来说,除了qt之外,另外值得学的开发库就是boost。boost本身包含的内容非常多,基本我们常用的功能都已…

ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整

文章目录 ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整获取音频长度pydub获取音频长度获取时长精确到秒格式设定 mutagen获取音频长度 调整音量视频音量调整注意事项 ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整 老王媳妇说上次那个pip挺好…

分布式学习笔记

1. CAP理论 Consistency(一致性):用户访问分布式系统中的任意节点,得到的数据必须一致。 Availability(可用性):用户访问集群中的任意健康节点,必须得到相应,而不是超时…

VSCODE上使用python_Django

接上篇 https://blog.csdn.net/weixin_44741835/article/details/136135996?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136135996%22%2C%22source%22%3A%22weixin_44741835%22%7D VSCODE官网: Editing Python …

汽车网络安全--关于供应商网络安全能力维度的思考

目录 1.关于CSMS的理解 2.OEM如何评审供应商 2.1 质量评审 2.2 网络安全能力评审 3.小结 1.关于CSMS的理解 最近在和朋友们交流汽车网络安全趋势时,讨论最多的是供应商如何向OEM证明其网络安全能力。 这是很重要的一环,因为随着汽车网络安全相关强…

AI 文生图提示词分类(合集 · 第一季)

一、时间和季节 Time and Season 1、时间描述 Time Description 比如,日出、黄昏、夜晚、清晨 / Sunrise, Sunset, Night, Early Morning 2、季节变化 Seasonal Changes 比如,春天、夏天、秋天、冬天 / Spring, Summer, Autumn, Winter 二、场景描述 Sce…

UE5中的DataTable说明

创建DataTable 在编辑器中创建 在文件夹空白处右击,选择Miscellaneous/DataTable,如图: 使用代码创建 // 创建DataTable实例 UDataTable* MyDataTable NewObject(); // 创建一个行结构体 UStruct* RowStruct UStruct::CreateEmpty(); // 添…

字符设备驱动分步注册实现LED驱动的编写

头文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t;#define RCC 0x50000A28 #define LED1_ADDR 0x50006000 #defi…

序列发生器

一开始想直接FSM,划分出6状态依次输出对应的。但其实只要6比特的移位寄存器,每次输出高位。复位后的默认值时6’b001_011。这样就可以实现循环,这种移位寄存器也叫barrel_shifter。循环移位。也可以使用循环计数器,然后case计数器…

MATLAB知识点:meshgrid函数(★★★★☆)返回二维网格坐标(在MATLAB中经常用于生成绘制三维图的数据)

讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章:课后习题讲解中拓展的函数 在讲解第三…

从 AGP 4.1.2 到 7.5.1——XmlParser、GPathResult、QName 过时

新年首发, 去年的问题,今年解决~ 问题 & 排查 1: Task failed with an exception. ----------- * What went wrong: Execution failed for task :app:processCommonReleaseManifest. > org.xml.sax.SAXParseException; lineNumber: 1; columnNu…

Java学习--黑马SpringBoot3课程个人总结-2024-02-15

1.未登录统一处理 2.添加文章分类 //控制添加分类弹窗 const dialogVisible ref(false)//添加分类数据模型 const categoryModel ref({categoryName: ,categoryAlias: }) //添加分类表单校验 const rules {categoryName: [{ required: true, message: 请输入分类名称, tri…

element 表单提交图片(表单上传图片)

文章目录 使用场景页面效果前端代码 使用场景 vue2 element 表单提交图片   1.点击【上传图片】按钮择本地图片(只能选择一张图片)后。   2.点击图片,支持放大查看。   3.点击【保存】按钮,提交表单。 页面效果 前端代码…

OBD部署OceanBase集群-配置文件方式

前一篇文章介绍了OBD白屏可视化方式部署OceanBase集群 ,其原理是把可视化设置生成为一个配置文件,然后使用OBD命令部署集群 本篇想使用命令行加配置文件方式,只部署OceanBase和ODProxy两个组件 服务器参数配置和 oceanbase-all-in-one-*.ta…

洛谷: P1553 数字反转(升级版)

思路: 没想到什么好办法,一步一步来。整体就是反转,删除前导/后导0,反转,删除前导/后导0。 第一次AC没过去,原因是没考虑到分数的分母前导0的情况,比如1234567890/1234567890这个样例,结果输出…

2024 ICDE第一轮 时空(Spatial-Temporal)和时序(Time Series)论文总结

ICDE 2024目前把第一轮接收的论文已经全部放出,部分挂在了arXiv上,本文总结了ICDE 2024第一轮有关时空和时序的相关文章。 🌟【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘!🚀 时空数据(Spatial-Tem…

MySQL系列之索引入门(下)

前言 通过上文,我想各位盆友已熟悉MySQL的索引分类及其含义,那么如何合理的使用呢? 请继续围观此文,一探究竟! 一、创建索引 首先,我们一起学习索引是如何创建的,又有哪些方式。 1. create t…

104.网游逆向分析与插件开发-网络通信封包解析-接收数据的初步逆向分析

内容参考于:易道云信息技术研究院VIP课 上一个内容:网络完成端口模型的流程 下图登录了游戏,此时此刻 WSARecv 已经投递 然后打开x96dbg来到WSARecv函数 然后WSARecv的线程id:5BAC WSASend函数的线程id:主线程 66C0 …

stm32--笔记

一、引脚与变量 ​​​​​​​​​​​​​​ 二、STM32时钟 [STM32-时钟系统详解_stm32时钟_KevinFlyn的博客-CSDN博客] 三、定时器中断实验 1、定时器中断实验 ​ stm32关于通用定时器的周期、频率计算公式_stm32tim频率计算_胶囊咖啡的博客-CSDN博客 ​ 【STM32】通用…

Eclipse - 查看工程或者文件的磁盘路径

Eclipse - 查看工程或者文件的磁盘路径 1. Help -> Eclipse Marketplace -> Find: Explorer -> Eclipse Explorer 4.1.0 -> Install2. right-click -> Open in ExplorerReferences 1. Help -> Eclipse Marketplace -> Find: Explorer -> Eclipse Explo…