Prechádzať zdrojové kódy

新增 修改貼文

oransheep 2 rokov pred
rodič
commit
ef29aa2e23

+ 92 - 0
app/Http/Controllers/BlogBannerController.php

@@ -0,0 +1,92 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\BlogBanner;
+use App\Http\Requests\StoreBlogBannerRequest;
+use App\Http\Requests\UpdateBlogBannerRequest;
+
+class BlogBannerController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        return BlogBanner::orderBy('id', 'DESC')->get();
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function create()
+    {
+        //
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \App\Http\Requests\StoreBlogBannerRequest  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(StoreBlogBannerRequest $request)
+    {
+        BlogBanner::insert([
+            'blogId' => $request->blogId,
+            'name' => $request->name,
+            'image' => $request->image,
+            'created_at' => now(),
+            'updated_at' => now(),
+        ]);
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\Models\BlogBanner  $blogBanner
+     * @return \Illuminate\Http\Response
+     */
+    public function show(BlogBanner $blogBanner)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  \App\Models\BlogBanner  $blogBanner
+     * @return \Illuminate\Http\Response
+     */
+    public function edit(BlogBanner $blogBanner)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \App\Http\Requests\UpdateBlogBannerRequest  $request
+     * @param  \App\Models\BlogBanner  $blogBanner
+     * @return \Illuminate\Http\Response
+     */
+    public function update(UpdateBlogBannerRequest $request, BlogBanner $blogBanner)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\Models\BlogBanner  $blogBanner
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(BlogBanner $blogBanner)
+    {
+        //
+    }
+}

+ 3 - 1
app/Http/Controllers/BlogController.php

@@ -95,14 +95,16 @@ class BlogController extends Controller
     {
         $blog = Blog::where('id', $request->blogId)->first();
 
-        if ($blog->authorId == $request->userId) {
+        if ($blog->authorId == $request->user()->id) {
             $blog->update([
                 'title' => $request->title,
                 'content' => $request->content,
                 'tags' => $request->tags,
                 'updated_at' => now(),
             ]);
+            return "success";
         }
+        return "fail";
     }
 
     /**

+ 7 - 13
app/Http/Controllers/BlogImageController.php

@@ -15,7 +15,7 @@ class BlogImageController extends Controller
      */
     public function index()
     {
-        return BlogImage::all();
+        return BlogImage::orderBy('id', 'DESC')->get();
     }
 
     /**
@@ -36,25 +36,19 @@ class BlogImageController extends Controller
      */
     public function store(Request $request)
     {
-
-        $save_name = time() . '.jpg';
-        $saveImgPath = 'blog/banner/' . $save_name;
+        $path = '';
+        if ($request->bannerImage) {
+            $path = $request->file('bannerImage')->store('public/blog');
+            $path = str_replace('public', '/storage', $path);
+        }
 
         BlogImage::insert([
             'blogId' => $request->blogId,
-            'saveName' => $save_name,
+            'savePath' => $path,
             'fileName' => $request->fileName,
             'created_at' => now(),
             'updated_at' => now(),
         ]);
-
-        if ($request->bannerImage) {
-            $image_64 = $request->bannerImage;
-            $replace = substr($image_64, 0, strpos($image_64, ',') + 1);
-            $image = str_replace($replace, '', $image_64);
-            $image = str_replace(' ', '+', $image);
-            Storage::disk('local')->put($saveImgPath, base64_decode($image));
-        }
     }
 
     /**

+ 30 - 0
app/Http/Requests/StoreBlogBannerRequest.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class StoreBlogBannerRequest extends FormRequest
+{
+    /**
+     * Determine if the user is authorized to make this request.
+     *
+     * @return bool
+     */
+    public function authorize()
+    {
+        return true;
+    }
+
+    /**
+     * Get the validation rules that apply to the request.
+     *
+     * @return array<string, mixed>
+     */
+    public function rules()
+    {
+        return [
+            //
+        ];
+    }
+}

+ 30 - 0
app/Http/Requests/UpdateBlogBannerRequest.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class UpdateBlogBannerRequest extends FormRequest
+{
+    /**
+     * Determine if the user is authorized to make this request.
+     *
+     * @return bool
+     */
+    public function authorize()
+    {
+        return false;
+    }
+
+    /**
+     * Get the validation rules that apply to the request.
+     *
+     * @return array<string, mixed>
+     */
+    public function rules()
+    {
+        return [
+            //
+        ];
+    }
+}

+ 17 - 0
app/Models/BlogBanner.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class BlogBanner extends Model
+{
+    use HasFactory;
+
+    protected $fillable = [
+        'blogId',
+        'name',
+        'image',
+    ];
+}

+ 1 - 1
app/Models/BlogImage.php

@@ -11,7 +11,7 @@ class BlogImage extends Model
 
     protected $fillable = [
         'blogId',
-        'saveName',
+        'savePath',
         'fileName',
     ];
 }

