Compare commits

13 Commits
main ... work

Author SHA1 Message Date
906d6df5ae add docker file 2022-12-22 12:52:29 +03:00
ca0afdad2c redesign auth page 2022-11-12 13:53:25 +03:00
0cf2044506 add login page 2022-11-12 12:07:37 +03:00
2a54b37ead add login logout route 2022-11-11 18:53:57 +03:00
9d9d68e8d4 add requirements.txt 2022-11-11 18:48:50 +03:00
207e22d4f6 add download image button 2022-11-09 19:26:52 +03:00
6cad7d6ed6 main page worked 2022-11-09 19:17:41 +03:00
347f467735 add download func 2022-11-06 23:05:43 +03:00
de3e20e0cb renamed uploaded file 2022-11-06 15:01:37 +03:00
60f746b2ee add funct 2022-10-29 20:33:12 +03:00
32061c6804 add admin templates 2022-10-25 18:51:11 +03:00
de3d155249 addes redisignered templates 2022-10-24 12:58:14 +03:00
6a01aefc7a added admin page 2022-10-24 12:52:46 +03:00
58 changed files with 484 additions and 84 deletions

15
Dockerfile Normal file
View File

@@ -0,0 +1,15 @@
FROM python:3.11-slim-bullseye
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt
# copy project
COPY . /usr/src/app/
CMD ["python","app.py"]

176
app.py
View File

