物联网实战--平台篇之(五)账户界面

目录

一、界面框架

二、首页(未登录)

三、验证码登录

四、密码登录

五、帐号注册

六、忘记密码


 本项目的交流QQ群:701889554

物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html

物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html

本项目资源文件https://download.csdn.net/download/ypp240124016/89280540

一、界面框架

        从结构上看,页面内容会比较多,整体上分为两部分,一是登录页面,二是控制中心页面。现阶段是设计帐号登录相关的页面,如上图所示的绿色字体部分;控制中心页面分为首页、设备、消息和我的四部分,APP打开后首先进入首页,首页有两种状态,未登录状态和已登录状态,如果之前没登录过或者退出了,那么就进入未登录状态,需要引导用户登录;控制中心具体的放在后面来讲,现在分析下登录页面的流程。

        打开后,首先展示的是未登录首页,页面中间有“前往登录”按钮,点击后会跳转到验证码登录页面,该页面有“密码登录”按钮,点击后会跳转到密码登录页面,此页面有两个文字按钮,分别是“账号注册”和“忘记密码”按钮。至此,登录相关界面就全了,在返回过程中如上图蓝色指示线所示,密码登录返回验证码登录,最后返回首页。以下是具体软件的录屏视频。

APP界面设计

        下图是工程项目的界面目录结构,其中大部分是以SwipeView切换界面为主,实现不同页面之间的跳转。

        以下是主页面的QML前端代码,核心是放着CenterSwipeView控制中心和LoginSwipeView登录页面,这里面有部分是捕捉安卓手机返回键的代码Keys.onPressed,逻辑是快速点击返回键几下就可以退出APP了。

import QtQuick 2.7
import QtQuick.Controls 2.0
import "base"
//主页面,可以在控制中心和登录页面之间切换

SwipeView {
    
    
    id:id_mainSwipeView
    anchors.fill: parent
    
    interactive: false//禁用手滑切换
    currentIndex: 0
     
    MsgDialog01 
    {
        id:id_msgDialog
    }
    property var pressTime: 0
    Timer {
              interval: 500; running: true; repeat: true
              onTriggered: 
              {
                    if(pressTime>0)
                    {
                        pressTime--
                    }
              }
    }
    Keys.onPressed: 
    {
        if(event.key === Qt.Key_Back)
        {
            console.log("login Key_Back!")
            if(pressTime>0)
            {
                console.log("app quit!")
                Qt.quit()
            }
            else
            {
                pressTime=2
                event.accepted = true;
                id_msgDialog.funOpen("再按一次退出!")                
            }

        }
    }
    
    CenterSwipeView //控制中心界面
    {
        id:id_centerSwipeView
    }
    
    LoginSwipeView  //登录界面
    {
        id:id_loginSwipeView
        onSiqLoginBackLevel1://登录界面返回按钮
        {
            id_mainSwipeView.currentIndex=0
        }
    }
    
    Component.onCompleted: 
    {

    }
    
    Connections
    {
        target: theAccountMan
        onSiqSetLoginState:
        {
            console.log("set login state=", state)
            if(state>0)//登录成功
            {
                id_mainSwipeView.currentIndex=0
            }
            else//去登录
            {
                id_mainSwipeView.currentIndex=1
            }
        }
        onSiqShowMsg:
        {
            id_msgDialog.funOpen(msg)
        }
    }
    

    function funSetFocus()
    {
        focus=true
    }
    
}

二、首页(未登录)

        这是未登录的首页页面,第一次打开APP便是这个页面,目的是引导用户注册和登录,布局也相对简洁,LOGO+设备背景图+按钮,点击前往登录 按钮就能进入下一个页面,下面是具体代码。两者结合起来看,其实QML代码也是非常简单的,核心作用还是布局。代码里有三个注意点,一个是使用Gradient产生渐变色,这样背景比较不会单调;二是开头import "../base"引入了base文件夹,里面放着一些常用的、定制化的基础模块,比如这里的BaseButton02,就是圆角按钮;三是在BaseButton02内部的前后端交互接口theAccountMan,这个是在C++主程序里定义的。

import QtQuick 2.7
import QtQuick.Controls 2.0
import "../base"

//未登录home画面

