前端使用Elemnt-ui如何控制日期不能选择节假日

项目中有需求:
判断指定日期,是否为节假日、双休日、工作日。

简单想了下,双休日可能也上班,工作日可能休息。另外每年的节假日,放假时间,还真不知道!
自己做不出来,就在网上找答案:

推荐一篇文章:
	https://www.aspirantzhang.com/learning/is-holiday.html

没细看,看他里面提到了 'juhe.cn' 聚合数据,申请了下接口,免费用户每天100次,但是只能判断是否为 '假期',并不能判断,今天是否休息!例如:星期日,是休息日,但是得上班。

在网上搜日历:
	百度:日历

各种万年历哈,百度的、其他的...

百度的就很好,但是分析了半天,找不到它调用的接口,最终找到了(本来都打算用其他家的了,也可以分析出来,但是肯定速度没百度的快!),处理了下,可以判断出来。这里分享下代码,laravel 框架的(不要吐槽代码质量,我就这水平)


// 门面类(Facades)
use Illuminate\Support\Facades\Cache;

// 其他底层类
use GuzzleHttp\Client;

/**
 * 通过 『百度』 获取万年历 - 获取单月
 */
if ( !function_exists('baidu_calendar_days')) {
    function baidu_calendar_days($month = '')
    {
        $api_url = 'http://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query={month}&co=&resource_id=6018';

        // 未传入日期,取当天日期
        if(empty($month)){
            $month = date('Y年n月');

        // 传入的是 『时间戳格式』
        }elseif(strpos($month, '-') === false){
            $month = date('Y年n月', $month);

        // 传入的是 『YYYY-MM-DD格式 或 YYYY-MM 等其他格式』
        }else{
            $month = date('Y年n月', strtotime($month));
        }

        $api_url = str_replace('{month}', $month, $api_url);

        // 借助 Guzzle 发起请求
        $client = new Client();
        $response = $client->request('GET', $api_url, [
            'headers' => [
            ],
            // 发现 query 为 [],一直报错!(这里先记录下,按理说不应该报错!允许这种写法!)
            // 'query' => [
            // ],
        ]);
        $body = $response->getBody();
        $content = $body->getContents();
        $content = mb_convert_encoding($content, 'UTF-8', 'GBK');
        $content_to_json = json_decode($content, true);

        if($content_to_json['status'] == 0){
            return error(0, '获取日期成功!', ['days' => $content_to_json['data'][0]]);
        }else{
            return error(1, '获取日期失败!');
        }
    }
}

/**
 * 通过 『百度』 获取万年历 - 判断当天是否休息
 */
if ( !function_exists('day_type')) {
    function day_type($date = '')
    {

        /*
            holiday - 节假日
            weekend - 双休
            weekday - 工作日
         */

        // 获取月份
        $date = $date ?: date('Y-m-d');

        // 优先从缓存中获取
        $cache_key = 'day_type_' . $date;
        if(Cache::has($cache_key)){
            return Cache::get($cache_key);
        }

        $month = date('Y-n', strtotime($date));
        $days = baidu_calendar_days($month);
        if($days['errno'] != 0){
            $day_type = 'weekday';
        }else{

            // 如果当月存没有节假日,正常的周六、日休息
            if(empty($days['days']['holiday'])){
                $day_week = date('w', strtotime($date));
                if($day_week == 0 || $day_week == 6){
                    return 'weekend';
                    $day_type = 'weekend';
                }else{
                    $day_type = 'weekday';
                }
            }else{

                // 如果当月存有节假日,我们优先判断是否节假日
                $day_type = '';
                foreach($days['days']['holiday'] as $holidays){
                    foreach($holidays['list'] as $holiday){
                        if(date('Y-n-j', strtotime($date)) == $holiday['date']){

                            // 节假日中 status == 1,表示 '节假日'
                            if($holiday['status'] == 1){
                                $day_type = 'holiday';

                            // 节假日中 status == 2,表示 '工作日'
                            }elseif($holiday['status'] == 2){
                                $day_type = 'weekday';
                            }
                        }
                    }
                }

                // 未匹配到节假日,正常的周六、日休息
                if(empty($day_type)){

                    // 未匹配到节假日,正常的周六、日休息
                    $day_week = date('w', strtotime($date));
                    if($day_week == 0 || $day_week == 6){
                        $day_type = 'weekend';
                    }else{
                        $day_type = 'weekday';
                    }
                }
            }
        }

        // 设置缓存
        Cache::forever($cache_key, $day_type);
        return $day_type;
    }
}

/**
 * 通过 'www.juhe.cn' 获取万年历
 */
if ( !function_exists('juhe_calendar_day')) {
    function juhe_calendar_day($date = '')
    {
        $app_key = 'cf144c4025f46dce0de5820a76c40090';
        $api_url = 'http://v.juhe.cn/calendar/day';

        // 未传入日期,取当天日期
        if(empty($date)){
            $date = date('Y-n-j');

        // 传入的是 『时间戳格式』
        }elseif(strpos($date, '-') === false){
            $date = date('Y-n-j', $date);

        // 传入的是 『YYYY-MM-DD格式』
        }else{
            $date = date('Y-n-j', strtotime($date));
        }

        // 借助 Guzzle 发起请求
        $client = new Client();
        $response = $client->request('GET', $api_url, [
            'query' => [
                'key' => $app_key,
                'date' => $date,
            ],
        ]);
        $body = $response->getBody();
        $content = $body->getContents();
        $content_to_json = json_decode($content, true);

        /*
            返回值判断:
                1.有 'holiday' 元素,说明是 '节假日',肯定 '休息'
                2.无 'holiday' 元素,其他时间,无法判断是否 '休息'
         */
        if($content_to_json['error_code'] == 0){
            return error(0, '获取日期成功!', ['date' => $content_to_json['result']['data']]);
        }else{
            return error(1, '获取日期失败!失败原因:' . $content_to_json['reason']);
        }

        // https://www.baidu.com/cache/aladdin/ui/lunar6/lunar6.js?v=20170208
    }
}

/**
 * 通过 'https://wannianrili.51240.com/' 获取万年历 - 获取单月
 */
if ( !function_exists('wannianrili_calendar_days')) {
    function wannianrili_calendar_days($month = '')
    {
        $api_url = 'https://wannianrili.51240.com/ajax/?q=2018-06';

        // 这里返回的是 html 结构,我们可以使用 『QueryList』 来解析
    }
}

你可能感兴趣的:(前端使用Elemnt-ui如何控制日期不能选择节假日)