@@ -1,73 +1,179 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from flask import Flask, render_template, request, flash, redirect, url_for, send_file
from turtle import st
from flask import Flask, render_template, request, flash, redirect, url_for
from werkzeug.utils import secure_filename from werkzeug.utils import secure_filename
import os import os
from models import db import secrets
from models import PrintedDetal
import logging import logging
from models import PrintedDetal from models import db, PrintedDetal
from datetime import datetime
logging.basicConfig(filename='app.log', encoding='utf-8', level=logging.DEBUG) logging.basicConfig(filename='app.log', encoding='utf-8', level=logging.DEBUG)
UPLOAD_IMG_FOLDER = os.path.join('static', 'img', 'uploads')
UPLOAD_STL_FOLDER = os.path.join('static', 'stl')
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'stl'}
app = Flask(__name__) app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['UPLOAD_FOLDER'] = UPLOAD_IMG_FOLDER app.config['UPLOAD_IMG_FOLDER'] = os.path.join('static', 'uploads', 'img')
app.config['UPLOAD_FOLDER2'] = UPLOAD_STL_FOLDER app.config['UPLOAD_STL_FOLDER'] = os.path.join('static', 'uploads', 'stl')
app.config['UPLOAD_SRC_FOLDER'] = os.path.join('static', 'uploads', 'src')
db.init_app(app) db.init_app(app)
def getlldb():
allDetals = {}
detalsQuery = PrintedDetal.query.all()
for detal in detalsQuery:
detals = {}
detals['id'] = detal.id
detals['img'] = detal.img
detals['stl'] = detal.stl
detals['src'] = detal.src
detals['isprinted'] = detal.isprinted
detals['date'] = detal.dateadd
allDetals[detal.id] = detals
return allDetals
@app.route("/") @app.route("/")
def index(): def index():
detals = PrintedDetal.query.all()
return render_template("index.html", detals=detals) getall = getlldb()
return render_template("index.html", detals=getall)
@app.route('/login')
def login():
pass
@app.route('/logout')
def logout():
pass
@app.route("/admin", methods=['GET', 'POST']) @app.route("/admin", methods=['GET', 'POST'])
def admipage(): def admipage():
logging.debug("adminpage loaded") return render_template("adminpage.html")
@app.route('/uploader', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST': if request.method == 'POST':
logging.debug("POST QUERY loaded") image_file = request.files['img']
image_file = request.files['images']
stl_file = request.files['stl'] stl_file = request.files['stl']
src_file = request.files['src']
logging.debug(image_file) if len(image_file.filename) > 0:
logging.debug(stl_file) filename = image_file.filename.split('.')
image_file.filename = secrets.token_hex(15) + '.' + filename[-1]
image_file.save(os.path.join(
app.config['UPLOAD_IMG_FOLDER'], image_file.filename))
image_file.save(os.path.join(app.config['UPLOAD_FOLDER'], image_file.filename)) if len(stl_file.filename) > 0:
stl_file.save(os.path.join(app.config['UPLOAD_FOLDER2'], stl_file.filename)) filename = stl_file.filename.split('.')
stl_file.filename = secrets.token_hex(15) + '.' + filename[-1]
stl_file.save(os.path.join(
app.config['UPLOAD_STL_FOLDER'], stl_file.filename))
if len(src_file.filename) > 0:
filename = src_file.filename.split('.')
src_file.filename = secrets.token_hex(15) + '.' + filename[-1]
src_file.save(os.path.join(
app.config['UPLOAD_SRC_FOLDER'], src_file.filename))
if request.form.get('isprinted') == 'on': if request.form.get('isprinted') == 'on':
isprinered = True isprinered = True
else: else:
isprinered = False isprinered = False
detal = PrintedDetal(imgpath=image_file.filename, detal = PrintedDetal(img=image_file.filename,
stlpath=stl_file.filename, stl=stl_file.filename,
isprinted=isprinered) src=src_file.filename,
isprinted=isprinered,
datead=datetime.now().strftime('%d.%m.%Y'))
db.session.add(detal) db.session.add(detal)
db.session.commit() db.session.commit()
return render_template("adminpage.html") return redirect(url_for('admipage'))
@app.route('/editcard')
def editcadrd():
allDetals = {}
detalsQuery = PrintedDetal.query.all()
for detal in detalsQuery:
detals = {}
detals['id'] = detal.id
detals['img'] = detal.img
detals['stl'] = detal.stl
detals['src'] = detal.src
detals['isprinted'] = detal.isprinted
detals['date'] = detal.dateadd
allDetals[detal.id] = detals
return render_template('editcard.html', detals=allDetals)
@app.route('/editcard/<id>')
def editcard2(id):
data = PrintedDetal.query.get(id)
print(data.id)
return render_template('cardupdate.html', data=data.id)
@app.route('/updater', methods=['POST'])
def updater():
if request.method == 'POST':
id = request.form.get('dataid')
detal = PrintedDetal.query.get(id)
image_file = request.files['img']
stl_file = request.files['stl']
src_file = request.files['src']
if len(image_file.filename) > 0:
filename = image_file.filename.split('.')
image_file.filename = secrets.token_hex(15) + '.' + filename[-1]
image_file.save(os.path.join(
app.config['UPLOAD_IMG_FOLDER'], image_file.filename))
detal.img = image_file.filename
if len(stl_file.filename) > 0:
filename = stl_file.filename.split('.')
stl_file.filename = secrets.token_hex(15) + '.' + filename[-1]
stl_file.save(os.path.join(
app.config['UPLOAD_STL_FOLDER'], stl_file.filename))
detal.stl = stl_file.filename
if len(src_file.filename) > 0:
filename = src_file.filename.split('.')
src_file.filename = secrets.token_hex(15) + '.' + filename[-1]
src_file.save(os.path.join(
app.config['UPLOAD_SRC_FOLDER'], src_file.filename))
detal.src = src_file.filename
if request.form.get('isprinted') == 'on':
isprinered = True
else:
isprinered = False
detal.isprinted = isprinered
db.session.commit()
return redirect(url_for('editcadrd'))
return "123"
else:
return render_template("adminpage.html")
@app.route('/uploader', methods = ['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['file']
f.save(secure_filename(f.filename))
return 'file uploaded successfully'
if __name__ == "__main__": if __name__ == "__main__":
app.run(host="0.0.0.0", debug="True", port="3800") app.run(host="0.0.0.0", debug="True", port="3800")

View File

@@ -6,6 +6,9 @@ db = SQLAlchemy()
class PrintedDetal(db.Model): class PrintedDetal(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True) id = db.Column(db.Integer, primary_key=True, autoincrement=True)
imgpath = db.Column(db.String(3000)) img = db.Column(db.String(3000))
stlpath = db.Column(db.String(3000)) stl = db.Column(db.String(3000))
src = db.Column(db.String(3000))
isprinted = db.Column(db.Boolean()) isprinted = db.Column(db.Boolean())
dateadd = db.Column(db.String(11))

BIN
requirements.txt Normal file

Binary file not shown.

View File

@@ -1,56 +1,62 @@
body { body {
margin: 0; margin: 0;
padding: 0; padding: 0;
background-color: #dcf3d0; background-color: #dcf3d0;
} }
header{ header {
box-shadow: 0px 5px 10px 2px rgba(34, 60, 80, 0.2); box-shadow: 0px 5px 10px 2px rgba(34, 60, 80, 0.2);
} }
.h1header { .h1header {
margin: 0; margin: 0;
background-color: #b5e9e9; background-color: #b5e9e9;
height: 100px; height: 100px;
line-height: 100px; line-height: 100px;
text-align: center; text-align: center;
color: #034956; color: #034956;
} }
.uploadform{ .uploadform {
margin: 30px; margin: 30px;
} }
.formsrow{ .formsrow {
border: #034956; border: #034956;
} }
input[type="file"]::file-selector-button { input[type="file"]::file-selector-button {
background-color:#ffe1d0; background-color: #ffe1d0;
padding: 0.5em; padding: 0.5em;
border: thin solid #f26722; border: thin solid #f26722;
border-radius: 2px; border-radius: 2px;
} }
input[type="file"]::form-file-button:hover { input[type="file"]::file-selector-button:hover {
background-color: #fff1b5; background-color: #fff1b5;
color: #034956; color: #034956;
border: 2px solid #034956; border: 1px solid #034956;
cursor: pointer;
} }
.card {
background-color: #fef6dd;
border-radius: 12px;
box-shadow: 0px 5px 10px 2px rgba(34, 60, 80, 0.2);
}
.btn { .btn {
margin-top: 15px; margin-top: 15px;
background-color: #ffe1d0; background-color: #ffe1d0;
color: #034956; color: #034956;
border: 2px solid #f26722; border: 2px solid #f26722;
border-radius: 5px;
width: 100%; width: 100%;
} }
@@ -61,3 +67,16 @@ input[type="file"]::form-file-button:hover {
border: 2px solid #034956; border: 2px solid #034956;
} }
.formblock {
width: 100%;
border: 2px solid #034956;
border-radius: 5px;
}
#printed {
width: 20px;
height: 20px;
accent-color: #f26722;
}

View File

@@ -4,7 +4,7 @@ body {
background-color: #dcf3d0; background-color: #dcf3d0;
} }
header{ header {
box-shadow: 0px 5px 10px 2px rgba(34, 60, 80, 0.2); box-shadow: 0px 5px 10px 2px rgba(34, 60, 80, 0.2);
} }
@@ -22,7 +22,7 @@ header{
margin-top: 20px; margin-top: 20px;
} }
.col-md-4{ .col-md-4 {
margin-bottom: 25px; margin-bottom: 25px;
} }
@@ -30,8 +30,17 @@ header{
background-color: #fef6dd; background-color: #fef6dd;
border-radius: 12px; border-radius: 12px;
box-shadow: 0px 5px 10px 2px rgba(34, 60, 80, 0.2); box-shadow: 0px 5px 10px 2px rgba(34, 60, 80, 0.2);
height: 450px;
} }
.card-edit {
height: 400px;
}
.card-img-top{
height: 250px;
}
.btn { .btn {
@@ -50,11 +59,18 @@ header{
} }
.card-img-top{ .card-img-top {
padding: 10px; padding: 10px;
border-radius: 18px; border-radius: 18px;
} }
h5{ h5 {
font-size: 17px; font-size: 17px;
} }
.mobile-margin {
margin-bottom: 10px;
padding: 10px;
}

BIN
static/img/Auth.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 482 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 585 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

56
templates/adduser.html Normal file
View File

@@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static',filename='css/style.css')}}">
<title>3d Detals</title>
</head>
<body>
<header>
<h1 class="h1header"> Каталог печатных 3д деталей </h1>
</header>
<div class="container">
<div class="row">
<div class="col-md-4 d-flex aligns-items-center mx-auto">
<div class="card card-login mobile-margin">
<img class="card-img-top" src="{{url_for('static', filename='img/Auth.jpg')}}">
<form method="POST" action="/auth">
<div class="col mb-3">
<label for="exampleInputEmail1" class="form-label">Введите логин</label>
<input type="text" class="form-control" name="login">
</div>
<div class="col mb-3">
<label>Введите пароль</label>
<input type="password" class="form-control" name="passwd">
</div>
<button type="submit" class="btn btn-primary">Авторизоваться</button>
</form>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script>
</body>
</html>

39
templates/adminpage.html Normal file
View File

@@ -0,0 +1,39 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static', filename='css/adminpage.css')}}">
<title>3d Detals adminka</title>
</head>
<body>
<header>
<h1 class="h1header"> Административная панель </h1>
</header>
<div class="container">
<div class="row ">
<form method="post" enctype=multipart/form-data action="/uploader">
<label class=" d-block p-2">Выберите изображение </label>
<input class=" formblock d-block p-2" type="file" name="img" />
<label class=" d-block p-2">Выберите исходный file </label>
<input class=" formblock d-block p-2" type="file" name="src" />
<label class=" d-block p-2">Выберите stl file </label>
<input class=" formblock d-block p-2" type="file" name="stl" />
<label > Напечатано </label>
<input type="checkbox" class="bxigchekcbox" id="printed" name="isprinted">
<input class="btn d-block p-2" type="submit" value="Upload">
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script>
</body>
</html>

40
templates/cardupdate.html Normal file
View File

@@ -0,0 +1,40 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static', filename='css/adminpage.css')}}">
<title>3d Detals adminka</title>
</head>
<body>
<header>
<h1 class="h1header"> Обновление карточки {{data['id']}}</h1>
</header>
<div class="container">
<div class="row ">
<form method="post" enctype=multipart/form-data action="/updater">
<label class=" d-block p-2">Выберите изображение </label>
<input class=" formblock d-block p-2" type="file" name="img" />
<label class=" d-block p-2">Выберите исходный file </label>
<input class=" formblock d-block p-2" type="file" name="src" />
<label class=" d-block p-2">Выберите stl file </label>
<input class=" formblock d-block p-2" type="file" name="stl" />
<label > Напечатано </label>
<input type="checkbox" class="bxigchekcbox" id="printed" name="isprinted">
<input class="btn d-block p-2" type="submit" value="Обновить">
<input name="dataid" type="hidden" value="{{data}}" >
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script>
</body>
</html>

48
templates/editcard.html Normal file
View File

@@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static',filename='css/style.css')}}">
<title>3d Detals</title>
</head>
<body>
<header>
<h1 class="h1header"> Каталог печатных 3д деталей </h1>
</header>
<div class="container">
<div class="row">
{% for key, value in detals.items() %}
<div class="col-md-4">
<div class="card card-edit mobile-margin">
<img class="card-img-top" src="{{url_for('static', filename='uploads/img/' + value['img'])}}">
<div class="card-body">
<dv class="row">
<div class="col">
<a href="/editcard/{{value['id']}}" class="btn btn-block mobile-margin"> Изменить </a>
</div>
<div class="row">
</div>
</div>
</div>
</div>
{%endfor%}
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script>
</body>
</html>

View File

@@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous"> integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css')}}"> <link rel="stylesheet" href="{{ url_for('static',filename='css/style.css')}}">
<title>3d Detals</title> <title>3d Detals</title>
</head> </head>
<body> <body>
@@ -17,40 +17,43 @@
<div class="container"> <div class="container">
<div class="row"> <div class="row">
{% for i in range(10) %} {% for key, value in detals.items() %}
<div class="col-md-4"> <div class="col-md-4">
<div class="card"> <div class="card mobile-margin">
<img class="card-img-top" src="{{ url_for('static', filename='img/{{i}}.jpg')}} " alt="1 image"> <img class="card-img-top" src="{{url_for('static', filename='uploads/img/' + value['img'])}}">
<div class="card-body"> <div class="card-body">
<dv class="row"> <dv class="row">
<div class="col"> <div class="col">
<button class="btn btn-block">Скачать исходник</button> <a href="{{url_for('static', filename='uploads/img/' + value['img'])}}" class="btn btn-block mobile-margin" download>Скачать изображение </a>
</div> </div>
<div class="col"> <div class="col">
<button class="btn btn-block">Скачать stl </button> <a href="{{url_for('static', filename='uploads/src/' + value['src'])}}" class="btn btn-block mobile-margin" download >Скачать исходник</a>
</div>
<div class="col">
<a href="{{url_for('static', filename='uploads/stl/' + value['stl'])}}" class="btn btn-block mobile-margin" download>Скачать stl </a>
</div> </div>
<div class="row"> <div class="row">
<div class="col d-flex justify-content-center"> <div class="col d-flex justify-content-center">
<input class="form-check-input" type="checkbox" value="" id="flexCheckDefault"> <input class="form-check-input" type="checkbox" {{'checked="checked"' if value['isprinted']==1 else ""}} id="flexCheckDefault" disabled>
<label class="form-check-label" for="flexCheckDefault"> <label> Напечатано </label>
Напечатано
</label>
</div> </div>
<div class="col d-flex justify-content-center"> <div class="col d-flex justify-content-center">
<h5> {{ i }} </h5> <h5> {{value['dateadd']}}</h5>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{%endfor%} {%endfor%}
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script> crossorigin="anonymous"></script>

55
templates/login.html Normal file
View File

@@ -0,0 +1,55 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static',filename='css/style.css')}}">
<title>3d Detals</title>
</head>
<body>
<header>
<h1 class="h1header"> Каталог печатных 3д деталей </h1>
</header>
<div class="container container-login d-flex h-100 ">
<div class="row d-flex justify-content-center ">
<div class="col-md-4">
<div class="card align-middle mobile-margin">
<div class="card-body text-center">
<dv class="row">
<h2 class="fw-bold mb-2 text-uppercase">Авторизация</h2>
<p class="mb-5">Введите логин и пароль</p>
<div class="form-outline form-white mb-4">
<input type="email" id="typeEmailX" class="form-control form-control-lg" />
<label class="form-label" for="typeEmailX">Email</label>
</div>
<div class="form-outline form-white mb-4">
<input type="password" id="typePasswordX" class="form-control form-control-lg" />
<label class="form-label" for="typePasswordX">Password</label>
</div>
<div class="col">
<a href="" class="btn btn-block mobile-margin" download>Авторизоваться </a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script>
</body>
</html>