Rectangle {
    
    
    anchors.fill: parent
    
    gradient: Gradient {
            GradientStop { position: 0.0; color: "#CFD5E6" }
            GradientStop { position: 1.0; color: "#F5F6F8" }
        }
    
    //LOGO
    Image
    {
        id: id_logoImg
        width: height
        height: 40
        mipmap: true
        anchors
        {
            left:parent.left
            leftMargin:width*0.3
            top:parent.top
            topMargin:height*0.2
        }
        source: "qrc:/mainImgRC/images/logo.png"
    }
    Label{
        id:id_headLabel
        height: id_logoImg.height
        width: height*4
        anchors
        {
            verticalCenter:id_logoImg.verticalCenter
            left:id_logoImg.right
            leftMargin:10
        }
        verticalAlignment: Text.AlignVCenter
        horizontalAlignment: Text.AlignLeft
        font.pointSize: height*0.40
        font.family:"宋体"
        color: "black"
        text:"端点物联M2M Lite"
    }
    
    Label{
        id:id_myDevLabel
        height: id_logoImg.height
        width: height*4
        anchors
        {
            bottom:id_centerRect.top
            bottomMargin:5
            left:id_centerRect.left
            leftMargin:10
        }
        verticalAlignment: Text.AlignVCenter
        horizontalAlignment: Text.AlignLeft
        font.pointSize: height*0.45
        font.family:"宋体"
        color: "black"
        text:"我的设备"
    }
    
    Rectangle //中心登录空白矩形
    {
        id:id_centerRect
        
        width:parent.width*0.9
        
        radius:10
        anchors
        {
            top:id_logoImg.bottom
            topMargin:id_logoImg.height*2
            horizontalCenter:parent.horizontalCenter
            bottom:parent.bottom
            bottomMargin:20
        }
        
        Image //冰箱等智能家居设备图片
        {
            id: id_devicesImg
            width: parent.width*0.8
            height: width/1.6
            mipmap: true
            anchors
            {
                horizontalCenter:parent.horizontalCenter
                top:parent.top
                topMargin:parent.height*0.08
            }
            source: "qrc:/mainImgRC/images/home/home_devices.png"
        }
        
        
        BaseButton02
        {
            height: 50
            width: 150
            buttonText: "前往登录"
            anchors
            {
                horizontalCenter:parent.horizontalCenter
                bottom:parent.bottom
                bottomMargin:height*3
            }
            onSiqClickedLeft: 
            {
                theAccountMan.setLoginState(0)
            }
        }
    }
    
    

}

三、验证码登录

        

import QtQuick 2.7
import QtQuick.Controls 2.0
import "../base"

//验证码登录界面

