QML小案例 使用QML简单实现翻牌版扫雷游戏(二)

news2025/1/25 9:03:20

使用QML实现扫雷功能案例,使用QML界面实现翻牌特效,以及随机的,从左到右,从中心向两边加载界面的特效实现,简单的示例NumberAnimationPropertyAnimationSequentialAnimation实现动画的效果,QML篇

导读

    • QML图片特效
      • 点击翻转特效
      • 点击绕中心旋转
      • 点击连续翻转效果
      • 点击切牌
    • 动态加载界面特效
      • 随机加载卡牌特效
      • 从左到右加载特效
      • 从中心向左右两边散开特效
      • 从中心向四周散开特效
    • QML完整案例
      • 最终效果
      • QML文件完整源码

QML图片特效

QML 动画效果建议参考:QML动画 这篇文章;
其中主要用到了以下方法函数:

  • NumberAnimation 它定义了当数值改变时应用的动画。
  • PropertyAnimation 提供一种将对属性值的更改动画化的方法。
  • SequentialAnimationParallelAnimation类型允许多个动画一起运行。在SequentialAnimation中定义的动画一个接一个地运行,而在ParallelAnimation中定义的动画是同时运行的。
    通过修改 duration 属性[保存动画的持续时间,以毫秒为单位。] 实现特效。

点击翻转特效

transform: Rotation设置图片的旋转轴为Y轴,默认angle(角度)属性值为0
NumberAnimation 方法设置angle属性在 2000毫秒内从0度翻转到360度

Image {
                id: imgitem1
                property string image_path:"qrc:/Minesweeper_datas/card-ace-spades.png"
                source: image_path
                width:100
                height: 100
                fillMode: Image.PreserveAspectFit // 保持图片比例,适应尺寸
                scale: 1.0 // 图片的缩放比例
                smooth: true // 是否使用平滑缩放(默认为 true)。
                ToolTip{
                    id:tooltip;
                    anchors.centerIn: parent
                    text: "点击翻牌"
                    timeout: 5000
                }

                transform: Rotation { //设置旋转的轴
                    id:rotation
                    origin.x:imgitem1.width/2
                    origin.y:imgitem1.height/2
                    axis{x:0;y:1;z:0}
                    angle:0
                }

                //设置翻转 2000毫秒内从0度翻转到360度
                NumberAnimation {
                    id:start_flop
                    target: rotation
                    property: "angle"
                    from:0
                    to:360
                    duration: 2000
                }
                Component.onCompleted:
                {
                    tooltip.open();
                }
                MouseArea
                {
                    anchors.fill: parent
                    acceptedButtons: Qt.AllButtons //检查按钮类型
                    onPressed: {
                        start_flop.start();
                        tooltip.close();
                    }
                }
            }

效果:
请添加图片描述

点击绕中心旋转

transform: Rotation设置旋转中心,沿中心旋转,正值顺时针
NumberAnimation 方法设置angle属性在 2000毫秒内从0度翻转到360度

Image {
                id: imgitem2
                property string image_path:"qrc:/Minesweeper_datas/card-ace-spades.png"
                source: image_path
                width:100
                height: 100
                fillMode: Image.PreserveAspectFit // 保持图片比例,适应尺寸
                scale: 1.0 // 图片的缩放比例
                smooth: true // 是否使用平滑缩放(默认为 true)。
                ToolTip{
                    id:tooltip2;
                    anchors.centerIn: parent
                    text: "点击绕中心旋转"
                    timeout: 5000
                }

                transform: Rotation { //设置旋转的轴
                    id:rotation2
                    origin.x:imgitem2.width/2
                    origin.y:imgitem2.height/2
                    angle:0
                }

                //设置翻转 2000毫秒内从0度翻转到360度
                NumberAnimation {
                    id:start_flop2
                    target: rotation2
                    property: "angle"
                    from:0
                    to:360
                    duration: 2000
                }

                Component.onCompleted:
                {
                    tooltip2.open();
                }
                MouseArea
                {
                    anchors.fill: parent
                    acceptedButtons: Qt.AllButtons //检查按钮类型
                    onPressed: {
                        start_flop2.start();
                        tooltip2.close();
                    }
                }
            }

