app.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from flask import g, Flask, url_for, redirect, request, render_template, session
from flask_migrate import Migrate
from exts import db
from decorations import login_required
from models import User
import config

from blueprints.user import bp as user_bp
from blueprints.device import bp as device_bp
from blueprints.data import bp as data_bp
from blueprints.register_requests import bp as register_requests_bp
from blueprints.big_data import bp as big_data_bp

app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)

app.register_blueprint(user_bp)
app.register_blueprint(device_bp)
app.register_blueprint(data_bp)
app.register_blueprint(register_requests_bp)
app.register_blueprint(big_data_bp)

migrate = Migrate(app, db)


@app.before_request
def before_request():
id_user = session.get("id_user")
if id_user:
try:
user = User.query.get(id_user)
g.user = user
except:
g.user = None


@app.route("/")
@login_required
def index():
return redirect(url_for('static', filename='layui/examples/layout-admin.html'))


if __name__ == '__main__':
app.debug = True
app.run()

config.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 数据库
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'xxx'
USERNAME = 'root'
PASSWORD = '123456'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

JSON_AS_ASCII = False
SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_DATABASE_URI = DB_URI

SECRET_KEY = 'jbwkbjevkanvejk3412512515'

# MAX_CONTENT_LENGTH = 16 * 1024 * 1024

exts.py

from flask_sqlalchemy import SQLAlchemy
import time

db = SQLAlchemy()


def delete_sa_instance_state(data):
del data['_sa_instance_state']
# data["href"] = "<a href=\"edit.html?id={}\">详情</a>".format(data['id_user'])
return data


def get_time():
return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))


def add_name_from_user(data):
author = data.user.name
data = vars(data)
data['author'] = author
del data["user"]
return data

models.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from exts import db


# orm模型
class User(db.Model):
__tablename__ = "user"
id_user = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(45), nullable=False, unique=True)
password = db.Column(db.String(45), nullable=False)
name = db.Column(db.String(45), nullable=False)
phone = db.Column(db.String(45), nullable=False)
role = db.Column(db.String(45), nullable=False)
power = db.Column(db.Integer, nullable=False)
grade = db.Column(db.String(45), nullable=False)


class UserExtends(db.Model):
__tablename__ = "user_extends"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)

# 外键
id_user = db.Column(db.Integer, db.ForeignKey("user.id"))
user = db.relationship("User", backref=db.backref("user_extends", uselist=False)) # 一对一关系


class RegisterRequests(db.Model):
__tablename__ = "register_requests"
id_register_requests = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(45), nullable=False, unique=True)
password = db.Column(db.String(45), nullable=False)
name = db.Column(db.String(45), nullable=False)
phone = db.Column(db.String(45), nullable=False)
role = db.Column(db.String(45), nullable=False)
power = db.Column(db.Integer, nullable=False)
grade = db.Column(db.String(45), nullable=False)


class Device(db.Model):
__tablename__ = "device"
id_device = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(45), nullable=False)
pic = db.Column(db.String(200), nullable=False)
time = db.Column(db.String(45), nullable=False)

# 外键
id_user = db.Column(db.Integer, db.ForeignKey("user.id_user"))
user = db.relationship("User", backref="devices")


class Data(db.Model):
__tablename__ = "data"
id_data = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(45), nullable=False)
content = db.Column(db.Text, nullable=False)
appendix = db.Column(db.String(200), nullable=False)
appendix_name = db.Column(db.String(45), nullable=False)
time = db.Column(db.String(45), nullable=False)

# 外键
id_user = db.Column(db.Integer, db.ForeignKey("user.id_user"))
user = db.relationship("User", backref="data_s")


class BigData(db.Model):
__tablename__ = "big_data"
id_big_data = db.Column(db.Integer, primary_key=True, autoincrement=True)
filename = db.Column(db.String(45), nullable=False)
path = db.Column(db.String(200), nullable=False)
time = db.Column(db.String(45), nullable=False)
who_can_see = db.Column(db.Integer, nullable=False)
size = db.Column(db.String(45), nullable=False)

# 外键
id_user = db.Column(db.Integer, db.ForeignKey("user.id_user"))
user = db.relationship("User", backref="big_data_s")

decorations.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from functools import wraps
from flask import g,redirect,url_for


def login_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
if hasattr(g, 'user'):
return func(*args, **kwargs)
else:
# return "未登录"
return redirect(url_for("user.login"))

return wrapper


def root_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
if hasattr(g, 'user') and g.user.power <= 0:
return func(*args, **kwargs)
else:
# print("权限不足")
return "权限不足"

return wrapper


def teacher_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
if hasattr(g, 'user') and g.user.power <= 1:
return func(*args, **kwargs)
else:
# print("权限不足")
return "权限不足"

return wrapper

blueprint: a demo

user.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
from flask import g, Blueprint, redirect, url_for, request, jsonify, session
from models import User
from exts import db, delete_sa_instance_state, get_time
from sqlalchemy import or_
from decorations import root_required, login_required, teacher_required
from flask import current_app

