探索 Electron:构建用户友好的登录页面流程

Electron是一个开源的桌面应用程序开发框架,它允许开发者使用Web技术(如 HTML、CSS 和 JavaScript)构建跨平台的桌面应用程序,它的出现极大地简化了桌面应用程序的开发流程,让更多的开发者能够利用已有的 Web 开发技能来构建功能强大且跨平台的应用程序,这对于提升开发效率和应用程序的快速交付具有重要意义。

本文将带领您进入 Electron 的世界,探索如何通过其强大的功能和灵活的架构,为您的应用程序实现一个完善的用户登录流程,具体的框架搭建和基本配置这里就不再赘述了,可以参考我之前的文章:地址 ,里面的路由和组件库的配置,这里就不再赘述了!

目录

框架搭建

首页搭建

登录框搭建

跳转首页


框架搭建

这里就仿照一下新版QQ进行登录界面的内容进行编写:

首先我们来到主进程对用户的登录界面进行一个简单的处理,代码如下所示:

然后我们在App根组件中设置通配符选项,然后设置页面不可以进行文字复制:

<template><div class="container"><router-view></router-view></div>
</template><script setup lang="ts"></script><style lang="scss">
* {margin: 0;padding: 0;box-sizing: border-box;user-select: none; /* 禁止选择文本 */-webkit-user-select: none; /* Safari 和 Chrome 的兼容性 */-moz-user-select: none; /* Firefox 的兼容性 */-ms-user-select: none; /* IE 和 Edge 的兼容性 */
}
.container {width: 100%;height: 100%;
}
</style>

最终达到的效果如下所示:

然后这里我们需要用到element-plus组件库的内容,配置参考开局引出的链接即可,

首页搭建

然后这里我们借助elementPlus组件库中的icon图标设置登录页顶部右侧的一些小按钮,然后左侧设置一个通告栏的效果,在通过栏处我们通过axios拿到对应的接口数据:

let famousRemark = ref('') // 名言数据
// 获取名言数据
const getFamousRemark = () => {axios.get<any, any>('https://api.uomg.com/api/rand.qinghua').then((res) => {famousRemark.value = res.data.content})
}

在html代码中,我们拿到名言的接口数据,然后通过animationiteration函数设置每执行完一次动画效果之后,重新调用接口函数:

<div class="header"><div class="header-left"><div class="header-icon"><el-icon color="red"><VideoCamera /></el-icon></div><div class="header-text"><span @animationiteration="getFamousRemark">{{ famousRemark }}</span></div></div><div class="header-right"><div class="emplace" @click="handleEmplace"><el-icon :size="15"><Connection class="icon" /></el-icon></div><div class="close" @click="handleClose"><el-icon :size="15"><Close /></el-icon></div></div>
</div>

在首页这里我们也给出了一个背景图的效果,最终呈现的效果如下所示:

然后我们给头部右侧的图标设置一下点击事件,这里我们借助electron中的渲染进行的函数往主进程发送对应的信息,获取版本数据是主进程往渲染进程发数据,处理关闭事件是渲染进程往主进程发送数据,如下所示:

const { ipcRenderer } = require('electron')let versions = ref() // 版本数据
let dialogVisible = ref(false) // 弹窗
// 获取版本事件
const handleEmplace = async () => {const result = await ipcRenderer.invoke('getVersion')versions.value = resultdialogVisible.value = true
}
// 处理关闭事件
const handleClose = () => {ipcRenderer.send('close-main-window')
}

然后我们在主进程中开启渲染进程可以使用node模块的配置:

然后调用主进程的ipcMain函数进行数据的传递与接收:

