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

devtools/2024/12/23 14:34:21/

效果预览

在这里插入图片描述

项目搭建

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/devtools/144710.html

相关文章

arcgisPro将面要素转成CAD多段线

1、说明&#xff1a;正常使用【导出为CAD】工具&#xff0c;则导出的是CAD三维多线段&#xff0c;无法进行编辑操作、读取面积等。这是因为要素面中包含Z值&#xff0c;导出则为三维多线段数据。需要利用【复制要素】工具禁用M值和Z值&#xff0c;再导出为CAD&#xff0c;则得到…

电脑除尘更换cpu和显卡硅脂过程及安装win11系统中遇到的问题

原由 电脑是2022款的显卡TRX3050ti 的Y7000p,在使用过程中发现电脑风扇声音很大&#xff0c;想来也是用很久没有清理过灰尘了&#xff0c;在拆卸视频中发现一个换硅脂的&#xff0c;刚好手头有&#xff0c;想来也没换过&#xff0c;所以就直接换了。但修完后直接打开却出现了无…

JavaScript文件端点提取与安全分析:两种高效实用的方法

提取JS文件中的所有端点(Endpoints) JavaScript文件中包含了大量的信息,对于安全研究人员来说,提取这些文件中的API端点是发现潜在漏洞的重要环节之一。在本篇文章中,我们将介绍两种高效提取JavaScript文件端点的方法。以下方法主要应用于渗透测试场景,尤其是针对目标域…

探索Web3的核心原则:去中心化与用户控制

Web3作为未来互联网的愿景&#xff0c;正逐步改变我们对网络的认知。它的两大核心原则——去中心化和用户控制&#xff0c;不仅推动了技术的革新&#xff0c;也重新定义了互联网用户与平台之间的关系。这些原则的落地&#xff0c;能够让用户在数字世界中拥有更多的自主权、隐私…

蓝叠模拟器adb连接并配置网络代理

说在前面&#xff1a; 由于配置wsl导致原模拟器失效&#xff0c;选择了蓝叠模拟器&#xff08;下载安装器后会自动配置为Hyper-v版本&#xff09;蓝叠国际不能自动配置root&#xff0c;需要手动破解&#xff0c;此处选择的是蓝叠中国&#xff08;二者可以同时安装并共存&#…

WPF实现曲线数据展示【案例:震动数据分析】

wpf实现曲线数据展示&#xff0c;函数曲线展示&#xff0c;实例&#xff1a;震动数据分析为例。 如上图所示&#xff0c;如果你想实现上图中的效果&#xff0c;请详细参考我的内容&#xff0c;创作不易&#xff0c;给个赞吧。 一共有两种方式来实现&#xff0c;一种是使用第三…

SQL MID()

SQL中的MID()函数是一个用于从指定位置开始截取字符串中指定长度的子串的函数。这个函数在数据库查询和数据处理中经常被使用&#xff0c;特别是在需要从较长的文本字段中提取特定信息时。 MID()函数的基本语法是&#xff1a;SELECT MID(column_name, start, length) FROM tab…

1688跨境代购代采业务:利用API实现自动化信息化

在全球化贸易日益频繁的今天&#xff0c;跨境电商已成为推动国际贸易的重要力量。作为中国电商的源头货盘&#xff0c;1688平台拥有大量的工厂、品牌商和一级批发商&#xff0c;为外贸人提供了极其丰富的货源。如何利用这一平台优势&#xff0c;开展跨境代购代采业务&#xff0…