From 4f3aaaab66353cfc8f9f161b94df9719d8e52eac Mon Sep 17 00:00:00 2001 From: rianbtk Date: Wed, 14 Sep 2022 18:25:52 +0700 Subject: [PATCH] sql --- app/Http/Controllers/SQLController.php | 1268 +++++++++++++++++ app/SqlExam.php | 16 + app/SqlExamResult.php | 14 + app/SqlExamUser.php | 14 + app/SqlExercise.php | 16 + app/SqlExerciseResult.php | 14 + app/SqlExerciseUser.php | 14 + app/SqlLearning.php | 14 + app/SqlLearningUser.php | 24 + app/SqlLearningUserLog.php | 16 + app/SqlPractice.php | 23 + app/SqlPracticeQuestion.php | 19 + app/SqlPracticeUser.php | 18 + .../jawaban/6321948057744_1663145088.py | 2 + resources/views/admin/sql/exam.blade.php | 503 +++++++ resources/views/admin/sql/exercise.blade.php | 483 +++++++ resources/views/admin/sql/learning.blade.php | 639 +++++++++ .../views/admin/sql/practice.blade copy.php | 687 +++++++++ resources/views/admin/sql/practice.blade.php | 845 +++++++++++ resources/views/student/sql/exam.blade.php | 186 +++ resources/views/student/sql/exam_do.blade.php | 168 +++ .../views/student/sql/exercise.blade.php | 186 +++ .../views/student/sql/exercise_do.blade.php | 168 +++ .../views/student/sql/learning.blade.php | 195 +++ .../student/sql/learning_do.blade copy.php | 154 ++ .../views/student/sql/learning_do.blade.php | 140 ++ .../views/student/sql/practice.blade.php | 138 ++ .../views/student/sql/practice_do.blade.php | 142 ++ routes/web.php | 110 ++ 29 files changed, 6216 insertions(+) create mode 100644 app/Http/Controllers/SQLController.php create mode 100644 app/SqlExam.php create mode 100644 app/SqlExamResult.php create mode 100644 app/SqlExamUser.php create mode 100644 app/SqlExercise.php create mode 100644 app/SqlExerciseResult.php create mode 100644 app/SqlExerciseUser.php create mode 100644 app/SqlLearning.php create mode 100644 app/SqlLearningUser.php create mode 100644 app/SqlLearningUserLog.php create mode 100644 app/SqlPractice.php create mode 100644 app/SqlPracticeQuestion.php create mode 100644 app/SqlPracticeUser.php create mode 100644 public/python-resources/unittest/jawaban/6321948057744_1663145088.py create mode 100644 resources/views/admin/sql/exam.blade.php create mode 100644 resources/views/admin/sql/exercise.blade.php create mode 100644 resources/views/admin/sql/learning.blade.php create mode 100644 resources/views/admin/sql/practice.blade copy.php create mode 100644 resources/views/admin/sql/practice.blade.php create mode 100644 resources/views/student/sql/exam.blade.php create mode 100644 resources/views/student/sql/exam_do.blade.php create mode 100644 resources/views/student/sql/exercise.blade.php create mode 100644 resources/views/student/sql/exercise_do.blade.php create mode 100644 resources/views/student/sql/learning.blade.php create mode 100644 resources/views/student/sql/learning_do.blade copy.php create mode 100644 resources/views/student/sql/learning_do.blade.php create mode 100644 resources/views/student/sql/practice.blade.php create mode 100644 resources/views/student/sql/practice_do.blade.php diff --git a/app/Http/Controllers/SQLController.php b/app/Http/Controllers/SQLController.php new file mode 100644 index 0000000..2811029 --- /dev/null +++ b/app/Http/Controllers/SQLController.php @@ -0,0 +1,1268 @@ +roleid . '.sql.learning'); + } + public function learningRead($id = null) + { + switch (Auth::user()->roleid) { + case 'admin': + if ($id == null) { + $data = SqlLearning::all(); + } else { + $data = SqlLearning::findOrFail($id); + } + break; + + case 'student': + if ($id == null) { + $data = SqlLearning::select('*') + ->selectRaw('COALESCE((SELECT sql_learning_users.status FROM sql_learning_users WHERE sql_learning_users.user_id = ' . Auth::user()->id . ' AND sql_learning_users.sql_learning_id = sql_learnings.id LIMIT 1), "Belum Dikerjakan") AS status') + ->get(); + } else { + $data = SqlLearning::findOrFail($id); + } + break; + + default: + $data = []; + break; + } + return $data; + } + public function learningStore(Request $request) + { + $validator = Validator::make($request->all(), [ + 'name' => 'required', + 'syntax' => 'required', + 'file' => 'required', + ], [ + 'required' => 'Silahkan isi bagian :attribute.', + ]); + + if ($validator->fails()) { + return $validator->errors(); + } + + $file = $request->file('file'); + $filename = uniqid() . '.' . $file->getClientOriginalExtension(); + $file->move('upload', $filename); + + $data = $validator->validated(); + $data['file'] = 'upload/' . $filename; + + SqlLearning::create($data); + return 'ok'; + } + public function learningUpdate(Request $request, $id = null) + { + if ($id != null) { + $dataOld = SqlLearning::findOrFail($id); + $validator = Validator::make($request->all(), [ + 'name' => 'required', + 'syntax' => 'required', + ], [ + 'required' => 'Silahkan isi bagian :attribute.', + ]); + + if ($validator->fails()) { + return $validator->errors(); + } + $data = $validator->validated(); + + if ($request->hasFile('file')) { + $file = $request->file('file'); + $filename = uniqid() . '.' . $file->getClientOriginalExtension(); + $file->move('upload', $filename); + $data['file'] = 'upload/' . $filename; + + if (file_exists(public_path($dataOld->file))) { + unlink(public_path($dataOld->file)); + } + } + + $dataOld->update($data); + return 'ok'; + } + } + public function learningDelete($id = null) + { + if ($id != null) { + $data = SqlLearning::find($id); + if (file_exists(public_path($data->file))) { + unlink(public_path($data->file)); + } + $data->delete(); + } + } + public function learningDo($id = null) + { + $data = SqlLearning::findOrFail($id); + $userLearn = SqlLearningUser::where('user_id', Auth::user()->id)->where('sql_learning_id', $id)->first(); + if (empty($userLearn)) { + $userLearn = SqlLearningUser::create([ + 'status' => 'sedang dikerjakan', + 'sql_learning_id' => $id, + 'user_id' => Auth::user()->id, + ]); + } + $data['user'] = SqlLearningUser::where('user_id', Auth::user()->id)->where('sql_learning_id', $data->id)->with(['input' => function ($query) use($userLearn) { + $query->where('sql_learning_user_id', $userLearn->id)->orderBy('id', 'DESC')->limit(1); + }])->first(); + $data['previous'] = SqlLearning::where('id', '<', $id)->max('id'); + $data['next'] = SqlLearning::where('id', '>', $id)->min('id'); + + // return $data; + return view('student.sql.learning_do', ['data' => $data]); + } + public function learningDoReset() + { + $data = SqlLearning::get(); + foreach ($data as $values) { + $id = $values->id; + $data['user'] = SqlLearningUser::where('sql_learning_id', $id)->where('user_id', Auth::user()->id); + $data['log'] = SqlLearningUserLog::whereIn('sql_learning_user_id', $data['user']->pluck('id')->toArray()); + + foreach ($data['log']->get() as $values) { + if ($values->rollback != '' && $values->status == 1) { + $this->sqlExec($values->rollback); + } + + $values->delete(); + } + + $data['user']->delete(); + } + } + public function learningDoExec(Request $request, $id = null) + { + if ($id != null) { + $validator = Validator::make($request->all(), [ + 'syntax' => 'required', + ], [ + 'required' => 'Anda belum menuliskan apapun!', + ]); + + if ($validator->fails()) { + return [ + 'status' => 'gagal', + [ + 'status' => 'gagal', + 'message' => $validator->messages()->get('syntax') + ] + ]; + } + + $syntax = []; + $sql = $request->input('syntax'); + // $sqlRaw = $this->syntaxParse($sql); + // $data = SqlLearning::findOrFail($id); + + // $db = DB::select('SHOW DATABASES LIKE "%mahasiswa' . Auth::user()->id . '_%"'); + // if (!empty($db)) { + // foreach ($db[0] as $key => $value) { + // DB::getPdo()->query('use ' . $value); + // } + // } + + // $this->sqlExec($sqlRaw); + // $sql = $this->tapExec($data->syntax); + + // $userLearn = new SqlLearningUser(); + // $userLearn = $userLearn->where('user_id', Auth::user()->id)->where('sql_learning_id', $id)->firstOrFail(); + // $userLearn->update(['status' => $sql['status']]); + + $data = SqlLearning::findOrFail($id); + $user = SqlLearningUser::where('user_id', Auth::user()->id)->where('sql_learning_id', $id)->firstOrFail(); + + $db = DB::select('SHOW DATABASES LIKE "%pembelajaran_mahasiswa_' . Auth::user()->id . '_%"'); + if (!empty($db)) { + foreach ($db[0] as $key => $value) { + $db = $value; + } + } else { + $db = 'sandbox'; + } + + DB::getPdo()->query('use ' . $db); + $syntax['user']['syntax'] = $this->syntaxParse($request->input('syntax'), 'pembelajaran'); + $syntax['user']['rollback'] = $this->syntaxRollback($syntax['user']['syntax']); + $syntax['user']['result'] = $this->sqlExec($syntax['user']['syntax']); + + $syntax['tap']['syntax'] = $data->syntax; + $syntax['tap']['result'] = $this->tapExec($syntax['tap']['syntax'], 'pembelajaran'); + + if ($user->status != 'lulus') { + $user->update(['status' => $syntax['tap']['result']['status']]); + } + + if ($syntax['tap']['result']['status'] != 'lulus') { + DB::getPdo()->query('use ' . $db); + $this->sqlExec($syntax['user']['rollback']); + } + + SqlLearningUserLog::create([ + 'syntax' => $syntax['user']['syntax'], + 'rollback' => $syntax['user']['rollback'], + 'result' => json_encode($syntax['tap']['result']), + 'status' => (($syntax['tap']['result']['status'] == 'lulus') ? 1 : 0), + 'sql_learning_user_id' => $user->id, + ]); + + return $syntax['tap']['result']; + } + + return [ + 'status' => 0, + 'error' => [ + 'syntax' => 'please check your queries' + ] + ]; + } + public function learningLogRead($id = null) + { + $data = []; + if ($id == null) { + $users = SqlLearningUser::get()->pluck('user_id')->toArray(); + $data = User::whereIn('id', $users)->get(); + } else { + $data = SqlLearningUser::where('user_id', $id)->with(['input', 'user'])->get(); + } + return $data; + } + + public function practice() + { + return view(Auth::user()->roleid . '.sql.practice'); + } + public function practiceRead($id = null) + { + switch (Auth::user()->roleid) { + case 'admin': + if ($id == null) { + $data = SqlPractice::all(); + } else { + $data = SqlPractice::with('question')->findOrFail($id); + } + break; + + case 'student': + if ($id == null) { + $data = SqlPractice::select('*') + ->selectRaw('(SELECT COUNT(*) FROM sql_practice_users WHERE sql_practice_users.user_id = "' . Auth::user()->id . '" AND sql_practice_users.correct IS NULL AND sql_practice_users.sql_practice_question_id IN (SELECT sql_practice_questions.id FROM sql_practice_questions WHERE sql_practice_questions.sql_practice_id = sql_practices.id)) AS ncomplete') + ->selectRaw('(SELECT COUNT(*) FROM sql_practice_users WHERE sql_practice_users.user_id = "' . Auth::user()->id . '" AND sql_practice_users.correct IS NOT NULL AND sql_practice_users.sql_practice_question_id IN (SELECT sql_practice_questions.id FROM sql_practice_questions WHERE sql_practice_questions.sql_practice_id = sql_practices.id)) AS complete') + ->selectRaw('(SELECT COUNT(*) FROM sql_practice_users WHERE sql_practice_users.user_id = "' . Auth::user()->id . '" AND sql_practice_users.correct = 1 AND sql_practice_users.sql_practice_question_id IN (SELECT sql_practice_questions.id FROM sql_practice_questions WHERE sql_practice_questions.sql_practice_id = sql_practices.id)) AS correct') + ->get(); + } else { + $data = SqlPractice::findOrFail($id); + } + break; + + default: + $data = []; + break; + } + return $data; + } + public function practiceStore(Request $request) + { + $validator = Validator::make($request->all(), [ + 'name' => 'required', + 'question' => 'required', + ], [ + 'required' => 'Silahkan isi bagian :attribute.', + ]); + + if ($validator->fails()) { + return $validator->errors(); + } + + $data = $validator->validated(); + + $sql = SqlPractice::create([ + 'name' => $data['name'], + 'question' => sizeof($data['question']) + ]); + if ($sql) { + foreach ($data['question'] as $value) { + $values = json_decode($value, true); + $values['sql_practice_id'] = $sql->id; + SqlPracticeQuestion::create($values); + } + } + return 'ok'; + } + public function practiceUpdate(Request $request, $id = null) + { + if ($id != null) { + $dataOld = SqlPractice::findOrFail($id); + $validator = Validator::make($request->all(), [ + 'name' => 'required', + 'question' => 'required', + ], [ + 'required' => 'Silahkan isi bagian :attribute.', + ]); + + if ($validator->fails()) { + return $validator->errors(); + } + $data = $validator->validated(); + + $ids = []; + foreach ($data['question'] as $index => $value) { + $question = SqlPracticeQuestion::where('sql_practice_id', $id)->find($index); + $values = json_decode($value, true); + $values['sql_practice_id'] = $id; + if ($values['question'] != '' && $values['syntax'] != '') { + if (empty($question)) { + SqlPracticeQuestion::create($values); + } else { + $question->update($values); + } + $ids[] = $index; + } + } + + SqlPracticeQuestion::where('sql_practice_id', $id)->whereNotIn('id', $ids)->delete(); + + $dataOld->update([ + 'name' => $data['name'], + 'question' => sizeof($ids) + ]); + + + return 'ok'; + } + } + public function practiceDelete($id = null) + { + if ($id != null) { + $data = SqlPractice::find($id); + $data->delete(); + } + } + public function practiceDo($id = null, $question = null) + { + $data = []; + if ($question == null) { + $query = SqlPracticeQuestion::where('sql_practice_id', $id)->get(); + } else { + $query = SqlPracticeQuestion::where('sql_practice_id', $id)->where('id', $question)->get(); + } + + if (!empty($query)) { + $ids = $query->pluck('id')->toArray(); + $userPractice = SqlPracticeUser::where('user_id', Auth::user()->id)->whereIn('sql_practice_question_id', $ids)->first(); + $min = SqlPracticeQuestion::where('sql_practice_id', $id)->min('id'); + if (empty($userPractice)) { + $userPractice = SqlPracticeUser::create([ + 'sql_practice_question_id' => $ids[0], + 'user_id' => Auth::user()->id, + ]); + } + + if ($question == null) { + return redirect()->route('student sql practice do question', [$id, $ids[0]]); + } + + $data['user'] = $userPractice; + $data['question'] = SqlPracticeQuestion::with('practice')->where('id', $data['user']->sql_practice_question_id)->firstOrFail(); + $data['practice'] = $data['question']['id'] - $min + 1; + $data['previous'] = SqlPracticeQuestion::where('sql_practice_id', $id)->where('id', '<', $question)->max('id'); + $data['next'] = SqlPracticeQuestion::where('sql_practice_id', $id)->where('id', '>', $question)->min('id'); + + // return $data; + return view('student.sql.practice_do', ['data' => $data]); + } else { + throw new Exception("Error Processing Request", 1); + } + } + public function practiceDoExec(Request $request, $id = null) + { + if ($id != null) { + $validator = Validator::make($request->all(), [ + 'syntax' => 'required', + ], [ + 'required' => 'Anda belum menuliskan apapun!', + ]); + + if ($validator->fails()) { + return [ + 'status' => 'gagal', + [ + 'status' => 'gagal', + 'message' => $validator->messages()->get('syntax') + ] + ]; + } + + $syntax = []; + $sql = $request->input('syntax'); + + $data = SqlPracticeQuestion::findOrFail($id); + $user = SqlPracticeUser::where('user_id', Auth::user()->id)->where('sql_practice_question_id', $id)->firstOrFail(); + + $db = DB::select('SHOW DATABASES LIKE "%praktek_mahasiswa_' . Auth::user()->id . '_%"'); + if (!empty($db)) { + foreach ($db[0] as $key => $value) { + $db = $value; + } + } else { + $db = 'sandbox'; + } + + DB::getPdo()->query('use ' . $db); + $syntax['user']['syntax'] = $this->syntaxParse($request->input('syntax'), 'praktek'); + $syntax['user']['rollback'] = $this->syntaxRollback($syntax['user']['syntax']); + $syntax['user']['result'] = $this->sqlExec($syntax['user']['syntax']); + + $syntax['tap']['syntax'] = $data->syntax; + $syntax['tap']['result'] = $this->tapExec($syntax['tap']['syntax'], 'praktek'); + + if ($user->correct != 1) { + switch ($syntax['tap']['result']['status']) { + case 'lulus': + $user->update([ + 'correct' => 1, + 'syntax' => $syntax['user']['syntax'], + 'result' => $syntax['tap']['result'] + ]); + break; + + default: + $user->update([ + 'correct' => 0, + 'syntax' => $syntax['user']['syntax'], + 'result' => $syntax['tap']['result'] + ]); + break; + } + } + + DB::getPdo()->query('use ' . $db); + // $this->sqlExec($syntax['user']['rollback']); + + return $syntax['tap']['result']; + } + + return [ + 'status' => 0, + 'error' => [ + 'syntax' => 'please check your queries' + ] + ]; + } + public function practiceLogRead() + { + $data = []; + $datas = SqlPractice::with('questions')->get()->toArray(); + foreach ($datas as $key => $value) { + $users = SqlPracticeUser::select('user_id')->distinct()->get()->pluck('user_id')->toArray(); + foreach ($users as $index => $user) { + $practice = SqlPracticeUser::where('user_id', $user)->whereIn('sql_practice_question_id', array_column($value['questions'], 'id'))->whereNotNull('correct'); + $all = $practice->count(); + $correct = $practice->where('correct', 1)->count(); + + if ($all == $value['question']) { + if (!isset($data[$index])) { + $data[$index] = User::find($user)->toArray(); + } + $data[$index]['practice'][] = [ + 'name' => $value['name'], + 'nilai' => $correct / $all * 100, + ]; + } + } + } + return $data; + } + + public function exercise() + { + return view(Auth::user()->roleid . '.sql.exercise'); + } + public function exerciseRead($id = null) + { + switch (Auth::user()->roleid) { + case 'admin': + if ($id == null) { + $data = SqlExercise::all(); + } else { + $data = SqlExercise::findOrFail($id); + } + break; + + case 'student': + if ($id == null) { + $data = SqlExerciseResult::where('user_id', Auth::user()->id)->where('status', 'selesai')->get(); + } else { + $data = SqlExercise::findOrFail($id); + } + break; + + default: + $data = []; + break; + } + return $data; + } + public function exerciseStart() + { + $result = SqlExerciseResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first(); + if (empty($result)) { + $result = SqlExerciseResult::create([ + 'status' => 'sedang dikerjakan', + 'user_id' => Auth::user()->id + ]); + } + + $exercise = SqlExercise::first(); + if (empty($exercise)) { + return redirect()->route('student sql exercise'); + } + + $input = SqlExerciseUser::where('sql_exercise_result_id', $result->id)->orderBy('id', 'DESC')->first(); + if (empty($input)) { + $input = SqlExerciseUser::create([ + 'answer' => null, + 'sql_exercise_id' => $exercise->id, + 'sql_exercise_result_id' => $result->id, + ]); + } + + return redirect()->route('student sql exercise do', $input->sql_exercise_id); + } + public function exerciseDo($id = null) + { + $data = []; + + $result = SqlExerciseResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first(); + if (empty($result)) { + $result = SqlExerciseResult::create([ + 'status' => 'sedang dikerjakan', + 'user_id' => Auth::user()->id + ]); + } + + $input = SqlExerciseUser::where('sql_exercise_id', $id)->where('sql_exercise_result_id', $result->id)->orderBy('id', 'DESC')->first(); + if (empty($input)) { + $input = SqlExerciseUser::create([ + 'answer' => null, + 'sql_exercise_id' => $id, + 'sql_exercise_result_id' => $result->id, + ]); + } + + $exercise = SqlExercise::find($id); + if (!empty($exercise)) { + $data['semua'] = SqlExercise::orderBy('id', 'ASC')->get()->pluck('id')->toArray(); + $data['terjawab'] = SqlExerciseUser::whereNotNull('answer')->where('sql_exercise_result_id', $result->id)->orderBy('sql_exercise_id', 'ASC')->get()->pluck('sql_exercise_id')->toArray(); + $data['sekarang'] = $id; + $data['belum'] = SqlExercise::whereNotIn('id', $data['terjawab'])->orderBy('id', 'ASC')->get()->pluck('id')->toArray(); + $data['next'] = SqlExercise::where('id', '>', $id)->min('id'); + $data['soal'] = $exercise->question; + + $jawaban[0] = $exercise->answer_1; + $jawaban[1] = $exercise->answer_2; + $jawaban[2] = $exercise->answer_3; + $jawaban[3] = $exercise->answer_4; + + $data['input'] = null; + $userInput = null; + if (!empty($input) && $input->answer != null) { + $userInput = $jawaban[$input->answer - 1]; + } + + shuffle($jawaban); + + if ($userInput != null) { + $data['input'] = array_search($userInput, $jawaban); + } + + $data['jawaban'] = $jawaban; + + return view('student.sql.exercise_do', ['data' => $data]); + } + + return redirect()->route('student sql exercise'); + } + public function exerciseDoDetail($id = null) + { + $data = []; + + $exercise = SqlExercise::orderBy('id')->get(); + foreach ($exercise as $key => $value) { + $user = SqlExerciseUser::where('sql_exercise_result_id', $id)->where('sql_exercise_id', $value->id)->first(); + $jawaban = []; + $jawaban[0] = $value->answer_1; + $jawaban[1] = $value->answer_2; + $jawaban[2] = $value->answer_3; + $jawaban[3] = $value->answer_4; + + $input = null; + + if ($user != null && $user->answer != null) { + $input = $jawaban[$user->answer - 1]; + } + + shuffle($jawaban); + + $correct = array_search($value->answer_1, $jawaban) + 1; + + if ($input != null) { + $input = array_search($input, $jawaban) + 1; + } + + $data[] = array( + 'soal' => $value->question, + 'jawaban_1' => $jawaban[0], + 'jawaban_2' => $jawaban[1], + 'jawaban_3' => $jawaban[2], + 'jawaban_4' => $jawaban[3], + 'input' => $input, + 'correct' => $correct + ); + } + + return $data; + } + public function exerciseAnswer(Request $request, $id = null) + { + $validator = Validator::make($request->all(), [ + 'jawaban' => 'required', + ], [ + 'required' => 'Silahkan isi bagian :attribute.', + ]); + + if ($validator->fails()) { + return redirect()->back(); + } + + $result = SqlExerciseResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first(); + if (empty($result)) { + $result = SqlExerciseResult::create([ + 'status' => 'sedang dikerjakan', + 'user_id' => Auth::user()->id + ]); + } + + $input = SqlExerciseUser::where('sql_exercise_id', $id)->where('sql_exercise_result_id', $result->id)->orderBy('id', 'DESC')->first(); + if (empty($input)) { + $input = SqlExerciseUser::create([ + 'answer' => null, + 'sql_exercise_id' => $id, + 'sql_exercise_result_id' => $result->id, + ]); + } + + $exercise = SqlExercise::find($id); + if (!empty($exercise)) { + $jawaban[0] = $exercise->answer_1; + $jawaban[1] = $exercise->answer_2; + $jawaban[2] = $exercise->answer_3; + $jawaban[3] = $exercise->answer_4; + + $input->answer = array_search($request->input('jawaban'), $jawaban) + 1; + $input->save(); + + $next = SqlExercise::where('id', '>', $id)->min('id'); + if ($next != null) { + return redirect()->route('student sql exercise do', $next); + } else { + $next = SqlExercise::min('id'); + return redirect()->route('student sql exercise do', $next); + } + } + } + public function exerciseComplete() + { + $result = SqlExerciseResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first(); + if (!empty($result)) { + $total = SqlExercise::count(); + $benar = SqlExerciseUser::where('answer', 1)->where('sql_exercise_result_id', $result->id)->count(); + + $result->nilai = $benar / $total * 100; + $result->status = 'selesai'; + $result->save(); + + return redirect()->route('student sql exercise'); + } + + return redirect()->back(); + } + public function exerciseStore(Request $request) + { + $validator = Validator::make($request->all(), [ + 'question' => 'required', + 'answer_1' => 'required', + 'answer_2' => 'required', + 'answer_3' => 'required', + 'answer_4' => 'required', + ], [ + 'required' => 'Silahkan isi bagian :attribute.', + ]); + + if ($validator->fails()) { + return $validator->errors(); + } + + $data = $validator->validated(); + + SqlExercise::create($data); + return 'ok'; + } + public function exerciseUpdate(Request $request, $id = null) + { + if ($id != null) { + $dataOld = SqlExercise::findOrFail($id); + $validator = Validator::make($request->all(), [ + 'question' => 'required', + 'answer_1' => 'required', + 'answer_2' => 'required', + 'answer_3' => 'required', + 'answer_4' => 'required', + ], [ + 'required' => 'Silahkan isi bagian :attribute.', + ]); + + if ($validator->fails()) { + return $validator->errors(); + } + $data = $validator->validated(); + + $dataOld->update($data); + return 'ok'; + } + } + public function exerciseDelete($id = null) + { + if ($id != null) { + $data = SqlExercise::find($id); + $data->delete(); + } + } + public function exerciseLogRead() + { + $data = []; + $users = SqlExerciseResult::get()->pluck('user_id')->toArray(); + $data = User::whereIn('id', $users)->with('exercise')->get(); + return $data; + } + + public function exam() + { + return view(Auth::user()->roleid . '.sql.exam'); + } + public function examRead($id = null) + { + switch (Auth::user()->roleid) { + case 'admin': + if ($id == null) { + $data = SqlExam::all(); + } else { + $data = SqlExam::findOrFail($id); + } + break; + + case 'student': + if ($id == null) { + $data = SqlExamResult::where('user_id', Auth::user()->id)->where('status', 'selesai')->get(); + } else { + $data = SqlExam::findOrFail($id); + } + break; + + default: + $data = []; + break; + } + return $data; + } + public function examStart() + { + $result = SqlExamResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first(); + if (empty($result)) { + $result = SqlExamResult::create([ + 'status' => 'sedang dikerjakan', + 'user_id' => Auth::user()->id + ]); + } + + $exam = SqlExam::first(); + if (empty($exam)) { + return redirect()->route('student sql exam'); + } + + $input = SqlExamUser::where('sql_exam_result_id', $result->id)->orderBy('id', 'DESC')->first(); + if (empty($input)) { + $input = SqlExamUser::create([ + 'answer' => null, + 'sql_exam_id' => $exam->id, + 'sql_exam_result_id' => $result->id, + ]); + } + + return redirect()->route('student sql exam do', $input->sql_exam_id); + } + public function examDo($id = null) + { + $data = []; + + $result = SqlExamResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first(); + if (empty($result)) { + $result = SqlExamResult::create([ + 'status' => 'sedang dikerjakan', + 'user_id' => Auth::user()->id + ]); + } + + $input = SqlExamUser::where('sql_exam_id', $id)->where('sql_exam_result_id', $result->id)->orderBy('id', 'DESC')->first(); + if (empty($input)) { + $input = SqlExamUser::create([ + 'answer' => null, + 'sql_exam_id' => $id, + 'sql_exam_result_id' => $result->id, + ]); + } + + $exam = SqlExam::find($id); + if (!empty($exam)) { + $data['semua'] = SqlExam::orderBy('id', 'ASC')->get()->pluck('id')->toArray(); + $data['terjawab'] = SqlExamUser::whereNotNull('answer')->where('sql_exam_result_id', $result->id)->orderBy('sql_exam_id', 'ASC')->get()->pluck('sql_exam_id')->toArray(); + $data['sekarang'] = $id; + $data['belum'] = SqlExam::whereNotIn('id', $data['terjawab'])->orderBy('id', 'ASC')->get()->pluck('id')->toArray(); + $data['next'] = SqlExam::where('id', '>', $id)->min('id'); + $data['soal'] = $exam->question; + + $jawaban[0] = $exam->answer_1; + $jawaban[1] = $exam->answer_2; + $jawaban[2] = $exam->answer_3; + $jawaban[3] = $exam->answer_4; + + $data['input'] = null; + $userInput = null; + if (!empty($input) && $input->answer != null) { + $userInput = $jawaban[$input->answer - 1]; + } + + shuffle($jawaban); + + if ($userInput != null) { + $data['input'] = array_search($userInput, $jawaban); + } + + $data['jawaban'] = $jawaban; + + return view('student.sql.exam_do', ['data' => $data]); + } + + return redirect()->route('student sql exam'); + } + public function examDoDetail($id = null) + { + $data = []; + + $exam = SqlExam::orderBy('id')->get(); + foreach ($exam as $key => $value) { + $user = SqlExamUser::where('sql_exam_result_id', $id)->where('sql_exam_id', $value->id)->first(); + $jawaban = []; + $jawaban[0] = $value->answer_1; + $jawaban[1] = $value->answer_2; + $jawaban[2] = $value->answer_3; + $jawaban[3] = $value->answer_4; + + $input = null; + + if ($user != null && $user->answer != null) { + $input = $jawaban[$user->answer - 1]; + } + + shuffle($jawaban); + + $correct = array_search($value->answer_1, $jawaban) + 1; + + if ($input != null) { + $input = array_search($input, $jawaban) + 1; + } + + $data[] = array( + 'soal' => $value->question, + 'jawaban_1' => $jawaban[0], + 'jawaban_2' => $jawaban[1], + 'jawaban_3' => $jawaban[2], + 'jawaban_4' => $jawaban[3], + 'input' => $input, + 'correct' => $correct + ); + } + + return $data; + } + public function examAnswer(Request $request, $id = null) + { + $validator = Validator::make($request->all(), [ + 'jawaban' => 'required', + ], [ + 'required' => 'Silahkan isi bagian :attribute.', + ]); + + if ($validator->fails()) { + return redirect()->back(); + } + + $result = SqlExamResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first(); + if (empty($result)) { + $result = SqlExamResult::create([ + 'status' => 'sedang dikerjakan', + 'user_id' => Auth::user()->id + ]); + } + + $input = SqlExamUser::where('sql_exam_id', $id)->where('sql_exam_result_id', $result->id)->orderBy('id', 'DESC')->first(); + if (empty($input)) { + $input = SqlExamUser::create([ + 'answer' => null, + 'sql_exam_id' => $id, + 'sql_exam_result_id' => $result->id, + ]); + } + + $exam = SqlExam::find($id); + if (!empty($exam)) { + $jawaban[0] = $exam->answer_1; + $jawaban[1] = $exam->answer_2; + $jawaban[2] = $exam->answer_3; + $jawaban[3] = $exam->answer_4; + + $input->answer = array_search($request->input('jawaban'), $jawaban) + 1; + $input->save(); + + $next = SqlExam::where('id', '>', $id)->min('id'); + if ($next != null) { + return redirect()->route('student sql exam do', $next); + } else { + $next = SqlExam::min('id'); + return redirect()->route('student sql exam do', $next); + } + } + } + public function examComplete() + { + $result = SqlExamResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first(); + if (!empty($result)) { + $total = SqlExam::count(); + $benar = SqlExamUser::where('answer', 1)->where('sql_exam_result_id', $result->id)->count(); + + $result->nilai = $benar / $total * 100; + $result->status = 'selesai'; + $result->save(); + + return redirect()->route('student sql exam'); + } + + return redirect()->back(); + } + public function examStore(Request $request) + { + $validator = Validator::make($request->all(), [ + 'question' => 'required', + 'answer_1' => 'required', + 'answer_2' => 'required', + 'answer_3' => 'required', + 'answer_4' => 'required', + ], [ + 'required' => 'Silahkan isi bagian :attribute.', + ]); + + if ($validator->fails()) { + return $validator->errors(); + } + + $data = $validator->validated(); + + SqlExam::create($data); + return 'ok'; + } + public function examUpdate(Request $request, $id = null) + { + if ($id != null) { + $dataOld = SqlExam::findOrFail($id); + $validator = Validator::make($request->all(), [ + 'question' => 'required', + 'answer_1' => 'required', + 'answer_2' => 'required', + 'answer_3' => 'required', + 'answer_4' => 'required', + ], [ + 'required' => 'Silahkan isi bagian :attribute.', + ]); + + if ($validator->fails()) { + return $validator->errors(); + } + $data = $validator->validated(); + + $dataOld->update($data); + return 'ok'; + } + } + public function examDelete($id = null) + { + if ($id != null) { + $data = SqlExam::find($id); + $data->delete(); + } + } + public function examLogRead() + { + $data = []; + $users = SqlExamResult::get()->pluck('user_id')->toArray(); + $data = User::whereIn('id', $users)->with('exam')->get(); + return $data; + } + + protected function sqlExec($sql = '') + { + $result = []; + $sqlLines = explode(';', $sql); + foreach ($sqlLines as $key => $value) { + try { + DB::getPdo()->query($value); + } catch (\Throwable $th) { + continue; + } + } + DB::getPdo()->query('use ' . env('DB_DATABASE')); + return $result; + } + + protected function tapExec($sql = '', $prefix = '') + { + $result = []; + $sql = explode(';', $sql); + $result['status'] = 'lulus'; + foreach ($sql as $key => $value) { + try { + $value = $this->tapParse($value, $prefix); + $res = DB::connection('tap')->getPdo()->query($value)->fetchAll(); + if (!empty($res) && str_contains(strtolower($res[0][0]), "ok") && str_contains(strtolower($res[0][0]), "-")) { + $resl = [ + 'message' => rtrim(substr($res[0][0], 0, (strpos($res[0][0], '#') != false) ? strpos($res[0][0], '#') : strlen($res[0][0]))), + 'status' => 'lulus' + ]; + if (str_contains(strtolower($res[0][0]), "not ok")) { + $result['status'] = 'gagal'; + $resl['status'] = 'gagal'; + } + + $result[] = $resl; + } + } catch (\Throwable $th) { + continue; + } + } + DB::getPdo()->query('use ' . env('DB_DATABASE')); + return $result; + } + + protected function syntaxParse($sql = '', $prefix = '') + { + $needs = ['database', 'use']; + $lastPos = 0; + foreach ($needs as $key => $needle) { + while (($lastPos = stripos($sql, $needle, $lastPos)) !== false) { + $first = $lastPos + strlen($needle); + $last = $this->strposa($sql, [' ', ';', PHP_EOL], $first + 1); + if ($last == false) { + $last = strlen($sql); + } + + $name = preg_replace('/\s+|;+/', '', substr($sql, $first, $last - $first)); + // $sql = str_replace($name, 'user'.Auth::user()->id . '_' . $name, $sql); + + $sql = substr_replace($sql, $prefix . '_mahasiswa_' . Auth::user()->id . '_' . $name, $first + 1, $last - $first - 1); + $lastPos = $first; + } + } + return $sql; + } + + protected function syntaxRollback($sql = '') + { + $rollback = ''; + $needs = ['create table', 'create database']; + $lastPos = 0; + foreach ($needs as $key => $needle) { + while (($lastPos = stripos($sql, $needle, $lastPos)) !== false) { + $first = $lastPos + strlen($needle) + 1; + $last = $this->strposa($sql, [' ', '(', ';', PHP_EOL], $first + 1); + if ($last == false) { + $last = strlen($sql); + } + + $name = preg_replace('/\s+|;+/', '', substr($sql, $first, $last - $first)); + + $rollback .= str_replace('create', 'drop', $needle) . ' ' . $name . ';'; + $lastPos = $last; + } + } + + return $rollback; + } + + protected function tapParse($sql = '', $prefix = '') + { + $needs = [ + 'has_schema', + 'has_table', + '__hasnt_table', + 'table_engine_is', + 'table_collation_is', + 'table_character_set_is', + 'tables_are', + 'table_sha1_is', + 'has_column', + 'hasnt_column', + 'col_is_null', + 'col_not_null', + 'col_has_primary_key', + 'col_hasnt_primary_key', + 'col_has_index_key', + 'col_hasnt_index_key', + 'col_has_unique_index', + 'col_hasnt_unique_index', + 'col_has_named_index', + 'col_has_pos_in_named_index', + 'col_hasnt_pos_in_named_index', + 'col_has_type', + 'col_data_type_is', + 'col_column_type_is', + 'col_has_default', + 'col_hasnt_default', + 'col_default_is', + 'col_extra_is', + 'col_charset_is', + 'col_character_set_is', + 'col_collation_set_is', + 'columns_are', + 'has_routine', + 'has_function', + 'hasnt_function', + 'has_procedure', + 'function_data_type_is', + 'function_is_deterministic', + 'procedure_is_deterministic', + 'function_security_type_is', + 'procedure_security_type_is', + 'function_sql_data_access_is', + 'procedure_sql_data_access_is', + 'routines_are', + 'routine_has_sql_mode', + 'routine_sha1_is', + 'has_view', + 'has_security_invoker', + 'has_security_definer', + 'view_security_type_is', + 'view_check_option_is', + 'view_is_updatable', + 'view_definer_is', + 'views_are', + 'has_trigger', + 'hasnt_trigger', + 'trigger_event_is', + 'trigger_timing_is', + 'trigger_order', + 'trigger_is', + 'triggers_are', + 'schema_collation_is', + 'schema_character_set_is', + 'schemas_are', + 'has_event', + 'hasnt_event', + 'event_type_is', + 'event_interval_value_is', + 'event_interval_field_is', + 'event_status_is', + 'events_are', + 'has_constraint', + 'has_pk', + 'hasnt_pk', + 'has_fk', + 'hasnt_fk', + 'col_is_unique', + 'col_is_pk', + 'has_unique', + 'constraint_type_is', + 'fk_on_delete', + 'fk_on_update', + 'fk_ok', + 'index_is', + 'is_indexed', + 'has_index', + 'hasnt_index', + 'index_is_type', + 'indexes_are', + 'has_partition', + 'hasnt_partition', + 'has_subpartition', + 'hasnt_subpartition', + 'partition_expression_is', + 'subpartition_expression_is', + 'partition_method_is', + 'subpartition_method_is', + 'partition_count_is', + 'partitions_are', + ]; + $lastPos = 0; + foreach ($needs as $key => $needle) { + while (($lastPos = stripos($sql, $needle, $lastPos)) !== false) { + $first = $this->strposa($sql, ["'"], $lastPos); + $last = $this->strposa($sql, [','], $first); + if ($last == false) { + $last = strlen($sql); + } + + $name = preg_replace("/\s+|;+|'+/", '', substr($sql, $first, $last - $first)); + $sql = substr_replace($sql, "'" . $prefix . "_mahasiswa_" . Auth::user()->id . '_' . $name . "'", $first, $last - $first); + $lastPos = $lastPos + strlen($needle); + } + } + return $sql; + } + + function strposa($haystack, $needles = array(), $offset = 0) + { + $chr = array(); + foreach ($needles as $needle) { + $res = strpos($haystack, $needle, $offset); + if ($res !== false) $chr[$needle] = $res; + } + if (empty($chr)) return false; + return min($chr); + } +} diff --git a/app/SqlExam.php b/app/SqlExam.php new file mode 100644 index 0000000..e3bb05a --- /dev/null +++ b/app/SqlExam.php @@ -0,0 +1,16 @@ +hasMany(SqlLearningUserLog::class); + } + + public function user() + { + return $this->belongsTo(User::class); + } +} diff --git a/app/SqlLearningUserLog.php b/app/SqlLearningUserLog.php new file mode 100644 index 0000000..ebad9a9 --- /dev/null +++ b/app/SqlLearningUserLog.php @@ -0,0 +1,16 @@ +hasMany(SqlPracticeQuestion::class); + } + + public function questions() + { + return $this->hasMany(SqlPracticeQuestion::class); + } +} diff --git a/app/SqlPracticeQuestion.php b/app/SqlPracticeQuestion.php new file mode 100644 index 0000000..f17d0bb --- /dev/null +++ b/app/SqlPracticeQuestion.php @@ -0,0 +1,19 @@ +belongsTo(SqlPractice::class, 'sql_practice_id', 'id'); + } +} diff --git a/app/SqlPracticeUser.php b/app/SqlPracticeUser.php new file mode 100644 index 0000000..43ce87e --- /dev/null +++ b/app/SqlPracticeUser.php @@ -0,0 +1,18 @@ + +@endsection +@section('js') + + +@endsection +@section('content') +
+
+
+
+

Soal Ujian Teori SQL

+
+ + + +
+
+
+
+
+ + + + + + + + + + {{-- + + --}} + {{-- + + + + --}} + +
NOSoalAction
+ tidak ada data +
'+(index+1)+''+ value.question +' +
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+ +
+ +
+ + +@endsection diff --git a/resources/views/admin/sql/exercise.blade.php b/resources/views/admin/sql/exercise.blade.php new file mode 100644 index 0000000..18fafba --- /dev/null +++ b/resources/views/admin/sql/exercise.blade.php @@ -0,0 +1,483 @@ +@extends('admin/admin') +@section('css') + +@endsection +@section('js') + + +@endsection +@section('content') +
+
+
+
+

Soal Latihan Teori SQL

+
+ + + +
+
+
+
+
+ + + + + + + + + + +
NOSoalAction
+
+
+
+
+
+
+ +
+ +
+ + +@endsection diff --git a/resources/views/admin/sql/learning.blade.php b/resources/views/admin/sql/learning.blade.php new file mode 100644 index 0000000..8d0a380 --- /dev/null +++ b/resources/views/admin/sql/learning.blade.php @@ -0,0 +1,639 @@ +@extends('admin/admin') +@section('css') + + + + +@endsection +@section('js') + + + + +@endsection +@section('content') +
+
+
+
+

Modul Pembelajaran SQL

+
+ + + +
+
+
+
+
+ + + + + + + + + + + + +
NONameSintak TesDokumen PenuntunAction
+
+
+
+
+
+
+ +
+ +
+ + + +@endsection diff --git a/resources/views/admin/sql/practice.blade copy.php b/resources/views/admin/sql/practice.blade copy.php new file mode 100644 index 0000000..32e0a85 --- /dev/null +++ b/resources/views/admin/sql/practice.blade copy.php @@ -0,0 +1,687 @@ +@extends('admin/admin') +@section('css') + + + +@endsection +@section('js') + + + + + +@endsection +@section('content') +
+
+
+
+

Modul Praktek SQL

+
+ + +
+
+
+
+
+ + + + + + + + + + + +
NONameJumlah SoalAction
+
+
+
+
+
+
+ +
+ +
+@endsection diff --git a/resources/views/admin/sql/practice.blade.php b/resources/views/admin/sql/practice.blade.php new file mode 100644 index 0000000..ad41929 --- /dev/null +++ b/resources/views/admin/sql/practice.blade.php @@ -0,0 +1,845 @@ +@extends('admin/admin') +@section('css') + + + + +@endsection +@section('js') + + + + + +@endsection +@section('content') +
+
+
+
+

Modul Praktek SQL

+
+ + + +
+
+
+
+
+ + + + + + + + + + + +
NONameJumlah SoalAction
+
+
+
+
+
+
+ +
+ +
+ + +@endsection diff --git a/resources/views/student/sql/exam.blade.php b/resources/views/student/sql/exam.blade.php new file mode 100644 index 0000000..0ff105d --- /dev/null +++ b/resources/views/student/sql/exam.blade.php @@ -0,0 +1,186 @@ +@extends('student/home') +@section('css') + +@endsection +@section('js') + + +@endsection +@section('content') +
+
+
+
+

Hasil Ujian SQL

+
+ + +
+
+
+
+
+ + + + + + + + + + +
NONilaiAction
+
+
+
+
+
+
+ + +@endsection diff --git a/resources/views/student/sql/exam_do.blade.php b/resources/views/student/sql/exam_do.blade.php new file mode 100644 index 0000000..fdbb8fb --- /dev/null +++ b/resources/views/student/sql/exam_do.blade.php @@ -0,0 +1,168 @@ + + + + + + + + APLAS - Administrator Site + + + + + + + +
+ {{--
+
+
+
+

Soal

+
+
+
+ @for ($i = 1; $i <= 18; $i++) +
+ +
+ @endfor +
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+

DDL - Table Creation 1

+
+ +
+
+
+

+ Siapakan nama saya? +

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
--}} + + @isset($data) +
+ @isset($data['semua']) +
+
+
+ + + + + @php($i = 1) + @foreach ($data['semua'] as $number) + @if ($i % 5 == 1) + + @endif + @if ($number == $data['sekarang']) + + @elseif (in_array($number, $data['terjawab'])) + + @else + + @endif + @php($i++) + @endforeach +
+ Selesaikan Ujian +
+ {{ $i }} + + {{ $i }} + + {{ $i }} +
+
+
+
+ @endisset + @isset($data['soal']) +
+
+ @csrf +
+
+

+ {{ $data['soal'] }} +

+
+ @isset($data['jawaban']) + @foreach ($data['jawaban'] as $index => $key) + @if (isset($data['input']) && $data['input'] == $index) +
+ + +
+ @else +
+ + +
+ @endif + @endforeach + @endisset +
+
+ +
+
+
+ @endisset +
+ @endisset +
+ + + + + + diff --git a/resources/views/student/sql/exercise.blade.php b/resources/views/student/sql/exercise.blade.php new file mode 100644 index 0000000..eedad0c --- /dev/null +++ b/resources/views/student/sql/exercise.blade.php @@ -0,0 +1,186 @@ +@extends('student/home') +@section('css') + +@endsection +@section('js') + + +@endsection +@section('content') +
+
+
+
+

Hasil Latihan SQL

+
+ + +
+
+
+
+
+ + + + + + + + + + +
NONilaiAction
+
+
+
+
+
+
+ + +@endsection diff --git a/resources/views/student/sql/exercise_do.blade.php b/resources/views/student/sql/exercise_do.blade.php new file mode 100644 index 0000000..f176e4c --- /dev/null +++ b/resources/views/student/sql/exercise_do.blade.php @@ -0,0 +1,168 @@ + + + + + + + + APLAS - Administrator Site + + + + + + + +
+ {{--
+
+
+
+

Soal

+
+
+
+ @for ($i = 1; $i <= 18; $i++) +
+ +
+ @endfor +
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+

DDL - Table Creation 1

+
+ +
+
+
+

+ Siapakan nama saya? +

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
--}} + + @isset($data) +
+ @isset($data['semua']) +
+
+
+ + + + + @php($i = 1) + @foreach ($data['semua'] as $number) + @if ($i % 5 == 1) + + @endif + @if ($number == $data['sekarang']) + + @elseif (in_array($number, $data['terjawab'])) + + @else + + @endif + @php($i++) + @endforeach +
+ Selesaikan Ujian +
+ {{ $i }} + + {{ $i }} + + {{ $i }} +
+
+
+
+ @endisset + @isset($data['soal']) +
+
+ @csrf +
+
+

+ {{ $data['soal'] }} +

+
+ @isset($data['jawaban']) + @foreach ($data['jawaban'] as $index => $key) + @if (isset($data['input']) && $data['input'] == $index) +
+ + +
+ @else +
+ + +
+ @endif + @endforeach + @endisset +
+
+ +
+
+
+ @endisset +
+ @endisset +
+ + + + + + diff --git a/resources/views/student/sql/learning.blade.php b/resources/views/student/sql/learning.blade.php new file mode 100644 index 0000000..60e1f93 --- /dev/null +++ b/resources/views/student/sql/learning.blade.php @@ -0,0 +1,195 @@ +@extends('student/home') +@section('css') + +@endsection +@section('js') + + +@endsection +@section('content') +
+
+
+
+

Modul Pembelajaran SQL

+
+ + +
+
+
+
+
+ + + + + + + + + + + +
NONameStatusSolve
+
+
+
+
+
+
+ +
+ +
+@endsection diff --git a/resources/views/student/sql/learning_do.blade copy.php b/resources/views/student/sql/learning_do.blade copy.php new file mode 100644 index 0000000..d6e7174 --- /dev/null +++ b/resources/views/student/sql/learning_do.blade copy.php @@ -0,0 +1,154 @@ +@extends('student/home') +@section('css') + + +@endsection +@section('js') + + + +@endsection +@section('content') +
+
+
+
+
+
+
+

1. DDL - Database Creation

+
+ +
+
+
+
+
+
+ +
+
+
+
Hasil
+
+ + +
+
+
+ {{-- --}} +
+
+
+ +
+
+
+
+
+
+
+@endsection diff --git a/resources/views/student/sql/learning_do.blade.php b/resources/views/student/sql/learning_do.blade.php new file mode 100644 index 0000000..17bc398 --- /dev/null +++ b/resources/views/student/sql/learning_do.blade.php @@ -0,0 +1,140 @@ +@extends('student/home') +@section('css') + + +@endsection +@section('js') + + + +@endsection +@section('content') + @isset($data) +
+
+
+
+
+
+
+

{{ $data['name'] }}

+
+
+ @if ($data['previous']) + Sebelumnya + @endif + @if ($data['next']) + Selanjutnya + @endif +
+
+
+
+
+
+
+ +
+
+
+ @php + $result = isset($data['user']['input'][0]) ? json_decode($data['user']['input'][0]['result'], true) : []; + $html = ''; + $lulus = 0; + $gagal = 0; + @endphp + @foreach ($result as $key => $value) + @if (is_array($value)) + @if ($value['status'] != 'lulus') + @php + $html .= '' . $value['message'] . ''; + $gagal++; + @endphp + @else + @php + $html .= '' . $value['message'] . ''; + $lulus++; + @endphp + @endif + @endif + @endforeach + + +
+ @if ($html != '') + {{ $lulus }} Lulus + {{ $gagal }} Gagal + @else +
Hasil
+ @endif +
+
+ @if ($data['user']['status'] != 'lulus') + + @else + Lulus + @endif +
+
+
{!! $html !!}
+
+
+
+ +
+
+
+
+
+
+
+ @endisset +@endsection diff --git a/resources/views/student/sql/practice.blade.php b/resources/views/student/sql/practice.blade.php new file mode 100644 index 0000000..85763a1 --- /dev/null +++ b/resources/views/student/sql/practice.blade.php @@ -0,0 +1,138 @@ +@extends('student/home') +@section('css') + +@endsection +@section('js') + + +@endsection +@section('content') +
+
+
+
+

Modul Praktek SQL

+
+ +
+
+
+
+
+ + + + + + + + + + + + +
NONameJumlah SoalStatusSolve
+
+
+
+
+
+
+ +
+ +
+@endsection diff --git a/resources/views/student/sql/practice_do.blade.php b/resources/views/student/sql/practice_do.blade.php new file mode 100644 index 0000000..9fa302f --- /dev/null +++ b/resources/views/student/sql/practice_do.blade.php @@ -0,0 +1,142 @@ +@extends('student/home') +@section('css') + + +@endsection +@section('js') + + + +@endsection +@section('content') + @isset($data) +
+
+
+
+
+
+
+

{{ $data['question']['practice']['name'] . ' (Soal ' . $data['practice'] . ')' }}

+
+
+ @if ($data['previous']) + Sebelumnya + @endif + @if ($data['next']) + Selanjutnya + @endif +
+
+
+
+
+
+
+ +
+
+
+ @php + $result = isset($data['user']['result']) ? json_decode($data['user']['result'], true) : []; + $html = ''; + $lulus = 0; + $gagal = 0; + @endphp + @foreach ($result as $key => $value) + @if (is_array($value)) + @if ($value['status'] != 'lulus') + @php + $html .= '' . $value['message'] . ''; + $gagal++; + @endphp + @else + @php + $html .= '' . $value['message'] . ''; + $lulus++; + @endphp + @endif + @endif + @endforeach + +
+ @if ($html != '') + {{ $lulus }} Lulus + {{ $gagal }} Gagal + @else +
Hasil
+ @endif +
+
+ @if ($data['user']['correct'] == null) + + @elseif ($data['user']['correct'] == 1) + Lulus + @else + + @endif +
+
+
{!! $html !!}
+
+
+
+ {!! $data['question']['question'] !!} +
+
+
+
+
+
+
+ @endisset +@endsection diff --git a/routes/web.php b/routes/web.php index d5aa84b..e86cc86 100644 --- a/routes/web.php +++ b/routes/web.php @@ -75,6 +75,57 @@ Route::group(['middleware' => ['auth', 'admin']], function() { Route::get('/admin/python/proseshapustopik/{id_topik}', [PythonLearningTopicsController::class, 'proses_hapus']); Route::get('/admin/python/proseshapuspercobaan/{id_percobaan}', [PythonPercobaanController::class, 'proses_hapus']); + /* ----------------------------------- SQL ---------------------------------- */ + Route::group(['prefix' => 'admin/sql'], function () { + Route::group(['prefix' => 'pembelajaran'], function () { + Route::get('', 'SQLController@learning')->name('admin sql learning'); + Route::get('/read', 'SQLController@learningRead')->name('admin sql learning read'); + Route::get('/detail/{id}', 'SQLController@learningRead')->name('admin sql learning detail'); + Route::post('/create', 'SQLController@learningStore')->name('admin sql learning create'); + Route::post('/update/{id}', 'SQLController@learningUpdate')->name('admin sql learning update'); + Route::get('/delete/{id}', 'SQLController@learningDelete')->name('admin sql learning delete'); + + Route::group(['prefix' => 'log'], function () { + Route::get('/read', 'SQLController@learningLogRead')->name('admin sql learning log read'); + Route::get('/detail/{id}', 'SQLController@learningLogRead')->name('admin sql learning log detail'); + }); + }); + + Route::group(['prefix' => 'praktek'], function () { + Route::get('', 'SQLController@practice')->name('admin sql practice'); + Route::get('/read', 'SQLController@practiceRead')->name('admin sql practice read'); + Route::get('/detail/{id}', 'SQLController@practiceRead')->name('admin sql practice detail'); + Route::post('/create', 'SQLController@practiceStore')->name('admin sql practice create'); + Route::post('/update/{id}', 'SQLController@practiceUpdate')->name('admin sql practice update'); + Route::get('/delete/{id}', 'SQLController@practiceDelete')->name('admin sql practice delete'); + + Route::get('/log/read', 'SQLController@practiceLogRead')->name('admin sql practice log read'); + }); + + Route::group(['prefix' => 'latihan'], function () { + Route::get('', 'SQLController@exercise')->name('admin sql exercise'); + Route::get('/read', 'SQLController@exerciseRead')->name('admin sql exercise read'); + Route::get('/detail/{id}', 'SQLController@exerciseRead')->name('admin sql exercise detail'); + Route::post('/create', 'SQLController@exerciseStore')->name('admin sql exercise create'); + Route::post('/update/{id}', 'SQLController@exerciseUpdate')->name('admin sql exercise update'); + Route::get('/delete/{id}', 'SQLController@exerciseDelete')->name('admin sql exercise delete'); + + Route::get('/log/read', 'SQLController@exerciseLogRead')->name('admin sql exercise log read'); + }); + + Route::group(['prefix' => 'ujian'], function () { + Route::get('', 'SQLController@exam')->name('admin sql exam'); + Route::get('/read', 'SQLController@examRead')->name('admin sql exam read'); + Route::get('/detail/{id}', 'SQLController@examRead')->name('admin sql exam detail'); + Route::post('/create', 'SQLController@examStore')->name('admin sql exam create'); + Route::post('/update/{id}', 'SQLController@examUpdate')->name('admin sql exam update'); + Route::get('/delete/{id}', 'SQLController@examDelete')->name('admin sql exam delete'); + + Route::get('/log/read', 'SQLController@examLogRead')->name('admin sql exam log read'); + }); + }); + /* ----------------------------------- SQL ---------------------------------- */ + }); @@ -234,6 +285,65 @@ Route::middleware(['auth'])->group(function () { Route::get('download/jguide/{file}/{topic}', 'DownloadController@downJplasGuide')->name('file-download'); Route::get('download/jresult/{file}/{topic}', 'DownloadController@downJplasResult')->name('file-download'); + /* ----------------------------------- SQL ---------------------------------- */ + Route::group(['prefix' => 'student/sql'], function () { + Route::group(['prefix' => 'pembelajaran'], function () { + Route::get('', 'SQLController@learning')->name('student sql learning'); + Route::get('/read', 'SQLController@learningRead')->name('student sql learning read'); + Route::get('/detail/{id}', 'SQLController@learningRead')->name('student sql learning detail'); + Route::post('/create', 'SQLController@learningStore')->name('student sql learning create'); + Route::post('/update/{id}', 'SQLController@learningUpdate')->name('student sql learning update'); + Route::get('/delete/{id}', 'SQLController@learningDelete')->name('student sql learning delete'); + Route::get('/kerjakan/{id}', 'SQLController@learningDo')->name('student sql learning do'); + Route::post('/kerjakan/{id}', 'SQLController@learningDoExec')->name('student sql learning do exec'); + Route::get('/reset', 'SQLController@learningDoReset')->name('student sql learning do reset'); + }); + + Route::group(['prefix' => 'praktek'], function () { + Route::get('', 'SQLController@practice')->name('student sql practice'); + Route::get('/read', 'SQLController@practiceRead')->name('student sql practice read'); + Route::get('/detail/{id}', 'SQLController@practiceRead')->name('student sql practice detail'); + Route::post('/create', 'SQLController@practiceStore')->name('student sql practice create'); + Route::post('/update/{id}', 'SQLController@practiceUpdate')->name('student sql practice update'); + Route::get('/delete/{id}', 'SQLController@practiceDelete')->name('student sql practice delete'); + Route::get('/kerjakan/{id}', 'SQLController@practiceDo')->name('student sql practice do'); + Route::get('/kerjakan/{id}/{question}', 'SQLController@practiceDo')->name('student sql practice do question'); + Route::post('/kerjakan/{id}', 'SQLController@practiceDoExec')->name('student sql practice do exec'); + Route::get('/reset', 'SQLController@practiceDoReset')->name('student sql practice do reset'); + }); + + Route::group(['prefix' => 'latihan'], function () { + Route::get('', 'SQLController@exercise')->name('student sql exercise'); + Route::get('/read', 'SQLController@exerciseRead')->name('student sql exercise read'); + Route::get('/detail/{id}', 'SQLController@exerciseRead')->name('student sql exercise detail'); + Route::post('/create', 'SQLController@exerciseStore')->name('student sql exercise create'); + Route::post('/update/{id}', 'SQLController@exerciseUpdate')->name('student sql exercise update'); + Route::get('/delete/{id}', 'SQLController@exerciseDelete')->name('student sql exercise delete'); + + Route::get('/start', 'SQLController@exerciseStart')->name('student sql exercise start'); + Route::get('/kerjakan/detail/{id}', 'SQLController@exerciseDoDetail')->name('student sql exercise do detail'); + Route::get('/kerjakan/{id}', 'SQLController@exerciseDo')->name('student sql exercise do'); + Route::post('/kerjakan/{id}', 'SQLController@exerciseAnswer')->name('student sql exercise answer'); + Route::get('/complete', 'SQLController@exerciseComplete')->name('student sql exercise complete'); + }); + + Route::group(['prefix' => 'ujian'], function () { + Route::get('', 'SQLController@exam')->name('student sql exam'); + Route::get('/read', 'SQLController@examRead')->name('student sql exam read'); + Route::get('/detail/{id}', 'SQLController@examRead')->name('student sql exam detail'); + Route::post('/create', 'SQLController@examStore')->name('student sql exam create'); + Route::post('/update/{id}', 'SQLController@examUpdate')->name('student sql exam update'); + Route::get('/delete/{id}', 'SQLController@examDelete')->name('student sql exam delete'); + + Route::get('/start', 'SQLController@examStart')->name('student sql exam start'); + Route::get('/kerjakan/detail/{id}', 'SQLController@examDoDetail')->name('student sql exam do detail'); + Route::get('/kerjakan/{id}', 'SQLController@examDo')->name('student sql exam do'); + Route::post('/kerjakan/{id}', 'SQLController@examAnswer')->name('student sql exam answer'); + Route::get('/complete', 'SQLController@examComplete')->name('student sql exam complete'); + }); + }); + /* ----------------------------------- SQL ---------------------------------- */ + });