物联网实战--平台篇之(十)“我的“页面设计

news2024/11/17 5:25:09

目录

一、页面布局

二、头像

三、修改密码

四、重新登录


本项目的交流QQ群:701889554

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

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

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

一、页面布局

          

        

        以上几个图就是"我的"页面中几个主要页面,基本思路和流程是:首次登录或者退出状态时,可以点击头像区域进行引导登录操作;登录成功后,头像区域会显示图片、账户名和等级,中间3个彩色按钮是保留功能,可以添加自己的相关链接;底部列表有修改密码、联系人、子账户、软件更新和关于五个子模块,现阶段我们主要完成修改密码模块,其它的后续完善。

二、头像

        头像区域分为登录和退出两个状态,差别在于头像和文本,没有登录时候显示灰色头像和"点击登录"文本,登录后显示彩色头像和账户名称。其中,头像还进行了圆形裁剪,较为美观;裁剪的思想是用圆角矩形作为掩板,遮住图片多余部分,这其中用到了OpacityMask组件,需要GPU支持。

import QtQuick 2.7
import QtGraphicalEffects 1.0
Rectangle {
    property var levelValue: 0
    property var loginState: 1
    property var rowHeight: 35
    property var accountText: "admin"
    width: parent.width
    height: 180
    gradient: Gradient 
    {
            GradientStop { position: 0.0; color: "#CFD5E6" }
            GradientStop { position: 1.0; color: "#F5F6F8" }
        }
    
    //头像
    Rectangle{
        id:id_headRect
        width: height  
        height: parent.height*0.4
        anchors
        {
            left:parent.left
            leftMargin:parent.height*0.15
            top:parent.top
            topMargin:parent.height*0.15
        }
        color: "white"
        visible: false
        radius: height/2
        border.width: 1
        border.color: "black"
    }
    Image
    {
        id: id_headImg
        mipmap: true
        anchors.centerIn: parent
        visible: false
        smooth: true
        source: loginState ? "qrc:/mainImgRC/images/my/head1.png" : "qrc:/mainImgRC/images/my/head0.png"
    }
    OpacityMask {
        anchors.fill: id_headRect
        source: id_headImg
        maskSource: id_headRect
       }


    //账户名
    Text//账户文本
    {
        id:id_accountText;
        height: rowHeight
        width: parent.width*0.7
        anchors
        {
            top:id_headRect.top
            left:id_headRect.right
            leftMargin:rowHeight*0.3
        }
        font.pointSize: id_accountMouseArea.pressed ? height*0.5 : height*0.45
        font.family:Qt.platform.os === "windows" ? "宋体" : "黑体"
        font.bold:true
        text: loginState ? accountText : "点击登录"
        color: "black"
        verticalAlignment:Text.AlignVCenter
        horizontalAlignment: Text.AlignLeft
        MouseArea{
            id:id_accountMouseArea
            anchors.fill: parent
            enabled: !loginState
            onClicked: 
            {
                theAccountMan.setViewByLoginState(0)
            }
        }
    }
    Text//等级文本
    {
        id:id_levelText;
        height: rowHeight*0.8
        width: parent.width*0.7
        anchors
        {
            top:id_accountText.bottom
            left:id_accountText.left
        }
        font.pointSize: height*0.45
        font.family:Qt.platform.os === "windows" ? "宋体" : "黑体"
        text: "等级: "+levelValue
        color: "black"
        verticalAlignment:Text.AlignVCenter
        horizontalAlignment: Text.AlignLeft
    }
}

三、修改密码

        在账户管理章节有提到过,修改密码需要在登录后进行修改,所以放在了这里进行讲解,其整个流程跟注册、登录类似。首先由用户APP发起请求,携带参数是当前密码和新密码,具体请求代码如下:

void AccountMan::requestChangePwd(QString account, QString old_pwd, QString new_pwd)
{
    QJsonObject root_obj;
    QJsonDocument json_doc;

    root_obj.insert("cmd_type", "change_pwd");
    root_obj.insert("account", account);
    root_obj.insert("old_pwd", old_pwd);
    root_obj.insert("new_pwd", new_pwd);
    root_obj.insert("rand_num", m_randNum);
    root_obj.insert("mac", m_macStr);
    json_doc.setObject(root_obj);
    QByteArray msg_ba = json_doc.toJson(QJsonDocument::Indented);
    QString topic=makePubTopic("passwd");
    emit sigMqttPushMessage(topic, msg_ba);
}

