HEX
Server: nginx/1.28.1
System: Linux 10-41-63-61 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64
User: www (1001)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot//fuwufei.xxlht.com1/application/home/controller/Buildhtml.php
<?php
/**
 * 易优CMS
 * ============================================================================
 * 版权所有 2016-2028 海南赞赞网络科技有限公司,并保留所有权利。
 * 网站地址: http://www.eyoucms.com
 * ----------------------------------------------------------------------------
 * 如果商业用途务必到官方购买正版授权, 以免引起不必要的法律纠纷.
 * ============================================================================
 * Author: 小虎哥 <1105415366@qq.com>
 * Date: 2018-4-3
 */

namespace app\home\controller;
use think\Db;
use think\template\driver\File;

class Buildhtml extends Base
{

    public function _initialize() {
        parent::_initialize();
    }

    /*
     * 清理缓存
     */
    private function clearCache(){
        cache("channel_page_total_serialize",null);
        cache("channel_info_serialize",null);
        cache("has_children_Row_serialize",null);
        cache("article_info_serialize",null);
        cache("article_page_total_serialize",null);
        cache("article_tags_serialize",null);
        cache("article_attr_info_serialize",null);
        cache("article_children_row_serialize",null);
    }
    
    /*
     * 获取全站生成时,需要生成的页面的个数
     */
    public function buildIndexAll(){
        $this->clearCache();
        $channelData = $this->getChannelData(0);
        $articleData = $this->getArticleData(0,0);
        $msg = $this->handleBuildIndex();
        $allpagetotal = 1+ $channelData['pagetotal'] + $articleData['pagetotal'];

        $this->success($msg,null,["achievepage"=>1,"channelpagetotal"=>$channelData['pagetotal']
            ,"articlepagetotal"=>$articleData['pagetotal'],"allpagetotal"=>$allpagetotal]);
    }

    /*
     * 生成首页静态页面
     */
    public function buildIndex()
    {
        $msg = $this->handleBuildIndex();
        $this->success($msg);
    }

    /*
     * 处理生成首页
     */
    private function handleBuildIndex(){
        /*获取当前页面URL*/
        $result['pageurl'] = $this->request->domain().ROOT_DIR;
        /*--end*/
        $eyou = array(
            'field' => $result,
        );
        $this->eyou = array_merge($this->eyou, $eyou);
        $this->assign('eyou', $this->eyou);
        $msg = '';
        try{
            $savepath = './index.html';
            $tpl = 'index';
            $this->request->get(['m'=>'Index']); // 首页焦点
            $this->filePutContents($savepath, $tpl, 'pc', 0, '/', 0, 1, $result);
//            $msg .= '<span>index.html生成成功</span><br>';
        }catch(\Exception $e){
            $msg .= '<span>index.html生成失败!'.$e->getMessage().'</span><br>';
        }

        return $msg;
    }
    
    /*
     * 写入静态页面
     */
    private function filePutContents($savepath, $tpl, $model='pc', $pages=0, $dir='/', $tid=0, $top=1, $result = [])
    {
        ob_start();
        static $templateConfig = null;
        null === $templateConfig && $templateConfig = \think\Config::get('template');
        $templateConfig['view_path'] = "./template/pc/";
        $template = "./template/{$model}/{$tpl}.{$templateConfig['view_suffix']}";
        $content = $this->fetch($template, [], [], $templateConfig);

        /*解决模板里没有设置编码的情况*/
        if (!stristr($content, 'utf-8')) {
            $content = str_ireplace('<head>', "<head>\n<meta charset='utf-8'>", $content);
        }
        /*end*/

        if($pages>0){
            $page = "/<a(.*?)href(\s*)=(\s*)[\'|\"](.*?)page=([0-9]*)(.*?)data-ey_fc35fdc=[\'|\"]html[\'|\"](.*?)>/i";
            preg_match_all($page,$content,$matchpage);

            $dir = trim($dir, '.');
            foreach ( $matchpage[0] as $key1 => $value1 ) {
                if($matchpage[5][$key1] == 1){
                    if($top==1){
                        $url = $dir;
                    }elseif($top==2){
                        $url = $dir.'/lists_'.$tid.'.html';
                    }else{
                        $url = $dir.'/lists_'.$tid.'.html';
                    }
                }else{
                    $url = $dir.'/lists_'.$tid.'_'.$matchpage[5][$key1].'.html';
                }
                $url = ROOT_DIR.'/'.trim($url, '/');
                $value1_new = preg_replace('/href(\s*)=(\s*)[\'|\"]([^\'\"]*)[\'|\"]/i', '', $value1);
                $value1_new = str_replace('data-ey_fc35fdc=', " href=\"{$url}\" data-ey_fc35fdc=", $value1_new);
                $content = str_ireplace ( $value1, $value1_new, $content );
            }
        }
        $content = $this->pc_to_mobile_js($content, $result); // 生成静态模式下,自动加上PC端跳转移动端的JS代码
        echo $content;
        $_cache=ob_get_contents();
        ob_end_clean();
        static $File = null;
        null === $File && $File = new File;
        $File->fwrite($savepath, $_cache);   
    }

