浏览代码

Merge pull request #916 from pixelfed/frontend-ui-refactor

Frontend ui refactor
daniel 6 年之前
父节点
当前提交
81e4fb805c
共有 34 个文件被更改,包括 625 次插入49 次删除
  1. 1 0
      .env.example
  2. 1 0
      app/Avatar.php
  3. 88 0
      app/Console/Commands/UserCreate.php
  4. 72 0
      app/Console/Commands/UserDelete.php
  5. 54 0
      app/Console/Commands/UserShow.php
  6. 56 0
      app/Console/Commands/UserSuspend.php
  7. 49 0
      app/Console/Commands/UserTable.php
  8. 56 0
      app/Console/Commands/UserUnsuspend.php
  9. 3 3
      app/Http/Controllers/Admin/AdminSettingsController.php
  10. 2 3
      app/Http/Controllers/AvatarController.php
  11. 33 0
      app/Mail/EmailChange.php
  12. 33 0
      app/Mail/PasswordChange.php
  13. 50 0
      app/Providers/HorizonServiceProvider.php
  14. 4 4
      composer.json
  15. 22 20
      composer.lock
  16. 2 0
      config/horizon.php
  17. 2 0
      public/vendor/horizon/.gitignore
  18. 二进制
      public/vendor/horizon/css/app.css
  19. 0 1
      public/vendor/horizon/css/app.css.map
  20. 二进制
      public/vendor/horizon/img/favicon.png
  21. 0 8
      public/vendor/horizon/img/horizon.svg
  22. 0 0
      public/vendor/horizon/img/sprite.svg
  23. 二进制
      public/vendor/horizon/js/app.js
  24. 0 0
      public/vendor/horizon/js/app.js.map
  25. 二进制
      public/vendor/horizon/mix-manifest.json
  26. 1 1
      resources/assets/js/components/PostComponent.vue
  27. 11 3
      resources/assets/js/components/Profile.vue
  28. 10 2
      resources/assets/js/components/Timeline.vue
  29. 40 0
      resources/assets/sass/custom.scss
  30. 2 2
      resources/views/admin/settings/system.blade.php
  31. 1 1
      resources/views/emails/confirm_email.blade.php
  32. 15 0
      resources/views/emails/notification/email_change.blade.php
  33. 15 0
      resources/views/emails/notification/password_change.blade.php
  34. 2 1
      resources/views/status/show.blade.php

+ 1 - 0
.env.example

@@ -56,6 +56,7 @@ MIX_API_SEARCH="${API_SEARCH}"
 
 ACTIVITYPUB_INBOX=false
 ACTIVITYPUB_SHAREDINBOX=false
+HORIZON_DARKMODE=true
 
 # Set these both "true" to enable federation.
 # You might need to also run:

+ 1 - 0
app/Avatar.php

@@ -15,6 +15,7 @@ class Avatar extends Model
      * @var array
      */
     protected $dates = ['deleted_at'];
+    protected $fillable = ['profile_id'];
 
     public function profile()
     {

+ 88 - 0
app/Console/Commands/UserCreate.php

@@ -0,0 +1,88 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use App\User;
+
+class UserCreate extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'user:create';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Create a new user';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $this->info('Creating a new user...');
+
+        $name = $this->ask('Name');
+
+        $username = $this->ask('Username');
+
+        if(User::whereUsername($username)->exists()) {
+            $this->error('Username already in use, please try again...');
+            exit;
+        }
+
+        $email = $this->ask('Email');
+
+        if(User::whereEmail($email)->exists()) {
+            $this->error('Email already in use, please try again...');
+            exit;
+        }
+
+        $password = $this->secret('Password');
+        $confirm = $this->secret('Confirm Password');
+
+        if($password !== $confirm) {
+            $this->error('Password mismatch, please try again...');
+            exit;
+        }
+        
+        $is_admin = $this->confirm('Make this user an admin?');
+        $confirm_email = $this->confirm('Manually verify email address?');
+
+        if($this->confirm('Are you sure you want to create this user?') && 
+            $username &&
+            $name && 
+            $email && 
+            $password
+        ) {
+            $user = new User;
+            $user->username = $username;
+            $user->name = $name;
+            $user->email = $email;
+            $user->password = bcrypt($password);
+            $user->is_admin = $is_admin;
+            $user->email_verified_at = $confirm_email ? now() : null;
+            $user->save();
+
+            $this->info('Created new user!');
+        }
+    }
+}

