当前位置: 首页 > news >正文

vk框架或者普通函数封装的一些函数可以拿取使用【会持续更新】

1.身份证校验【通用】

/*** @function isIDCard* @description 判断是否为有效的身份证号码。* @param {string} idCard - 待验证的身份证号码。* @returns {boolean} 返回验证结果。*/
pubFun.isIDCard = function (idCard) {// 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符Xlet reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;if (!reg.test(idCard)) {return false;}// 校验省份代码let provinceCode = idCard.substring(0, 2);let provinceList = {'11': '北京', '12': '天津', '13': '河北', '14': '山西', '15': '内蒙古','21': '辽宁', '22': '吉林', '23': '黑龙江','31': '上海', '32': '江苏', '33': '浙江', '34': '安徽', '35': '福建', '36': '江西', '37': '山东','41': '河南', '42': '湖北', '43': '湖南', '44': '广东', '45': '广西', '46': '海南','50': '重庆', '51': '四川', '52': '贵州', '53': '云南', '54': '西藏','61': '陕西', '62': '甘肃', '63': '青海', '64': '宁夏', '65': '新疆','71': '台湾', '81': '香港', '82': '澳门'};if (!provinceList[provinceCode]) {return false;}// 校验出生日期let year = idCard.length === 15 ? '19' + idCard.substring(6, 8) : idCard.substring(6, 10);let month = idCard.length === 15 ? idCard.substring(8, 10) : idCard.substring(10, 12);let day = idCard.length === 15 ? idCard.substring(10, 12) : idCard.substring(12, 14);let date = new Date(year + '-' + month + '-' + day);if (date.toString() === 'Invalid Date') {return false;}// 18位身份证需要校验最后一位if (idCard.length === 18) {let factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];let parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];let sum = 0;for (let i = 0; i < 17; i++) {sum += parseInt(idCard.charAt(i)) * factor[i];}let last = parity[sum % 11];if (last.toUpperCase() !== idCard.charAt(17).toUpperCase()) {return false;}}return true;
}

