diff --git a/app/Console/Commands/ClearDownloadDatas.php b/app/Console/Commands/ClearDownloadDatas.php
new file mode 100644
index 00000000..07a9b4cd
--- /dev/null
+++ b/app/Console/Commands/ClearDownloadDatas.php
@@ -0,0 +1,26 @@
+deleteDirectory('zip');
+ }
+}
diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php
index f298db4c..00e5528e 100644
--- a/app/Console/Kernel.php
+++ b/app/Console/Kernel.php
@@ -24,6 +24,7 @@ class Kernel extends ConsoleKernel
Commands\CalculateActiveUser::class,
Commands\CalculateHotTopic::class,
Commands\ClearUserData::class,
+ Commands\ClearDownloadDatas::class,
Commands\SyncUserActivedTime::class,
Commands\CalculateMaintainerWorks::class,
@@ -55,5 +56,7 @@ protected function schedule(Schedule $schedule)
$schedule->command('phphub:calculate-active-user')->everyTenMinutes();
$schedule->command('phphub:calculate-hot-topic')->everyTenMinutes();
$schedule->command('phphub:sync-user-actived-time')->everyTenMinutes();
+
+ $schedule->command('phphub:clear-download-data')->hourly();
}
}
diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php
index 315c0a0a..d5f0432b 100644
--- a/app/Http/Controllers/UsersController.php
+++ b/app/Http/Controllers/UsersController.php
@@ -1,11 +1,13 @@
middleware('auth', ['except' => [
+ $this->middleware('auth', [
+ 'except' => [
'index', 'show', 'replies',
- 'topics', 'articles', 'votes', 'following',
- 'followers', 'githubCard', 'githubApiProxy',
- ]]);
+ 'topics', 'articles', 'votes', 'following',
+ 'followers', 'githubCard', 'githubApiProxy',
+ ],
+ ]);
}
public function index()
@@ -36,12 +40,12 @@ public function index()
public function show($id)
{
- $user = User::findOrFail($id);
- $topics = Topic::whose($user->id)->withoutArticle()->withoutBoardTopics()->recent()->limit(20)->get();
- $articles = Topic::whose($user->id)->onlyArticle()->withoutDraft()->recent()->with('blogs')->limit(20)->get();
- $blog = $user->blogs()->first();
- $replies = Reply::whose($user->id)->recent()->limit(20)->get();
- return view('users.show', compact('user','blog', 'articles', 'topics', 'replies'));
+ $user = User::findOrFail($id);
+ $topics = Topic::whose($user->id)->withoutArticle()->withoutBoardTopics()->recent()->limit(20)->get();
+ $articles = Topic::whose($user->id)->onlyArticle()->withoutDraft()->recent()->with('blogs')->limit(20)->get();
+ $blog = $user->blogs()->first();
+ $replies = Reply::whose($user->id)->recent()->limit(20)->get();
+ return view('users.show', compact('user', 'blog', 'articles', 'topics', 'replies'));
}
public function edit($id)
@@ -87,7 +91,7 @@ public function articles($id)
$user = User::findOrFail($id);
$topics = Topic::whose($user->id)->onlyArticle()->withoutDraft()->recent()->with('blogs')->paginate(30);
$user->update(['article_count' => $topics->total()]);
- return view('users.articles', compact('user','blog', 'topics'));
+ return view('users.articles', compact('user', 'blog', 'topics'));
}
public function drafts()
@@ -99,7 +103,7 @@ public function drafts()
$user->draft_count = $user->topics()->onlyArticle()->draft()->count();
$user->save();
- return view('users.articles', compact('user','blog', 'topics'));
+ return view('users.articles', compact('user', 'blog', 'topics'));
}
public function votes($id)
@@ -132,12 +136,11 @@ public function accessTokens($id)
return redirect(route('users.show', $id));
}
$user = User::findOrFail($id);
+
$sessions = OAuthSession::where([
'owner_type' => 'user',
'owner_id' => Auth::id(),
- ])
- ->with('token')
- ->lists('id') ?: [];
+ ])->with('token')->lists('id') ? : [];
$tokens = AccessToken::whereIn('session_id', $sessions)->get();
@@ -216,7 +219,7 @@ public function githubApiProxy($username)
{
$cache_name = 'github_api_proxy_user_' . $username;
- return Cache::remember($cache_name, 1440, function () use ($username) {
+ return Cache::remember($cache_name, 1440, function() use ($username) {
$result = (new GithubUserDataReader())->getDataFromUserName($username);
return response()->json($result);
@@ -320,4 +323,39 @@ public function emailVerificationRequired()
return view('users.emailverificationrequired');
}
+
+ public function downloads(Request $request, $id)
+ {
+ $user = User::findOrFail($id);
+ $this->authorize('download', $user);
+
+ $disk = Storage::disk('local');
+ $baseDir = "zip/article_$user->id";
+ $zipFile = "$baseDir.zip";
+
+ if (!$disk->exists($baseDir)) {
+ Topic::whose($user->id)
+ ->onlyArticle()
+ ->withoutDraft()
+ ->get(['title', 'body_original'])
+ ->each(
+ function($article) use ($disk, $baseDir) {
+ $disk->put("$baseDir/$article->title.md", $article->body_original);
+ }
+ );
+ }
+
+ if (!$disk->exists($zipFile)) {
+
+ ($zip = new ZipArchive())->open(storage_path("app/$zipFile"), ZipArchive::CREATE);
+
+ collect($disk->files($baseDir))->each(function($item) use ($zip, $disk) {
+ $zip->addFile(storage_path("app/$item"), basename($item));
+ });
+
+ $zip->close();
+ }
+
+ return response()->download(storage_path("app/$zipFile"));
+ }
}
diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php
index 4f35c58d..497e8faa 100644
--- a/app/Policies/UserPolicy.php
+++ b/app/Policies/UserPolicy.php
@@ -18,4 +18,9 @@ public function delete(User $currentUser, User $user)
{
return $currentUser->may('manage_users') || $currentUser->id == $user->id;
}
+
+ public function download(User $currentUser, User $user)
+ {
+ return $currentUser->id == $user->id;
+ }
}
diff --git a/resources/lang/zh-CN/phphub.php b/resources/lang/zh-CN/phphub.php
index 2ccaff63..a554e547 100644
--- a/resources/lang/zh-CN/phphub.php
+++ b/resources/lang/zh-CN/phphub.php
@@ -222,4 +222,5 @@
'Sorry, this socialite account has been registed.' => '绑定失败:你的 :driver 账号已被其他用户使用. T_T',
'Bind Successfully!' => '绑定成功!以后可以使用你的 :driver 账号登录 Laravel China 了 ^_^',
'Actived' => '最近访问',
+ 'Download Article' => '下载文章',
];
diff --git a/resources/views/users/partials/basicinfo.blade.php b/resources/views/users/partials/basicinfo.blade.php
index 676eb62a..10bee5b0 100644
--- a/resources/views/users/partials/basicinfo.blade.php
+++ b/resources/views/users/partials/basicinfo.blade.php
@@ -145,6 +145,13 @@
@endif
+ @if ($currentUser && ($currentUser->id == $user->id))
+
+
+ {{ lang('Download Article') }}
+
+ @endif
+
@if(Auth::check() && $currentUser->id != $user->id)
diff --git a/routes/web.php b/routes/web.php
index eff7e14a..52162dae 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -21,6 +21,7 @@
Route::get('/users/{id}/votes', 'UsersController@votes')->name('users.votes');
Route::get('/users/{id}/following', 'UsersController@following')->name('users.following');
Route::get('/users/{id}/followers', 'UsersController@followers')->name('users.followers');
+Route::get('/users/{id}/downloads', 'UsersController@downloads')->name('users.downloads');
Route::get('/users/{id}/refresh_cache', 'UsersController@refreshCache')->name('users.refresh_cache');
Route::get('/users/{id}/access_tokens', 'UsersController@accessTokens')->name('users.access_tokens');