+ 72 - 0
app/Console/Commands/UserDelete.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use App\User;
+use App\Jobs\DeletePipeline\DeleteAccountPipeline;
+
+class UserDelete extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'user:delete {id}';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Delete account';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $id = $this->argument('id');
+        $user = User::whereUsername($id)->orWhere('id', $id)->first();
+        if(!$user) {
+            $this->error('Could not find any user with that username or id.');
+            exit;
+        }
+
+        if($user->is_admin == true) {
+            $this->error('Cannot delete an admin account from CLI.');
+            exit;
+        }
+
+        if(!$this->confirm('Are you sure you want to delete this account?')) {
+            exit;
+        }
+
+        $confirmation = $this->ask('Enter the username to confirm deletion');
+
+        if($confirmation !== $user->username) {
+            $this->error('Username does not match, exiting...');
+            exit;
+        }
+
+        $profile = $user->profile;
+        $profile->status = $user->status = 'deleted';
+        $profile->save();
+        $user->save();
+
+        DeleteAccountPipeline::dispatchNow($user);
+    }
+}

+ 54 - 0
app/Console/Commands/UserShow.php

@@ -0,0 +1,54 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use App\User;
+
+class UserShow extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'user:show {id}';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Show user info';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $id = $this->argument('id');
+        $user = User::whereUsername($id)->orWhere('id', $id)->first();
+        if(!$user) {
+            $this->error('Could not find any user with that username or id.');
+            exit;
+        }
+
+        $this->info('User ID: ' . $user->id);
+        $this->info('Username: ' . $user->username);
+        $this->info('Email: ' . $user->email);
+        $this->info('Joined: ' . $user->created_at->diffForHumans());
+        $this->info('Status Count: ' . $user->statuses()->count());
+    }
+}

+ 56 - 0
app/Console/Commands/UserSuspend.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use App\User;
+
+class UserSuspend extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'user:suspend {id}';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Suspend a local user.';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $id = $this->argument('id');
+        $user = User::whereUsername($id)->orWhere('id', $id)->first();
+        if(!$user) {
+            $this->error('Could not find any user with that username or id.');
+            exit;
+        }
+        $this->info('Found user, username: ' . $user->username);
+        if($this->confirm('Are you sure you want to suspend this user?')) {
+            $profile = $user->profile;
+            $user->status = $profile->status = 'suspended';
+            $user->save();
+            $profile->save();
+            $this->info('User account has been suspended.');
+        }
+    }
+}

+ 49 - 0
app/Console/Commands/UserTable.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use App\User;
+
+class UserTable extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'user:table {limit=10}';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Display latest users';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $limit = $this->argument('limit');
+
+        $headers = ['ID', 'Username', 'Name', 'Registered'];
+
+        $users = User::orderByDesc('id')->take($limit)->get(['id', 'username', 'name', 'created_at'])->toArray();
+
+        $this->table($headers, $users);
+    }
+}

+ 56 - 0
app/Console/Commands/UserUnsuspend.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use App\User;
+
+class UserUnsuspend extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'user:unsuspend {id}';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Unsuspend a local user.';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $id = $this->argument('id');
+        $user = User::whereUsername($id)->orWhere('id', $id)->first();
+        if(!$user) {
+            $this->error('Could not find any user with that username or id.');
+            exit;
+        }
+        $this->info('Found user, username: ' . $user->username);
+        if($this->confirm('Are you sure you want to unsuspend this user?')) {
+            $profile = $user->profile;
+            $user->status = $profile->status = null;
+            $user->save();
+            $profile->save();
+            $this->info('User account has been unsuspended.');
+        }
+    }
+}

+ 3 - 3
app/Http/Controllers/Admin/AdminSettingsController.php

