From 33419d5a42eb140c7d61ef8c635a0e71ae4cb0fc Mon Sep 17 00:00:00 2001
From: Kenneth <kenneth.tanfa.etu@univ-lille.fr>
Date: Thu, 23 Jan 2025 10:44:02 +0100
Subject: [PATCH] =?UTF-8?q?Cr=C3=A9ation=20de=20la=20base=20de=20donn?=
 =?UTF-8?q?=C3=A9es=20Acc=C3=A8s=20=C3=A0=20la=20base=20de=20donn=C3=A9es?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Pipfile                         |   1 +
 Pipfile.lock                    |  77 +++++++++++++++++++++-
 README.md                       |  16 ++++-
 __pycache__/app.cpython-312.pyc | Bin 0 -> 5801 bytes
 app.py                          | 107 +++++++++++++++++++++++++++++-
 templates/admin.html            |  22 +++++++
 templates/article_details.html  |  15 +++++
 templates/articles.html         |  18 ++++++
 templates/index.html            | 111 +++++++++++---------------------
 templates/index_op.html         |  61 ++++++++++++++++++
 10 files changed, 349 insertions(+), 79 deletions(-)
 create mode 100644 __pycache__/app.cpython-312.pyc
 create mode 100644 templates/admin.html
 create mode 100644 templates/article_details.html
 create mode 100644 templates/articles.html
 create mode 100644 templates/index_op.html

diff --git a/Pipfile b/Pipfile
index 401b1cf..5d69684 100644
--- a/Pipfile
+++ b/Pipfile
@@ -7,6 +7,7 @@ name = "pypi"
 psycopg2 = "*"
 flask = "*"
 flask-sqlalchemy = "*"
+psycopg2-binary = "*"
 
 [dev-packages]
 
diff --git a/Pipfile.lock b/Pipfile.lock
index 04bb92b..afe936f 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "c612c7907d78fe41a6fc3bf13abc06b9f056ceab75165823254a6bbb96271bf3"
+            "sha256": "ae4f3899e2a50fe730bcc093c082ce793842d0c8239b150422ef7ff0c622a308"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -229,6 +229,81 @@
             "markers": "python_version >= '3.8'",
             "version": "==2.9.10"
         },
