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

自从前几个月下了抖音,无聊闲暇时就打会打开抖音,因为打开它有种莫名其妙打开了全世界的感觉...

无意中看到这个小视频:随机点名

于是仿写了一个课堂点名小项目,算是对Electron的一个简单的认识,有时间再深入。

项目地址

https://github.com/alex1504/electron-roll-tool

项目截图

preview
preview
preview
preview

Electron介绍

引用官网的一句话: Build cross platform desktop apps with JavaScript, HTML, and CSS(通过HTML CSS JS技术做跨平台的桌面应用)

需求分析:

  1. 无网络环境使用:大学大部分科室可能无网络,本项目所有资源使用本地资源,数据文件存放在本地。
  2. Excel录入:一般每个班级都有一份名单,excel导入节省时间。
  3. 多班级列表管理:一个老师可能同时排多个班级学生的课程。
  4. 数据统计:统计学生回答情况,方便期末考评。

功能点介绍

  • [x] Excel导入学生名册
  • [x] 手动录入名册
  • [x] 名册列表管理
  • [ ] 数据统计

开发前了解

  • 为快速开发,使用UI库photonkit
  • 使用vue作为lib进行前端逻辑的编写
  • Excel数据录入基于xlsx
  • 时间生成使用moment

初始化

本项目基于官方electron-quick-start 脚手架,建立并初始化项目。

# Clone this repository
git clone https://github.com/electron/electron-quick-start
# Go into the repository
cd electron-quick-start
# Install dependencies
npm install
# Run the app
npm start

项目核心结构

为使代码可读性更强,重新使用es6语法对脚手架进行结构修改

.
|-- src                              // 源码目录
|   |-- assets					     // 资源文件
|   |-- config					     // 项目配置
|   |-- data					     // 名册json数据
|   |-- vendors						 // 第三方脚本
|   |-- window					     // 窗口目录
|       |-- controllers  			 // 窗口生成
|       |-- views   				 // 页面
|   |-- main.js                      // 程序入口文件
|-- .gitignore                       // Git提交忽略文件规则
|-- LICENSE                          // 授权协议
|-- README.md                        // 项目说明
|-- package.json                     // 配置项目相关信息
.

主进程:

const electron = require('electron');
const app = electron.app;
const IndexWindow = require('./windows/controllers/index');class RollTool {constructor() {this.indexWindow = null;}init() {this.initApp()}initApp() {app.on('ready', () => {this.indexWindow = new IndexWindow();});app.on('activate', () => { if (this.indexWindow === null) {this.indexWindow = new IndexWindow();}});app.on('window-all-closed', function () {if (process.platform !== 'darwin') {app.quit()}})}
}
new RollTool().init();

界面的切换隐藏

通过一个step字段,将主导航界面定义为状态'1',将点名界面定义为状态'2',其他的功能界面定义为大写字母。

<div id="app"><div class="window"><div class="window-content"><div class="pane-group"><!-- START Maincontent --><div class="pane"><!-- 初始导航 --><section class="guide-box" v-if="step==='1'"></section><!-- 名册列表 --><section class="select-box" v-if="step==='A'"></section><!-- excel录入 命名名册 --><section class="guide-box" v-if="step==='B'"></section><!-- 修改头像 --><section class="guide-box" v-if="step==='E'"></section><!--手动录入 --><section class="manual-box" v-if="step==='C'"></section><!-- 手动录入 命名名册 --><section class="guide-box" v-if="step==='C1'"></section><!-- 随机抽取 --><section class="roll-box" v-if="step==='2'"></section></div><!--END Maincontent--><!-- START Sidebar--><div class="pane-sm sidebar"></div><!-- END Sidebar --></div></div></div>
</div>

js-xlxs使用

基于该库,可以将excel数据转化为json数据,然后自己再进行格式化。

一些概念:

  • workbook 对象,指的是整份 Excel 文档。我们在使用 js-xlsx 读取 Excel 文档之后就会获得 workbook 对象。
  • worksheet 对象,指的是 Excel 文档中的表。我们知道一份 Excel 文档中可以包含很多张表,而每张表对应的就是 worksheet 对象。
  • cell 对象,指的就是 worksheet 中的单元格,一个单元格就是一个 cell 对象。

关系:

