/*
* @Date: 2022-06-08 14:36:42
* @LastEditors: zeng 1459584248@qq.com
* @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 详细的信息
作者: 曾记大排档 1459584248@qq.com 微信: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('�
没有合适的资源?快使用搜索试试~ 我知道了~
基于go语言实现的开源节假日的管理系统,节假日OpenApi管理查询系统,提供简单高效的查询接口,占用很少的系统内存即可
共10个文件
js:3个
json:2个
license:1个
需积分: 1 0 下载量 131 浏览量
2024-09-02
15:30:36
上传
评论
收藏 86KB ZIP 举报
温馨提示
简介 此系统比较简单,是一个节假日的管理系统,主要提供了以下功能: 节假日的管理页面,可以进行增删查改 提供了一个简单的节假日查询接口,可以查询当天是否是节假日 该系统开发语言为go,效率非常高,占用内存非常小 开源说明 该系统是在本人工作中发现一些必要的情况下,需要查询某些日子是否是工作日,从而进行一些逻辑判断, 而以前的公共API已经不再提供,之前使用了timor提供的节假日查询API,但是不太稳定,时常被黑客攻击, 于是打算自己写一个本地的离线节假日查询 本项目由我自己开发完成,欢迎大家根据自行需要进行二次开发 技术框架 语言选择:Golang 路由框架:Gin orm框架:gorm 数据库:mysql 程序启动 安装go运行环境 安装go代理 运行项目代码中的sql语句,初始化数据库,修改infrustructure/config下的dbConnection.go中的数据局连接信息 执行go命令,启动项目 nohup go run main.go &
资源推荐
资源详情
资源评论
收起资源包目录
ggf34443.zip (10个子文件)
.env 296B
LICENSE 11KB
docs
remark.png 79KB
generate.js 1005B
package.json 424B
service
LEGAL_CONFIG.JSON 4KB
legal.js 11KB
.envexplame 297B
index.js 1KB
.gitignore 31B
共 10 条
- 1
资源评论
程序猿小D
- 粉丝: 4188
- 资源: 842
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功