bp = Blueprint("user", __name__, url_prefix="/user")


@bp.route("/login", methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return redirect(url_for('static', filename='login.html'))
else:
username = request.values.get("username")
password = request.values.get("password")
user = User.query.filter_by(username=username).first()
if user is None:
return "没有此用户"
# return redirect(url_for("user.login"))
else:
if user.password == password:
session['id_user'] = user.id_user
return redirect(url_for('index'))
else:
return "密码错误"
# return redirect(url_for("user.login"))


@bp.route('/get_user_count', methods=['GET', 'POST'])
@teacher_required
def get_user_count():
user_list = db.session.query(User).filter(User.power >= g.user.power).all()
data = {"count": len(user_list)}
return data


@bp.route('/get_user_data', methods=['GET', 'POST'])
@teacher_required
def get_user_data():
page = request.values.get('page')
limit = request.values.get('limit')
paginate = db.session.query(User).filter(User.power >= g.user.power).paginate(page=int(page), per_page=int(limit))
return jsonify({"data": list(map(delete_sa_instance_state, map(vars, paginate.items)))})


@bp.route('/user_data_is_login', methods=['GET', 'POST'])
def user_data_is_login():
try:
user = g.user
except:
return "error"
return jsonify(delete_sa_instance_state((vars(user))))


@bp.route('/delete_user', methods=['GET', 'POST'])
@root_required
def delete_user():
id_user = request.values.get("id_user")
User.query.filter_by(id_user=int(id_user)).delete()
db.session.commit()
return "success"


@bp.route('/update_user_and_pwd', methods=['GET', 'POST'])
@login_required
def update_user_and_pwd():
username = request.values.get("username")
password = request.values.get("password")
user = g.user
user.username = username
user.password = password
db.session.commit()
return "success"


@bp.route("/find_user_data_html", methods=['GET', 'POST'])
@teacher_required
def find_user_data_html():
name = request.values.get("name")
role = request.values.get("role")
grade = request.values.get("grade")

res_or = db.session.query(User).filter(or_(User.name == name, User.role == role, User.grade == grade)).all()
str1 = ""
for user in res_or:
print(vars(user))
str1 += f'''
<tr>
<td>{user.id_user}</td>
<td>{user.name}</td>
<td>{user.username}</td>
<td>{user.phone}</td>
<td>{user.grade}</td>
<td>{user.role}</td>
<td>{user.password}</td>
</tr>
'''
return str1


@bp.route("/login_out", methods=['GET', 'POST'])
@login_required
def login_out():
"""删除session数据"""
if session.get("id_user"):
del session["id_user"]
return "success"


@bp.route("/teacher_register", methods=['GET', 'POST'])
@root_required
def teacher_register():
value = request.values
user = User(username=value.get("username"),
password=value.get("password"),
name=value.get("name"),
phone=value.get("phone"),
role="教师",
power=1,
grade="null",
)
db.session.add(user)
db.session.commit()
return "注册成功"

flask pip依赖

flask_requirements.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
alembic==1.5.6
asgiref==3.3.1
beautifulsoup4==4.9.3
bleach==3.3.0
blinker==1.4
certifi==2020.12.5
chardet==4.0.0
click==7.1.2
coverage==5.4
cycler==0.10.0
dnspython==2.1.0
dominate==2.6.0
email-validator==1.1.2
Faker==6.6.3
Flask
Flask-Bootstrap
Flask-Images
Flask-Login
Flask-Mail
Flask-Migrate
Flask-Moment
Flask-PageDown
Flask-Script
Flask-SQLAlchemy
Flask-Uploads
Flask-WTF
ForgeryPy==0.1
freetype-py==2.2.0
future==0.18.2
idna==2.10
image==1.5.33
imbalanced-learn==0.7.0
importlib-metadata==3.4.0
itsdangerous==1.1.0
Jinja2==2.11.3
jinja2-markdown==0.0.3
joblib==1.0.1
json-tricks==3.15.5
jsonify==0.5
Mako==1.1.4
Markdown==3.3.3
MarkupSafe==1.1.1
mccabe==0.6.1
numpy==1.19.5
olefile==0.46
packaging==20.9
Pillow==8.2.0
pillowcase==2.0.0
pyglet==1.5.14
Pygments==2.8.1
PyMySQL==1.0.2
pyparsing==2.4.7
python-dateutil==2.8.1
python-dotenv==0.15.0
python-editor==1.0.4
pytz==2021.1
requests==2.25.1
scikit-learn==0.24.1
scipy==1.5.4
six==1.15.0
soupsieve==2.2.1
SQLAlchemy==1.3.23
sqlparse==0.4.1
text-unidecode==1.3
threadpoolctl==2.1.0
typed-ast==1.4.1
typing-extensions==3.7.4.3
unrar==0.4
urllib3==1.26.3
visitor==0.1.3
webencodings==0.5.1
Werkzeug==1.0.1
wincertstore==0.2
wrapt==1.11.2
WTForms==2.3.3
zipp==3.4.0