From b507d71dddcf70e56c5364f2a3977d3a933ba638 Mon Sep 17 00:00:00 2001 From: Wisp X Date: Sun, 20 Feb 2022 16:13:42 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E5=9B=BE=E7=89=87=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Api.php | 6 +- .../Controllers/Api/V1/ImageController.php | 17 +- app/Http/Controllers/User/ImageController.php | 34 +-- app/Models/Image.php | 37 ++++ public/css/app.css | 8 + resources/views/common/api.blade.php | 205 ++++++++++++++++-- resources/views/user/images.blade.php | 24 +- routes/api.php | 1 + 8 files changed, 266 insertions(+), 66 deletions(-) diff --git a/app/Http/Api.php b/app/Http/Api.php index 5020cee1..27773070 100644 --- a/app/Http/Api.php +++ b/app/Http/Api.php @@ -6,17 +6,17 @@ use Illuminate\Http\Response; trait Api { - public function success(string $message = 'success', array $data = []): Response + public function success(string $message = 'success', $data = []): Response { return $this->response(true, $message, $data); } - public function error(string $message = 'error', array $data = []): Response + public function error(string $message = 'error', $data = []): Response { return $this->response(false, $message, $data); } - public function response(bool $status, string $message = '', array $data = []): Response + public function response(bool $status, string $message = '', $data = []): Response { $data = $data ?: new \stdClass; return response(compact('status', 'message', 'data')); diff --git a/app/Http/Controllers/Api/V1/ImageController.php b/app/Http/Controllers/Api/V1/ImageController.php index da342ad1..9f558ecd 100644 --- a/app/Http/Controllers/Api/V1/ImageController.php +++ b/app/Http/Controllers/Api/V1/ImageController.php @@ -2,11 +2,14 @@ namespace App\Http\Controllers\Api\V1; +use App\Enums\ImagePermission; use App\Exceptions\UploadException; use App\Http\Controllers\Controller; +use App\Models\Image; use App\Models\User; use App\Services\ImageService; use Illuminate\Auth\AuthenticationException; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; @@ -52,12 +55,24 @@ class ImageController extends Controller return $this->error('服务异常,请稍后再试'); } return $this->success('上传成功', $image->setAppends(['pathname', 'links'])->only( - 'key', 'name', 'extension', 'pathname', 'origin_name', 'size', 'mimetype', 'md5', 'sha1', 'links' + 'key', 'name', 'pathname', 'origin_name', 'size', 'mimetype', 'extension', 'md5', 'sha1', 'links' )); } public function images(Request $request): Response { + /** @var User $user */ + $user = Auth::user(); + $images = $user->images()->filter($request)->with('group', 'strategy')->paginate(40)->withQueryString(); + $images->getCollection()->each(function (Image $image) { + $image->human_date = $image->created_at->diffForHumans(); + $image->date = $image->created_at->format('Y-m-d H:i:s'); + $image->append(['pathname', 'links'])->setVisible([ + 'key', 'name', 'pathname', 'origin_name', 'size', 'mimetype', 'extension', 'md5', 'sha1', + 'width', 'height', 'links', 'human_date', 'date', + ]); + }); + return $this->success('success', $images); } } diff --git a/app/Http/Controllers/User/ImageController.php b/app/Http/Controllers/User/ImageController.php index 1eaaa7fd..64efe6ec 100644 --- a/app/Http/Controllers/User/ImageController.php +++ b/app/Http/Controllers/User/ImageController.php @@ -9,7 +9,6 @@ use App\Models\Album; use App\Models\Image; use App\Models\User; use App\Services\UserService; -use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; @@ -28,38 +27,7 @@ class ImageController extends Controller /** @var User $user */ $user = Auth::user(); - $images = Image::with('group', 'strategy') - ->where('user_id', $user->id) - ->when($request->query('order') ?: 'newest', function (Builder $builder, $order) { - switch ($order) { - case 'earliest': - $builder->orderBy('created_at'); - break; - case 'utmost': - $builder->orderByDesc('size'); - break; - case 'least': - $builder->orderBy('size'); - break; - default: - $builder->latest(); - } - })->when($request->query('visibility') ?: 'all', function (Builder $builder, $visibility) { - switch ($visibility) { - case 'public': - $builder->where('permission', ImagePermission::Public); - break; - case 'private': - $builder->where('permission', ImagePermission::Private); - break; - } - })->when($request->query('keyword'), function (Builder $builder, $keyword) { - $builder->whereRaw("concat(origin_name,alias_name) like ?", ["%{$keyword}%"]); - })->when((int) $request->query('album_id'), function (Builder $builder, $albumId) { - $builder->where('album_id', $albumId); - }, function (Builder $builder) { - $builder->whereNull('album_id'); - })->paginate(40); + $images = $user->images()->filter($request)->with('group', 'strategy')->paginate(40); $images->getCollection()->each(function (Image $image) { $image->human_date = $image->created_at->diffForHumans(); $image->date = $image->created_at->format('Y-m-d H:i:s'); diff --git a/app/Models/Image.php b/app/Models/Image.php index 1efc49c3..1160abc2 100644 --- a/app/Models/Image.php +++ b/app/Models/Image.php @@ -3,13 +3,16 @@ namespace App\Models; use App\Enums\GroupConfigKey; +use App\Enums\ImagePermission; use App\Enums\StrategyKey; use App\Services\ImageService; use Carbon\Carbon; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Http\Request; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Str; @@ -108,6 +111,40 @@ class Image extends Model }); } + public function scopeFilter(Builder $builder, Request $request) + { + return $builder->when($request->query('order') ?: 'newest', function (Builder $builder, $order) { + switch ($order) { + case 'earliest': + $builder->orderBy('created_at'); + break; + case 'utmost': + $builder->orderByDesc('size'); + break; + case 'least': + $builder->orderBy('size'); + break; + default: + $builder->latest(); + } + })->when($request->query('permission') ?: 'all', function (Builder $builder, $permission) { + switch ($permission) { + case 'public': + $builder->where('permission', ImagePermission::Public); + break; + case 'private': + $builder->where('permission', ImagePermission::Private); + break; + } + })->when($request->query('keyword'), function (Builder $builder, $keyword) { + $builder->whereRaw("concat(origin_name,alias_name) like ?", ["%{$keyword}%"]); + })->when((int) $request->query('album_id'), function (Builder $builder, $albumId) { + $builder->where('album_id', $albumId); + }, function (Builder $builder) { + $builder->whereNull('album_id'); + }); + } + public function filename(): Attribute { return new Attribute(fn() => $this->alias_name ?: $this->origin_name); diff --git a/public/css/app.css b/public/css/app.css index 50b815a4..a9cda8ef 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -1775,6 +1775,14 @@ select { --tw-text-opacity: 1; color: rgb(252 165 165 / var(--tw-text-opacity)); } +.text-sky-400 { + --tw-text-opacity: 1; + color: rgb(56 189 248 / var(--tw-text-opacity)); +} +.text-sky-500 { + --tw-text-opacity: 1; + color: rgb(14 165 233 / var(--tw-text-opacity)); +} .underline { -webkit-text-decoration-line: underline; text-decoration-line: underline; diff --git a/resources/views/common/api.blade.php b/resources/views/common/api.blade.php index 007707fc..3840a6d0 100644 --- a/resources/views/common/api.blade.php +++ b/resources/views/common/api.blade.php @@ -3,7 +3,7 @@

接口说明

-
+

接口URL

{{ request()->getSchemeAndHttpHost() }}/api/v1 @@ -22,7 +22,7 @@

公共响应 headers 说明

- +
字段 @@ -53,14 +53,14 @@

授权相关

-
+

生成 Token

POST /tokens
-

请求参数

+

请求参数(Body)

- +
字段 @@ -90,7 +90,7 @@

返回参数

- +
字段 @@ -135,7 +135,7 @@

返回参数

- +
字段 @@ -171,7 +171,7 @@

图片相关

-
+

上传图片

POST /upload @@ -179,7 +179,7 @@

Headers

- +
字段 @@ -203,9 +203,9 @@
-

请求参数

+

请求参数(Body)

- +
字段 @@ -231,7 +231,7 @@

返回参数

- + - - - - - @@ -295,6 +290,11 @@ + + + + + @@ -344,6 +344,177 @@
字段 @@ -270,11 +270,6 @@ String 图片名称
extensionString图片拓展名
pathname StringString 图片类型
extensionString图片拓展名
md5 String
+
+

图片列表

+ GET /images + +
+

请求参数(Query)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 字段 + + 类型 + + 说明 +
pageInteger页码
orderString排序方式,newest=最新,earliest=最早,utmost=最大,least=最小
permissionString权限,public=公开的,private=私有的
album_idInteger相册 ID
keywordString筛选关键字
+
+ +
+

返回参数

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 字段 + + 类型 + + 说明 +
statusBoolean状态,true 或 false
messageString描述信息
dataObject数据
current_pageInteger当前所在页页码
last_pageInteger最后一页页码
per_pageInteger每页展示数据数量
totalInteger图片总数量
dataObject[]图片列表
keyString图片唯一密钥
nameString图片名称
origin_nameString图片原始名称
pathnameString图片路径名
sizeFloat图片大小,单位 KB
widthInteger图片宽度
heightInteger图片高度
md5String图片 md5 值
sha1String图片 sha1 值
human_dateString上传时间(友好格式)
dateString上传日期(yyyy-MM-dd HH:mm:ss)
linksObject链接,与上传接口返回参数中的 links 相同
+
+
diff --git a/resources/views/user/images.blade.php b/resources/views/user/images.blade.php index 882c1821..decabdc7 100644 --- a/resources/views/user/images.blade.php +++ b/resources/views/user/images.blade.php @@ -59,18 +59,18 @@ - + 全部 - 全部 + 全部 - 公开 + 公开 - 私有 + 私有 @@ -447,9 +447,9 @@ $('#order span').text({newest: '最新', earliest: '最早', utmost: '最大', least: '最小'}[sort]); }; - const setVisibility = function (visibility) { - resetImages({page: 1, visibility: visibility}) - $('#visibility span').text({public: '公开', private: '私有', all: '全部'}[visibility]); + const setPermission = function (permission) { + resetImages({page: 1, permission: permission}) + $('#permission span').text({public: '公开', private: '私有', all: '全部'}[permission]); }; $('#search').keydown(function (e) { @@ -569,7 +569,7 @@ } }); }, - visibility() { + permission() { Swal.fire({ title: '选择一个权限', text: '选择公开将会出现在画廊中(若平台开启了画廊)', @@ -780,9 +780,9 @@ text: '删除', action: _ => methods.delete(), }, - visibility: { + permission: { text: '设置可见性', - action: _ => methods.visibility(), + action: _ => methods.permission(), }, }; // right click 'images scroll' container @@ -800,7 +800,7 @@ actions.open, actions.movements, actions.remove, - actions.visibility, + actions.permission, actions.detail, {divider: true}, actions.rename, @@ -842,7 +842,7 @@ methods.rename(selected[0]); break; case 'permission': // 设置可见性 - methods.visibility(); + methods.permission(); break; case 'detail': methods.detail(selected[0]); diff --git a/routes/api.php b/routes/api.php index 0755dad8..463b4b62 100644 --- a/routes/api.php +++ b/routes/api.php @@ -22,6 +22,7 @@ Route::group(['prefix' => 'v1'], function () { Route::group([ 'middleware' => 'auth:sanctum', ], function () { + Route::get('images', [ImageController::class, 'images']); Route::delete('tokens', [TokenController::class, 'clear']); }); });