@@ -19,8 +19,8 @@ trait AdminSettingsController
 
     public function settingsBackups(Request $request)
     {
-      $path = storage_path('app/PixelFed');
-      $files = new \DirectoryIterator($path);
+      $path = storage_path('app/'.config('app.name'));
+      $files = is_dir($path) ? new \DirectoryIterator($path) : [];
       return view('admin.settings.backups', compact('files'));
     }
 
@@ -106,7 +106,7 @@ trait AdminSettingsController
     $sys = [
       'pixelfed' => config('pixelfed.version'),
       'php' => phpversion(),
-      'redis' => explode(' ',exec('redis-cli -v'))[1],
+      'laravel' => app()->version(),
     ];
     switch (config('database.default')) {
       case 'pgsql':

+ 2 - 3
app/Http/Controllers/AvatarController.php

@@ -30,11 +30,10 @@ class AvatarController extends Controller
             $dir = $path['root'];
             $name = $path['name'];
             $public = $path['storage'];
-            $currentAvatar = storage_path('app/'.$profile->avatar->media_path);
             $loc = $request->file('avatar')->storeAs($public, $name);
 
-            $avatar = Avatar::whereProfileId($profile->id)->firstOrFail();
-            $opath = $avatar->media_path;
+            $avatar = Avatar::firstOrNew(['profile_id' => $profile->id]);
+            $currentAvatar = $avatar->recentlyCreated ? null : storage_path('app/'.$profile->avatar->media_path);
             $avatar->media_path = "$public/$name";
             $avatar->thumb_path = null;
             $avatar->change_count = ++$avatar->change_count;

+ 33 - 0
app/Mail/EmailChange.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Mail;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Mail\Mailable;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Contracts\Queue\ShouldQueue;
+
+class EmailChange extends Mailable
+{
+    use Queueable, SerializesModels;
+
+    /**
+     * Create a new message instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        //
+    }
+
+    /**
+     * Build the message.
+     *
+     * @return $this
+     */
+    public function build()
+    {
+        return $this->markdown('emails.notification.email_change');
+    }
+}

+ 33 - 0
app/Mail/PasswordChange.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Mail;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Mail\Mailable;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Contracts\Queue\ShouldQueue;
+
+class PasswordChange extends Mailable
+{
+    use Queueable, SerializesModels;
+
+    /**
+     * Create a new message instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        //
+    }
+
+    /**
+     * Build the message.
+     *
+     * @return $this
+     */
+    public function build()
+    {
+        return $this->markdown('emails.notification.password_change');
+    }
+}

+ 50 - 0
app/Providers/HorizonServiceProvider.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace App\Providers;
+
+use Laravel\Horizon\Horizon;
+use Illuminate\Support\Facades\Gate;
+use Laravel\Horizon\HorizonApplicationServiceProvider;
+
+class HorizonServiceProvider extends HorizonApplicationServiceProvider
+{
+    /**
+     * Bootstrap any application services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        parent::boot();
+
+        // Horizon::routeSmsNotificationsTo('15556667777');
+        // Horizon::routeMailNotificationsTo('example@example.com');
+        // Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel');
+    }
+
+    /**
+     * Register the Horizon gate.
+     *
+     * This gate determines who can access Horizon in non-local environments.
+     *
+     * @return void
+     */
+    protected function gate()
+    {
+        Gate::define('viewHorizon', function ($user) {
+            return $user->is_admin == true;
+        });
+    }
+
+    /**
+     * Register any application services.
+     *
+     * @return void
+     */
+    public function register()
+    {
+        if(config('horizon.darkmode') == true) {
+            Horizon::night();
+        }
+    }
+}

+ 4 - 4
composer.json

@@ -19,7 +19,7 @@
         "greggilbert/recaptcha": "dev-master",
         "intervention/image": "^2.4",
         "laravel/framework": "5.8.*",
-        "laravel/horizon": "^1.2",
+        "laravel/horizon": "^3.0",
         "laravel/passport": "^7.0",
         "laravel/tinker": "^1.0",
         "league/flysystem-aws-s3-v3": "~1.0",
@@ -42,7 +42,7 @@
         "fzaninotto/faker": "^1.4",
         "mockery/mockery": "^1.0",
         "nunomaduro/collision": "^2.0",
-        "phpunit/phpunit": "^7.0"
+        "phpunit/phpunit": "^7.5"
     },
     "autoload": {
         "classmap": [
@@ -69,11 +69,11 @@
             "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
         ],
         "post-create-project-cmd": [
-            "@php artisan key:generate"
+            "@php artisan key:generate --ansi"
         ],
         "post-autoload-dump": [
             "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
-            "@php artisan package:discover"
+            "@php artisan package:discover --ansi"
         ]
     },
     "config": {

+ 22 - 20
composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "8f9feb6f0dd669b7a0974809de05d8bd",
+    "content-hash": "d7c9f518e63d20424dd17883057f5cb8",
     "packages": [
         {
             "name": "alchemy/binary-driver",
@@ -71,16 +71,16 @@
         },
         {
             "name": "aws/aws-sdk-php",
-            "version": "3.87.19",
+            "version": "3.87.21",
             "source": {
                 "type": "git",
                 "url": "https://github.com/aws/aws-sdk-php.git",
-                "reference": "79366d3335649960f49694eb052cbdac6616f843"
+                "reference": "266641679eea15075ea13c088f9737460351f7ab"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/79366d3335649960f49694eb052cbdac6616f843",
-                "reference": "79366d3335649960f49694eb052cbdac6616f843",
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/266641679eea15075ea13c088f9737460351f7ab",
+                "reference": "266641679eea15075ea13c088f9737460351f7ab",
                 "shasum": ""
             },
             "require": {
@@ -149,7 +149,7 @@
                 "s3",
                 "sdk"
             ],
-            "time": "2019-02-26T19:08:43+00:00"
+            "time": "2019-02-28T20:02:04+00:00"
         },
         {
             "name": "beyondcode/laravel-self-diagnosis",
@@ -1741,40 +1741,42 @@
         },
         {
             "name": "laravel/horizon",
-            "version": "v1.4.3",
+            "version": "v3.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/horizon.git",
-                "reference": "b00da78d10158036cab2f45115ecc360f2014ed4"
+                "reference": "11acb6eafee4a0ea3bea87c6277f4342ebd2e1e3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/horizon/zipball/b00da78d10158036cab2f45115ecc360f2014ed4",
-                "reference": "b00da78d10158036cab2f45115ecc360f2014ed4",
+                "url": "https://api.github.com/repos/laravel/horizon/zipball/11acb6eafee4a0ea3bea87c6277f4342ebd2e1e3",
+                "reference": "11acb6eafee4a0ea3bea87c6277f4342ebd2e1e3",
                 "shasum": ""
             },
             "require": {
                 "cakephp/chronos": "^1.0",
+                "ext-json": "*",
                 "ext-pcntl": "*",
                 "ext-posix": "*",
-                "illuminate/contracts": "~5.5",
-                "illuminate/queue": "~5.5",
-                "illuminate/support": "~5.5",
+                "illuminate/contracts": "~5.7.0|~5.8.0",
+                "illuminate/queue": "~5.7.0|~5.8.0",
+                "illuminate/support": "~5.7.0|~5.8.0",
                 "php": ">=7.1.0",
                 "predis/predis": "^1.1",
                 "ramsey/uuid": "^3.5",
-                "symfony/debug": "~3.3|~4.0"
+                "symfony/debug": "^4.2",
+                "symfony/process": "^4.2"
             },
             "require-dev": {
-                "mockery/mockery": "~1.0",
-                "orchestra/database": "~3.5",
-                "orchestra/testbench": "~3.5",
-                "phpunit/phpunit": "~6.0"
+                "mockery/mockery": "^1.0",
+                "orchestra/database": "^3.7",
+                "orchestra/testbench": "^3.7",
+                "phpunit/phpunit": "^7.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0-dev"
+                    "dev-master": "3.0-dev"
                 },
                 "laravel": {
                     "providers": [
@@ -1805,7 +1807,7 @@
                 "laravel",
                 "queue"
             ],
-            "time": "2018-11-01T14:03:51+00:00"
+            "time": "2019-02-27T15:44:24+00:00"
         },
         {
             "name": "laravel/passport",

+ 2 - 0
config/horizon.php

@@ -91,4 +91,6 @@ return [
             ],
         ],
     ],
+
+    'darkmode' => env('HORIZON_DARKMODE', false),
 ];

