This commit is contained in:
carodej
2020-05-01 11:04:03 +02:00
parent 606c1895a9
commit b2db3755d8
17 changed files with 652 additions and 363 deletions

BIN
.rnd

Binary file not shown.

View File

@@ -1,50 +1,45 @@
## VueFileManager - Make your own Private Cloud with VueFileManager client powered by Laravel and Vue
For installation, please read [Online Documentation](https://vuefilemanager.hi5ve.digital/docs/).
![VueFileManager](https://vuefilemanager.hi5ve.digital/assets/images/vue-file-manager-in-devices-dark.png)
### Installation setup
**Features:**
Run these commands to install vendors:
```
composer install
```
```
npm install
```
### Drag & Drop
Reorder your files easily, just drag your folder or file and drop to another folder.
Setup your database in .env and run this command:
```
php artisan setup:prod
```
### List & Grid Preview
You can change from two types of file and folder previews. Show your items in list or grid preview.
It automatically:
* Migrate database
* Generate Application key
* Create Passport Encryption keys
* Create Password grant client
* Create Personal access client
### Background Uploading
Your files is uploaded in the background, so nothing will stop you from working with the files.
Then, copy generated password grant client `Client ID`, `Client secret` and paste it to .env files here:
```
PASSPORT_CLIENT_ID=<your_passport_client_id>
PASSPORT_CLIENT_SECRET=<your_passport_client_secret>
```
For sending forgoten password request via email, fill your mail driver in .env
### File & Folder searching
Search your items quickly, from anywhere in the app you are.
### Run Application
To start server on your localhost, run this command
```
php artisan serve
```
### Custom Context Menu
Quick actions next to your file on your right click.
To compiles and hot-reloads for development, run this command
```
npm run hot
```
### File Details
Get preview of your files quickli in right panel next to your files.
### Improved Mobile User Experience
Need to quickly upload or get your files on your smartphone? Its not problem.
### Laravel PHP Framework
You don't have to create your own API for VueFileManager. You can use our pre-build backend in Laravel PHP Framework.
### Vue.js
Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web. We ❤️ Vue.
### Online Documentation
Dont worry, we will explain all things you should know to successfully start your VueFileManager instance.
### Night Mode
We add native support for dark mode. Now, its easy for your eyes to work with your files at night.
### User Login & Registration
Let user create their own account with own storage. All these accounts is protected by user login.
### Integrated Trash
Did you delete something by accident or do you want your deleted files back? Restore your files from trash.
### Navigation Sidebar
Navigate through your files easily. Add you favourites folder or look on your latest uploads.
### Storage Limits
Set storage limits to your user account to sure, you never exceed your storage limits.
To compiles for production, run this command
```
npm run prod
```
That's all, happy coding! :tada: :tada: :tada:

View File

@@ -0,0 +1,99 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class SetupProductionEnvironment extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'setup:prod';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Setting production environment';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->info('Setting up production environment');
$this->migrateDatabase();
$this->generateKey();
$this->createPassportKeys();
$this->createPassportClientPassword();
$this->createPassportClientPersonal();
$this->info('Everything is done, congratulations! 🥳🥳🥳');
}
/**
* Migrate database
*/
public function generateKey()
{
$this->call('key:generate');
}
/**
* Migrate database
*/
public function migrateDatabase()
{
$this->call('migrate:fresh');
}
/**
* Create Passport Encryption keys
*/
public function createPassportKeys()
{
$this->call('passport:keys', [
'--force' => true
]);
}
/**
* Create Password grant client
*/
public function createPassportClientPassword()
{
$this->call('passport:client', [
'--password' => true,
'--name' => 'vuefilemanager',
]);
}
/**
* Create Personal access client
*/
public function createPassportClientPersonal()
{
$this->call('passport:client', [
'--personal' => true,
'--name' => 'shared',
]);
}
}

View File

