Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
zuwea committed Mar 9, 2017
1 parent 901baa6 commit 732f5e2
Show file tree
Hide file tree
Showing 10 changed files with 272 additions and 22 deletions.
32 changes: 17 additions & 15 deletions README.md
@@ -1,18 +1,20 @@
# laravel-generate-html
laravel框架的生成静态页的扩展包



需要在config目录下新建generate文件

里面格式如下:





一个路由,视图(控制打开刷新页面)
一个控制器作为公共的控制器,让其他控制器继承该控制器

一个帮助函数复写asset函数和url函数

根据缓冲技术生成静态页
部署此类网站,需前后台分离,即两个域名/ip分别指向前台和后台
后台域名/ip指向laravel框架的public目录
前台域名/ip指向laravel框架的public目录下的指定目录【该目录名称可以在配置文件中设置】

在网站中使用该扩展,请按照如下步骤使用:
1. 使用`composer require caijw/laravel-generate-html`下载该扩展
2. 在config/app.php的providers数组中加入以下语句:`caijw\Generate\GenerateServiceProvider::class`注册服务提供者
3. 在项目根目录使用`php artisan vendor:publish --force`,将配置文件copy到config目录下
4. 修改config目录下的generate文件中的配置【具体配置要求详见generate.php中的注释】
5. 所有需要刷新的页面的对应控制器都不要继承controller,而是`use caijw\Generate\Controllers\GenerateController;`继承该控制器
6. 函数在返回视图时不要使用`return view()`,而是使用`return $this->view()`;用法和view一致
7. 在blade模板中,所有的静态资源文件,都使用`cga()`,用法与`asset()`一致
8. 在blade模板中,所有的站内链接,都使用`cgr()`,用法与`route()`一致
9. 进入对应页面【generate.php配置的refreshUrl】,点击开始刷新,即可生成静态页

> 在使用过程中如遇到问题或发现bug或有更好的建议,欢迎随时与我联系:18292054@qq.com
40 changes: 38 additions & 2 deletions src/Controllers/GenerateController.php
@@ -1,9 +1,45 @@
<?php
namespace caijw\Generate\Controllers;
use App\Http\Controllers\Controller;
//use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Config;
use Illuminate\Http\Request;

