electron+vue开发值班交班系统(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


值班交班系统开发(二)

一、electron开发(二)

1.窗口菜单设置

关闭默认菜单显示

/*隐藏electron创听的菜单栏*/
Menu.setApplicationMenu(null)

为了开发方便,注册快捷键打开调试台

 // 注册快捷键打开调试台
  globalShortcut.register('ctrl+e', () => {
    mainWindow.webContents.toggleDevTools()
  })

2.关闭窗口提示

//mainWindow要关闭时的方法↓
  mainWindow.on('close', e => {
    e.preventDefault(); //先阻止一下默认行为,不然直接关了,提示框只会闪一下
    dialog.showMessageBox({
      type: 'info',
      title: '提示',
      message: '确认退出?',
      buttons: ['确认', '取消', "最小化"],   //选择按钮,点击确认则下面的idx为0,取消为1
      cancelId: 1, //这个的值是如果直接把提示框×掉返回的值,这里设置成和“取消”按钮一样的值,下面的idx也会是1
    }).then(idx => {
      //注意上面↑是用的then,网上好多是直接把方法做为showMessageBox的第二个参数,我的测试下不成功
      console.log(idx)
      if (idx.response == 1) {
        e.preventDefault();
      } else if (idx.response == 0) {
        mainWindow = null
        app.exit();
      } else {
        mainWindow.hide();
        mainWindow.setSkipTaskbar(true);
        e.preventDefault();
      }
    })
  });

3.最小化托盘设置

// 设置最小化图标path.join(__dirname, "./assets/logo.ico")
  let tray = new Tray(path.join(__dirname, "./assets/logo.ico"));
  const contextMenu = Menu.buildFromTemplate([
    {
      label: "退出",
      click: () => {
        mainWindow.destroy();
        app.quit();
      },
    },
  ]);
  tray.setToolTip("交班系统");
  tray.setContextMenu(contextMenu);
  tray.on("click", () => {   // 点击托盘图标显示窗口
    mainWindow.show();
    mainWindow.setSkipTaskbar(false);
  });
})

二、后端接口开发

express 做接口开发,sqlite做数据库。

1.sqlite

SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。
使用sqlite3创建和连接数据库。
连接数据库,如果文件不存在会自动创建

const sqlite3 = require('sqlite3').verbose()
let db;
// 连接数据库
function conDb() {
  const os = require('os');
  const homedir = os.homedir(); // 用于获取当前用户的主目录路径
  const users = homedir.replace(/\\/g,'\\\\'); // 替换绝对和相对路径
  if (!db || !db.open) {
    db = new sqlite3.Database(users+'\\sql.db'); // 保存地址文件
    console.log(users+'\\sql.db')
  };
  return db;
}

module.exports = conDb

初始化数据库表

const conDb = require("./index")
let db;
function init () {
    db = conDb();

    // return new Promise((resolve,reject) => {
        db.serialize(() => {
            // 测试数据库
            db.run(`create table if not exists jiaoban (
                id integer PRIMARY KEY AUTOINCREMENT NOT NULL,
                leader1 varchar(64),
                leader2 varchar(64),
                commander1 varchar(64),
                commander2 varchar(64),
                confirm integer,
                level varchar(20),
                duty_date varchar(20),
                job varchar(5000),
                register1 varchar(5000),
                register2 varchar(5000),
                register3 varchar(5000),
                register4 varchar(5000),
                comments varchar(2000),
                created_time varchar(20),
                updated_time varchar(20)
            )`);
            
            // resolve();
        })
    // })
}
module.exports = init

2.搭建express服务

用express搭建服务,初始化数据库,并导出为模块

const express = require('express')
const cors = require('cors')
const bodyParser = require('body-parser');
const jiaobanRouter = require('./jiaobanRouter')
const init = require("./config/initdb")
const createServer = () => {
    // 初始化表字段
    init();
    const app = express()
    // 跨域
    app.use(cors())
    app.use(bodyParser.json({ extended: false }));
    app.listen(3001, () => console.log("监听3001"))
    // 路由表
    app.use('/api', jiaobanRouter)
}
module.exports = createServer

在electron main.js文件引入,当窗口打开后在启动后台服务

// 加载渲染进程
  // mainWindow.loadURL("http://localhost:3000/")
  mainWindow.loadURL(`file://${path.join(__dirname,"../dist/index.html")}`)
  // 开启后台接口
  createServer();
  // 保存文件方法

后台接口主要是curd,不做过多介绍。

3.sqlite3打包

引入sqlite3模块后打包时是需要python和visual studio环境,需要安装npm i windows-build-tools。安装过程还比较麻烦。

三、导出word功能

比较麻烦的功能就是生成word导出的功能

1.生成word

使用docx-templates库,利用做好的word模板,把数据填进去。

// import createReport from 'docx-templates';
const docxTemplates = require("docx-templates")
const fs = require("fs")
const path = require("path")
const handlerData = require("./handlerData")
async function genWord(filePath,data) {
    // 获取模板
    const template = fs.readFileSync(path.join(__dirname,'123.docx'));
    // 处理数据
    const newdata = handlerData(data)

    const buffer = await docxTemplates.createReport({
        template,
        data: newdata,
        cmdDelimiter: ['{', '}'],
    });
    
    fs.writeFileSync(filePath, buffer)
}

module.exports = genWord

2.保存文件

保存文件需要使用electron的dialog模块,获取到用户想保存文件的路径进行写入

dialog.showSaveDialog(win, {
            title: '导出值班日志',
            buttonLabel: '保存',
            defaultPath: params.fileName,
            filters: [
                {
                    // 只读取js文件
                    name: '值班日志', extensions: ['docx']
                }
            ]
        }).then(res => {
            if (res.filePath) {
                filePath = res.filePath
                console.log(filePath)
                genWord(filePath,params.data)
            }
        })

3.ipcMain通信

想要在渲染进程和主进程间通信,通过ipcMain模块在主进程监听事件

// 监听渲染进程发出的download事件
    ipcMain.on('download', (evt, params) => {
        console.log(params)
        dialog.showSaveDialog(win, {
            title: '导出值班日志',
            buttonLabel: '保存',
            defaultPath: params.fileName,
            filters: [
                {
                    // 只读取js文件
                    name: '值班日志', extensions: ['docx']
                }
            ]
        }).then(res => {
            if (res.filePath) {
                filePath = res.filePath
                console.log(filePath)
                genWord(filePath,params.data)
            }
        })
    })

在预加载脚本中吧ipcRender模块暴露给渲染进程,渲染进程可以触发事件,发起保存文件事件。

const { ipcRenderer } = require('electron')
window.ipcRenderer = ipcRenderer

总结

整个程序功能比较简单,但用到了electron+vue大部分功能。主要是在理解electron使用,还是采用前后端分离的思路来做。electron打包配置也还是比较麻烦,会遇到一些安装问题。sqlite的使用比较简单麻烦的还是打包。word生成导出功能,用到了ipcMain通信,是这里比较麻烦的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值