效果:
请添加图片描述

点击连续翻转效果

通过 SequentialAnimation 执行一系列 PropertyAnimation 方法
↓在300毫秒内沿中心对称轴从0度旋转到45度
↓300毫秒内沿中心对称轴从45度旋转到0度
↓在300毫秒内沿中心对称轴从0度旋转到-45度
↓在300毫秒内沿中心对称轴从-45度旋转到0度
设置loops属性为3,只执行3次

Image {
                id: imgitem3
                property string image_path:"qrc:/Minesweeper_datas/card-ace-spades.png"
                source: image_path
                width:100
                height: 100
                fillMode: Image.PreserveAspectFit // 保持图片比例,适应尺寸
                scale: 1.0 // 图片的缩放比例
                smooth: true // 是否使用平滑缩放(默认为 true)。
                ToolTip{
                    id:tooltip3;
                    anchors.centerIn: parent
                    text: "点击连续翻转效果"
                    timeout: 5000
                }

                transform: Rotation { //设置旋转的轴
                    id:rotation3
                    origin.x:imgitem2.width/2
                    origin.y:imgitem2.height/2
                    axis{x:0;y:1;z:0}
                    angle:0
                }

                //抖动
                SequentialAnimation
                {
                    loops: 3
                    id:image_shake
                    PropertyAnimation {
                        target: rotation3
                        property: "angle"
                        from:0
                        to:45
                        duration: 300
                    }
                    PropertyAnimation {
                        target: rotation3
                        property: "angle"
                        from:45
                        to:0
                        duration: 300
                    }
                    PropertyAnimation {
                        target: rotation3
                        property: "angle"
                        from:0
                        to:-45
                        duration: 300
                    }
                    PropertyAnimation {
                        target: rotation3
                        property: "angle"
                        from:-45
                        to:0
                        duration: 300
                    }
                    running: false;
                }

                //设置抖动

                Component.onCompleted:
                {
                    tooltip3.open();
                }
                MouseArea
                {
                    anchors.fill: parent
                    acceptedButtons: Qt.AllButtons //检查按钮类型
                    onPressed: {
                        image_shake.start();
                        tooltip3.close();
                    }
                }
            }

效果:
请添加图片描述

点击切牌

同样是通过 SequentialAnimation 执行一系列 PropertyAnimation 方法:
↓先在250毫秒内沿中心对称轴从0度旋转到90度,
↓ 再修改图片路径,
↓再250毫秒内沿中心对称轴从90度旋转到0度,实现一个切牌的效果。

            Image {
                id: imgitem4
                property string image_path:"qrc:/Minesweeper_datas/card-ace-spades.png"
                source: image_path
                width:100
                height: 100
                fillMode: Image.PreserveAspectFit // 保持图片比例,适应尺寸
                scale: 1.0 // 图片的缩放比例
                smooth: true // 是否使用平滑缩放(默认为 true)。
                ToolTip{
                    id:tooltip4;
                    anchors.centerIn: parent
                    text: "点击切牌"
                    timeout: 5000
                }

                transform: Rotation { //设置旋转的轴
                    id:rotation4
                    origin.x:imgitem1.width/2
                    origin.y:imgitem1.height/2
                    axis{x:0;y:1;z:0}
                    angle:0
                }

                SequentialAnimation
                {
                    property int start_durationn:250
                    property int end_duration:250
                    property string new_image_path: "qrc:/Minesweeper_datas/card-9-spades.png"
                    loops: 1
                    id:image_overturn
                    ///翻转缓冲
                    NumberAnimation{
                        id:start_animation
                        target: rotation4
                        property: "angle"
                        from:0
                        to:90
                        duration: image_overturn.start_durationn
                    }
                    PropertyAnimation {
                        target: imgitem4 ;
                        property: "source" ;
                        duration: 0;
                        to: image_overturn.new_image_path
                    }
                    NumberAnimation{
                        id:end_animation
                        target: rotation4
                        property: "angle"
                        from:90
                        to:0
                        duration: image_overturn.end_duration
                    }
                    running: false;
                }


                Component.onCompleted:
                {
                    tooltip4.open();
                }
                MouseArea
                {
                    anchors.fill: parent
                    acceptedButtons: Qt.AllButtons //检查按钮类型
                    onPressed: {
                        image_overturn.start();
                        tooltip4.close();
                    }
                }
            }

