const { Controller } = require('egg'); const sha256 = require("crypto-js/sha256"); const CryptoJS = require("crypto-js"); const XLSX = require('xlsx'); const fs = require('fs'); const KEY = CryptoJS.enc.Utf8.parse('BDQH'); class BaseController extends Controller { shaForm = (body, salt) => { return sha256(sha256(body).toString() + salt).toString(); } encryptRequest = (body) => { return CryptoJS.AES.encrypt(body, KEY, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(); } decryptRequest = (body) => { return CryptoJS.AES.decrypt(body, KEY, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(CryptoJS.enc.Utf8); } // 用户uid生成函数 generateNumberString = (side) => { // 获取当前日期(年月日) const now = new Date(); const year = String(now.getFullYear()).padStart(4, '0'); const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始,所以加1 const date = String(now.getDate()).padStart(2, '0'); const dateString = year + month + date; // 获取当前时间戳的后三位 const timestamp = String(Date.now()).slice(-3); // 生成三位随机数字 const randomDigits = Math.floor(Math.random() * 100).toString().padStart(3, '0'); // 组合成最终的15位字符串 const fullNumberString = dateString + timestamp + randomDigits + side; return fullNumberString; } // 随机盐生成函数 generateRandomString = () => { const lowerCaseLetters = 'abcdefghijklmnopqrstuvwxyz'; const upperCaseLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; const numbers = '0123456789'; let result = ''; // 生成5位随机小写字母 for (let i = 0; i < 5; i++) { const randomIndex = Math.floor(Math.random() * lowerCaseLetters.length); result += lowerCaseLetters[randomIndex]; } // 生成5位随机大写字母 for (let i = 0; i < 5; i++) { const randomIndex = Math.floor(Math.random() * upperCaseLetters.length); result += upperCaseLetters[randomIndex]; } // 生成2位随机数字 for (let i = 0; i < 2; i++) { const randomIndex = Math.floor(Math.random() * numbers.length); result += numbers[randomIndex]; } // 打乱整个字符串 const characters = result.split(''); for (let i = characters.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [characters[i], characters[j]] = [characters[j], characters[i]]; } return characters.join(''); } // 随机生成12位客户端id generateClientId = () => { const numbers = '0123456789'; let result = ''; // 生成4位随机数字 for (let i = 0; i < 4; i++) { const randomIndex = Math.floor(Math.random() * numbers.length); result += numbers[randomIndex]; } // 打乱整个字符串 const characters = result.split(''); for (let i = characters.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [characters[i], characters[j]] = [characters[j], characters[i]]; } // 获取当前日期(年月日) const now = new Date(); const year = String(now.getFullYear()).padStart(4, '0'); const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始,所以加1 const date = String(now.getDate()).padStart(2, '0'); const dateString = year + month + date; const fullNumberString = dateString + characters.join(''); return fullNumberString; } checkUid = async (ctx) => { const token = ctx.request.header.authorization; const redis = ctx.app.redis; const insiders = await redis.get('db2').get(token); return insiders ? insiders : false; }; setResponse = (ctx, code, msg, model, data = {}) => { const modelType = { "none": { code, msg }, "deconstruction": { code, msg, ...data }, "polymerization": { code, msg, data } } ctx.body = modelType[model]; } downloadData = (form, data, dataHeaders) => { let extensionName = ['.xlsx', '.xls', '.csv'], buf; const { sheetName, fileName, extensionType } = form; if (extensionName[extensionType] == '.xlsx' || extensionName[extensionType] == '.xls') { // 使用xlsx库将数据转换为工作表和工作簿 const ws = XLSX.utils.json_to_sheet(data); // 动态设置表头 dataHeaders.forEach((header, index) => { const cellRef = XLSX.utils.encode_cell({ r: 0, c: index }); // 生成单元格引用,如A1, B1等 ws[cellRef] = { v: header, t: "s" }; // 设置单元格的值和类型 }); // 创建一个新的工作簿并添加工作表 const wb = XLSX.utils.book_new(); // 将工作表添加到工作簿中,并指定其名称 XLSX.utils.book_append_sheet(wb, ws, sheetName); if (extensionName[extensionType] == '.xlsx') { // 将工作簿写入字符串(二进制) buf = XLSX.write(wb, { bookType: 'xlsx', type: 'array' }); } else if (extensionName[extensionType] == '.xls') { // 将工作簿写入字符串(二进制) buf = XLSX.write(wb, { bookType: 'xls', type: 'array' }); } } else if (extensionName[extensionType] == '.csv') { // 将数据转换为CSV格式的字符串 buf = data.map(row => row.join(',')).join('\n') + '\n'; } // 将文件的内容返回给控制器作为响应体发送给客户端 if (buf) { const completeName = fileName + extensionName[extensionType]; const filePath = 'app/public/' + completeName; // const filePath = '/disk/a/Download/' + completeName; return { filePath, completeName, buf }; }; return false; }; } module.exports = BaseController;