Rectangle {
    signal siqLoginBackLevel0()
    signal siqGotoPasswdLogin()
    MsgDialog01
    {
        id:id_msgDialog
    }
    
    Keys.onPressed: 
    {
        if(event.key === Qt.Key_Back)
        {
            console.log("phone Key_Back!")
            event.accepted = true;
            siqLoginBackLevel0()
        }
    }
    
    ImageButton01//返回按钮
    {
        source: "qrc:/mainImgRC/images/login/back.png"
        
        anchors
        {
            left:parent.left
            leftMargin:20
            top:parent.top
            topMargin:20            
        }
        onSiqClickedLeft: 
        {
            siqLoginBackLevel0()
        }
    }
    
    HeadView
    {
        id:id_headView
        textValue: "手机验证码登录"
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:parent.top
            topMargin:80
        }
    }
    
    BaseText01
    {
        id:id_phoneText
        height: 50
        width: parent.width*0.8
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_headView.bottom
            topMargin:30
        }
        placeholderText: "请输入手机号"
        maximumLength: 11
    }
    
    VerCodeView//验证码模块
    {
        id:id_verCodeView
        height: id_phoneText.height
        agreeCheckState: id_userAgreement.checkState
        phoneNumber: id_phoneText.text
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_phoneText.bottom
            topMargin:10
        }
    }
    
    BaseButton02
    {
        id:id_loginButton
        height: id_phoneText.height
        width: id_phoneText.width
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_verCodeView.bottom
            topMargin:10
        }
        buttonText: "登录"
        
        onSiqClickedLeft: 
        {
            if(id_userAgreement.checkState==0)
            {
                id_msgDialog.funOpen("请先同意用户协议!")
                return
            }
            var ok=theAccountMan.isPhoneNumber(id_phoneText.text)
            if(!ok)
            {
                id_msgDialog.funOpen("请输入正确的手机号!")
                return
            }
            ok=theAccountMan.isNumber(id_verCodeView.verCode)
            if(ok!==4)
            {
                id_msgDialog.funOpen("请输入正确的验证码!")
                return
            }
            theAccountMan.requestLoginByVerCode(id_phoneText.text, id_verCodeView.verCode)
        }
    }
    
    UserAgreement//隐私政策
    {
        id:id_userAgreement
        anchors
        {
            left:id_phoneText.left
            top:id_loginButton.bottom
            topMargin:10
        }
    }
    
    BaseButton02
    {
        id:id_switchButton
        height: id_phoneText.height
        width: id_phoneText.width
        
        releaseColor: "#F0F0F0"
        pressedColor: "#E0E0E0"
        buttonColor:"#505050"
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_userAgreement.bottom
            topMargin:30
        }
        buttonText: "密码登录>>"
        
        onSiqClickedLeft: 
        {
            siqGotoPasswdLogin()
        }
    }
    
}

        这个页面几乎是用的base里的页面模块,HeadView是LOGO+标题模块,内容可以更改;BaseText01是文字输入模块,用户名、密码什么的都是用的这个模块;VerCodeView是验证码模块,包含了文字输入模块和按钮模块;还有个隐私政策模块UserAgreement,这在跟账户操作上都需要用到的模块,包括注册、登录、改密码等等;最后,还有个返回按钮ImageButton01,点击后返回到首页,与捕捉返回键的功能一样。在页面底部,有个按钮模块,是切换到账户密码登录方式用的,从这里也可以看出,现在主流的APP都是默认提倡直接手机登录的,对C端用户比较友好便捷。

四、密码登录

import QtQuick 2.7
import QtQuick.Controls 2.0
import "../base"
//账号密码登录页面
//还有注册和忘记密码两个切换页面
    
SwipeView {
    signal siqPasswdBackLevel0()
    
    id:id_passwdSwipeView
    interactive: false//禁用手滑切换
    MsgDialog01
    {
        id:id_msgDialog
    }
    Keys.onPressed: 
    {
        if(event.key === Qt.Key_Back)
        {
            console.log("passwd Key_Back!")
            event.accepted = true;
            siqPasswdBackLevel0()
        }
    }
    Rectangle{ //账号密码登录页面
        ImageButton01//返回到验证码登录页面
        {
            id:id_backButton
            source: "qrc:/mainImgRC/images/login/back.png"
            anchors
            {
                left:parent.left
                leftMargin:20
                top:parent.top
                topMargin:20
            }
            onSiqClickedLeft: 
            {
                siqPasswdBackLevel0()
            }
        }
        HeadView
        {
            id:id_headView
            textValue: "密码登录"
            anchors
            {
                horizontalCenter:parent.horizontalCenter
                top:parent.top
                topMargin:60
            }
        }
        
        BaseText01//账户
        {
            id:id_accountText
            height: 50
            width: parent.width*0.8
            anchors
            {
                horizontalCenter:parent.horizontalCenter
                top:id_headView.bottom
                topMargin:30
            }
            placeholderText: "用户名/手机号"
            maximumLength: 30
        }
        BaseText01//密码
        { 
            id:id_passwdText
            height: id_accountText.height
            width: id_accountText.width
            anchors
            {
                horizontalCenter:parent.horizontalCenter
                top:id_accountText.bottom
                topMargin:10
            }
            placeholderText: "密码"
            maximumLength: 30
            echoMode: TextInput.Password//密码模式
        }
        
        UserAgreement//隐私政策
        {
            id:id_userAgreement
            anchors
            {
                left:id_passwdText.left
                top:id_passwdText.bottom
                topMargin:10
            }
        }
        
        BaseButton02//登录按钮
        {
            id:id_loginButton
            height: id_passwdText.height
            width: id_passwdText.width
            anchors
            {
                horizontalCenter:parent.horizontalCenter
                top:id_userAgreement.bottom
                topMargin:10
            }
            buttonText: "登录"
            
            onSiqClickedLeft: 
            {
                if(id_userAgreement.checkState==0)
                {
                    id_msgDialog.funOpen("请先同意用户协议!")
                    return
                }
                theAccountMan.requestLogin(id_accountText.text, id_passwdText.text, 1)
            }
        }
        
        Rectangle{  //注册+忘记密码  行
            
            width: parent.width*0.55
            height: 40
            anchors
            {
                horizontalCenter:parent.horizontalCenter
                top:id_loginButton.bottom
                topMargin:30
            }
            TextButton01{
                id:id_regText
                textValue: "注册"
                textColor: "#303030"
                
                anchors
                {
                    verticalCenter:parent.verticalCenter
                    left:parent.left
                }
                onSiqClickedLeft: 
                {
                    id_passwdSwipeView.currentIndex=1//跳转页面
                }
            }
            TextButton01{
                id:id_forgetText
                textValue: "忘记密码"
                textColor: "#303030"
                
                anchors
                {
                    verticalCenter:parent.verticalCenter
                    right:parent.right
                }
                onSiqClickedLeft: 
                {
                    id_passwdSwipeView.currentIndex=2//跳转页面
                }
            }
        }

    }
    
    RegView //账号注册
    {
        
        onSiqGoBackLevel0:
        { 
            id_passwdSwipeView.currentIndex=0
        }
    }
    
    ForgetView  //忘记密码
    {
        onSiqGoBackLevel0:
        { 
            id_passwdSwipeView.currentIndex=0
        }
    }
    
}
    
   