    /*
     * 生成文档静态页面
     */
    public function buildArticle()
    {
        function_exists('set_time_limit') && set_time_limit(0);

        $typeid =  input("param.id/d",0); // 栏目ID
        $fid =  input("param.fid/d",0);
        $achievepage = input("param.achieve/d",0); // 已完成文档数
        $this->clearCache();
        $data = $this->handelBuildArticle($typeid,0,$fid,$achievepage);

        $this->success($data[0],null,$data[1]);
    }

    /**
     * 获取详情页数据
     * $typeid      栏目id
     * $aid     文章id
     * $type    类型,0:aid指定的内容,1:上一篇,2:下一篇
     */
    private function getArticleData($typeid,$aid,$type = 0){
        $info_serialize = cache("article_info_serialize","");
        if (empty($info_serialize)){
            if ($type == 0){
                $data = getAllArchives($this->home_lang,$typeid,$aid);
            }else if ($type == 1){
                $data = getPreviousArchives($this->home_lang,$typeid,$aid);
            }else if ($type == 2){
                $data = getNextArchives($this->home_lang,$typeid,$aid);
            }
            $info = $data['info'];
            $pagetotal = count($info);
            $aid_arr = get_arr_column($info,'aid');
            $allTags = getAllTags($aid_arr);
            $allAttrInfo = getAllAttrInfo($aid_arr);
            /*获取所有栏目是否有子栏目的数组*/
            $has_children_Row = model('Arctype')->hasChildren(get_arr_column($info, 'typeid'));
            cache("article_info_serialize",serialize($data));
            cache("article_page_total_serialize",$pagetotal);
            cache("article_tags_serialize",serialize($allTags));
            cache("article_attr_info_serialize",serialize($allAttrInfo));
            cache("article_children_row_serialize",serialize($has_children_Row));
        }else{
            $data = unserialize($info_serialize);
            $pagetotal = cache("article_page_total_serialize","");
            $allTags = unserialize(cache("article_tags_serialize",""));
            $allAttrInfo = unserialize(cache("article_attr_info_serialize",""));
            $has_children_Row = unserialize(cache("article_children_row_serialize",""));
        }

        return ['data'=>$data,'pagetotal'=>$pagetotal,'allTags'=>$allTags,'allAttrInfo'=>$allAttrInfo,'has_children_Row'=>$has_children_Row];
    }

