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.pswp.cn/web/91944.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91944.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91944.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何给Word和WPS文档添加密码或取消密码

要保护Word和WPS文档&#xff0c;可以为它们加密&#xff0c;加密有两类&#xff1a;打开密码和修改密码。密码设置有两个入口&#xff0c;一个是在另存为&#xff0c;一个是在文件菜单。Word和WPS文字的路径略有不同&#xff0c;微软Office和WPS的其他套件也是如此操作。一、W…

uni-app项目gitignore文件示例

uni-app 忽略以下文件和目录 DS_Store 忽略 UniApp 编译生成的小程序相关目录 unpackage/ uni_modules/ 忽略编辑器自动生成的文件 idea/ vscode/ 忽略日志文件 logs/ 忽略临时文件 temp/ 忽略构建工具自动生成的文件 build/ 忽略 npm 安装的包文件 package-lock.json yarn.loc…

LeetCode 135:分糖果

LeetCode 135&#xff1a;分糖果问题本质与核心挑战 给定孩子的评分数组&#xff0c;需满足 “每个孩子至少1颗糖果&#xff0c;相邻评分高的孩子糖果更多”&#xff0c;求最少糖果总数。核心挑战&#xff1a; 相邻约束是双向的&#xff08;左→右和右→左都需满足&#xff09;…

【QT】安装与配置

个人主页&#xff1a;Guiat 归属专栏&#xff1a;QT 文章目录1. QT简介与准备工作1.1 什么是QT1.2 QT的版本选择1.3 系统要求检查2. QT安装方式详解2.1 官方在线安装器2.2 离线安装包2.3 包管理器安装3. Windows平台安装配置3.1 Windows安装步骤3.2 环境变量配置3.3 Visual Stu…

Java从入门到精通 - 算法、正则、异常

算法、正则、异常 此笔记参考黑马教程&#xff0c;仅学习使用&#xff0c;如有侵权&#xff0c;联系必删 文章目录算法、正则、异常1. 常见算法1.1 简单认识算法1.1.1 什么是算法&#xff1f;1.1.2 为什么要学习算法&#xff1f;1.2 排序算法1.2.1 冒泡排序1.2.1.1 实现冒泡排…

题单【排序】

P1271 【深基9.例1】选举学生会 P1271 【深基9.例1】选举学生会 - 洛谷 【方法一】快速排序 使用sort()&#xff0c;注意数组的范围&#xff01;&#xff01;&#xff01; #include<bits/stdc.h> using namespace std;int a[2000000],n,m;int main() {cin>>n>&g…

【机器学习】(算法优化二)提升算法之:AdaBoost与随机梯度

文章目录一、 AdaBoost&#xff1a;自适应提升算法1、AdaBoost数学原理详解1.1、 目标函数1.2、 样本权重更新的逻辑1.3、 模型权重计算的含义1.4、 AdaBoost的核心思想2、为什么AdaBoost如此有效&#xff1f;二、 随机梯度提升算法&#xff1a;梯度优化下更精细的优化1、随机梯…

力扣 hot100 Day65

75. 颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地 对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函…

12.Linux 磁盘管理

Linux : 磁盘管理 一、磁盘设备命名规则磁盘类型设备命名模式示例特点SATA/SCSI/SAS/dev/sdXsda&#xff08;第一块硬盘&#xff09; sda1&#xff08;第一块硬盘第一分区&#xff09;机械硬盘/通用接口NVMe/dev/nvmeXnYpZnvme0n1&#xff08;第一通道第一块盘&#xff09; …

《Linux服务与安全管理》| DHCP服务器安装和配置

《Linux服务与安全管理》| DHCP服务器安装和配置 目录 《Linux服务与安全管理》| DHCP服务器安装和配置 一、点击“编辑虚拟机设置”&#xff0c;配置三台虚拟机为“仅主机”模式。 二、server01开机&#xff0c;root用户登录&#xff0c;输入nmtui&#xff0c;进入图形界面…

赛博威携手Dify,助力AI在企业的场景化落地