+ 2 - 0
public/vendor/horizon/.gitignore

@@ -0,0 +1,2 @@
+*
+!.gitignore

二进制
public/vendor/horizon/css/app.css


+ 0 - 1
public/vendor/horizon/css/app.css.map

@@ -1 +0,0 @@
-{"version":3,"file":"/css/app.css","sources":[],"mappings":";;;;;A","sourceRoot":""}

二进制
public/vendor/horizon/img/favicon.png


文件差异内容过多而无法显示
+ 0 - 8
public/vendor/horizon/img/horizon.svg


文件差异内容过多而无法显示
+ 0 - 0
public/vendor/horizon/img/sprite.svg


二进制
public/vendor/horizon/js/app.js


文件差异内容过多而无法显示
+ 0 - 0
public/vendor/horizon/js/app.js.map


二进制
public/vendor/horizon/mix-manifest.json


+ 1 - 1
resources/assets/js/components/PostComponent.vue

@@ -172,7 +172,7 @@
       <div class="list-group-item border-0" v-for="(user, index) in likes" :key="'modal_likes_'+index">
         <div class="media">
           <a :href="user.url">
-            <img class="mr-3 rounded-circle box-shadow" :src="user.avatar" :alt="user.username + ’s avatar'" width="30px">
+            <img class="mr-3 rounded-circle box-shadow" :src="user.avatar" :alt="user.username + '’s avatar'" width="30px">
           </a>
           <div class="media-body">
             <p class="mb-0" style="font-size: 14px">