    /**
     * 处理生成内容页
     * $typeid      栏目id
     * $aid         内容页id
     * $fid         下一次执行栏目id
     * $achievepage 已完成文档数
     * $batch       是否分批次执行,true:分批,false:不分批
     * limit        每次执行多少条数据
     * type         执行类型,0:aid指定的文档页,1:上一篇,2:下一篇
     *
     */
    private function handelBuildArticle($typeid,$aid = 0,$nextid = 0,$achievepage = 0,$batch = true,$limit = 20,$type = 0){
        $msg = "";
        $globalConfig = $this->eyou['global'];
        $result = $this->getArticleData($typeid,$aid,$type);
        $info = $result['data']['info'];
        $arctypeRow = $result['data']['arctypeRow'];
        $allTags = $result['allTags'];
        $has_children_Row = $result['has_children_Row'];
        $allAttrInfo = $result['allAttrInfo'];
        $data['allpagetotal'] = $pagetotal = $result['pagetotal'];
        $data['achievepage'] = $achievepage;
        $data['pagetotal'] = 0;

        if ($batch && $pagetotal > $achievepage){
            while ($limit && isset($info[$nextid])){
                $row = $info[$nextid];
                $msg .= $msg_temp = $this->createArticle($row,$globalConfig,$arctypeRow,$allTags,$has_children_Row,$allAttrInfo);
                $data['achievepage'] +=  1;
                $limit--;
                $nextid++;
            }
            $data['fid'] = $nextid;
        }else if (!$batch){
            foreach ($info as $key=>$row){
                $msg .= $msg_temp = $this->createArticle($row,$globalConfig,$arctypeRow,$allTags,$has_children_Row,$allAttrInfo);
                $data['achievepage'] += 1;
                $data['fid'] = $key;
            }
        }
        if ($data['allpagetotal'] == $data['achievepage']){  //生成完全部页面,删除缓存
            cache("article_info_serialize",null);
            cache("article_page_total_serialize",null);
            cache("article_tags_serialize",null);
            cache("article_attr_info_serialize",null);
            cache("article_children_row_serialize",null);
        }

        return [$msg,$data];
    }

    /*
     * 生成详情页静态页面
     */
    private function createArticle($result,$globalConfig,$arctypeRow,$allTags,$has_children_Row,$allAttrInfo){
        $msg = "";
        $aid =  $result['aid'];
        static $arc_seo_description_length = null;
        null === $arc_seo_description_length && $arc_seo_description_length = config('global.arc_seo_description_length');
        $this->request->post(['aid'=>$aid]);
        $this->request->post(['tid'=>$result['typeid']]);

        // tags标签
        $result['tags'] = empty($allTags[$aid]) ? '' : implode(',', $allTags[$aid]);

        $arctypeInfo = $arctypeRow[$result['typeid']];
        /*排除文档模型与栏目模型对不上的文档*/
        if ($arctypeInfo['current_channel'] != $result['channel']) {
            return false;
        }
        /*--end*/
        $arctypeInfo = model('Arctype')->parentAndTopInfo($result['typeid'], $arctypeInfo);
        /*自定义字段的数据格式处理*/
        $arctypeInfo = $this->fieldLogic->getTableFieldList($arctypeInfo, config('global.arctype_channel_id'));
        /*是否有子栏目,用于标记【全部】选中状态*/
        $arctypeInfo['has_children'] = !empty($has_children_Row[$result['typeid']]) ? 1 : 0;
        /*--end*/
        // 文档模板文件,不指定文档模板,默认以栏目设置的为主
        empty($result['tempview']) && $result['tempview'] = $arctypeInfo['tempview'];

        /*给没有type前缀的字段新增一个带前缀的字段,并赋予相同的值*/
        foreach ($arctypeInfo as $key => $val) {
            if (!preg_match('/^type/i',$key)) {
                $key_new = 'type'.$key;
                !array_key_exists($key_new, $arctypeInfo) && $arctypeInfo[$key_new] = $val;
            }
        }
        /*--end*/

        $result = array_merge($arctypeInfo, $result);

        // 获取当前页面URL
        $result['arcurl'] = $result['pageurl'] = '';
        if ($result['is_jump'] != 1) {
            $result['arcurl'] = $result['pageurl'] = arcurl('home/View/index', $result, true, true);
        }
        /*--end*/

        // seo
        $result['seo_title'] = set_arcseotitle($result['title'], $result['seo_title'], $result['typename']);
        $result['seo_description'] = @msubstr(checkStrHtml($result['seo_description']), 0, $arc_seo_description_length, false);

        /*支持子目录*/
        $result['litpic'] = handle_subdir_pic($result['litpic']);
        /*--end*/

        $result = view_logic($aid, $result['channel'], $result, $allAttrInfo); // 模型对应逻辑

        /*自定义字段的数据格式处理*/
        $result = $this->fieldLogic->getChannelFieldList($result, $result['channel']);
        /*--end*/

        $eyou = array(
            'type'  => $arctypeInfo,
            'field' => $result,
        );
        $this->eyou = array_merge($this->eyou, $eyou);
        $this->assign('eyou', $this->eyou);

        /*模板文件*/
        $tpl = !empty($result['tempview'])
        ? str_replace('.'.$this->view_suffix, '',$result['tempview'])
        : 'view_'.$result['nid'];
        /*--end*/

        $dir = $this->getArticleDir($result['dirpath']);
        if (!empty($result['htmlfilename'])){
            $aid =  $result['htmlfilename'];
        }
        $savepath = $dir.'/'.$aid.'.html';

        try{
            $this->filePutContents('./'.$savepath, $tpl, 'pc', 0, '/', 0, 1, $result);
        }catch(\Exception $e){
             $msg .= '<span>'.$savepath.'生成失败!'.$e->getMessage().'</span><br>';
        }

        return $msg;
    }

