This commit is contained in:
imadhigp 2026-07-09 17:04:06 +05:30
parent 5568997226
commit 3350b90866
9 changed files with 455 additions and 62 deletions

View File

@ -0,0 +1,44 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Models\StudentPortalLog ;
use Illuminate\Support\Facades\Hash;
class StudentPortalController extends Controller
{
public function studentlogin(Request $request)
{
$request->validate([
'username' => 'required',
'password' => 'required',
'pin' => 'required|numeric',
]);
$student = DB::table('student_portal_logs')
->where('email', $request->username)
->first();
// 1. Hash::check පාවිච්චි කරලා password එක check කරන්න
if ($student && Hash::check($request->password, $student->password) && $student->pin == $request->pin) {
// 2. Status එක active හෝ හිස් ("") වුණොත් ඇතුලට යන්න දෙන්න
if ($student->status !== 'active' && $student->status !== '') {
return redirect('/')->with('error', 'Your account is inactive!');
}
// Session එකට ID එක දානවා
$request->session()->put('student_id', $student->studentid);
// කෙලින්ම Student Portal එකට redirect කරනවා
return redirect()->route('student.portal')->with('success', 'Logged in successfully!');
}
// දත්ත වැරදියි නම් හෝම් පේජ් එකට යවනවා
return redirect('/')->with('error', 'Invalid Email, Password, or PIN!');
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class StudentPortalLog extends Model
{
protected $table = 'student_portal_logs';
protected $fillable = [
'email',
'studentid',
'password',
'pin',
'status',
];
protected $hidden = [
'password',
'pin',
];
}

View File

@ -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('student_portal_logs', function (Blueprint $table) {
$table->id();
$table->string('email');
$table->string('studentid');
$table->string('password');
$table->integer('pin');
$table->string('status');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('student_portal_logs');
}
};

View File

@ -0,0 +1,283 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Student Services - LMS Dashboard</title>
<!-- Google Fonts (Segoe UI style clean font එකක් සඳහා) -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<!-- FontAwesome Icons (Card ඇතුලේ තියෙන icons සඳහා) -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
<style>
:root{
--primary:#5E244E;
--secondary:#8B3A74;
--light:#f8f4f7;
}
.hero{
background:linear-gradient(rgba(0,0,0,.65),rgba(0,0,0,.65)),
url('https://images.pexels.com/photos/3802510/pexels-photo-3802510.jpeg');
background-size:cover;
background-position:center;
color:#fff;
padding:80px 0;
text-align:center;
}
.portal-card{
border:none;
border-radius:15px;
transition:.3s;
box-shadow:0 5px 20px rgba(0,0,0,.08);
}
.portal-card:hover{
transform:translateY(-8px);
}
.portal-icon{
width:70px;
height:70px;
background:#5E244E;
color:#fff;
border-radius:50%;
display:flex;
align-items:center;
justify-content:center;
font-size:28px;
margin:auto;
}
.btn-portal{
background:#5E244E;
color:#fff;
padding:10px 30px;
border: none;
transition: 0.2s ease;
}
.btn-portal:hover{
background:#8B3A74;
color:#fff;
}
.modal-content {
border: none;
border-radius: 16px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
}
.modal-header {
background: transparent;
border-bottom: none;
padding: 25px 25px 10px;
}
.modal-title {
color: var(--primary);
font-weight: 700;
font-size: 1.35rem;
}
.modal-body {
padding: 10px 25px 20px;
}
.input-group-text {
background-color: #f8fafc;
border-color: #cbd5e1;
color: #64748b;
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
}
.form-label {
color: #475569;
font-weight: 500;
font-size: 0.9rem;
}
.form-control {
border: 1px solid #cbd5e1;
padding: 0.65rem 0.75rem;
font-size: 0.95rem;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
transition: all 0.2s ease;
}
.form-control:focus {
border-color: var(--secondary);
box-shadow: 0 0 0 4px rgba(139, 58, 116, 0.12);
outline: 0;
}
.input-group:focus-within .input-group-text {
border-color: var(--secondary);
color: var(--secondary);
}
.modal-footer {
background: transparent;
border-top: none;
padding: 0 25px 30px;
}
.btn-modal-cancel {
background: transparent;
border: 1.5px solid #cbd5e1;
color: #64748b;
font-weight: 600;
padding: 10px 0;
transition: all 0.2s;
width: 100%;
}
.btn-modal-cancel:hover {
background: #f1f5f9;
color: #334155;
border-color: #94a3b8;
}
.btn-modal-login {
background: var(--primary);
color: #fff;
border: none;
font-weight: 600;
padding: 10px 0;
box-shadow: 0 4px 12px rgba(94, 36, 78, 0.2);
transition: all 0.2s;
width: 100%;
}
.btn-modal-login:hover {
background: var(--secondary);
color: #fff;
transform: translateY(-1px);
box-shadow: 0 6px 15px rgba(94, 36, 78, 0.3);
}
</style>
<section class="hero">
<div class="container">
<h1 class="fw-bold">Student Portal</h1>
<p class="mt-3">
Access your courses, timetable, assignments, examination results,
payments and profile from one place.
</p>
<button onclick="studentlogin()" class="btn btn-portal mt-3">
Student Login
</button>
</div>
</section>
<section class="py-5">
<div class="container">
<div class="text-center mb-5">
<h2>Student Services</h2>
<p class="text-muted">
Everything you need during your academic journey.
</p>
</div>
<div class="row g-4">
<div class="col-md-4">
<div class="card portal-card h-100 text-center p-4">
<div class="portal-icon">
<i class="fa-solid fa-book"></i>
</div>
<h4 class="mt-4">My Courses</h4>
<p class="text-muted">View enrolled courses and learning materials.</p>
</div>
</div>
<div class="col-md-4">
<div class="card portal-card h-100 text-center p-4">
<div class="portal-icon">
<i class="fa-solid fa-calendar-days"></i>
</div>
<h4 class="mt-4">Class Timetable</h4>
<p class="text-muted">Check your weekly lecture schedule.</p>
</div>
</div>
<div class="col-md-4">
<div class="card portal-card h-100 text-center p-4">
<div class="portal-icon">
<i class="fa-solid fa-file-lines"></i>
</div>
<h4 class="mt-4">Assignments</h4>
<p class="text-muted">Submit assignments and download resources.</p>
</div>
</div>
<div class="col-md-4">
<div class="card portal-card h-100 text-center p-4">
<div class="portal-icon">
<i class="fa-solid fa-square-poll-vertical"></i>
</div>
<h4 class="mt-4">Exam Results</h4>
<p class="text-muted">View semester and final examination results.</p>
</div>
</div>
<div class="col-md-4">
<div class="card portal-card h-100 text-center p-4">
<div class="portal-icon">
<i class="fa-solid fa-credit-card"></i>
</div>
<h4 class="mt-4">Fee Payments</h4>
<p class="text-muted">Pay course fees and download payment receipts.</p>
</div>
</div>
<div class="col-md-4">
<div class="card portal-card h-100 text-center p-4">
<div class="portal-icon">
<i class="fa-solid fa-user"></i>
</div>
<h4 class="mt-4">Student Profile</h4>
<p class="text-muted">Update your personal information securely.</p>
</div>
</div>
</div>
</div>
</section>
<section class="py-5 bg-light">
<div class="container">
<div class="text-center mb-5">
<h2>Quick Links</h2>
</div>
<div class="row text-center">
<div class="col-md-3 mb-3">
<a href="#" class="btn btn-outline-dark w-100">Academic Calendar</a>
</div>
<div class="col-md-3 mb-3">
<a href="#" class="btn btn-outline-dark w-100">Student Handbook</a>
</div>
<div class="col-md-3 mb-3">
<a href="#" class="btn btn-outline-dark w-100">Examination Notices</a>
</div>
<div class="col-md-3 mb-3">
<a href="#" class="btn btn-outline-dark w-100">Contact Support</a>
</div>
</div>
</div>
</section>
</body>
</html>

View File

@ -71,7 +71,6 @@
background: var(--secondary);
}
/* --- Udemy Style Course Card --- */
.course-card {
border: 1px solid var(--card-border);
border-radius: 20px;
@ -79,6 +78,7 @@
background: #fff;
transition: transform 0.3s ease, box-shadow 0.3s ease;
box-shadow: none;
scale: .99;
}
.course-card:hover {
@ -87,18 +87,18 @@
}
.course-image-wrapper {
padding: 16px 16px 0 16px;
padding: 16px;
}
.course-card img {
height: 190px;
height: 200px;
width: 100%;
object-fit: cover;
border-radius: 14px;
}
.course-card .card-body {
padding: 20px 24px 24px 24px;
padding: 24px;
display: flex;
flex-direction: column;
}
@ -108,29 +108,19 @@
font-weight: 700;
line-height: 1.3;
color: #1c1d1f;
margin-bottom: 6px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
height: 55px;
margin-bottom: 8px;
}
.course-author {
font-size: 14px;
color: var(--text-muted);
margin-bottom: 8px;
margin-bottom: 12px;
}
.course-short-desc {
font-size: 14px;
color: #4f5357;
margin-bottom: 12px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
height: 42px;
margin-bottom: 16px;
line-height: 1.5;
}
@ -171,7 +161,7 @@
gap: 15px;
font-size: 13px;
color: var(--success-green);
margin-bottom: 18px;
margin-bottom: 20px;
font-weight: 500;
}
@ -369,11 +359,17 @@ $courses=[
<div class="row g-4" id="courseContainer">
@foreach($courses as $course)
<div class="col-lg-4 col-md-6 course-item">
<div class="col-12 course-item">
<div class="card course-card h-100">
<div class="row g-0 align-items-center">
<div class="col-md-4">
<div class="course-image-wrapper">
<img src="{{ $course['image'] }}" alt="{{ $course['title'] }}">
</div>
</div>
<div class="col-md-8">
<div class="card-body">
<h4 class="course-title">{{ $course['title'] }}</h4>
<div class="course-author">{{ $course['author'] }}</div>
@ -393,11 +389,14 @@ $courses=[
<span><i class="fas fa-certificate"></i> Verified ({{ $course['duration'] }})</span>
</div>
<div class="course-footer">
<a href="/apply" class="read-btn">View & Apply Course</a>
<div class="course-footer" style="max-width: 200px;">
<a href="/apply" class="read-btn">Apply Course</a>
</div>
</div>
</div>
</div>
</div>
</div>
@endforeach
</div>
@ -412,7 +411,6 @@ $courses=[
<h2>Why Study With Us?</h2>
<div class="row g-4">
<!-- Feature 1 -->
<div class="col-xl-3 col-md-6">
<div class="feature-box">
<div class="feature-icon-wrapper">
@ -423,7 +421,6 @@ $courses=[
</div>
</div>
<!-- Feature 2 -->
<div class="col-xl-3 col-md-6">
<div class="feature-box">
<div class="feature-icon-wrapper">
@ -434,7 +431,6 @@ $courses=[
</div>
</div>
<!-- Feature 3 -->
<div class="col-xl-3 col-md-6">
<div class="feature-box">
<div class="feature-icon-wrapper">
@ -445,7 +441,6 @@ $courses=[
</div>
</div>
<!-- Feature 4 -->
<div class="col-xl-3 col-md-6">
<div class="feature-box">
<div class="feature-icon-wrapper">

View File

@ -13,7 +13,7 @@
body {
font-family: 'Segoe UI', sans-serif;
background: #f5f7fb;
/* 80px තිබුණු එක 56px කළා, එවිට අනවශ්‍ය space එක ඉවත් වේ */
padding-top: 56px;
}
@ -25,6 +25,7 @@
left: 0;
width: 100%;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
height: 83px;
}
.navbar-brand {
@ -41,12 +42,14 @@
color: rgba(255, 255, 255, 0.85) !important;
margin-left: 20px;
transition: 0.2s ease;
font-weight:bold;
}
/* දැනට ඉන්න පිටුව හෝ hover වන විට පැහැදිලිව පෙනීමට */
.nav-link:hover,
.nav-link.active-page {
color: #ffc107 !important;
font-weight:bold;
}
.site-footer {

View File

@ -289,7 +289,8 @@
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form action="#" method="POST" id="studentLoginForm">
<!-- <form action="#" method="POST" id="studentLoginForm"> -->
<form action="{{ route('student.login.submit') }}" method="POST" id="studentLoginForm">
@csrf
<div class="modal-body">
@ -320,7 +321,7 @@
<div class="modal-footer d-flex gap-2 justify-content-center">
<button type="button" class="btn btn-modal-cancel " data-bs-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-modal-login ">Login</button>
<button type="submit" class="btn btn-modal-login "> Login </button>
</div>
</form>
</div>

View File

@ -255,6 +255,7 @@ body{
.why-section i {
color: #5E244E;
}
</style>
{{-- ===================== HERO ===================== --}}

View File

@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\StudentPortalController; // නිවැරදි Controller නමය
/*
|--------------------------------------------------------------------------
@ -15,27 +15,36 @@ Route::get('/', function () {
return view('welcome');
});
// Authentication Routes
Route::post('/signuppage', [AuthController::class, 'register']);
Route::post('/signin', [AuthController::class, 'login']);
Route::post('/custom-logout', [AuthController::class, 'logout']);
// --- STUDENT PORTAL SYSTEM ROUTES ---
Route::post('/student-login', [StudentPortalController::class, 'studentlogin'])->name('student.login.submit');
// Route::get('/student-login', [StudentPortalController::class, 'studentlogin'])->name('student.login.submit');
Route::get('/student-portal', function () {
if (!session()->has('student_id')) {
return redirect()->back()->with('error', 'Please login first!');
}
return view('StudentPortal');
})->name('student.portal');
// Route::get('/student-logout', function () {
// session()->forget('student_id');
// return redirect()->to('/students')->with('success', 'Logged out successfully!');
// })->name('student.logout');
// Static Pages (Views)
Route::view('/apply', 'apply')->name('apply');
Route::view('/courses', 'courses')->name('courses');
Route::view('/students', 'students')->name('students');
Route::view('/abouts', 'abouts')->name('abouts');
Route::view('/contact', 'contacts')->name('contact');
Route::view('/signin', 'signin')->name('signin');
Route::view('/signup', 'signup')->name('signup');
// Route::get('/signup', function () {
// return view('signup');
// })->name('signup');