效果:
请添加图片描述

动态加载界面特效

这里用到的加载界面的翻转特效,实际上都是修改切换图片的时间;
通过PropertyAnimation 设置duration属性修改图片的source属性值实现动态加载特效

 //初始化时 随机生成
   SequentialAnimation
     {
         loops: 1
         id:image_flicker
         PropertyAnimation {
             target: imgitem ;
             property: "source" ;
             duration: {
             //randomNumber 根据索引获取时间差
                 if(imageRect.itemindex>=0 && imageRect.itemindex<operate_id.get_Plat_Cols()*operate_id.get_Plat_Rows())
                     randomNumber(imageRect.itemindex);
                 else
                     100;
             }
             from: "qrc:/Minesweeper_datas/square.png";
             to: imgitem.image_path
         }
         //设置为true 加载时自启动启动
         running: true;
     }

随机加载卡牌特效

随机加载就是通过PropertyAnimation 方法给每张卡牌设置一个随机的0到1000毫秒内的duration值,
时间到了修改图片路径

function randomNumber(_index)
{
 var randomNum = Math.floor(Math.random() * 1000) + 1; // 生成1到1000之间的随机整数
 return randomNum;
 }

效果:
请添加图片描述

从左到右加载特效

从左到右:根据索引获取所在列,再计算每列/总列数*800毫秒+50(基础毫秒)得到每列加载时间。

function randomNumber(_index)
{
  var row= Math.max((Math.ceil(_index/operate_id.get_Plat_Rows())-1),0);
  var col=_index-row*operate_id.get_Plat_Cols();
  return (col/operate_id.get_Plat_Cols())*800+50
 }

效果:
请添加图片描述

从中心向左右两边散开特效

中心向左右两边散开:根据索引,获取所在列,
再根据列计算列与中心作差的绝对值
绝对值/总列数*800毫秒+50毫秒(基础值)

function randomNumber(_index)
{
var row= Math.max((Math.ceil(_index/operate_id.get_Plat_Rows())-1),0);
var col=_index-row*operate_id.get_Plat_Cols();
//            console.log("_index ",_index,"col : ",col," abs ",Math.abs((operate_id.get_Plat_Cols()/2)-col))
return (Math.ceil((Math.abs((operate_id.get_Plat_Cols()/2)-col)/operate_id.get_Plat_Cols())*800)+50);
}

效果:
请添加图片描述

从中心向四周散开特效

从中心散开,包含了行的差值所占比例的时间差;
实际上也可以反过来作差在取绝对值,变成由四边向中心聚集效果

var row= Math.max((Math.ceil(_index/operate_id.get_Plat_Rows())-1),0);
var col=_index-row*operate_id.get_Plat_Cols();
var col_time= (Math.ceil((Math.abs((operate_id.get_Plat_Cols()/2)-col)/operate_id.get_Plat_Cols())*500)+50);
var row_time= (Math.ceil((Math.abs((operate_id.get_Plat_Rows()/2)-row)/operate_id.get_Plat_Rows())*500)+50);
return (col_time+row_time)

效果:
请添加图片描述

QML完整案例

最终效果

最终试玩效果:
请添加图片描述

QML文件完整源码

main.qml完整代码示例
运行环境:Qt creator 5.13.1 Mingw X64

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
import DAL_Connector 1.0

