This commit is contained in:
ridethepig 2022-12-12 11:46:59 +08:00
parent 9bd7ffc9ab
commit 810e6a6e60
19 changed files with 271 additions and 155 deletions

View File

@ -1,7 +1,7 @@
import os
from flask import Flask, render_template, g, redirect, url_for
from datetime import datetime
def create_app(test_config=None):
# create and configure the app
@ -44,5 +44,5 @@ def create_app(test_config=None):
return redirect(url_for("admin.index"))
else:
return redirect(url_for("user.home"))
return render_template("index.html")
return render_template("auth/loginbase.html", cur_time=datetime.now())
return app

View File

@ -7,6 +7,7 @@ from werkzeug.security import generate_password_hash
from src.auth import admin_login_required
from src.db import get_db
from datetime import datetime
import pymysql
bp = Blueprint('admin', __name__, url_prefix='/admin')
@ -26,7 +27,7 @@ def index():
)
users = cur.fetchall()
cur.close()
return render_template("admin/index.html", users=users)
return render_template("admin/index.html", users=users, cur_time=datetime.now())
@bp.route('/adduser', methods=("GET", "POST"))
@admin_login_required
@ -41,9 +42,10 @@ def adduser():
error = '用户空间必须是整数GB'
elif not validateEmail(usermail):
error = 'email格式不合法'
userlimi = float(userlimi)
userlimi *= 1024 * 1024 # userlimit is stored and measured by KB
userlimi = int(userlimi)
if error is None:
userlimi = float(userlimi)
userlimi *= 1024 * 1024 # userlimit is stored and measured by KB
userlimi = int(userlimi)
if error is None:
db = get_db()
cur = db.cursor()
@ -65,7 +67,7 @@ def adduser():
if error is None:
return redirect(url_for('admin.index'))
flash(error)
return render_template("admin/adduser.html")
return render_template("admin/adduser.html", cur_time=datetime.now())
@bp.route('/removeuser', methods=("GET",))
@admin_login_required
@ -92,8 +94,8 @@ def removeuser():
finally:
cur.close()
if error is None:
if rowcnt != 0:
error = "删除uid为%s的用户成功!" % uid_to_del
else:
if rowcnt == 0:
error = "由于uid不存在可能没有被删除请再次检查删除结果"
return render_template("admin/removeuser.html", remove_result=error)
else:
return redirect(url_for("admin.index"))
return render_template("admin/result.html", opname="删除用户出现意外", opresult=error, cur_time=datetime.now())

View File

@ -2,6 +2,7 @@ import functools
from flask import Blueprint, flash, g, redirect, render_template, request, session, url_for
from werkzeug.security import check_password_hash
from src.db import get_db
from datetime import datetime
bp = Blueprint('auth', __name__, url_prefix='/auth')
@ -30,7 +31,7 @@ def loginuser():
flash(error)
return render_template('auth/loginuser.html')
return render_template('auth/loginuser.html', cur_time=datetime.now())
@bp.route('/loginadmin', methods=('GET', 'POST'))
def loginadmin():
@ -52,11 +53,11 @@ def loginadmin():
session['user_id'] = 0
return redirect(url_for('admin.index'))
flash(error)
return render_template('auth/loginadmin.html')
return render_template('auth/loginadmin.html', cur_time=datetime.now())
@bp.route('/login', methods=('GET', 'POST'))
def login():
return render_template("auth/loginbase.html")
return render_template("auth/loginbase.html", cur_time=datetime.now())
@bp.before_app_request
def load_logged_in_user():

View File