    private function getArticleDir($dirpath){
        $dir = "";
        $seo_html_pagename = $this->eyou['global']['seo_html_pagename'];
        $seo_html_arcdir = $this->eyou['global']['seo_html_arcdir'];
        if($seo_html_pagename == 1){//存放顶级目录
            $dirpath_arr = explode('/',$dirpath);
            if(count($dirpath_arr) > 2){
                $dir = '.'.$seo_html_arcdir.'/'.$dirpath_arr[1];
            }else{
                $dir = '.'.$seo_html_arcdir.$dirpath;
            }
        } else if ($seo_html_pagename == 3) { //存放子级目录
            $dirpath_arr = explode('/',$dirpath);
            if(count($dirpath_arr) > 2){
                $dir = '.'.$seo_html_arcdir.'/'.end($dirpath_arr);
            }else{
                $dir = '.'.$seo_html_arcdir.$dirpath;
            }
        }else{ //存放父级目录
            $dir = '.'.$seo_html_arcdir.$dirpath;
        }

        return $dir;
    }

    /*
     * 生成栏目静态页面
     * $id  tpyeid  栏目id
     * $fid         下一次执行栏目id
     * $achievepage 已完成页数
     *$batch        是否分批次执行,true:分批,false:不分批
     *
     */
    public function buildChannel()
    {
        function_exists('set_time_limit') && set_time_limit(0);
        $id =  input("param.id/d",0); // 栏目ID
        $fid =  input("param.fid/d",0);
        $achievepage = input("param.achieve/d",0);
        $this->clearCache();
        $data = $this->handleBuildChannel($id,$fid,$achievepage);

        $this->success($data[0],null,$data[1]);
    }

    /*
     * 获取栏目数据
     * $id      栏目id
     * $parent        是否获取下级栏目    true:获取,false:不获取
     */
    private function getChannelData($id,$parent = true,$aid = 0){
        $info_serialize = cache("channel_info_serialize","");
        if (empty($info_serialize)){
            $result = getAllArctype($this->home_lang,$id,$this->view_suffix,$parent,$aid);
            $info = $result["info"];
            $pagetotal = $result["pagetotal"];
            $has_children_Row = model('Arctype')->hasChildren(get_arr_column($info, 'typeid'));

            cache("channel_page_total_serialize",$pagetotal);
            cache("channel_info_serialize",serialize($info));
            cache("has_children_Row_serialize",serialize($has_children_Row));
        }else{
            $info = unserialize($info_serialize);
            $pagetotal = cache("channel_page_total_serialize","");
            $has_children_Row = unserialize(cache("has_children_Row_serialize",""));
        }

        return ['info'=>$info,'pagetotal'=>$pagetotal,'has_children_Row'=>$has_children_Row];
    }

