北斗应用技术培训考试管理系统
This commit is contained in:
190
app/core/base_controller.js
Normal file
190
app/core/base_controller.js
Normal file
@@ -0,0 +1,190 @@
|
||||
const { Controller } = require('egg');
|
||||
|
||||
const sha256 = require("crypto-js/sha256");
|
||||
|
||||
const CryptoJS = require("crypto-js");
|
||||
|
||||
const XLSX = require('xlsx');
|
||||
|
||||
const fs = require('fs');
|
||||
|
||||
const archiver = require('archiver');
|
||||
|
||||
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 examManager = await redis.get('db7').get(token);
|
||||
return examManager ? examManager : 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;
|
||||
};
|
||||
|
||||
zipFolder = (sourceDir, outputZipPath) => {
|
||||
// 创建可写流来写入数据
|
||||
const output = fs.createWriteStream(outputZipPath); // 将压缩包保存到当前项目的目录下
|
||||
const archive = archiver('zip', { zlib: { level: 9 } }); // 设置压缩等级
|
||||
|
||||
// 建立管道连接
|
||||
archive.pipe(output);
|
||||
|
||||
// 压缩目录到压缩包中
|
||||
archive.directory(sourceDir + '/', false);
|
||||
|
||||
// 完成压缩
|
||||
archive.finalize();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = BaseController;
|
||||
Reference in New Issue
Block a user