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

news2024/11/17 11:30:50

目录

一、界面框架

二、首页(未登录)

三、验证码登录

四、密码登录

五、帐号注册

六、忘记密码


 本项目的交流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.coloradmin.cn/o/1658194.html

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

相关文章

压缩归档库-Snappy介绍

1.简介 Snappy 是一个 C 编写的压缩和解压缩库,由 Google 开发。它专为速度而设计,而不是最大压缩率或与其他压缩库的兼容性。 Snappy 通常用于需要快速压缩和解压缩的场景。 Snappy具有以下属性: 快速:压缩速度达到250 MB/秒及…

AMCA乙二胺,可发出蓝色荧光具有较好的反应活性和稳定性

基本信息: 中文名:AMCA乙二胺 英文名:AMCA Ethylenediamine 分子量:503.35 外观:无色至浅黄色固体/粉末 规格:10mg、25mg、50mg(同时可提供mg级以及kg级的产品开发服务) 纯度&…

数智结合,智慧合同让法务管理发挥内在价值

在当今这个信息化、数字化飞速发展的时代,数据已成为企业重要的战略资源。法务管理作为企业内部控制和风险防范的重要环节,其重要性不言而喻。然而,传统的法务管理模式往往存在效率低下、信息孤岛、反应迟缓等问题。在这样的背景下&#xff0…

在Ubuntu安装RPM文件

Ubuntu软件源包含数千个deb软件包,可以从Ubuntu软件中心或使用apt命令行安装。 Deb是所有基于Debian的Linux发行版,例如包括Ubuntu,Linux mint等发行版使用的安装包格式。 如果某些软件在Ubuntu软件源中不可用,可以通过启用适当的…

为什么智慧校园是校园信息化发展的必然趋势

怎么从数字化学校的服务形式和运维办理上进行建造,如何为高校供给快捷、高效、有用的运维服务是数字化学校完成“才智”的重要目标,也是学校提高教育的必然趋势。 首先,智能可视化办理,可视化是数字化学校发展的必然趋势。可视化即…

软件系统工程建设全套资料(交付清单)

软件全套精华资料包清单部分文件列表: 工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单,用户需求说明书,概要设计说明书&#xff0c…

子查询之一(单行子查询, 多行子查询)

1. 子查询 子查询是指一个查询语句嵌套在另一个查询语句内部的查询.这个特性在MySQL4.1开始引入. SQL中子查询的使用大大增强了SELECT查询的能力.因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得到一个数据结果,然后与这个数据结…

基于51单片机锅炉水位-温度-压力检测控制系统proteus仿真设计

基于51单片机锅炉监控系统仿真设计( proteus仿真程序原理图报告讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0056 1.主要功能: 基于51单片机AT89C51/52(与…

ESP-WROOM-32配置Arduino IDE开发环境

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、下载Arduino IDE二、安装工具集三、测试样例1.选则开发板2.连接开发板3.示例程序 四、使用官方示例程序总结 前言 之前用了很多注入STM32、树莓派Pico和Ar…

车载测试系列:车载测试流程

车载测试流程是保证软件质量的重要支撑,优秀的团队都必须拥有规范的流程体系支撑,它能够约束测试人员的测试行为,约束测试环境的测试精度,提升测试的覆盖度,保证团队成员工作的协调性。 该测试流程建立的依据&#xf…

三.Django--ORM(操作数据库)

目录 1 什么是ORM 1.1 ORM优势 1.2ORM 劣势 1.3 ORM与数据库的关系 2 ORM 2.1 作用 2.2 连接数据库 2.3 表操作--设置字段 2.4 数据库的迁移 写路由增删改查操作 项目里的urls.py: app里的views.py: 注意点: 1 什么是ORM ORM中文---对象-关系映射 在MTV,MVC设计…

每日Attention学习3——Cross-level Feature Fusion

模块出处 [link] [code] [PR 23] Cross-level Feature Aggregation Network for Polyp Segmentation 模块名称 Cross-level Feature Fusion (CFF) 模块作用 双级特征融合 模块结构 模块代码 import torch import torch.nn as nnclass BasicConv2d(nn.Module):def __init__(…

day1_slidingWindow

一、滑动窗口模板 // 注意:java 代码由 chatGPT🤖 根据我的 cpp 代码翻译,旨在帮助不同背景的读者理解算法逻辑。 // 本代码不保证正确性,仅供参考。如有疑惑,可以参照我写的 cpp 代码对比查看。import java.util.Has…

Mac YOLO V9推理测试

环境: Mac M1 (MacOS Sonoma 14.3.1) Python 3.11PyTorch 2.1.2 一、准备工作 工程及模型下载:​​​​​​​https://github.com/WongKinYiu/yolov9 git clone https://github.com/WongKinYiu/yolov9.git 克隆后安装相关依赖(没啥依赖好装…

轮廓提取、矩形标记时,点的位置需要重标

在下图中的0,3,1,2位置如何变换成0,1,2,3 先显示结果: 变换之后图: 这边提供两种解决方案: 第一种:将坐标值相加求和,采用冒泡排序实现从小到大…

基于51单片机可调幅度频率波形信号发生器

基于51单片机可调幅度频率信号发生器( proteus仿真程序原理图报告讲解视频) 1.主要功能: 基于51单片机的三角波信号发生器 1、幅值在0-5V可以通过按键调整,频率在0-50Hz,可以通过按键调整 2、通过LCD1602显示幅值和频率 3、使用示波器查…

postman介绍、安装、使用、功能特点、注意事项

Postman是一款流行的API开发工具,它提供了丰富的功能,包括创建、测试、调试和文档化API。本文将介绍Postman的安装、使用方法,以及其功能特点和注意事项。 1. 介绍 Postman是一款用于构建、测试和调试API的工具,它提供了用户友好的…

2. Linux 基本指令(上)|ls|pwd|cd|tree|touch|mkdir|rmdir|rm

前言 计算机软硬件体系结构 层状结构应用软件Word,Matlab操作系统Windows,Linux设备驱动声卡驱动硬件CPU,内存,磁盘,显示器,键盘 操作系统概念 操作系统 是一款进行软硬件资源管理的软件 例子 比如在学…

Q1保健品线上市场分析(三):牛初乳市场扩张,同比去年增长54%

近几年,牛初乳在多项科学研究支撑下,其卓越的“肠道免疫力”正得到越来越多的挖掘、验证和商业化尝试。因此,随着人们对健康饮食的重视,牛初乳产品的需求量也在逐年增加,市场潜力巨大。 根据鲸参谋数据显示&#xff0…

AI 资料汇总专栏

包含AI资料、大模型资料、AI最新行业发展 人工智能(Artificial Intelligence,简称AI)是一门研究如何使计算机能够具备智能行为的科学与技术。它致力于开发出能够像人类一样思考、学习、理解和决策的计算机系统。自20世纪50年代以来&#xff…