服务器的解析代码如下,主要是检查合法性,以及确保正确更新。

  else if(cmd_type=="change_pwd")
    {
        QString new_pwd="";
        if(root_obj.contains("new_pwd"))//
        {
            QJsonValue value = root_obj.value("new_pwd");
            if(value.isString())
            {
                new_pwd=value.toString();
            }
        }
        QString old_pwd="";
        if(root_obj.contains("old_pwd"))//
        {
            QJsonValue value = root_obj.value("old_pwd");
            if(value.isString())
            {
                old_pwd=value.toString();
            }
        }
        if(old_pwd.size()<8 || new_pwd.size()<8)
        {
            ackChangePwdState(account, mac_str, rand_num, 1, "密码长度不足!");
            return;
        }
        AccountSqlite::AccountNodeStruct tag_account;
        tag_account.passWord="";
        m_accountSqlite->selectAccountByName(account, tag_account);
        if(!tag_account.passWord.isEmpty())
        {
            if(tag_account.passWord==old_pwd)//旧密码匹配
            {
                m_accountSqlite->updateAccountPassWord(account, new_pwd);//更新密码
                m_accountSqlite->selectAccountByName(account, tag_account);//重新获取密码
                if(tag_account.passWord==new_pwd)//新密码校验
                {
                    ackChangePwdState(account, mac_str, rand_num, 0, "密码修改成功!");
                    qDebug("set new pwd ok!");
                }
                else
                {
                    ackChangePwdState(account, mac_str, rand_num, 2, "数据库更新失败!");
                    qDebug("set new pwd failed!");
                }
            }
            else
            {
                ackChangePwdState(account, mac_str, rand_num, 3, "旧密码不匹配!");
                qDebug("tag_account.pass_word!=old_pwd");
            }
        }
        else
        {
            ackChangePwdState(account, mac_str, rand_num, 4, "账户不存在!");
            qDebug("tag_account.pass_word.isEmpty()");
        }
    }

void AccountThread::ackChangePwdState(QString account, QString mac_str, int rand_num, int result, QString ack_str)
{
    QJsonObject root_obj;
    QJsonDocument json_doc;
    root_obj.insert("cmd_type", "change_pwd");
    root_obj.insert("account", account);
    root_obj.insert("result", result);
    root_obj.insert("ack_str", ack_str);
    json_doc.setObject(root_obj);
    QByteArray msg_ba = json_doc.toJson(QJsonDocument::Indented);
    QString topic=makePubTopic(account, mac_str, rand_num, "passwd");
    emit sigMqttPushMessage(topic, msg_ba);
}

修改密码的前端页面代码如下,基本上延续了重置密码的样式。

import QtQuick 2.7
import QtQuick.Controls 2.0
import "../base"
import "../login"
//修改密码页面

Rectangle {
    signal siqGoBackLevel0() 
    property var accountName: "user"
    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
        }
        text:accountName
        readOnly: true
        maximumLength: 30
    }
    BaseText01//旧密码
    {
        id:id_oldText
        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_newText
        height: id_accountText.height
        width: id_accountText.width
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_oldText.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_newText.bottom
            topMargin:10
        }
        placeholderText: "确认密码"
        maximumLength: 30
        echoMode: TextInput.Password//密码模式
    }
    
    

    BaseButton02//修改按钮
    {
        id:id_loginButton
        height: id_newText.height
        width: id_newText.width
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:id_confirmText.bottom
            topMargin:10
        }
        buttonText: "立即修改"
        
        onSiqClickedLeft: 
        {

            var result=theAccountMan.checkPasswd(id_newText.text)
            if(result===1)
            {
                id_msgDialog.funOpen("密码长度要大于8!")
                return 
            }
            if(id_newText.text!==id_confirmText.text)
            {
                id_msgDialog.funOpen("两次密码不一致!")
                return
            }   
            theAccountMan.requestChangePwd(id_accountText.text, id_oldText.text, id_newText.text)
        }
    }
    
}