因为有注册和忘记密码两个页面需要切换,所以开头需要使用SwipeView,把密码登录页面收缩起来就是下图的样子,本质上就是3个页面进行切换。密码登录页面跟验证码登录类似,就是内容上有些差异,其中的TextButton01是文字按钮,注册和忘记密码靠这个按钮进行切换的。

五、帐号注册

import QtQuick 2.7
import QtQuick.Controls 2.0
import "../base"

//注册帐号页面

Rectangle {
    signal siqGoBackLevel0() 
    MsgDialog01 
    {
        id:id_msgDialog
    }
    
    Keys.onPressed: 
    {
        if(event.key === Qt.Key_Back)
        {
            console.log("reg Key_Back!")
            event.accepted = true;
            siqGoBackLevel0()
        }
    }
    
    ImageButton01
    {
        source: "qrc:/mainImgRC/images/login/back.png"
        
        anchors
        {
            left:parent.left
            leftMargin:20
            top:parent.top
            topMargin:20            
        }
        onSiqClickedLeft: 
        {
            siqGoBackLevel0()
        }
    }
    
    HeadView 
    {
        id:id_headView
        textValue: "帐号注册"
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:parent.top
            topMargin:60
        }
    }
    BaseText01
    { 
        id:id_accountText
        height: 50
        width: parent.width*0.8
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_headView.bottom
            topMargin:30
        }
        placeholderText: "请输入用户名"
        maximumLength: 30
    }
    
    BaseText01//密码
    {
        id:id_passwdText
        height: id_accountText.height
        width: id_accountText.width
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_accountText.bottom
            topMargin:10
        }
        placeholderText: "输入密码"
        maximumLength: 30
        echoMode: TextInput.Password//密码模式
    }
    
    BaseText01//确认密码
    {
        id:id_confirmText
        height: id_accountText.height
        width: id_accountText.width
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_passwdText.bottom
            topMargin:10
        }
        placeholderText: "确认密码"
        maximumLength: 30
        echoMode: TextInput.Password//密码模式
    }
    
    BaseText01
    {
        id:id_phoneText
        height: 50
        width: parent.width*0.8
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_confirmText.bottom
            topMargin:10
        }
        placeholderText: "请输入手机号"
        maximumLength: 11
    }
    
    VerCodeView//验证码模块
    {
        id:id_verCodeView
        height: id_phoneText.height
        agreeCheckState: id_userAgreement.checkState
        phoneNumber: id_phoneText.text
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_phoneText.bottom
            topMargin:10
        }
    }
    
    UserAgreement//隐私政策
    {
        id:id_userAgreement
        anchors
        {
            left:id_verCodeView.left
            top:id_verCodeView.bottom
            topMargin:10
        }
    }
    
    BaseButton02//注册按钮
    {
        id:id_loginButton
        height: id_passwdText.height
        width: id_passwdText.width
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_userAgreement.bottom
            topMargin:10
        }
        buttonText: "立即注册"
        
        onSiqClickedLeft: 
        {
            if(id_userAgreement.checkState==0)
            {
                id_msgDialog.funOpen("请先同意用户协议!")
                return
            }
            var result=theAccountMan.checkAccount(id_accountText.text)
            if(result===1)
            {
                id_msgDialog.funOpen("账户名长度不能小于5!")
                return
            }
            else if(result===2)
            {
                id_msgDialog.funOpen("不能以admin作为账户名!")
                return
            }
            else if(result===3)
            {
                id_msgDialog.funOpen("不能纯数字作为账户名!")
                return
            }
            result=theAccountMan.checkPasswd(id_passwdText.text)
            if(result===1)
            {
                id_msgDialog.funOpen("密码长度要大于8!")
                return 
            }
            if(id_passwdText.text!==id_confirmText.text)
            {
                id_msgDialog.funOpen("两次密码不一致!")
                return
            }   
            var ok=theAccountMan.isPhoneNumber(id_phoneText.text)
            if(!ok)
            {
                id_msgDialog.funOpen("请输入正确的手机号!")
                return
            }
            ok=theAccountMan.isNumber(id_verCodeView.verCode)
            if(ok!==4)
            {
                id_msgDialog.funOpen("请输入正确的验证码!")
                return
            }
            
            theAccountMan.requestReg(id_accountText.text, id_passwdText.text, id_phoneText.text, id_verCodeView.verCode, )
        }
    }
    
}