+ 94 - 0
app/Policies/BlogBannerPolicy.php

@@ -0,0 +1,94 @@
+<?php
+
+namespace App\Policies;
+
+use App\Models\BlogBanner;
+use App\Models\User;
+use Illuminate\Auth\Access\HandlesAuthorization;
+
+class BlogBannerPolicy
+{
+    use HandlesAuthorization;
+
+    /**
+     * Determine whether the user can view any models.
+     *
+     * @param  \App\Models\User  $user
+     * @return \Illuminate\Auth\Access\Response|bool
+     */
+    public function viewAny(User $user)
+    {
+        //
+    }
+
+    /**
+     * Determine whether the user can view the model.
+     *
+     * @param  \App\Models\User  $user
+     * @param  \App\Models\BlogBanner  $blogBanner
+     * @return \Illuminate\Auth\Access\Response|bool
+     */
+    public function view(User $user, BlogBanner $blogBanner)
+    {
+        //
+    }
+
+    /**
+     * Determine whether the user can create models.
+     *
+     * @param  \App\Models\User  $user
+     * @return \Illuminate\Auth\Access\Response|bool
+     */
+    public function create(User $user)
+    {
+        //
+    }
+
+    /**
+     * Determine whether the user can update the model.
+     *
+     * @param  \App\Models\User  $user
+     * @param  \App\Models\BlogBanner  $blogBanner
+     * @return \Illuminate\Auth\Access\Response|bool
+     */
+    public function update(User $user, BlogBanner $blogBanner)
+    {
+        //
+    }
+
+    /**
+     * Determine whether the user can delete the model.
+     *
+     * @param  \App\Models\User  $user
+     * @param  \App\Models\BlogBanner  $blogBanner
+     * @return \Illuminate\Auth\Access\Response|bool
+     */
+    public function delete(User $user, BlogBanner $blogBanner)
+    {
+        //
+    }
+
+    /**
+     * Determine whether the user can restore the model.
+     *
+     * @param  \App\Models\User  $user
+     * @param  \App\Models\BlogBanner  $blogBanner
+     * @return \Illuminate\Auth\Access\Response|bool
+     */
+    public function restore(User $user, BlogBanner $blogBanner)
+    {
+        //
+    }
+
+    /**
+     * Determine whether the user can permanently delete the model.
+     *
+     * @param  \App\Models\User  $user
+     * @param  \App\Models\BlogBanner  $blogBanner
+     * @return \Illuminate\Auth\Access\Response|bool
+     */
+    public function forceDelete(User $user, BlogBanner $blogBanner)
+    {
+        //
+    }
+}

+ 1 - 1
database/migrations/2022_12_19_151815_create_blog_images_table.php

@@ -16,7 +16,7 @@ return new class extends Migration
         Schema::create('blog_images', function (Blueprint $table) {
             $table->id();
             $table->integer('blogId');
-            $table->string('saveName');
+            $table->string('savePath');
             $table->string('fileName');
             $table->timestamps();
         });

+ 34 - 0
database/migrations/2022_12_26_031837_create_blog_banners_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('blog_banners', function (Blueprint $table) {
+            $table->id();
+            $table->integer('blogId');
+            $table->string('name');
+            $table->string('image');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('blog_banners');
+    }
+};

+ 3 - 2
resources/js/src/views/blog/BlogDetail.vue

