最近学了下electron,实践下也弄个exe安装程序。

思路:按照每个班级提供一个表格,读取表格中姓名列内容,存储一下。点名时选择班级,对班级人员随机展示,实现点名

主要配置

async function createWindow() {// Create the browser window.const win = new BrowserWindow({width: 800,height: 600,webPreferences: {webSecurity: false, //取消跨域限制// Use pluginOptions.nodeIntegration, leave this alone// See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more infonodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,enableRemoteModule: true},// eslint-disable-next-line no-undeficon: `${__static}/ept.ico`,// titleBarStyle: "hidden-inset", //隐藏标题栏autoHideMenuBar: true, //隐藏菜单栏//frame: false, //无边框// titleBarOverlay: true, //显示关闭最大化最小化resizable: false, //是否可以改变窗口size,默认为 true.});if (process.env.WEBPACK_DEV_SERVER_URL) {// Load the url of the dev server if in development modeawait win.loadURL(process.env.WEBPACK_DEV_SERVER_URL);if (!process.env.IS_TEST) win.webContents.openDevTools();} else {createProtocol("app");// Load the index.html when not in developmentwin.loadURL("app://./index.html");}
}// Quit when all windows are closed.
app.on("window-all-closed", () => {// On macOS it is common for applications and their menu bar// to stay active until the user quits explicitly with Cmd + Qif (process.platform !== "darwin") {app.quit();}// 生产模式下在关闭electron时,启动stop.bat把java进程也关闭if (isCopyLib && !isDevelopment) {shell.openPath(path.resolve() + "\\resources\\lib\\stop.bat");}
});app.on("activate", () => {// On macOS it's common to re-create a window in the app when the// dock icon is clicked and there are no other windows open.if (BrowserWindow.getAllWindows().length === 0) createWindow();
});// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on("ready", async () => {//生产模式下启动时打开运行bat启动java进程if (isCopyLib && !isDevelopment) {shell.openPath(path.resolve() + "\\resources\\lib\\run.bat");}createWindow();
});
pluginOptions: {electronBuilder: {nodeIntegration: true,contextIsolation: false,enableRemoteModule: true,builderOptions: {appId: "com.example.app",productName: appName, //项目名,也是生成的安装文件名,即aDemo.execopyright: "Copyright © 2022 HiCB", //版权信息//打包时复制项目目录下的res中文文件到 打包后的exe所在目录的res文件夹中,文件夹下没有文件的话不会复制extraResources: isCopyLib ? [{"from": "./lib/","to": "../resources/lib"  }] : [],win: {//win相关配置icon: "./public/ept.ico", //图标,当前图标在根目录下,注意这里有两个坑target: [{target: "nsis", //利用nsis制作安装程序arch: ["x64", //64位"ia32"//32位],},],},nsis: {oneClick: false, // 是否一键安装allowElevation: true, // 允许请求提升。 如果为false,则用户必须使用提升的权限重新启动安装程序。allowToChangeInstallationDirectory: true, // 允许修改安装目录installerIcon: "./public/ept.ico", // 安装图标uninstallerIcon: "./public/ept.ico", //卸载图标installerHeaderIcon: "./public/ept.ico", // 安装时头部图标createDesktopShortcut: true, // 创建桌面图标createStartMenuShortcut: true, // 创建开始菜单图标shortcutName: appName, // 图标名称},},},},

读取表格中的姓名列,并进行存储

  readExcel1(file) {let that = this;if (!/\.(xls|xlsx)$/.test(file.name.toLowerCase())) {this.$message.error("上传格式不正确,请上传xls或者xlsx格式");this.clearFiles();return false;}const fileReader = new FileReader();fileReader.onload = (ev) => {try {const data = ev.target.result;const workbook = XLSX.read(data, {type: "binary",});let name = file.name;that.fileName = name.substring(0, name.indexOf("."));that.readData(workbook);} catch (e) {return false;} finally {that.clearFiles();}};fileReader.readAsBinaryString(file);},readData(workbook) {const wsname = workbook.SheetNames[0]; //取第一张表const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname], {range: 0,}); //生成json表格内容,从第一行开始(可以忽略标题)this.rawData = ws;let arr = [];for (let i = 0; i < ws.length; i++) {let item = ws[i]["姓名"];if (!isEmpty(item)) {arr.push(item);}}if (arr.length > 0) {let key = "myusers." + this.fileName;this.$setStoreData(key, arr);this.$emit("upload-success", ws);this.$baseMessage("数据上传成功","success",false,"vab-hey-message-success");} else {this.$baseMessage("未读取到【姓名】列,请检查是否存在【姓名】列并且是从第一行开始","error",false,"vab-hey-message-error");}},

按班级读取文件,随机点名

 handleStart() {if (this.users.length > 0) {this.sign = !this.sign;if (this.timer) {clearInterval(this.timer);this.timer = "";// this.voicePrompt(this.user);} else {let that = this;this.timer = setInterval(() => {let index = that.randomNum(0, that.users.length - 1);that.user = that.users[index];}, 10);}} else {this.$baseMessage("请先选择班级!","error",false,"vab-hey-message-error");}},//生成从minNum到maxNum的随机数randomNum(minNum, maxNum) {switch (arguments.length) {case 1:return parseInt(Math.random() * minNum + 1, 10);case 2:return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);default:return 0;}},

electron初学之随机点名相关推荐

  1. [Electron]仿写一个课堂随机点名小项目

    自从前几个月下了抖音,无聊闲暇时就打会打开抖音,因为打开它有种莫名其妙打开了全世界的感觉... 无意中看到这个小视频:随机点名 于是仿写了一个课堂点名小项目,算是对Electron的一个简单的认识,有 ...

  2. 随机点名系统——html初学实战

    一.实验目的 编写随机点名程序(越不来上课的人,被点中的概率越高,实现抽查.预警等功能) 二.算法设计与结果预览 选择开发语言: C/C++ 不太适合,由于我的想法是最终要做出一个比较拿的出手的图形界 ...

  3. 利用HTML实现上课随机点名

    记录学习的第二天! 高中数学老师一枚,为增强上课的趣味性,激发学生的学习欲望,专门用HTML5写了一个上课随机点名系统.通过实践检验,效果良好! 虽然学校一体机配备有点名软件,但老师自己写的小玩意可以 ...

  4. javascript 随机点名

    javascript随机点名 视频 https://www.bilibili.com/video/BV1PJ41177YW?p=4 代码 <!DOCTYPE html> <html ...

  5. python编写一个软件-python写一个随机点名软件的实例

    最近有个随机点名软件的需求,故写了一个,上代码:github地址 # -*- coding: utf-8 -*- # @Time : 18-12-31 下午4:21 # @Author : Felix ...

  6. 好程序员web前端分享数组及排序、去重和随机点名

    好程序员web前端分享数组及排序.去重和随机点名,栈堆结构:堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除. 栈:存放的是路径:容量有限(在一开始被定义之 ...

  7. python小案例随机点名_python用tkinter实现一个简易能进行随机点名的界面

    今天学到Python 有一个名为 random 的内置模块,可用于生成随机数, 这个好玩~可以用来做为上课随机点名的程序了哈哈.. def main_cor(): import random i = ...

  8. SASS+Compass基本使用,结合JavaScript实现随机点名小系统

    SASS+Compass基本使用,以一个随机点名demo为例 demo 源码:https://github.com/XieTongXue/call-over,效果请看(5),代码解释请看源码. (1) ...

  9. * 完成随机点名案例;学生姓名都提前写在文件中;:每次敲回车,随机显示一个学生姓名,每人最多显示一次,所有人都显示完了就结束程序;

    import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOExce ...

最新文章

  1. pytorch的nn.linear 转
  2. Java高并发编程:同步工具类
  3. think in java - 第四章 学习笔记
  4. Drools Planner重命名为OptaPlanner:宣布www.optaplanner.org
  5. Java描述 数据结构与算法
  6. python 生成器对象_Python 生成器, 迭代器, 可迭代对象的区别
  7. 删除不需要的(辅助)SQL Server事务日志文件
  8. Dapper入门学习
  9. mysql报1665_mysql错误处理之ERROR 1665 (HY000)_MySQL
  10. 敏感之敏感 工资的多种可能性
  11. mysql左连接右连接内连接的含义_MySQL-解释左连接,右连接,内连接,全连接
  12. Atitit 单点登录实现几种模式架构图 目录 1. 因此要点也就以下两个:存储信任验证信任 1 1.1. 共享cookie (最简单 1 1.2. 通过 url带token参数跳转 1 1.3.
  13. MUSIC算法及MATLAB实现
  14. ubuntu(乌班图) 修改ip
  15. python3菜鸟教程100例-Python3
  16. 推荐→可以做时间线图片的APP
  17. 文学家是什么时候出现的
  18. OpenStack之八: network服务(端口9696)
  19. 安卓android+rom定制,移植,安卓Android ROM定制移植教程。.doc
  20. IOS APP 公司主体变更的转让流程

热门文章

  1. 计算机可以计算出十的一百次方吗,世界上最大的数字单位 古戈尔(1古戈尔等于10的100次方)...
  2. 史上最全Java面试题全集(上)
  3. 阿里云MVP北京闭门会圆满落幕 多把“利剑”助力开发者破阵蜕变...
  4. Git拉分支及合并分支
  5. 浙江大学的计算机考研难度,浙江大学部分专业考研难度分析
  6. 联想电脑虚拟化开启方法
  7. Android:开发中,代码被横线划掉是什么意思
  8. 解决外边距坍塌的几种方法
  9. 从今开始,两耳不闻窗外事,一心搞dp
  10. 关于Sign in with Apple (Apple 登录) PHP的后端验证