форк від mougnibas/archinsa
premier commit
This commit is contained in:
коміт
394055b19b
9 змінених файлів з 579 додано та 0 видалено
1
.gitignore
сторонній
Звичайний файл
1
.gitignore
сторонній
Звичайний файл
|
|
@ -0,0 +1 @@
|
|||
test_creds.php
|
||||
171
api.md
Звичайний файл
171
api.md
Звичайний файл
|
|
@ -0,0 +1,171 @@
|
|||
# API PHP
|
||||
|
||||
Ce document décrit le comportement de l'api utilisée par le site
|
||||
|
||||
## Endpoints
|
||||
|
||||
### Authentification
|
||||
|
||||
- **Endpoint:** `auth.php?auth`
|
||||
- **Description:** Authentifie l'utilisateur et initialise une session.
|
||||
- **Méthode HTTP:** GET
|
||||
- **Réponse JSON:**
|
||||
```json
|
||||
{
|
||||
"status": 1,
|
||||
"msg": "Authentification réussie."
|
||||
}
|
||||
```
|
||||
En cas d'erreur :
|
||||
```json
|
||||
{
|
||||
"status": 0,
|
||||
"msg": "Erreur pendant le traitement de la requête."
|
||||
}
|
||||
|
||||
### Déconnexion
|
||||
|
||||
- **Endpoint:** `auth.php?unauth`
|
||||
- **Description:** Déconnecte l'utilisateur en mettant fin à la session.
|
||||
- **Méthode HTTP:** GET
|
||||
- **Réponse JSON:**
|
||||
```json
|
||||
{
|
||||
"status": 1,
|
||||
"msg": "Déconnexion réussie."
|
||||
}
|
||||
```
|
||||
|
||||
### Test d'authentification
|
||||
|
||||
- **Endpoint:** `auth.php?test_auth`
|
||||
- **Description:** Vérifie si l'utilisateur est authentifié.
|
||||
- **Méthode HTTP:** GET
|
||||
- **Réponse JSON:**
|
||||
- Si l'utilisateur est authentifié :
|
||||
```json
|
||||
{
|
||||
"status": 1,
|
||||
"msg": "Utilisateur bien authentifié."
|
||||
}
|
||||
```
|
||||
- Si l'utilisateur n'est pas authentifié :
|
||||
```json
|
||||
{
|
||||
"status": 4,
|
||||
"msg": "Utilisateur non authentifié."
|
||||
}
|
||||
```
|
||||
|
||||
## Statuts de réponse
|
||||
|
||||
- **Status 1 :** Requête valide.
|
||||
- **Status 0 :** Erreur pendant le traitement de la requête.
|
||||
- **Status 2 :** Requête invalide.
|
||||
- **Status 3 :** Session expirée.
|
||||
- **Status 4 :** Utilisateur non authentifié, requête interdite.
|
||||
|
||||
## Gestion des sessions
|
||||
|
||||
Le fichier `session_verif.php` est inclus pour la gestion des sessions. Assurez-vous qu'il est présent et correctement configuré.
|
||||
|
||||
---
|
||||
|
||||
**Remarque :** Ce document est une documentation basique. Assurez-vous d'ajuster et d'améliorer la sécurité en fonction des besoins spécifiques de votre application.
|
||||
|
||||
|
||||
## upload de plusieurs fichiers :
|
||||
|
||||
```javascript
|
||||
async function uploadMultiple(donneesFormulaires) {
|
||||
try {
|
||||
const reponse = await fetch("https://example.com/api", {
|
||||
method: "POST",
|
||||
body: donneesFormulaires,
|
||||
});
|
||||
const resultat = await reponse.json();
|
||||
console.log("Réussite :", resultat);
|
||||
} catch (erreur) {
|
||||
console.error("Erreur :", erreur);
|
||||
}
|
||||
}
|
||||
|
||||
const docs = document.querySelector('input[type="file"][multiple]');
|
||||
const donneesFormulaires = new FormData();
|
||||
|
||||
donneesFormulaires.append("title", "documents");
|
||||
|
||||
for (const [i, doc] of Array.from(docs.files).entries()) {
|
||||
donneesFormulaires.append(`doc_${i}`, doc);
|
||||
}
|
||||
|
||||
uploadMultiple(donneesFormulaires);
|
||||
```
|
||||
|
||||
## upload de données json
|
||||
```javascript
|
||||
|
||||
async function postJSON(donnees) {
|
||||
try {
|
||||
const reponse = await fetch("https://example.com/profile", {
|
||||
method: "POST", // ou 'PUT'
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify(donnees),
|
||||
});
|
||||
|
||||
const resultat = await reponse.json();
|
||||
console.log("Réussite :", resultat);
|
||||
} catch (erreur) {
|
||||
console.error("Erreur :", erreur);
|
||||
}
|
||||
}
|
||||
|
||||
const donnees = { login: "Jean Biche" };
|
||||
postJSON(donnees);
|
||||
|
||||
```
|
||||
|
||||
## récupérer des documents
|
||||
|
||||
``` javascript
|
||||
|
||||
async function fetchImage() {
|
||||
try {
|
||||
const response = await fetch("flowers.jpg");
|
||||
if (!response.ok) {
|
||||
throw new Error("La réponse n'est pas OK");
|
||||
}
|
||||
const myBlob = await response.blob();
|
||||
monImage.src = URL.createObjectURL(myBlob);
|
||||
} catch (error) {
|
||||
console.error("Un problème est survenu lors de la récupération :", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
```
|
||||
|
||||
[source](https://developer.mozilla.org/fr/docs/Web/API/Fetch_API/Using_Fetch)
|
||||
|
||||
|
||||
## récupérer des données
|
||||
``` javascript
|
||||
|
||||
|
||||
async function test_auth(){
|
||||
resp = await fetch("/annales/api.php?test_auth");
|
||||
data = await resp.json();
|
||||
document.getElementById("user_status").innerText = data["msg"];
|
||||
}
|
||||
|
||||
async function unauthenticate_user(){
|
||||
resp = await fetch("/annales/api.php?unauth");
|
||||
data = await resp.json();
|
||||
if(data.status == 1){
|
||||
document.getElementById("user_status").innerText = data["msg"];
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
74
api.php
Звичайний файл
74
api.php
Звичайний файл
|
|
@ -0,0 +1,74 @@
|
|||
<?php
|
||||
session_start();
|
||||
|
||||
/*
|
||||
status :
|
||||
1 => Requète valide
|
||||
0 => Erreur pendant le traitement de la requète
|
||||
2 => Requète invalide
|
||||
3 => Session expirée
|
||||
4 => Utilisateur non authentifié, requète interdite
|
||||
|
||||
*/
|
||||
|
||||
include("session_verif.php");
|
||||
include("test_creds.php");
|
||||
include("bdd.php");
|
||||
|
||||
|
||||
// Get the requested URL
|
||||
$request_uri = $_SERVER['REQUEST_URI'];
|
||||
|
||||
// Split the URL into an array using the '/' delimiter
|
||||
$url_parts = explode('/', $request_uri);
|
||||
|
||||
// Remove empty elements from the array
|
||||
$url_parts = array_filter($url_parts);
|
||||
|
||||
// The first element is the base path (in this case, "/api")
|
||||
$base_path = array_shift($url_parts);
|
||||
|
||||
|
||||
if($_SERVER['REQUEST_METHOD'] === 'GET'){
|
||||
if(isset($_GET["auth"])){
|
||||
try{
|
||||
$_SESSION["utilisateur_authentifie"] = true;
|
||||
session_regenerate_id(true);
|
||||
$_SESSION["heure_debut"] = time();
|
||||
echo json_encode(["status"=>"1","msg"=>"Authentification réussie."]);
|
||||
}catch(Exception $e){
|
||||
echo( json_encode(["status"=> "0","msg"=> $e->getMessage() ]) );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(isset($_GET["unauth"])){
|
||||
$_SESSION["utilisateur_authentifie"] = false;
|
||||
echo json_encode(["status"=>"1","msg"=>"Déconnection réussie."]);
|
||||
session_destroy();
|
||||
session_abort();
|
||||
}
|
||||
|
||||
if(isset($_GET["test_auth"])){
|
||||
if($_SESSION["utilisateur_authentifie"] == true){
|
||||
echo(json_encode(["status"=> "1","msg"=> "Utilisateur bien authentifié."]));
|
||||
}else{
|
||||
echo(json_encode(["status"=> "4","msg"=> "Utilisateur non authentifié."]));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
if($_SERVER['REQUEST_METHOD'] === 'POST'){
|
||||
switch(array_shift($url_parts)){
|
||||
case "aj_doc":
|
||||
ajouter_doc($_POST);
|
||||
break;
|
||||
default:
|
||||
echo(json_encode(["status"=> "2","msg"=> "Opération inconnue."]));
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
56
bdd.php
Звичайний файл
56
bdd.php
Звичайний файл
|
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
|
||||
$conn = new mysqli($servername, $username, $password, $dbname);
|
||||
|
||||
// Check connection
|
||||
if ($conn->connect_error) {
|
||||
die("Connection failed: " . $conn->connect_error);
|
||||
}
|
||||
|
||||
|
||||
function ajouter_doc($request){
|
||||
|
||||
saveFilesFromPost($request);
|
||||
|
||||
if (isset($request['files']) && is_array($request['files'])) {
|
||||
foreach ($request['files'] as $file) {
|
||||
$sql="INSERT INTO ";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function saveFilesFromPost($postData) {
|
||||
// Check if the $_POST variable is set and contains files
|
||||
if (isset($postData['files']) && is_array($postData['files'])) {
|
||||
// Directory to save the files
|
||||
$uploadDir = 'archives/';
|
||||
|
||||
// Iterate through each file in the $_POST['files'] array
|
||||
foreach ($postData['files'] as $file) {
|
||||
// Extract file information
|
||||
$fileName = $file['name'];
|
||||
$fileData = $file['data'];
|
||||
|
||||
// Decode base64 encoded file data
|
||||
$fileData = base64_decode($fileData);
|
||||
|
||||
// Create a unique filename to avoid overwriting existing files
|
||||
$uniqueFileName = uniqid() . '_' . $fileName;
|
||||
|
||||
// Define the path to save the file
|
||||
$filePath = $uploadDir . $uniqueFileName;
|
||||
|
||||
// Save the file
|
||||
if (file_put_contents($filePath, $fileData) !== false) {
|
||||
echo(json_encode(["status"=>"1","msg" =>"File '$uniqueFileName' has been saved successfully."]));
|
||||
} else {
|
||||
echo(json_encode(["status"=>"0","msg"=>"Error saving file '$uniqueFileName'"]));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
echo(json_encode(["status"=>"2","msg"=>"No files in the POST data."]));
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
49
index.php
Звичайний файл
49
index.php
Звичайний файл
|
|
@ -0,0 +1,49 @@
|
|||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Document</title>
|
||||
</head>
|
||||
<body>
|
||||
<?php
|
||||
session_start();
|
||||
|
||||
?>
|
||||
<a href="javascript:authenticate_user();">connection</a>
|
||||
<a href="javascript:unauthenticate_user();">déconnection</a>
|
||||
|
||||
<div id="user_status">
|
||||
|
||||
</div>
|
||||
</body>
|
||||
<script>
|
||||
async function test_auth(){
|
||||
resp = await fetch("/annales/api.php?test_auth");
|
||||
data = await resp.json();
|
||||
document.getElementById("user_status").innerText = data["msg"];
|
||||
}
|
||||
|
||||
// fonction de test, innutile en prod
|
||||
async function authenticate_user(){
|
||||
resp = await fetch("/annales/api.php?auth");
|
||||
data = await resp.json();
|
||||
if(data.status == 1){
|
||||
document.getElementById("user_status").innerText = data["msg"];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async function unauthenticate_user(){
|
||||
resp = await fetch("/annales/api.php?unauth");
|
||||
data = await resp.json();
|
||||
if(data.status == 1){
|
||||
document.getElementById("user_status").innerText = data["msg"];
|
||||
}
|
||||
}
|
||||
|
||||
test_auth();
|
||||
|
||||
</script>
|
||||
</html>
|
||||
70
init_db.php
Звичайний файл
70
init_db.php
Звичайний файл
|
|
@ -0,0 +1,70 @@
|
|||
<?php
|
||||
// Database connection parameters
|
||||
$servername = "127.0.0.1";
|
||||
$username = "root";
|
||||
$password = "";
|
||||
$dbname = "archivinsa";
|
||||
|
||||
// Create connection
|
||||
$conn = new mysqli($servername, $username, $password, $dbname);
|
||||
|
||||
// Check connection
|
||||
if ($conn->connect_error) {
|
||||
die("Connection failed: " . $conn->connect_error);
|
||||
}
|
||||
|
||||
// Create tables
|
||||
$sql = "
|
||||
CREATE TABLE IF NOT EXISTS themes (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS ensemble (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
commentaire_auteur TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS documents (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
titre VARCHAR(255) NOT NULL,
|
||||
type INT,
|
||||
upload_path TEXT NOT NULL,
|
||||
commentaire_auteur TEXT,
|
||||
ensemble_id INT,
|
||||
theme_id INT,
|
||||
FOREIGN KEY (theme_id) REFERENCES themes(id),
|
||||
FOREIGN KEY (ensemble_id) REFERENCES ensemble(id)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS exercices (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
titre VARCHAR(255) NOT NULL,
|
||||
commentaire_auteur TEXT,
|
||||
document_id INT,
|
||||
FOREIGN KEY (document_id) REFERENCES documents(id)
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE IF NOT EXISTS exercices_themes (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
exercice_id INT,
|
||||
theme_id INT,
|
||||
FOREIGN KEY (exercice_id) REFERENCES exercices(id),
|
||||
FOREIGN KEY (theme_id) REFERENCES themes(id)
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
";
|
||||
|
||||
if ($conn->multi_query($sql) === TRUE) {
|
||||
echo "Tables created successfully";
|
||||
} else {
|
||||
echo "Error creating tables: " . $conn->error;
|
||||
}
|
||||
|
||||
// Close the connection
|
||||
$conn->close();
|
||||
?>
|
||||
48
readme.md
Звичайний файл
48
readme.md
Звичайний файл
|
|
@ -0,0 +1,48 @@
|
|||
# Arch'insa
|
||||
Ce site a pour but à therme de remplacer le site actuel des annales de L'INSA Toulouse, avec une recherche par themes/classes/temps de résolution, la possibilité de prendre directement des photos de son exercice pour le téléverser et d'envoyer toutes sortes de supports tels que des fiches de cours. Des commentaires seront aussi disponibles pour les auteurs pour donner un contexte ou des indications sur un exercice en particulier, ou un paquet de documents en entier.
|
||||
D'autres fonctionnalités seront ajoutées petit à petit. (si vous avez des suggestions, n'hésitez pas à contacter le club info ou moi directement)
|
||||
|
||||
|
||||
## structure bdd
|
||||
### Table: themes
|
||||
|
||||
| Column | Type | Constraints |
|
||||
|--------|-----------------|--------------------------|
|
||||
| id | INT | AUTO_INCREMENT, PRIMARY KEY |
|
||||
| name | VARCHAR(255) | NOT NULL |
|
||||
|
||||
### Table: exercices_themes
|
||||
|
||||
| Column | Type | Constraints |
|
||||
|--------------|--------|-------------------------------------------|
|
||||
| exercice_id | INT | FOREIGN KEY (exercice_id) REFERENCES exercises(id) |
|
||||
| theme_id | INT | FOREIGN KEY (theme_id) REFERENCES themes(id) |
|
||||
| PRIMARY KEY | | (exercice_id, theme_id) |
|
||||
|
||||
### Table: exercices
|
||||
|
||||
| Column | Type | Constraints |
|
||||
|--------------------|---------------|------------------------------------------|
|
||||
| id | INT | AUTO_INCREMENT, PRIMARY KEY |
|
||||
| titre | VARCHAR(255) | NOT NULL |
|
||||
| commentaire_auteur | TEXT | |
|
||||
| document_id | INT | FOREIGN KEY (document_id) REFERENCES documents(id) |
|
||||
|
||||
### Table: ensemble
|
||||
|
||||
| Column | Type | Constraints |
|
||||
|--------------------|---------------|------------------------------------------|
|
||||
| id | INT | AUTO_INCREMENT |
|
||||
| commentaire_auteur | TEXT | |
|
||||
|
||||
### Table: documents
|
||||
|
||||
| Column | Type | Constraints |
|
||||
|--------------------|---------------|------------------------------------------|
|
||||
| id | INT | AUTO_INCREMENT, PRIMARY KEY |
|
||||
| titre | VARCHAR(255) | NOT NULL |
|
||||
| type | INT | |
|
||||
| upload_path | TEXT | NOT NULL |
|
||||
| commentaire_auteur | TEXT | |
|
||||
| ensemble_id | INT | FOREIGN KEY (ensemble_id) REFERENCES ensemble(id) |
|
||||
| theme_id | INT | FOREIGN KEY (theme_id) REFERENCES themes(id) |
|
||||
13
session_verif.php
Звичайний файл
13
session_verif.php
Звичайний файл
|
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
session_start();
|
||||
|
||||
if(isset($_SESSION["utilisateur_authentifie"])){
|
||||
// vérifie que la session ne dépasse pas 4h
|
||||
if((time() - $_SESSION["heure_debut"]) > 3600*4){
|
||||
session_destroy();
|
||||
session_abort();
|
||||
echo(json_encode(array("status"=> "3","msg"=>"Session expirée, veuillez vous reconnecter.")));
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
97
televerser.php
Звичайний файл
97
televerser.php
Звичайний файл
|
|
@ -0,0 +1,97 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>File Upload</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- Input to choose files -->
|
||||
<input type="file" id="fileInput" multiple>
|
||||
<button onclick="uploadFiles()">Upload Files</button>
|
||||
|
||||
<!-- Button to open the camera -->
|
||||
<button onclick="openCamera()">Open Camera</button>
|
||||
|
||||
<script>
|
||||
function uploadFiles() {
|
||||
const fileInput = document.getElementById('fileInput');
|
||||
|
||||
// Create FormData object to append files
|
||||
const formData = new FormData();
|
||||
|
||||
// Append each selected file to the FormData
|
||||
for (const file of fileInput.files) {
|
||||
formData.append('files[]', file);
|
||||
}
|
||||
|
||||
// Make a POST request using Fetch API
|
||||
fetch('annales/api.php/aj_doc.php', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
console.log(data);
|
||||
// Handle the response from the server
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
});
|
||||
}
|
||||
|
||||
function openCamera() {
|
||||
// Open the camera and take pictures
|
||||
// You can use the MediaDevices API to access the camera
|
||||
navigator.mediaDevices.getUserMedia({ video: true })
|
||||
.then(mediaStream => {
|
||||
const video = document.createElement('video');
|
||||
document.body.appendChild(video);
|
||||
|
||||
// Display the camera stream in a video element
|
||||
video.srcObject = mediaStream;
|
||||
video.play();
|
||||
|
||||
// Capture an image from the video stream
|
||||
video.addEventListener('click', () => {
|
||||
const canvas = document.createElement('canvas');
|
||||
canvas.width = video.videoWidth;
|
||||
canvas.height = video.videoHeight;
|
||||
const context = canvas.getContext('2d');
|
||||
context.drawImage(video, 0, 0, canvas.width, canvas.height);
|
||||
|
||||
// Convert the canvas content to a data URL
|
||||
const imageDataUrl = canvas.toDataURL('image/jpeg');
|
||||
|
||||
// Close the camera stream
|
||||
mediaStream.getTracks().forEach(track => track.stop());
|
||||
|
||||
// Make a POST request to upload the image
|
||||
fetch('annales/api.php/aj_doc', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
files: [{ name: 'camera_image.jpg', data: imageDataUrl.split(',')[1] }]
|
||||
})
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
console.log(data);
|
||||
// Handle the response from the server
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
});
|
||||
});
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error accessing camera:', error);
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Завантаження…
Посилання в новій задачі