@@ -282,6 +282,7 @@ export default {
       search_query: '',
       commentCheckmark: '',
       blogDetail: {},
+      blogImageList: [],
       blogComments: [],
       blogSidebar: {},
       commentCount: [],
@@ -343,7 +344,7 @@ export default {
       return format(new Date(date), 'yyyy-MM-dd hh:mm', { locale: zhTW });
     },
     getUserAvatar(userId) {
-      return require('@/assets/images/avatars/' + userId + '-small.png');
+      return ('/images/_/_/_/_/MessagePractise/resources/js/src/assets/images/avatars/' + userId + '-small.png');
     },
     getUserFullName(userId) {
       for (var i = 0; i < this.userList.length; i++) {
@@ -360,7 +361,7 @@ export default {
           imagePath = this.blogImageList[i].saveName;
         }
       }
-      return require('@/assets/images/banner/' + imagePath);
+      return ('/images/_/_/_/_/MessagePractise/storage/app/blog/banner/' + imagePath);
     },
     getCommentCount(blogId) {
       for (var i = 0; i < this.commentCount.length; i++) {

+ 28 - 26
resources/js/src/views/blog/BlogEdit.vue

@@ -130,6 +130,7 @@ export default {
       blogId: this.$route.params.id,
       blogEdit: {},
       blogFile: null,
+      blogImageList: [],
       categoryOption: ['Fashion', 'Food', 'Gaming', 'Quote', 'Video'],
       statusOption: ['Published', 'Pending', 'Draft'],
       snowOption: {
@@ -157,7 +158,6 @@ export default {
 
     const { inputImageRenderer } = useInputImageRenderer(refInputEl, base64 => {
       refPreviewEl.value.src = base64
-      
     })
 
     return {
@@ -171,7 +171,7 @@ export default {
       return format(new Date(date), 'yyyy-MM-dd hh:mm', { locale: zhTW })
     },
     getUserAvatar(userId) {
-      return require('@/assets/images/avatars/' + userId + '-small.png')
+      return ('/images/_/_/_/_/MessagePractise/resources/js/src/assets/images/avatars/' + userId + '-small.png');
     },
     getUserFullName(userId) {
       for (var i = 0; i < this.userList.length; i++) {
@@ -182,13 +182,11 @@ export default {
       return 'none';
     },
     getBannerImg(blogId) {
-      var imagePath;
       for (var i = 0; i < this.blogImageList.length; i++) {
         if (this.blogImageList[i].blogId == blogId) {
-          imagePath = this.blogImageList[i].saveName;
+          return this.blogImageList[i].savePath;
         }
       }
-      return require('@/assets/images/banner/' + imagePath);
     },
     getBase64(file) {
       return new Promise(function (resolve, reject) {
@@ -199,28 +197,32 @@ export default {
       });
     },
     saveChanges() {
-      var imageSaveName = Date.now();
+      useJwt.getPost('/api/blog/edit', {
+        blogId: this.blogId,
+        title: this.blogEdit.title,
+        content: this.blogEdit.content,
+        tags: JSON.stringify(this.blogEdit.tags),
+      })
+        .then(res => {
+          if(res.data == 'success') {
+            console.log(res.data);
+          } else {
+            console.log(res.data);
+          }
+        });
 
-      console.log(this.$refs.refPreviewEl.src)
-
-      console.log(this.blogId)
-      console.log(this.blogEdit.blogTitle)
-      console.log(this.blogEdit.excerpt)
-
-      // useJwt.getPost('/api/blog/after_edit', {
-      //   blogId: this.blogId,
-      //   blogTitle: this.blogEdit.blogTitle,
-      //   blogContent: this.blogEdit.excerpt,
-      //   blogTags: this.blogEdit.blogCategories,
-      //   blogImage: this.blogFile.name,
-      //   saveName: imageSaveName,
-      // });
-
-      // // save image to /app/blog/banner
-      // var promise = this.getBase64(this.blogFile);
-      // promise.then(function (result) {
-      //   useJwt.getPost('/api/blog/save_banner', { blogImageFile: result, saveName: imageSaveName});
-      // });
+      // save image to /app/blog/banner
+      var img = this.$refs.refPreviewEl.src;
+      var formdata = new FormData;
+      formdata.append('blogId', this.blogId);
+      formdata.append('fileName', this.blogFile.name);
+      formdata.append('bannerImage', this.blogFile);
+      if (this.blogFile) {
+        useJwt.getPost('/api/blog-image/store', formdata)
+          .then(res => {
+            console.log(res.data);
+          });
+      }
     }
   },
 }

+ 4 - 4
resources/js/src/views/blog/BlogList.vue

@@ -30,7 +30,7 @@
                 </b-media-body>
               </b-media>
               <div class="my-1 py-25">
-                <b-link v-for="(tag, index) in blog.tags" :key="index">
+                <b-link v-for="(tag, index) in JSON.parse(blog.tags)" :key="index">
                   <b-badge pill class="mr-75" :variant="tagsColor(tag)">
                     {{ tag }}
                   </b-badge>
@@ -82,7 +82,7 @@
                 </b-media-body>
               </b-media>
               <div class="my-1 py-25">
-                <b-link v-for="(tag, index) in blog.tags" :key="index">
+                <b-link v-for="(tag, index) in JSON.parse(blog.tags)" :key="index">
                   <b-badge pill class="mr-75" :variant="tagsColor(tag)">
                     {{ tag }}
                   </b-badge>
@@ -292,7 +292,7 @@ export default {
       return format(new Date(date), 'yyyy-MM-dd hh:mm', { locale: zhTW });
     },
     getUserAvatar(userId) {
-      return require('@/assets/images/avatars/' + userId + '-small.png');
+      return ('/images/_/_/_/_/MessagePractise/resources/js/src/assets/images/avatars/' + userId + '-small.png');
     },
     getUserFullName(userId) {
       for (var i = 0; i < this.userList.length; i++) {
@@ -309,7 +309,7 @@ export default {
           imagePath = this.blogImageList[i].saveName;
         }
       }
-      return require('@/assets/images/banner/' + imagePath);
+      return ('/images/_/_/_/_/MessagePractise/storage/app/blog/banner/' + imagePath);
     },
     getCommentCount(blogId) {
       for (var i = 0; i < this.commentCount.length; i++) {

+ 4 - 30
routes/api.php

@@ -17,6 +17,7 @@ use App\Models\BlogImage;
 use App\Http\Controllers\UserController;
 use App\Http\Controllers\BlogController;
 use App\Http\Controllers\BlogImageController;
+use App\Http\Controllers\BlogBannerController;
 use App\Http\Controllers\CommentController;
 
 /*
@@ -81,6 +82,9 @@ Route::middleware('auth:sanctum')->group(function () {
     Route::post('/blog-image/show', [BlogImageController::class, 'show']);
     Route::post('/blog-image/store', [BlogImageController::class, 'store']);
 
+    Route::post('/blog-banner/index', [BlogBannerController::class, 'index']);
+    Route::post('/blog-banner/store', [BlogBannerController::class, 'store']);
+
     //comments controller
     Route::post('/comment/index-by-blog', [CommentController::class, 'index_by_blog']);
     Route::post('/comment/index-count', [CommentController::class, 'index_count']);
@@ -89,36 +93,6 @@ Route::middleware('auth:sanctum')->group(function () {
     Route::post('/comment/destroy', [CommentController::class, 'destroy']);
 });
 
-
-//todo count blog comment
-
-Route::middleware('auth:sanctum')->post('/blog/sideba', function (Request $request) {
-    $recentPosts = DB::select("SELECT TOP(4) 
-            blogs.id, 
-            title, 
-            blogs.updated_at AS updatedTime, 
-            t.total AS comments, 
-            saveName
-        FROM [laravel_kevin].[dbo].[blogs]
-        LEFT JOIN [dbo].[users] ON [blogs].[writer] = [users].[id]
-        LEFT JOIN (
-            SELECT [blogId],COUNT(*) AS total
-            FROM [laravel_kevin].[dbo].[comments]
-            GROUP BY [blogId]) as t ON [blogs].[id] = [t].[blogId]
-        LEFT JOIN [dbo].[blog_images] ON [blogs].[id] = [blog_images].[blogId]
-        ORDER BY comments DESC");
-
-    $categories = [
-        ['category' => 'Fashion', 'icon' => 'WatchIcon'],
-        ['category' => 'Food', 'icon' => 'ShoppingCartIcon'],
-        ['category' => 'Gaming', 'icon' => 'CommandIcon'],
-        ['category' => 'Quote', 'icon' => 'HashIcon'],
-        ['category' => 'Video', 'icon' => 'VideoIcon'],
-    ];
-
-    return ['recentPosts' => $recentPosts, 'categories' => $categories];
-});
-
 Route::post('/blog-image/fake', function (Request $request) {
     $request->validate([
         'blogId' => 'required',