四、重新登录

        如果用户需要更改登录帐号,那么就得先退出当前帐号,所以在底部添加了 退出按钮,确认退出后首页和我的页面都会做相应切换,用于引导用户登录,前端通过调用下面函数达成切换效果的:

//根据登录状态切换页面
void AccountMan::setViewByLoginState(int state)
{
    qDebug("setViewByLoginState=%d", state);
    m_accountWork.login_state=state;
    if(state>0)//已登录
    {
        emit siqSetMainCurrView("main-center");
        emit siqSetHomeCurrView("home-logined");
    }
    else//未登录
    {
        m_accountWork.account.clear();
        m_accountWork.auth=0;
        m_accountWork.parent_account.clear();
        writeConfig();
        emit siqSetMainCurrView("main-login");
        emit siqSetHomeCurrView("home-quit");
    }
}

              

        至于页面中的联系人和子账户后续再完善,我们目前已经完成了账户、应用、分组的内容了,剩下一个重量级的内容就是设备了,总体来讲 设备才是核心,那么接下来的文章就开始切入了设备相关的了。

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

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

相关文章

【论文阅读】 YOLOv10: Real-Time End-to-End Object Detection

文章目录 AbstractIntroductionRelated WorkMethodologyConsistent Dual Assignments for NMS-free Training &#xff08;无NMS训练的一致性双重任务分配&#xff09;Holistic Efficiency-Accuracy Driven Model Design &#xff08;效率-精度驱动的整体模型设计&#xff09; …

如何在window中快速建立多个文件夹?

时隔多年&#xff0c;再次开始撰写文章&#xff0c;但是这次却是以设计师的身份 1. 几个基础快捷键先记一下&#xff0c;要不更高级的玩儿不转&#xff08;1&#xff09;快速打开资源管理器&#xff08;2&#xff09;快速建立新文件夹&#xff08;3&#xff09;快速修改文件文件…

作为 App 开发者会推荐安装的 Mac App

Xcode&#xff0c;作为 App 开发者&#xff0c;必须安装的工具。当然&#xff0c;有经验的开发者不会从 Mac App Store 下载&#xff0c;而是从网站下载&#xff0c;除了安装过程更可控&#xff0c;也方便多版本共存。此外&#xff0c;我不信任任何第三方下载方式&#xff1a; …

[LLM-Agents]浅析Agent工具使用框架:MM-ReAct

上文LLM-Agents]详解Agent中工具使用Workflow提到MM-ReAct框架&#xff0c;通过结合ChatGPT 与视觉专家模型来解决复杂的视觉理解任务的框架。通过设计文本提示&#xff08;prompt design&#xff09;&#xff0c;使得语言模型能够接受、关联和处理多模态信息&#xff0c;如图像…

网络安全技术心得体会

网络与信息安全技术心得体会 通过对网络安全这门课程的学习&#xff0c;我进一步了解了网络安全技术的相关知识。大致来说&#xff0c;所谓网络安全指的是对网络系统中各类软硬件和数据信息等提供保护屏障&#xff0c;确保数据信息不受到恶意侵入、窃取等破坏&#xff0c;保证…

FaceFusion源码框架解读

FaceFusion源码框架解读 我的视频讲解&#xff1a;FaceFusion入门教学 FaceFusion官网 FaceFusion是一款开源的AI换脸工具&#xff0c;一款非常好用的换脸工具&#xff0c;操作简单&#xff0c;上手容易。 Facefusion&#xff1a;GitHub - facefusion/facefusion: Next gene…

最新Adaptive特征融合策略,涨点又高效,想发表论文可以参考

自适应特征融合是一种非常高效的数据处理方法&#xff0c;它比传统的特征更能适应不同的数据和任务需求&#xff0c;也因此拥有广泛的应用前景&#xff0c;是深度学习领域的研究热点。 这种方法通过动态选择和整合来自不同层次或尺度的特征信息&#xff0c;不仅显著提升了模型…

USB抓包工具:bushound安装及使用

一、环境搭建 下载busbound6.01安装包&#xff0c;安装完成&#xff0c;重启电脑。 二、工具配置 按照下图配置工具&#xff1a; 使能自动识别新设备 2. 设置抓取数据的容量 三、抓包 回到capture选项卡&#xff0c;在页面的右下角有个run的按钮&#xff0c;点击使能&…

nacos-opera(k8s)安装问题解决