@@ -2,6 +2,7 @@
namespace App\Console;
use App\Console\Commands\SetupProductionEnvironment;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
@@ -13,7 +14,7 @@ class Kernel extends ConsoleKernel
* @var array
*/
protected $commands = [
//
SetupProductionEnvironment::class,
];
/**

View File

@@ -7,13 +7,13 @@ use App\Http\Requests\FileFunctions\DeleteItemRequest;
use App\Http\Requests\FileFunctions\RenameItemRequest;
use App\Http\Requests\FileFunctions\MoveItemRequest;
use App\Http\Requests\FileFunctions\UploadRequest;
use App\Http\Tools\Demo;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Http\Tools\Guardian;
use App\Http\Tools\Editor;
use App\FileManagerFolder;
use App\FileManagerFile;
use Exception;
@@ -24,10 +24,16 @@ class EditItemsController extends Controller
* Create new folder for authenticated master|editor user
*
* @param CreateFolderRequest $request
* @return FileManagerFolder|Model
* @return array
* @throws Exception
*/
public function user_create_folder(CreateFolderRequest $request)
{
// Demo preview
if (is_demo(Auth::id())) {
return Demo::create_folder($request);
}
// Check permission to create folder for authenticated editor
if ($request->user()->tokenCan('editor')) {
@@ -50,13 +56,18 @@ class EditItemsController extends Controller
*
* @param CreateFolderRequest $request
* @param $token
* @return FileManagerFolder|Model
* @return array
* @throws Exception
*/
public function guest_create_folder(CreateFolderRequest $request, $token)
{
// Get shared record
$shared = get_shared($token);
if (is_demo($shared->user_id)) {
return Demo::create_folder($request);
}
// Check shared permission
if (!is_editor($shared)) abort(403);
@@ -73,9 +84,15 @@ class EditItemsController extends Controller
* @param RenameItemRequest $request
* @param $unique_id
* @return mixed
* @throws Exception
*/
public function user_rename_item(RenameItemRequest $request, $unique_id)
{
// Demo preview
if (is_demo(Auth::id())) {
return Demo::rename_item($request, $unique_id);
}
// Check permission to rename item for authenticated editor
if ($request->user()->tokenCan('editor')) {
@@ -107,12 +124,18 @@ class EditItemsController extends Controller
* @param $unique_id
* @param $token
* @return mixed
* @throws Exception
*/
public function guest_rename_item(RenameItemRequest $request, $unique_id, $token)
{
// Get shared record
$shared = get_shared($token);
// Demo preview
if (is_demo($shared->user_id)) {
return Demo::rename_item($request, $unique_id);
}
// Check shared permission
if (!is_editor($shared)) abort(403);
@@ -147,6 +170,11 @@ class EditItemsController extends Controller
*/
public function user_delete_item(DeleteItemRequest $request, $unique_id)
{
// Demo preview
if (is_demo(Auth::id())) {
return Demo::response_204();
}
// Check permission to delete item for authenticated editor
if ($request->user()->tokenCan('editor')) {
@@ -191,6 +219,11 @@ class EditItemsController extends Controller
// Get shared record
$shared = get_shared($token);
// Demo preview
if (is_demo($shared->user_id)) {
return Demo::response_204();
}
// Check shared permission
if (!is_editor($shared)) abort(403);
@@ -216,9 +249,15 @@ class EditItemsController extends Controller
*
* @param UploadRequest $request
* @return FileManagerFile|Model
* @throws Exception
*/
public function user_upload(UploadRequest $request)
{
// Demo preview
if (is_demo(Auth::id())) {
return Demo::upload($request);
}
// Check if user can upload
if (config('vuefilemanager.limit_storage_by_capacity') && user_storage_percentage() >= 100) {
abort(423, 'You exceed your storage limit!');
@@ -247,12 +286,18 @@ class EditItemsController extends Controller
* @param UploadRequest $request
* @param $token
* @return FileManagerFile|Model
* @throws Exception
*/
public function guest_upload(UploadRequest $request, $token)
{
// Get shared record
$shared = get_shared($token);
// Demo preview
if (is_demo($shared->user_id)) {
return Demo::upload($request);
}
// Check shared permission
if (!is_editor($shared)) abort(403);
@@ -277,6 +322,11 @@ class EditItemsController extends Controller
*/
public function user_move(MoveItemRequest $request, $unique_id)
{
// Demo preview
if (is_demo(Auth::id())) {
return Demo::response_204();
}
// Check permission to upload for authenticated editor
if ($request->user()->tokenCan('editor')) {
@@ -309,6 +359,11 @@ class EditItemsController extends Controller
// Get shared record
$shared = get_shared($token);
// Demo preview
if (is_demo(Auth::id())) {
return Demo::response_204();
}
// Check shared permission
if (!is_editor($shared)) abort(403);

View File

@@ -3,6 +3,7 @@
namespace App\Http\Controllers\FileFunctions;
use App\FileManagerFolder;
use App\Http\Tools\Demo;
use Illuminate\Support\Facades\Validator;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
@@ -30,6 +31,10 @@ class FavouriteController extends Controller
$user = Auth::user();
$folder = FileManagerFolder::where('unique_id', $request->unique_id)->first();
if (is_demo($user->id)) {
return Demo::favourites($user);
}
// Check ownership
if ($folder->user_id !== $user->id) abort(403);
@@ -51,6 +56,10 @@ class FavouriteController extends Controller
// Get user
$user = Auth::user();
if (is_demo($user->id)) {
return Demo::favourites($user);
}
// Remove folder from user favourites
$user->favourites()->detach($unique_id);

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers\FileFunctions;
use App\Http\Tools\Demo;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Storage;
@@ -23,6 +24,10 @@ class TrashController extends Controller
// Get user id
$user_id = Auth::id();
if (is_demo($user_id)) {
return Demo::response_204();
}
// Get files and folders
$folders = FileManagerFolder::onlyTrashed()->where('user_id', $user_id)->get();
$files = FileManagerFile::onlyTrashed()->where('user_id', $user_id)->get();
@@ -68,6 +73,10 @@ class TrashController extends Controller
// Get user id
$user_id = Auth::id();
if (is_demo($user_id)) {
return Demo::response_204();
}
// Get folder
if ($request->type === 'folder') {

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers\User;
use App\Http\Tools\Demo;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Support\Facades\Validator;
use App\Http\Controllers\Controller;
@@ -58,6 +59,10 @@ class AccountController extends Controller
// Get user
$user = Auth::user();
if (is_demo($user->id)) {
return Demo::response_204();
}
if ($request->hasFile('avatar')) {
// Update avatar
@@ -91,6 +96,10 @@ class AccountController extends Controller
// Get user
$user = Auth::user();
if (is_demo($user->id)) {
return Demo::response_204();
}
// Change and store new password
$user->password = Hash::make($request->input('password'));
$user->save();

143
app/Http/Tools/Demo.php Normal file
View File

@@ -0,0 +1,143 @@
<?php
namespace App\Http\Tools;
use App;
use App\Share;
use App\FileManagerFile;
use App\FileManagerFolder;
use App\Http\Requests\FileFunctions\RenameItemRequest;
use App\User;
use ByteUnits\Metric;
use Carbon\Carbon;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Intervention\Image\ImageManagerStatic as Image;
class Demo
{
/**
* Create new directory
*
* @param $request
* @return array
* @throws \Exception
*/
public static function create_folder($request)
{
// Get variables
$user_scope = $request->user() ? $request->user()->token()->scopes[0] : 'editor';
$name = $request->has('name') ? $request->input('name') : 'New Folder';
return [
'user_id' => 1,
'id' => random_int(1000, 9999),
'parent_id' => random_int(1000, 9999),
'name' => $name,
'type' => 'folder',
'unique_id' => random_int(1000, 9999),
'user_scope' => $user_scope,
'items' => '0',
'updated_at' => Carbon::now()->format('j M Y \a\t H:i'),
'created_at' => Carbon::now()->format('j M Y \a\t H:i'),
];
}
/**
* Rename item name
*
* @param RenameItemRequest $request
* @param $unique_id
* @return mixed
*/
public static function rename_item($request, $unique_id)
{
// Get item
if ($request->type === 'folder') {
$item = FileManagerFolder::where('unique_id', $unique_id)
->where('user_id', 1)
->first();
} else {
$item = FileManagerFile::where('unique_id', $unique_id)
->where('user_id', 1)
->first();
}
if ($item) {
$item->name = $request->name;
return $item;
} else {
return [
'unique_id' => $request->unique_id,
'name' => $request->name,
'type' => $request->type,
];
}
}
/**
* Upload file
*
* @param $request
* @return array
* @throws \Exception
*/
public static function upload($request)
{
// Get user data
$user_scope = $request->user() ? $request->user()->token()->scopes[0] : 'editor';
// File
$file = $request->file('file');
$filename = Str::random() . '-' . str_replace(' ', '', $file->getClientOriginalName());
$thumbnail = null;
$filesize = $file->getSize();
$filetype = get_file_type($file);
return [
'id' => random_int(1000, 9999),
'unique_id' => random_int(1000, 9999),
'folder_id' => $request->parent_id,
'thumbnail' => 'data:' . $request->file('file')->getMimeType() . ';base64, ' . base64_encode(file_get_contents($request->file('file'))),
'name' => $file->getClientOriginalName(),
'basename' => $filename,
'mimetype' => $file->getClientOriginalExtension(),
'filesize' => Metric::bytes($filesize)->format(),
'type' => $filetype,
'file_url' => 'https://vuefilemanager.hi5ve.digital/assets/vue-file-manager-preview.jpg',
'user_scope' => $user_scope,
'created_at' => Carbon::now()->format('j M Y \a\t H:i'),
'updated_at' => Carbon::now()->format('j M Y \a\t H:i'),
];
}
/**
* Return 204 status
*
* @return ResponseFactory|\Illuminate\Http\Response
*/
public static function response_204() {
return response('Done!', 204);
}
/**
* Return 204 status
*
* @return ResponseFactory|\Illuminate\Http\Response
*/
public static function favourites($user) {
return $user->favourites->makeHidden(['pivot']);
}
}

View File

@@ -50,7 +50,9 @@ class Editor
*
* @param RenameItemRequest $request
* @param $unique_id
* @return mixed
* @param null $shared
* @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model
* @throws \Exception
*/
public static function rename_item($request, $unique_id, $shared = null)
{
@@ -189,9 +191,9 @@ class Editor
* Upload file
*
* @param $request
* @param $unique_id
* @param null $shared
* @return FileManagerFile|\Illuminate\Database\Eloquent\Model
* @throws \Exception
*/
public static function upload($request, $shared = null)
{

View File

@@ -11,6 +11,16 @@ use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Intervention\Image\ImageManagerStatic as Image;
/**
* Check if is demo
*
* @return mixed
*/
function is_demo($user_id) {
return env('APP_DEMO', false) && $user_id === 1;
}
/**
* Get folder or file item
*

573
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -15,5 +15,5 @@ return [
'limit_storage_by_capacity' => true,
// Define user storage capacity in MB. E.g. value 2000 is 2.00GB
'user_storage_capacity' => 5000,
'user_storage_capacity' => 300,
];

2
public/js/main.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -88,7 +88,7 @@
props: ['data'],
computed: {
...mapGetters([
'FilePreviewType', 'sharedDetail', 'contextMenu'
'FilePreviewType', 'sharedDetail'
]),
isFolder() {
return this.data.type === 'folder'

View File

@@ -85,8 +85,8 @@
return {
isLoading: false,
checkedAccount: undefined,
loginPassword: 'vuefilemanager',
loginEmail: 'howdy@hi5ve.digital',
loginPassword: '',
loginEmail: '',
}
},
methods: {

View File

@@ -226,8 +226,6 @@
})
.catch(error => {
console.log('error not found');
if (error.response.status == 404) {
this.$router.push({name: 'NotFoundShared'})