excel数据读取 加密 批量生产二维码

日期: 2018-08-08         浏览量: 2962

应用场景, 要批量生产一批二维码,二维码包含产品相关信息,扫描二维码可以获取相关产品信息


实现方法demo:



const fs = require('fs')
const crypto = require('crypto')
const xlsx = require('node-xlsx')
const qr = require('qr-image')
const base_url = 'https://baidu.com'   //业务实现地址 写你自己的 写百度不好使
const secret_key = 'HFJK34Fb'          //数据密码 key 自己动手改下吧 记得 仅支持8位字符
const file = './2018-7-7.xlsx'        //excel 文件 数据源 
// 读取excel文件
let read_file = async (file) => {
    let data = await xlsx.parse(file)
    // 其实可以多个的 自己实现下吧
    if (data.length > 1) {
        throw new Error('execl表只能有一页数据,请手动拆分')
    }
    data = data[0]
    let name = data.name
    data.data.shift()       //删除第一条头信息
    let dataObj = data.data.map((item) => {
        let number, pwd, retailer, price, goodInfo
        [number, pwd, retailer, price, goodInfo] = item    //es6 解构赋值
        return {
            number: number,
            pwd: pwd,
            retailer: retailer,
            price: price,
            goodInfo: goodInfo
        }
    })
    return { name : name, data: dataObj }
}


// 数据加密url拼接
let encrypt_data = async (data) => {
    let urls =  data.map((item)=>{
        //数据加密
        let param = JSON.stringify(item)
        param = des_encrypt(param, secret_key)  // 如果为了安全 还可以做签名 怎么玩你说了算
        return `${base_url}?param=${param}`
    })
    return urls
}

//批量处理生产二维码
let create_QR_code = async (file) => {
    let data = await read_file(file)
    let urls = await encrypt_data(data.data)
    //创建目录
    let dir_path = `${__dirname}/${data.name}`
    if(!fs.existsSync(dir_path)){
        fs.mkdirSync(dir_path, '777');  //创建目录 path 路径 '777' 目录权限
    }
    //批量生产二维码
    for(let i=0; i< urls.length; i++){
        let file_name =  data.data[i].number    //文件名
        let qr_svg = qr.image(urls[i], {type: 'png'})       // 参数 : 内容  二维码格式
        qr_svg.pipe(fs.createWriteStream(`${dir_path}/${file_name}.png`));  //路径
    }
}
create_QR_code(file)
/***
 * des 加密方法   后续会专门更新一篇加解密文章
 * @param text  加密内容
 * @param key   加密key 必须8位
 */
function des_encrypt(text, key){
    let cipher = crypto.createCipheriv("des-ecb", new Buffer(key), new Buffer(0));
    let encrypt = cipher.update(text, 'utf8', 'base64');
    encrypt += cipher.final('base64');
    return encrypt;
}