+ 11 - 3
resources/assets/js/components/Profile.vue

@@ -671,6 +671,9 @@ export default {
 			.then(res => {
 				this.following = res.data;
 				this.followingCursor++;
+        if(res.data.length < 10) {
+					this.followingMore = false;
+				}
 			});
 			this.$refs.followingModal.show();
 		},
@@ -688,7 +691,10 @@ export default {
 			.then(res => {
 				this.followers = res.data;
 				this.followerCursor++;
-			})
+        if(res.data.length < 10) {
+					this.followerMore = false;
+				}
+			})	
 			this.$refs.followerModal.show();
 		},
 
@@ -702,7 +708,8 @@ export default {
 				if(res.data.length > 0) {
 					this.following.push(...res.data);
 					this.followingCursor++;
-				} else {
+				}
+        if(res.data.length < 10) {
 					this.followingMore = false;
 				}
 			});
@@ -719,7 +726,8 @@ export default {
 				if(res.data.length > 0) {
 					this.followers.push(...res.data);
 					this.followerCursor++;
-				} else {
+				}
+        if(res.data.length < 10) {
 					this.followerMore = false;
 				}
 			});

+ 10 - 2
resources/assets/js/components/Timeline.vue

@@ -892,6 +892,9 @@
 					this.following = res.data;
 					this.followingCursor++;
 				});
+        if(res.data.length < 10) {
+					this.followingMore = false;
+				}
 				this.$refs.followingModal.show();
 			},
 
@@ -909,6 +912,9 @@
 					this.followers = res.data;
 					this.followerCursor++;
 				})
+        if(res.data.length < 10) {
+					this.followerMore = false;
+				}
 				this.$refs.followerModal.show();
 			},
 
@@ -922,7 +928,8 @@
 					if(res.data.length > 0) {
 						this.following.push(...res.data);
 						this.followingCursor++;
-					} else {
+					}
+          if(res.data.length < 10) {
 						this.followingMore = false;
 					}
 				});
@@ -939,7 +946,8 @@
 					if(res.data.length > 0) {
 						this.followers.push(...res.data);
 						this.followerCursor++;
-					} else {
+					}
+          if(res.data.length < 10) {
 						this.followerMore = false;
 					}
 				});