@ -1,12 +1,11 @@
{% extends 'base.html' %}
{% block header %}
<h1>{% block title %}管理主页{% endblock %}</h1>
<h2 class="text-center">{% block title %}管理主页{% endblock %}</h2>
{% endblock %}
{% block content %}
<h2>新建用户</h2>
<div>
<form method="post">
<!-- <div>
<form method="post" class="">
<label for="username">用户名</label>
<input name="username" id="username" required> <br>
<label for="usermail">邮箱</label>
@ -17,6 +16,55 @@
<input name="userlimit" id="userlimit" required>
<input type="submit" value="新建用户">
</form>
</div> -->
<div class="columns " style="padding-top:5em;">
<div class="column col-3"></div>
<div class="column col-6">
<div class="card">
<div class="card-header">
<div class="card-title h4 text-center"> 新建用户</div>
</div>
<div class="card-body">
<form method="post" class="form-horizontal">
<div class="form-group">
<div class="col-3 text-center">
<label class="form-label" for="username">用户名</label>
</div>
<div class="col-8">
<input class="form-input" name="username" id="username" required>
</div>
</div>
<div class="form-group">
<div class="col-3 text-center">
<label class="form-label" for="usermail">邮箱</label>
</div>
<div class="col-8">
<input class="form-input" name="usermail" id="usermail" required>
</div>
</div>
<div class="form-group">
<div class="col-3 text-center">
<label class="form-label" for="password">密码</label>
</div>
<div class="col-8">
<input class="form-input" type="password" name="password" id="password" required>
</div>
</div>
<div class="form-group">
<div class="col-3 text-center">
<label class="form-label" for="userlimit">用户空间大小</label>
</div>
<div class="col-8">
<input class="form-input" name="userlimit" id="userlimit" required>
</div>
</div>
<input class="input-group-btn btn btn-primary p-centered"type="submit" value="新建用户">
<div class="text-right">
<a href="/admin/" class="btn">返回</a>
</div>
</form>
</div>
</div>
</div>
</div>
<a href="/admin/">返回</a>
{% endblock %}

View File

@ -1,21 +1,36 @@
{% extends 'base.html' %}
{% block header %}
<h1>{% block title %}管理主页{% endblock %}</h1>
<h2 class="text-center">{% block title %}管理主页{% endblock %}</h2>
{% endblock %}
{% block content %}
<h2>用户列表</h2>
<div>
<ul>
{% for user in users%}
<li>
UID:{{ user['user_id'] }}, 用户名: {{ user['user_name'] }},
邮箱: {{ user['user_mail'] }}, 用户空间大小: {{ user['user_limit'] / 1024 / 1024 }}GB
<a href={{"/admin/removeuser?uid=" ~ user['user_id']}}>删除</a>
</li>
{% endfor %}
</ul>
<a href="/admin/adduser">新建用户</a>
<span>
<h3 class="px-2">用户列表</h3>
</span>
</div>
<div class="mx-2">
<table class="table">
<thead>
<tr>
<th>UID</th> <th>用户名</th> <th>邮箱</th> <th>用户空间</th> <th>操作</th>
</tr>
</thead>
<tbody>
{% for user in users%}
<tr>
<td>{{ user['user_id'] }}</td>
<td>{{ user['user_name'] }}</td>
<td>{{ user['user_mail'] }}</td>
<td>{{ user['user_limit'] / 1024 / 1024 }}GB</td>
<td><a href="/admin/removeuser?uid={{user['user_id']}}" >删除</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="text-right p-2">
<a href="/admin/adduser" class="btn btn-primary">新建用户</a>
</div>
{% endblock %}

View File

@ -1,12 +0,0 @@
{% extends 'base.html' %}
{% block header %}
<h1>{% block title %}管理主页{% endblock %}</h1>
{% endblock %}
{% block content %}
<h2>删除用户结果</h2>
<div>
{{remove_result}}
</div>
<a href="/admin/">返回</a>
{% endblock %}

View File

