ソースを参照

feat:timeline

jauhar54 2年前
コミット
68878e20b0

+ 4
- 3
app/Helpers/Helper.php ファイルの表示

@@ -298,10 +298,11 @@ class Helper
298 298
         $image = str_replace('data:image/png;base64,', '', $image);
299 299
         $image = str_replace(' ', '+', $image);
300 300
         $imageName = Str::random(10).'.'.'png';
301
-        if (!file_exists(storage_path(). '/images/'. $nama_module)) {
302
-            mkdir(storage_path(). '/images/'. $nama_module, 0777, true);
301
+        if (!file_exists(storage_path(). '/app/public/images/'. $nama_module)) {
302
+            // File::mkdir(storage_path(). '/images/'. $nama_module);
303
+            mkdir(storage_path(). '/app/public/images/'. $nama_module);
303 304
         }
304
-        \File::put(storage_path(). '/images/'. $nama_module . '/' . $imageName, base64_decode($image));
305
+        \File::put(storage_path(). '/app/public/images/'. $nama_module . '/' . $imageName, base64_decode($image));
305 306
 
306 307
         $return = URL::to('storage/images/'. $nama_module . '/' . $imageName);
307 308
         

+ 305
- 0
app/Http/Controllers/Admin/TimelineController.php ファイルの表示

@@ -0,0 +1,305 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers\Admin;
4
+
5
+use App\Http\Controllers\Controller;
6
+use Illuminate\Support\Facades\DB;
7
+use Illuminate\Http\Request;
8
+use App\Helpers\Helper;
9
+use App\Model\Timeline;
10
+use Yajra\Datatables\Datatables;
11
+use Auth;
12
+use Illuminate\Support\Facades\Storage;
13
+use Validator;
14
+use Hashids;
15
+
16
+//load modelmu
17
+class TimelineController extends Controller
18
+{
19
+    /**
20
+     * Title untuk judul di web
21
+     * route digunakan untuk tempat resource (file path) + routing (route/web) diusahain sama ya biar gak ngubah"
22
+     */
23
+    private $title      = 'Timeline';                 /**jangan lupa diganti*/
24
+    private $route      = 'admin.timeline.';          //path awal foldernya ajah (misal folder di admin/dashboard) => 'admin.dashboard' | jangan lupa diganti
25
+    private $header     = 'Timeline';
26
+    private $sub_header = 'Timeline';
27
+    private $url        = 'admin.timeline.';
28
+
29
+     public function __construct()
30
+    {
31
+        DB::enableQueryLog();
32
+        /** nyalakan jika sudah set rolenya, jika ini dinyalakan halaman ini tidak akan keluar */
33
+        // $this->middleware('permission:searching-list|searching-create|searching-update|searching-delete', ['only' => ['index', 'create', 'update']]);
34
+        // $this->middleware('permission:searching-create', ['only' => ['create', 'create_action']]);
35
+        // $this->middleware('permission:searching-update', ['only' => ['update', 'update_action']]);
36
+        // $this->middleware('permission:searching-delete', ['only' => ['delete']]);
37
+    }
38
+
39
+     /**
40
+    * Ini contoh crud yang sudah jalan
41
+    * index digunakna untuk tampilan awal dari menu yang akan dibuat
42
+    * Untuk CRUD Biar cepat
43
+    * Silahkan ganti
44
+    * EloquentMu:: => dengan model anda
45
+    * $id_modelmu => ganti dengan id di model anda
46
+    * id_di_routenya => jangan lupa disesuaikan dengan yang dideclare di route
47
+    */
48
+
49
+
50
+    public function index()
51
+    {
52
+        Helper::swal();
53
+
54
+        $data = [
55
+            //bawaan
56
+            'title'      => $this->title,
57
+            'route'      => $this->route,
58
+            'header'     => $this->header,
59
+            'sub_header' => $this->sub_header,
60
+        ];
61
+        // dd($data);
62
+        return view($this->url . 'index', $data);
63
+    }
64
+    public function getData($udd_id = null)
65
+    {
66
+        $query = Timeline::query();
67
+       
68
+        return Datatables::of($query)
69
+            ->addIndexColumn()
70
+            ->addColumn('user', function($query){
71
+                return $query->user->name;
72
+            })
73
+            ->addColumn('aksi', function ($query) {
74
+
75
+                /**cek role */
76
+                $aksi = '';
77
+                $aksi .= "<a href='" . route($this->route . 'approve', ['timeline_id' => Hashids::encode($query->id)]) . "' class='btn btn-sm btn-success btn-edit'>Approve</a>";
78
+                $aksi .= "<a href='" . route($this->route . 'reject', ['timeline_id' => Hashids::encode($query->id)]) . "' class='btn btn-sm btn-warning btn-edit'>Reject</a>";
79
+               
80
+                $aksi .= "<a href='javascript:;' data-route='" . route($this->route . 'delete_action', ['timeline_id' => Hashids::encode($query->id)]) . "' class='btn btn-danger btn-sm btn-delete'>Delete</a>";
81
+               
82
+                return $aksi;
83
+            })
84
+            ->rawColumns(['aksi'])
85
+            ->toJson();
86
+    }
87
+    public function create()
88
+    {
89
+        $data = [
90
+            //bawaan
91
+            'title'         => $this->title,
92
+            'route'         => $this->route,
93
+            'header'        => $this->header,
94
+            'sub_header'    => $this->sub_header,
95
+
96
+        ];
97
+
98
+        Helper::swal();
99
+
100
+        return view($this->url . 'create', $data);
101
+    }
102
+
103
+    public function create_action(Request $request)
104
+    {
105
+        //declare post untuk simpan semua request yang diinputkan oleh form name=""
106
+        $post = $request->all();
107
+        $file = $request->file('gambar');
108
+        //dd($post);
109
+        /**digunakan untuk set rule validator */
110
+        $rules = [
111
+            'title'        => 'required',
112
+            'gambar'       => 'required|file|max:1000',
113
+            'content'      => 'required',
114
+            'sub_title'    => 'required',
115
+            'date_publish' => 'required',
116
+        ];
117
+        /**digunakan untuk set message dari validatornya yang akan keluar gimna, :attribue itu udah langsung mendeteksi inputtan dari name="attribue" */
118
+        $alert = [
119
+            'file'  => 'File maksimal 1MB'
120
+        ];
121
+        $validator = Validator::make($post, $rules, $alert);
122
+
123
+        if ($validator->passes()) {
124
+            /**menggunakan transaction */
125
+            DB::beginTransaction();
126
+
127
+            $nama_file = time()."_".$file->getClientOriginalName();
128
+
129
+            $tujuan_upload = 'gambar';
130
+
131
+            //$file->move($tujuan_upload,$nama_file);
132
+            Storage::putFileAs('public/images/news/', $file, $nama_file );
133
+
134
+            $query               = new News();
135
+            $query->title        = $request->title;
136
+            $query->content      = Helper::input_summernote($request->content);
137
+            $query->sub_title    = Helper::input_summernote($request->sub_title);
138
+            $query->date_publish = $request->date_publish;
139
+            $query->user_id      = Auth::user()->id;
140
+            $query->thumbnail    = $nama_file;
141
+            $query->save();
142
+
143
+            if ($query) {
144
+                DB::commit();
145
+                $message = 'Berhasil';
146
+                return redirect(route($this->route . 'index'))->with('success', Helper::parsing_alert($message));
147
+            } else {
148
+                DB::rollback();
149
+                $message = 'Gagal';
150
+                return redirect()->back()->with('error', Helper::parsing_alert($message));
151
+            }
152
+        }
153
+        /**kenapa menggunakan back ? karena baliknya pasti ke halaman sebelumnya */
154
+        $message = Helper::parsing_alert($validator->errors()->all());
155
+        return redirect()->back()->with('error', $message)->withInput();
156
+    }
157
+
158
+    public function approve($data_id)
159
+    {
160
+
161
+        $data_id = Hashids::decode($data_id);
162
+        if (!empty($data_id)) {
163
+
164
+            $timeline = Timeline::where('id', $data_id[0])->first();
165
+
166
+            $timeline->is_approved = 'approved';
167
+            $timeline->save();
168
+
169
+            return redirect()->back();
170
+        }
171
+    }
172
+
173
+    public function reject($data_id)
174
+    {
175
+
176
+        $data_id = Hashids::decode($data_id);
177
+        if (!empty($data_id)) {
178
+
179
+            $timeline = Timeline::where('id', $data_id[0])->first();
180
+
181
+            $timeline->is_approved = 'rejected';
182
+            $timeline->save();
183
+
184
+            return redirect()->back();
185
+        }
186
+    }
187
+
188
+    public function update_action(Request $request)
189
+    {
190
+        $post = $request->all();
191
+       /**digunakan untuk set rule validator */
192
+        $rules = [
193
+            'title'        => 'required',
194
+            'content'      => 'required',
195
+            'sub_title'    => 'required',
196
+            'date_publish' => 'required',
197
+        ];
198
+        /**digunakan untuk set message dari validatornya yang akan keluar gimna, :attribue itu udah langsung mendeteksi inputtan dari name="attribue" */
199
+        $alert = [];
200
+        $validator = Validator::make($post, $rules, $alert);
201
+
202
+        $data_id = Hashids::decode($request['id']);
203
+
204
+        if (!empty($data_id)) {
205
+            /**cek apakah data_idnya ada ? */
206
+            $query = News::find($data_id[0]);
207
+
208
+            if ($query) {
209
+                /**cek apakah id data benar" ada di DB ? */
210
+                if ($validator->passes()) {
211
+                    /**validatornya */
212
+                    DB::beginTransaction();
213
+                    $file = $request->file('gambar');
214
+                    if($file){
215
+                        $nama_file = time()."_".$file->getClientOriginalName();
216
+                        $tujuan_upload = 'gambar';
217
+                        //$file->move($tujuan_upload,$nama_file);
218
+                        Storage::putFileAs('public/images/news/', $file, $nama_file );
219
+                        //File::delete('gambar/'.$query->gambar);
220
+                        Storage::delete('public/images/news/'.$query->thumbnail);
221
+                        $query->thumbnail = $nama_file;
222
+                    }
223
+
224
+                    $query->title        = $request->title;
225
+                    $query->content      = Helper::input_summernote($request->content);
226
+                    $query->sub_title    = Helper::input_summernote($request->sub_title);
227
+                    $query->date_publish = $request->date_publish;
228
+                    $query->save();
229
+
230
+                    if ($query) {
231
+                        DB::commit();
232
+                        $message = 'Berhasil';
233
+                        return redirect(route($this->route . 'index'))->with('success', Helper::parsing_alert($message));
234
+                    } else {
235
+                        DB::rollback();
236
+                        $message = 'Gagal';
237
+                        return redirect()->back()->with('error', Helper::parsing_alert($message));
238
+                    }
239
+                }
240
+
241
+                $message = Helper::parsing_alert($validator->errors()->all());
242
+
243
+                return redirect()->back()->with('error', $message);
244
+            } else {
245
+                $message = 'Id tdak ditemukan';
246
+                return redirect()->back()->with('error', $message);
247
+            }
248
+        } else {
249
+            $message = 'Id tidak boleh kosong';
250
+            return redirect()->back()->with('error', $message);
251
+        }
252
+    }
253
+
254
+    public function delete_action($id_modelmu)
255
+    {
256
+        $id = Hashids::decode($id_modelmu);
257
+        /**cek idnya apakah ada ? */
258
+
259
+        if (!empty($id)) {
260
+
261
+            $cek_data = News::find($id[0]);
262
+
263
+            if ($cek_data) {
264
+                DB::beginTransaction();
265
+                try {
266
+                    //File::delete('gambar/'.$cek_data->gambar);
267
+                    $arr_likes = $cek_data->newsLikes;
268
+                    foreach($arr_likes as $like){
269
+                        $like->delete();
270
+                    }
271
+                    Storage::delete('public/images/news/'.$cek_data->thumbnail);
272
+                    $delete = $cek_data->delete();
273
+                    DB::commit();
274
+                    $message = 'Sukses';
275
+                    $response = [
276
+                        'message' => $message,
277
+                        'status'   => true,
278
+                    ];
279
+                    return response()->json($response);
280
+                } catch (Exception $e) {
281
+                    DB::rollback();
282
+                    $message = 'Gagal';
283
+                    $response = [
284
+                        'message' => $message,
285
+                        'status'   => false,
286
+                    ];
287
+                    return response()->json($response);
288
+                }
289
+            }
290
+            $message = 'Id tidak ditemukan atau sudah dihapus';
291
+            $response = [
292
+                'message' => $message,
293
+                'status'   => false,
294
+            ];
295
+            return response()->json($response);
296
+        }
297
+        $message = 'Id tdak ditemukan';
298
+        $response = [
299
+            'message' => $message,
300
+            'status'   => false,
301
+        ];
302
+        return response()->json($response);
303
+    }
304
+
305
+}

+ 24
- 43
app/Http/Controllers/Api/V1/TimelineController.php ファイルの表示

@@ -21,7 +21,7 @@ class TimelineController extends Controller
21 21
 
22 22
     public function getAll()
23 23
     {
24
-        $query = Timeline::get();
24
+        $query = Timeline::where('is_approved', 'approved')->get();
25 25
 
26 26
         if($query){
27 27
             $result = $query;
@@ -91,38 +91,21 @@ class TimelineController extends Controller
91 91
     public function postStore(Request $request)
92 92
     {
93 93
         $post = $request->all();
94
-        // $file = $request->file('gambar');
95
-        //dd($post);
96
-        /**digunakan untuk set rule validator */
94
+
97 95
         $rules = [
98 96
             'gambar' => 'required',
99
-            'user_id' => 'required',
100
-            // 'gambar' => 'required|file|max:1000',
97
+            'user_id' => 'required'
101 98
         ];
102
-        /**digunakan untuk set message dari validatornya yang akan keluar gimna, :attribue itu udah langsung mendeteksi inputtan dari name="attribue" */
103
-        // $alert = [
104
-        //     'file'  => 'File maksimal 1MB'
105
-        // ];
106
-        // $validator = Validator::make($post, $rules, $alert);
99
+
107 100
         $validator = Validator::make($post, $rules);
108 101
 
109 102
         if ($validator->passes()) {
110 103
 
111
-            /**menggunakan transaction */
112
-            DB::beginTransaction();
113
-
114
-            // $nama_file = time()."_".$file->getClientOriginalName();
115
-
116
-            // $tujuan_upload = 'gambar';
117
-
118
-            // //$file->move($tujuan_upload,$nama_file);
119
-            // Storage::putFileAs('public/images/Timeline/', $file, $nama_file );
120
-
121 104
             $query                  = new Timeline();
122 105
             $query->is_approved     = 'pending';
123 106
             $query->caption         = $request->caption;
124 107
             $query->timeline_photo  = Helper::base64_to_image($request->gambar, 'timeline');
125
-            $query->user_id         = Helper::hash(Request::all()['user_id'], 'decode');
108
+            $query->user_id         = Helper::hash($request->user_id, 'decode');
126 109
             $query->save();
127 110
 
128 111
             $query->hash_id = Helper::hash($query->id, 'encode');
@@ -131,7 +114,6 @@ class TimelineController extends Controller
131 114
 
132 115
             if($query){
133 116
                 $result = $query;
134
-    
135 117
                 $res_status = true;
136 118
                 $msg = 'Mendapatkan Data';
137 119
                 $status_msg = $msg;
@@ -139,7 +121,6 @@ class TimelineController extends Controller
139 121
                 return $this->resSuccess(null, $res_status, $msg, $status_msg, $result);
140 122
     
141 123
             }else {
142
-    
143 124
                 $res_status = false;
144 125
                 $msg = 'Data tidak ditemukan';
145 126
                 $status_msg = $msg;
@@ -155,28 +136,23 @@ class TimelineController extends Controller
155 136
 
156 137
         $rules = [
157 138
             'id' => 'required',
158
-            'gambar' => 'required',
159
-            'user_id' => 'required',
139
+            'caption' => 'required'
160 140
         ];
161 141
 
162 142
         $validator = Validator::make($post, $rules);
163 143
 
164 144
         if(!$validator->fails()){
165
-            $Timeline = Timeline::where('id', Helper::hash(Request::all()['id'], 'decode'))->firstOrFail();
145
+            $timeline = Timeline::where('id', Helper::hash($request->id, 'decode'))->firstOrFail();
166 146
             
167
-            $Timeline->name                        = $request->name;
168
-            $Timeline->Timeline_identity     = $request->Timeline_identity;
169
-            $Timeline->Timeline_type         = $request->Timeline_type;
170
-            $Timeline->Timeline_photo        = Helper::base64_to_image($request->gambar, 'Timeline');
171
-            $Timeline->user_id                     = Helper::hash(Request::all()['user_id'], 'decode');
172
-            $Timeline->save();
147
+            $timeline->caption               = $request->caption;
148
+            $timeline->save();
173 149
 
174
-            $Timeline->hash_id = Helper::hash($Timeline->id, 'encode');
175
-            $Timeline->user_id = Helper::hash($Timeline->user_id, 'encode');
150
+            $timeline->hash_id = Helper::hash($timeline->id, 'encode');
151
+            $timeline->user_id = Helper::hash($timeline->user_id, 'encode');
176 152
 
177
-            $result = $Timeline;
153
+            $result = $timeline;
178 154
             $res_status = true;
179
-            $msg = 'Berhasil membuat user';
155
+            $msg = 'Berhasil Update Data';
180 156
             $status_msg = $msg;
181 157
 
182 158
             return $this->resSuccess(null, $res_status, $msg, $status_msg, $result);
@@ -184,20 +160,25 @@ class TimelineController extends Controller
184 160
         }else {
185 161
 
186 162
             $res_status = false;
187
-            $msg = 'Gagal Membuat user';
163
+            $msg = 'Gagal Update Data';
188 164
             $status_msg = $validator->errors();
189 165
 
190 166
             return $this->resSuccess(null, $res_status, $msg, $status_msg, null);
191 167
         }
192 168
     }
193 169
 
194
-    public function delete()
170
+    public function delete(Request $request)
195 171
     {
196
-        $validator = Validator::make(Request::all(), [
197
-            'id' => ['required'],
198
-        ]);
172
+        $post = $request->all();
173
+
174
+        $rules = [
175
+            'id' => 'required'
176
+        ];
177
+
178
+        $validator = Validator::make($post, $rules);
179
+
199 180
         if(!$validator->fails()){
200
-            $query = Timeline::find(Helper::hash(Request::all()['id'], 'decode'))->detroy();
181
+            $query = Timeline::find(Helper::hash($request->id, 'decode'))->delete();
201 182
 
202 183
             if($query){
203 184
                 $result = $query;

+ 1
- 2
app/Http/Controllers/Api/V1/TransportationController.php ファイルの表示

@@ -108,7 +108,6 @@ class TransportationController extends Controller
108 108
 
109 109
         if ($validator->passes()) {
110 110
             /**menggunakan transaction */
111
-            DB::beginTransaction();
112 111
 
113 112
             // $nama_file = time()."_".$file->getClientOriginalName();
114 113
 
@@ -124,7 +123,7 @@ class TransportationController extends Controller
124 123
             $query->transportation_photo        = Helper::base64_to_image($request->gambar, 'transportation');
125 124
             $query->user_id                     = Helper::hash($request->user_id, 'decode');
126 125
             $query->save();
127
-
126
+            // dd($query);
128 127
             $query->hash_id = Helper::hash($query->id, 'encode');
129 128
             $query->user_id = Helper::hash($query->user_id, 'encode');
130 129
 

+ 4
- 1
app/Model/Timeline.php ファイルの表示

@@ -16,5 +16,8 @@ class Timeline extends Model
16 16
       'caption',
17 17
       'is_approved'
18 18
     ];
19
-
19
+    public function user()
20
+    {
21
+        return $this->belongsTo('App\User');
22
+    }
20 23
 }

+ 5
- 0
app/User.php ファイルの表示

@@ -47,6 +47,11 @@ class User extends Authenticatable
47 47
         return $this->hasOne('App\Profile');
48 48
     }
49 49
 
50
+    public function timeline()
51
+    {
52
+        return $this->hasMany('App\Model\Timeline');
53
+    }
54
+
50 55
     // public function petugas()
51 56
     // {
52 57
     //     return $this->belongsTo('App\Model\User\PetugasUnitDonorDarahUdds', 'id', 'user_login_id');

+ 56
- 0
resources/views/admin/timeline/index.blade.php ファイルの表示

@@ -0,0 +1,56 @@
1
+@extends('admin.layouts.app')
2
+
3
+@section('content')
4
+   {{-- start patern --}}
5
+        <div class="row">
6
+            <div class="col-xl-12">
7
+                <div class="card shadow">
8
+                    <div class="card-header bg-transparent">
9
+                        <div class="row align-items-center">
10
+                            <div class="col">
11
+                                <h6 class="text-uppercase text-muted ls-1 mb-1">{{ $sub_header }}</h6>
12
+                                <h2 class="mb-0">{{ $header }}</h2>
13
+                            </div>
14
+                        </div>
15
+                    </div>
16
+                    <div class="card-body">
17
+                        <table class="table align-items-center border table-responsive"  id="data-table">
18
+                            <thead class="thead-light">
19
+                                <tr>
20
+                                    <th width="5%" scope="col">No</th>
21
+                                    <th scope="col">User</th>
22
+                                    <th scope="col">Caption</th>
23
+                                    <th scope="col">Status</th>
24
+                                    <th scope="col">Aksi</th>
25
+                                </tr>
26
+                            </thead>
27
+                        </table>
28
+                    </div>
29
+                </div>
30
+            </div>
31
+        </div>
32
+    {{-- end pattern- --}}
33
+
34
+@endsection
35
+
36
+@push('js')
37
+    <script src="{{ asset('assets') }}/js/blockUI.js"></script>
38
+    <script src="{{ asset('assets') }}/js/sweetalert2.js"></script>
39
+    <script src="{{ asset('assets') }}/js/custom.js"></script>
40
+    <script src="{{ asset('assets') }}/js/custom_datatable.js"></script>
41
+    <script>
42
+        $(document).ready(function () {
43
+            var id_datatable = "#data-table";
44
+            var url_ajax = '{!! route($route.'get_data') !!}';
45
+            console.log(url_ajax);
46
+            var column = [
47
+                        { data: 'DT_RowIndex', searchable: false, orderable: false, className: 'dt-center' },
48
+                        { data: 'user', name: 'user' },
49
+                        { data: 'caption', name: 'caption' },
50
+                        { data: 'is_approved', name: 'is_approved' },
51
+                        { data: 'aksi', name: 'aksi' },
52
+                    ];
53
+           global.init_datatable(id_datatable, url_ajax, column);
54
+        });
55
+    </script>
56
+@endpush

+ 1
- 0
routes/api_v1.php ファイルの表示

@@ -88,6 +88,7 @@ Route::group(
88 88
     ],
89 89
     function () {
90 90
         Route::get('/all', ['as' => 'index', 'uses' => 'TimelineController@getAll']);
91
+        Route::get('/find/{data_id?}', ['as' => 'find', 'uses' => 'TimelineController@getSingle']);
91 92
         Route::get('/find-by-user/{data_id?}', ['as' => 'find_by_user', 'uses' => 'TimelineController@getByUser']);
92 93
         Route::post('/store', ['as' => 'store', 'uses' => 'TimelineController@postStore']);
93 94
         Route::post('/update', ['as' => 'store', 'uses' => 'TimelineController@postUpdate']);

+ 18
- 0
routes/web.php ファイルの表示

@@ -141,7 +141,25 @@ Route::group(
141 141
             Route::post('dashboard-modal-kantong-darah', ['as' => 'modal_kantong_darah', 'uses' => 'DashboardController@modal_graph_kantong_darah']);
142 142
         });
143 143
 
144
+        Route::group(
145
+            [
146
+                'prefix'    => 'timeline',
147
+                'as'        => 'timeline.',
148
+                
144 149
 
150
+            ],
151
+            function () {
152
+                Route::get('/', ['as' => 'index', 'uses' => 'TimelineController@index']);
153
+                Route::get('/get-data/{udd_id?}', ['as' => 'get_data', 'uses' => 'TimelineController@getData']);
154
+                Route::get('create', ['as' => 'create', 'uses' => 'TimelineController@create']);
155
+                Route::get('approve/{timeline_id}', ['as' => 'approve', 'uses' => 'TimelineController@approve']);
156
+                Route::get('reject/{timeline_id}', ['as' => 'reject', 'uses' => 'TimelineController@reject']);
157
+                Route::get('/delete-action/{timeline_id}', ['as' => 'delete_action', 'uses' => 'TimelineController@delete_action']);
158
+
159
+                Route::post('create-action', ['as' => 'create_action', 'uses' => 'TimelineController@create_action']);
160
+                Route::post('update-action', ['as' => 'update_action', 'uses' => 'TimelineController@update_action']);
161
+            }
162
+        );
145 163
 
146 164
         Route::group(
147 165
             [

読み込み中…
キャンセル
保存