notes sharing platform

This commit is contained in:
Flatlogic Bot 2025-12-11 05:14:27 +00:00
parent ea54c63a88
commit 86a0c91f81
11 changed files with 338 additions and 138 deletions

Binary file not shown.

11
core/forms.py Normal file
View File

@ -0,0 +1,11 @@
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class SignUpForm(UserCreationForm):
email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')
class Meta:
model = User
fields = ('username', 'email', 'password', 'password2')

View File

@ -3,7 +3,8 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>{% block title %}Knowledge Base{% endblock %}</title> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Notes Sharing Platform{% endblock %}</title>
{% if project_description %} {% if project_description %}
<meta name="description" content="{{ project_description }}"> <meta name="description" content="{{ project_description }}">
<meta property="og:description" content="{{ project_description }}"> <meta property="og:description" content="{{ project_description }}">
@ -13,13 +14,84 @@
<meta property="og:image" content="{{ project_image_url }}"> <meta property="og:image" content="{{ project_image_url }}">
<meta property="twitter:image" content="{{ project_image_url }}"> <meta property="twitter:image" content="{{ project_image_url }}">
{% endif %} {% endif %}
<!-- Google Fonts -->
<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=Lato:wght@400;700&family=Poppins:wght@600;700&display=swap" rel="stylesheet">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
{% load static %} {% load static %}
<link rel="stylesheet" href="{% static 'css/custom.css' %}?v={{ deployment_timestamp }}"> <link rel="stylesheet" href="{% static 'css/custom.css' %}?v={{ deployment_timestamp }}">
{% block head %}{% endblock %} {% block head %}{% endblock %}
</head> </head>
<body> <body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="/">NotesShare</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto align-items-center">
{% if user.is_authenticated %}
<li class="nav-item">
<a class="nav-link" href="#">My Notes</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Browse</a>
</li>
<li class="nav-item">
<a class="btn btn-primary me-2" href="#">Upload</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<span class="avatar">{{ user.email.0|upper }}</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="#">Profile</a></li>
<li><hr class="dropdown-divider"></li>
<li>
<form action="{% url 'logout' %}" method="post" class="d-inline">
{% csrf_token %}
<button type="submit" class="dropdown-item">Logout</button>
</form>
</li>
</ul>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="#">Browse</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'login' %}">Login</a>
</li>
<li class="nav-item">
<a class="btn btn-primary" href="{% url 'signup' %}">Sign Up</a>
</li>
<li class="nav-item">
<span class="avatar">G</span>
</li>
{% endif %}
</ul>
</div>
</div>
</nav>
{% block content %}{% endblock %} {% block content %}{% endblock %}
<footer class="bg-light text-center text-lg-start mt-auto">
<div class="container p-4">
<p class="text-center">&copy; 2025 NotesShare. All Rights Reserved.</p>
</div>
</footer>
<!-- Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body> </body>
</html> </html>

View File

@ -1,145 +1,65 @@
{% extends "base.html" %} {% extends 'base.html' %}
{% load static %}
{% block title %}{{ project_name }}{% endblock %} {% block title %}Welcome to the #1 Notes Sharing Platform{% endblock %}
{% block head %} {% block head %}
<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@400;700&display=swap" rel="stylesheet">
<style> <style>
:root { .hero-section {
--bg-color-start: #6a11cb; background: linear-gradient(45deg, #0a2540, #007bff);
--bg-color-end: #2575fc; color: #ffffff;
--text-color: #ffffff;
--card-bg-color: rgba(255, 255, 255, 0.01);
--card-border-color: rgba(255, 255, 255, 0.1);
} }
.how-it-works {
* { background-color: #f6f9fc;
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end));
color: var(--text-color);
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
text-align: center;
overflow: hidden;
position: relative;
}
body::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'><path d='M-10 10L110 10M10 -10L10 110' stroke-width='1' stroke='rgba(255,255,255,0.05)'/></svg>");
animation: bg-pan 20s linear infinite;
z-index: -1;
}
@keyframes bg-pan {
0% {
background-position: 0% 0%;
}
100% {
background-position: 100% 100%;
}
}
main {
padding: 2rem;
}
.card {
background: var(--card-bg-color);
border: 1px solid var(--card-border-color);
border-radius: 16px;
padding: 2.5rem 2rem;
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
box-shadow: 0 12px 36px rgba(0, 0, 0, 0.25);
}
h1 {
font-size: clamp(2.2rem, 3vw + 1.2rem, 3.2rem);
font-weight: 700;
margin: 0 0 1.2rem;
letter-spacing: -0.02em;
}
p {
margin: 0.5rem 0;
font-size: 1.1rem;
opacity: 0.92;
}
.loader {
margin: 1.5rem auto;
width: 56px;
height: 56px;
border: 4px solid rgba(255, 255, 255, 0.25);
border-top-color: #fff;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.runtime code {
background: rgba(0, 0, 0, 0.25);
padding: 0.15rem 0.45rem;
border-radius: 4px;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}
footer {
position: absolute;
bottom: 1rem;
width: 100%;
text-align: center;
font-size: 0.85rem;
opacity: 0.75;
} }
</style> </style>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<main> <div class="container-fluid">
<div class="card"> <div class="row hero-section align-items-center">
<h1>Analyzing your requirements and generating your app…</h1> <div class="col-md-10 offset-md-1 text-center">
<div class="loader" role="status" aria-live="polite" aria-label="Applying initial changes"> <h1 class="display-3">The Best Place for Your Study Notes</h1>
<span class="sr-only">Loading…</span> <p class="lead">Upload, share, and discover study materials from students at your university. Say goodbye to scattered files and hello to collaborative learning.</p>
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center">
<a href="{% url 'signup' %}" class="btn btn-primary btn-lg px-4 gap-3">Get Started</a>
<a href="#" class="btn btn-outline-light btn-lg px-4">Browse Notes</a>
</div>
</div> </div>
<p class="hint">AppWizzy AI is collecting your requirements and applying the first changes.</p>
<p class="hint">This page will refresh automatically as the plan is implemented.</p>
<p class="runtime">
Runtime: Django <code>{{ django_version }}</code> · Python <code>{{ python_version }}</code>
— UTC <code>{{ current_time|date:"Y-m-d H:i:s" }}</code>
</p>
</div> </div>
</main>
<footer> <div class="row how-it-works">
Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) <div class="col-12">
</footer> <h2 class="text-center mb-5">How It Works</h2>
{% endblock %} </div>
<div class="col-md-3">
<div class="step">
<div class="step-icon">1</div>
<h3>Sign Up</h3>
<p>Create your free account in seconds.</p>
</div>
</div>
<div class="col-md-3">
<div class="step">
<div class="step-icon">2</div>
<h3>Upload</h3>
<p>Share your notes, ppts, and assignments.</p>
</div>
</div>
<div class="col-md-3">
<div class="step">
<div class="step-icon">3</div>
<h3>Share</h3>
<p>Help other students by making your notes public.</p>
</div>
</div>
<div class="col-md-3">
<div class="step">
<div class="step-icon">4</div>
<h3>Download</h3>
<p>Access quality notes from your peers.</p>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,22 @@
{% extends 'base.html' %}
{% block content %}
<div class="container mt-5">
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="text-center">Login</h3>
</div>
<div class="card-body">
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-primary btn-block">Login</button>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,22 @@
{% extends 'base.html' %}
{% block content %}
<div class="container mt-5">
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="text-center">Sign Up</h3>
</div>
<div class="card-body">
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-primary btn-block">Sign Up</button>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,7 +1,10 @@
from django.urls import path from django.urls import path
from .views import home from .views import home, login_view, logout_view, signup_view
urlpatterns = [ urlpatterns = [
path("", home, name="home"), path("", home, name="home"),
path("signup/", signup_view, name="signup"),
path("login/", login_view, name="login"),
path("logout/", logout_view, name="logout"),
] ]

