This commit is contained in:
relaxed 2024-08-18 03:34:33 +05:00
commit 8851786e67
353 changed files with 36724 additions and 0 deletions

4
.dockerignore Normal file
View File

@ -0,0 +1,4 @@
.dockerignore
makefile
README.md
.secrets

0
.gitignore vendored Normal file
View File

4
.secrets Executable file
View File

@ -0,0 +1,4 @@
for /adminsystemdb
login 1w05h7py180p4h10g
password fos2g5i47tt90n1p

17
Dockerfile Executable file
View File

@ -0,0 +1,17 @@
FROM python:alpine
EXPOSE 80
WORKDIR /app
COPY . .
RUN python3 -m venv venv
RUN venv/bin/pip3 install django==5.0
RUN venv/bin/python3 manage.py migrate
RUN venv/bin/python3 manage.py makemigrations
CMD [ "venv/bin/python3", "manage.py", "runserver", "0.0.0.0:80", "--insecure" ]

0
README.md Executable file
View File

0
adminsystemdb/__init__.py Executable file
View File

5
adminsystemdb/admin.py Executable file
View File

@ -0,0 +1,5 @@
from django.contrib import admin
from .models import Poseters
# Register your models here.
admin.site.register(Poseters)

6
adminsystemdb/apps.py Executable file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class AdminsystemdbConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'adminsystemdb'

View File