帐号注册内容比较多,但是基本就是那几个基础模块的组合了,没什么特殊的东西。基本逻辑是用手机验证码的形式注册新账户。

六、忘记密码

        

import QtQuick 2.7
import QtQuick.Controls 2.0
import "../base"

//忘记密码页面

Rectangle {
    signal siqGoBackLevel0() 
    MsgDialog01 
    {
        id:id_msgDialog
    }
    Keys.onPressed: 
    {
        if(event.key === Qt.Key_Back)
        {
            console.log("forget Key_Back!")
            event.accepted = true;
            siqGoBackLevel0()
        }
    }
    ImageButton01
    {
        source: "qrc:/mainImgRC/images/login/back.png"
        
        anchors
        {
            left:parent.left
            leftMargin:20
            top:parent.top
            topMargin:20            
        }
        onSiqClickedLeft: 
        {
            siqGoBackLevel0()
        }
    }
    
    HeadView 
    {
        id:id_headView
        textValue: "重置密码"
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:parent.top
            topMargin:60
        }
    }
    BaseText01
    { 
        id:id_accountText
        height: 50
        width: parent.width*0.8
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_headView.bottom
            topMargin:30
        }
        placeholderText: "请输入用户名"
        maximumLength: 30
    }
    
    BaseText01//密码
    {
        id:id_passwdText
        height: id_accountText.height
        width: id_accountText.width
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_accountText.bottom
            topMargin:10
        }
        placeholderText: "输入密码"
        maximumLength: 30
        echoMode: TextInput.Password//密码模式
    }
    
    BaseText01//确认密码
    {
        id:id_confirmText
        height: id_accountText.height
        width: id_accountText.width
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_passwdText.bottom
            topMargin:10
        }
        placeholderText: "确认密码"
        maximumLength: 30
        echoMode: TextInput.Password//密码模式
    }
    
    BaseText01
    {
        id:id_phoneText
        height: 50
        width: parent.width*0.8
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_confirmText.bottom
            topMargin:10
        }
        placeholderText: "请输入手机号"
        maximumLength: 11
    }
    
    VerCodeView//验证码模块
    {
        id:id_verCodeView
        height: id_phoneText.height
        agreeCheckState: id_userAgreement.checkState
        phoneNumber: id_phoneText.text
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_phoneText.bottom
            topMargin:10
        }
    }
    
    UserAgreement//隐私政策
    {
        id:id_userAgreement
        anchors
        {
            left:id_verCodeView.left
            top:id_verCodeView.bottom
            topMargin:10
        }
    }
    
    BaseButton02//重置按钮
    {
        id:id_loginButton
        height: id_passwdText.height
        width: id_passwdText.width
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_userAgreement.bottom
            topMargin:10
        }
        buttonText: "立即重置"
        
        onSiqClickedLeft: 
        {
            if(id_userAgreement.checkState==0)
            {
                id_msgDialog.funOpen("请先同意用户协议!")
                return
            }
            var result=theAccountMan.checkAccount(id_accountText.text)
            if(result===1)
            {
                id_msgDialog.funOpen("账户名长度不能小于5!")
                return
            }
            else if(result===2)
            {
                id_msgDialog.funOpen("不能以admin作为账户名!")
                return
            }
            result=theAccountMan.checkPasswd(id_passwdText.text)
            if(result===1)
            {
                id_msgDialog.funOpen("密码长度要大于8!")
                return 
            }
            if(id_passwdText.text!==id_confirmText.text)
            {
                id_msgDialog.funOpen("两次密码不一致!")
                return
            }   
            var ok=theAccountMan.isPhoneNumber(id_phoneText.text)
            if(!ok)
            {
                id_msgDialog.funOpen("请输入正确的手机号!")
                return
            }
            ok=theAccountMan.isNumber(id_verCodeView.verCode)
            if(ok!==4)
            {
                id_msgDialog.funOpen("请输入正确的验证码!")
                return
            }
            
            theAccountMan.requestResetPasswd(id_accountText.text, id_passwdText.text, id_phoneText.text, id_verCodeView.verCode)
        }
    }
    
}

        与账户注册类似,也需要手机验证码进行身份确认。

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

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