    /*
     * 处理生成栏目页
     * $id           typeid
     * $fid         下一次执行栏目id
     * $achievepage 已完成页数
     * $batch        是否分批次执行,true:分批,false:不分批
     * $parent        是否获取下级栏目    true:获取,false:不获取
     * $aid           文章页id,不等于0时,表示只获取文章页所在的列表页重新生成静态(在添加或者编辑文档内容时使用)
     */
    private function handleBuildChannel($id,$fid = 0,$achievepage = 0,$batch = true,$parent = true,$aid = 0){
        $msg = '';
        $globalConfig = $this->eyou['global'];
        $result = $this->getChannelData($id,$parent,$aid);
        $info = $result['info'];
        $has_children_Row = $result['has_children_Row'];
        $data['allpagetotal'] = $pagetotal = $result['pagetotal'];
        $data['achievepage'] = $achievepage;
        if ($batch && $data['allpagetotal'] > $data['achievepage']  && isset($info[$fid])){
            $row = $info[$fid];
            $msg .= $msg_temp = $this->createChannel($row,$globalConfig,$has_children_Row);
            $data['pagetotal'] = $row['pagetotal'];
            $data['achievepage'] += $row['pagetotal'];
            $data['fid'] = $fid+1;
            $data['typeid'] = $row['typeid'];
        }else if (!$batch){
            foreach ($info as $key=>$row){
                $msg .= $msg_temp = $this->createChannel($row,$globalConfig,$has_children_Row,$aid);
                $data['pagetotal'] = $row['pagetotal'];
                $data['achievepage'] += $row['pagetotal'];
                $data['fid'] = $key;
                $data['typeid'] = $row['typeid'];
            }
        }
        if ($data['allpagetotal'] == $data['achievepage']){  //生成完全部页面,删除缓存
            cache("channel_page_total_serialize",null);
            cache("channel_info_serialize",null);
            cache("has_children_Row_serialize",null);
        }

        return [$msg,$data];
    }

    /*
     * 生成栏目页面
     */
    private function createChannel($row,$globalConfig,$has_children_Row,$aid = 0){
        $msg = "";
        $seo_html_listname = $this->eyou['global']['seo_html_listname'];
        $seo_html_arcdir = $this->eyou['global']['seo_html_arcdir'];
        $tid = $row['typeid'];
        $this->request->post(['tid'=>$tid]);

        $row = $this->lists_logic($row, $has_children_Row);  // 模型对应逻辑
        $eyou = array(
            'field' => $row,
        );
        $this->eyou = array_merge($this->eyou, $eyou);
        $this->assign('eyou', $this->eyou);

        $tpl = !empty($row['templist']) ? str_replace('.'.$this->view_suffix, '',$row['templist']) : 'lists_'. $row['nid'];

        if(in_array($row['current_channel'], [6,8])){   //留言模型或单页模型,不存在多页
            $this->request->get(['page'=>'']);
            $dirpath = explode('/',$eyou['field']['dirpath']);
            $dirpath_end = end($dirpath);
            if($seo_html_listname == 1){  //存放顶级目录
                $savepath  = '.'.$seo_html_arcdir.'/'.$dirpath[1]."/lists_".$eyou['field']['typeid'].".html";
            } else if ($seo_html_listname == 3) { // //存放子级目录
                $savepath  = '.'.$seo_html_arcdir.'/'.$dirpath_end."/lists_".$eyou['field']['typeid'].".html";
            }else{
                $savepath  = '.'.$seo_html_arcdir.$eyou['field']['dirpath'].'/'.'lists_'.$eyou['field']['typeid'].".html";
            }
            try{
                $this->filePutContents($savepath, $tpl, 'pc', 0, '/', 0, 1, $row);
                if ($seo_html_listname == 3) {
                    copy($savepath,'.'.$seo_html_arcdir.'/'.$dirpath_end.'/index.html');
                } else if ($seo_html_listname == 2 || count($dirpath) < 3){
                    copy($savepath,'.'.$seo_html_arcdir.$eyou['field']['dirpath'].'/index.html');
                }
            }catch(\Exception $e){
                $msg .= '<span>'.$savepath.'生成失败!'.$e->getMessage().'</span><br>';
            }
        }else if(!empty($aid)){     //只更新aid所在的栏目页码
            $orderby = getOrderBy($row['orderby'],$row['orderway']);
            $limit = getLocationPages($tid,$aid,$orderby);
            $i = !empty($limit) ? ceil($limit/$row['pagesize']):1;
            $msg .= $this->createMultipageChannel($i,$tid,$row,$has_children_Row,$seo_html_listname,$seo_html_arcdir,$tpl);

        }else{    //多条信息的栏目
            $totalpage = $row['pagetotal'];
            for ($i=1; $i <= $totalpage; $i++){
                $msg .= $this->createMultipageChannel($i,$tid,$row,$has_children_Row,$seo_html_listname,$seo_html_arcdir,$tpl);
            }
        }

        return $msg;
    }
    /*
     * 创建有文档列表模型的静态栏目页面
     */
    private function createMultipageChannel($i,$tid,$row,$has_children_Row,$seo_html_listname,$seo_html_arcdir,$tpl){
        $msg = "";
        $this->request->get(['page'=>$i]);
        $row = $this->lists_logic($row, $has_children_Row);  // 模型对应逻辑
        $eyou = array(
            'field' => $row,
        );
        $this->eyou = array_merge($this->eyou, $eyou);
        $this->assign('eyou', $this->eyou);
        $dirpath = explode('/',$eyou['field']['dirpath']);
        $dirpath_end = end($dirpath);
        if($seo_html_listname == 1){  //存放顶级目录
            $dir = '.'.$seo_html_arcdir.'/'.$dirpath[1];
            $savepath  = '.'.$seo_html_arcdir.'/'.$dirpath[1]."/lists_".$eyou['field']['typeid'];
        } else if ($seo_html_listname == 3) { //存放子级目录
            $dir = '.'.$seo_html_arcdir.'/'.$dirpath_end;
            $savepath  = '.'.$seo_html_arcdir.'/'.$dirpath_end."/lists_".$eyou['field']['typeid'];
        }else{
            $dir = '.'.$seo_html_arcdir.$eyou['field']['dirpath'];
            $savepath  = '.'.$seo_html_arcdir.$eyou['field']['dirpath'].'/'.'lists_'.$eyou['field']['typeid'];
        }
        if ($i > 1){
            $savepath .= '_'.$i.'.html';;
        }else{
            $savepath .= '.html';
        }
        $top = 1;
        if ($i > 1 && $seo_html_listname == 1 && count($dirpath) >2) {
            $top = 2;
        } else if ($i > 1 && $seo_html_listname == 3) {
            $top = 1;
        }
        try{
            $this->filePutContents($savepath, $tpl, 'pc', $i, $dir, $tid, $top, $row);
            if ($i==1 && $seo_html_listname == 3) {
                copy($savepath,'.'.$seo_html_arcdir.'/'.$dirpath_end.'/index.html');
            } else if ($i==1 && ($seo_html_listname == 2 || count($dirpath) < 3)){
                copy($savepath,'.'.$seo_html_arcdir.$eyou['field']['dirpath'].'/index.html');
            }
        }catch(\Exception $e){
            $msg .= '<span>'.$savepath.'生成失败!'.$e->getMessage().'</span><br>';
        }

        return $msg;
    }
    