class GenerateController extends Controller{
abstract class GenerateController extends Controller{
private $request=null;
function __construct(Request $request){
$this->request=$request;
}
private function generate($viewUrl,$data){
ob_end_clean();
ob_start();
echo base64_encode(view($viewUrl,$data));
$content = ob_get_contents();
ob_end_clean();

$domain = Config::get("generate.domain");
$url = $this->request->url();
$url = str_replace($domain,"",$url);
if(!(strpos($url, "/") === 0)){
$url="/".$url;
}
/*在url前面加上用户指定的文件夹*/
$url=Config::get("generate.home").$url;
/*判断是否产生下级目录*/
$url = caijw_generate_url_suffix($url);
$url = str_replace("/",DIRECTORY_SEPARATOR,$url);
$url = public_path($url);
/*此时的url已经是完整的了*/
caijw_generate_mk_dirs(dirname($url));//递归创建目录
file_put_contents($url,base64_decode($content));
return view("generate::202");//抛出页面刷新完成的信息
}
protected function view($viewUrl,$data=array()){
$falg = file_get_contents(dirname(__DIR__).DIRECTORY_SEPARATOR."config".DIRECTORY_SEPARATOR."toHTML.conf");
if($falg!=="0"){
return $this->generate($viewUrl,$data);
}else{
return view($viewUrl,$data);
}
}

}
24 changes: 24 additions & 0 deletions src/Controllers/PrivateController.php
@@ -0,0 +1,24 @@
<?php
namespace caijw\Generate\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Config;


class PrivateController extends Controller{
function refresh(){
$urls = Config::get("generate.urls");
$domain = Config::get("generate.domain");
$callback = "/".Config::get("generate.refreshUrl")."/callback";
file_put_contents(dirname(__DIR__).DIRECTORY_SEPARATOR."config".DIRECTORY_SEPARATOR."toHTML.conf","1");
return view('generate::refresh',["urls"=>$urls,"domain"=>$domain,"callback"=>$callback]);
}
function callback(){
$urls = Config::get("generate.urls");
if(empty($_POST['num']) || $_POST['num']!=count($urls)){
return json_encode(["status"=>-1,"message"=>"更新信息失败"],JSON_UNESCAPED_UNICODE);
}
file_put_contents(dirname(__DIR__).DIRECTORY_SEPARATOR."config".DIRECTORY_SEPARATOR."toHTML.conf","0");
return json_encode(["status"=>0,"message"=>"更新信息成功"],JSON_UNESCAPED_UNICODE);
}

}
17 changes: 15 additions & 2 deletions src/GenerateServiceProvider.php
Expand Up @@ -2,16 +2,29 @@
namespace caijw\Generate;

use Illuminate\Support\ServiceProvider;
use Illuminate\Routing\Router;
use Illuminate\Support\Facades\Config;

class GenerateServiceProvider extends ServiceProvider {
protected $defer = false;
public function boot(){
include 'routes.php';/*路由*/
$this->loadViewsFrom(__DIR__.'/views', 'generate');/*视图*/



$this->setupRoutes($this->app->router);//路由
$this->loadViewsFrom(__DIR__.'/views', 'generate');//视图
$this->publishes([//配置文件
__DIR__.'/config/generate.php' => config_path('generate.php'),
]);
}
public function setupRoutes(Router $router){

$router->group(['prefix' => Config::get('generate.refreshUrl', 'caijw_refresh'),'namespace' => 'caijw\Generate\Controllers'], function($router){
include 'routes.php';/*路由*/

});

}
public function register(){

}
Expand Down
23 changes: 23 additions & 0 deletions src/config/generate.php
@@ -1,7 +1,30 @@
<?php

return [
"refreshUrl"=>"caijw_refresh",//刷新页面的网址,从根目录开始写
"domain"=>"http://127.0.0.1:8888",//根目录网址,即所有要刷新的url的公共部分

"home"=>"test",//生成的静态页存放目录,前后不要加/
/*
* 如果访问的url以数组中元素结尾,则不产生下级目录
* 如:suffix中有.html元素存在则访问/abc/qwe.html:会在目录中形成如下文件:/abc/qwe.html
* 如果不存在.html元素,则访问/abc/qwe.html:会在目录中形成如下文件:/abc/qwe.html/index.html
* */
"suffix"=>[".html",".xml"],

"urls"=>[
"1",
"/2",
"/3",
"/4",
"/5",
"/6",
"/7",
"/8",
"/9",
"/10",
"/11",

]

];
1 change: 1 addition & 0 deletions src/config/toHTML.conf
@@ -0,0 +1 @@
1
55 changes: 55 additions & 0 deletions src/functions.php
@@ -1 +1,56 @@
<?php
use Illuminate\Support\Facades\Config;
function caijw_generate_mk_dirs($dir){
if(!is_dir($dir)){
if(!caijw_generate_mk_dirs(dirname($dir))){
return false;
}
if(!mkdir($dir,0777)){
return false;
}
}
return true;
}
function caijw_generate_url_suffix($url){
$f = true;//假定生成下级目录
$suffix = Config::get("generate.suffix");
foreach($suffix as $value){
if(strrchr($url,$value)==$value){//以给定后缀结束
$f = false;//不再产生下级目录
break;
}
}
if($f){
return $url."/index.html";
}
return $url;
}
function caijw_generate_route($routeName,$routeParameter=[]){/*对route功能进行生成静态页完善*/
$url = route($routeName, $routeParameter);
$domain = Config::get("generate.domain");
$falg = file_get_contents(__DIR__.DIRECTORY_SEPARATOR."config".DIRECTORY_SEPARATOR."toHTML.conf");
if($falg!=="0" && (strpos($url, $domain) !== false)){
if($domain==$url){
return "/";
}
$url = caijw_generate_url_suffix($url);
return str_replace($domain,"",$url);
}
return $url;
}
function caijw_generate_asset($parameter){/*对asset功能进行生成静态页完善*/
$url = asset($parameter);
//return str_replace(生成静态页的服务器,线上服务器,$url);如果线上服务器和生成静态页服务器不一致,可以修改此处
return $url;
}

if (! function_exists('cgr')) {
function cgr($routeName,$routeParameter=[]){
return caijw_generate_route($routeName,$routeParameter);
}
}
if (! function_exists('cga')) {
function cga($parameter){
return caijw_generate_asset($parameter);
}
}
3 changes: 2 additions & 1 deletion src/routes.php
@@ -1,3 +1,4 @@
<?php

Route::get('', "PrivateController@refresh");
Route::post('callback', "PrivateController@callback");

11 changes: 11 additions & 0 deletions src/views/202.blade.php
@@ -0,0 +1,11 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="error" content="202"/>
<title>页面刷新完成</title>
</head>
<body>
页面刷新完成
</body>
</html>
88 changes: 86 additions & 2 deletions src/views/refresh.blade.php
@@ -1,9 +1,93 @@
<html>
<head>
<meta charset="UTF-8">
<title>title</title>
<meta name="_token" content="{{ csrf_token() }}"/>
<title>刷新页面</title>
<style type="text/css">
*{margin: 0;padding: 0;}
.bg{width: 100%;min-width: 1000px;height: 50px;position: fixed;background: #438eb9;}
.zhanw{height: 80px;}
.bg > div{width: 1000px;margin: 0 auto;}
table{border-collapse: collapse;width: 1000px;margin: 0 auto;}
table td{border: 1px solid #ccc;}
table td:first-child{width: 15px;padding:5px 10px;}
table input{width: 15px;height: 15px;}
table td.url{padding-left: 20px;}
table td.url a{color: #a71d5d;text-decoration: underline;}
</style>
</head>
<body>
1111111111111111111
<div class="bg">
<div>
<input type="button" value="开始刷新">
</div>
</div>
<div class="zhanw"></div>
<table domain="{{$domain}}" callback="{{$callback}}">
@foreach($urls as $val)
<tr>
<td><input type="checkbox" name="urls" value="{{$val}}" checked="checked" /></td>
<td class="url"><a href="javascript:void(0)">{{$val}}</a></td>
</tr>
@endforeach
</table>

</body>
<script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/1.12.4/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
winName=[];
$(function(){
$("input[type=button]").click(function(){
urls = [];
domain = $("table").attr("domain");
var num = domain.lastIndexOf("/");
if(num!=domain.length-1){
domain=domain+"/";
}
$.each($('input:checkbox:checked'),function(){
var url = $(this).val();
var num = url.indexOf("/");
if(num == 0) {
url = url.substring(1);
}
urls[urls.length] = domain+url;
});
generate(urls,0);
})
})
function generate(urls,i){
winName[i]=window.open(urls[i]);
winName[i].addEventListener("load",function(){
/*处理打开页面后的情况,查看是否刷新成功,如成功,则关闭页面,不成功,则记录不成功的数据*/
if(Boolean(winName[i].document.getElementsByTagName('meta')['error'])){
winName[i].close()
}else{
}
/*处理是否进行下一个页面的访问,如果还有下一个页面,就刷新下一页面,否则回执成功记录,更新tohtml_time*/
if(++i<urls.length){
generate(urls,i);
}else{
$.ajax({
url: $("table").attr("callback"),
data: {num:i},
dataType: "json",
type: 'POST',
headers: {'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')},
success: function(){
},
error: function(xhr, type,dsd){
console.log(dsd);
}
});
}
});
}
</script>

</html>

0 comments on commit 732f5e2

Please sign in to comment.