相关文章

10. Django Auth认证系统

10. Auth认证系统 Django除了内置的Admin后台系统之外, 还内置了Auth认证系统. 整个Auth认证系统可分为三大部分: 用户信息, 用户权限和用户组, 在数据库中分别对应数据表auth_user, auth_permission和auth_group.10.1 内置User实现用户管理 用户管理是网站必备的功能之一, D…

远动通讯屏,组成和功能介绍

远动通讯屏,组成和功能介绍 远动通讯屏是基于电网安全建设而投入的远方监控厂站信息、远方切除电网负荷的设备;主经是由远动装置、通讯管理机、交换机、GPS对时装置、数字通道防雷器、模拟通道防雷器、屏柜及附件等设备组成。变电站远动通讯系统是指对广…

安装oh-my-zsh(命令行工具)

文章目录 一、安装zsh、git、wget二、安装运行脚本1、curl/wget下载2、手动下载 三、切换主题1、编辑配置文件2、切换主题 四、安装插件1、zsh-syntax-highlighting(高亮语法错误)2、zsh-autosuggestions(自动补全) 五、更多优化配…

顺序表的实现(迈入数据结构的大门)(2)

目录 顺序表的头插(SLPushFront) 此时:我们有两个思路(数组移位) 顺序表的头删(学会思维的变换)(SLPopFront) 顺序表的尾插(SLPushBack) 有尾插就有尾删 既然头与尾部的插入与删除都有,那必然少不了指定位置的插入删除 查找…

汽车之家,如何在“以旧换新”浪潮中大展拳脚?

北京车展刚刚落幕,两重利好正主导汽车市场持续升温:新能源渗透率首破50%,以及以旧换新详细政策进入落地期。 图源:中国政府网 在政策的有力指引下,汽车产业链的各个环节正经历着一场深刻的“连锁反应”。在以旧换新的…

\boldsymbol无法使用

检查是否导入了 unicode-math 宏包、 没有加粗效果 正常加粗了 2024-5-9-15点35分

(八)JSP教程——application对象

application对象是一个比较重要的对象,服务器在启动后就会产生这个application对象,所有连接到服务器的客户端application对象都是相同的,所有的客户端共享这个内置的application对象,直到服务器关闭为止。 可以使用application对…

【SpringBoot记录】自动配置原理(1):依赖管理