View File

@ -2,9 +2,13 @@ import os
import platform import platform
from django import get_version as django_version from django import get_version as django_version
from django.shortcuts import render from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.forms import AuthenticationForm
from django.shortcuts import redirect, render
from django.utils import timezone from django.utils import timezone
from .forms import SignUpForm
def home(request): def home(request):
"""Render the landing screen with loader and environment details.""" """Render the landing screen with loader and environment details."""
@ -23,3 +27,33 @@ def home(request):
"project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""),
} }
return render(request, "core/index.html", context) return render(request, "core/index.html", context)
def signup_view(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect('home')
else:
form = SignUpForm()
return render(request, 'core/signup.html', {'form': form})
def login_view(request):
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
user = form.get_user()
login(request, user)
return redirect('home')
else:
form = AuthenticationForm()
return render(request, 'core/login.html', {'form': form})
def logout_view(request):
if request.method == 'POST':
logout(request)
return redirect('home')

View File

@ -1,4 +1,120 @@
/* Custom styles for the application */ /*
Palette:
- Primary (Deep Blue): #0A2540
- Secondary (White): #FFFFFF
- Accent (Bright Blue): #007BFF
- Neutral/Background (Light Gray): #F6F9FC
- Text (Dark Gray): #333333
*/
body { body {
font-family: system-ui, -apple-system, sans-serif; font-family: 'Lato', sans-serif;
color: #333333;
background-color: #FFFFFF;
} }
h1, h2, h3, h4, h5, h6, .navbar-brand {
font-family: 'Poppins', sans-serif;
font-weight: 700;
}
.btn-primary {
background-color: #007BFF;
border-color: #007BFF;
font-weight: 600;
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
transition: background-color 0.3s ease, border-color 0.3s ease;
}
.btn-primary:hover {
background-color: #0056b3;
border-color: #0056b3;
}
.btn-secondary {
background-color: transparent;
border-color: #0A2540;
color: #0A2540;
font-weight: 600;
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
transition: background-color 0.3s ease, color 0.3s ease;
}
.btn-secondary:hover {
background-color: #0A2540;
color: #FFFFFF;
}
.navbar {
border-bottom: 1px solid #eee;
}
.navbar-brand {
font-weight: 700;
color: #0A2540 !important;
}
/* Hero Section */
.hero-section {
background: linear-gradient(45deg, #0A2540, #007BFF);
color: #FFFFFF;
padding: 100px 0;
text-align: center;
}
.hero-section h1 {
font-size: 3.5rem;
font-weight: 700;
margin-bottom: 1rem;
}
.hero-section p {
font-size: 1.25rem;
margin-bottom: 2rem;
max-width: 600px;
margin-left: auto;
margin-right: auto;
}
/* How it works section */
.how-it-works {
padding: 80px 0;
background-color: #F6F9FC;
}
.how-it-works h2 {
text-align: center;
margin-bottom: 4rem;
color: #0A2540;
}
.step {
text-align: center;
}
.step-icon {
font-size: 3rem;
color: #007BFF;
margin-bottom: 1rem;
}
.step h3 {
font-size: 1.5rem;
color: #0A2540;
margin-bottom: 0.5rem;
}
.avatar {
display: inline-block;
width: 40px;
height: 40px;
border-radius: 50%;
background-color: #007bff;
color: #fff;
text-align: center;
line-height: 40px;
font-weight: bold;
font-size: 20px;
}