@ -0,0 +1,26 @@
{% extends 'base.html' %}
{% block header %}
{% endblock %}
{% block content %}
<div class="container">
<div class="columns">
<div class="column col-2 text-center">
</div>
<div class="column col-9 panel">
<div class="panel-header">
<div class="panel-title">{{opname}}</div>
</div>
<div class="panel-body">
<p>{{opresult}}</p>
{% if ret_url %}
<p><a href="{{ret_url}}">返回</a></p>
{% else %}
<p><a href="javascript:history.back(-1)">返回</a></p>
{% endif %}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,14 +1,36 @@
{% extends 'base.html' %}
{% block header %}
<h1>{% block title %}Log In{% endblock %}</h1>
{% endblock %}
{% block content %}
<form method="post">
<label for="username">Admin</label>
<label for="password">密码</label>
<input type="password" name="password" id="password" required>
<input type="submit" value="Log In">
</form>
<div class="columns " style="padding-top:5em;">
<div class="column col-3"></div>
<div class="column col-6">
<div class="card">
<div class="card-header">
<div class="card-title h4 text-center"> 管理员登录</div>
</div>
<div class="card-body">
<form method="post" class="form-horizontal">
<div class="form-group">
<div class="col-3 text-center">
<label class="form-label" for="username">用户名</label>
</div>
<div class="col-8">
<input class="form-input" name="username" id="username" value="admin" disabled>
</div>
</div>
<div class="form-group">
<div class="col-3 text-center">
<label class="form-label" for="password">密码</label>
</div>
<div class="col-8">
<input class="form-input" type="password" name="password" id="password" required>
</div>
</div>
<input class="input-group-btn btn btn-primary p-centered"type="submit" value="登陆">
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,12 +1,16 @@
{% extends 'base.html' %}
{% block header %}
<h1>{% block title %}在访问前,需要登陆{% endblock %}</h1>
<h2 class="text-center">{% block title %}在访问前,需要登陆{% endblock %}</h1>
{% endblock %}
{% block content %}
<ul>
<li><a href="{{ url_for('auth.loginadmin') }}">管理员登陆</a>
<li><a href="{{ url_for('auth.loginuser') }}">用户登陆</a>
</ul>
<div class="text-center">
<div class="p-1">
<a href="{{ url_for('auth.loginadmin') }}" class="btn">管理员登陆</a>
</div>
<div class="p-1">
<a href="{{ url_for('auth.loginuser') }}" class="btn">用户登陆</a>
</div>
</div>
{% endblock %}

View File

@ -1,15 +1,35 @@
{% extends 'base.html' %}
{% block header %}
<h1>{% block title %}Log In{% endblock %}</h1>
{% endblock %}
{% block content %}
<form method="post">
<label for="username">Username</label>
<input name="username" id="username" required>
<label for="password">Password</label>
<input type="password" name="password" id="password" required>
<input type="submit" value="Log In">
</form>
<div class="columns " style="padding-top:5em;">
<div class="column col-3"></div>
<div class="column col-6">
<div class="card">
<div class="card-header">
<div class="card-title h4 text-center"> 用户登录</div>
</div>
<div class="card-body">
<form method="post" class="form-horizontal">
<div class="form-group">
<div class="col-3 text-center">
<label class="form-label" for="username">用户名</label>
</div>
<div class="col-8">
<input class="form-input" name="username" id="username">
</div>
</div>
<div class="form-group">
<div class="col-3 text-center">
<label class="form-label" for="password">密码</label>
</div>
<div class="col-8">
<input class="form-input" type="password" name="password" id="password" required>
</div>
</div>
<input class="input-group-btn btn btn-primary p-centered"type="submit" value="登陆">
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -17,12 +17,18 @@
{% endif %}
</ul>
</nav> -->
<style>
html, body{
margin: 0;
padding: 0;
min-height: 100vh;
}
</style>
<header class="navbar">
<section class="navbar-section">
<h1>电子书管理系统</h1>
</section>
<section class="navbar-center">
<!-- centered logo or brand -->
<h1>电子书管理系统</h1>
</section>
<section class="navbar-section">
{% if g.user %}
@ -34,7 +40,7 @@
{% endif %}
</section>
</header>
<section class="content">
<section class="content" style="min-height: 80vh;">
<header>
{% block header %}{% endblock %}
</header>
@ -42,4 +48,9 @@
<div class="flash">{{ message }}</div>
{% endfor %}
{% block content %}{% endblock %}
</section>
</section>
<footer style="height: 3em;">
<div class="text-center">
Made with Madness by Catfood <br> Rendered @ {{cur_time}}
</div>
</footer>

