Quellcode durchsuchen

Update the home page for the blog.

Lee Morgan vor 5 Jahren
Ursprung
Commit
693cc99dd1
6 geänderte Dateien mit 275 neuen und 162 gelöschten Zeilen
  1. 52 0
      controllers/blog.js
  2. 5 0
      models/blog.js
  3. 6 0
      routes.js
  4. 46 0
      views/blog/new.html
  5. 35 28
      views/main/index.css
  6. 131 134
      views/main/index.html

+ 52 - 0
controllers/blog.js

@@ -0,0 +1,52 @@
+const Blog = require("../models/blog.js");
+const Uploader = require("../models/uploader.js");
+
+module.exports = {
+    /*
+    POST: create a new blog
+    req.body = {
+        uploader: String (uploader id)
+        password: String
+        title: String
+        tags: String
+        blog: String
+    }
+    redirect to home
+    */
+    create: function(req, res){
+        Uploader.findOne({_id: req.body.uploader})
+            .then((uploader)=>{
+                if(uploader === "none") throw "uploader";
+                if(req.body.password !== uploader.password) throw "pass";
+
+                let blog = new Blog({
+                    writer: uploader._id,
+                    title: req.body.title,
+                    tags: req.body.tags.split(","),
+                    article: req.body.blog
+                });
+
+                return blog.save();
+            })
+            .then((blog)=>{
+                return res.redirect("/");
+            })
+            .catch((err)=>{
+                console.log(err);
+            });
+    },
+
+    /*
+    GET: get a list of all blogs
+    response = [Blog]
+    */
+    getBlogs: function(req, res){
+        Blog.aggregate([{$project: {article: 0}}])
+            .then((blogs)=>{
+                return res.json(blogs);
+            })
+            .catch((err)=>{
+                return res.json("ERROR: could not retrieve blog data");
+            });
+    }
+}

+ 5 - 0
models/blog.js