2. 用于自定义时间范围得到x,y图表数据统计【通用】

		/*** 通用时间维度统计(金额 = total_fee - refund_fee)* @param {Array} records - 数据源数组(数据库查询结果)* @param {String} dateField - 时间字段名(如 pass_time)* @param {String} type - 'day' | 'week' | 'month' | 'custom'* @param {Number} startTime - 自定义开始时间(时间戳)* @param {Number} endTime - 自定义结束时间(时间戳)* @returns {Object} { xAxis: [], counts: [] }*/function statByTimeRange(records, dateField, type, startTime, endTime) {const pad = n => String(n).padStart(2, '0');const xAxis = [];const countsMap = {};const counts = [];// 统一的累加逻辑:total_fee - refund_fee(如果 refund_fee 为 undefined 则视为 0)const calcAmount = r => {const fee = Number(r.total_fee || 0);const refund = Number(r.refund_fee || 0);return fee - refund;};if (type === 'today') {for (let i = 0; i < 24; i++) {const label = `${pad(i)}:00`;xAxis.push(label);countsMap[i] = 0;}records.forEach(r => {const hour = new Date(r[dateField]).getHours();countsMap[hour] += calcAmount(r);});counts.push(...xAxis.map(label => {const hour = parseInt(label);return countsMap[hour] || 0;}));} else if (type === 'week') {const weekLabels = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];for (let i = 0; i < 7; i++) {xAxis.push(weekLabels[i]);countsMap[i] = 0;}records.forEach(r => {const day = new Date(r[dateField]).getDay(); // 周日=0const index = day === 0 ? 6 : day - 1;countsMap[index] += calcAmount(r);});counts.push(...weekLabels.map((_, i) => countsMap[i]));} else if (type === 'month') {const baseDate = new Date(records[0]?.[dateField] || Date.now());const year = baseDate.getFullYear();const month = baseDate.getMonth();const daysInMonth = new Date(year, month + 1, 0).getDate();for (let i = 1; i <= daysInMonth; i++) {const label = pad(i);xAxis.push(label);countsMap[label] = 0;}records.forEach(r => {const d = new Date(r[dateField]);const label = pad(d.getDate());countsMap[label] += calcAmount(r);});counts.push(...xAxis.map(label => countsMap[label]));} else if (type === 'custom') {if (!startTime || !endTime) {throw new Error("自定义时间统计需提供 startTime 和 endTime");}const diff = endTime - startTime;const oneDayMs = 86400000;if (diff <= oneDayMs) {// 小于等于一天,按小时统计for (let i = 0; i < 24; i++) {const label = `${pad(i)}:00`;xAxis.push(label);countsMap[i] = 0;}records.forEach(r => {const hour = new Date(r[dateField]).getHours();countsMap[hour] += calcAmount(r);});counts.push(...xAxis.map(label => {const hour = parseInt(label);return countsMap[hour] || 0;}));} else {// 跨天,按日期统计for (let ts = startTime; ts <= endTime; ts += oneDayMs) {const d = new Date(ts);const label = `${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;xAxis.push(label);countsMap[label] = 0;}records.forEach(r => {const d = new Date(r[dateField]);const label = `${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;if (countsMap[label] !== undefined) {countsMap[label] += calcAmount(r);}});counts.push(...xAxis.map(label => countsMap[label]));}}return { xAxis, counts };}

3.按星期几统计数据,可用于计算一周内的金额或者个数!【通用】

/*** 按星期几统计数据* @param {Array} records - 要统计的数据数组(如数据库查询结果)* @param {String} dateField - 记录中表示日期/时间戳的字段名(如 "_add_time"、"register_date")* @param {Function} valueFn - 统计函数,接收每条记录,返回要累加的数值(如 r => 1 统计数量,r => r.total_fee 统计金额)* @returns {Array} 长度为7的数组,依次为[周一, 周二, ..., 周日]的统计结果*/function statByWeek(records, dateField, valueFn) {let arr = new Array(7).fill(0);records.forEach(record => {if (record[dateField]) {let day = new Date(record[dateField]).getDay();let index = day === 0 ? 6 : day - 1;arr[index] += valueFn(record);}});return arr;}

4.可用于“同比昨日”【通用】

		/*** 聚合统计昨天和今天的某个字段(金额/数量等)* @param {Object} params* @param {Object} params.db - db对象* @param {String} params.collection - 集合名* @param {String} params.timeField - 时间字段名(如 _add_time、register_date)* @param {Number} params.yesterdayStart - 昨日开始时间戳* @param {Number} params.yesterdayEnd - 昨日结束时间戳* @param {Number} params.todayStart - 今日开始时间戳* @param {Number} params.todayEnd - 今日结束时间戳* @param {Object} [params.extraMatch] - 额外match条件(如 {type: 'iou'})* @param {String} [params.sumField] - 求和字段名(如 total_fee),不传则统计数量* @returns {Promise<{today: number, yesterday: number}>}*/async function aggregateTodayYesterday({db,collection,timeField,yesterdayStart,yesterdayEnd,todayStart,todayEnd,extraMatch = {},sumField}) {// 构造match条件let match = Object.assign({}, extraMatch, {[timeField]: { $gte: yesterdayStart, $lte: todayEnd }});// 构造grouplet group = {_id: null,today: {$sum: {$cond: [{$and: [...(sumField ? [] : [extraMatch && extraMatch.type ? { $eq: [`$type`, extraMatch.type] } : []]),{ $gte: [`$${timeField}`, todayStart] },{ $lte: [`$${timeField}`, todayEnd] }]},sumField ? `$${sumField}` : 1,0]}},yesterday: {$sum: {$cond: [{$and: [...(sumField ? [] : [extraMatch && extraMatch.type ? { $eq: [`$type`, extraMatch.type] } : []]),{ $gte: [`$${timeField}`, yesterdayStart] },{ $lte: [`$${timeField}`, yesterdayEnd] }]},sumField ? `$${sumField}` : 1,0]}}};let aggRes = await db.collection(collection).aggregate().match(match).group(group).end();let today = aggRes.data?.[0]?.today || 0;let yesterday = aggRes.data?.[0]?.yesterday || 0;return { today, yesterday };}

http://www.dtcms.com/a/308320.html

相关文章:

  • 谷歌devtools检查文本资源是否已压缩
  • 【LeetCode 热题 100】20. 有效的括号
  • 使用 Docker 部署 Apache RocketMQ
  • 数据转换能干什么?有哪些好用的数据转换方法?
  • 剖析客户服务痛点,借助 Baklib 整合多渠道反馈
  • ADW300 物联网仪表:引领能源计量智能化变革
  • STM32标准库搭建示例(STM32F103C8T6)
  • 操作系统:上下文切换(Context Switch)
  • Effective C++ 条款13:以对象管理资源
  • LLC电源原边MOS管DS增加RC吸收对ZVS的影响分析
  • Linux和shell
  • 保姆级别IDEA关联数据库方式、在IDEA中进行数据库的可视化操作(包含图解过程)
  • ceph sc 设置文件系统格式化参数
  • 前端ESLint扩展的用法详解
  • 【实时Linux实战系列】实时图像处理应用开发
  • 【PHP类的基础概念:从零开始学面向对象】
  • Elasticsearch DSL 核心语法大全:match、bool、range、聚合查询实战解析
  • 使用神经网络与5折交叉验证进行基因组预测:基础知识指南
  • Java【代码 21】将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
  • 智谱 AI 重磅发布 GLM-4.5:开源 SOTA,专为下一代智能体应用打造
  • 微服务架构技巧篇——接口类设计技巧
  • review|
  • Day15--二叉树--222. 完全二叉树的节点个数,110. 平衡二叉树,257. 二叉树的所有路径,404. 左叶子之和
  • 企业级部署 (基于tomcat与nginx)
  • 新书速览|R语言数据分析从入门到实践
  • Linux大页内存导致服务内存不足
  • Docker部署的PostgreSQL慢查询日志配置指南
  • 当文档包含图文混排表格时,如何结合大模型(如DeepSeek-VL)和OCR提取数据
  • 468. 验证IP地址
  • Ps2025