// workbook
{SheetNames: ['sheet1', 'sheet2'],Sheets: {// worksheet'sheet1': {// cell'A1': { ... },// cell'A2': { ... },...},// worksheet'sheet2': {// cell'A1': { ... },// cell'A2': { ... },...}}
}

基本用法

  • 用 XLSX.readFile 打开 Excel 文件,返回 workbook
  • 用 workbook.SheetNames 获取表名
  • 用 workbook.Sheets[xxx] 通过表名获取表格
  • 按自己的需求去处理表格
  • 生成新的 Excel 文件

本项目中,通过input获得file对象,然后通过xlsxjs读取workbook对象,其中worksheet的!margins和!ref属于我们不关心的属性,排除。然后通过循环获取从第二行开始的数据,设置默认头像,拼接成我们的json数据,再下一步通过Node文件系统API写入data文件夹下。

readXlsxFile(file) {const filePath = file.path;const workbook = XLSX.readFile(filePath);const sheetNames = workbook.SheetNames;const worksheet = workbook.Sheets[sheetNames[0]];const fileDir = Date.now().toString();const time = moment().format('LLL');let jsonData = {};let details = [];let length = (Object.keys(worksheet).length - 2) / 2;try{for (let i = 2; i <= length; i  ) {const name = worksheet[`A${i}`].h;const id = worksheet[`B${i}`].h;let student = {name,id,isExcluded: false,avatar: `../../../assets/imgs/default_avatar.jpg`};details.push(student)}jsonData.fileDir = fileDir;jsonData.createdAt = time;jsonData.updatedAt = time;jsonData.details = details;this.jsonData = jsonData;}catch (e) {console.log(e)alert('导入失败,请检测excel格式是否正确')}
}

喜欢本项目可以star或fork,感谢你的支持。

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

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

相关文章

何时以及如何使用ThreadLocal

正如我们的读者可能已经猜到的那样&#xff0c;我每天都在处理内存泄漏。 最近&#xff0c;一种特殊类型的OutOfMemoryError消息开始引起我的注意-滥用ThreadLocals触发的问题变得越来越频繁。 在查看此类泄漏的原因时&#xff0c;我开始相信其中一半以上是由于开发人员导致的&…

linux redis安装使用,linux安装redis

Linux(CentOS)中Redis介绍、安装、使用【一篇就够】2018-05-13 13:36:16 sjmz30071360 阅读数 1590更多分类专栏&#xff1a; redis版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接和本声明。一、介绍Redis is…

用three.js写一个简单的3D射门游戏

这个小游戏很简单&#xff0c;一共由3个部分构成。1个平面&#xff08;球场&#xff09;&#xff0c;1个球体&#xff08;足球&#xff09;还有一个立方体&#xff08;球门&#xff09;。 上个图给你们感受一下简陋的画风&#xff08;掘金最高上传5M图片&#xff0c;原来图片都…

100份Spring面试问答-最终名单(PDF下载)

上次更新时间&#xff1a;2019年2月11日 这是有关Spring框架的一些最重要问题的摘要&#xff0c;在面试或面试测试过程中可能会要求您回答这些问题&#xff01; 您无需担心下一次面试的机会&#xff0c;因为Java Code Geeks在这里为您服务&#xff01; 您可能会被问到的大多数…

3.1 unittest简介

3.1 unittest简介 前言 熟悉java的应该都清楚常见的单元测试框架Junit和TestNG。python里面也有单元测试框架-unittest,相当于是一个python版的junit。python里面的单元测试框架除了unittest&#xff0c;还有一个pytest框架&#xff0c;这个用的比较少&#xff0c;后面有空再继…

织梦其他模型使用联动类型地区联动

官方模型的联动类型只能模型是在【独立模型】或者官方默认的【分类信息】模型下使用&#xff0c;其他模型下使用无效&#xff0c;我们来让联动类型支持所有模型。 添加联动地区类型字段 内容模型管理 - 文章模型(或者其他模型) - 添加新字段 字段名称 和 数据类型 千万别搞错了…

linux修改组的选项名字为,Linux用户、组及权限管理浅析

一、用户和组1.用户系统用来认证(Authentication)&#xff0c;授权(Authorization)&#xff0c;审计(Autition)的帐号。通过登录用户来登录系统。操作系统通过登录不同的用户来调用相对应权限的进程或程序&#xff0c;也可以说&#xff0c;用户是能获取系统资源的权限集合。2.用…

如何在 vue-cli v3.0 中使用 SCSS/SASS

在项目中使用 SCSS/SASS 进行样式编写无疑会节省很多开发样式的时间。关于如何在 vue-cli v3.0 中使用 SCSS/SASS&#xff0c;这里提供三种方案。前提是在使用 vue-cli 生成项目时勾选了 CSS Pre-processors (CSS预处理器)&#xff0c;否则无法在项目中直接使用。 方案一&…

使用IntelliJ IDEA进行热部署

最近&#xff0c;在PrimeFaces论坛PrimeFaces IDE Poll中进行了投票&#xff0c;以投票赞成用于开发PrimeFaces应用程序的最佳IDE。 最多人投票支持NetBeans。 NetBeans和Eclipse是免费的IDE。 我最喜欢的IDE IntelliJ IDEA Ultimate不是免费的&#xff0c;我认为这就是为什么在…

创梦天地关嵩:借力腾讯云,打造文娱新生态——云+未来峰会回顾

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 今年腾讯云未来峰会主题的关键词是“焕启”&#xff0c;这是包含无限希望的两个字&#xff0c;让人倍感振奋。“焕启”是什么意思&#xff1f;在我的理解中&#xff0c;“焕启”本身就是激活&#xff0c;激…

领域模型学习笔记

别在领域模型迷失了自己转载于:https://www.cnblogs.com/mySerilBlog/p/9914375.html

【缓存清理工具】缓存清理软件_电脑缓存清理软件

产品介绍 有很多种比如来自网页和windows等,缓存如果不经常清理会使你的机器运行速度变慢&#xff0c;缓存清理工具可以帮你最多程度的清理垃圾文件而且速度也很快&#xff0c;有了它的帮助让你爱机清理彻底&#xff0c;运行更加顺畅&#xff01;主要能清理&#xff1a;所有应…

c语言转义字符空格符号,C语言 转义符\t占用几个空格

这个问题&#xff0c;在你学习编程过程中可能会考虑到&#xff0c;有时为了字节对齐而使用转义符中\t,但是到底\t占用几个空格呢&#xff1f;下面我们首先通过程序来体验下&#xff0c;然后在总结#include int main(){printf("123456\t123\t45\n");printf("12\t…

检测Maven依赖中介

从Maven 2.0.9开始&#xff0c;向Maven添加了一个新功能&#xff0c;称为依赖中介。 依赖关系中介是Maven在特定情况下在依赖关系树中多次出现依赖关系时用来解决项目依赖关系的技术。 通常&#xff0c;这发生在通过项目的依赖关系链接的传递依赖关系上。 在这种情况下&#xf…

简单的节流函数throttle

在实际项目中&#xff0c;总会遇到一些函数频繁调用的情况&#xff0c;比如window.resize&#xff0c;mouseover&#xff0c;上传进度类似的触发频率比较高的函数&#xff0c;造成很大的性能损耗&#xff0c;这里可以使用节流函数来进行性能优化&#xff0c;主要是限制函数被频…

[探索] 利用promise做一个请求锁

在最近开发小程序的过程中&#xff0c;遇到一个需求&#xff0c;就是请求的时候header需要带上accessToken, accessToken是通过登陆接口返回的参数&#xff0c;可能会出现过期的情况&#xff0c;则需要重新登陆&#xff0c;所以每次加载小程序都会进行一次本地储存的accessToke…

c语言网上找程序组合,C语言程序我同学说在网上下的一章一章的小说组合成一个太麻烦,于是 爱问知识人...

我同学说在网上下的一章一章的小说组合成一个太麻烦&#xff0c;于是我突发奇想要做一个把记事本中的内容按顺序连接起来的程序&#xff0c;但是运行不了&#xff0c;我怀疑是读写时候指针搞错了&#xff0c;情大侠们帮我看看&#xff0c;小弟感激不尽&#xff01;#include#inc…

用于J2EE开发的Cloud IDE

随着许多传统软件工具进入云计算&#xff0c;我想看看它们与传统工具的比较。 我的兴趣是Java EE技术&#xff0c;并开始寻找一种云服务&#xff0c;该服务使我能够开发&#xff0c;测试和部署Java EE应用程序。 我很快发现&#xff0c;许多云IDE是为Web前端技术&#xff08;例…

【Python】[02]初识Python

Python3的下载安装 根据书上的推荐&#xff0c;我将学习和使用Python3版本&#xff0c;从www.python.org网站&#xff0c;根据对应的操作系统&#xff0c;下载合适的Python版本即可 我的是64位系统&#xff0c;所以我选择的是Windows x86-64 executable installer 下载完成后双…

自己写了一个多行文本溢出文字补全的小库, 说不定你会用得到的

有些时候产品会有这么个需求&#xff0c;希望给文章或者帖子给一个摘要&#xff0c;最多3行&#xff0c;或者其它行数&#xff0c;超出3行会补上...。当然这种很简单&#xff0c;用css可以搞定。但是遇上要求多点的产品&#xff0c;希望补上的是...查看全文&#xff0c;这样的话…