update
parent
a8102eb14a
commit
faa1e9f72c
|
|
@ -0,0 +1,332 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
use App\Models\Master\Menu;
|
||||
use App\Models\Master\AccessMenu;
|
||||
use App\Models\User;
|
||||
|
||||
if (!function_exists('taskLabel')) {
|
||||
/**
|
||||
* @param $val
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function taskLabel($val)
|
||||
{
|
||||
if ($val == 'store') {
|
||||
$task = 'save';
|
||||
} elseif ($val == 'save_permission') {
|
||||
$task = 'save group access';
|
||||
} elseif ($val == 'destroy') {
|
||||
$task = 'delete';
|
||||
} elseif ($val == 'batch') {
|
||||
$task = 'delete';
|
||||
} else {
|
||||
$task = $val;
|
||||
}
|
||||
|
||||
return $task;
|
||||
}
|
||||
}
|
||||
if (!function_exists('logActivity')) {
|
||||
/**
|
||||
* @param $request
|
||||
* @param $note
|
||||
*/
|
||||
function logActivity($request, $note)
|
||||
{
|
||||
$repository = app(\App\Models\Log::class);
|
||||
$data = [
|
||||
'module' => $request->route()->getAction('prefix'),
|
||||
'task' => taskLabel($request->route()->getActionMethod()),
|
||||
'user_id' => session('uid'),
|
||||
'ipaddress' => $request->getClientIp(),
|
||||
'useragent' => $request->header('User-Agent'),
|
||||
'note' => $note,
|
||||
'created_at' => \Carbon\Carbon::now()
|
||||
];
|
||||
|
||||
if (session('superuser') == false)
|
||||
$repository->create($data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!function_exists('trimId')) {
|
||||
/**
|
||||
* @param $val
|
||||
* @return array
|
||||
*/
|
||||
function trimId($val)
|
||||
{
|
||||
$string = explode('+', $val);
|
||||
return $string;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!function_exists('dateTime')) {
|
||||
/**
|
||||
* make secure id
|
||||
*
|
||||
* @param string|null $val
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function dateTime($date)
|
||||
{
|
||||
return date('d-m-Y H:i:s',strtotime(@$date));
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('encode_id')) {
|
||||
/**
|
||||
* make secure id
|
||||
*
|
||||
* @param string|null $val
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function encode_id(?string $val = ''): string
|
||||
{
|
||||
$params = ['val' => $val];
|
||||
return rtrim(base64_encode(serialize($params)), "=");
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('decode_id')) {
|
||||
/**
|
||||
* @param string|null $val
|
||||
* ${STATIC}
|
||||
*
|
||||
* @return mixed|null
|
||||
* @author alex.gz <amqit.consultant@gmail.com>
|
||||
* @created 02/12/2023 4:28
|
||||
*
|
||||
*/
|
||||
function decode_id(?string $val = ''): mixed
|
||||
{
|
||||
$secure = unserialize(base64_decode($val));
|
||||
return $secure ? $secure['val'] : null;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('permission')) {
|
||||
/**
|
||||
* @param $access
|
||||
* @param $key
|
||||
* @param string $method
|
||||
* @param bool $view
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function permission($access, $key, string $method = 'menu', bool $view = false): mixed
|
||||
{
|
||||
if (@session('group_id') != 1) {
|
||||
if ($method == 'module') {
|
||||
if (is_array($access)) {
|
||||
$model = AccessMenu::where('module', 'LIKE', "{$key}%")->where('ms_group_id', session('group_id'))->first();
|
||||
$query = count(array_intersect((array)$access, (array)$model->access));
|
||||
} else {
|
||||
$query = AccessMenu::where($access, true)->where('module', 'LIKE', $key.'%')->where('ms_group_id', session('group_id'))->count();
|
||||
if ($query > 0) {
|
||||
return true;
|
||||
} else {
|
||||
return abort('401');
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$query = AccessMenu::where($access, true)->where('ms_menu_id', $key)->where('ms_group_id', session('group_id'))->count();
|
||||
}
|
||||
|
||||
if ($query > 0) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('access')) {
|
||||
/**
|
||||
* @param $access
|
||||
* @param $key
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function access($access, $key)
|
||||
{
|
||||
if (session('group_alias') != 'administrator') {
|
||||
$query = AccessMenu::where($access, 1)->where('module', $key)->where('ms_group_id', session('group_id'))->count();
|
||||
if ($query > 0) {
|
||||
return true;
|
||||
} else if (session('group_alias') == 'administrator') {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('activeMenuClass')) {
|
||||
/**
|
||||
* Helper to grab the application version.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function activeMenuClass($route){
|
||||
// dd(request()->route()->getName());
|
||||
// if(request()->route()->getName() == $route){
|
||||
// return true;
|
||||
// }else{
|
||||
// return false;
|
||||
// }
|
||||
|
||||
if (\Str::is($route, request()->route()->getName())) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!function_exists('renderMenu')) {
|
||||
|
||||
/**
|
||||
* Loops through a folder and requires all PHP files
|
||||
* Searches sub-directories as well.
|
||||
*
|
||||
* @param $folder
|
||||
*/
|
||||
function renderMenu()
|
||||
{
|
||||
|
||||
$parent = Menu::where('status',true)->where('menu_type','sidebar')->where('parent_id',0)->orderBy('ordering','ASC')->get();
|
||||
$html = '';
|
||||
foreach ($parent as $a => $p1) {
|
||||
// echo $p1->MsMenuId.'<br>';
|
||||
$child2 = Menu::where('status',true)->where('menu_type','sidebar')->where('parent_id',$p1->MsMenuId)->orderBy('ordering','ASC')->get();
|
||||
$access1 = permission('is_read', $p1->MsMenuId, 'menu', true);
|
||||
|
||||
$ch1 = count($child2) > 0 ? '' : '';
|
||||
$link1 = count($child2) > 0 ? '' : 'nav-link';
|
||||
$collapse1 = count($child2) > 0 ? 'href="#parent'.$a.'" data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="parent'.$a.'"' : '';
|
||||
$active = activeMenuClass($p1->module) ? 'active' : '';
|
||||
// dd($p1->route);
|
||||
|
||||
if ($access1) {
|
||||
$active1 = activeMenuClass($p1->module) ? 'active' : '';
|
||||
|
||||
$html .= '<li class=" nav-item ' . $ch1 . '">
|
||||
<a '.$collapse1.' class=" nav-link '.$active1.'" href="' . url($p1->url) . '">
|
||||
<i class="' . $p1->menu_icons . '"></i>
|
||||
<span>'.@$p1->title.'</span>';
|
||||
if (count($child2) > 0) {
|
||||
$html .= '<span class="menu-arrow"></span>';
|
||||
$html .= '</a>';
|
||||
$html .= '<div class="collapse " id="parent'.$a.'">';
|
||||
$html .= '<ul class="nav flex-column">';
|
||||
foreach ($child2 as $b => $p2) {
|
||||
$child3 = Menu::where('status',true)->where('menu_type','sidebar')->where('parent_id',$p2->MsMenuId)->get();
|
||||
$access2 = permission('is_read', $p2->MsMenuId, 'menu', true);
|
||||
$ch2 = count($child3) > 0 ? '' : '';
|
||||
$collapse2 = count($child3) > 0 ? 'href="#subparent'.$b.'" data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="parent'.$a.'"' : '';
|
||||
$link2 = count($child3) > 0 ? '' : 'nav-link';
|
||||
if ($access2) {
|
||||
$active2 = activeMenuClass($p2->module) ? 'active' : '';
|
||||
$html .= '<li class=" nav-item ' . $ch2 . '"><a '.$collapse2.' class="nav-link '.$active2.'" href="' . url($p2->url) . '"><i class="' . $p2->menu_icons . '"></i> <span>' . @$p2->title.'<span>';
|
||||
if (count($child3) > 0) {
|
||||
$html .= '<span class="menu-arrow"></span>';
|
||||
$html .= '</a>';
|
||||
$html .= '<div class="collapse " id="subparent'.$b.'">';
|
||||
$html .= '<ul class="nav flex-column">';
|
||||
foreach ($child3 as $p3) {
|
||||
$child4 = Menu::where('status',true)->where('menu_type','sidebar')->where('parent_id',$p3->MsMenuId)->get();
|
||||
$access3 = permission('is_read', $p3->MsMenuId, 'menu', true);
|
||||
$collapse3 = count($child4) > 0 ? 'data-fc-type="collapse"' : '';
|
||||
$ch3 = count($child4) > 0 ? '' : '';
|
||||
$link3 = count($child4) > 0 ? '' : 'nav-link';
|
||||
if ($access3) {
|
||||
$active3 = activeMenuClass($p3->module) ? 'active' : '';
|
||||
// $active3 = $active ? ' ' . null : null;
|
||||
$html .= '<li class=" nav-item ' . $ch3 .'"><a '.$collapse3.' class="nav-link '.$active3.'" href="' . url($p3->url) . '"> <span>' . @$p3->title.'</span>';
|
||||
if (count($child4) > 0) {
|
||||
$html .= '<span class="menu-arrow"></span>';
|
||||
$html .= '</a>';
|
||||
$html .= '<ul class="nav flex-column">';
|
||||
foreach ($child4 as $p4) {
|
||||
$html .= '<li class=" ' . null . '"><a class="nav-link" href="' . url($p4->url) . '"> <span>' . @$p4->title.'<span>';
|
||||
}
|
||||
$html .= '</ul>';
|
||||
} else {
|
||||
$html .= '</a>';
|
||||
}
|
||||
$html .= '</li>';
|
||||
}
|
||||
}
|
||||
$html .= '</ul>';
|
||||
$html .= '</div>';
|
||||
} else {
|
||||
$html .= '</a>';
|
||||
}
|
||||
$html .= '</li>';
|
||||
}
|
||||
}
|
||||
$html .= '</ul>';
|
||||
$html .= '</div>';
|
||||
} else {
|
||||
$html .= '</a>';
|
||||
}
|
||||
$html .= '</li>';
|
||||
}
|
||||
}
|
||||
return $html;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('include_route_files')) {
|
||||
/**
|
||||
* Loops through a folder and requires all PHP files
|
||||
* Searches sub-directories as well.
|
||||
*
|
||||
* @param $folder
|
||||
*/
|
||||
function include_route_files($folder)
|
||||
{
|
||||
include_files_in_folder($folder);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('include_files_in_folder')) {
|
||||
/**
|
||||
* Loops through a folder and requires all PHP files
|
||||
* Searches sub-directories as well.
|
||||
*
|
||||
* @param $folder
|
||||
*/
|
||||
function include_files_in_folder($folder)
|
||||
{
|
||||
try {
|
||||
$rdi = new RecursiveDirectoryIterator($folder);
|
||||
$it = new RecursiveIteratorIterator($rdi);
|
||||
|
||||
while ($it->valid()) {
|
||||
if (!$it->isDot() && $it->isFile() && $it->isReadable() && $it->current()->getExtension() === 'php') {
|
||||
require $it->key();
|
||||
}
|
||||
|
||||
$it->next();
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Foundation\Auth\ConfirmsPasswords;
|
||||
|
||||
class ConfirmPasswordController extends Controller
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Confirm Password Controller
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This controller is responsible for handling password confirmations and
|
||||
| uses a simple trait to include the behavior. You're free to explore
|
||||
| this trait and override any functions that require customization.
|
||||
|
|
||||
*/
|
||||
|
||||
use ConfirmsPasswords;
|
||||
|
||||
/**
|
||||
* Where to redirect users when the intended url fails.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = '/home';
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('auth');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,117 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\User;
|
||||
|
||||
class CustomLoginController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if(Auth::check()){
|
||||
return redirect('dashboard');
|
||||
}
|
||||
return view('auth.login');
|
||||
}
|
||||
|
||||
public function forgotpass()
|
||||
{
|
||||
if(Auth::check()){
|
||||
return redirect('dashboard');
|
||||
}
|
||||
return view('auth.forgotpass');
|
||||
}
|
||||
function post_forgotpass(Request $request) {
|
||||
Validator::make($request->all(), [
|
||||
'username' => 'required',
|
||||
'password' => 'required',
|
||||
])->validate();
|
||||
|
||||
$user = User::where('ms_group_id','!=',1)->where('username',$request->username)->first();
|
||||
if(@$user){
|
||||
@$user->password = Hash::make($request->password);
|
||||
@$user->save();
|
||||
|
||||
return redirect('/login')->with([
|
||||
'message' => trans('Kata Sandi Berhasil Diupdate Silahkan Login!'),
|
||||
'type' => "success"
|
||||
]);
|
||||
|
||||
}else{
|
||||
return redirect()->back()
|
||||
->withInput()
|
||||
->with([
|
||||
'message' => trans('Username tidak ditemukan'),
|
||||
'type' => "error"
|
||||
]);
|
||||
}
|
||||
}
|
||||
public function post_login(Request $request)
|
||||
{
|
||||
Validator::make($request->all(), [
|
||||
'username' => 'required',
|
||||
'password' => 'required',
|
||||
])->validate();
|
||||
|
||||
$credentials = array('username' => $request->username, 'password' => $request->password);
|
||||
|
||||
$user = User::where('username', $credentials['username'])->first();
|
||||
// dd($user);
|
||||
if(@$user){
|
||||
if ($user && Hash::check($credentials['password'], $user->password)) {
|
||||
// dd($user->group);
|
||||
Auth::attempt(['username' => $request->username, 'password' => $request->password]);
|
||||
|
||||
$session = [
|
||||
'username' => $user->username,
|
||||
'name' => $user->name,
|
||||
'email' => $user->email,
|
||||
'currYear' => date('Y'),
|
||||
'group_id' => @$user->ms_group_id,
|
||||
'group_alias' => @$user->group->alias,
|
||||
'group_name' => @$user->group->name,
|
||||
];
|
||||
session()->flash('show_modal', true);
|
||||
session($session);
|
||||
|
||||
return redirect('dashboard')->with([
|
||||
'message' => trans('Selamat datang kembali'),
|
||||
'type' => "success"
|
||||
]);
|
||||
|
||||
}else{
|
||||
return redirect('/login')
|
||||
->withInput()
|
||||
->with([
|
||||
'message' => trans('Akun anda tidak ditemukan'),
|
||||
'type' => "error"
|
||||
]);
|
||||
}
|
||||
}else{
|
||||
return redirect('/login')
|
||||
->withInput()
|
||||
->with([
|
||||
'message' => trans('Akun anda tidak ditemukan'),
|
||||
'type' => "error"
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
public function logout()
|
||||
{
|
||||
Auth::logout();
|
||||
return redirect('/login')
|
||||
->withInput()
|
||||
->with([
|
||||
'message' => trans('Berhasil Keluar'),
|
||||
'type' => "success"
|
||||
]);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\User;
|
||||
|
||||
class CustomRegisterController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$data = [];
|
||||
return view('auth.register',$data);
|
||||
}
|
||||
|
||||
public function post_register(Request $request)
|
||||
{
|
||||
|
||||
// dd($request->all());
|
||||
try {
|
||||
Validator::make($request->all(), [
|
||||
'email' => 'required|unique:users|email',
|
||||
'username' => 'required|unique:users,username',
|
||||
'password' => 'required|min:8|max:15|regex:/[a-z]/|regex:/[A-Z]/|regex:/[0-9]/|regex:/[@$!%*#?&]/', //min 8 char, maks 15 char, min 1 symbol, min 1 uppercase, min 1 lowercase, 1 number
|
||||
],[
|
||||
'password.min' => 'password Minimal 8 Karakter',
|
||||
'password.max' => 'password Maksimal 15 Karakter',
|
||||
'password.regex' => 'Format Kata Sandi harus mengandung minimal Huruf Besar, Huruf Kecil, Angka, Spesial Karakter',
|
||||
])->validate();
|
||||
|
||||
$user = new User;
|
||||
$user->email = $request->email;
|
||||
$user->password = Hash::make($request->password);
|
||||
$user->name = $request->name;
|
||||
$user->username = $request->username;
|
||||
$user->ms_group_id = 2;
|
||||
$user->save();
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
return redirect('register')->with([
|
||||
'message' => $e->getMessage(),
|
||||
'type' => "error"
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
|
||||
|
||||
class ForgotPasswordController extends Controller
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Reset Controller
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This controller is responsible for handling password reset emails and
|
||||
| includes a trait which assists in sending these notifications from
|
||||
| your application to your users. Feel free to explore this trait.
|
||||
|
|
||||
*/
|
||||
|
||||
use SendsPasswordResetEmails;
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Foundation\Auth\AuthenticatesUsers;
|
||||
|
||||
class LoginController extends Controller
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Login Controller
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This controller handles authenticating users for the application and
|
||||
| redirecting them to your home screen. The controller uses a trait
|
||||
| to conveniently provide its functionality to your applications.
|
||||
|
|
||||
*/
|
||||
|
||||
use AuthenticatesUsers;
|
||||
|
||||
/**
|
||||
* Where to redirect users after login.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = '/home';
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('guest')->except('logout');
|
||||
$this->middleware('auth')->only('logout');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Auth\RegistersUsers;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
|
||||
class RegisterController extends Controller
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Register Controller
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This controller handles the registration of new users as well as their
|
||||
| validation and creation. By default this controller uses a trait to
|
||||
| provide this functionality without requiring any additional code.
|
||||
|
|
||||
*/
|
||||
|
||||
use RegistersUsers;
|
||||
|
||||
/**
|
||||
* Where to redirect users after registration.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = '/home';
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('guest');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a validator for an incoming registration request.
|
||||
*
|
||||
* @param array $data
|
||||
* @return \Illuminate\Contracts\Validation\Validator
|
||||
*/
|
||||
protected function validator(array $data)
|
||||
{
|
||||
return Validator::make($data, [
|
||||
'name' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
|
||||
'password' => ['required', 'string', 'min:8', 'confirmed'],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new user instance after a valid registration.
|
||||
*
|
||||
* @param array $data
|
||||
* @return \App\Models\User
|
||||
*/
|
||||
protected function create(array $data)
|
||||
{
|
||||
return User::create([
|
||||
'name' => $data['name'],
|
||||
'email' => $data['email'],
|
||||
'password' => Hash::make($data['password']),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Foundation\Auth\ResetsPasswords;
|
||||
|
||||
class ResetPasswordController extends Controller
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Reset Controller
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This controller is responsible for handling password reset requests
|
||||
| and uses a simple trait to include this behavior. You're free to
|
||||
| explore this trait and override any methods you wish to tweak.
|
||||
|
|
||||
*/
|
||||
|
||||
use ResetsPasswords;
|
||||
|
||||
/**
|
||||
* Where to redirect users after resetting their password.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = '/home';
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Foundation\Auth\VerifiesEmails;
|
||||
|
||||
class VerificationController extends Controller
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Email Verification Controller
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This controller is responsible for handling email verification for any
|
||||
| user that recently registered with the application. Emails may also
|
||||
| be re-sent if the user didn't receive the original email message.
|
||||
|
|
||||
*/
|
||||
|
||||
use VerifiesEmails;
|
||||
|
||||
/**
|
||||
* Where to redirect users after verification.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = '/home';
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('auth');
|
||||
$this->middleware('signed')->only('verify');
|
||||
$this->middleware('throttle:6,1')->only('verify', 'resend');
|
||||
}
|
||||
}
|
||||
|
|
@ -2,7 +2,11 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
abstract class Controller
|
||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
|
||||
class Controller extends BaseController
|
||||
{
|
||||
//
|
||||
use AuthorizesRequests, ValidatesRequests;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class HomeController extends Controller
|
||||
{
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('auth');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the application dashboard.
|
||||
*
|
||||
* @return \Illuminate\Contracts\Support\Renderable
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('home');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
|
||||
|
||||
class CustomCsrfMiddleware extends Middleware
|
||||
{
|
||||
/**
|
||||
* URL yang tidak butuh verifikasi CSRF.
|
||||
*
|
||||
* @var array<int, string>
|
||||
*/
|
||||
protected $except = [
|
||||
|
||||
];
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Auth;
|
||||
|
||||
class Session
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
if(!Auth::check()){
|
||||
return redirect('/login')->with([
|
||||
'message' => 'Maaf anda harus login terlebih dahulu',
|
||||
'type' => "error"
|
||||
]);
|
||||
}
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Log extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $table = 'ms_log';
|
||||
protected $primaryKey = 'MsLogId';
|
||||
protected $fillable = ['module', 'task', 'user_id', 'ipaddress', 'useragent', 'note'];
|
||||
protected $guarded = ['created_at', 'updated_at'];
|
||||
|
||||
/**
|
||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||
*/
|
||||
public function user()
|
||||
{
|
||||
return $this->belongsTo('App\Models\User','id','user_id');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models\Master;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class AccessMenu extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
protected $table = 'ms_access_menu';
|
||||
protected $primaryKey = 'MsAccessMenuId';
|
||||
protected $guarded = [];
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models\Master;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Group extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
protected $table = 'ms_group';
|
||||
protected $primaryKey = 'MsGroupId';
|
||||
protected $guarded = [];
|
||||
}
|
||||
|
|
@ -0,0 +1,206 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models\Master;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Menu extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
protected $table = 'ms_menu';
|
||||
protected $primaryKey = 'MsMenuId';
|
||||
protected $guarded = [];
|
||||
|
||||
public function submenu()
|
||||
{
|
||||
return $this->hasMany(Menu::class,'parent_id','id');
|
||||
}
|
||||
|
||||
public static function coreMenus($type, array $status = [1]): mixed
|
||||
{
|
||||
return Menu::where('parent_id', '=', 0)
|
||||
->where('menu_type', '=', $type)
|
||||
->whereIn('status', $status);
|
||||
}
|
||||
|
||||
public static function coreMenusByParent($id, array $status = [1]): mixed
|
||||
{
|
||||
return Menu::where('parent_id', '=', $id)
|
||||
->whereIn('status', $status);
|
||||
}
|
||||
|
||||
public static function getMenuByParentPosition($id, $type, array $active = [1], int $year = null): mixed
|
||||
{
|
||||
if ($year) {
|
||||
$currYear = $year;
|
||||
} else {
|
||||
$currYear = date('Y');
|
||||
}
|
||||
|
||||
return Menu::where('parent_id', '=', $id)
|
||||
->where('menu_type', '=', $type)
|
||||
->whereIn('status', $active)
|
||||
->union(Menu::coreMenus($type, $active))
|
||||
->orderBy('ordering')
|
||||
->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* @author alex.gz <amqit.consultant@gmail.com>
|
||||
* @created 08/12/2023 12:53
|
||||
*
|
||||
* @param $type
|
||||
* @param int|null $year
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getParentByType($type, int $year = null): mixed
|
||||
{
|
||||
if ($year) {
|
||||
$currYear = $year;
|
||||
} else {
|
||||
$currYear = date('Y');
|
||||
}
|
||||
|
||||
return Menu::where('parent_id', '=', 0)
|
||||
->where('menu_type', '=', $type)
|
||||
->union(Menu::coreMenus($type))
|
||||
->orderBy('ordering')
|
||||
->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* @author alex.gz <amqit.consultant@gmail.com>
|
||||
* @created 08/12/2023 18:07
|
||||
*
|
||||
* @param $type
|
||||
* @param int|null $year
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getMenuByYear($type, int $year = null): mixed
|
||||
{
|
||||
if ($year) {
|
||||
$currYear = $year;
|
||||
} else {
|
||||
$currYear = date('Y');
|
||||
}
|
||||
|
||||
return Menu::where('parent_id', '=', 0)
|
||||
->where('menu_type', '=', $type)
|
||||
->where('status', '=', true)
|
||||
->orderBy('ordering')
|
||||
->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* @author alex.gz <amqit.consultant@gmail.com>
|
||||
* @created 08/12/2023 12:54
|
||||
*
|
||||
* @param $type
|
||||
* @param int|null $year
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getParentByTypeStatus($type, int $year = null): mixed
|
||||
{
|
||||
if ($year) {
|
||||
$currYear = $year;
|
||||
} else {
|
||||
$currYear = date('Y');
|
||||
}
|
||||
|
||||
return Menu::where('parent_id', '=', 0)
|
||||
->where('menu_type', '=', $type)
|
||||
->where('status', '=', true)
|
||||
->union(Menu::coreMenus($type))
|
||||
->orderBy('ordering')
|
||||
->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* @author alex.gz <amqit.consultant@gmail.com>
|
||||
* @created 08/12/2023 12:54
|
||||
*
|
||||
* @param $id
|
||||
* @param array $active
|
||||
* @param int|null $year
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getMenuByParent($id, array $active = [1], int $year = null): mixed
|
||||
{
|
||||
if ($year) {
|
||||
$currYear = $year;
|
||||
} else {
|
||||
$currYear = date('Y');
|
||||
}
|
||||
|
||||
return Menu::where('parent_id', '=', $id)
|
||||
->union(Menu::coreMenusByParent($id, $active))
|
||||
->whereIn('status', $active)
|
||||
->orderBy('ordering')
|
||||
->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* @author alex.gz <amqit.consultant@gmail.com>
|
||||
* @created 08/12/2023 14:54
|
||||
*
|
||||
* @param int $year
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function countMenuByYear(int $year): mixed
|
||||
{
|
||||
$model = Menu::where('status', '=', true);
|
||||
return $model->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* @author alex.gz <amqit.consultant@gmail.com>
|
||||
* @created 08/12/2023 12:55
|
||||
*
|
||||
* @param $id
|
||||
* @param int|null $year
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getActiveById($id, int $year = null): mixed
|
||||
{
|
||||
if ($year) {
|
||||
$currYear = $year;
|
||||
} else {
|
||||
$currYear = date('Y');
|
||||
}
|
||||
|
||||
return Menu::where('id', '=', $id)
|
||||
->where('status', '=', true)
|
||||
->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* @author alex.gz <amqit.consultant@gmail.com>
|
||||
* @created 08/12/2023 12:55
|
||||
*
|
||||
* @param $type
|
||||
* @param int|null $year
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getActiveByPosition($type, int $year = null): mixed
|
||||
{
|
||||
if ($year) {
|
||||
$currYear = $year;
|
||||
} else {
|
||||
$currYear = date('Y');
|
||||
}
|
||||
|
||||
return Menu::where('menu_type', '=', $type)
|
||||
->where('status', '=', true)
|
||||
->union(Menu::coreMenus($type))
|
||||
->orderBy('ordering')
|
||||
->get();
|
||||
}
|
||||
}
|
||||
|
|
@ -45,4 +45,14 @@ class User extends Authenticatable
|
|||
'password' => 'hashed',
|
||||
];
|
||||
}
|
||||
|
||||
public function group()
|
||||
{
|
||||
return $this->belongsTo(\App\Models\Master\Group::class,'ms_group_id','MsGroupId');
|
||||
}
|
||||
|
||||
public function instansi()
|
||||
{
|
||||
return $this->belongsTo(\App\Models\InstansiUser::class,'id','user_id');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,8 @@
|
|||
"require": {
|
||||
"php": "^8.2",
|
||||
"laravel/framework": "^11.31",
|
||||
"laravel/tinker": "^2.9"
|
||||
"laravel/tinker": "^2.9",
|
||||
"laravel/ui": "^4.6"
|
||||
},
|
||||
"require-dev": {
|
||||
"fakerphp/faker": "^1.23",
|
||||
|
|
@ -29,7 +30,10 @@
|
|||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Tests\\": "tests/"
|
||||
}
|
||||
},
|
||||
"files": [
|
||||
"app/Helpers/custom.php"
|
||||
]
|
||||
},
|
||||
"scripts": {
|
||||
"post-autoload-dump": [
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "626b9e7ddd47fb7eff9aaa53cce0c9ad",
|
||||
"content-hash": "a7159c5237c3c2e75dbd1d23c85e732c",
|
||||
"packages": [
|
||||
{
|
||||
"name": "brick/math",
|
||||
|
|
@ -1453,6 +1453,69 @@
|
|||
},
|
||||
"time": "2025-01-27T14:24:01+00:00"
|
||||
},
|
||||
{
|
||||
"name": "laravel/ui",
|
||||
"version": "v4.6.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/laravel/ui.git",
|
||||
"reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/laravel/ui/zipball/7d6ffa38d79f19c9b3e70a751a9af845e8f41d88",
|
||||
"reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"illuminate/console": "^9.21|^10.0|^11.0|^12.0",
|
||||
"illuminate/filesystem": "^9.21|^10.0|^11.0|^12.0",
|
||||
"illuminate/support": "^9.21|^10.0|^11.0|^12.0",
|
||||
"illuminate/validation": "^9.21|^10.0|^11.0|^12.0",
|
||||
"php": "^8.0",
|
||||
"symfony/console": "^6.0|^7.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"orchestra/testbench": "^7.35|^8.15|^9.0|^10.0",
|
||||
"phpunit/phpunit": "^9.3|^10.4|^11.5"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"providers": [
|
||||
"Laravel\\Ui\\UiServiceProvider"
|
||||
]
|
||||
},
|
||||
"branch-alias": {
|
||||
"dev-master": "4.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Laravel\\Ui\\": "src/",
|
||||
"Illuminate\\Foundation\\Auth\\": "auth-backend/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Taylor Otwell",
|
||||
"email": "taylor@laravel.com"
|
||||
}
|
||||
],
|
||||
"description": "Laravel UI utilities and presets.",
|
||||
"keywords": [
|
||||
"laravel",
|
||||
"ui"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/laravel/ui/tree/v4.6.1"
|
||||
},
|
||||
"time": "2025-01-28T15:15:29+00:00"
|
||||
},
|
||||
{
|
||||
"name": "league/commonmark",
|
||||
"version": "2.7.1",
|
||||
|
|
|
|||
|
|
@ -14,7 +14,9 @@ return new class extends Migration
|
|||
Schema::create('users', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('name');
|
||||
$table->integer('ms_group_id');
|
||||
$table->string('email')->unique();
|
||||
$table->string('username')->unique();
|
||||
$table->timestamp('email_verified_at')->nullable();
|
||||
$table->string('password');
|
||||
$table->rememberToken();
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('ms_menu', function (Blueprint $table) {
|
||||
$table->id('MsMenuId');
|
||||
$table->foreignId('parent_id')->index()->default(0)->comment('idx menu_id');
|
||||
$table->string('title', 150);
|
||||
$table->string('module', 150)->nullable();
|
||||
$table->string('url', 150)->nullable();
|
||||
$table->string('menu_type', 50)->index()->nullable()->comment('tb_menu_group alias');
|
||||
$table->string('menu_icons', 50)->nullable();
|
||||
$table->tinyInteger('ordering')->default(0);
|
||||
$table->boolean('status')->default(true)->comment('True/False');
|
||||
$table->foreignId('created_by')->default(0);
|
||||
$table->foreignId('updated_by')->default(0)->nullable();
|
||||
$table->timestamps();
|
||||
$table->comment('Master menu aplikasi');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('menus');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('ms_group', function (Blueprint $table) {
|
||||
$table->id('MsGroupId');
|
||||
$table->string('name', 50)->unique();
|
||||
$table->string('alias', 50)->unique();
|
||||
$table->boolean('status')->default(true)->comment('True/False');
|
||||
$table->foreignId('created_by')->default(0);
|
||||
$table->foreignId('updated_by')->default(0)->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('groups');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('ms_access_menu', function (Blueprint $table) {
|
||||
$table->id('MsAccessMenuId');
|
||||
$table->foreignId('ms_group_id')->comment('FK ms group');
|
||||
$table->string('module', 150)->nullable();
|
||||
$table->foreignId('ms_menu_id')->comment('FK tb_menu');
|
||||
$table->string('menu_group', 20)->nullable()->default('adminsidebar');
|
||||
$table->boolean('is_create')->default(false);
|
||||
$table->boolean('is_read')->default(false);
|
||||
$table->boolean('is_update')->default(false);
|
||||
$table->boolean('is_delete')->default(false);
|
||||
$table->boolean('is_verify')->default(false);
|
||||
$table->boolean('is_approve')->default(false);
|
||||
$table->boolean('is_download')->default(false);
|
||||
$table->json('access')->nullable();
|
||||
$table->timestamps();
|
||||
$table->foreign('ms_menu_id')->references('MsMenuId')->on('ms_menu')->cascadeOnDelete();
|
||||
$table->foreign('ms_group_id')->references('MsGroupId')->on('ms_group')->cascadeOnDelete();
|
||||
$table->comment('Master hak akses role/group user');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('access_menus');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->foreign('ms_group_id')->references('MsGroupId')->on('ms_group')->cascadeOnDelete();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
//
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('ms_log', function (Blueprint $table) {
|
||||
$table->bigIncrements('MsLogId');
|
||||
$table->string('module',200)->nullable();
|
||||
$table->string('task',100)->nullable();
|
||||
$table->unsignedBigInteger('user_id')->index()->nullable();
|
||||
$table->ipAddress('ipaddress')->nullable();
|
||||
$table->mediumText('useragent')->nullable();
|
||||
$table->mediumText('note')->nullable();
|
||||
$table->timestamps();
|
||||
|
||||
$table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('ms_log');
|
||||
}
|
||||
};
|
||||
|
|
@ -6,11 +6,14 @@
|
|||
"dev": "vite"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@popperjs/core": "^2.11.6",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"axios": "^1.7.4",
|
||||
"bootstrap": "^5.2.3",
|
||||
"concurrently": "^9.0.1",
|
||||
"laravel-vite-plugin": "^1.2.0",
|
||||
"postcss": "^8.4.47",
|
||||
"sass": "^1.56.1",
|
||||
"tailwindcss": "^3.4.13",
|
||||
"vite": "^6.0.11"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,34 @@
|
|||
import 'bootstrap';
|
||||
|
||||
/**
|
||||
* We'll load the axios HTTP library which allows us to easily issue requests
|
||||
* to our Laravel back-end. This library automatically handles sending the
|
||||
* CSRF token as a header based on the value of the "XSRF" token cookie.
|
||||
*/
|
||||
|
||||
import axios from 'axios';
|
||||
window.axios = axios;
|
||||
|
||||
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
|
||||
|
||||
/**
|
||||
* Echo exposes an expressive API for subscribing to channels and listening
|
||||
* for events that are broadcast by Laravel. Echo and event broadcasting
|
||||
* allows your team to easily build robust real-time web applications.
|
||||
*/
|
||||
|
||||
// import Echo from 'laravel-echo';
|
||||
|
||||
// import Pusher from 'pusher-js';
|
||||
// window.Pusher = Pusher;
|
||||
|
||||
// window.Echo = new Echo({
|
||||
// broadcaster: 'pusher',
|
||||
// key: import.meta.env.VITE_PUSHER_APP_KEY,
|
||||
// cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1',
|
||||
// wsHost: import.meta.env.VITE_PUSHER_HOST ?? `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`,
|
||||
// wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80,
|
||||
// wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443,
|
||||
// forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https',
|
||||
// enabledTransports: ['ws', 'wss'],
|
||||
// });
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
// Body
|
||||
$body-bg: #f8fafc;
|
||||
|
||||
// Typography
|
||||
$font-family-sans-serif: 'Nunito', sans-serif;
|
||||
$font-size-base: 0.9rem;
|
||||
$line-height-base: 1.6;
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
// Fonts
|
||||
@import url('https://fonts.bunny.net/css?family=Nunito');
|
||||
|
||||
// Variables
|
||||
@import 'variables';
|
||||
|
||||
// Bootstrap
|
||||
@import 'bootstrap/scss/bootstrap';
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8">
|
||||
<div class="card">
|
||||
<div class="card-header">{{ __('Login') }}</div>
|
||||
|
||||
<div class="card-body">
|
||||
<form method="POST" action="{{ route('login') }}">
|
||||
@csrf
|
||||
|
||||
<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="{{ old('email') }}" required autocomplete="email" autofocus>
|
||||
|
||||
@error('email')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<label for="password" class="col-md-4 col-form-label text-md-end">{{ __('Password') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">
|
||||
|
||||
@error('password')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6 offset-md-4">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>
|
||||
|
||||
<label class="form-check-label" for="remember">
|
||||
{{ __('Remember Me') }}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-0">
|
||||
<div class="col-md-8 offset-md-4">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{{ __('Login') }}
|
||||
</button>
|
||||
|
||||
@if (Route::has('password.request'))
|
||||
<a class="btn btn-link" href="{{ route('password.request') }}">
|
||||
{{ __('Forgot Your Password?') }}
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8">
|
||||
<div class="card">
|
||||
<div class="card-header">{{ __('Confirm Password') }}</div>
|
||||
|
||||
<div class="card-body">
|
||||
{{ __('Please confirm your password before continuing.') }}
|
||||
|
||||
<form method="POST" action="{{ route('password.confirm') }}">
|
||||
@csrf
|
||||
|
||||
<div class="row mb-3">
|
||||
<label for="password" class="col-md-4 col-form-label text-md-end">{{ __('Password') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">
|
||||
|
||||
@error('password')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-0">
|
||||
<div class="col-md-8 offset-md-4">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{{ __('Confirm Password') }}
|
||||
</button>
|
||||
|
||||
@if (Route::has('password.request'))
|
||||
<a class="btn btn-link" href="{{ route('password.request') }}">
|
||||
{{ __('Forgot Your Password?') }}
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<div class="container">
|
||||
<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">
|
||||
@if (session('status'))
|
||||
<div class="alert alert-success" role="alert">
|
||||
{{ session('status') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<form method="POST" action="{{ route('password.email') }}">
|
||||
@csrf
|
||||
|
||||
<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="{{ old('email') }}" required autocomplete="email" autofocus>
|
||||
|
||||
@error('email')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-0">
|
||||
<div class="col-md-6 offset-md-4">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{{ __('Send Password Reset Link') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<div class="container">
|
||||
<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>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<label for="password" class="col-md-4 col-form-label text-md-end">{{ __('Password') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
|
||||
|
||||
@error('password')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<label for="password-confirm" class="col-md-4 col-form-label text-md-end">{{ __('Confirm Password') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<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
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8">
|
||||
<div class="card">
|
||||
<div class="card-header">{{ __('Register') }}</div>
|
||||
|
||||
<div class="card-body">
|
||||
<form method="POST" action="{{ route('register') }}">
|
||||
@csrf
|
||||
|
||||
<div class="row mb-3">
|
||||
<label for="name" class="col-md-4 col-form-label text-md-end">{{ __('Name') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>
|
||||
|
||||
@error('name')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<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="{{ old('email') }}" required autocomplete="email">
|
||||
|
||||
@error('email')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<label for="password" class="col-md-4 col-form-label text-md-end">{{ __('Password') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
|
||||
|
||||
@error('password')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<label for="password-confirm" class="col-md-4 col-form-label text-md-end">{{ __('Confirm Password') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-0">
|
||||
<div class="col-md-6 offset-md-4">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{{ __('Register') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8">
|
||||
<div class="card">
|
||||
<div class="card-header">{{ __('Verify Your Email Address') }}</div>
|
||||
|
||||
<div class="card-body">
|
||||
@if (session('resent'))
|
||||
<div class="alert alert-success" role="alert">
|
||||
{{ __('A fresh verification link has been sent to your email address.') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{ __('Before proceeding, please check your email for a verification link.') }}
|
||||
{{ __('If you did not receive the email') }},
|
||||
<form class="d-inline" method="POST" action="{{ route('verification.resend') }}">
|
||||
@csrf
|
||||
<button type="submit" class="btn btn-link p-0 m-0 align-baseline">{{ __('click here to request another') }}</button>.
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8">
|
||||
<div class="card">
|
||||
<div class="card-header">{{ __('Dashboard') }}</div>
|
||||
|
||||
<div class="card-body">
|
||||
@if (session('status'))
|
||||
<div class="alert alert-success" role="alert">
|
||||
{{ session('status') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{ __('You are logged in!') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
<!doctype html>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<!-- CSRF Token -->
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
|
||||
<title>{{ config('app.name', 'Laravel') }}</title>
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="dns-prefetch" href="//fonts.bunny.net">
|
||||
<link href="https://fonts.bunny.net/css?family=Nunito" rel="stylesheet">
|
||||
|
||||
<!-- Scripts -->
|
||||
@vite(['resources/sass/app.scss', 'resources/js/app.js'])
|
||||
</head>
|
||||
<body>
|
||||
<div id="app">
|
||||
<nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="{{ url('/') }}">
|
||||
{{ config('app.name', 'Laravel') }}
|
||||
</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||
<!-- Left Side Of Navbar -->
|
||||
<ul class="navbar-nav me-auto">
|
||||
|
||||
</ul>
|
||||
|
||||
<!-- Right Side Of Navbar -->
|
||||
<ul class="navbar-nav ms-auto">
|
||||
<!-- Authentication Links -->
|
||||
@guest
|
||||
@if (Route::has('login'))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if (Route::has('register'))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
|
||||
</li>
|
||||
@endif
|
||||
@else
|
||||
<li class="nav-item dropdown">
|
||||
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
|
||||
{{ Auth::user()->name }}
|
||||
</a>
|
||||
|
||||
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
|
||||
<a class="dropdown-item" href="{{ route('logout') }}"
|
||||
onclick="event.preventDefault();
|
||||
document.getElementById('logout-form').submit();">
|
||||
{{ __('Logout') }}
|
||||
</a>
|
||||
|
||||
<form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
|
||||
@csrf
|
||||
</form>
|
||||
</div>
|
||||
</li>
|
||||
@endguest
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="py-4">
|
||||
@yield('content')
|
||||
</main>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
|
@ -1,7 +1,21 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use App\Http\Middleware\Session;
|
||||
use App\Http\Controllers\Auth\CustomLoginController;
|
||||
use App\Http\Controllers\Auth\CustomRegisterController;
|
||||
|
||||
Route::get('/', function () {
|
||||
return view('welcome');
|
||||
});
|
||||
|
||||
Auth::routes();
|
||||
|
||||
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
|
||||
|
||||
Route::middleware(Session::class)->name('modules.')->group(function () {
|
||||
|
||||
include_route_files(__DIR__ . '/modules');
|
||||
|
||||
Route::get('logout',[CustomLoginController::class,'logout'])->name('logout');
|
||||
});
|
||||
|
|
@ -4,7 +4,10 @@ import laravel from 'laravel-vite-plugin';
|
|||
export default defineConfig({
|
||||
plugins: [
|
||||
laravel({
|
||||
input: ['resources/css/app.css', 'resources/js/app.js'],
|
||||
input: [
|
||||
'resources/sass/app.scss',
|
||||
'resources/js/app.js',
|
||||
],
|
||||
refresh: true,
|
||||
}),
|
||||
],
|
||||
|
|
|
|||
Loading…
Reference in New Issue