@@ -6,6 +6,11 @@ const BlogSchema = new mongoose.Schema({
         ref: "Uploader",
         required: true
     },
+    title: {
+        type: String,
+        required: true
+    },
+    tags: [String],
     article: {
         type: String,
         required: true

+ 6 - 0
routes.js

@@ -1,6 +1,7 @@
 const writing = require("./controllers/writing.js");
 const gallery = require("./controllers/gallery.js");
 const learn = require("./controllers/learn.js");
+const blog = require("./controllers/blog.js");
 
 module.exports = function(app){
     let views = `${__dirname}/views`;
@@ -16,6 +17,11 @@ module.exports = function(app){
     app.post("/writing/comments", writing.createComment);
     app.get("/writing/directories", writing.listDirectories);
 
+    //BLOG
+    app.get("/blog/new", (req, res)=>{res.sendFile(`${views}/blog/new.html`)});
+    app.post("/blog/new", blog.create);
+    app.get("/blog/retrieve", blog.getBlogs);
+
     //IMAGES
     app.get("/images/subline", (req, res)=>{res.sendFile(`${views}/images/subline.png`)});
     app.get("/images/budgeteer", (req, res)=>{res.sendFile(`${views}/images/budgeteer.jpeg`)});

+ 46 - 0
views/blog/new.html

@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <title>Lee Morgan</title>
+        <style>
+            form{
+                display: flex;
+                flex-direction: column;
+            }
+
+            form > *{
+                margin: 10px;
+            }
+
+            input[type=submit]{
+                max-width: 250px;
+            }
+        </style>
+    </head>
+    <body>
+        <form action="/blog/new" method="post">
+            <label>Uploader
+                <input name="uploader" type="text" required>
+            </label>
+
+            <label>Password
+                <input name="password" type="password" required>
+            </label>
+
+            <label>Title
+                <input name="title" type="text" required>
+            </label>
+
+            <label>Tags (comma delineated)
+                <input name="tags" type="text">
+            </label>
+
+            <label>Blog
+                <textarea name="blog" required></textarea>
+            </label>
+
+            <input type="submit" value="Submit">
+        </form>
+    </body>
+</html>

+ 35 - 28
views/main/index.css

@@ -98,6 +98,13 @@ body{
     width: 100%;
 }
 
+#blog{
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    height: 100vh;
+}
+
 #gallery{
     display: flex;
     flex-direction: column;
@@ -106,37 +113,37 @@ body{
     overflow-y: auto;
 }
 
-    #galleryTags{
+    
+    #galleryContainer{
         display: flex;
-        justify-content: center;
         flex-wrap: wrap;
-        margin-bottom: 25px;
-        width: 80vw;
-
+        justify-content: space-around;
     }
 
-        .tag{
-            display: flex;
-            justify-content: center;
-            align-items: center;
-            background: #152730;
-            color: #5FECE0;
-            font-size: 20px;
-            min-width: 75px;
-            border-radius: 20px;
-            height: 30px;
-            border: none;
-            padding: 0 25px;
-            margin: 10px;
-            cursor: pointer;
-        }
+.tag{
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    background: #152730;
+    color: #5FECE0;
+    font-size: 20px;
+    min-width: 75px;
+    border-radius: 20px;
+    height: 30px;
+    border: none;
+    padding: 0 25px;
+    margin: 10px;
+    cursor: pointer;
+}
 
-            .tag:hover{
-                box-shadow: 0 0 5px black;
-            }
+    .tag:hover{
+        box-shadow: 0 0 5px black;
+    }
 
-    #galleryContainer{
-        display: flex;
-        flex-wrap: wrap;
-        justify-content: space-around;
-    }
+.tagContainer{
+    display: flex;
+    justify-content: center;
+    flex-wrap: wrap;
+    margin-bottom: 25px;
+    width: 80vw;
+}

+ 131 - 134
views/main/index.html

@@ -27,7 +27,7 @@
                 <p>Обо Мне</p>
             </button>
 
-            <button id="writingButton">
+            <button id="blogButton">
                 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                     <path d="M12 19l7-7 3 3-7 7-3-3z"></path>
                     <path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"></path>
@@ -109,7 +109,18 @@
                 <h1>Ya, Ya, I'm working on it...</h1>
             </div>
 
-            <div id="writing" class="cardContainer" style="display:none;"></div>
+            <div id="blog" style="display:none;">
+                <div id="blogTags" class="tagContainer"></div>
+
+                <div id="blogs" class="cardContainer"></div>
+
+                <template id="blogCard">
+                    <a class="card">
+                        <h1></h1>
+                        <img>
+                    </a>
+                </template>
+            </div>
 
             <div id="links" class="cardContainer" style="display:none;">
                 <a class="card" href="https://cs-online.club/en/servers">
@@ -159,7 +170,7 @@
             </div>
 
             <div id="gallery" style="display:none">
-                <div id="galleryTags"></div>
+                <div id="galleryTags" class="tagContainer"></div>
 
                 <div id="galleryContainer"></div>
 
@@ -194,156 +205,142 @@
                 };
             }
 