+        "psycopg2-binary": {
+            "hashes": [
+                "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff",
+                "sha256:056470c3dc57904bbf63d6f534988bafc4e970ffd50f6271fc4ee7daad9498a5",
+                "sha256:0ea8e3d0ae83564f2fc554955d327fa081d065c8ca5cc6d2abb643e2c9c1200f",
+                "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5",
+                "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0",
+                "sha256:19721ac03892001ee8fdd11507e6a2e01f4e37014def96379411ca99d78aeb2c",
+                "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c",
+                "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341",
+                "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f",
+                "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7",
+                "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d",
+                "sha256:270934a475a0e4b6925b5f804e3809dd5f90f8613621d062848dd82f9cd62007",
+                "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142",
+                "sha256:2ad26b467a405c798aaa1458ba09d7e2b6e5f96b1ce0ac15d82fd9f95dc38a92",
+                "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb",
+                "sha256:2ce3e21dc3437b1d960521eca599d57408a695a0d3c26797ea0f72e834c7ffe5",
+                "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5",
+                "sha256:3216ccf953b3f267691c90c6fe742e45d890d8272326b4a8b20850a03d05b7b8",
+                "sha256:32581b3020c72d7a421009ee1c6bf4a131ef5f0a968fab2e2de0c9d2bb4577f1",
+                "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68",
+                "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73",
+                "sha256:3c18f74eb4386bf35e92ab2354a12c17e5eb4d9798e4c0ad3a00783eae7cd9f1",
+                "sha256:3c4745a90b78e51d9ba06e2088a2fe0c693ae19cc8cb051ccda44e8df8a6eb53",
+                "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d",
+                "sha256:3e9c76f0ac6f92ecfc79516a8034a544926430f7b080ec5a0537bca389ee0906",
+                "sha256:48b338f08d93e7be4ab2b5f1dbe69dc5e9ef07170fe1f86514422076d9c010d0",
+                "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2",
+                "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a",
+                "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b",
+                "sha256:5c370b1e4975df846b0277b4deba86419ca77dbc25047f535b0bb03d1a544d44",
+                "sha256:6b269105e59ac96aba877c1707c600ae55711d9dcd3fc4b5012e4af68e30c648",
+                "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7",
+                "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f",
+                "sha256:73aa0e31fa4bb82578f3a6c74a73c273367727de397a7a0f07bd83cbea696baa",
+                "sha256:7559bce4b505762d737172556a4e6ea8a9998ecac1e39b5233465093e8cee697",
+                "sha256:79625966e176dc97ddabc142351e0409e28acf4660b88d1cf6adb876d20c490d",
+                "sha256:7a813c8bdbaaaab1f078014b9b0b13f5de757e2b5d9be6403639b298a04d218b",
+                "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526",
+                "sha256:7f4152f8f76d2023aac16285576a9ecd2b11a9895373a1f10fd9db54b3ff06b4",
+                "sha256:7f5d859928e635fa3ce3477704acee0f667b3a3d3e4bb109f2b18d4005f38287",
+                "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e",
+                "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673",
+                "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0",
+                "sha256:8aabf1c1a04584c168984ac678a668094d831f152859d06e055288fa515e4d30",
+                "sha256:8aecc5e80c63f7459a1a2ab2c64df952051df196294d9f739933a9f6687e86b3",
+                "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e",
+                "sha256:8de718c0e1c4b982a54b41779667242bc630b2197948405b7bd8ce16bcecac92",
+                "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a",
+                "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c",
+                "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8",
+                "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909",
+                "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47",
+                "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864",
+                "sha256:d00924255d7fc916ef66e4bf22f354a940c67179ad3fd7067d7a0a9c84d2fbfc",
+                "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00",
+                "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb",
+                "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539",
+                "sha256:e5720a5d25e3b99cd0dc5c8a440570469ff82659bb09431c1439b92caf184d3b",
+                "sha256:e8b58f0a96e7a1e341fc894f62c1177a7c83febebb5ff9123b579418fdc8a481",
+                "sha256:e984839e75e0b60cfe75e351db53d6db750b00de45644c5d1f7ee5d1f34a1ce5",
+                "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4",
+                "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64",
+                "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392",
+                "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4",
+                "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1",
+                "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1",
+                "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567",
+                "sha256:ffe8ed017e4ed70f68b7b371d84b7d4a790368db9203dfc2d222febd3a9c8863"
+            ],
+            "index": "pypi",
+            "markers": "python_version >= '3.8'",
+            "version": "==2.9.10"
+        },
         "sqlalchemy": {
             "hashes": [
                 "sha256:03f0528c53ca0b67094c4764523c1451ea15959bbf0a8a8a3096900014db0278",
diff --git a/README.md b/README.md
index fc20772..1dca971 100644
--- a/README.md
+++ b/README.md
@@ -30,10 +30,24 @@ sudo apt install pipenv
 Une fois cela fait, on entrer dans l'environnement virtuel. 
 
 ```
+cd web_app
+pipenv install  
 pipenv shell 
-pipenv install psycopg2 flask flask-sqlalchemy
 ```
 
+#Création de la base de données 
+
+
+'''
+sudo -u postgres psql 
+ALTER USER postgres WITH PASSWORD 'nouveau_mot_de_passe';
+'''
+## Run the app 
+
+Dans le terminal, se placer au niveau de app.py
+```
+flask app.py 
+```
 
 
 ## Sitographie 
diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cec1efd5e27450dfbf6ea081afd97562cb24c4cb
GIT binary patch
literal 5801
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
F9RQmj%AEiJ

literal 0
HcmV?d00001

diff --git a/app.py b/app.py
index 36a68a2..fea1cbc 100644
--- a/app.py
+++ b/app.py
@@ -1,11 +1,114 @@
-from flask import Flask, render_template
+from flask import Flask, render_template, request, redirect, url_for, jsonify
+from flask_sqlalchemy import SQLAlchemy
+import psycopg2
+from psycopg2 import sql 
+
+# Informations de connexion à PostgreSQL
+host = "localhost"  # ou l'adresse de votre serveur
+port = 5432         # port par défaut de PostgreSQL
+user = "postgres"   # utilisateur PostgreSQL
+password = "mysecretpassword"  # mot de passe PostgreSQL
+database_name = "mydb"  # nom de la base de données à créer
+
+try:
+    # Connexion au serveur PostgreSQL
+    conn = psycopg2.connect(
+        dbname="postgres",  # On se connecte à la base "postgres" par défaut
+        user=user,
+        password=password,
+        host=host,
+        port=port
+    )
+    conn.autocommit = True  # Active le mode autocommit pour exécuter CREATE DATABASE
+
+    # Créer un curseur pour exécuter les requêtes
+    cur = conn.cursor()
+
+    # Création de la base de données
+    cur.execute(sql.SQL("CREATE DATABASE {}").format(sql.Identifier(database_name)))
+
+    print(f"La base de données '{database_name}' a été créée avec succès.")
+
+    # Fermer le curseur et la connexion
+    cur.close()
+    conn.close()
+except psycopg2.Error as e:
+    print(f"Erreur lors de la création de la base de données : {e}")
+
+
+# Créatipon de la base données 
 
 app = Flask(__name__, template_folder ="templates")
 
 
+
+# Configuration de la base de données PostgreSQL
+app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:mysecretpassword@localhost:5432/mydb'
+app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
+
+db = SQLAlchemy(app)
+
+#Modèle utilisateur 
+class User(db.Model):
+    id = db.Column(db.Integer, primary_key=True)
+    name = db.Column(db.String(80), nullable=False)
+    email = db.Column(db.String(120), unique=True, nullable=False)
+
+# Modèle Article
+class Article(db.Model):
+    id = db.Column(db.Integer, primary_key=True)
+    title = db.Column(db.String(120), nullable=False)
+    description = db.Column(db.Text, nullable=False)
+    price = db.Column(db.Float, nullable=False)
+
+# Créer les tables dans la base de données
+with app.app_context():
+    db.create_all()
+
+
 @app.route('/')
 def index(): 
     return render_template("index.html")
+    # return "Hello, world"
+
+
+@app.route('/admin', methods=['GET', 'POST'])
+def admin():
+    if request.method == 'POST':
+        title = request.form['title']
+        description = request.form['description']
+        price = request.form['price']
+        
+        new_article = Article(title=title, description=description, price=price)
+        db.session.add(new_article)
+        db.session.commit()
+        
+        return redirect(url_for('admin'))
+    
+    articles = Article.query.all()
+    return render_template('admin.html', articles=articles)
+
+@app.route('/articles')
+def articles():
+    articles = Article.query.all()
+    return render_template('articles.html', articles=articles)
+
+@app.route('/articles/<int:article_id>')
+def article_details(article_id):
+    article = Article.query.get_or_404(article_id)
+    return render_template('article_details.html', article=article)
+
+@app.route('/buy/<int:article_id>', methods=['POST'])
+def buy(article_id):
+    article = Article.query.get_or_404(article_id)
+    user_email = request.form['email']  # Récupère l'email de l'utilisateur
+
+    # Simulation d'envoi de confirmation (ajoutez Flask-Mail pour le rendre réel)
+    print(f"Email de confirmation envoyé à {user_email} pour l'article {article.title} au prix de {article.price}€.")
+
+    return jsonify({"message": f"Confirmation envoyée à {user_email} pour l'achat de {article.title}."})
+
 
 if __name__ == '__main__':
-    app.run(debug=True)
\ No newline at end of file
+    app.run(debug=True)
+    
diff --git a/templates/admin.html b/templates/admin.html
new file mode 100644
index 0000000..db5df41
--- /dev/null
+++ b/templates/admin.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <title>Admin - Ajouter des articles</title>
+</head>
+<body>
+    <h1>Ajouter un article</h1>
+    <form method="POST">
+        <input type="text" name="title" placeholder="Titre" required>
+        <textarea name="description" placeholder="Description" required></textarea>
+        <input type="number" step="0.01" name="price" placeholder="Prix (€)" required>
+        <button type="submit">Ajouter</button>
+    </form>
+
+    <h2>Articles disponibles</h2>
+    <ul>
+        {% for article in articles %}
+        <li>{{ article.title }} - {{ article.price }}€</li>
+        {% endfor %}
+    </ul>
+</body>
+</html>
diff --git a/templates/article_details.html b/templates/article_details.html
new file mode 100644
index 0000000..9ed7920
--- /dev/null
+++ b/templates/article_details.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <title>{{ article.title }}</title>
+</head>
+<body>
+    <h1>{{ article.title }}</h1>
+    <p>{{ article.description }}</p>
+    <p>Prix : {{ article.price }}€</p>
+    <form method="POST" action="{{ url_for('buy', article_id=article.id) }}">
+        <input type="email" name="email" placeholder="Votre email" required>
+        <button type="submit">Acheter</button>
+    </form>
+</body>
+</html>
diff --git a/templates/articles.html b/templates/articles.html
new file mode 100644
index 0000000..a58c339
--- /dev/null
+++ b/templates/articles.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <title>Articles</title>
+</head>
+<body>
+    <h1>Articles disponibles</h1>
+    <ul>
+        {% for article in articles %}
+        <li>
+            <a href="{{ url_for('article_details', article_id=article.id) }}">
+                {{ article.title }} - {{ article.price }}€
+            </a>
+        </li>
+        {% endfor %}
+    </ul>
+</body>
+</html>
diff --git a/templates/index.html b/templates/index.html
index c5d9d6e..ab04df2 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -1,82 +1,43 @@
 <!DOCTYPE html>
-<html lang="fr">
+<html lang="en">
 <head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-  <title>Accueil - Style Apple</title>
-  <style>
-    /* Réinitialisation de quelques styles de base */
-    body, h1, p, nav, footer {
-      margin: 0;
-      padding: 0;
-    }
-    body {
-      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
-      background: #fff;
-      color: #333;
-      line-height: 1.6;
-    }
-    header {
-      padding: 20px;
-      text-align: center;
-      border-bottom: 1px solid #eaeaea;
-    }
-    nav {
-      display: flex;
-      justify-content: center;
-      gap: 20px;
-      font-size: 0.9em;
-    }
-    nav a {
-      text-decoration: none;
-      color: #333;
-      padding: 10px;
-    }
-    nav a:hover {
-      text-decoration: underline;
-    }
-    .hero {
-      text-align: center;
-      padding: 100px 20px;
-      background: #f9f9f9;
-    }
-    .hero h1 {
-      font-size: 3em;
-      margin-bottom: 20px;
-    }
-    .hero p {
-      font-size: 1.2em;
-      color: #555;
-    }
-    footer {
-      text-align: center;
-      padding: 20px;
-      font-size: 0.8em;
-      color: #777;
-      border-top: 1px solid #eaeaea;
-    }
-  </style>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Accueil</title>
+    <style>
+        body {
+            font-family: Arial, sans-serif;
+            text-align: center;
+            margin: 50px;
+        }
+        h1 {
+            color: #333;
+        }
+        .links {
+            margin: 20px 0;
+        }
+        .link {
+            display: inline-block;
+            margin: 10px;
+            padding: 15px 25px;
+            background-color: #007bff;
+            color: white;
+            text-decoration: none;
+            border-radius: 5px;
+            transition: background-color 0.3s;
+        }
+        .link:hover {
+            background-color: #0056b3;
+        }
+    </style>
 </head>
 <body>
-  <header>
-    <nav>
-      <a href="#">Mac</a>
-      <a href="#">iPhone</a>
-      <a href="#">iPad</a>
-      <a href="#">Watch</a>
-      <a href="#">TV</a>
-      <a href="#">Music</a>
-      <a href="#">Support</a>
-    </nav>
-  </header>
+    <h1>Bienvenue sur l'application</h1>
+    <p>Choisissez une action pour accéder à vos pages :</p>
 
-  <section class="hero">
-    <h1>Bienvenue chez Apple</h1>
-    <p>Découvrez nos derniers produits et innovations.</p>
-  </section>
-
-  <footer>
-    © 2025 Apple Inc. Tous droits réservés.
-  </footer>
+    <div class="links">
+        <a href="/admin" class="link">Page Administrateur</a>
+        <a href="/articles" class="link">Articles Disponibles</a>
+    </div>
 </body>
 </html>
diff --git a/templates/index_op.html b/templates/index_op.html
new file mode 100644
index 0000000..de4e203
--- /dev/null
+++ b/templates/index_op.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>One Piece - Marine HQ</title>
+    <style>
+        body {
+            font-family: Arial, sans-serif;
+            background: #0f2027; /* Marine-themed gradient */
+            background: -webkit-linear-gradient(to right, #2c5364, #203a43, #0f2027);
+            background: linear-gradient(to right, #2c5364, #203a43, #0f2027);
+            color: #f0f0f0;
+            text-align: center;
+            padding: 50px;
+        }
+        h1 {
+            font-size: 3rem;
+            margin-bottom: 10px;
+            color: #00d4ff;
+        }
+        p {
+            font-size: 1.2rem;
+            margin-bottom: 30px;
+        }
+        .links {
+            display: flex;
+            justify-content: center;
+            gap: 20px;
+            margin-top: 30px;
+            flex-wrap: wrap;
+        }
+        .link {
+            text-decoration: none;
+            background: #00d4ff;
+            color: #0f2027;
+            padding: 15px 30px;
+            border-radius: 5px;
+            font-size: 1.2rem;
+            font-weight: bold;
+            transition: 0.3s ease;
+        }
+        .link:hover {
+            background: #f0f0f0;
+            color: #00d4ff;
+        }
+        footer {
+            margin-top: 50px;
+            font-size: 0.9rem;
+            color: #a0a0a0;
+        }
+    </style>
+</head>
+<body>
+    <h1>Marine HQ</h1>
+    <p>Bienvenue à la base de la marine ! Surveillez les pirates, cataloguez les fruits du démon et maintenez l'ordre.</p>
+    
+    <div class="links">
+        <a href="/api/pirates" class="link">Voir les Pirates</a>
+        <a href="/api/marines" class="link">Voir les Marines</a>
+        <a href="/api/devil-fruits" class="link">Voir les Fruits
-- 
GitLab