+ 40 - 0
resources/assets/sass/custom.scss

@@ -211,6 +211,46 @@ body, button, input, textarea {
   animation: loading-bar 3s linear infinite;
 }
 
+.liked {
+    position: relative;
+    z-index: 1;
+}
+
+.liked::after {
+    content: "\F0a3";
+    color: transparent;
+    animation: liking 1.5s;
+    position: absolute;
+    z-index: -1;
+    left: 50%;
+    top: 0;
+}
+
+@keyframes liking {
+ 0% {
+  -webkit-transform:rotate(0deg);
+  transform:rotate(0deg);
+  font-size:0;
+  top: .25rem;
+  color: #ebf70e;
+ }
+ 75% {
+  -webkit-transform:rotate(1turn);
+  transform:rotate(1turn);
+  top: -0.55rem;
+  font-size: 2.8rem;
+  opacity:1;
+  left: -0.55rem;
+ }
+ 100% {
+  transform:rotate(1turn);
+  top: 2.5rem;
+  left: 0em;
+  font-size:0;
+  left: 0.9rem
+ }
+}
+
 .max-hide-overflow {
   max-height: 500px;
   overflow-y: hidden;

+ 2 - 2
resources/views/admin/settings/system.blade.php

@@ -37,9 +37,9 @@
   	<div class="col-12 col-md-3">
   		<div class="card mb-3 border-left-blue">
   			<div class="card-body text-center">
-  				<p class="font-weight-ultralight h2 mb-0 text-truncate">{{$sys['redis']}}</p>
+  				<p class="font-weight-ultralight h2 mb-0 text-truncate">{{$sys['laravel']}}</p>
   			</div>
-  			<div class="card-footer font-weight-bold py-0 text-center bg-white">Redis</div>
+  			<div class="card-footer font-weight-bold py-0 text-center bg-white">Laravel</div>
   		</div>
   	</div>
   </div>

+ 1 - 1
resources/views/emails/confirm_email.blade.php

@@ -8,5 +8,5 @@ Confirm Email
 @endcomponent
 
 Thanks,<br>
-{{ config('app.name') }}
+{{ config('pixelfed.domain.app') }}
 @endcomponent

+ 15 - 0
resources/views/emails/notification/email_change.blade.php

@@ -0,0 +1,15 @@
+@component('mail::message')
+# Account Email Changed
+
+
+@component('mail::panel')
+<p>The email associated to your account has been changed.</p>
+@endcomponent
+
+<small>If you did not make this change and believe your Pixelfed account has been compromised, please contact the instance admin.</small>
+
+<br>
+
+Thanks,<br>
+{{ config('pixelfed.domain.app') }}
+@endcomponent

+ 15 - 0
resources/views/emails/notification/password_change.blade.php

@@ -0,0 +1,15 @@
+@component('mail::message')
+# Account Password Changed
+
+
+@component('mail::panel')
+<p>The password for your account has been changed.</p>
+@endcomponent
+
+<small>If you did not make this change and believe your Pixelfed account has been compromised, please change your password immediately or contact the instance admin if you're locked out of your account.</small>
+
+<br>
+
+Thanks,<br>
+{{ config('pixelfed.domain.app') }}
+@endcomponent

+ 2 - 1
resources/views/status/show.blade.php

@@ -1,4 +1,4 @@
-@extends('layouts.app',['title' => $user->username . " posted a photo: " . $status->likes_count . " likes, " . $status->comments_count . " comments" ])
+@extends('layouts.app',['title' => "A post by " . $user->username])
 
 @section('content')
 <noscript>
@@ -18,6 +18,7 @@
   <meta property="og:description" content="{{ $status->caption }}">
   <meta property="og:image" content="{{$status->mediaUrl()}}">
   <link href='{{$status->url()}}' rel='alternate' type='application/activity+json'>
+  <meta name="twitter:card" content="summary_large_image">
 @endpush
 
 @push('scripts')

部分文件因为文件数量过多而无法显示