View File

@ -44,19 +44,19 @@
{% block content %}
<div class="container">
<div class="columns">
<div class="column col-3">
<div class="column col-2 text-center">
<ul class="nav">
<li class="nav-item">
<a href="/home">主页</a>
<a href="/home"><b>主页</b></a>
</li>
<li class="nav-item">
<a href="/search">搜索</a>
<a href="/search"><b>搜索</b></a>
</li>
<li class="nav-item">
<a href="/addbook">增加</a>
<a href="/addbook"><b>增加</b></a>
</li>
<li class="nav-item">
<a href="/tags">分类</a>
<a href="/tags"><b>分类</b></a>
</li>
</ul>
</div>
@ -95,9 +95,6 @@
<input class="btn btn-primary input-group-btn p-centered" type="submit" value="提交">
</form>
</div>
<div class="panel-footer">
Rendered @ {{cur_time}}
</div>
</div>
</div>
</div>

View File

@ -25,19 +25,19 @@
{% block content %}
<div class="container">
<div class="columns">
<div class="column col-3">
<div class="column col-2 text-center">
<ul class="nav">
<li class="nav-item">
<a href="/home">主页</a>
<a href="/home"><b>主页</b></a>
</li>
<li class="nav-item">
<a href="/search">搜索</a>
<a href="/search"><b>搜索</b></a>
</li>
<li class="nav-item">
<a href="/addbook">增加</a>
<a href="/addbook"><b>增加</b></a>
</li>
<li class="nav-item">
<a href="/tags">分类</a>
<a href="/tags"><b>分类</b></a>
</li>
</ul>
</div>
@ -66,9 +66,6 @@
{% endfor %}
</ul>
</div>
<div class="panel-footer">
Rendered @ {{cur_time}}
</div>
</div>
</div>
</div>

View File