人工智能正以前所未有的速度重塑商业世界。我们经历了从理论探索到大语言模型&#xff08;LLM&#xff09;的爆发式增长&#xff0c;如今&#xff0c;一个以“AI Agent&#xff08;智能体&#xff09;”为核心的新阶段已然来临。AI Agent代表了人工智能应用的未来形态。它不再被…

嵌入式硬件中三极管推挽电路控制与实现

我们昨天讲到了这个电路。 如果 A 电是 PWM 波,那么请问 B 点是不是 PWM 波呢?那么,当 PWM 为高时, B 点的电流是从哪里流过来的?

数据结构——查找(三、树形查找)

一、二叉排序树&#xff08;BST&#xff09;1、二叉排序树的定义构造一棵二叉排序树的目的并不是排序&#xff0c;而是提高查找、插入和删除关键字的速度二叉排序树&#xff08;也称二叉搜索树&#xff09;或者是一颗空树&#xff0c;或者是具有以下性质的二叉树1、若左子树非空…

八股——Kafka相关

文章目录1、 消息队列的作用什么&#xff1f;思&#xff1a;消息队列是什么?消息队列的定义消息队列的工作原理消息队列的作用消息队列的常见类型消息队列的简单例子2、Kafka 集群的架构是什么样子的&#xff1f;3、Kafka 消费者组和生产者组是什么&#xff1f;定义与核心作用…

墨者学院SQL手工注入漏洞测试(MySQL数据库)题目,纯手工注入教程

打开练习手工注入的靶场,发现此时为一个登录页面,我们先试着登录看看注入点在不在登录页面 使用用户:or 1=1# 密码:admin123;尝试登录,发现显示错误后直接弹回原页面,无sql报错相关语句,这里不存在sql注入点 一:判断注入点以及猜测是否有注入 此时点击这里的动态页面…

[硬件电路-140]:模拟电路 - 信号处理电路 - 锁定放大器概述、工作原理、常见芯片、管脚定义

一、锁定放大器概述锁定放大器&#xff08;Lock-in Amplifier&#xff09;是一种基于相干检测技术的高灵敏度测量仪器&#xff0c;通过将待测信号与参考信号进行同步处理&#xff0c;从强噪声中提取微弱信号并精确测量其振幅与相位。其核心优势包括&#xff1a;信噪比提升&…

下载 | Windows Server 2025官方原版ISO映像!(7月更新、标准版、数据中心版、26100.4652)

⏩ 资源A066_Windows_Server_2025系统映像&#x1f536; Windows Server 2025官方原版ISO映像&#xff0c;7月更新版已放出。提供来自微软官方每月更新的ISO原版映像&#xff0c;内部包含了标准版和数据中心版&#xff0c;可选择无GUI界面版或桌面体验版&#xff0c;满足不同部…

Go 语言模糊测试 (Fuzz Testing) 深度解析与实践

学习一个知识&#xff0c;要先了解它的来源 1. 模糊测试的诞生&#xff1a;Barton Miller 的故事 “Fuzz”一词起源于1988年&#xff0c;由威斯康星大学麦迪逊分校的Barton Miller教授及其研究生团队在一个高级操作系统课程项目中提出 。这个概念的诞生颇具戏剧性。Miller教授在…

【软考和软著】

一、&#x1f4ab; 杭州E类人才政策 在这里插入图片描述 二、人才认定标准 三、关于软考 1、什么是软考&#xff1f; 软考指的是“计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试”。计算机软件资格考试是由国家人力资源和社会保障部、工业和信息化部领导下…

「源力觉醒 创作者计划」开源大模型重构数智文明新范式

起来轻松玩转文心大模型吧一文心大模型免费下载地址&#xff1a;https://ai.gitcode.com/paddlepaddle/ERNIE-4.5-VL-424B-A47B-Paddle开源大模型的崛起与AI幻觉挑战&#xff1a;中国AI发展的双重使命 ——从技术追赶到生态引领的跨越之路一、开源大模型&#xff1a;重构数智文…