mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-11-23 11:22:33 +01:00
Added indexes, Reduced queries on pages
This commit is contained in:
parent
3825ea8c14
commit
22f8a408fa
3
.gitignore
vendored
3
.gitignore
vendored
@ -11,4 +11,5 @@ Homestead.yaml
|
|||||||
/public/bower
|
/public/bower
|
||||||
/public/build
|
/public/build
|
||||||
/storage/images
|
/storage/images
|
||||||
_ide_helper.php
|
_ide_helper.php
|
||||||
|
/storage/debugbar
|
10
app/Book.php
10
app/Book.php
@ -27,16 +27,6 @@ class Book extends Entity
|
|||||||
return $this->hasMany('BookStack\Chapter');
|
return $this->hasMany('BookStack\Chapter');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function children()
|
|
||||||
{
|
|
||||||
$pages = $this->pages()->where('chapter_id', '=', 0)->get();
|
|
||||||
$chapters = $this->chapters()->get();
|
|
||||||
foreach($chapters as $chapter) {
|
|
||||||
$pages->push($chapter);
|
|
||||||
}
|
|
||||||
return $pages->sortBy('priority');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getExcerpt($length = 100)
|
public function getExcerpt($length = 100)
|
||||||
{
|
{
|
||||||
return strlen($this->description) > $length ? substr($this->description, 0, $length-3) . '...' : $this->description;
|
return strlen($this->description) > $length ? substr($this->description, 0, $length-3) . '...' : $this->description;
|
||||||
|
@ -18,7 +18,8 @@ class Chapter extends Entity
|
|||||||
|
|
||||||
public function getUrl()
|
public function getUrl()
|
||||||
{
|
{
|
||||||
return '/books/' . $this->book->slug . '/chapter/' . $this->slug;
|
$bookSlug = isset($this->bookSlug) ? $this->bookSlug : $this->book->slug;
|
||||||
|
return '/books/' . $bookSlug. '/chapter/' . $this->slug;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getExcerpt($length = 100)
|
public function getExcerpt($length = 100)
|
||||||
|
@ -89,7 +89,8 @@ class BookController extends Controller
|
|||||||
{
|
{
|
||||||
$book = $this->bookRepo->getBySlug($slug);
|
$book = $this->bookRepo->getBySlug($slug);
|
||||||
Views::add($book);
|
Views::add($book);
|
||||||
return view('books/show', ['book' => $book, 'current' => $book]);
|
$bookChildren = $this->bookRepo->getChildren($book);
|
||||||
|
return view('books/show', ['book' => $book, 'current' => $book, 'bookChildren' => $bookChildren]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -80,8 +80,9 @@ class ChapterController extends Controller
|
|||||||
{
|
{
|
||||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||||
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
|
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
|
||||||
|
$sidebarTree = $this->bookRepo->getChildren($book);
|
||||||
Views::add($chapter);
|
Views::add($chapter);
|
||||||
return view('chapters/show', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]);
|
return view('chapters/show', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter, 'sidebarTree' => $sidebarTree]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -87,8 +87,9 @@ class PageController extends Controller
|
|||||||
{
|
{
|
||||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||||
|
$sidebarTree = $this->bookRepo->getChildren($book);
|
||||||
Views::add($page);
|
Views::add($page);
|
||||||
return view('pages/show', ['page' => $page, 'book' => $book, 'current' => $page]);
|
return view('pages/show', ['page' => $page, 'book' => $book, 'current' => $page, 'sidebarTree' => $sidebarTree]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -40,7 +40,9 @@ class Page extends Entity
|
|||||||
|
|
||||||
public function getUrl()
|
public function getUrl()
|
||||||
{
|
{
|
||||||
return '/books/' . $this->book->slug . '/page/' . $this->slug;
|
// TODO - Extract this and share with chapters
|
||||||
|
$bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug;
|
||||||
|
return '/books/' . $bookSlug . '/page/' . $this->slug;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getExcerpt($length = 100)
|
public function getExcerpt($length = 100)
|
||||||
|
@ -178,6 +178,30 @@ class BookRepo
|
|||||||
return $slug;
|
return $slug;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all child objects of a book.
|
||||||
|
* Returns a sorted collection of Pages and Chapters.
|
||||||
|
* Loads the bookslug onto child elements to prevent access database access for getting the slug.
|
||||||
|
* @param Book $book
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getChildren(Book $book)
|
||||||
|
{
|
||||||
|
$pages = $book->pages()->where('chapter_id', '=', 0)->get();
|
||||||
|
$chapters = $book->chapters()->with('pages')->get();
|
||||||
|
$children = $pages->merge($chapters);
|
||||||
|
$bookSlug = $book->slug;
|
||||||
|
$children->each(function ($child) use ($bookSlug) {
|
||||||
|
$child->setAttribute('bookSlug', $bookSlug);
|
||||||
|
if ($child->isA('chapter')) {
|
||||||
|
$child->pages->each(function ($page) use ($bookSlug) {
|
||||||
|
$page->setAttribute('bookSlug', $bookSlug);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return $children->sortBy('priority');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get books by search term.
|
* Get books by search term.
|
||||||
* @param $term
|
* @param $term
|
||||||
|
33
app/User.php
33
app/User.php
@ -33,6 +33,12 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
|||||||
*/
|
*/
|
||||||
protected $hidden = ['password', 'remember_token'];
|
protected $hidden = ['password', 'remember_token'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This holds the user's permissions when loaded.
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $permissions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a default guest user.
|
* Returns a default guest user.
|
||||||
*/
|
*/
|
||||||
@ -40,7 +46,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
|||||||
{
|
{
|
||||||
return new static([
|
return new static([
|
||||||
'email' => 'guest',
|
'email' => 'guest',
|
||||||
'name' => 'Guest'
|
'name' => 'Guest'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,7 +64,19 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
|||||||
|
|
||||||
public function getRoleAttribute()
|
public function getRoleAttribute()
|
||||||
{
|
{
|
||||||
return $this->roles()->first();
|
return $this->roles()->with('permissions')->first();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the user's permissions from thier role.
|
||||||
|
*/
|
||||||
|
private function loadPermissions()
|
||||||
|
{
|
||||||
|
if (isset($this->permissions)) return;
|
||||||
|
$this->load('roles.permissions');
|
||||||
|
$permissions = $this->roles[0]->permissions;
|
||||||
|
$permissionsArray = $permissions->pluck('name')->all();
|
||||||
|
$this->permissions = $permissionsArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -68,14 +86,11 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
|||||||
*/
|
*/
|
||||||
public function can($permissionName)
|
public function can($permissionName)
|
||||||
{
|
{
|
||||||
if($this->email == 'guest') {
|
if ($this->email == 'guest') {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$permissions = $this->role->permissions()->get();
|
$this->loadPermissions();
|
||||||
$permissionSearch = $permissions->search(function ($item, $key) use ($permissionName) {
|
return array_search($permissionName, $this->permissions) !== false;
|
||||||
return $item->name == $permissionName;
|
|
||||||
});
|
|
||||||
return $permissionSearch !== false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -114,7 +129,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
|||||||
*/
|
*/
|
||||||
public function hasSocialAccount($socialDriver = false)
|
public function hasSocialAccount($socialDriver = false)
|
||||||
{
|
{
|
||||||
if($socialDriver === false) {
|
if ($socialDriver === false) {
|
||||||
return $this->socialAccounts()->count() > 0;
|
return $this->socialAccounts()->count() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,8 @@
|
|||||||
"laravel/framework": "5.1.*",
|
"laravel/framework": "5.1.*",
|
||||||
"intervention/image": "^2.3",
|
"intervention/image": "^2.3",
|
||||||
"barryvdh/laravel-ide-helper": "^2.1",
|
"barryvdh/laravel-ide-helper": "^2.1",
|
||||||
"laravel/socialite": "^2.0"
|
"laravel/socialite": "^2.0",
|
||||||
|
"barryvdh/laravel-debugbar": "^2.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"fzaninotto/faker": "~1.4",
|
"fzaninotto/faker": "~1.4",
|
||||||
|
145
composer.lock
generated
145
composer.lock
generated
@ -4,8 +4,63 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"hash": "7d7e80e9f1c13417c35195f79e41c038",
|
"hash": "c216d0bcb72b4f2008d7fa8067da2f77",
|
||||||
|
"content-hash": "3c421ae5b8e5c11792249142cb96ff25",
|
||||||
"packages": [
|
"packages": [
|
||||||
|
{
|
||||||
|
"name": "barryvdh/laravel-debugbar",
|
||||||
|
"version": "v2.0.6",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/barryvdh/laravel-debugbar.git",
|
||||||
|
"reference": "23672cbbe78278ff1fdb258caa0b1de7b5d0bc0c"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/23672cbbe78278ff1fdb258caa0b1de7b5d0bc0c",
|
||||||
|
"reference": "23672cbbe78278ff1fdb258caa0b1de7b5d0bc0c",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"illuminate/support": "~5.0.17|5.1.*",
|
||||||
|
"maximebf/debugbar": "~1.10.2",
|
||||||
|
"php": ">=5.4.0",
|
||||||
|
"symfony/finder": "~2.6"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.1-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Barryvdh\\Debugbar\\": "src/"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/helpers.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Barry vd. Heuvel",
|
||||||
|
"email": "barryvdh@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PHP Debugbar integration for Laravel",
|
||||||
|
"keywords": [
|
||||||
|
"debug",
|
||||||
|
"debugbar",
|
||||||
|
"laravel",
|
||||||
|
"profiler",
|
||||||
|
"webprofiler"
|
||||||
|
],
|
||||||
|
"time": "2015-09-09 11:39:27"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "barryvdh/laravel-ide-helper",
|
"name": "barryvdh/laravel-ide-helper",
|
||||||
"version": "v2.1.0",
|
"version": "v2.1.0",
|
||||||
@ -1078,6 +1133,62 @@
|
|||||||
],
|
],
|
||||||
"time": "2015-08-22 09:49:14"
|
"time": "2015-08-22 09:49:14"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "maximebf/debugbar",
|
||||||
|
"version": "v1.10.5",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/maximebf/php-debugbar.git",
|
||||||
|
"reference": "30e53e8a28284b69dd223c9f5ee8957befd72636"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/30e53e8a28284b69dd223c9f5ee8957befd72636",
|
||||||
|
"reference": "30e53e8a28284b69dd223c9f5ee8957befd72636",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0",
|
||||||
|
"psr/log": "~1.0",
|
||||||
|
"symfony/var-dumper": "~2.6"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"kriswallsmith/assetic": "The best way to manage assets",
|
||||||
|
"monolog/monolog": "Log using Monolog",
|
||||||
|
"predis/predis": "Redis storage"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.10-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"DebugBar": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Maxime Bouroumeau-Fuseau",
|
||||||
|
"email": "maxime.bouroumeau@gmail.com",
|
||||||
|
"homepage": "http://maximebf.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Debug bar in the browser for php application",
|
||||||
|
"homepage": "https://github.com/maximebf/php-debugbar",
|
||||||
|
"keywords": [
|
||||||
|
"debug"
|
||||||
|
],
|
||||||
|
"time": "2015-10-19 20:35:12"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "monolog/monolog",
|
"name": "monolog/monolog",
|
||||||
"version": "1.16.0",
|
"version": "1.16.0",
|
||||||
@ -1556,12 +1667,12 @@
|
|||||||
"version": "v2.7.3",
|
"version": "v2.7.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/ClassLoader.git",
|
"url": "https://github.com/symfony/class-loader.git",
|
||||||
"reference": "2fccbc544997340808801a7410cdcb96dd12edc4"
|
"reference": "2fccbc544997340808801a7410cdcb96dd12edc4"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/ClassLoader/zipball/2fccbc544997340808801a7410cdcb96dd12edc4",
|
"url": "https://api.github.com/repos/symfony/class-loader/zipball/2fccbc544997340808801a7410cdcb96dd12edc4",
|
||||||
"reference": "2fccbc544997340808801a7410cdcb96dd12edc4",
|
"reference": "2fccbc544997340808801a7410cdcb96dd12edc4",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
@ -1606,12 +1717,12 @@
|
|||||||
"version": "v2.7.3",
|
"version": "v2.7.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/Console.git",
|
"url": "https://github.com/symfony/console.git",
|
||||||
"reference": "d6cf02fe73634c96677e428f840704bfbcaec29e"
|
"reference": "d6cf02fe73634c96677e428f840704bfbcaec29e"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/Console/zipball/d6cf02fe73634c96677e428f840704bfbcaec29e",
|
"url": "https://api.github.com/repos/symfony/console/zipball/d6cf02fe73634c96677e428f840704bfbcaec29e",
|
||||||
"reference": "d6cf02fe73634c96677e428f840704bfbcaec29e",
|
"reference": "d6cf02fe73634c96677e428f840704bfbcaec29e",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
@ -1663,12 +1774,12 @@
|
|||||||
"version": "v2.7.3",
|
"version": "v2.7.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/CssSelector.git",
|
"url": "https://github.com/symfony/css-selector.git",
|
||||||
"reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092"
|
"reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/CssSelector/zipball/0b5c07b516226b7dd32afbbc82fe547a469c5092",
|
"url": "https://api.github.com/repos/symfony/css-selector/zipball/0b5c07b516226b7dd32afbbc82fe547a469c5092",
|
||||||
"reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092",
|
"reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
@ -1716,12 +1827,12 @@
|
|||||||
"version": "v2.7.3",
|
"version": "v2.7.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/Debug.git",
|
"url": "https://github.com/symfony/debug.git",
|
||||||
"reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3"
|
"reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/Debug/zipball/9daa1bf9f7e615fa2fba30357e479a90141222e3",
|
"url": "https://api.github.com/repos/symfony/debug/zipball/9daa1bf9f7e615fa2fba30357e479a90141222e3",
|
||||||
"reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3",
|
"reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
@ -1776,12 +1887,12 @@
|
|||||||
"version": "v2.7.3",
|
"version": "v2.7.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/DomCrawler.git",
|
"url": "https://github.com/symfony/dom-crawler.git",
|
||||||
"reference": "9dabece63182e95c42b06967a0d929a5df78bc35"
|
"reference": "9dabece63182e95c42b06967a0d929a5df78bc35"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/DomCrawler/zipball/9dabece63182e95c42b06967a0d929a5df78bc35",
|
"url": "https://api.github.com/repos/symfony/dom-crawler/zipball/9dabece63182e95c42b06967a0d929a5df78bc35",
|
||||||
"reference": "9dabece63182e95c42b06967a0d929a5df78bc35",
|
"reference": "9dabece63182e95c42b06967a0d929a5df78bc35",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
@ -1829,12 +1940,12 @@
|
|||||||
"version": "v2.7.3",
|
"version": "v2.7.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/EventDispatcher.git",
|
"url": "https://github.com/symfony/event-dispatcher.git",
|
||||||
"reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3"
|
"reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/9310b5f9a87ec2ea75d20fec0b0017c77c66dac3",
|
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9310b5f9a87ec2ea75d20fec0b0017c77c66dac3",
|
||||||
"reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3",
|
"reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
@ -1936,12 +2047,12 @@
|
|||||||
"version": "v2.7.3",
|
"version": "v2.7.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/HttpFoundation.git",
|
"url": "https://github.com/symfony/http-foundation.git",
|
||||||
"reference": "863af6898081b34c65d42100c370b9f3c51b70ca"
|
"reference": "863af6898081b34c65d42100c370b9f3c51b70ca"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/863af6898081b34c65d42100c370b9f3c51b70ca",
|
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/863af6898081b34c65d42100c370b9f3c51b70ca",
|
||||||
"reference": "863af6898081b34c65d42100c370b9f3c51b70ca",
|
"reference": "863af6898081b34c65d42100c370b9f3c51b70ca",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
@ -1989,12 +2100,12 @@
|
|||||||
"version": "v2.7.3",
|
"version": "v2.7.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/HttpKernel.git",
|
"url": "https://github.com/symfony/http-kernel.git",
|
||||||
"reference": "405d3e7a59ff7a28ec469441326a0ac79065ea98"
|
"reference": "405d3e7a59ff7a28ec469441326a0ac79065ea98"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/HttpKernel/zipball/405d3e7a59ff7a28ec469441326a0ac79065ea98",
|
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/405d3e7a59ff7a28ec469441326a0ac79065ea98",
|
||||||
"reference": "405d3e7a59ff7a28ec469441326a0ac79065ea98",
|
"reference": "405d3e7a59ff7a28ec469441326a0ac79065ea98",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
|
@ -143,6 +143,7 @@ return [
|
|||||||
*/
|
*/
|
||||||
Intervention\Image\ImageServiceProvider::class,
|
Intervention\Image\ImageServiceProvider::class,
|
||||||
Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
|
Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
|
||||||
|
Barryvdh\Debugbar\ServiceProvider::class,
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -207,6 +208,7 @@ return [
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
'ImageTool' => Intervention\Image\Facades\Image::class,
|
'ImageTool' => Intervention\Image\Facades\Image::class,
|
||||||
|
'Debugbar' => Barryvdh\Debugbar\Facade::class,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom
|
* Custom
|
||||||
|
@ -23,6 +23,7 @@ $factory->define(BookStack\User::class, function ($faker) {
|
|||||||
$factory->define(BookStack\Book::class, function ($faker) {
|
$factory->define(BookStack\Book::class, function ($faker) {
|
||||||
return [
|
return [
|
||||||
'name' => $faker->sentence,
|
'name' => $faker->sentence,
|
||||||
|
'slug' => str_random(10),
|
||||||
'description' => $faker->paragraph
|
'description' => $faker->paragraph
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
@ -30,6 +31,7 @@ $factory->define(BookStack\Book::class, function ($faker) {
|
|||||||
$factory->define(BookStack\Chapter::class, function ($faker) {
|
$factory->define(BookStack\Chapter::class, function ($faker) {
|
||||||
return [
|
return [
|
||||||
'name' => $faker->sentence,
|
'name' => $faker->sentence,
|
||||||
|
'slug' => str_random(10),
|
||||||
'description' => $faker->paragraph
|
'description' => $faker->paragraph
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
@ -37,6 +39,7 @@ $factory->define(BookStack\Chapter::class, function ($faker) {
|
|||||||
$factory->define(BookStack\Page::class, function ($faker) {
|
$factory->define(BookStack\Page::class, function ($faker) {
|
||||||
return [
|
return [
|
||||||
'name' => $faker->sentence,
|
'name' => $faker->sentence,
|
||||||
|
'slug' => str_random(10),
|
||||||
'html' => '<p>' . implode('</p>', $faker->paragraphs(5)) . '</p>'
|
'html' => '<p>' . implode('</p>', $faker->paragraphs(5)) . '</p>'
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
|
89
database/migrations/2015_11_26_221857_add_entity_indexes.php
Normal file
89
database/migrations/2015_11_26_221857_add_entity_indexes.php
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
|
||||||
|
class AddEntityIndexes extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('books', function (Blueprint $table) {
|
||||||
|
$table->index('slug');
|
||||||
|
$table->index('created_by');
|
||||||
|
$table->index('updated_by');
|
||||||
|
});
|
||||||
|
Schema::table('pages', function (Blueprint $table) {
|
||||||
|
$table->index('slug');
|
||||||
|
$table->index('book_id');
|
||||||
|
$table->index('chapter_id');
|
||||||
|
$table->index('priority');
|
||||||
|
$table->index('created_by');
|
||||||
|
$table->index('updated_by');
|
||||||
|
});
|
||||||
|
Schema::table('page_revisions', function (Blueprint $table) {
|
||||||
|
$table->index('page_id');
|
||||||
|
});
|
||||||
|
Schema::table('chapters', function (Blueprint $table) {
|
||||||
|
$table->index('slug');
|
||||||
|
$table->index('book_id');
|
||||||
|
$table->index('priority');
|
||||||
|
$table->index('created_by');
|
||||||
|
$table->index('updated_by');
|
||||||
|
});
|
||||||
|
Schema::table('activities', function (Blueprint $table) {
|
||||||
|
$table->index('book_id');
|
||||||
|
$table->index('user_id');
|
||||||
|
$table->index('entity_id');
|
||||||
|
});
|
||||||
|
Schema::table('views', function (Blueprint $table) {
|
||||||
|
$table->index('user_id');
|
||||||
|
$table->index('viewable_id');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('books', function (Blueprint $table) {
|
||||||
|
$table->dropIndex('slug');
|
||||||
|
$table->dropIndex('created_by');
|
||||||
|
$table->dropIndex('updated_by');
|
||||||
|
});
|
||||||
|
Schema::table('pages', function (Blueprint $table) {
|
||||||
|
$table->dropIndex('slug');
|
||||||
|
$table->dropIndex('book_id');
|
||||||
|
$table->dropIndex('chapter_id');
|
||||||
|
$table->dropIndex('priority');
|
||||||
|
$table->dropIndex('created_by');
|
||||||
|
$table->dropIndex('updated_by');
|
||||||
|
});
|
||||||
|
Schema::table('page_revisions', function (Blueprint $table) {
|
||||||
|
$table->dropIndex('page_id');
|
||||||
|
});
|
||||||
|
Schema::table('chapters', function (Blueprint $table) {
|
||||||
|
$table->dropIndex('slug');
|
||||||
|
$table->dropIndex('book_id');
|
||||||
|
$table->dropIndex('priority');
|
||||||
|
$table->dropIndex('created_by');
|
||||||
|
$table->dropIndex('updated_by');
|
||||||
|
});
|
||||||
|
Schema::table('activities', function (Blueprint $table) {
|
||||||
|
$table->dropIndex('book_id');
|
||||||
|
$table->dropIndex('user_id');
|
||||||
|
$table->dropIndex('entity_id');
|
||||||
|
});
|
||||||
|
Schema::table('views', function (Blueprint $table) {
|
||||||
|
$table->dropIndex('user_id');
|
||||||
|
$table->dropIndex('entity_id');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
29
database/seeds/DummyContentSeeder.php
Normal file
29
database/seeds/DummyContentSeeder.php
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Seeder;
|
||||||
|
|
||||||
|
class DummyContentSeeder extends Seeder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the database seeds.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function run()
|
||||||
|
{
|
||||||
|
$user = factory(BookStack\User::class, 1)->create();
|
||||||
|
$role = \BookStack\Role::where('name', '=', 'admin')->first();
|
||||||
|
$user->attachRole($role);
|
||||||
|
|
||||||
|
|
||||||
|
$books = factory(BookStack\Book::class, 20)->create(['created_by' => $user->id, 'updated_by' => $user->id])
|
||||||
|
->each(function($book) use ($user) {
|
||||||
|
$chapters = factory(BookStack\Chapter::class, 5)->create(['created_by' => $user->id, 'updated_by' => $user->id])
|
||||||
|
->each(function($chapter) use ($user, $book){
|
||||||
|
$pages = factory(\BookStack\Page::class, 10)->make(['created_by' => $user->id, 'updated_by' => $user->id, 'book_id' => $book->id]);
|
||||||
|
$chapter->pages()->saveMany($pages);
|
||||||
|
});
|
||||||
|
$book->chapters()->saveMany($chapters);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -37,8 +37,8 @@
|
|||||||
|
|
||||||
<div class="page-list">
|
<div class="page-list">
|
||||||
<hr>
|
<hr>
|
||||||
@if(count($book->children()) > 0)
|
@if(count($bookChildren) > 0)
|
||||||
@foreach($book->children() as $childElement)
|
@foreach($bookChildren as $childElement)
|
||||||
@if($childElement->isA('chapter'))
|
@if($childElement->isA('chapter'))
|
||||||
@include('chapters/list-item', ['chapter' => $childElement])
|
@include('chapters/list-item', ['chapter' => $childElement])
|
||||||
@else
|
@else
|
||||||
|
@ -60,7 +60,7 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 col-md-offset-1">
|
<div class="col-md-3 col-md-offset-1">
|
||||||
@include('pages/sidebar-tree-list', ['book' => $book])
|
@include('pages/sidebar-tree-list', ['book' => $book, 'sidebarTree' => $sidebarTree])
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -60,7 +60,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 print-hidden">
|
<div class="col-md-3 print-hidden">
|
||||||
|
|
||||||
@include('pages/sidebar-tree-list', ['book' => $book])
|
@include('pages/sidebar-tree-list', ['book' => $book, 'sidebarTree' => $sidebarTree])
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<h6 class="text-muted">Book Navigation</h6>
|
<h6 class="text-muted">Book Navigation</h6>
|
||||||
<ul class="sidebar-page-list menu">
|
<ul class="sidebar-page-list menu">
|
||||||
<li class="book-header"><a href="{{$book->getUrl()}}" class="book {{ $current->matches($book)? 'selected' : '' }}"><i class="zmdi zmdi-book"></i>{{$book->name}}</a></li>
|
<li class="book-header"><a href="{{$book->getUrl()}}" class="book {{ $current->matches($book)? 'selected' : '' }}"><i class="zmdi zmdi-book"></i>{{$book->name}}</a></li>
|
||||||
@foreach($book->children() as $bookChild)
|
@foreach($sidebarTree as $bookChild)
|
||||||
<li class="list-item-{{ $bookChild->getName() }}">
|
<li class="list-item-{{ $bookChild->getName() }}">
|
||||||
<a href="{{$bookChild->getUrl()}}" class="{{ $bookChild->getName() }} {{ $current->matches($bookChild)? 'selected' : '' }}">
|
<a href="{{$bookChild->getUrl()}}" class="{{ $bookChild->getName() }} {{ $current->matches($bookChild)? 'selected' : '' }}">
|
||||||
@if($bookChild->isA('chapter'))<i class="zmdi zmdi-collection-bookmark"></i>@else <i class="zmdi zmdi-file-text"></i>@endif{{ $bookChild->name }}
|
@if($bookChild->isA('chapter'))<i class="zmdi zmdi-collection-bookmark"></i>@else <i class="zmdi zmdi-file-text"></i>@endif{{ $bookChild->name }}
|
||||||
|
Loading…
Reference in New Issue
Block a user