diff --git a/app/Http/Controllers/Console/Link.php b/app/Http/Controllers/Console/Link.php index 4dd1149..c3f8fc2 100644 --- a/app/Http/Controllers/Console/Link.php +++ b/app/Http/Controllers/Console/Link.php @@ -91,6 +91,11 @@ protected function ViewList(Request $request): Factory|View|Application|Redirect protected function ViewCheck(Request $request): Factory|View|Application { + // 检查是否存在含有未在本站分配位置 + $this->data['blog'] = DB::table('blog_link') + ->whereIn('blog_link.blogLocation',[0]) + ->get() + ->toArray(); return view('console.friends-link.check', $this->data); } @@ -106,6 +111,11 @@ protected function ViewSort(): Factory|View|Application protected function ViewColor(): Factory|View|Application { - return view('concole.friends-link.color',$this->data); + return view('console.friends-link.color',$this->data); + } + + protected function apiConsoleAdd() { + // 检查数据 + } } diff --git a/app/Http/Controllers/Function/Link.php b/app/Http/Controllers/Function/Link.php index c3f5d21..fba3798 100644 --- a/app/Http/Controllers/Function/Link.php +++ b/app/Http/Controllers/Function/Link.php @@ -12,8 +12,13 @@ use Illuminate\Contracts\Foundation\Application; use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\View; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Mail\Message; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Mail; +use Illuminate\Support\Facades\Response; +use Illuminate\Support\Facades\Validator; class Link extends Controller { @@ -25,22 +30,252 @@ public function __construct() $this->data = $data->data; } - protected function ViewLink(Request $request): Factory|View|Application + public function apiCustomAdd(Request $request): JsonResponse + { + /** @var array $returnData Json的 return 返回值 */ + /** @var Validator $dataCheck 数据判断 */ + /** @var array $errorInfo 错误信息 */ + /** @var array $errorSingle 输出单个错误信息 */ + // 检查数据 + $dataCheck = Validator::make($request->all(), [ + 'userEmail' => 'required|email', + 'userServerHost' => 'required|string', + 'userBlog' => 'required|string', + 'userUrl' => 'required|regex:#[a-zA-z]+://[^\s]*#', + 'userDescription' => 'required|string', + 'userIcon' => 'required|regex:#[a-zA-z]+://[^\s]*#', + 'checkRssJudge' => 'boolean', + 'userRss' => 'string|regex:#[a-zA-z]+://[^\s]*#', + 'userLocation' => 'required|int', + 'userSelColor' => 'required|int', + 'userRemark' => 'required|string', + ]); + + // 检查发现错误 + if ($dataCheck->fails()) { + $errorType = array_keys($dataCheck->failed()); + $i = 0; + foreach ($dataCheck->failed() as $valueData) { + $errorInfo[$errorType[$i]] = array_keys($valueData); + if ($i == 0) { + $errorSingle = [ + 'info' => $errorType[$i], + 'need' => $errorInfo[$errorType[$i]], + ]; + } + $i++; + } + $returnData = [ + 'output' => 'DataFormatError', + 'code' => 403, + 'data' => [ + 'message' => '输入内容有错误', + 'errorSingle' => $errorSingle, + 'error' => $errorInfo, + ], + ]; + } else { + // 检查数据 + if (empty($request->checkRssJudge)) { + $request->checkRssJudge = 0; + } + + // 根据数据库检查邮箱用户是否已存在 + $resultBlog = DB::table('blog_link') + ->where([ + ['blogOwnEmail', '=', $request->userEmail, 'or'], + ['blogName', '=', $request->userBlog, 'or'], + ['blogUrl', '=', $request->userUrl, 'or'] + ])->get()->toArray(); + + if (empty($resultBlog)) { + // 数据写入数据库 + $insertData = DB::table('blog_link') + ->insert([ + 'blogOwnEmail' => $request->userEmail, + 'blogUrl' => $request->userUrl, + 'blogName' => $request->userBlog, + 'blogDescription' => $request->userDescription, + 'blogIcon' => $request->userIcon, + 'blogRssJudge' => $request->checkRssJudge, + 'blogRSS' => $request->userRss, + 'blogUserLocation' => $request->userLocation, + 'blogSetColor' => $request->userSelColor, + 'blogRemark' => $request->userRemark, + ]); + if ($insertData) { + // 邮件发送系统 + Mail::send('mail.link-custom-add', $request->toArray(), function (Message $mail) { + global $request; + $mail->from(env('MAIL_USERNAME'), env('APP_NAME')); + $mail->to($request->userEmail); + $mail->subject(env('APP_NAME') . '-友链等待审核通知'); + }); + // 消息成功通知 + $returnData = [ + 'output' => 'Success', + 'code' => 200, + 'data' => [ + 'message' => '您已成功申请', + ], + ]; + } + } else { + $returnData = [ + 'output' => 'AlreadyUser', + 'code' => 403, + 'data' => [ + 'message' => '已有此用户,您是否已在本博客注册过', + ], + ]; + } + } + + return Response::json($returnData, $returnData['code']); + } + + public function apiCustomSearch(Request $request): JsonResponse + { + /** @var array $returnData Json的 return 返回值 */ + if (!empty($request->location_search)) { + if ($request->searchType == 'all') { + $resultData = DB::table('blog_link') + ->where([ + ['blogName', 'LIKE', '%' . $request->location_search . '%', 'or'], + ['blogUrl', 'LIKE', '%' . $request->location_search . '%', 'or'], + ['blogOwnEmail', 'LIKE', '%' . $request->location_search . '%', 'or']]) + ->select('blogName','blogUrl','blogDescription','blogIcon') + ->orderBy('id') + ->get() + ->toArray(); + if (!empty($resultData)) { + $returnData = [ + 'output' => 'Success', + 'code' => 200, + 'data' => [ + 'message' => '数据输出成功', + 'data' => $resultData, + ], + ]; + } else { + $returnData = [ + 'output' => 'NoData', + 'code' => 200, + 'data' => [ + 'message' => '没有数据', + ], + ]; + } + } else { + if ($request->searchType == 'blogName') { + $resultData = DB::table('blog_link') + ->where([['blogName', 'LIKE', '%' . $request->location_search . '%']]) + ->select('blogName','blogUrl','blogDescription','blogIcon') + ->orderBy('id') + ->get() + ->toArray(); + if (!empty($resultData)) { + $returnData = [ + 'output' => 'Success', + 'code' => 200, + 'data' => [ + 'message' => '数据输出成功', + 'data' => $resultData, + ], + ]; + } else { + $returnData = [ + 'output' => 'NoData', + 'code' => 200, + 'data' => [ + 'message' => '没有数据', + ], + ]; + } + } elseif ($request->searchType == 'blogUrl') { + $resultData = DB::table('blog_link') + ->where([['blogUrl', 'LIKE', '%' . $request->location_search . '%']]) + ->select('blogName','blogUrl','blogDescription','blogIcon') + ->orderBy('id') + ->get() + ->toArray(); + if (!empty($resultData)) { + $returnData = [ + 'output' => 'Success', + 'code' => 200, + 'data' => [ + 'message' => '数据输出成功', + 'data' => $resultData, + ], + ]; + } else { + $returnData = [ + 'output' => 'NoData', + 'code' => 200, + 'data' => [ + 'message' => '没有数据', + ], + ]; + } + } else { + $returnData = [ + 'output' => 'TypeError', + 'code' => 403, + 'data' => [ + 'message' => '类型错误请检查', + ], + ]; + } + } + } else { + $returnData = [ + 'output' => 'SearchEmpty', + 'code' => 403, + 'data' => [ + 'message' => '搜索为空,请输入内容', + ], + ]; + } + return Response::json($returnData,$returnData['code']); + } + + protected function viewLink(Request $request): Factory|View|Application { $this->data['webSubTitle'] = '友链'; $this->GetFriendsLink($this->data); - return view('function.link',$this->data); - } - - protected function ViewMakeFriend(): Factory|View|Application - { - $this->data['webSubTitle'] = '添加友链'; - return view('function.make-friend',$this->data); + return view('function.link', $this->data); } private function GetFriendsLink(array &$data): void { - $data['blogLink'] = DB::table('blog_link')->whereNotIn('blog_link.blogLocation',[0])->get()->toArray(); + $data['blogLink'] = DB::table('blog_link')->whereNotIn('blog_link.blogLocation', [0])->get()->toArray(); $data['blogSort'] = DB::table('blog_sort')->orderBy('blog_sort.sort')->get()->toArray(); } + + protected function viewMakeFriend(): Factory|View|Application + { + $this->data['webSubTitle'] = '添加友链'; + $this->data['blogColor'] = DB::table('blog_color') + ->orderBy('id') + ->get() + ->toArray(); + $this->data['blogSort'] = DB::table('blog_sort') + ->orderBy('sort') + ->get() + ->toArray(); + return view('function.make-friend', $this->data); + } + + protected function viewEditFriend(): Factory|View|Application + { + $this->data['webSubTitle'] = '修改友链'; + + return view('function.edit-friend', $this->data); + } + + protected function viewSearchFriends(): Factory|View|Application + { + $this->data['webSubTitle'] = '查询列表'; + return view('function.edit-search', $this->data); + } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index bd816f6..bb88ce4 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -45,7 +45,7 @@ public function boot() $this->routes(function () { Route::prefix('api') ->middleware('api') - ->namespace($this->namespace) + ->namespace($this->namespace.'\\api') ->group(base_path('routes/api.php')); Route::middleware('web') diff --git a/database/migrations/2023_06_11_145919_update_blog_link_table.php b/database/migrations/2023_06_11_145919_update_blog_link_table.php index faee97f..9bca0ab 100644 --- a/database/migrations/2023_06_11_145919_update_blog_link_table.php +++ b/database/migrations/2023_06_11_145919_update_blog_link_table.php @@ -20,6 +20,18 @@ public function up() { Schema::table('blog_link', function (Blueprint $table) { $table->boolean('blogAddType')->default(0)->after('blogLocation'); + $table->unsignedInteger('blogUserLocation') + ->default(0) + ->after('blogSetColor') + ->comment('用户期望位置'); + $table->unsignedBigInteger('blogForUser') + ->nullable() + ->after('blogUserLocation') + ->comment('绑定已注册用户'); + $table->string('blogRemark') + ->nullable() + ->after('blogForUser') + ->comment('博客备注信息'); }); } diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 12f4ace..55b4a25 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -46,7 +46,7 @@ class="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ri
@@ -63,22 +63,22 @@ class="font-semibold leading-6 text-indigo-600 hover:text-indigo-500">点击注 {!! $webFooter !!} diff --git a/resources/views/console/friends-link/check.blade.php b/resources/views/console/friends-link/check.blade.php new file mode 100644 index 0000000..b7713c2 --- /dev/null +++ b/resources/views/console/friends-link/check.blade.php @@ -0,0 +1,101 @@ + + + + + + + + + @include('modules.head') + {!! $webHeader !!} + + + + + +@include('console.modules.aside') + +
+
+ @include('console.modules.personal') +
+
友链修改
+
+
+
+
+ @if(!empty($blog)) + + @else +

暂无待审核用户

+

去去其他地方逛逛吧

+ @endif +
+
+ +
+
+
+ + + + + diff --git a/resources/views/console/modules/aside.blade.php b/resources/views/console/modules/aside.blade.php index 6a401c4..9a0b0a7 100644 --- a/resources/views/console/modules/aside.blade.php +++ b/resources/views/console/modules/aside.blade.php @@ -34,7 +34,7 @@ class="flex items-center w-full p-2 text-gray-900 transition duration-75 rounded
  • - 待审核 diff --git a/resources/views/function/link.blade.php b/resources/views/function/link.blade.php index 5031dca..9679d47 100644 --- a/resources/views/function/link.blade.php +++ b/resources/views/function/link.blade.php @@ -49,7 +49,7 @@ class="w-16 h-16 p-1 rounded-full ring-2 ring-gray-300 dark:ring-gray-500 me-2 s
    - + 修改友链 diff --git a/resources/views/function/make-friend.blade.php b/resources/views/function/make-friend.blade.php index 4010ac6..8d80588 100644 --- a/resources/views/function/make-friend.blade.php +++ b/resources/views/function/make-friend.blade.php @@ -23,7 +23,7 @@ class="relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translat
    返回友链
    -
    +
    @@ -102,7 +102,7 @@ class="relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translat
    @@ -126,12 +126,15 @@ class="relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translat
    - + + @if(empty($blogSort[0])) + + @else + @foreach($blogSort as $blogValue) + + @endforeach + @endif
    @@ -149,23 +152,35 @@ class="w-16 h-16 p-1 rounded-full ring-2 ring-gray-300 dark:ring-gray-500 me-2 s
    - + + @if(empty($blogColor[0])) + + @else + @foreach($blogColor as $blogValue) + + @endforeach + @endif
    +
    + +
    +
    + +
    + +
    +

    - +
    @@ -180,6 +195,38 @@ class="relative left-[calc(50%+3rem)] aspect-[1155/678] w-[36.125rem] -translate @include('modules.footer')
    + + + + @@ -203,6 +250,78 @@ class="relative left-[calc(50%+3rem)] aspect-[1155/678] w-[36.125rem] -translate }); }) + +function buttonSubmit() { + if ($('#remember').prop('checked')) { + ajax(); + } else { + Toast.toggle('请您确认知情友链申请要求',''); + } +} + +class Toast { + static toggle(data,icon) { + this.set(data,icon); + $('#toast').fadeIn(300); + setTimeout(function () { + $('#toast').fadeOut(300); + }, 3000); + } + static set(data,icon) { + $('#toast-icon').html(icon); + $('#toast-info').text(data); + } +} + +class Enum { + static userEmail = '用户邮箱'; + static userServerHost = '服务商'; + static userBlog = '博客名字'; + static userUrl = '博客地址'; + static userDescription = '博客描述'; + static userIcon = '图片地址'; + static checkRssJudge = 'RSS选项'; + static userRss = 'RSS地址'; + static userLocation = '所属位置'; + static userSelColor = '选择颜色'; + static userRemark = '留言备注'; +} + +function ajax() { + $.ajax({ + async: true, + method: "POST", + data: $('#FormData').serialize(), + url: '{{ route('api.link.custom.add') }}', + dataType: "json", + success: function (returnData) { + if (returnData.output === "Success") { + Toast.toggle('友链申请成功',''); + location.href = '{{ route('home') }}' + } else { + Toast('未知错误',''); + } + }, + error: function (returnData) { + Toast.set('其他错误',''); + if (returnData.responseJSON.output === 'DataFormatError') { + for (let key in Enum) { + if (returnData.responseJSON.data.errorSingle.info === key) { + Toast.toggle(Enum[key]+'错误,注意格式',''); + } + } + } else if (returnData.responseJSON.output === "AlreadyUser") { + $('#toast-interactive').fadeIn(300); + $('#edit-friend').attr('href',"{{ route('function.edit-search') }}?searchName="+$('#userBlog').val()+"&searchUrl="+$('#userUrl').val()); + setTimeout(function () { + $('#toast-interactive').fadeOut(300); + }, 10000); + } else { + Toast.toggle('未知错误',''); + } + } + }); +} {!! $webFooter !!} diff --git a/resources/views/mail/link-custom-add.blade.php b/resources/views/mail/link-custom-add.blade.php new file mode 100644 index 0000000..e52d01a --- /dev/null +++ b/resources/views/mail/link-custom-add.blade.php @@ -0,0 +1,61 @@ + + + + + Mail + + + + + + + + + + + + +
    $G_TitleName
    + + + + + + + + + + +
    + 时间: {{ date('Y-m-d H:i:s') }} +
    + Dear. {{ $userEmail }} +
    + 您好 {{ $userBlog }} 的站长:{{ $userEmail }}
    + 您在本博客({{ env('APP_NAME') }})申请了友链
    +
    + 请在确认一次您的信息是否正确:
    +
      +
    • 博主邮箱:{{ $userEmail }}
    • +
    • 贵站名字:{{ $userBlog }}
    • +
    • 贵站地址:{{ $userUrl }}
    • +
    • 图片地址:{{ $userIcon }}
    • +
    • 贵站介绍:{{ $userDescription }}
    • +
    • 备注内容:{{ $userRemark }}
    • +
    • RSS地址:{{ $userRSS }}
    • +
    +
    +
    + + + + +
    + © 2022 - {{ date('Y') }}. {{ env('APP_NAME') }} All Rights Reserved.
    + 本邮件为自动发出,请勿直接回复 +
    +
    + + + + diff --git a/routes/api.php b/routes/api.php index 3002ad7..503f5cb 100644 --- a/routes/api.php +++ b/routes/api.php @@ -6,6 +6,7 @@ */ use App\Http\Controllers\Authme; +use App\Http\Controllers\Function\Link; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Response; @@ -26,13 +27,23 @@ return $request->user(); }); -Route::prefix('api')->group(function () { - Route::prefix('auth')->group(function () { - Route::post('login',[Authme::class,'Login'])->name('api.auth.login'); - Route::post('register',[Authme::class,'Register'])->name('api.auth.register'); - Route::match(['get','post'],'logout',function () { - Auth::logout(); - return Response::redirectTo(''); - })->name('logout'); +// 登陆类 +Route::prefix('auth')->group(function () { + Route::post('login',[Authme::class,'Login'])->name('api.auth.login'); + Route::post('register',[Authme::class,'Register'])->name('api.auth.register'); + Route::match(['get','post'],'logout',function () { + Auth::logout(); + return Response::redirectTo(''); + })->name('logout'); +}); + +// 友链类 +Route::prefix('link')->group(function () { + Route::prefix('console')->group(function () { + + }); + Route::prefix('custom')->group(function () { + Route::post('add',[Link::class,'apiCustomAdd'])->name('api.link.custom.add'); + Route::get('search',[Link::class, 'apiCustomSearch'])->name('api.link.custom.search'); }); }); diff --git a/routes/web.php b/routes/web.php index b65ee3c..64a8a73 100644 --- a/routes/web.php +++ b/routes/web.php @@ -29,8 +29,10 @@ Route::get('about',[Index::class,'ViewAboutMe'])->name('about'); Route::prefix('function')->group(function () { - Route::get('link',[UserLink::class,'ViewLink'])->name('function.link'); - Route::get('make-friend',[UserLink::class,'ViewMakeFriend'])->name('function.make-friend'); + Route::get('link',[UserLink::class, 'viewLink'])->name('function.link'); + Route::get('make-friend',[UserLink::class, 'viewMakeFriend'])->name('function.make-friend'); + Route::get('edit-search',[UserLink::class, 'viewSearchFriends'])->name('function.edit-search'); + Route::get('edit-friend',[UserLink::class, 'viewEditFriend'])->name('function.edit-friend'); Route::get('sponsor',function () { return view('function.sponsor'); })->name('function.sponsor'); @@ -39,6 +41,13 @@ })->name('function.music'); }); +Route::prefix('account')->middleware('auth')->group(function () { + Route::prefix('friend')->group(function () { + Route::get('link')->name('account.friend.link'); + Route::get('edit')->name('account.friend.edit'); + }); +}); + Route::prefix('console')->middleware('auth')->group(function () { Route::get('dashboard', [Dashboard::class,'ViewDashboard'])->name('console.dashboard'); Route::prefix('friends-link')->group(function () {