前言 我们都知道SpringBoot能快速创建Spring应用,其核心优势就在于自动配置功能,它通过一系列的约定和内置的配置来减少开发者手动配置的工作。下面通过最简单的案例分析SpringBoot的功能特性,了解自动配置原理。 SpringBoot简单案例 根据S…

Linux下的SPI通信

SPI通信 一. 1.SPI简介: SPI 是一种高速,全双工,同步串行总线。 SPI 有主从俩种模式通常由一个主设备和一个或者多个从设备组从。SPI不支持多主机。 SPI通信至少需要四根线,分别是 MISO(主设备数据输入,从设备输出),MOSI (主设数据输出从设备输入),SCLK(时钟信号),CS/SS…

leetcode尊享面试100题(549二叉树最长连续序列||,python)

题目不长,就是分析时间太久了。 思路使用dfs深度遍历,先想好这个函数返回什么,题目给出路径可以是子-父-子的路径,那么1-2-3可以,3-2-1也可以,那么考虑dfs返回两个值,对于当前节点node来说&…

BI赋能金融新质生产力,16家金融机构智能BI创新实践分享

2024年政府工作报告强调,要“大力发展科技金融、绿色金融、普惠金融、养老金融、数字金融”,同时“大力推进现代化产业体系建设,加快发展新质生产力”。对于金融行业而言,培育新质生产力是高质量发展的关键着力点。金融机构可以通…

vue项目启动后页面显示‘Cannot GET /’

1、npm run dev命令启动项目的时候没有报错,页面打开却提示 Cannot GET / 2.这个时候只需要找到config文件夹下面的index.js文件。把assetsPublicPath字符串的:‘./’修改成 ‘/’就行了。修改完之后记得关闭项目,然后重新启动。不然不会生效…

度小满——征信报告图建模

目录 背景介绍 发展趋势 技术演进 图在金融风控领域中的演进 度小满图机器学习技术体系 案例 征信报告介绍 征信报告图建模

postman接口测试中文汉化教程

想必同学们对于接口测试工具postman的使用并不陌生,以及最近大为流行的国产工具apifox。对于使用过的同学来说,两者区别以及优缺点很容易别展示出来,postman相比apifox来说更加轻量,但是apifox更加符合国人的使用习惯....中国人给…

Nest 快速上手 —— (三)中间件 / 异常过滤器

一、 中间件(Middleware) 1.特点 中间件是一个在路由处理程序之前被调用的函数。中间件函数可以访问请求和响应对象,以及应用程序请求-响应周期中的next()中间件函数。下一个中间件函数通常由一个名为next的变量表示。 中间件函数可以执行以…

车载测试系列:车载蓝牙测试(三)

HFP测试内容与测试方法 2.3 接听来电:测试手机来电时,能否从车载蓝牙设备和手机侧正常接听】拒接、通话是否正常。 1、预置条件:待测手机与车载车载设备处于连接状态 2、测试步骤: 1)用辅助测试机拨打待测手机&…

BetterMouse for Mac激活版:鼠标增强软件

BetterMouse for Mac是一款鼠标增强软件,旨在取代笨重的、侵入性的和耗费资源的鼠标驱动程序,如罗技选项。它功能丰富,重量轻,效率优化,而且完全隐私安全,试图满足你在MacOS上使用第三方鼠标的所有需求。 B…

新火种AI|AI让大家都变“土”了!

作者:一号 编辑:美美 AI不仅要把人变“土”,还要把人变多样。 这个世界,终究是变“土”了。 今年五一假期,一个名为“Remini”的AI修图APP火遍了全网。注意,是Remini,而不是Redmi&#xff0…

MySQL-集群1

一、为什么要用mysql集群?: mysql单体架构在企业中很少用,原因:①会形成单点故障,没有高可用的效果;②mysql本身是一个I/O能力比较差,并发能力比较差的应用服务,在较高规模的网络I/…

部署JVS服务出现上传文件不可用,问题原因排查。

事情的起因是这样的,部门经理让我部署一下JVS资源共享框架,项目的地址是在这里 项目资源地址 各位小伙伴们做好了,我要开始发车了,全新的“裂开之旅” 简单展示一下如何部署JVS文档 直达链接 撕裂要开始了 本来服务启动的好好…
最新文章