@ -16,21 +16,21 @@ function control_modal(op, modal_id){
{% block content %}
<div class="container">
<div class="columns">
<div class="column col-3">
<div class="column col-2 text-center">
<ul class="nav">
<li class="nav-item">
<a href="/home">主页</a>
</li>
<li class="nav-item">
<a href="/search">搜索</a>
</li>
<li class="nav-item">
<a href="/addbook">增加</a>
</li>
<li class="nav-item">
<a href="/tags">分类</a>
</li>
</ul>
<li class="nav-item">
<a href="/home"><b>主页</b></a>
</li>
<li class="nav-item">
<a href="/search"><b>搜索</b></a>
</li>
<li class="nav-item">
<a href="/addbook"><b>增加</b></a>
</li>
<li class="nav-item">
<a href="/tags"><b>分类</b></a>
</li>
</ul>
</div>
<div class="column col-9 panel">
<div class="modal" id="modal-addnote">
@ -140,9 +140,6 @@ function control_modal(op, modal_id){
</div>
{% endfor %}
</div>
<div class="panel-footer">
Rendered @ {{cur_time}}
</div>
</div>
</div>
</div>

View File

@ -25,20 +25,20 @@
{% block content %}
<div class="container">
<div class="columns">
<div class="column col-3">
<div class="column col-2 text-center">
<ul class="nav">
<li class="nav-item">
<a href="/home">主页</a>
<a href="/home"><b>主页</b></a>
</li>
<li class="nav-item">
<a href="/search">搜索</a>
<a href="/search"><b>搜索</b></a>
</li>
<li class="nav-item">
<a href="/addbook">增加</a>
<a href="/addbook"><b>增加</b></a>
</li>
<li class="nav-item">
<a href="/tags">分类</a>
</li>
<a href="/tags"><b>分类</b></a>
</li>
</ul>
</div>
<div class="column col-9 panel">
@ -58,9 +58,6 @@
<dd> {{user_stat['user_notecount']}}篇</dd>
</dl>
</div>
<div class="panel-footer">
Rendered @ {{cur_time}}
</div>
</div>
</div>
</div>

View File

@ -23,19 +23,19 @@
{% block content %}
<div class="container">
<div class="columns">
<div class="column col-3">
<div class="column col-2 text-center">
<ul class="nav">
<li class="nav-item">
<a href="/home">主页</a>
<a href="/home"><b>主页</b></a>
</li>
<li class="nav-item">
<a href="/search">搜索</a>
<a href="/search"><b>搜索</b></a>
</li>
<li class="nav-item">
<a href="/addbook">增加</a>
<a href="/addbook"><b>增加</b></a>
</li>
<li class="nav-item">
<a href="/tags">分类</a>
<a href="/tags"><b>分类</b></a>
</li>
</ul>
</div>
@ -51,9 +51,6 @@
<p><a href="javascript:history.back(-1)">返回</a></p>
{% endif %}
</div>
<div class="panel-footer">
Rendered @ {{cur_time}}
</div>
</div>
</div>
</div>

View File

@ -23,19 +23,19 @@
{% block content %}
<div class="container">
<div class="columns">
<div class="column col-3">
<div class="column col-2 text-center">
<ul class="nav">
<li class="nav-item">
<a href="/home">主页</a>
<a href="/home"><b>主页</b></a>
</li>
<li class="nav-item">
<a href="/search">搜索</a>
<a href="/search"><b>搜索</b></a>
</li>
<li class="nav-item">
<a href="/addbook">增加</a>
<a href="/addbook"><b>增加</b></a>
</li>
<li class="nav-item">
<a href="/tags">分类</a>
<a href="/tags"><b>分类</b></a>
</li>
</ul>
</div>
@ -124,9 +124,6 @@
</div>
</div>
<div class="panel-footer">
Rendered @ {{cur_time}}
</div>
</div>
</div>
</div>

View File

@ -25,19 +25,19 @@
{% block content %}
<div class="container">
<div class="columns">
<div class="column col-3">
<div class="column col-2 text-center">
<ul class="nav">
<li class="nav-item">
<a href="/home">主页</a>
<a href="/home"><b>主页</b></a>
</li>
<li class="nav-item">
<a href="/search">搜索</a>
<a href="/search"><b>搜索</b></a>
</li>
<li class="nav-item">
<a href="/addbook">增加</a>
<a href="/addbook"><b>增加</b></a>
</li>
<li class="nav-item">
<a href="/tags">分类</a>
<a href="/tags"><b>分类</b></a>
</li>
</ul>
</div>
@ -76,9 +76,6 @@
<input class="btn btn-primary input-group-btn p-centered" type="submit" value="提交">
</form>
</div>
<div class="panel-footer">
Rendered @ {{cur_time}}
</div>
</div>
</div>
</div>

View File

@ -6,7 +6,7 @@ import os
from src.auth import login_required
from src.db import get_db
import pymysql
import datetime
from datetime import datetime
bp = Blueprint('user', __name__)
@ -20,7 +20,7 @@ def home():
user_stat = cur.fetchone()
print(user_stat)
cur.close()
return render_template("user/home.html", user_stat=user_stat, cur_time=datetime.datetime.now())
return render_template("user/home.html", user_stat=user_stat, cur_time=datetime.now())
@bp.route("/addbook", methods=('GET', 'POST'))
@login_required
@ -86,7 +86,7 @@ def addbook():
cur.execute("select type_name from typetable")
typelist = cur.fetchall()
return render_template("user/addbook.html", typelist=typelist, error=error,
cur_time=datetime.datetime.now())
cur_time=datetime.now())
@bp.route("/tags", methods=('GET', 'POST'))
@login_required
@ -117,7 +117,7 @@ def tags():
cur.execute("select * from typetable")
typelist = cur.fetchall()
return render_template("user/addtype.html", typelist=typelist, error=error,
cur_time=datetime.datetime.now())
cur_time=datetime.now())
@bp.route("/removetype", methods=("GET",))
@login_required
@ -140,10 +140,10 @@ def removetype():
if rowcnt == 0:
error = "删除可能失败,再次检查是否完成"
else:
error = "删除(type_id=%s)完成" % tid_to_del
return redirect(url_for("user.tags"))
cur.close()
return render_template("user/result.html", opname="删除分类",
opresult=error, cur_time=datetime.datetime.now())
opresult=error, cur_time=datetime.now())
@bp.route("/search", methods=("GET", "POST"))
@login_required
@ -196,7 +196,7 @@ def search():
prev_page_link = "/search?bookname=%s&bookattr=%s&page=%s" %(queryval, bookattr, page - 1)
# print(prev_page_link, next_page_link)
return render_template("user/search.html",
cur_time=datetime.datetime.now(), error=error, queryresult=queryresult,
cur_time=datetime.now(), error=error, queryresult=queryresult,
next_page_link=next_page_link, prev_page_link=prev_page_link,
page_last=page_last, page_first=(page==1), queryval=queryval, queryattr=attr_dict)
@ -215,7 +215,7 @@ def book(id):
notes = cur.fetchall()
return render_template("/user/book.html",
book=book, booktype=booktype, documents=documents, notes=notes,
cur_time=datetime.datetime.now())
cur_time=datetime.now())
@bp.route("/book/update/<int:id>/", methods=("GET", "POST"))
@login_required
@ -294,7 +294,7 @@ def book_update(id):
booktypestr += k['type_name'] + ';'
return render_template("/user/updatebook.html",
book=bookinfo, booktype=booktypestr, typelist=typelist,
cur_time=datetime.datetime.now())
cur_time=datetime.now())
@bp.route("/doc/upload/<int:id>/", methods=("POST",))
@ -307,7 +307,7 @@ def doc_upload(id):
error = None
if fileobj and fileobj.filename:
_, filename = os.path.split(fileobj.filename)
filepath = os.path.join(current_app.config['UPLOADDIR'], filename + f'.{int(datetime.datetime.timestamp(datetime.datetime.now()))}')
filepath = os.path.join(current_app.config['UPLOADDIR'], filename + f'.{int(datetime.datetime.timestamp(datetime.now()))}')
fileobj.save(filepath)
filesz = os.stat(filepath).st_size // 1024 # original in bytes
filetype = fileobj.mimetype
@ -336,7 +336,7 @@ def doc_upload(id):
if error is not None:
return render_template("/user/result.html",
opname="上传文件失败", opresult=error,
cur_time=datetime.datetime.now())
cur_time=datetime.now())
return redirect(url_for("user.book", id=id))
@bp.route("/doc/download/<int:docid>/", methods=("GET",))
@ -358,7 +358,7 @@ def doc_download(docid):
error = "文件已被删除,严重的数据不一致,请联系管理员"
return render_template("/user/result.html",
opname="下载文件失败", opresult=error,
cur_time=datetime.datetime.now())
cur_time=datetime.now())
@bp.route("/doc/delete/<int:docid>/", methods=("GET",))
@login_required
@ -392,11 +392,11 @@ def doc_delete(docid):
if error is not None:
return render_template("/user/result.html",
opname="删除文件失败", opresult=error,
cur_time=datetime.datetime.now())
cur_time=datetime.now())
elif warning is not None:
return render_template("/user/result.html",
opname="删除文件出现了一些意外", opresult=warning,
cur_time=datetime.datetime.now(), ret_url=url_for("user.book", id=document['book_id']))
cur_time=datetime.now(), ret_url=url_for("user.book", id=document['book_id']))
return redirect(url_for("user.book", id=document['book_id']))
@bp.route("/note/create/<int:bookid>/", methods=("POST",))
@ -422,7 +422,7 @@ def note_create(bookid):
if error is not None:
return render_template("/user/result.html",
opname="添加评论失败", opresult=error,
cur_time=datetime.datetime.now())
cur_time=datetime.now())
return redirect(url_for("user.book", id=bookid))
@ -446,5 +446,5 @@ def note_delete(noteid):
if error is not None:
return render_template("/user/result.html",
opname="删除评论失败", opresult=error,
cur_time=datetime.datetime.now())
cur_time=datetime.now())
return redirect(url_for("user.book", id=note['book_id']))