electron-vite【实战】登录/注册页

server/2025/3/15 8:17:37/

效果预览

在这里插入图片描述

项目搭建

https://blog.csdn.net/weixin_41192489/article/details/144611858

技术要点

路由默认跳转到登录页

src/renderer/src/router/index.ts

  routes: [// 默认跳转到登录页{path: '/',redirect: '/login'},...routes]

登录窗口的必要配置

src/main/index.ts 中

  const mainWindow = new BrowserWindow({// 自定义图标icon: icon,// 自定义窗口宽度width: 360,// 自定义窗口高度height: 430,//默认隐藏窗口show: false,// 隐藏窗口标题栏titleBarStyle: 'hidden',// 隐藏默认菜单autoHideMenuBar: true,// 不可改变窗口大小resizable: false,// 窗口不可最大化maximizable: false,webPreferences: {preload: join(__dirname, '../preload/index.js'),sandbox: false}})

右上角关闭按钮的实现

src/renderer/src/pages/login.vue

  <div class="text-right"><el-iconclass="el-icon-edit text-20px hover:bg-red hover:text-white cursor-pointer p-2"@click="quit"><Close/></el-icon></div>

渲染进程向主进程发送信息

function quit() {window.electron.ipcRenderer.send('quit')
}

src/main/index.ts 主进程响应信息

ipcMain.on('quit', () => {app.quit()
})

代码实现

src/renderer/src/router/index.ts

import { createRouter, createWebHashHistory } from 'vue-router'
import { routes, handleHotUpdate } from 'vue-router/auto-routes'export const router = createRouter({// 此处需用 Hash 模式,否则打包后路由会失效history: createWebHashHistory(import.meta.env.BASE_URL),routes: [// 默认跳转到登录页{path: '/',redirect: '/login'},...routes]
})// 支持热更新
if (import.meta.hot) {handleHotUpdate(router)
}

src/main/index.ts

import { app, shell, BrowserWindow, ipcMain, Tray, Menu } from 'electron'
import { join } from 'path'
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import icon from '../../resources/icon.png?asset'function createWindow(): void {const mainWindow = new BrowserWindow({// 自定义图标icon: icon,// 自定义窗口宽度width: 360,// 自定义窗口高度height: 430,//默认隐藏窗口show: false,// 隐藏窗口标题栏titleBarStyle: 'hidden',// 隐藏默认菜单autoHideMenuBar: true,// 不可改变窗口大小resizable: false,// 不可改变窗口大小maximizable: false,webPreferences: {preload: join(__dirname, '../preload/index.js'),sandbox: false}})// 托盘const tray = new Tray(icon)const contextMenu = [{label: '退出',click: function () {app.exit()}}]const menu = Menu.buildFromTemplate(contextMenu)tray.setToolTip('EC编程俱乐部')tray.setContextMenu(menu)tray.on('click', () => {// 使窗口显示在任务栏中mainWindow.setSkipTaskbar(false)mainWindow.show()})// IPC通信ipcMain.on('showPage_home', () => {// 窗口可调整大小mainWindow.setResizable(true)mainWindow.setSize(800, 680)// 窗口居中mainWindow.center()// 窗口可最大化mainWindow.setMaximizable(true)})ipcMain.on('top', () => {mainWindow.setAlwaysOnTop(true)})ipcMain.on('cancle_top', () => {mainWindow.setAlwaysOnTop(false)})ipcMain.on('hide', () => {// 使窗口不显示在任务栏中mainWindow.setSkipTaskbar(true)mainWindow.hide()})ipcMain.on('min', () => {mainWindow.minimize()})ipcMain.on('max', () => {mainWindow.maximize()})ipcMain.on('cancel_max', () => {mainWindow.unmaximize()})mainWindow.on('ready-to-show', () => {// 自定义标题mainWindow.setTitle('EC编程俱乐部')mainWindow.show()})// 窗口变为最大化状态mainWindow.on('maximize', () => {mainWindow.webContents.send('maximize')})// 窗口从最大化状态退出mainWindow.on('unmaximize', () => {mainWindow.webContents.send('unmaximize')})mainWindow.webContents.setWindowOpenHandler((details) => {shell.openExternal(details.url)return { action: 'deny' }})if (is.dev && process.env['ELECTRON_RENDERER_URL']) {mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])} else {mainWindow.loadFile(join(__dirname, '../renderer/index.html'))}
}app.whenReady().then(() => {// Set app user model id for windowselectronApp.setAppUserModelId('com.electron')app.on('browser-window-created', (_, window) => {optimizer.watchWindowShortcuts(window)})createWindow()app.on('activate', function () {if (BrowserWindow.getAllWindows().length === 0) createWindow()})
})ipcMain.on('quit', () => {app.quit()
})app.on('window-all-closed', () => {if (process.platform !== 'darwin') {app.quit()}
})

src/renderer/src/pages/login.vue

仅前端页面渲染,省略了表单校验和后端交互。

<script setup lang="ts">
const form = reactive({ account: '', password: '', remember: false, passwordConfirm: '' })const loginWay_list = [{ icon: 'mdi:wechat', color: '#07cd66' },{ icon: 'flat-color-icons:phone-android' },{ icon: 'icon-park:tencent-qq' }
]const PageType = ref('login')function goToRegister() {PageType.value = 'register'
}function goToLogin() {PageType.value = 'login'
}const router = useRouter()function submit_login() {window.electron.ipcRenderer.send('showPage_home')router.push('/home')
}
function quit() {window.electron.ipcRenderer.send('quit')
}
</script><template><div class="text-right"><el-iconclass="el-icon-edit text-20px hover:bg-red hover:text-white cursor-pointer p-2"@click="quit"><Close/></el-icon></div><div class="w-360px bg-white p-8 pt-2 box-border overflow-hidden"><div class="text-28px font-bold text-center p-6">{{ PageType === 'login' ? 'EC 编程俱乐部' : '注册 EC' }}</div><!-- 表单 --><el-form :model="form"><el-form-item><el-input v-model="form.account" placeholder="请输入账号"><template #prefix><Icon icon="mdi:account" /></template></el-input></el-form-item><el-form-item><el-input v-model="form.password" placeholder="请输入密码"><template #prefix><Icon icon="wpf:password1" /></template></el-input></el-form-item><el-form-item v-if="PageType === 'register'"><el-input v-model="form.passwordConfirm" placeholder="请再次输入密码"><template #prefix><Icon icon="mdi:password-check-outline" /></template></el-input></el-form-item><div v-if="PageType === 'login'" class="flex justify-between items-center"><div><el-checkbox v-model="form.remember" label="自动登录" size="large" /></div><div><el-link type="primary" :underline="false">忘记密码</el-link><el-text type="primary"> / </el-text><el-link type="primary" :underline="false" @click="goToRegister">注册</el-link></div></div><el-form-item><el-button v-if="PageType === 'login'" type="primary" class="w-full" @click="submit_login">登录</el-button><el-button v-if="PageType === 'register'" type="primary" class="w-full">注册</el-button></el-form-item><div v-if="PageType === 'register'" class="text-right"><el-link type="primary" :underline="false" @click="goToLogin">已有账号</el-link></div></el-form><div v-if="PageType === 'login'"><el-divider><span class="text-10px">其他登录方式</span></el-divider><div class="flex justify-around"><Iconv-for="(item, index) in loginWay_list":key="index":icon="item.icon":style="{color: item.color}"class="inline-block text-24px cursor-pointer"/></div></div></div>
</template>

http://www.ppmy.cn/server/152155.html

相关文章

wtforms+flask_sqlalchemy在flask-admin视图下实现日期的修改与更新

背景&#xff1a; 在flask-admin 的modelview视图下实现自定义视图的表单修改/编辑是件不太那么容易的事情&#xff0c;特别是想不自定义前端view的情况下。 材料&#xff1a; wtformsflask_sqlalchemy 制作&#xff1a; 上代码 1、模型代码 from .exts import db from …

Flutter项目兼容鸿蒙Next系统

一、环境搭建&#xff1a; 1.1 下载鸿蒙DevEco Studio开发工具。 下载地址&#xff1a;下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 下载之前需要先登录&#xff0c;后面的模拟器创建还要开发者验证、审核啥的&#xff0c;好在审核进度还可以&am…

PaddlePaddle推理模型利用Paddle2ONNX转换成onnx模型

训练paddleocr模型&#xff0c;可以按照如下教程或者直接百度其他的 PaddleOCR训练自己的数据集&#xff08;中英文&#xff09;&#xff08;全套&#xff09;和C#部署&#xff08;半套&#xff09;_c# paddleocr-CSDN博客 将训练后的模型转换成推理模型 -c后面是你配置的de…

Linux中部署项目

1.下载JDK17 进入 /usr/local 目录&#xff0c;创建 java 文件夹。并将 JDK17 上传到 java 目录下。 上传成功后&#xff0c;通过cd命令进入Java文件夹目录&#xff0c;解压 JDK17 压缩包&#xff0c;命令 unzip zulu17.44.53-ca-jdk17.0.8.1-linux_x64.zip。 如果报错说 u…

day4:tomcat—maven-jdk

一&#xff0c;java项目部署过程 编译&#xff1a;使用javac命令将.java源文件编译成.class宇节码文件打包&#xff1a;使用工具如maven或Gradle将项目的依赖、资源和编译后的字节码打包成一个分发格式&#xff0c;如.jar文件&#xff0c;或者.war文件(用于web应用&#xff09…

四相机设计实现全向视觉感知的开源空中机器人无人机

开源空中机器人 基于深度学习的OmniNxt全向视觉算法OAK-4p-New 全景硬件同步相机 机器人的纯视觉避障定位建图一直是个难题&#xff1a; 系统实现复杂 纯视觉稳定性不高 很难选到实用的视觉传感器 为此多数厂家还是采用激光雷达的定位方案。 OAK-4p-New 为了弥合这一差距…

基于LR/GNB/SVM/KNN/DT算法的鸢尾花分类和K-Means算法的聚类分析

花瓣轮廓&#xff1a; 分类与聚类 使用各种模型进行鸢尾花分类和聚类 1. | 介绍 &#x1f44b; &#x1f914; 数据集问题 鸢尾花分类项目是使用简单数据集实现机器学习模型的实际演示。数据集本身包含有关花瓣和萼片大小的信息&#xff0c;包括鸢尾属物种。通过分析鸢尾花的…

怎么通过亚矩阵云手机实现营销?

通过云手机来营销是一种新型的创新手段&#xff0c;它能帮助企业以较低的成本和较高的效率来达到宣传和营销的目的。云手机是一种虚拟手机&#xff0c;它通过网络来连接服务器&#xff0c;达到访问云手机来进行操作的效果。以下是使用云手机进行营销的几种方法: 1.社交媒体运营…