    /**
     * 更新静态生成页
     * @param int $aid 文章id 
     * @param int $typeid 栏目id 
     * @return boolean
     * $del_ids       删除的文章数组
     */
    public function upHtml(){
        $aid =  input("param.aid/d");
        $typeid =  input("param.typeid/d");
        $del_ids = input('param.del_ids/a');
        $type = input('param.type/s');
        $lang =  input("param.lang/s", 'cn');

        /*由于全站共用删除JS代码,这里排除不能发布文档的模型的控制器*/
        $ctl_name =  input("param.ctl_name/s");
        $channeltypeRow = Db::name('channeltype')
            ->where('nid','NOT IN', ['guestbook','single'])
            ->column('ctl_name');
        array_push($channeltypeRow, 'Archives', 'Arctype', 'Custom');
        if (!in_array($ctl_name, $channeltypeRow)) {
            $this->error("排除非发布文档的模型");
        }
        /*end*/

        $seo_pseudo = $this->eyou['global']['seo_pseudo'];
        $this->clearCache();
        if ($seo_pseudo != 2){
            $this->error("当前非静态模式,不做静态处理");
        }
        if(!empty($del_ids)){    //删除文章页面
            $info = Db::name('archives')->field('a.*,b.dirpath')
                ->alias('a')
                ->join('__ARCTYPE__ b', 'a.typeid = b.id', 'LEFT')
                ->where([
                        'a.aid'     => ['in',$del_ids],
                        'a.lang'    => $lang,
                    ])
                ->select();
            foreach($info as $key=>$row){
                $dir = $this->getArticleDir($row['dirpath']);
                $filename = $row['aid'];
                $path = $dir."/".$filename.".html";
                if(file_exists($path)){
                    @unlink($path);
                }
            }
        }else if (!empty($aid) && !empty($typeid)){   //变更文档信息,更新文档页及相关的栏目页
            if ('view' == $type) {
                $this->handelBuildArticle($typeid,$aid,0,0,false,1,0);
                $this->handelBuildArticle($typeid,$aid,0,0,false,1,1); // 更新上篇
                $this->handelBuildArticle($typeid,$aid,0,0,false,1,2); // 更新下篇
            } else if ('lists' == $type) {
                $data = $this->handleBuildChannel($typeid,0,0,false,false,$aid);
                // $this->handelBuildArticle($typeid,$aid,0,0,false,1,1); // 更新上篇
                // $this->handelBuildArticle($typeid,$aid,0,0,false,1,2); // 更新下篇
            } else {
                $this->handleBuildChannel($typeid,0,0,false,false,$aid);
                $this->handelBuildArticle($typeid,$aid,0,0,false);
            }
        }else if (!empty($typeid)){     //变更栏目信息,更新栏目页
            $this->handleBuildIndex();
            $data = $this->handleBuildChannel($typeid,0,0,false,false);
        }

        $this->success("静态页面生成完成");
    }