-            fetch("/writing/directories")
-                .then(response => response.json())
-                .then((response)=>{
-                    let writing = document.getElementById("writing");
-                    let template = document.getElementById("backCard").content.children[0];
-
-                    let recurse = (currentArray, currentContainer)=>{
-                        for(let i = 0; i < currentArray.length; i++){
-                            let card = {};
-                            if(currentArray[i].contents[0].title === undefined){
-                                card = document.createElement("div");
-                                card.onclick = ()=>{
-                                    currentContainer.style.display = "none";
-                                    newContainer.style.display = "flex";
-                                };
-
-                                let name = document.createElement("h1");
-                                name.innerText = currentArray[i].name.toUpperCase();
-                                card.appendChild(name);
-                            }else{
-                                card = document.createElement("a");
-                                card.href = currentArray[i].contents[0].route;
-
-                                let title = document.createElement("h2");
-                                title.innerText = currentArray[i].contents[0].title;
-                                card.appendChild(title);
-
-                                let img = document.createElement("img");
-                                img.src = currentArray[i].contents[0].img;
-                                img.alt = `${currentArray[i].contents[0].title} image`;
-                                card.appendChild(img);
-                            }
-
-                            card.classList.add("card");
-                            currentContainer.appendChild(card);
-
-                            let newContainer = document.createElement("div");
-                            newContainer.classList.add("cardContainer");
-                            newContainer.style.display = "none";
-                            writing.appendChild(newContainer);
-
-                            let backCard = template.cloneNode(true);
-                            backCard.onclick = ()=>{
-                                newContainer.style.display = "none";
-                                currentContainer.style.display = "flex";
-                            }
-                            newContainer.appendChild(backCard);
-
-                            if(currentArray[i].contents[0].contents === undefined) continue;
-    
-                            recurse(currentArray[i].contents, newContainer);
+            let searchTags = (content, tag)=>{
+                let galleryList = [];
+
+                for(let i = 0; i < content.length; i++){
+                    for(let j = 0; j < content[i].tags.length; j++){
+                        if(content[i].tags[j].toLowerCase() === tag){
+                            galleryList.push(content[i]);
+                            break;
                         }
                     }
+                }
 
-                    let headContainer = document.createElement("div");
-                    headContainer.classList.add("cardContainer");
-                    headContainer.style.display = "flex";
-                    writing.appendChild(headContainer);
+                return galleryList;
+            }
 
-                    recurse(response, headContainer);
-                })
-                .catch((err)=>{});
+            //Get blog content
+            let populateBlogs = (blogs)=>{
+                let container = document.getElementById("blogs");
+                let template = document.getElementById("blogCard").content.children[0];
 
-                //Get gallery content
-                let populateGallery = (items)=>{
-                    let container = document.getElementById("galleryContainer");
-                    let template = document.getElementById("galleryCard").content.children[0];
+                while(container.children.length > 0){
+                    container.removeChild(container.firstChild);
+                }
+                
+                for(let i = 0; i < blogs.length; i++){
+                    let card = template.cloneNode(true);
+                    card.href = `/blog/${blogs[i]._id}`;
+                    card.children[0].innerText = blogs[i].title;
+                    container.appendChild(card);
+                }
+            }
 
-                    while(container.children.length > 0){
-                        container.removeChild(container.firstChild);
+            fetch("/blog/retrieve")
+                .then(response => response.json())
+                .then((response)=>{
+                    let tagContainer = document.getElementById("blogTags");
+                    let tags = [];
+
+                    let tag = document.createElement("button");
+                    tag.innerText = "All";
+                    tag.classList.add("tag");
+                    tag.onclick = ()=>{populateBlogs(response)};
+                    tagContainer.appendChild(tag);
+
+                    for(let i = 0; i < response.length; i++){
+                        for(let j = 0; j < response[i].tags.length; j++){
+                            if(tags.includes(response[i].tags[j]) === true) continue;
+
+                            tags.push(response[i].tags[j]);
+
+                            let tag = document.createElement("button");
+                            tag.innerText = response[i].tags[j];
+                            tag.classList.add("tag");
+                            tag.onclick = ()=>{populateBlogs(searchTags(response, response[i].tags[j]))};
+                            tagContainer.appendChild(tag);
+                        }
                     }
 
-                    for(let i = 0; i < items.length; i++){
-                        let card = template.cloneNode(true);
-                        card.href = `/gallery/${items[i]._id}`;
-                        card.children[0].innerText = items[i].title;
-                        card.children[1].src = items[i].images[0];
-                        card.children[1].alt = `${items[i].title} thumbnail`;
-                        container.appendChild(card);   
-                    }
-                }
+                    populateBlogs(response);
+                })
+                .catch((err)=>{
+                    console.log(err);
+                });
 
-                let searchTags = (galleries, tag)=>{
-                    let galleryList = [];
+            //Get gallery content
+            let populateGallery = (items)=>{
+                let container = document.getElementById("galleryContainer");
+                let template = document.getElementById("galleryCard").content.children[0];
 
-                    for(let i = 0; i < galleries.length; i++){
-                        for(let j = 0; j < galleries[i].tags.length; j++){
-                            if(galleries[i].tags[j].toLowerCase() === tag){
-                                galleryList.push(galleries[i]);
-                                break;
-                            }
-                        }
-                    }
+                while(container.children.length > 0){
+                    container.removeChild(container.firstChild);
+                }
 
-                    return galleryList;
+                for(let i = 0; i < items.length; i++){
+                    let card = template.cloneNode(true);
+                    card.href = `/gallery/${items[i]._id}`;
+                    card.children[0].innerText = items[i].title;
+                    card.children[1].src = items[i].images[0];
+                    card.children[1].alt = `${items[i].title} thumbnail`;
+                    container.appendChild(card);   
                 }
+            }
 
-                fetch("/gallery/retrieve")
-                    .then(response => response.json())
-                    .then((response)=>{
-                        let tagContainer = document.getElementById("galleryTags");
-                        let tags = [];
+            fetch("/gallery/retrieve")
+                .then(response => response.json())
+                .then((response)=>{
+                    let tagContainer = document.getElementById("galleryTags");
+                    let tags = [];
 
-                        populateGallery(response);
+                    populateGallery(response);
 
-                        let tag = document.createElement("button");
-                        tag.innerText = "All";
-                        tag.classList.add("tag");
-                        tag.onclick = ()=>{populateGallery(response)};
-                        tagContainer.appendChild(tag);
+                    let tag = document.createElement("button");
+                    tag.innerText = "All";
+                    tag.classList.add("tag");
+                    tag.onclick = ()=>{populateGallery(response)};
+                    tagContainer.appendChild(tag);
 
-                        for(let i = 0; i < response.length; i++){
-                            for(let j = 0; j < response[i].tags.length; j++){
-                                if(tags.includes(response[i].tags[j].toLowerCase()) === true) continue;
+                    for(let i = 0; i < response.length; i++){
+                        for(let j = 0; j < response[i].tags.length; j++){
+                            if(tags.includes(response[i].tags[j].toLowerCase()) === true) continue;
 
-                                tags.push(response[i].tags[j].toLowerCase());
+                            tags.push(response[i].tags[j].toLowerCase());
 
-                                let tag = document.createElement("button");
-                                tag.innerText = response[i].tags[j];
-                                tag.classList.add("tag");
-                                tag.onclick = ()=>{populateGallery(searchTags(response, response[i].tags[j].toLowerCase()))};
-                                tagContainer.appendChild(tag);
-                            }
+                            let tag = document.createElement("button");
+                            tag.innerText = response[i].tags[j];
+                            tag.classList.add("tag");
+                            tag.onclick = ()=>{populateGallery(searchTags(response, response[i].tags[j].toLowerCase()))};
+                            tagContainer.appendChild(tag);
                         }
-                    })
-                    .catch((err)=>{});
-
-                //Get "learn" content
-                fetch("/learn/courses/json")
-                    .then(response => response.json())
-                    .then((response)=>{
-                        let container = document.getElementById("learn");
-
-                        for(let i = 0; i < response.length; i++){
-                            let card = document.createElement("a");
-                            card.classList.add("card");
-                            card.href = `/learn/courses/${response[i]._id}`;
-                            container.appendChild(card);
-
-                            let h2 = document.createElement("h2");
-                            h2.innerText = response[i].title;
-                            card.appendChild(h2);
-
-                            let img = document.createElement("img");
-                            img.src = response[i].thumbNail;
-                            img.alt = `${response[i].title} thumbnail`;
-                            card.appendChild(img);
-                        }
-                    })
-                    .catch((err)=>{});
+                    }
+                })
+                .catch((err)=>{});
+
+            //Get "learn" content
+            fetch("/learn/courses/json")
+                .then(response => response.json())
+                .then((response)=>{
+                    let container = document.getElementById("learn");
+
+                    for(let i = 0; i < response.length; i++){
+                        let card = document.createElement("a");
+                        card.classList.add("card");
+                        card.href = `/learn/courses/${response[i]._id}`;
+                        container.appendChild(card);
+
+                        let h2 = document.createElement("h2");
+                        h2.innerText = response[i].title;
+                        card.appendChild(h2);
+
+                        let img = document.createElement("img");
+                        img.src = response[i].thumbNail;
+                        img.alt = `${response[i].title} thumbnail`;
+                        card.appendChild(img);
+                    }
+                })
+                .catch((err)=>{});
         </script>
     </body>
 </html>