Window {
    property int dynamicRows: 2   // 动态行数
    property int dynamicColumns: 2 // 动态列数
    property int windows_width:340 //窗体宽度
    property int windows_heigt:370 //窗体高度
    property int banner:0 //旗子数量
    id:window_id
    visible: true
    width: windows_width
    height: windows_heigt
    title: qsTr("扫雷小程序")
    Operate_Connector{
        id:operate_id
        Component.onCompleted:
        {
            set_Bomb_Count(40);
            set_Plat_Rows(16);
            set_Plat_Cols(16);
            //生成一个矩阵
            reconstruction();
            dynamicRows=operate_id.get_Plat_Rows();
            dynamicColumns=operate_id.get_Plat_Cols()
            windows_width=dynamicColumns*30+20+(dynamicRows-1)
            windows_heigt=dynamicRows*30+20+(dynamicColumns-1)
            banner=0
            setTitleBombNum(banner)
        }
    }

    function setTitleBombNum(_banner)
    {
        var _title="扫雷小程序 [ "+_banner+" / "+ operate_id.get_Bomb_Count()+" ]";
        window_id.title=qsTr(_title)

    }


    //! 生成随机整数
    function randomNumber(_index)
    {
        _index=_index+1;
        switch(operate_id.get_animType())
        {
        case 0:  //随机
            var randomNum = Math.floor(Math.random() * 1000) + 1; // 生成1到1000之间的随机整数
            return randomNum;
        case 1: //从左到右
        {
            var row= Math.max((Math.ceil(_index/operate_id.get_Plat_Rows())-1),0);
            var col=_index-row*operate_id.get_Plat_Cols();
            return (col/operate_id.get_Plat_Cols())*800+50
        }
        case 2: //从中心向左右散开
        {
//            console.log(Math.max((Math.ceil(_index/operate_id.get_Plat_Rows())-1),0));
            var row= Math.max((Math.ceil(_index/operate_id.get_Plat_Rows())-1),0);
            var col=_index-row*operate_id.get_Plat_Cols();
//            console.log("_index ",_index,"col : ",col," abs ",Math.abs((operate_id.get_Plat_Cols()/2)-col))
            return (Math.ceil((Math.abs((operate_id.get_Plat_Cols()/2)-col)/operate_id.get_Plat_Cols())*800)+50);
            //            var randomNum = Math.floor(Math.random() * 1000) + 1; // 生成1到1000之间的随机整数
            //            return randomNum;
        }
        case 3: //从中心辐射散开
        {
            var row= Math.max((Math.ceil(_index/operate_id.get_Plat_Rows())-1),0);
            var col=_index-row*operate_id.get_Plat_Cols();
            //            var diff=Math.abs((operate_id.get_Plat_Cols()/2)-col)-
            var col_time= (Math.ceil((Math.abs((operate_id.get_Plat_Cols()/2)-col)/operate_id.get_Plat_Cols())*500)+50);
            var row_time= (Math.ceil((Math.abs((operate_id.get_Plat_Rows()/2)-row)/operate_id.get_Plat_Rows())*500)+50);
//            console.log("col_time ",col_time," row_time ", row_time," (col_time+row_time) ",(col_time+row_time))
            return (col_time+row_time)
        }
        }
    }

    //固定高宽
    onWidthChanged:
    {
        if (width !== windows_width) {
            width = windows_width
        }
    }
    onHeightChanged:
    {
        if (height !== windows_heigt) {
            height = windows_heigt
        }
    }

    //背景布局
    Rectangle {
        //下边框布局
        id:rectview
        anchors.fill:parent
        color: "black"
        //弹窗
        Dialog {
            property string dialog_title:"提示"
            id: dialog
            title: dialog_title
            width: 300
            height: 200
            x:(parent.width-width)/2
            y:(parent.height-height)/2

            standardButtons: Dialog.Ok | Dialog.Cancel
            onAccepted: {
                console.log("Dialog accepted")
                operate_id.reconstruction();
                repeaid.model=null;
                repeaid.model=dynamicRows*dynamicColumns;
            }
            onRejected:{ console.log("Dialog rejected")
                //                Qt.quit();
            }

            Text {
                id:textitem
                text: "游戏结束"
                anchors.centerIn: parent
            }

            function setText(_text)
            {
                textitem.text=_text
            }

        }

            Menu
            {
                title: "Update"
                id:contentmenus;
        //        Action MenuItem
                Action {
                    id: settingsAction
                    text: "重新开始"
                    icon.name: "icon-settings"
                    icon.source: "qrc:/Minesweeper_datas/jigsaw-piece-hover.png"
                    //Shortcut: "Ctrl+X" //绑定按钮
                    onTriggered: {
                        //重新开始扫雷
                        operate_id.reconstruction();
                        repeaid.model=null;
                        repeaid.model=dynamicRows*dynamicColumns;
                    }
                }
            }
        MouseArea {
             anchors.fill: parent
             acceptedButtons:  Qt.RightButton // **右键(别落下这个)
             onClicked: {
                 if (mouse.button === Qt.RightButton) { // 右键菜单
                     //
                     contentmenus.popup()
                 }
             }
        }
        //表格样式
        Grid {

            columns: dynamicColumns // 设置列数为3
            rows: dynamicRows    // 设置行数为3
            anchors.fill: parent
            anchors.margins: 10
            spacing: 1 // 设置组件之间的间距
            // 水平居中
            anchors.horizontalCenter: parent.horizontalCenter
            // 垂直居中
            anchors.verticalCenter: parent.verticalCenter



            //循环控件
            Repeater {
                id:repeaid
                model: dynamicRows*dynamicColumns

                ///单个控件
                Rectangle {
                    id: imageRect
                    width: 30;
                    height:30;

                    //图片控件状态
                    // 0 没有点击过
                    // 1 右键点击 插旗
                    // 2 右键第二次点击 疑问
                    // 3 左键点击 判断是否是炸弹
                    property int btn_type:0

                    property int itemindex:index

                    ///刷新图片
                    function update_Imgae( _board,_duration)
                    {
                        if(btn_type!=3)
                        {
                            imgitem.rolling_overs(_board,_duration)
                            btn_type=3
                        }
                    }

                    ///控件显示图片
                    Image {
                        id: imgitem
                        property string image_path:"qrc:/Minesweeper_datas/jigsaw-piece.png"
                        source: "qrc:/Minesweeper_datas/square.png"
                        width:parent.width
                        height: parent.width
                        fillMode: Image.PreserveAspectFit // 保持图片比例,适应尺寸
                        scale: 1.0 // 图片的缩放比例
                        smooth: true // 是否使用平滑缩放(默认为 true)。

                        transform: Rotation { //设置旋转的轴
                            id:rotation
                            origin.x:imgitem.width/2
                            origin.y:imgitem.height/2
                            axis{x:0;y:1;z:0}
                            angle:0
                        }

                        SequentialAnimation
                        {
                            property int start_durationn:250
                            property int end_duration:250
                            loops: 1
                            id:image_overturn
                            ///翻转缓冲
                            NumberAnimation{
                                id:start_animation
                                target: rotation
                                property: "angle"
                                from:0
                                to:90
                                duration: image_overturn.start_durationn
                            }
                            PropertyAnimation {
                                target: imgitem ;
                                property: "source" ;
                                duration: 0;
                                to: imgitem.image_path
                            }
                            NumberAnimation{
                                id:end_animation
                                target: rotation
                                property: "angle"
                                from:90
                                to:0
                                duration: image_overturn.end_duration
                            }
                            running: false;
                        }

                        function rolling_over( _path)
                        {
                            image_path=_path;

                            image_overturn.start();
                        }

                        function rolling_overs( _board,_duration)
                        {
                            image_overturn.start_durationn=200;
                            image_overturn.end_duration=_duration;

                            //修改显示卡牌
                            switch(_board)
                            {
                            case 0:
                                image_path="qrc:/Minesweeper_datas/square.png";
                                image_overturn.start_durationn=200;
                                image_overturn.end_duration=200;
                                break;
                            case 1:
                                image_path="qrc:/Minesweeper_datas/card-ace-spades.png";
                                break;
                            case 2:
                                image_path="qrc:/Minesweeper_datas/card-2-spades.png";
                                break;
                            case 3:
                                image_path="qrc:/Minesweeper_datas/card-3-spades.png";
                                break;
                            case 4:
                                image_path="qrc:/Minesweeper_datas/card-4-spades.png";
                                break;
                            case 5:
                                image_path="qrc:/Minesweeper_datas/card-5-spades.png";
                                break;
                            case 6:
                                image_path="qrc:/Minesweeper_datas/card-6-spades.png";
                                break;
                            case 7:
                                image_path="qrc:/Minesweeper_datas/card-7-spades.png";
                                break;
                            case 8:
                                image_path="qrc:/Minesweeper_datas/card-8-spades.png";
                                break;
                            default:
                                image_path="qrc:/Minesweeper_datas/mace-head.png";
                                break;
                            }
                            image_overturn.start();
                        }


                        //初始化时 随机生成
                        SequentialAnimation
                        {
                            loops: 1
                            id:image_flicker
                            PropertyAnimation {
                                target: imgitem ;
                                property: "source" ;
                                duration: {
                                    if(imageRect.itemindex>=0 && imageRect.itemindex<operate_id.get_Plat_Cols()*operate_id.get_Plat_Rows())
                                        randomNumber(imageRect.itemindex);
                                    else
                                        100;
                                }
                                from: "qrc:/Minesweeper_datas/square.png";
                                to: imgitem.image_path
                            }
                            running: true;
                        }

                        //抖动
                        SequentialAnimation
                        {
                            loops: 1
                            id:image_shake
                            PropertyAnimation {
                                target: rotation
                                property: "angle"
                                from:0
                                to:45
                                duration: 300
                            }
                            PropertyAnimation {
                                target: rotation
                                property: "angle"
                                from:45
                                to:0
                                duration: 300
                            }
                            PropertyAnimation {
                                target: rotation
                                property: "angle"
                                from:0
                                to:-45
                                duration: 300
                            }
                            PropertyAnimation {
                                target: rotation
                                property: "angle"
                                from:-45
                                to:0
                                duration: 300
                            }
                            running: false;
                        }

                        function shake_over()
                        {
                            image_shake.running=true;
                        }

                        function shake_over_stop()
                        {
                            image_shake.running=false;
                            rotation.angle=0;
                        }

                    }

                    //Rectangle 鼠标事件
                    MouseArea
                    {
                        anchors.fill: parent
                        hoverEnabled: true
                        acceptedButtons: Qt.AllButtons
                        onEntered:{
                            if(btn_type!=3 && btn_type!=1 )
                                imgitem.shake_over();
                        }
                        onExited:{
                            if(btn_type!=3 && btn_type!=1)
                                imgitem.shake_over_stop();
                        }
                        onPressed: {
                            if(btn_type==3)
                                return;
                            var Old_btn_type=btn_type;

                            //先移除抖动效果
                            if(btn_type!=3 && btn_type!=1)
                                imgitem.shake_over_stop();

                            //开始翻牌
                            if(mouse.button===Qt.LeftButton){
                                if(btn_type!=3 && btn_type!=1)
                                {
                                    operate_id.is_Bomb(index);
                                }
                            }
                            else if(mouse.button===Qt.RightButton)
                            {
                                btn_type++;
                                if(btn_type==3)
                                    btn_type=0;
                            }
//                            console.log("Old_btn_type: ",Old_btn_type," btn_type: ",btn_type)
                            //检测旗帜的数量
                            if(Old_btn_type==1 && btn_type!=1)
                            {
                                window_id.banner--;
                                window_id.setTitleBombNum(window_id.banner)
                            }
                            else if(Old_btn_type!=1&& btn_type==1)
                            {
                                window_id.banner++;
                                window_id.setTitleBombNum(window_id.banner)
                            }

                            //修改图标状态
                            if(btn_type==1)
                            {
                                imgitem.rolling_over("qrc:/Minesweeper_datas/knight-banner.png");
                            }
                            else if(btn_type==2)
                            {
                                imgitem.rolling_over("qrc:/Minesweeper_datas/help.png");
                            }
                            else if(btn_type==0)
                            {
                                imgitem.rolling_over("qrc:/Minesweeper_datas/jigsaw-piece.png");
                            }

                        }


                    }

                }
            }


            Connections
            {
                //信号 On+首字母大写
                target:operate_id
                onBlank_clearing:
                {
                    var imageRect= repeaid.itemAt(index)
                    imageRect.update_Imgae(board,duration);

                }
                onGameWin:
                {
                    dialog.setText("胜利!");
                    dialog.open();
                    console.log("胜利!");
                }
                onGameFailure:
                {
                    dialog.setText("失败!");
                    dialog.open();
                    console.log("失败!");
                }

            }
        }

    }




}

