/*
* @Date: 2022-06-08 14:36:42
* @LastEditors: zeng [email protected]
* @LastEditTime: 2022-10-18 16:08:28
* @FilePath: \software-iot-interface-project\app\service\cache.js
*/
const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs');
const env = require('dotenv').config()
/**
* @name: 法定节假日 服务
* @return {*}
* @auto: zengye
* @Date: 2022-06-08 14:36:51
* @LastEditTime: Do not edit
*/
class LegalService {
/**
* 初始化构造函数
* @param {*} service
*/
constructor() {
// 保存的 json文件名
const config_file_name = 'LEGAL_CONFIG.json';
// 前缀 注释
const remark_preifx = `
参数: legal 所有节假日的日期
参数: legalWork 所有法定加班日的日期
参数: legalWork 详细的信息
作者: 曾记大排档 [email protected] 微信:zeng1569838235
`;
this.options = {
url: env.parsed.URL || 'http://www.gov.cn/zhengce/content/2021-10/25/content_5644835.htm', // 爬取的url
query_legal_url: env.parsed.QUERY_LEGAL,
date_join: '-' , // 日期格式为: xxxx-xx-xx
config_file: __dirname + '/' + config_file_name, // 配置文件路径
config_file_name: config_file_name, // 文件名
remark_preifx: remark_preifx
}
// 所有的信息
this.legalObj = {};
// 法定节假日
this.legal = [];
// 法定工作日 (补班)
this.legalWork = [];
// 进行获取到变量
this.getDataFile();
}
/**
* 获取到 变量 放假 工作日加班
* @returns
*/
async getLegal(){
if (!this.legal || this.legal.length == 0) {
await this.curlLegal();
}
return {
legal: this.legal,
legalWork: this.legalWork,
legalObj: this.legalObj,
}
}
/**
* 判断传递的日期 是否为法定节假日
* @param {*} dateStr 传递的日期 或 时间戳
* @returns
*/
checkDateStr (dateStr = '') {
let date = null;
if (!dateStr) {
date = new Date();
} else {
// 判断是否为时间戳 还是日期格式 如果是时间戳 判断是否为 常用时间戳 (js中需要乘以1000)
date = new Date(
dateStr - 0 == dateStr ?
(dateStr.toString().length == 10 ? (dateStr - 0 ) * 1000 : dateStr - 0)
: dateStr
);
}
// 返回的对象
const obj = {
legalDay: 0, // 不是法定节假日
legalWorkDay: 0, // 不是 法定加班日
restDay: 0, // 不是休息日
}
// 日期字符串 判断是否周末周日
dateStr = this.getDateStr(date);
obj.dateStr = dateStr;
if (this.legal.indexOf(dateStr) != -1) {
obj.legalDay = 1;
obj.restDay = 1;
} else if (this.legalWork.indexOf(dateStr) != -1) {
obj.legalWorkDay = 1;
} else if([6,0].indexOf(date.getDay() - 0) != -1){
obj.restDay = 1;
}
return obj;
}
/**
* 爬取到 法定节假日 和 法定工作日
* @url http://www.gov.cn/zhengce/content/2021-10/25/content_5644835.htm
*/
async curlLegal() {
request(this.options.url, (error, response, body) => {
if (!error && response.statusCode == 200) {
// 请求成功的处理逻辑,注意body是json字符串} console.log(body)
const $ = cheerio.load(body);
const legal = [];
const legalWork = [];
$("#UCAP-CONTENT p").each((v,item)=>{
const txt = $(item).text();
// 传递字符串 处理中
this.getChangeTitleStr(txt, legal, legalWork);
})
this.legal = legal;
this.legalWork = legalWork;
this.saveDataFile();
}
});
}
/**
* 爬取到 具体的 法定工作日 公布情况
* @url http://search.www.gov.cn/search/fw/index.do?q=%E8%8A%82%E5%81%87%E6%97%A5
*/
async curlQueryLegalUrl() {
const postData = {
webid: 1,
criteria_field_360: '',
criteria_field_364: '',
criteria_field_363: '',
q: '节假日',
group: true,
p: 1,
pg: 10,
category: 'fwxx',
selectFields: 'pkid,title,url,createdate',
highlightFields: 'title',
pos: 'title,keyword',
};
// 爬取数据中
request.post({
url: this.options.query_legal_url,
form: postData,
json: true,
}, (err,httpResponse,body) => {
if (!err && body) {
let url = '';
for(const i in body.items) {
const item = body.items[i].data;
if(item.title.indexOf('日历') != -1 && item.title.indexOf('节假日') != -1 ) {
url = item.url;
break;
}
}
// 保存到env文件中
url && this.saveEnv(url);
}
})
}
/**
* 通过读取env文件 并替换掉需要查询的url
*/
saveEnv(url) {
try{
this.options.url = url;
let str = fs.readFileSync('.env').toString('utf-8');
str = str.replace(/((URL = |URL= |URL =)((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+)|(URL =|URL=|URL)/g,'URL = ' + url);
fs.writeFile('.env', str,err => {
!err && console.log("写入到.env配置文件成功")
});
}catch(err){
console.log('错误', err);
}
}
/**
* 保存到json文件
*/
saveDataFile() {
const updated_at = new Date().toLocaleString();
const remark = this.options.remark_preifx + "\n\r更新日期:" + updated_at;
const data = {legal: this.legal,legalWork: this.legalWork,legalObj: this.legalObj, remark,updated_at}
fs.writeFile(this.options.config_file,JSON.stringify(data, null, 4), err => {
if(!err) console.log("success~");
});
}
/**
* 通过 文件来读取 变量
*/
getDataFile() {
try{
const data = fs.readFileSync(this.options.config_file);
const str = data.toString();
if(str) {
const obj = JSON.parse(str)
for(const i in obj) {
this[i] = obj[i];
}
} else {
// 重新爬取
this.curlLegal();
return false;
}
}catch(Err){
this.curlLegal();
return false;
}
}
/**
* 需要解析的文本
* @param {*} txt 需要解析的文本
* @param {*} legal 节假日
* @param {*} legalWork 工作日
* @returns
*/
getChangeTitleStr(txt,legal, legalWork) {
const year = new Date().getFullYear();
if (!txt || txt.indexOf('、') == -1 || txt.indexOf(':') == -1 || txt.indexOf('共') == -1) {
return true;
}
// 获取到 什么节
const matchs = txt.match(/、[\u4e00-\u9fa5]{1,10}/g);
if (!matchs) {
return true;
}
const legalTitle = matchs[0].toString().substr(1);
// 获取到 放假天数
const dayMatchs = txt.match(/共\d{1,2}天/g);
if (!dayMatchs || dayMatchs.length == 0) {
return true;
}
const day = parseFloat(dayMatchs[0].split('�
没有合适的资源?快使用搜索试试~ 我知道了~
基于vue和JavaScript实现的自动获取法定节假日-法定工作日-休息日等分享给需要的同学

共10个文件
js:3个
json:2个
license:1个

需积分: 1 0 下载量 115 浏览量
2024-09-02
15:34:03
上传
评论
收藏 86KB ZIP 举报
温馨提示
1 自动获取法定节假日 项目体积小全程代码逻辑不超过1kb 性能高 1ms响应 2 自动获取法定加班(调休)日 3 已封装为接口 传递格式:2022-10-01 或 2022-1-1 或 时间戳 1664553600 会自动判断是否为节假日 法定加班日 休息日等 4 智能化 自动会进行获取最新的法定节假日 一年执行一次命令 npm run genurl (如果需要的话 也可以弄成 自动判断) 文档如下:需要跑到项目目录下 安装扩展: npm i 生成json (可忽略此步 代码内会自动进行判断生成) npm run gen 运行 npm run dev 访问: http://127.0.0.1:5200/legra 如果是在服务器运行 注意ip需要改 例2:带日期格式的 http://127.0.0.1:5200/legra?date=2022-10-01 例3:带时间戳的 http://127.0.0.1:5200/legra?date=1664553600 如果不想每年都自己去找法定节假日的url链接 那么直接运行命令(会自动更新.env文件的url查询地址): npm run
资源推荐
资源详情
资源评论






























收起资源包目录














共 10 条
- 1
资源评论


程序猿小D
- 粉丝: 5155
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 【Android应用源码】自定义动画toast.zip
- 【Android应用源码】自动发送短信.zip
- 【Android应用源码】自动开关机实现.zip
- 永磁同步电机的5次7次电流谐波注入补偿Simulink模型仿真
- 现代密码学:理论与实践精华
- python定量数据扰乱
- python-新旧映射
- maven下载安装与配置教程.md
- 模拟IC技术:BlueCoreTM3-Flash与BlueCore3-Audio Flash集成电路特性解析及其应用
- 孤岛模式下双台逆变器下垂控制技术:确保电网频率与电压稳定
- maven下载安装与配置教程.md
- maven下载安装与配置教程.md
- 【Android应用源码】最全的OCR图像识别技术源码内有说明.zip
- 【Android应用源码】左右翻页翻书.zip
- maven下载安装与配置教程.md
- elasticsearch-6.6.2版本相关的压缩包
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