    /**
     * 读取指定栏目ID下有内容的栏目信息,只读取每一级的第一个栏目
     * @param intval $typeid 栏目ID
     * @return array
     */
    private function readContentFirst($typeid)
    {
        $result = false;
        while (true)
        {
            $result = model('Single')->getInfoByTypeid($typeid);
            if (empty($result['content']) && 'lists_single.htm' == strtolower($result['templist'])) {
                $map = array(
                    'parent_id' => $result['typeid'],
                    'current_channel' => 6,
                    'is_hidden' => 0,
                    'status'    => 1,
                );
                $row = M('arctype')->where($map)->field('*')->order('sort_order asc')->find(); // 查找下一级的单页模型栏目
                if (empty($row)) { // 不存在并返回当前栏目信息
                    break;
                } elseif (6 == $row['current_channel']) { // 存在且是单页模型,则进行继续往下查找,直到有内容为止
                    $typeid = $row['id'];
                }
            } else {
                break;
            }
        }

        return $result;
    }

    /*
     * 拓展页面相关信息
     */
    private function lists_logic($result = [], $has_children_Row = [])
    {
        if (empty($result)) {
            return [];
        }

        $tid = $result['typeid'];

        switch ($result['current_channel']) {
            case '6': // 单页模型
            {
                $arctype_info = model('Arctype')->parentAndTopInfo($tid, $result);
                if ($arctype_info) {
                    // 读取当前栏目的内容,否则读取每一级第一个子栏目的内容,直到有内容或者最后一级栏目为止。
                    $result_new = $this->readContentFirst($tid);
                    // 阅读权限 或 外部链接跳转
                    if ($result_new['arcrank'] == -1 || $result_new['is_part'] == 1) {
                        return false;
                    }
                    /*自定义字段的数据格式处理*/
                    $result_new = $this->fieldLogic->getChannelFieldList($result_new, $result_new['current_channel']);
                    /*--end*/

                    $result = array_merge($arctype_info, $result_new);

                    $result['templist'] = !empty($arctype_info['templist']) ? $arctype_info['templist'] : 'lists_'. $arctype_info['nid'];
                    $result['dirpath'] = $arctype_info['dirpath'];
                    $result['typeid'] = $arctype_info['typeid'];
                }
                break;
            }

            default:
            {
                $result = model('Arctype')->parentAndTopInfo($tid, $result);
                break;
            }
        }

        if (!empty($result)) {
            /*自定义字段的数据格式处理*/
            $result = $this->fieldLogic->getTableFieldList($result, config('global.arctype_channel_id'));
            /*--end*/
        }

        /*是否有子栏目,用于标记【全部】选中状态*/
        $result['has_children'] = !empty($has_children_Row[$tid]) ? 1 : 0;
        /*--end*/

        // seo
        $result['seo_title'] = set_typeseotitle($result['typename'], $result['seo_title']);

        /*获取当前页面URL*/
        $result['pageurl'] = $result['typeurl'];
        /*--end*/

        /*给没有type前缀的字段新增一个带前缀的字段,并赋予相同的值*/
        foreach ($result as $key => $val) {
            if (!preg_match('/^type/i',$key)) {
                $key_new = 'type'.$key;
                !array_key_exists($key_new, $result) && $result[$key_new] = $val;
            }
        }
        /*--end*/

        return $result;
    }