C++ 数据处理篇:QML小案例 使用QML简单实现翻牌版扫雷游戏(一)

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

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

相关文章

Python接口自动化之Token详解及应用

以下介绍Token原理及在自动化中的应用。 一、Token基本概念及原理 1.Token作用 为了验证用户登录情况以及减轻服务器的压力&#xff0c;减少频繁的查询数据库&#xff0c;使服务器更加健壮。 2.什么是Token Token是服务端生成的一串字符串&#xff0c;以作客户端进行请求的一…

49.仿简道云公式函数实战-文本函数-Ip

1. Ip函数 获取当前用户的ip地址 注意是Ipv4的地址 2. 函数用法 IP() 3. 函数示例 获取当前用户的ip地址IP() 4. 代码实战 首先我们在function包下创建text包&#xff0c;在text包下创建IpFunction类&#xff0c;代码如下&#xff1a; package com.ql.util.express.sel…

python 基础知识点(蓝桥杯python科目个人复习计划51)

今日复习计划&#xff1a;做复习题 例题1&#xff1a;大石头的搬运工 问题描述&#xff1a; 在一款名为“大石头的搬运工”的游戏中&#xff0c;玩家需要 操作一排n堆石头&#xff0c;进行n - 1轮游戏。 每一轮&#xff0c;玩家可以选择一堆石头&#xff0c;并将其移动到任…

