Add docker support
This commit is contained in:
@@ -50,7 +50,6 @@ class TagNote(Base):
|
||||
id = Column(Integer, primary_key=True)
|
||||
note_id = Column(Integer, ForeignKey('note.id'))
|
||||
tag_id = Column(Integer, ForeignKey('tag.id'))
|
||||
created = Column(DateTime) # Дата создания
|
||||
|
||||
# Связи
|
||||
note = relationship(
|
||||
@@ -69,7 +68,6 @@ class TagNote(Base):
|
||||
assert type(tag).__name__ == 'Tag', 'Не передан объект Tag'
|
||||
self.note_id = note.id
|
||||
self.tag_id = tag.id
|
||||
self.created = datetime.datetime.now()
|
||||
|
||||
def __repr__(self):
|
||||
return "<TagNote('%s')>" % (self.id)
|
||||
|
||||
@@ -2,6 +2,8 @@ __author__ = 'RemiZOffAlex'
|
||||
__email__ = 'remizoffalex@mail.ru'
|
||||
__url__ = 'https://remizoffalex.ru/'
|
||||
|
||||
import string
|
||||
|
||||
from flask import session
|
||||
|
||||
from . import jsonrpc
|
||||
@@ -25,3 +27,34 @@ def login(username: str, password: str) -> bool:
|
||||
session['logged_in'] = True
|
||||
session['user_id'] = user.id
|
||||
return True
|
||||
|
||||
|
||||
@jsonrpc.method('login.register')
|
||||
def login_register(username: str, password: str) -> bool:
|
||||
"""Регистрация
|
||||
"""
|
||||
if len(username) < 4 or len(username) > 25:
|
||||
raise ValueError('Длина логина от 4 до 25 символов')
|
||||
if len(password) < 4 or len(password) > 150:
|
||||
raise ValueError('Длина пароля от 4 до 150 символов')
|
||||
for char in username:
|
||||
if char not in string.ascii_letters + string.digits:
|
||||
raise ValueError
|
||||
|
||||
user = models.db_session.query(
|
||||
models.User
|
||||
).filter(
|
||||
models.User.name == username
|
||||
).first()
|
||||
if user:
|
||||
raise ValueError('Пользователь с таким логином уже существует')
|
||||
|
||||
newuser = models.User(username)
|
||||
newuser.password = lib.get_hash_password(
|
||||
password,
|
||||
app.config['SECRET_KEY']
|
||||
)
|
||||
models.db_session.add(newuser)
|
||||
models.db_session.commit()
|
||||
|
||||
return True
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<a class="btn btn-outline-secondary" href="/register">Регистрация</a>
|
||||
<button class="btn btn-outline-success float-right" type="submit" v-on:click="login">Войти</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
90
myapp/ns_login/templates/register.html
Normal file
90
myapp/ns_login/templates/register.html
Normal file
@@ -0,0 +1,90 @@
|
||||
{% extends "skeleton.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 ml-md-auto mr-md-auto">
|
||||
|
||||
<h3>Регистрация</h3>
|
||||
<hr />
|
||||
|
||||
<div class="row mt-3" v-if="error">
|
||||
<div class="col text-danger" v-html="error.message"></div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<i class="input-group-text"><i class="fa fa-user"></i></i>
|
||||
</div>
|
||||
<input class="form-control" placeholder="Логин" type="text" id="username" v-model="username">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<i class="input-group-text"><i class="fa fa-lock"></i></i>
|
||||
</div>
|
||||
<input class="form-control" placeholder="Пароль" type="password" id="password" v-model="password">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<i class="input-group-text"><i class="fa fa-lock"></i></i>
|
||||
</div>
|
||||
<input class="form-control" placeholder="Повтор пароля" type="password" id="repeat" v-model="repeat">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="btn btn-outline-success float-right" v-on:click="register">Зарегистрироваться</div>
|
||||
<a class="btn btn-outline-secondary" href="/login">Вход</a>
|
||||
|
||||
</div> <!-- div class="col-md-6 ml-md-auto mr-md-auto" -->
|
||||
</div> <!-- div class="row" -->
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block script %}
|
||||
<script type="text/javascript">
|
||||
var app = new Vue({
|
||||
el: '#app',
|
||||
data: {
|
||||
username: '',
|
||||
password: '',
|
||||
repeat: '',
|
||||
error: null
|
||||
},
|
||||
methods: {
|
||||
register: function() {
|
||||
let vm = this;
|
||||
if (vm.password!=vm.repeat) {
|
||||
vm.error = 'Пароли не совпадают';
|
||||
return;
|
||||
}
|
||||
axios.post(
|
||||
'/api',
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "login.register",
|
||||
"params": {
|
||||
"username": vm.username,
|
||||
"password": vm.password
|
||||
},
|
||||
"id": 1
|
||||
}
|
||||
).then(
|
||||
function(response) {
|
||||
if ('result' in response.data) {
|
||||
window.location.href = '/login';
|
||||
} else if ('error' in response.data) {
|
||||
vm.error = response.data['error'];
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -23,3 +23,12 @@ def logout():
|
||||
session.pop('logged_in', None)
|
||||
session.pop('user_id', None)
|
||||
return redirect("/", code=302)
|
||||
|
||||
|
||||
@app.route('/register')
|
||||
def register():
|
||||
"""Регистрация нового пользователя
|
||||
"""
|
||||
pagedata = {}
|
||||
body = render_template('register.html', pagedata=pagedata)
|
||||
return body
|
||||
|
||||
@@ -8,7 +8,8 @@ from .. import app, models
|
||||
|
||||
|
||||
def pages(page):
|
||||
"""Список статей"""
|
||||
"""Список статей
|
||||
"""
|
||||
pagedata = {'title': 'Статьи - ' + app.config['TITLE']}
|
||||
|
||||
pagedata['pagination'] = {
|
||||
|
||||
@@ -8,8 +8,7 @@ from .. import app, models
|
||||
|
||||
|
||||
def pages(page):
|
||||
"""
|
||||
Список статей
|
||||
"""Список статей
|
||||
"""
|
||||
pagedata = {'title': 'Статьи - ' + app.config['TITLE']}
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<div class="row">
|
||||
<div class="col py-2">
|
||||
|
||||
<a class="btn btn-outline-secondary border-0" href="/"><i class="fa fa-home"></i></a>
|
||||
<a class="btn btn-outline-secondary" href="/"><i class="fa fa-home"></i></a>
|
||||
<a class="btn btn-outline-secondary border-0" href="/pages">Статьи</a>
|
||||
<a class="btn btn-outline-secondary border-0" href="/tags">Метки</a>
|
||||
<a class="btn btn-outline-secondary border-0" href="/users">Пользователи</a>
|
||||
<a class="btn btn-outline-secondary border-0" href="/api/browse">API JSON-RPC</a>
|
||||
|
||||
<a class="btn btn-outline-success border-0 float-right" href="/login"><i class="fa fa-sign-in"></i></a>
|
||||
<a class="btn btn-outline-success float-right" href="/login"><i class="fa fa-sign-in"></i></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
<div class="row">
|
||||
<div class="col py-2">
|
||||
|
||||
<a class="btn btn-outline-secondary border-0" href="/"><i class="fa fa-home"></i></a>
|
||||
<a class="btn btn-outline-secondary" href="/"><i class="fa fa-home"></i></a>
|
||||
<a class="btn btn-outline-secondary border-0" href="/pages">Статьи</a>
|
||||
<a class="btn btn-outline-secondary border-0" href="/tags">Метки</a>
|
||||
<a class="btn btn-outline-secondary border-0" href="/users">Пользователи</a>
|
||||
<a class="btn btn-outline-secondary border-0" href="/api/browse">API JSON-RPC</a>
|
||||
|
||||
<div class="btn-group float-right">
|
||||
<a class="btn btn-outline-secondary border-0" href="/notes"><i class="fa fa-sticky-note-o"></i></a>
|
||||
<a class="btn btn-outline-secondary border-0" href="/profile"><i class="fa fa-user"></i></a>
|
||||
<a class="btn btn-outline-danger border-0" href="/logout"><i class="fa fa-sign-out"></i></a>
|
||||
<a class="btn btn-outline-secondary" href="/notes"><i class="fa fa-sticky-note-o"></i></a>
|
||||
<a class="btn btn-outline-secondary" href="/profile"><i class="fa fa-user"></i></a>
|
||||
<a class="btn btn-outline-danger" href="/logout"><i class="fa fa-sign-out"></i></a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user