自從前幾個月下了抖音,無聊閒暇時就打會打開抖音,由於打開它有種莫名其妙打開了全世界的感受...前端
無心中看到這個小視頻:隨機點名vue
因而仿寫了一個課堂點名小項目,算是對Electron的一個簡單的認識,有時間再深刻。ios
引用官網的一句話: Build cross platform desktop apps with JavaScript, HTML, and CSS(經過HTML+CSS+JS技術作跨平臺的桌面應用)es6
本項目基於官方electron-quick-start 腳手架,創建並初始化項目。github
# 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語法對腳手架進行結構修改npm
.
|-- src // 源碼目錄
| |-- assets // 資源文件
| |-- config // 項目配置
| |-- data // 名冊json數據
| |-- vendors // 第三方腳本
| |-- window // 窗口目錄
| |-- controllers // 窗口生成
| |-- views // 頁面
| |-- main.js // 程序入口文件
|-- .gitignore // Git提交忽略文件規則
|-- LICENSE // 受權協議
|-- README.md // 項目說明
|-- package.json // 配置項目相關信息
.
複製代碼
主進程: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',其餘的功能界面定義爲大寫字母。windows
<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>
複製代碼
基於該庫,能夠將excel數據轉化爲json數據,而後本身再進行格式化。bash
一些概念:
關係:
// workbook
{
SheetNames: ['sheet1', 'sheet2'],
Sheets: {
// worksheet
'sheet1': {
// cell
'A1': { ... },
// cell
'A2': { ... },
...
},
// worksheet
'sheet2': {
// cell
'A1': { ... },
// cell
'A2': { ... },
...
}
}
}
複製代碼
基本用法
本項目中,經過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,感謝你的支持。