Doris——荔枝微课统一实时数仓建设实践

目录 一、业务介绍 二、早期架构及痛点 2.1 早期架构 2.2 架构痛点 三、技术选型 四、新的架构及方案 五、搭建经验 5.1 数据建模 5.2 数据开发 5.3 库表设计 5.4 数据管理 5.4.1 监控告警 5.4.2 数据备份与恢复 六、收益总结 七、未来规划 原文大佬这篇Doris腾…

科技创新引领零售商品部降本增效的未来

随着科技的不断发展和应用&#xff0c;零售行业也迎来了前所未有的变革。在这个竞争激烈的市场中&#xff0c;零售商品部如何利用科技手段降低成本、提高效率成为了企业关注的焦点。让我们一起探讨一下科技创新如何引领零售商品部降本增效的未来。 首先&#xff0c;利用大数据…

算法--动态规划(线性DP、区间DP)

这里写目录标题 tip数组下标从0开始还是从1开始 数学三角形介绍算法思想例题代码 最长上升子序列介绍算法思想例题代码 最长公共子序列介绍算法思想例题代码 tip 数组下标从0开始还是从1开始 如果代码中涉及到数组下标为i-1&#xff08;有时候哪怕不是同一个数组也符合情况&am…

sql-labs第46关 order by盲注