整理一些关于k8s部署nacos出现的一些恶心的问题 网上说其他说的更改数据库连接都未解决。 在用nacos-opera想安装高可用nacos时连接mysql数据库报错: 报错具体项: No DataSource set 具体就是说没找到数据源。 第一个 检查一下nacos连接数据库配置 : 第二个 检查一下数据库…

视频监控汇聚平台LntonCVS通过GB/T28181国标协议实现视频监控平台的级联方案

近年来&#xff0c;随着网络视频监控应用范围的拓展&#xff0c;越来越多的政府部门和跨区域行业单位对视频监控的需求已经不局限于本地联网监控。他们正在探索在原有的本地联网监控基础上&#xff0c;建设省级乃至全国范围内的跨区域监控联网&#xff0c;以全面打造数据共享平…

【Unity2D:C#Script】实现角色射击功能

一、创建子弹预制体 1. 创建子弹预制体 2. 调整图片大小、层级 二、为子弹添加碰撞体积 1. 添加Box Collider 2D、Rigidbody 2D组件 2. 锁定z轴 三、编辑敌人脚本 注&#xff1a;在以下代码中&#xff0c;只显示本章节新增的代码&#xff0c;省略原有的代码 1. 为敌人添加生…

安科瑞为河南省促进分布式光伏发电健康持续发展提供解决方案

1 光伏、储能运维市场分析 在光伏、储能行业飞速发展的同时&#xff0c;已建的光伏、风力发电站和储能系统的监控、运维管理项目的招标也非常多&#xff0c;2023年上半年&#xff0c;光伏电站开发企业运维招标规模28.6GW&#xff0c;同比增长204.3%&#xff0c;上述28.6GW招标…

抖店一件代发,从0到1操作全流程

我是王路飞。 先说明一点&#xff0c;新手不需要纠结抖店一件代发&#xff08;即无货源模式&#xff09;还能不能做的问题。 无货源只是前期帮助新手阶段的你进入到这个市场里来的一种方式&#xff0c;不是你长期做店的思路。 入门之后&#xff0c;基本就转型为有货源去玩了…

深度学习之基于暗通道算法+卷积神经网络图像去雾可视化系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在图像处理领域&#xff0c;图像去雾技术一直是一个重要的研究方向。由于雾霾等天气条件的影响…

vue项目中如何使用iconfont

导读&#xff1a;vue项目中引入iconfont的方式 iconfont 的三种使用方法 unicode 不常用Font class 像字体一样使用&#xff0c;默认黑色图标&#xff0c;无法修改颜色Symbol 支持多色图标&#xff0c;更灵活&#xff0c;推荐 一、unicode 略 二、Font class 方式一&#…

一般EI论文的格式是什么样的?

论文应该符合会议的提交要求和模板&#xff0c;包括页面格式、字体、字号、行距等。可以在特定会议的官方网站上找到详细的提交指南和模板。 EI会议论文的格式通常遵循以下基本结构&#xff1a; 标题和作者信息&#xff1a;论文标题应该简洁明了&#xff0c;能够准确概括您研究…

【金砖赛】基于docker搭链

一&#xff0e;基于docker搭建 启动并检查是否启动成功 #启动命令 sudo systemctl start docker#检查命令 sudo systemctl status docker修改权限 chomd 777 build_chain.sh 进行4节点联盟链搭建&#xff08;举例&#xff09; sudo ./build_chain.sh -d -l "127.0.0.1…

Java web应用性能分析之【高并发之缓存-多级缓存】

说到缓存&#xff0c;作为java开发第一时间想到的是不是上图所示的Redis&#xff0c;又或者是Guava Cache、Caffeine、EhCache这些&#xff1b;Redis作为分布式缓存、其他的可以作为本地缓存。但是作为一名资深开发人员&#xff0c;着眼的层面应该再提升一个级别&#xff0c;从…

云上聚智——移动云云服务器进行后端的搭建及部署

什么是移动云 移动云是指将移动设备和云计算技术相结合&#xff0c;为移动应用提供强大的计算和存储能力的服务模式。传统的移动应用通常在本地设备上进行计算和存储&#xff0c;而移动云将这些任务转移到云端进行处理。通过移动云&#xff0c;移动设备可以利用云端的高性能计算…