added exe
This commit is contained in:
BIN
backend/Cookbook-v1_0.exe
Normal file
BIN
backend/Cookbook-v1_0.exe
Normal file
Binary file not shown.
@@ -1 +0,0 @@
|
||||
dfrg
|
@@ -1 +0,0 @@
|
||||
## 124
|
@@ -1,25 +1,21 @@
|
||||
{
|
||||
"name": "cookbook",
|
||||
"version": "0.4",
|
||||
"main": "server.js",
|
||||
"version": "1.0.0",
|
||||
"description": "With this express app you can create and manage recipies.",
|
||||
"bin": "server.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"start": "node server.js"
|
||||
"start": "node server.js",
|
||||
"build": "pkg . --targets node18-win-x64 --output Cookbook-v1_0.exe"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "Theis Gaedigk",
|
||||
"license": "ISC",
|
||||
"description": "",
|
||||
"dependencies": {
|
||||
"ejs": "^3.1.10",
|
||||
"express": "^5.1.0",
|
||||
"marked": "^15.0.12"
|
||||
"ejs": "^3.1.9",
|
||||
"express": "^4.18.2",
|
||||
"marked": "^12.0.2"
|
||||
},
|
||||
"pkg": {
|
||||
"assets": [
|
||||
"public/**/*",
|
||||
"views/**/*"
|
||||
"views/**/*",
|
||||
"routes/**/*"
|
||||
]
|
||||
}
|
||||
}
|
@@ -1,19 +1,32 @@
|
||||
// set static variables
|
||||
// static variables
|
||||
const express = require("express");
|
||||
const app = express();
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const marked = require("marked");
|
||||
|
||||
const basePath = process.pkg ? path.dirname(process.execPath) : __dirname;
|
||||
|
||||
app.set("view engine", "ejs");
|
||||
|
||||
// static files
|
||||
app.use(express.static(path.join(basePath, "public")));
|
||||
|
||||
app.use(express.urlencoded({ extended: true }));
|
||||
app.use(express.json());
|
||||
|
||||
app.get("/add", (req, res) => {
|
||||
res.render("addRecipe/index");
|
||||
});
|
||||
|
||||
app.get("/", (req, res) => {
|
||||
// script to sync recipes
|
||||
const recipesFolder = path.join(__dirname, "database/recipes");
|
||||
// sync recipes
|
||||
const recipesFolder = path.join(basePath, "database", "recipes");
|
||||
|
||||
if (!fs.existsSync(recipesFolder)) {
|
||||
fs.mkdirSync(recipesFolder, { recursive: true });
|
||||
}
|
||||
|
||||
fs.readdir(recipesFolder, (err, files) => {
|
||||
if (err) {
|
||||
return res.status(500).send("Error by reading recipe files!");
|
||||
@@ -31,43 +44,39 @@ app.get("/", (req, res) => {
|
||||
|
||||
res.render("index", { recipes });
|
||||
});
|
||||
|
||||
// script to render in markdown
|
||||
});
|
||||
|
||||
// middleware for add recipe
|
||||
app.use(express.urlencoded({ extended: true }));
|
||||
app.use(express.json());
|
||||
|
||||
// add recipe script
|
||||
// create recipe
|
||||
app.post("/add/create-recipe", (req, res) => {
|
||||
const { filename, content } = req.body;
|
||||
const recipesFolder = path.join(basePath, "database", "recipes");
|
||||
|
||||
const directory = path.join(__dirname, "database/recipes");
|
||||
|
||||
if (!fs.existsSync(directory)) {
|
||||
fs.mkdirSync(directory);
|
||||
if (!fs.existsSync(recipesFolder)) {
|
||||
fs.mkdirSync(recipesFolder, { recursive: true });
|
||||
}
|
||||
|
||||
const filePath = path.join(directory, `${filename}.txt`);
|
||||
const filePath = path.join(recipesFolder, `${filename}.txt`);
|
||||
|
||||
fs.writeFile(filePath, content, (err) => {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
return res
|
||||
.status(500)
|
||||
.console.error("Error by creating file")
|
||||
.send("Error by creating file. Please check browser console!");
|
||||
}
|
||||
|
||||
res.render("success", {
|
||||
filename: filename,
|
||||
filename,
|
||||
path: filePath,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// recipe router
|
||||
const recipeRouter = require("./routes/recipes");
|
||||
|
||||
app.use("/recipe", recipeRouter);
|
||||
|
||||
app.listen(3000);
|
||||
// start server
|
||||
app.listen(3000, () => {
|
||||
console.log("Server running at http://localhost:3000");
|
||||
});
|
||||
|
@@ -4,7 +4,6 @@
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Add recipe</title>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<main class="container">
|
||||
@@ -38,119 +37,119 @@
|
||||
</html>
|
||||
|
||||
<style>
|
||||
html {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "San Francisco",
|
||||
"Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||
}
|
||||
html {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "San Francisco", "Segoe UI",
|
||||
Roboto, Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #f5f5f7;
|
||||
color: #1d1d1f;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 2rem;
|
||||
}
|
||||
body {
|
||||
background-color: #f5f5f7;
|
||||
color: #1d1d1f;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 2rem;
|
||||
}
|
||||
|
||||
.container {
|
||||
background-color: #ffffff;
|
||||
padding: 2.5rem;
|
||||
border-radius: 20px;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05);
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
}
|
||||
.container {
|
||||
background-color: #ffffff;
|
||||
padding: 2.5rem;
|
||||
border-radius: 20px;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05);
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 1.8rem;
|
||||
margin-bottom: 1.5rem;
|
||||
font-weight: 600;
|
||||
text-align: center;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.8rem;
|
||||
margin-bottom: 1.5rem;
|
||||
font-weight: 600;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
label {
|
||||
display: block;
|
||||
margin-top: 1.2rem;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
label {
|
||||
display: block;
|
||||
margin-top: 1.2rem;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
input[type="text"],
|
||||
textarea {
|
||||
width: 100%;
|
||||
padding: 0.75rem 1rem;
|
||||
border: 1px solid #d1d1d6;
|
||||
border-radius: 12px;
|
||||
background-color: #f9f9fa;
|
||||
font-size: 1rem;
|
||||
transition: border 0.2s ease;
|
||||
}
|
||||
input[type="text"],
|
||||
textarea {
|
||||
width: 100%;
|
||||
padding: 0.75rem 1rem;
|
||||
border: 1px solid #d1d1d6;
|
||||
border-radius: 12px;
|
||||
background-color: #f9f9fa;
|
||||
font-size: 1rem;
|
||||
transition: border 0.2s ease;
|
||||
}
|
||||
|
||||
input[type="text"]:focus,
|
||||
textarea:focus {
|
||||
border-color: #007aff;
|
||||
outline: none;
|
||||
background-color: #fff;
|
||||
}
|
||||
input[type="text"]:focus,
|
||||
textarea:focus {
|
||||
border-color: #007aff;
|
||||
outline: none;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
textarea {
|
||||
resize: vertical;
|
||||
min-height: 150px;
|
||||
}
|
||||
textarea {
|
||||
resize: vertical;
|
||||
min-height: 150px;
|
||||
}
|
||||
|
||||
small {
|
||||
display: block;
|
||||
margin-top: 0.4rem;
|
||||
color: #6e6e73;
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
small {
|
||||
display: block;
|
||||
margin-top: 0.4rem;
|
||||
color: #6e6e73;
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
|
||||
.button-group {
|
||||
margin-top: 2rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 1rem;
|
||||
}
|
||||
.button-group {
|
||||
margin-top: 2rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
button,
|
||||
.back-btn {
|
||||
padding: 0.75rem 1.5rem;
|
||||
border: none;
|
||||
border-radius: 12px;
|
||||
font-size: 1rem;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease-in-out;
|
||||
text-decoration: none;
|
||||
text-align: center;
|
||||
}
|
||||
button,
|
||||
.back-btn {
|
||||
padding: 0.75rem 1.5rem;
|
||||
border: none;
|
||||
border-radius: 12px;
|
||||
font-size: 1rem;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease-in-out;
|
||||
text-decoration: none;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
button[type="submit"] {
|
||||
background-color: #007aff;
|
||||
color: white;
|
||||
}
|
||||
button[type="submit"] {
|
||||
background-color: #007aff;
|
||||
color: white;
|
||||
}
|
||||
|
||||
button[type="submit"]:hover {
|
||||
background-color: #005ecb;
|
||||
}
|
||||
button[type="submit"]:hover {
|
||||
background-color: #005ecb;
|
||||
}
|
||||
|
||||
.back-btn {
|
||||
background-color: #e5e5ea;
|
||||
color: #1d1d1f;
|
||||
}
|
||||
.back-btn {
|
||||
background-color: #e5e5ea;
|
||||
color: #1d1d1f;
|
||||
}
|
||||
|
||||
.back-btn:hover {
|
||||
background-color: #d1d1d6;
|
||||
}
|
||||
</style>
|
||||
.back-btn:hover {
|
||||
background-color: #d1d1d6;
|
||||
}
|
||||
</style>
|
||||
|
Reference in New Issue
Block a user