sql-labs第46关 order by盲注 来到了第46关进入关卡发现让我们输入的参数为sort&#xff0c;我们输入?sort1尝试&#xff1a; 输入?sort2,3,发现表格按照顺序进行排列输出&#xff0c;明显是使用了order by相关的函数。 我们将参数变成1进行尝试&#xff0c;就会报错&…

uni-app原生api的promise化以解决异步等待问题分析

相信各位在进行uni-app开发的时候会遇到各种关于异步回调问题&#xff0c;例如要传code给后端以换取session_key&#xff0c;在这之前需要先调用 uni.login&#xff0c;所以执行的顺序是必须同步等待的。在写这篇文章之前对于整体的流程概念需要做一个梳理&#xff0c;以便能更…

Laravel03 路由到控制器与连接数据库

Laravel03 路由到控制器与连接数据库 1. 路由到控制器2. 连接数据库 1. 路由到控制器 如下图一些简单的逻辑处理可以放在web.php中&#xff0c;也就是路由的闭包函数里面。但是大的项目&#xff0c;我们肯定不能这么写。 为什么保证业务清晰好管理&#xff0c;都应该吧业务逻辑…

ubuntu20.04安装和使用 Maldet (Linux Malware Detect)

1、下载 Maldet sudo wget http://www.rfxn.com/downloads/maldetect-current.tar.gz 2、解压Maldet sudo tar -xvf maldetect-current.tar.gz 3、进入到Maldet目录&#xff0c;然后运行安装脚本 sudo ./install.sh 4、安装ClamAV sudo apt-get update sudo apt-get in…

