-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.py
More file actions
275 lines (244 loc) · 8.88 KB
/
Copy pathmain.py
File metadata and controls
275 lines (244 loc) · 8.88 KB
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
import json
import logging
import math
import re
from flask import Flask, flash, render_template, request, redirect, session
from DBFactory import *
app = Flask(__name__)
# 设置日志格式
formatter = logging.Formatter(
"[%(levelname)s][%(asctime)s] %(filename)s-%(funcName)s:%(lineno)d - %(message)s"
)
# 设置日志处理器为流处理器,并指定格式化器
file_handler = logging.StreamHandler()
file_handler.setFormatter(formatter)
# 获取日志记录器,并添加处理器
log = logging.getLogger(__name__)
log.addHandler(file_handler)
# 设置日志级别
log.setLevel(logging.DEBUG)
app.secret_key = "abcdefgh!@#$%"
dbf = DBFactory()
stu_table_fieldname = [
"stu_id",
"stu_name",
"stu_sex",
"stu_age",
"stu_origin",
"stu_profession",
]
def validate_login():
return "userid" in session
def dict_str(dict):
return "{" + ", ".join(f"{k}={dict[k]}" for k in dict) + "}"
@app.get("/login")
def login_get():
return render_template("login.html")
@app.post("/login")
def login():
username = request.form["username"]
password = request.form["password"]
log.debug("request.form: %s", dict_str(request.form))
if dbf.validate_username_password(username, password):
session["userid"] = username
flash("登录成功", category="success")
return redirect("/")
log.info("登录失败,开始自动注册")
if len(dbf.do("select * from users where username=?", username)) > 0:
flash("密码错误", category="danger")
return render_template("login.html")
dbf.register(username, password)
flash("注册成功!请再次输入密码后点击登录", category="success")
return render_template("login.html")
@app.get("/")
def index():
"""
page_size 每一页最多多少内容
current_page 当前页码
total_size 总共多少条数据,用于页面计算有几页
stu_id
stu_name
stu_sex
stu_age
stu_origin
stu_profession
"""
if not validate_login():
flash("请先登录", category="danger")
return render_template("login.html")
tablename = "student_info"
where_str = []
sql = (
"SELECT s.stu_id,s.stu_name,s.stu_sex,s.stu_age,s.stu_origin,p.stu_profession FROM student_info s INNER JOIN stu_profession p "
"on s.stu_profession_id=p.stu_profession_id"
)
log.debug("request.args: %s", dict_str(request.args))
# 默认值
page_size = 10
current_page = 1
if "page_size" in request.args and not (
request.args["page_size"] == ""
or request.args["page_size"] is None
or request.args["page_size"] == " "
):
page_size = request.args["page_size"]
page_size = int(page_size)
log.debug(f"page_size被改为非默认值 {page_size}")
if "current_page" in request.args and not (
request.args["current_page"] == ""
or request.args["current_page"] is None
or request.args["current_page"] == " "
):
current_page = request.args["current_page"]
current_page = int(current_page)
log.debug(f"current_page被改为非默认值 {current_page}")
for key in request.args:
if (
key in stu_table_fieldname
and request.args[key] != None
and request.args[key] != ""
):
where_str.append(f"{key} like '%{request.args[key]}%'")
if len(where_str) > 0:
sql = sql + " where " + " and ".join(where_str)
log.debug(f"将要执行sql: {sql}")
result = dbf.do(sql)
total_size = len(result)
if total_size > page_size:
result = result[(current_page - 1) * page_size : current_page * page_size]
fields = dbf.get_fields(tablename)
fields = fields[: len(fields) - 1]
fields.append("专业")
return render_template(
"show1.html",
datas=result,
fields=fields,
total_page=math.ceil(total_size / page_size),
page_size=page_size,
current_page=current_page,
stu_name=request.args.get("stu_name", ""),
stu_id=request.args.get("stu_id", ""),
all_radios_value=request.args.get("all-radios-value", ""),
)
@app.route("/add", methods=["GET", "post"])
def add():
if not validate_login():
flash("请先登录", category="danger")
return redirect("login")
if request.method == "GET":
datas = dbf.all("stu_profession")
return render_template("add.html", datas=datas)
log.debug("request.form: %s", dict_str(request.form))
data = dict(
stu_id=request.form["stu_id"],
stu_name=request.form["stu_name"],
stu_sex=request.form["stu_sex"],
stu_age=request.form["stu_age"],
stu_origin=request.form["stu_origin"],
stu_profession_id=request.form["stu_profession"],
)
if len(dbf.do("select * from student_info where stu_id='%s'" % data["stu_id"])) > 0:
flash("添加失败!学号已存在", category="danger")
return redirect("/")
dbf.insert(data, "student_info")
flash("添加成功!", category="success")
return redirect("/")
@app.get("/multidel")
def multidel():
if not validate_login():
flash("请先登录", category="danger")
return redirect("login")
log.debug("request.args: %s", dict_str(request.args))
ids = json.loads(request.args["all-radios-value"])
try:
for id in ids:
dbf.delete_by_id("stu_id", id, "student_info")
log.debug("id将被删除: %s", " ; ".join(id for id in ids))
flash("删除成功!", category="success")
return redirect("/")
except:
flash("删除失败!", category="danger")
return redirect("/")
@app.route("/del2/<id>", methods=["GET"])
def delete_by_id(id):
if not validate_login():
flash("请先登录", category="danger")
return redirect("login")
log.debug("request.args: %s", dict_str(request.args))
try:
dbf.delete_by_id("stu_id", id, "student_info")
log.debug("id将被删除: %s", id)
flash("删除成功!", category="success")
return redirect("/")
except:
flash("删除失败!", category="danger")
return redirect("/")
@app.route("/update", methods=["GET", "post"])
def upadte():
if not validate_login():
flash("请先登录", category="danger")
return redirect("login")
if request.method == "GET":
id = request.args["id"]
result = dbf.do(f"select * from student_info where stu_id={id}")
datas = dbf.all("stu_profession")
return render_template("update.html", data=result[0], datas=datas)
log.debug("request.form: %s", dict_str(request.form))
data = dict(
stu_id=request.form["stu_id"],
stu_name=request.form["stu_name"],
stu_sex=request.form["stu_sex"],
stu_age=request.form["stu_age"],
stu_origin=request.form["stu_origin"],
stu_profession_id=request.form["stu_profession"],
)
dbf.update(data, "student_info")
flash("修改成功!", category="success")
return redirect("/")
@app.get("/multupdate")
def multiupdate():
if not validate_login():
flash("请先登录", category="danger")
return redirect("login")
log.debug("request.args: %s", dict_str(request.args))
students = json.loads(request.args["all-updates-data"])
for s in students:
stu_dict = {
"stu_id": s[0],
"stu_name": s[1],
"stu_sex": s[2],
"stu_age": s[3],
"stu_origin": s[4],
"stu_profession_id": 0,
}
# 检查名字是否合法
if not re.match(r"^[\u4e00-\u9fa5]{2,4}$", stu_dict["stu_name"]):
flash("修改失败!名字不合法", category="danger")
return redirect("/")
# 检查性别是否合法
if stu_dict['stu_sex'] not in ['男','女']:
flash("修改失败!性别不合法", category="danger")
return redirect("/")
# 检查年龄是否合法
if not re.match(r"^[0-9]{1,2}$", stu_dict["stu_age"]):
flash("修改失败!年龄不合法", category="danger")
return redirect("/")
# 检查籍贯是否合法
if not re.match(r"^[\u4e00-\u9fa5]{2,4}$", stu_dict["stu_origin"]):
flash("修改失败!籍贯不合法", category="danger")
return redirect("/")
# 检查专业是否合法
stu_profession = s[5]
for profession in dbf.all("stu_profession"):
if stu_profession == profession[1]:
stu_dict["stu_profession_id"] = profession[0]
break
if stu_dict["stu_profession_id"] == 0:
flash("修改失败!专业不存在", category="danger")
return redirect("/")
dbf.update(stu_dict, "student_info")
flash("修改成功!", category="success")
return redirect("/")
if __name__ == "__main__":
app.debug = True
app.run(port=50050)