main
Ilham Wara Nugroho 2025-10-14 10:04:48 +07:00
parent 31a18aaa13
commit d586507bc2
9 changed files with 251 additions and 73 deletions

View File

@ -10,9 +10,33 @@ use App\Models\Master\Kecamatan;
use App\Models\Master\Sekolah;
use App\Models\Penilaian;
use App\Models\Kuesioner;
use App\Models\User;
class AjaxController extends Controller
{
function sendCode(Request $request) {
// $request->validate(['email' => 'required|email']);
if($request->email){
$user = User::where('email', $request->email)->first();
if(@$user){
$user->code_change_password = \Str::random(5);
$user->save();
return response()->json(['status' => true,'code' => true]);
}else{
return response()->json(['status' => false,'message' => 'Email Tidak Valid']);
}
}
}
function checkEmail(Request $request){
$request->validate(['email' => 'required|email']);
$exists = User::where('email', $request->email)->exists();
return response()->json(['exists' => $exists]);
}
public function uploadTemp(Request $request)
{
$request->validate([

View File

@ -13,6 +13,30 @@ use App\Models\Master\Sekolah;
class CustomLoginController extends Controller
{
public function forgotpass()
{
if(Auth::check()){
return redirect('dashboard');
}
return view('auth.passwords.reset');
}
function forgotpass_post(Request $request) {
$user = User::where('email', $request->email)->first();
if(@$user){
}else{
return redirect()
->back()
->withInput()
->with([
'message' => trans('Email anda tidak ditemukan'),
'type' => "error"
]);
}
}
public function index()
{
if(Auth::check()){

View File

@ -18,7 +18,7 @@ class Profile
public function handle(Request $request, Closure $next): Response
{
$user = User::with(['profile'])->where('id',auth()->user()->id)->first();
if(!@$user->profile){
if(!@$user->profile && ($user->ms_group_id == 2)){
return redirect('profile-sekolah/lengkapi/'.encode_id($user->username));
}
return $next($request);

View File

@ -20,12 +20,7 @@ class User extends Authenticatable
*/
// protected $table = 'user';
// protected $primaryKey = 'user_id';
protected $fillable = [
'name',
'username',
'email',
'password',
];
protected $guarded = [];
/**
* The attributes that should be hidden for serialization.

View File

@ -18,6 +18,7 @@ return new class extends Migration
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->string('code_change_password')->nullable();
$table->rememberToken();
$table->timestamps();
});

View File

@ -46,7 +46,7 @@
<img src="{{asset('assets/logo-dinas.ico')}}" width="50">
</div>
<div>
<h5 class="fw-500">Sistem Informasi Adiwiyata</h5>
<h5 class="fw-500">SIDIA Jakarta</h5>
</div>
</div>
<div>
@ -57,14 +57,17 @@
<input type="text" required name="email" class="form-control" placeholder="Masukan Email/NPSN anda">
</div>
<div class="form-group">
<label class="form-label">Password</label>
<label class="form-label">Kata Sandi</label>
<div class="input-group">
<input type="password" required id="password" name="password" class="form-control" placeholder="Masukan Password">
<input type="password" required id="password" name="password" class="form-control" placeholder="Masukan Kata Sandi">
<div class="input-group-append">
<button class="btn btn-default waves-effect waves-themed" type="button" id="togglePassword"><i class="fal fa-eye"></i></button>
</div>
</div>
</div>
<div class="form-group">
<label class="form-label"><a href="{{ url('forgotpass') }}">Lupa Kata Sandi ?</a></label>
</div>
<div class="row no-gutters">
<div class="col-lg-12 pr-lg-1 my-2">
<button type="submit" class="btn btn-primary btn-block">Masuk</button>
@ -78,7 +81,7 @@
</div>
</form>
<p class="text-muted mt-auto text-center mb-0 pt-3" style="font-size:12px;">
{{date('Y')}} © Dinas Lingkungan Hidup DKI Jakarta
{{date('Y')}} © Dinas Lingkungan Hidup Provinsi DKI Jakarta
</p>
</div>
</div>

View File

@ -1,65 +1,190 @@
@extends('layouts.app')
@section('content')
<div class="container">
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>
Lupa Kata Sandi - SIDIA Jakarta
</title>
<meta name="description" content="Login">
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no, minimal-ui">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="msapplication-tap-highlight" content="no">
<link rel="stylesheet" media="screen, print" href="{{asset('assets/css/vendors.bundle.css')}}">
<link rel="stylesheet" media="screen, print" href="{{asset('assets/css/app.bundle.css')}}">
<link rel="apple-touch-icon" sizes="180x180" href="{{asset('assets/logo-dinas.ico')}}">
<link rel="icon" type="image/png" sizes="32x32" href="{{asset('assets/logo-dinas.ico')}}">
<link rel="mask-icon" href="{{asset('assets/logo-dinas.ico')}}" color="#5bbad5">
<link rel="stylesheet" href="{{asset('assets/css/toast.min.css')}}">
<link rel="stylesheet" media="screen, print" href="{{asset('assets/css/fa-brands.css')}}">
<style type="text/css">
.bg-login{
background-image: url("{{('assets/bg-login.png')}}");
background-repeat: no-repeat;
background-size: cover;
}
</style>
</head>
<body class="bg-login">
<div class=" d-flex align-items-center justify-content-center min-vh-100">
<div class="container py-4 py-lg-5 px-4 px-sm-0">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Reset Password') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('password.update') }}">
@csrf
<input type="hidden" name="token" value="{{ $token }}">
<div class="row mb-3">
<label for="email" class="col-md-4 col-form-label text-md-end">{{ __('Email Address') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ $email ?? old('email') }}" required autocomplete="email" autofocus>
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
<div class="col-sm-12 col-md-12 col-lg-5 col-xl-5">
@include('include.alert')
<div class="card rounded-plus bg-faded" style="border:none;">
<div class="row">
<div class="col-md-12 p-4 d-flex mx-auto flex-column justify-content-center align-items-center gap-3">
<!-- <h1 class="text-left mb-3">Login</h1>
<br> -->
<div class="">
<div class="d-flex flex-column gap-3 align-items-center justify-content-center mb-5">
<div>
<img src="{{asset('assets/logo-dinas.ico')}}" width="50">
</div>
<div>
<h5 class="fw-500">SIDIA Jakarta</h5>
</div>
</div>
<div>
<h6 class="mb-3">Lupa Password</h6>
{{-- <form action="#"> --}}
<div class="form-group divEmail">
<label class="form-label">Email</label>
<div class="input-group">
<input type="text" required name="email" class="form-control" placeholder="Masukan Email Anda" id="email">
<div class="input-group-append">
<button class="btn btn-default waves-effect waves-themed" type="button" id="togglePassword"><i class="fal fa-envelope"></i></button>
</div>
</div>
<div class="form-group divKode mb-2 d-none">
<div class="alert alert-info">
Silahkan cek email anda dan masukan kode
</div>
</div>
<div class="form-group divKode d-none">
<label class="form-label">Kode</label>
<input type="text" required name="kode" class="form-control" placeholder="Masukan Kode Anda" id="kode">
</div>
<div class="form-group divPassword d-none">
<label class="form-label">Kata Sandi</label>
<div class="input-group">
<input type="password" required id="password" name="password" class="form-control" placeholder="Masukan Kata Sandi">
<div class="input-group-append">
<button class="btn btn-default waves-effect waves-themed" type="button" id="togglePassword"><i class="fal fa-eye"></i></button>
</div>
</div>
<div id="emailFeedback" class="mt-2 text-sm"></div>
</div>
<div class="row no-gutters">
<div class="col-lg-12 pr-lg-1 my-2">
<button type="submit" disabled class="btn btn-primary btnProses btn-block">Proses&nbsp;<i class="fal fa-sign-in"></i></button>
</div>
</div>
{{-- </form> --}}
<p class="text-muted mt-auto text-center mb-0 pt-3" style="font-size:12px;">
{{date('Y')}} © Dinas Lingkungan Hidup Provinsi DKI Jakarta
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row mb-3">
<label for="password" class="col-md-4 col-form-label text-md-end">{{ __('Password') }}</label>
<script src="{{asset('assets/js/vendors.bundle.js')}}"></script>
<script src="{{asset('assets/js/app.bundle.js')}}"></script>
<script src="{{asset('assets/js/toast.min.js')}}"></script>
<script>
let typingTimer;
$('#email').on('keyup',function(){
clearTimeout(typingTimer);
const email = $(this).val().trim();
if (email.length > 0) {
typingTimer = setTimeout(function () {
checkEmail(email);
}, 800);
} else {
$('#emailFeedback').html('');
}
});
function checkEmail(email) {
let base_url = "{{ url('/') }}";
$.ajax({
url: base_url+'/checkEmail',
method: 'POST',
data: {
email: email,
_token: $('meta[name="csrf-token"]').attr('content')
},
success: function(response) {
if (response.exists) {
$('.btnProses').removeAttr('disabled');
// $('#emailFeedback').html('<span class="text-green-600">Email terdaftar ✔️</span>');
} else {
toastr.error("Email Tidak Ditemukan", 'Error!', {positionClass: 'toast-bottom-right', containerId: 'toast-bottom-right'});
}
},
error: function(response) {
toastr.error('Email Tidak Valid', 'Error!', {positionClass: 'toast-bottom-right', containerId: 'toast-bottom-right'});
}
});
}
$(document).ready(function() {
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
$('#togglePassword').on('click', function() {
let passwordField = $('#password');
let icon = $(this).find('i');
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
// Cek apakah input saat ini bertipe password
if (passwordField.attr('type') === 'password') {
passwordField.attr('type', 'text'); // Ubah ke teks
icon.removeClass('fa-eye').addClass('fa-eye-slash'); // Ganti ikon
} else {
passwordField.attr('type', 'password'); // Ubah ke password
icon.removeClass('fa-eye-slash').addClass('fa-eye'); // Kembalikan ikon
}
});
});
<div class="row mb-3">
<label for="password-confirm" class="col-md-4 col-form-label text-md-end">{{ __('Confirm Password') }}</label>
$('.btnProses').on('click',function(){
let base_url = "{{ url('/') }}";
let email = $('#email').val();
$.ajax({
url: base_url+'/sendCode',
method: 'POST',
data: {
email: email,
_token: $('meta[name="csrf-token"]').attr('content')
},
success: function(response) {
if (response.status == true) {
if(response.code == true){
$('.divKode').removeClass('d-none');
$('.divEmail').addClass('d-none');
}
<div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
</div>
</div>
if(response.password == true){
$('.divPassword').removeClass('d-none');
$('.divKode').addClass('d-none');
$('.divEmail').addClass('d-none');
}
<div class="row mb-0">
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Reset Password') }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
// toastr.success("Berhasil Request Ubah Kata Sandi", 'Error!', {positionClass: 'toast-bottom-right', containerId: 'toast-bottom-right'});
} else {
toastr.error(response.message, 'Error!', {positionClass: 'toast-bottom-right', containerId: 'toast-bottom-right'});
}
},
error: function(response) {
toastr.error('Email Tidak Valid', 'Error!', {positionClass: 'toast-bottom-right', containerId: 'toast-bottom-right'});
}
});
});
</script>
</body>
</html>

View File

@ -68,7 +68,7 @@
<img src="{{asset('assets/logo-dinas.ico')}}" width="50">
</div>
<div>
<h5 class="fw-500">Sistem Informasi Adiwiyata</h5>
<h5 class="fw-500">SIDIA Jakarta</h5>
</div>
</div>
<div>
@ -255,7 +255,7 @@
</div>
</form>
<p class="text-muted mt-auto text-center mb-0 pt-3">
{{date('Y')}} © Dinas Lingkungan Hidup DKI Jakarta
{{date('Y')}} © Dinas Lingkungan Hidup Provinsi DKI Jakarta
</p>
</div>
</div>

View File

@ -20,6 +20,10 @@ use App\Http\Controllers\FrontController;
| be assigned to the "web" middleware group. Make something great!
|
*/
Route::get('forgotpass',[CustomLoginController::class,'forgotpass'])->name('forgotpass');
Route::post('forgotpass',[CustomLoginController::class,'forgotpass_post'])->name('forgotpass_post');
Route::get('login',[CustomLoginController::class,'index'])->name('login');
Route::post('login',[CustomLoginController::class,'post_login'])->name('post_login');
@ -31,6 +35,8 @@ Route::post('get/sekolah',[AjaxController::class,'getSekolah'])->name('getSekola
Route::post('sekolahNpsn',[AjaxController::class,'sekolahNpsn'])->name('sekolahNpsn');
Route::post('uploadTemp', [AjaxController::class, 'uploadTemp'])->name('uploadTemp');
Route::post('uploadTempImage', [AjaxController::class, 'uploadTempImage'])->name('uploadTempImage');
Route::post('checkEmail', [AjaxController::class, 'checkEmail'])->name('checkEmail');
Route::post('sendCode', [AjaxController::class, 'sendCode'])->name('sendCode');
Route::get('hash/{hash}', function ($hash) {
return Hash::make($hash);
});