@ -0,0 +1,25 @@
# Generated by Django 4.1.6 on 2023-04-17 06:09
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Poseters',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('papka', models.CharField(max_length=20, verbose_name='papka')),
('title', models.TextField(verbose_name='tilte')),
('authror', models.TextField(verbose_name='author')),
('date', models.CharField(max_length=40, verbose_name='date')),
('content', models.TextField(verbose_name='render content')),
],
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 4.1.6 on 2023-04-17 07:50
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adminsystemdb', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='poseters',
name='desc',
field=models.TextField(default=str, verbose_name='desctiption'),
preserve_default=False,
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 4.1.6 on 2023-04-17 07:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adminsystemdb', '0002_poseters_desc'),
]
operations = [
migrations.AlterField(
model_name='poseters',
name='authror',
field=models.TextField(blank=True, verbose_name='author'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 4.1.6 on 2023-04-22 19:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adminsystemdb', '0003_alter_poseters_authror'),
]
operations = [
migrations.AddField(
model_name='poseters',
name='img_preview',
field=models.TextField(blank=True, verbose_name='img_preview'),
),
]

View File

13
adminsystemdb/models.py Executable file
View File

@ -0,0 +1,13 @@
from django.db import models
# Create your models here.
class Poseters(models.Model):
papka = models.CharField("papka", max_length=20)
title = models.TextField("tilte")
authror = models.TextField("author", blank=True)
date = models.CharField("date", max_length=40)
content = models.TextField("render content")
desc = models.TextField("desctiption")
img_preview = models.TextField("img_preview", blank=True)
def __str__(self) -> str:
return self.title

View File

@ -0,0 +1,64 @@
const form = document.querySelector("form");
let list_preview = "[";
let postname = "";
let authtor = "";
form.addEventListener("submit", (e) => {
e.preventDefault();
const foromdata = new FormData(form);
for (intem of foromdata) {
console.log(intem[0], intem[1]);
}
fetch("get_res", {
method: "POST",
body: foromdata,
})
.then((res) => res.json())
.then((res) => {
document.getElementById("header").value = "";
document.getElementById("text").value = "";
document.getElementById("img").value = "";
document.getElementById("log").value += res["text"];
list_preview += res["list_preview"];
document.getElementById("post_namee").value = res["postname"];
document.getElementById("authtorr").value = res["authtor"];
document.getElementById("to_list").value = list_preview + "]";
console.log(list_preview);
foromdata.append("tolist", list_preview + "]");
fetch("getlist", {
method: "POST",
body: foromdata,
})
.then((res) => res.json())
.then((res) => {
console.log(list_preview);
});
});
});
function go_to_preview() {
try {
const foromdata = new FormData(form);
foromdata.append("tolist", list_preview + "]");
fetch("get_res/preview", {
method: "POST",
body: foromdata,
});
} catch (error) {
console.log(error);
}
}
function clear_all() {
list_preview = "[";
document.getElementById("header").value = "";
document.getElementById("text").value = "";
document.getElementById("log").value = "";
document.getElementById("post_name").value = "";
document.getElementById("post_name").value = "";
document.getElementById("desc").value = "";
document.getElementById("img").value = "";
document.getElementById("authtor").value = "";
}

View File

@ -0,0 +1,666 @@
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
:focus {
outline: 0;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
display: block;
}
body {
line-height: 1;
}
ol,
ul {
list-style: none;
}
blockquote,
q {
quotes: none;
}
blockquote:before,
blockquote:after,
q:before,
q:after {
content: "";
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-results-button,
input[type="search"]::-webkit-search-results-decoration {
-webkit-appearance: none;
-moz-appearance: none;
}
input[type="search"] {
-webkit-appearance: none;
-moz-appearance: none;
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
textarea {
overflow: auto;
vertical-align: top;
resize: vertical;
}
audio,
canvas,
video {
display: inline-block;
*display: inline;
*zoom: 1;
max-width: 100%;
}
audio:not([controls]) {
display: none;
height: 0;
}
[hidden] {
display: none;
}
html {
font-size: 100%; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
-ms-text-size-adjust: 100%; /* 2 */
}
a:focus {
outline: thin dotted;
}
a:active,
a:hover {
outline: 0;
}
img {
border: 0; /* 1 */
-ms-interpolation-mode: bicubic; /* 2 */
}
figure {
margin: 0;
}
form {
margin: 0;
}
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
legend {
border: 0; /* 1 */
padding: 0;
white-space: normal; /* 2 */
*margin-left: -7px; /* 3 */
}
button,
input,
select,
textarea {
font-size: 100%; /* 1 */
margin: 0; /* 2 */
vertical-align: baseline; /* 3 */
*vertical-align: middle; /* 3 */
}
button,
input {
line-height: normal;
}
button,
select {
text-transform: none;
}
button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
*overflow: visible; /* 4 */
}
button[disabled],
html input[disabled] {
cursor: default;
}
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
*height: 13px; /* 3 */
*width: 13px; /* 3 */
}
input[type="search"] {
-webkit-appearance: textfield; /* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box; /* 2 */
box-sizing: content-box;
}
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
textarea {
overflow: auto; /* 1 */
vertical-align: top; /* 2 */
}
table {
border-collapse: collapse;
border-spacing: 0;
}
html,
button,
input,
select,
textarea {
color: #222;
}
::-moz-selection {
background: #b3d4fc;
text-shadow: none;
}
::selection {
background: #b3d4fc;
text-shadow: none;
}
img {
vertical-align: middle;
}
fieldset {
border: 0;
margin: 0;
padding: 0;
}
textarea {
resize: vertical;
}
.chromeframe {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
}
html {
box-sizing: border-box;
height: 100%;
scroll-behavior: smooth;
}
*,
*::after,
*::before {
box-sizing: inherit;
}
body {
display: flex;
flex-direction: column;
font-family: "Roboto", sans-serif;
font-size: 16px;
line-height: 1.2;
height: 100%;
}
.container {
width: 100%;
max-width: 1000px;
margin: 0 auto;
height: 100%;
padding: 0 0px;
text-align: center;
}
.header {
flex: 0 0 auto;
background-color: #212429;
margin-top: 75px;
}
.header h1 {
text-align: center;
color: #fff;
font-size: 30px;
font-weight: bold;
}
.main {
background-color: white;
flex: 1 0 auto;
}
.footer {
background-color: #212429;
flex: 0 0 auto;
}
.content {
padding: 75px 0;
font-size: 25px;
}
.n_bar{
max-width: 175px;
width: 300px;
height: 100%;
margin: 0;
float: left;
font-size: auto;
}
.in_content{
max-width: 1000px;
width: 650px;
margin-left: 50px;
/* display: inline; */
height: 100%;
text-align: left;
float: left;
}
.button2 {
align-items: center;
background-color: rgba(255, 255, 255, 0.7);
color: #000000;
cursor: pointer;
display: flex;
font-family: ui-sans-serif,system-ui,-apple-system,system-ui,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";
font-size: 12px;
font-weight: 700;
line-height: 1.5;
text-decoration: none;
text-transform: uppercase;
outline: 0;
border: 0;
/* padding: 1rem; */
/* margin-bottom: 20px; */
margin-top: 20px;
}
.button2:before {
background-color: #000000;
content: "";
display: inline-block;
height: 1px;
margin-right: 0px;
transition: all .42s cubic-bezier(.25,.8,.25,1);
width: 0;
}
.button2:hover:before {
background-color: #000000;
width: 3rem;
}
.gkod_team_label {
font-size: 50px;
}
p {
margin-bottom: 40px;
}
.logo_img {
width: auto;
height: 70px;
margin-bottom: 40px;
}
.title_img{
margin-top: 50px;
max-width: 100%;
}
.footer .content {
color: #80808080;
}
.navbar {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 75px;
background: white;
border-bottom: 2px solid #e2e8f0;
/* #252850; */
}
.navbar__wrap {
display: flex;
justify-content: space-between;
height: 100%;
}
.hamb {
display: none;
}
.popup {
display: none;
}
.logo {
text-decoration: none;
color: #fff;
font-size: 20px;
font-weight: bold;
text-transform: uppercase;
display: flex;
align-items: center;
}
.menu > li > a {
text-decoration: none;
}
.navbar__wrap .menu {
display: none;
}
.navbar__wrap .menu > li {
display: flex;
align-items: stretch;
}
.navbar__wrap .menu > li > a {
display: flex;
align-items: center;
padding: 0 20px;
/* color: rgba(255, 255, 255, 0.7); */
color: #000000;
}
.navbar__wrap .menu > li > a:hover {
/* color: rgba(255, 255, 255, 1); */
/* color: #252850; */
background-color: #252850;
color: white;
}
.menu2 > li > a {
text-decoration: none;
}
.navbar__wrap .menu2 {
display: flex;
}
.navbar__wrap .menu2 > li {
display: flex;
align-items: stretch;
}
.navbar__wrap .menu2 > li > a {
display: flex;
align-items: center;
padding: 0 20px;
/* color: rgba(255, 255, 255, 0.7); */
color: #000000;
}
.navbar__wrap .menu2 > li > a:hover {
/* color: rgba(255, 255, 255, 1); */
/* color: #252850; */
background-color: #252850;
color: white;
}
.title_logo:hover {
cursor: pointer;
}
/* .more_butt{
width: 150px;
height: 35px;
background-color: rgba(107, 107, 107, 0.5);
color: white;
border-radius: 15px;
border-color: rgba(107, 107, 107);
font-size: 20px;
margin-top: 20px;
}
.more_butt:hover{
background-color: #C89365;
color: black;
} */
.more_butt {
margin-top: 20px;
margin-bottom: 20px;
width: 200px;
background-color: #252850;
font-size: 15px;
/* background: transparent; */
/* padding: 1em 1.5em; */
/* #C89365; */
padding: 10px 20px;
color: #ffffff;
text-transform: uppercase;
transition: .5s ease;
border: none;
}
.img_content{
border-radius: 15px;
border-color: rgba(107, 107, 107);
border: 2px;
margin-top: 20px;
height: auto;
width: 100%;
}
.gkod_team_label {
font-size: 30px;
}
.selected{
background-color: #252850;
}
.card {
width: 100%;
max-height: 300px;
height: 300px;
text-align: center;
background-color: #C89365;
}
.card_img{
width: 50%;
height: 300px;
float: left;
}
.card_text{
width: 50%;
max-height: 300px;
height: 300px;
float: left;
display: flex;
align-items: center;
}
.card_in_img{
width: auto;
height: 100%;
float: left;
}
.card_in_text{
height: auto;
margin: 0 auto;
font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
padding-left: 14px;
padding-right: 14px;
padding-top: 14px;
padding-bottom: 14px;
font-size: 22px;
}

BIN
adminsystemdb/static/tmp/z10.JPG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 KiB

BIN
adminsystemdb/static/tmp/zz10.JPG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 KiB

View File

@ -0,0 +1,254 @@
{% load static %}
<!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 rel="stylesheet" href="{% static 'loginedtest/style.css' %}">
<link rel="stylesheet" href="{% static 'first/style.css' %}" />
<title>Preview</title>
</head>
<body>
<nav class="navbar">
<div class="container">
<div class="navbar__wrap">
<div class="hamb">
<div class="hamb__field" id="hamb">
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
</div>
</div>
<div class="coltxt" onclick="window.location.href='{% url 'home' %}'">
<div style="width: 100%; font-size: 30px; align-self: center; height: 30px;" class="cool_text">
<div id="one" style="margin-left: 10px; padding-left: 10px;">E</div>
<div id="two"><div id="twoo">КАТЕРИНБУРГ</div></div>
<div id="three" style="color: blue;">G</div>
<div id="four"><div id="fourr">UIDE</div></div>
</div>
</div>
<div class="mobile_coltxt" onclick="window.location.href='/'">
<label>EKB</label><label style="color: blue; padding-left: 0px; margin-left: 10px; margin-right: 10px;">GUIDE</label>
</div>
<ul class="menu" id="menu">
<li>
<span class="activate_dropdown" onclick="window.location.href='{% url 'history' %}'" {% if papka == 'history'%}style="background-color: rgba(75, 75, 225); color: white;"{% endif%}><label style="color:blue">И</label>стория</span>
<div class="moving_dropdown">
<div class="move_me_content">
{% block history_dropdown %}{% endblock %}
</div>
</div>
</li>
<li>
<span class="activate_dropdown" onclick="window.location.href='{% url 'placess' %}'" {% if papka == 'places'%}style="background-color: rgba(75, 75, 225); color: white;"{% endif%}><label style="color:blue">М</label>еста</span>
<div class="moving_dropdown">
<div class="move_me_content">
{% block places_dropdown %}{% endblock %}
</div>
</div>
</li>
<li>
<span class="activate_dropdown" onclick="window.location.href='{% url 'celebrity' %}'" {% if papka == 'celebrity'%}style="background-color: rgba(75, 75, 225); color: white;"{% endif%}><label style="color:blue">З</label>наменитости</span>
<div class="moving_dropdown">
<div class="move_me_content">
{% block celebrity_dropdown %}{% endblock %}
</div>
</div>
</li>
<li>
<span class="activate_dropdown" onclick="window.location.href='{% url 'theaters_and_music' %}'" {% if papka == 'theaters_and_music'%}style="background-color: rgba(75, 75, 225); color: white;"{% endif%}><label style="color:blue">Т</label>еатры и музыка</span>
<div class="moving_dropdown">
<div class="move_me_content">
{% block theaters_and_music_dropdown %}{% endblock %}
</div>
</div>
</li>
</ul>
</div>
</div>
</nav>
<div class="popup" id="popup"><ul class="menu" id="menu">
<li style="width: 100%; justify-content: center;">
<div class="dropdown" style="width: 100%;">
<button style=" border: none; background-color: white;width: 100%;
display: flex;
justify-content: center;
padding: 20px 0;
font-size: 20px;
font-weight: bold;
color: black;
border-top: 2px solid #e2e8f0;
border-bottom: 2px solid #e2e8f0;
margin-bottom: 10px;">test dropdown menu</button>
<div class="dropdown-content" style="background-color: white;">
<a href="/history">history</a>
<a href="/places">places</a>
<a href="/celebrities">celebrities</a>
</div>
</div>
</li>
<li><a href="/history">История</a></li>
<li><a href="/places">Места</a></li>
<li><a href="/celebrities">Знаменитости</a></li>
<li><a href="/theaters">Театры и музыка</a></li>
<li style="width: 100%; justify-content: center;">
<div class="dropdown" style="width: 100%;">
<button style=" border: none; background-color: white;width: 100%;
display: flex;
justify-content: center;
padding: 20px 0;
font-size: 20px;
font-weight: bold;
color: black;
border-top: 2px solid #e2e8f0;
border-bottom: 2px solid #e2e8f0;
margin-bottom: 10px;">test dropdown menu</button>
<div class="dropdown-content">
<a href="/history">history</a>
<a href="/places">places</a>
<a href="/celebrities">celebrities</a>
</div>
</div>
</li>
</ul>
</div>
<main class="main">
<div class="container">
<div class="content">
<div class="n_bar">
{% if testthing %}
{% for object in testthing %}
{% if object.0 == 'header' %}
{% if forloop.counter == 1 %}
<a href="#hh{{ forloop.counter }}" style="word-wrap: break-word; overflow-wrap: break-word; padding-top: 10px;" class="button2">{{object.1}}</a>
{% else %}
<a href="#hh{{ forloop.counter }}" style="word-wrap: break-word; overflow-wrap: break-word;" class="button2">{{object.1}}</a>
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
</div>
<div class="in_content">
<br>
<label style="font-size: 40px; width: 40px; margin-top: 20px; word-wrap: break-word;">{% if title %}{{title}}{% else %}Нету названия!{% endif %}
<hr style="max-width: auto; margin-left: 0px;"></label>
{% if testthing %}
{% for object in testthing %}
{% if object.0 == 'header' %}
<div id="hh{{ forloop.counter }}"></div>
{% if forloop.counter == 1 %}
<div>
{% else %}
<br>
<br>
<br>
{% endif %}
<label style="font-size: 40px; width: 40px; overflow-wrap: break-word;">{{object.1}}<hr style="max-width: auto; margin-left:0;"></label>
{% endif %}
{% if object.0 == 'text' %}
<br>
<br>
<pre style="max-width: 650px; word-wrap: break-word; text-align: left;font-size: 20px; white-space: pre-wrap;">{{object.1}}</pre>
{% endif %}
{% if object.0 == 'img' %}
{% for picture in object.1 %}
<img src="{% static picture %}" class="img_content" alt="imgg">
{% endfor %}
{% endif %}
{% endfor %}
{% endif %}
{% if authtor %}
<br>
<label>{{authtor}}</label>
{% endif %}
<br>
{{date}}
<br>
<br>
<form method="post" action="{% url 'posttodb' %}">
{% csrf_token %}
<textarea style="display: none;" name="papka">{{papka}}</textarea>
<textarea style="display: none;" name="title">{{title}}</textarea>
<textarea style="display: none;" name="authtor">{{authtor}}</textarea>
<textarea style="display: none;" name="date">{{date}}</textarea>
<textarea style="display: none;" name="testthing">{{testthing}}</textarea>
<textarea style="display: none;" name="desc">{{desc}}</textarea>
<textarea style="display: none;" name="img_preview">{{img_preview}}</textarea>
<button style="width: 200px;height: 40px; border: none; ">post</button>
</form>
<br>
<br>
</div>
</div>
</main>
<script src="{% static 'first/script.js' %}"></script>
<footer class="footer">
<div class="container" style="background: #212429;">
<div class="content">
<label class="gkod_team_label">Made by <label>Gkod</label> team</label
><br />
ggkkoodd@gmail.com
<br />
<br />
<label onclick="window.location.href='/coments'"
>Форма для обратной связи
<hr style="max-width: 320px"
/></label>
</div>
</div>
</footer>
</body>
</html>

View File

@ -0,0 +1,10 @@
<form method="post" action="{% url 'editdbsite' %}">
{% csrf_token %}
<label>user</label>
<input name="userrr">
<br>
<label>password</label>
<input name="password" type="password">
<br>
<button type="submit">login</button>
</form>

View File

@ -0,0 +1,192 @@
{% load static %}
<div></div>
<!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">
<style type="text/css">
* {
font-size: 20px;
}
button {
border: none;
width: 200px;
height: 40px;
margin-top: 10px;
background: black;
color: white;
}
.btnn, .file-upload > input[type='file'] {
border: none;
height: 40px;
margin-top: 10px;
}
.file-upload {
display: inline-block;
}
.file-upload > input[type='file'] {
top: 0;
right: 0;
height: 100%;
opacity: 0;
cursor: pointer;
width: 0;
height: 0;
}
.file-upload > span {
display: inline-block;
padding: 5px 10px;
background-color: #000;
border-radius: 5px;
border: 1px solid #aaa;
color: #fff;
cursor: pointer;
}
.post-container {
width: 600px;
height: 500px;
border: 2px solid black;
border-radius: 10px;
margin: 0 auto;
display: flex;
padding: 10px;
}
.post-container > div {
width: 250px;
height: 500px;
}
.post-container label {
font-size: 16px;
}
.post-container input, .post-container textarea {
width: 100%;
height: 35px;
margin-bottom: 10px;
padding: 5px;
border: 1px solid #ccc;
border-radius: 5px;
}
.post-container textarea {
height: 200px;
}
.preview-container {
width: 600px;
border: 2px solid black;
border-radius: 10px;
margin: 20px auto 0;
padding: 10px;
}
.preview-container label {
font-size: 16px;
}
.preview-container textarea, .preview-container select, .preview-container button {
margin-top: 10px;
width: 100%;
padding: 5px;
border: 1px solid #ccc;
border-radius: 5px;
}
.preview-container select {
height: 40px;
}
.preview-container button {
height: 40px;
background: black;
color: white;
border: none;
font-size: 20px;
}
</style>
<title>make post</title>
</head>
<body>
<div>
<form method="POST" action="{% url 'postres' %}" enctype="multipart/form-data">
{% csrf_token %}
<div class="post-container">
<div>
<label for="post_name">Название статьи</label>
<input id="post_name" name="postname" value="" required>
<label for="log">log</label>
<textarea id="log"></textarea>
<label for="authtor">Автор</label>
<input id="authtor" name="authtor" value="" style="width: 160px;">
</div>
<div>
<label for="header">Заголовок (max 69)</label>
<input id="header" name="header" value="" maxlength="69">
<label for="text">Текст</label>
<textarea id="text" name="text"></textarea>
<label for="img">Картинка:</label>
<label class="file-upload">
<span>Выбрать картинку/картинки</span>
<input type="file" accept="image/jpeg, image/png" id="img" name="imgg" multiple>
</label>
<button type="button" onclick="clear_all()">Очистить</button>
<button>Добавить</button>
</div>
</div>
</form>
<form method="POST" action="{% url 'blog_preview' %}" enctype="multipart/form-data" target="_blank">
{% csrf_token %}
<textarea style="display: none" name="to_list" id="to_list">
</textarea>
<textarea style="display: none" name="postnamee" id="post_namee">
</textarea>
<textarea style="display: none" name="authtorr" id="authtorr">
</textarea>
<div class="preview-container">
<div style="display: flex; flex-direction: column; margin-right: 20px;">
<label for="desc">Описание</label>
<textarea id="desc" name="desc"></textarea>
</div>
<div style="display: flex; flex-direction: column;">
<label style="font-size: 16px;">Картинка для предпросмотра</label>
<label class="file-upload" style="margin-top: 10px;">
<span>Выбрать картинку</span>
<input type="file" accept="image/jpeg, image/png" id="imgg_preview" name="imgg_preview">
</label>
<select name="papka" required>
<option value=""> </option>
<option value="history">История</option>
<option value="places">Места</option>
<option value="celebrity">Знаменитости</option>
<option value="theaters_and_music">Театры и музыка</option>
</select>
<button type="submit">Перейти к предпросмотру</button>
</div>
</div>
</form>
</div>
<script src="{% static 'loginedtest/script.js' %}"></script>
</body>
</html>

View File

@ -0,0 +1,226 @@
<!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" />
{% block style %}{% endblock %}
<title>{% block headmain %}{% endblock %}</title>
</head>
<body>
<nav class="navbar">
<div class="container">
<div class="navbar__wrap">
<div class="hamb">
<div class="hamb__field" id="hamb">
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
</div>
</div>
<div class="coltxt" onclick="window.location.href='{% url 'home' %}'">
<div
style="
width: 100%;
font-size: 30px;
align-self: center;
height: 30px;
"
class="cool_text"
>
<div id="one" style="margin-left: 10px; padding-left: 10px">
E
</div>
<div id="two"><div id="twoo">КАТЕРИНБУРГ</div></div>
<div id="three" style="color: blue">G</div>
<div id="four"><div id="fourr">UIDE</div></div>
</div>
</div>
<div class="mobile_coltxt" onclick="window.location.href='/'">
<label>EKB</label
><label
style="
color: blue;
padding-left: 0px;
margin-left: 10px;
margin-right: 10px;
"
>GUIDE</label
>
</div>
<ul class="menu" id="menu">
<li>
<span class="activate_dropdown" onclick="window.location.href='{% url 'history' %}'" {% if papka == 'history'%}style="background-color: rgba(75, 75, 225); color: white;"{% endif%}><label style="color:blue">И</label>стория</span>
<div class="moving_dropdown">
<div class="move_me_content">
{% block history_dropdown %}{% endblock %}
</div>
</div>
</li>
<li>
<span class="activate_dropdown" onclick="window.location.href='{% url 'placess' %}'" {% if papka == 'places'%}style="background-color: rgba(75, 75, 225); color: white;"{% endif%}><label style="color:blue">М</label>еста</span>
<div class="moving_dropdown">
<div class="move_me_content">
{% block places_dropdown %}{% endblock %}
</div>
</div>
</li>
<li>
<span class="activate_dropdown" onclick="window.location.href='{% url 'celebrity' %}'" {% if papka == 'celebrity'%}style="background-color: rgba(75, 75, 225); color: white;"{% endif%}><label style="color:blue">З</label>наменитости</span>
<div class="moving_dropdown">
<div class="move_me_content">
{% block celebrity_dropdown %}{% endblock %}
</div>
</div>
</li>
<li>
<span class="activate_dropdown" onclick="window.location.href='{% url 'theaters_and_music' %}'" {% if papka == 'theaters_and_music'%}style="background-color: rgba(75, 75, 225); color: white;"{% endif%}><label style="color:blue">Т</label>еатры и музыка</span>
<div class="moving_dropdown">
<div class="move_me_content">
{% block theaters_and_music_dropdown %}{% endblock %}
</div>
</div>
</li>
</ul>
</div>
</div>
</nav>
<div class="popup" id="popup">
<ul class="menu" id="menu">
<li style="width: 100%; justify-content: center">
<div class="dropdown" style="width: 100%">
<button
style="
border: none;
background-color: white;
width: 100%;
display: flex;
justify-content: center;
padding: 20px 0;
font-size: 20px;
font-weight: bold;
color: black;
border-top: 2px solid #e2e8f0;
border-bottom: 2px solid #e2e8f0;
margin-bottom: 10px;
"
>
test dropdown menu
</button>
<div class="dropdown-content" style="background-color: white">
<a href="/history">history</a>
<a href="/places">places</a>
<a href="/celebrities">celebrities</a>
</div>
</div>
</li>
<li><a href="/history">История</a></li>
<li><a href="/places">Места</a></li>
<li><a href="/celebrities">Знаменитости</a></li>
<li><a href="/theaters">Театры и музыка</a></li>
<li style="width: 100%; justify-content: center">
<div class="dropdown" style="width: 100%">
<button
style="
border: none;
background-color: white;
width: 100%;
display: flex;
justify-content: center;
padding: 20px 0;
font-size: 20px;
font-weight: bold;
color: black;
border-top: 2px solid #e2e8f0;
border-bottom: 2px solid #e2e8f0;
margin-bottom: 10px;
"
>
test dropdown menu
</button>
<div class="dropdown-content">
<a href="/history">history</a>
<a href="/places">places</a>
<a href="/celebrities">celebrities</a>
</div>
</div>
</li>
</ul>
</div>
<main class="main">
<div class="container">
<div class="content">
{% block maincontent %}{% endblock %}
</div>
</div>
</main>
<footer class="footer" style="">
<div class="container" style="background: #212429;">
<div class="content" style="
">
<div class="fo1" style="
">
<label>Основные разделы</label>
<br>
<label onclick="window.location.href='/history/'" style="
cursor: pointer;
">История</label>
<label onclick="window.location.href='/places/'" style="
cursor: pointer;
">Места</label>
<label onclick="window.location.href='/celebrity/'" style="
cursor: pointer;
">Знаменитости</label>
<label onclick="window.location.href='/theaters_and_music/'" style="
cursor: pointer;
">Театры и музыка</label>
</div>
<div class="fo2">
<label class="gkod_team_label" style="
height: 50px;
width: 300px;
">Made by Gkod team</label><label onclick="window.location.href='mailto:gkod@gkod.fun'" style="
cursor: pointer;
">gkod@gkod.fun</label>
</div>
<div style="display: flex;justify-content: center;align-items: center;flex-direction: column;margin-top: 30px;">
<label onclick="window.location.href='/coments'" style="
cursor: pointer;
">Форма для обратной связи
<hr style="max-width: 320px"></label>
<div style="
margin-top: 20px;
">
<img onclick="window.location.href='https://vk.com/okhlupin_k'" src="/static/tmp/sl286z9378p2687u5srp20230425131051.png"
style="height: 70px; cursor: pointer;" alt="vkicon"/>
<img onclick="window.location.href='https://t.me/koka_c17'" src="/static/tmp/q109d033r5q04i8734rl520230425155022.png"
style="height: 70px; cursor: pointer;" alt="tgicon"/></div>
</div>
</div>
</div>
</footer>
{% block js %}{% endblock %}
</body>
</html>

View File

@ -0,0 +1,109 @@
{% extends "preview_api/base.html" %}
{% load static %}
{% block headmain %}EKB{% endblock %}
{% block style%}
<link rel="stylesheet" href="{% static 'loginedtest/style.css' %}">
<link rel="stylesheet" href="{% static 'first/style.css' %}" />
{% endblock %}
{% block history_dropdown %}
{% if random_history %}
{% for ran in random_history %}
<a href="/{{ran.papka}}/?type={{ran.papka}}&title={{ran.title}}">{{ran.title}}</a>
{% endfor %}
{% else %}
<a href="">ошибка....</a>
{% endif %}
{% endblock %}
{% block places_dropdown %}
{% if random_places %}
{% for ran in random_places %}
<a href="/{{ran.papka}}/?type={{ran.papka}}&title={{ran.title}}">{{ran.title}}</a>
{% endfor %}
{% else %}
<a href="">ошибка....</a>
{% endif %}
{% endblock %}
{% block celebrity_dropdown %}
{% if random_celebrity %}
{% for ran in random_celebrity %}
<a href="/{{ran.papka}}/?type={{ran.papka}}&title={{ran.title}}">{{ran.title}}</a>
{% endfor %}
{% else %}
<a href="">ошибка....</a>
{% endif %}
{% endblock %}
{% block theaters_and_music_dropdown %}
{% if random_theaters_and_music %}
{% for ran in random_theaters_and_music %}
<a href="/{{ran.papka}}/?type={{ran.papka}}&title={{ran.title}}">{{ran.title}}</a>
{% endfor %}
{% else %}
<a href="">ошибка....</a>
{% endif %}
{% endblock %}
{% block maincontent %}
<div class="n_bar">
<a href="#hh{{ forloop.counter }}" style="word-wrap: break-word; overflow-wrap: break-word; padding-top: 10px;" class="button2">{{title}}</a>
</div>
<div class="in_content" style="padding-top: 25px;">
<label style="font-size: 40px; width: 40px;">{{namee}}<hr style="max-width: 400px; margin-left:0;"></label>
<label style="font-size: 30px; margin-top: 20px;">{{title}}<hr style="max-width: 90px; margin-left:0;"></label>
<label style="font-size: 20px; ">{{desc}}</label>
<br>
<!-- <img src="{% static 'places/img/p1.jpg' %}" class="img_content"> -->
{% if img_preview %}
<img src="{% static img_preview %}" class="img_content">
{% endif %}
<button class="more_butt">Подробнее</button>
<br>
<br>
<form method="post" action="{% url 'blog_preview2' %}">
{% csrf_token %}
<textarea style="display: none;" name="papka">{{papka}}</textarea>
<textarea style="display: none;" name="title">{{title}}</textarea>
<textarea style="display: none;" name="authtor">{{authtor}}</textarea>
<textarea style="display: none;" name="testthing">{{testthing}}</textarea>
<textarea style="display: none;" name="desc">{{desc}}</textarea>
<textarea style="display: none;" name="img_preview">{{img_preview}}</textarea>
<button style="width: 200px;height: 40px; border: none; ">Далее</button>
</form>
<br>
<br>
{% endblock %}
{% block js %}<script src="{% static 'first/script.js' %}"></script>{% endblock %}

3
adminsystemdb/tests.py Executable file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

15
adminsystemdb/ttmp.py Executable file
View File

@ -0,0 +1,15 @@
import random
def main():
n = 20
al = "abcdefghigklmnopqrstuvwxyz"
thing = ""
for i in range(0, 16):
a = random.randint(0, 1)
if a == 0:
thing += al[random.randint(0, len(al))]
else:
thing += str(random.randint(0, 10))
print(thing)
input()

12
adminsystemdb/urls.py Executable file
View File

@ -0,0 +1,12 @@
from django.urls import path, include
from . import views
urlpatterns = [
path('', views.index),
path('edit/', views.inacound, name='editdbsite'),
path('edit/get_res', views.get_data, name='postres'),
path('edit/getlist', views.clear_blog, name='clear_blog'),
path('edit/preview', views.blog_preview, name='blog_preview'),
path('edit/preview2', views.blog_preview2, name='blog_preview2'),
path("edit/postt", views.post_to_db, name='posttodb')
]

205
adminsystemdb/views.py Executable file
View File

@ -0,0 +1,205 @@
from django.shortcuts import render, redirect, HttpResponse
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
from django.conf import settings
from .models import Poseters
from datetime import datetime
import random
import json
import ast
import os
# Create your views here.
def index(req):
# return redirect('dbloginadmin/index.html')
return render(req, 'dbloginadmin/index.html')
def inacound(req):
if req.method == 'POST':
if req.POST.get('userrr') == '1w05h7py180p4h10g' and req.POST.get('password') == 'fos2g5i47tt90n1p':
return render(req, 'loginedtest/index.html')
else:
return redirect('/adminsystemdb')
else:
return redirect('/adminsystemdb')
def get_random():
n = 20
al = "abcdefghigklmnopqrstuvwxyz"
thing = ""
for i in range(0, n):
a = random.randint(0, 1)
if a == 0:
thing += al[random.randint(0, len(al)-1)]
else:
thing += str(random.randint(0, 10))
return thing
def get_data(req):
try:
if not req.POST['csrfmiddlewaretoken']:
return HttpResponse('fuk yo')
except Exception:
return HttpResponse('')
text_res = ""
list_res = []
if req.POST['header']:
text_res += f"\nзагаловок: {req.POST['header']}\n"
list_res.append(['header', f"{req.POST['header']}"])
if req.POST['text']:
text_res += f"\nтекст: {req.POST['text']}\nзтекст\n"
list_res.append(['text', f"{req.POST['text']}"])
if req.FILES.getlist('imgg'):
imgs_names = []
for i in req.FILES.getlist('imgg'):
fo = ""
for j in i.name[::-1]:
if j == ".":
fo += j
break
fo += j
nn = get_random() + f"{datetime.now()}".replace("-", "").replace(" ", "").replace(":", "").replace(".", "")[:-6] + fo[::-1]
nn = nn.replace(" ", "_")
path = default_storage.save(f"tmp/{nn}", ContentFile(i.read()))
tmp_file = os.path.join(settings.MEDIA_ROOT, path)
os.replace(tmp_file, tmp_file[:-len(nn)-10]+f'static/tmp/{nn}')
imgs_names.append(nn)
text_res += f"картинка: {imgs_names}"
list_res.append(['img', ['tmp/'+ i for i in imgs_names] ])
if len(f"{list_res}") == 2:
data = json.dumps(
{'text':text_res,
'list_preview':'',
'postname': req.POST["postname"],
'authtor': req.POST["authtor"]
}
)
else:
data = json.dumps(
{'text':text_res,
'list_preview':f"{list_res}"[1:-1]+',',
'postname': req.POST["postname"],
'authtor': req.POST["authtor"]
}
)
return HttpResponse(data)
def clear_blog(req):
res = ast.literal_eval(req.POST['tolist'])
return HttpResponse(f"{res}")
global text_imgs
global res_text_render
global post_name
global authtor
global new_res_text_render
new_res_text_render = []
text_imgs = []
res_text_render = ""
post_name = ""
authtor = ""
return render(req, 'loginedtest/index.html')
def blog_preview(req):
if Poseters.objects.filter(title=req.POST['postnamee']).values():
return HttpResponse("Статья с таким названием уже существует!")
try:
res = ast.literal_eval(req.POST['to_list'])
except Exception:
res = ''
if req.FILES.getlist('imgg_preview'):
i = req.FILES.getlist('imgg_preview')[0]
fo = ""
for j in i.name[::-1]:
if j == ".":
fo += j
break
fo += j
nn = get_random() + f"{datetime.now()}".replace("-", "").replace(" ", "").replace(":", "").replace(".", "")[:-6] + fo[::-1]
nn = nn.replace(" ", "_")
path = default_storage.save(f"tmp/{nn}", ContentFile(i.read()))
tmp_file = os.path.join(settings.MEDIA_ROOT, path)
os.replace(tmp_file, tmp_file[:-len(nn)-10]+f'static/tmp/{nn}')
# path = default_storage.save(f"tmp/{i.name}", ContentFile(i.read()))
# tmp_file = os.path.join(settings.MEDIA_ROOT, path)
# name = ""
# for j in tmp_file[::-1]:
# if j == '/':
# break
# name += j
# name = name[::-1]
# os.replace(tmp_file, tmp_file[:-len(name)-10]+f'adminsystemdb/static/tmp/{name}')
img_preview = 'tmp/' + nn
else:
img_preview = ''
return render(req, "preview_api/index.html", {"namee":"preview",
"title":req.POST['postnamee'],
"testthing":res,
"authtor":req.POST["authtorr"],
"papka":req.POST["papka"],
"desc":req.POST["desc"],
"img_preview": img_preview,
})
def blog_preview2(req):
try:
res = ast.literal_eval(req.POST['testthing'])
except Exception:
res = ''
return render(req, 'blog_preview/index.html',{'title':req.POST['title'],
"testthing":res,
"authtor":req.POST["authtor"],
"date":f" {datetime.today()}"[:-10],
"papka":req.POST["papka"],
"desc":req.POST["desc"],
"img_preview": req.POST['img_preview']
})
def post_to_db(req):
src = req.POST
papka = src["papka"]
title = src["title"]
authtor = src["authtor"]
date = src["date"]
testthing = src["testthing"]
desc = src["desc"]
img_preview = src["img_preview"]
Poseters.objects.create(papka=papka, title=title, authror=authtor, date=date, content=testthing, desc=desc, img_preview=img_preview)
return redirect(f"/{papka}?type={papka}&title={title}")

BIN
db.sqlite3 Executable file

Binary file not shown.

0
ekbguid/__init__.py Executable file
View File

16
ekbguid/asgi.py Executable file
View File

@ -0,0 +1,16 @@
"""
ASGI config for ekbguid project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ekbguid.settings')
application = get_asgi_application()

128
ekbguid/settings.py Executable file
View File

@ -0,0 +1,128 @@
"""
Django settings for ekbguid project.
Generated by 'django-admin startproject' using Django 5.0.3.
For more information on this file, see
https://docs.djangoproject.com/en/5.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/5.0/ref/settings/
"""
from pathlib import Path
import os
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-=mymof#qotdln6&+jy$w)l_-e5q+u8pqgui5(w-9=f$%8o_emz'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['*']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"adminsystemdb",
"mainapp"
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'ekbguid.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'ekbguid.wsgi.application'
# Database
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/5.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.0/howto/static-files/
STATIC_ROOT = 'static'
STATIC_URL = 'static/'
# Default primary key field type
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

24
ekbguid/urls.py Executable file
View File

@ -0,0 +1,24 @@
"""
URL configuration for ekbguid project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('mainapp.urls')),
path('adminsystemdb/', include('adminsystemdb.urls')),
]