    /**
     * 生成静态模式下且PC和移动端模板分离,就自动给PC端加上跳转移动端的JS代码
     * @access public
     */
    private function pc_to_mobile_js($html = '', $result = [])
    {
        if (file_exists('./template/mobile')) { // 分离式模板

            $domain = $this->request->host(true);

            /*是否开启手机站域名,并且配置*/
            if (!empty($this->eyou['global']['web_mobile_domain_open']) && !empty($this->eyou['global']['web_mobile_domain'])) {
                $domain = $this->eyou['global']['web_mobile_domain'].'.'.$this->request->rootDomain();
            }
            /*end*/

            $aid = input('param.aid/d');
            $tid = input('param.tid/d');
            if (!empty($aid)) { // 内容页
                $url = url('home/View/index', ['aid'=>$aid], true, $domain, 1, 1, 0);
            } else if (!empty($tid)) { // 列表页
                $url = url('home/Lists/index', ['tid'=>$tid], true, $domain, 1, 1, 0);
            } else { // 首页
                $url = $this->request->scheme().'://'.$domain.ROOT_DIR.'/index.php';
            }

            $jsStr = <<<EOF
    <meta http-equiv="mobile-agent" content="format=xhtml;url={$url}">
    <script type="text/javascript">if(window.location.toString().indexOf('pref=padindex') != -1){}else{if(/applewebkit.*mobile/i.test(navigator.userAgent.toLowerCase()) || (/midp|symbianos|nokia|samsung|lg|nec|tcl|alcatel|bird|dbtel|dopod|philips|haier|lenovo|mot-|nokia|sonyericsson|sie-|amoi|zte/.test(navigator.userAgent.toLowerCase()))){try{if(/android|windows phone|webos|iphone|ipod|blackberry/i.test(navigator.userAgent.toLowerCase())){window.location.href="{$url}";}else if(/ipad/i.test(navigator.userAgent.toLowerCase())){}else{}}catch(e){}}}</script>
EOF;
            $html = str_ireplace('</head>', $jsStr."\n</head>", $html);
        } 
        else { // 响应式模板
            // 开启手机站域名,且配置
            if (!empty($this->eyou['global']['web_mobile_domain_open']) && !empty($this->eyou['global']['web_mobile_domain'])) {
                if (empty($result['pageurl'])) {
                    $url = $this->request->subDomain($this->eyou['global']['web_mobile_domain']).ROOT_DIR.'/index.php';
                } else {
                    $url = !preg_match('/^(http(s?):)?\/\/(.*)$/i', $result['pageurl']) ? $this->request->domain().$result['pageurl'] : $result['pageurl'];
                    $url = preg_replace('/^(.*)(\/\/)([^\/]*)(\.?)('.$this->request->rootDomain().')(.*)$/i', '${1}${2}'.$this->eyou['global']['web_mobile_domain'].'.${5}${6}', $url);
                }

                $mobileDomain = $this->eyou['global']['web_mobile_domain'].'.'.$this->request->rootDomain();
                $jsStr = <<<EOF
    <meta http-equiv="mobile-agent" content="format=xhtml;url={$url}">
    <script type="text/javascript">if(window.location.toString().indexOf('pref=padindex') != -1){}else{if(/applewebkit.*mobile/i.test(navigator.userAgent.toLowerCase()) || (/midp|symbianos|nokia|samsung|lg|nec|tcl|alcatel|bird|dbtel|dopod|philips|haier|lenovo|mot-|nokia|sonyericsson|sie-|amoi|zte/.test(navigator.userAgent.toLowerCase()))){try{if(/android|windows phone|webos|iphone|ipod|blackberry/i.test(navigator.userAgent.toLowerCase())){if(window.location.toString().indexOf('{$mobileDomain}') == -1){window.location.href="{$url}";}}else if(/ipad/i.test(navigator.userAgent.toLowerCase())){}else{}}catch(e){}}}</script>
EOF;
                $html = str_ireplace('</head>', $jsStr."\n</head>", $html);
            }
        }

        return $html;
    }
}