// 获取版本数据
ipcMain.handle('getVersion', () => {const versions = {electron: process.versions.electron,node: process.versions.node,chrome: process.versions.chrome,  // 如果需要的话,也可以获取 Chrome 的版本};return versions;})
// 关闭窗口
ipcMain.on('close-main-window', (event) => {event.preventDefault()mainWindow.close()
})

最终呈现的效果如下所示:

登录框搭建

接下来借助elementPlus中的表单组件进行一个登录框页面的搭建,这里我把表单元素和底部的组件抽离出一个单独的组件进行设置:

<div class="content"><div class="content-title">MY QQ</div><div class="content-image"><img :src="avatar" alt="头像" /></div><div class="content-login"><LoginForm></LoginForm></div><div class="login-footer"><Footer></Footer></div>
</div>

页面搭建很简单,这里就不再一一赘述了,最终呈现的效果如下所示:

然后底部的组件的话,这里使用了一些小的svg增加了一点趣味性:

跳转首页

当我们要跳转的首页的时候,肯定要进行一个页面的大小的调整,不可能也是登录页的大小,所以我们在进入到首页的时候,页面加载完成时向主进程发送一个消息,通知主进程调整页面的大小:

onMounted(() => {ipcRenderer.invoke('home-window-size')
})

来到主进程,我们设置要调整的窗口大小已经设置其他初始化的时候页面的配置:

// 首页窗口大小
ipcMain.handle('home-window-size', () => {mainWindow.setSize(800, 600) // 设置窗口大小mainWindow.setMaximizable(true) // 允许最大化窗口mainWindow.center() // 居中窗口mainWindow.setResizable(true) // 允许窗口缩放, 默认是 false
})

然后这里我们再在首页设置一个跳转到登录页的按钮:

<template><div class="home"><div class="header">头部</div><div class="container"><div>登录界面</div><el-button type="primary" @click="goBack">跳转登录页</el-button></div></div>
</template><script setup lang="ts">
import { onMounted } from 'vue'
import { useRouter } from 'vue-router'
const { ipcRenderer } = require('electron')const router = useRouter()const goBack = () => {router.push('/')
}onMounted(() => {ipcRenderer.invoke('home-window-size')
})
</script>

在登录页面,我们在页面刚加载的时候也向主进程发送一个跳转窗口大小的指令:

onMounted(() => {ipcRenderer.invoke('login-window-size')
})

在主进程中也通样设置一下登录页面的窗口设置:

// 登录页窗口大小
ipcMain.handle('login-window-size', () => {mainWindow.setSize(320, 450) // 设置窗口大小mainWindow.setMinimizable(true) // 允许最小化窗口mainWindow.center() // 居中窗口mainWindow.setResizable(false) // 允许窗口缩放, 默认是 false
})

然后默认配置上,我们设置不可双击最大化,然后在具体需要最大化的地方再调用下面的函数即可,这里我们设置登录页不可最大化,然后首页可以:mainWindow.setMaximizable(true)

最终呈现的效果如下所示:

项目地址:地址。

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

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

相关文章

安防巡检机器人:守护安全的智能卫士

安防巡检机器人&#xff0c;作为机器人技术在安防领域的杰出应用&#xff0c;是一种集自主导航、智能巡检、环境监测、远程监控等多功能于一体的智能装备。这些机器人通过集成先进的传感器、高清摄像头、智能算法和导航系统等模块&#xff0c;实现了全天候、全方位、自主化的安…

maven项目容器化运行之3-优雅的利用Jenkins和maven使用docker插件调用远程docker构建服务并在1Panel中运行

一.背景 在《maven项目容器化运行之1》中&#xff0c;我们开启了1Panel环境中docker构建服务给到了局域网。在《maven项目容器化运行之2》中&#xff0c;我们基本实现了maven工程创建、远程调用docker构建镜像、在1Panel选择镜像运行容器三大步骤。 但是&#xff0c;存在一个问…

HDU1059——Dividing,HDU1060——Leftmost Digit,HDU1061——Rightmost Digit

目录 HDU1059——Dividing 题目描述 运行代码 代码思路 HDU1060——Leftmost Digit 题目描述 ​编辑​编辑 运行代码 代码思路 HDU1061——Rightmost Digit 题目描述 运行代码&#xff08;快速幂&#xff09; 代码思路 HDU1059——Dividing 题目描述 Problem - …

索引(数据库优化)事务

索引 事务 Spring事务管理 上图模拟的异常为运行时异常 加上这个配置之后如果回滚会显示下面异常信息 事务进阶

数模打怪(八)之图论模型

一、作图 图的数学语言描述&#xff1a; G( V(G), E(G) )&#xff0c;G&#xff08;graph&#xff09;&#xff1a;图&#xff0c;V&#xff08;vertex&#xff09;&#xff1a;顶点集&#xff0c;E&#xff08;edge&#xff09;&#xff1a;边集 1、在线作图 https://csac…

【单词搜索】python刷题记录

R2-回溯:DFS剪枝. class Solution:def exist(self, board: List[List[str]], word: str) -> bool:#回溯经典问题&#xff1a;DFS剪枝解决mlen(board)nlen(board[0])def dfs(i,j,k):#3种剪枝策略if not 0<i<m or not 0<j<n or board[i][j]!word[k]:return Falsei…

whaler_通过镜像导出dockerfile

1、Whaler简介 Whaler:从镜像导出Dockerfile&#xff0c;whaler英文释义捕鲸船。 2、下载安装 # wget -cO /usr/local/bin/whaler https://github.com/P3GLEG/Whaler/releases/download/1.0/Whaler_linux_amd64 3、赋予可执行权限 [rootlocalhost ~]# chmod x /usr/local/…

学习测试11-移动自动化(略)

安卓SDK 链接: https://pan.baidu.com/s/1P4v9K2RYAGEoA5M_93hHlQ?pwdqsbu 提取码: qsbu 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 记得配置环境变量 下载Appium软件 hub网址&#xff1a;https://github.com/appium/appium-desktop/releases 链接: https…

c++入门----类与对象(中)

OK呀&#xff0c;家人们承接上文&#xff0c;当大家看过鄙人的上一篇博客后&#xff0c;我相信大家对我们的c已经有一点印象了。那么我们现在趁热打铁再深入的学习c入门的一些知识。 类的默认成员函数 首先我们学习的是我们的默认函数。不知道大家刚读这个名词是什么反应。默认…

基于Shell脚本实现文件定时拷贝

需要开发一个需求&#xff0c;将服务器A的 批量数据文件 定时同步 到远程服务器B中&#xff0c;这里我们的基本思路为&#xff1a; 服务器A&#xff1a;存放数据文件服务器B&#xff1a;部署shell脚本&#xff0c;从服务器A中拉取文件至本地目录中。 注意&#xff1a;这里也可…

DDR3布线时候的经验总结

摆放BGA下面的滤波电容的时候注意不要让两个电容的电源和地对着头放&#xff0c;手工焊接时候容易短路 阻抗层必须是实心铜皮覆盖&#xff1a; &#xff08;3&#xff09;阻抗线一定要有阻抗参考层&#xff0c;一般以相邻的接地或电源层做参考层&#xff08;如顶层阻抗线&…

【React】详解classnames工具:优化类名控制的全面指南

文章目录 一、classnames的基本用法1. 什么是classnames&#xff1f;2. 安装classnames3. 导入classnames4. classnames的基本示例 二、classnames的高级用法1. 动态类名2. 传递数组3. 结合字符串和对象4. 结合数组和对象 三、实际应用案例1. 根据状态切换类名2. 条件渲染和类名…

解决腾讯云服务器登录宝塔面板忘记密码

文章目录 1.问题描述2.解决方案&#xff1a;3.总结 1.问题描述 宝塔忘记了密码&#xff0c;在腾讯云面板输入bt打算修改密码显示报错 2.解决方案&#xff1a; 输入如下指令 sudo bt再选择5即可修改密码&#xff08;如下图&#xff09; 3.总结 本质原因是自己直接输入bt…

【运算放大器】输入电压范围与输出电压范围

概述 总结运算放大器的输入电压范围和输出电压范围基本理论。 总结于《你好&#xff0c;放大器初识篇》。 文章目录 概述一、输入电压范围&#xff08;Input Voltage Range&#xff09;二、输出电压范围&#xff08; V O H / V O L V_{OH}/V_{OL} VOH​/VOL​ 或者 Swing fro…

Keras入门:一维线性回归问题

目录 一、一维变量线性回归 1. 数据生成 2. 建立训练模型 3. 作图 4. 完整代码 一、一维变量线性回归 1. 数据生成 import keras import numpy as np import matplotlib.pyplot as plt #matplotlib inline xnp.linspace(0, 100, 30) #0~100之间&#xff0c;生成30个数 y…

前端JS特效第58波:洋葱剥皮文本变形特效

洋葱剥皮文本变形特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>Onion Skinning Text Morphing</title><link…

若依ruoyi+AI项目二次开发(智能售货机运营管理系统)

(一) 帝可得 - 产品原型 - 腾讯 CoDesign (qq.com)

ctfshow-web入门-php特性(web137-web141)

目录 1、web137 2、web138 3、web139 4、web140 5、web141 1、web137 直接调用 ctfshow 这个类下的 getFlag 函数&#xff0c;payload&#xff1a; ctfshowctfshow::getFlag 查看源码&#xff1a; 拿到 flag&#xff1a;ctfshow{dd387d95-6fbe-4703-8ec5-9c8f9baf2bb5} 在…

19 Python常用内置函数——range()

range() 是 Python 开发中非常常用的一个内置函数。该函数返回具有惰性求值特点的 range 对象&#xff0c;其中包含左闭右开区间 [start, end) 内以 step 为步长的整数。 参数 start 默认为 0&#xff0c;step 默认为 1。 print(range(5)) print(list(range(5))) print(list(r…

我在Vscode学Java泛型(泛型设计、擦除、通配符)

Java泛型 一、泛型 Generics的意义1.1 在没有泛型的时候&#xff0c;集合如何存储数据1.2 引入泛型的好处1.3 注意事项1.3.1 泛型不支持基本数据类型1.3.2 当泛型指定类型&#xff0c;传递数据时可传入该类及其子类类型1.3.3 如果不写泛型&#xff0c;类型默认是Object 二、泛型…