16
ekbguid/wsgi.py Executable file
View File

@ -0,0 +1,16 @@
"""
WSGI config for ekbguid project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ekbguid.settings')
application = get_wsgi_application()

0
mainapp/__init__.py Executable file
View File

5
mainapp/admin.py Executable file
View File

@ -0,0 +1,5 @@
from django.contrib import admin
from .models import Comments
# Register your models here.
admin.site.register(Comments)

6
mainapp/apps.py Executable file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class MainappConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'mainapp'

View File

@ -0,0 +1,25 @@
# Generated by Django 4.1.6 on 2023-04-23 08:33
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Comments',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=50, verbose_name='Имя')),
('mail', models.CharField(max_length=100, verbose_name='Почта')),
('phone_num', models.CharField(max_length=15, verbose_name='Номер')),
('coment', models.TextField(verbose_name='Сообщение')),
('date_time', models.CharField(max_length=50, verbose_name='Время')),
],
),
]

0
mainapp/migrations/__init__.py Executable file
View File

11
mainapp/models.py Executable file
View File

@ -0,0 +1,11 @@
from django.db import models
# Create your models here.
class Comments(models.Model):
name = models.CharField("Имя", max_length=50)
mail = models.CharField("Почта", max_length=100)
phone_num = models.CharField("Номер", max_length=15)
coment = models.TextField("Сообщение")
date_time = models.CharField("Время", max_length=50)
def __str__(self) -> str:
return self.name

BIN
mainapp/static/first/img/p1.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

BIN
mainapp/static/first/img/p2.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

BIN
mainapp/static/first/img/p3.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

BIN
mainapp/static/first/img/p4.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

48
mainapp/static/first/script.js Executable file
View File

@ -0,0 +1,48 @@
const hamb = document.querySelector("#hamb");
const popup = document.querySelector("#popup");
const menu = document.querySelector("#menu").cloneNode(1);
const body = document.body;
hamb.addEventListener("click", hambHandler);
function hambHandler(e) {
e.preventDefault();
popup.classList.toggle("open");
hamb.classList.toggle("active");
body.classList.toggle("noscroll");
// renderPopup();
}
function renderPopup() {
popup.appendChild(menu);
}
// Код для закрытия меню при нажатии на ссылку
const links = Array.from(menu.children);
links.forEach((link) => {
link.addEventListener("click", closeOnClick);
});
function closeOnClick() {
popup.classList.remove("open");
hamb.classList.remove("active");
body.classList.remove("noscroll");
}
window.onscroll = function() {scrollFunction()};
function scrollFunction() {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
document.getElementById("myBtn").style.display = "block";
} else {
document.getElementById("myBtn").style.display = "none";
}
}
// When the user clicks on the button, scroll to the top of the document
function topFunction() {
document.body.scrollTop = 0; // For Safari
document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera
}

1052
mainapp/static/first/style.css Executable file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 985 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 652 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Some files were not shown because too many files have changed in this diff Show More