卡诺图之间的运算(拓展应用)

文章目录 1.卡诺图运算的基本规律⑴卡诺图之间的或运算⑵卡诺图之间的与运算⑶卡诺图之间的异或和同或运算 2.利用卡诺图进行运算&#xff08;并化简&#xff09;3.特殊卡诺图与卡诺图模块化⑴异或逻辑函数的卡诺图⑵同或逻辑函数的卡诺图⑶卡诺图的模块化 4.可能的题型&#x…

使用 JMeter 生成测试数据对 MySQL 进行压力测试

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

3分钟看懂设计模式02:观察者模式

一、什么是观察者模式 观察者模式又叫做发布-订阅模式或者源-监视器模式。 结合它的各种别名大概就可以明白这种模式是做什么的。 其实就是观察与被观察&#xff0c;一个对象&#xff08;被观察者&#xff09;的状态改变会被通知到观察者&#xff0c;并根据通知产生各自的不…

二 线性代数-向量

1、向量的表示方法&#xff1a; 其中的 i、j、k是坐标轴方向的单位向量。 2、向量的模&#xff1a; 用坐标计算的方法&#xff1a; 3、向量的运算&#xff1a; 3.1 向量的加法减法&#xff1a; 3.2 向量的数乘&#xff1a; 拉格朗日乘数法的 基础 公式。 3.3 向量的数量积&a…

conda 导出/导出配置好的虚拟环境

一. 导出环境配置&#xff08;yml文件&#xff09; 1. 在主目录下激活虚拟环境&#xff08;UE4是我的虚拟环境名称&#xff0c;请根据你自己的名称进行修改&#xff09; conda activate UE4 2. 运行此代码 conda env export > environment.yml 二. 导入环境配置&#xf…

oracle官网下载早期jdk版本

Java Downloads | Oracle JDK Builds from Oracle 以上压缩版&#xff0c;以下安装版 Java Downloads | Oracle 该链接往下拉能看到jdk8和jdk11的安装版 -- end

每日一题 — 移动零

力扣链接&#xff1a;283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;利用双指针将数组分为三个区间&#xff0c;三个区间分别表示的是&#xff1a;非0元素、0、待处理元素 当arr[cur] ! 0时 [0,dest]区间就需要加一&#xff0c;所以dest 然后再交换a…

Java SpringBoot 获取 yml properties 自定义配置信息

Java SpringBoot 获取 yml properties 自定义配置信息 application.yml server:port: 9090servlet:context-path: /app第一种方法 HelloController package com.zhong.demo01.controller;import org.springframework.beans.factory.annotation.Value; import org.springfram…

Python字符串切片操作原来这么简单!

字符串切片是Python中用于从字符串中提取子串的强大工具。通过指定开始和结束下标&#xff0c;以及可选的步长参数&#xff0c;可以轻松地截取字符串的一部分。 1.字符串切片原理 从字符串中复制指定的一段代码&#xff0c;生成一个新的字符串 2.字符串切片语法 字符串[开始…

2018-02-14 新闻内容爬虫【上学时做论文自己爬新闻数据,原谅我自己懒发的图片】

2018-02-14新闻内容爬虫【上学时做论文自己爬新闻数据&#xff0c;原谅我自己懒发的图片】资源-CSDN文库https://download.csdn.net/download/liuzhuchen/88878591爬虫过的站点&#xff1a; 1QQ新闻 1&#xff0c;准备爬取滚动新闻页面 2 通过F12 开发工具查找发现&#xff…