希望你已经看完了这个视频并自己动手做过一遍了。
web版学生信息后台管理系统(Python+flask框架+Bootstrap5)期末毕设必备_哔哩哔哩_bilibili
如果没有,我诚挚的建议你去看完再回来。
由于我做的时候没有留基础版,所以代码都是进阶版,但是进阶主要都在外观上,所以对功能没什么影响,应该也不影响理解,因为大多都是模板。除了我做的“高级功能聚合查找”。后面会讲到。
接下来我会把增删改查部分的函数如何改用mongodb *** 作完成讲掉,至于更高级的功能改进(比如登录验证之类的)我比较懒的去讲,我会直接发代码,也懒得再水几篇了。看不懂就自己学,学不会可以评论区答疑。
后端出现的主要函数说明:(可以先不看)
函数名 | 功能 |
render_template | 渲染网页 |
redirect | 对网页重定向,跳转至另一个网页 |
flask的POST和GET方法 | 分别向网页传参收参 |
collection.count_documents | 调用了mongo的数据库函数,清点数据库中符合条件的数据个数 |
collection.find_one | 调用了mongo的数据库函数,查找符合条件的一条数据 |
前端出现的主要函数说明:(可以先不看)
函数名或控制字段 | 功能 |
class | 控制内容类 |
page-header | 作为标题 |
text-center | 内容居中 |
text-primary | 内容呈现蓝色 |
style | 控制风格 |
margin | 控制边缘 |
<h1> | 最大字号标题 |
style="background-image: | 控制背景图片 |
background-size: cover; | 背景图片大小:覆盖全网页 |
alt | 若图片无法正常加载则显示其他内容 |
class="form-floating" | 启用浮动标签 |
style="width:400px; | 控制宽度 |
placeholder | 占位符,服务于浮动标签 |
button | 控制按钮 |
href | 超链接跳转至 |
前端代码:
@app.route('/admin')
def admin():
# 重新传一遍数据库
users = collection.find({}, {'_id': 0})
return render_template('admin.html', users=users)
函数名 | 功能 |
collection.find({}, {'_id': 0}) | 调用了mongo的数据库函数,传回数据库全部数据,删去_id字段 |
后端代码
运营商信息管理系统
管理员登录
新增用户信息
查找
电话号码
姓名
密码
身份z号
是否管理员
¥话费余额
¥本期应付
¥月基本费
¥套餐外费用
套餐含语音通话/min
套餐含流量/GB
语音通话总时长/min
流量已使用/GB
是否开通VPN
超出语音/min
超出流量/GB
{#需要将python的对象数据显示到浏览器上,模板语法
比较出名的是jinjia2
#}
{# 从数组中取出数据,slice切片,for循环 #}
{# 用法{{ users }} #}
{% for user in users %}
{{ user.phone }}
{{ user.name }}
{{ user.password }}
{{ user.IDnum }}
{{ user.ADMIN }}
{{ user.balance }}
{{ user.payable }}
{{ user.basic_fee }}
{{ user.extra_fee }}
{{ user.basic_call }}
{{ user.basic_traffic }}
{{ user.total_call }}
{{ user.total_traffic }}
{{ user.VPN_service }}
{{ user.extra_call }}
{{ user.extra_traffic }}
{ user.phone }}">删除
{ user.phone }}">修改
{% endfor %}
首次出现的主要函数或控制字段说明:
函数名 | 功能 |
<tbody> | 绘制表格 |
<tr> | 表格内容开始 |
<th> | 表格内容 |
href="/change?phone={{ user.phone }}" | 高级 *** 作:用?借用网址路由传参,参数限制为字符串或整型 |
网页效果如图:
我不清楚你们直接这样能不能运行,因为增删改查还没写。。。可以先不急着运行。
2.1增 (其实我在运行admin之前先用增传了一些数据进去,方法就是先按下面那个doc格式写好,如何 collection.insert_one(doc)进去),写好增之后你也可以啦,写进去的都能在studio3t里看到,也可直接在studiost里改。@app.route('/add', methods=['GET', 'POST'])
def add():
# 复制框架源码
if request.method == 'POST':
phone = request.form.get('phone')
name = request.form.get('name')
password = request.form.get('password')
IDnum = request.form.get('IDnum')
ADMIN = request.form.get('ADMIN')
balance = request.form.get('balance')
payable = request.form.get('payable')
basic_fee = request.form.get('basic_fee')
extra_fee = request.form.get('extra_fee')
basic_call = request.form.get('basic_call')
basic_traffic = request.form.get('basic_traffic')
total_call = request.form.get('total_call')
total_traffic = request.form.get('total_traffic')
VPN_service = request.form.get('VPN_service')
extra_call = request.form.get('extra_call')
extra_traffic = request.form.get('extra_traffic')
print('获取的用户信息:', phone, name, password,
IDnum, ADMIN, balance, payable, basic_fee, extra_fee,
basic_call, basic_traffic, total_call,
total_traffic, VPN_service, extra_call, extra_traffic)
doc = {'phone': phone, 'name': name, 'password': password,
'IDnum': IDnum, 'ADMIN': ADMIN, 'balance': balance,
'payable': payable, 'basic_fee': basic_fee,
'extra_fee': extra_fee, 'basic_call': basic_call,
'basic_traffic': basic_traffic,
'total_call': total_call, 'total_traffic': total_traffic,
'VPN_service': VPN_service, 'extra_call': extra_call,
'extra_traffic': extra_traffic}
collection.insert_one(doc)
return redirect('./admin')
return render_template('add.html')
首次出现的主要函数或控制字段说明:
函数名 | 功能 |
request.form.get | 获取从前端传回的数据的一个字段 |
collection.insert_one | monogodb数据库 *** 作,添加一条数据 |
网页效果如图:
2.2删后端代码:
@app.route('/delete')
def delete_user():
# 在后台需要拿到用户的名字
print(request.method)
phonenum = request.args.get('phone')
# 再传一遍数据库
users = collection.find({}, {'_id': 0})
# 找到用户并删除
for user in users:
if user['phone'] == phonenum:
# 要在数据库里删除user
collection.delete_one({'phone': phonenum})
return redirect('./admin')
首次出现的主要函数或控制字段说明:
函数名 | 功能 |
request.args.get | 获取从前端传回的数据一个结论的一个字段 |
collection.delete_one | monogodb数据库 *** 作,删除一条数据 |
网页效果:点击删除按钮后,管理员页面上立即消失这一条数据。
2.3改后端
@app.route('/change', methods=["GET", "POST"])
def change_user():
phone = request.args.get('phone')
if request.method == 'POST':
phone = request.form.get('phone')
name = request.form.get('name')
password = request.form.get('password')
IDnum = request.form.get('IDnum')
ADMIN = request.form.get('ADMIN')
balance = request.form.get('balance')
payable = request.form.get('payable')
basic_fee = request.form.get('basic_fee')
extra_fee = request.form.get('extra_fee')
basic_call = request.form.get('basic_call')
basic_traffic = request.form.get('basic_traffic')
total_call = request.form.get('total_call')
total_traffic = request.form.get('total_traffic')
VPN_service = request.form.get('VPN_service')
extra_call = request.form.get('extra_call')
extra_traffic = request.form.get('extra_traffic')
# user = collection.find({}, {'_id': 0})这个好像没用到?
# 加一个update
collection.update_one(
{'phone': phone}, # 筛选出指定数据
{'$set': {
'phone': phone, 'name': name, 'password': password,
'IDnum': IDnum, 'ADMIN': ADMIN, 'balance': balance,
'payable': payable, 'basic_fee': basic_fee,
'extra_fee': extra_fee, 'basic_call': basic_call,
'basic_traffic': basic_traffic,
'total_call': total_call, 'total_traffic': total_traffic,
'VPN_service': VPN_service, 'extra_call': extra_call,
'extra_traffic': extra_traffic
# $set:对当前字典满足筛选器的项进行修改,如果键名不存在则创建键值对
}
})
return redirect('./admin')
users = collection.find({}, {'_id': 0})
for user in users:
if user['phone'] == phone:
# 需要在页面中渲染用户的数据
return render_template('change.html', user=user)
前端:
修改
{# 导入框架的css #}
2.4 查
这里有一个聚合查找,就是姓名手机号身份z号三个选一个搜索就可以出结果。可以自己看一看,其实不难。
@app.route('/search', methods=['GET', 'POST'])
def search():
user = {}
if request.method == 'POST':
# request可以拿到前端浏览器传回的数据
mix = request.form.get('mix')
print(mix)
# name = request.form.get('name')
# IDnum = request.form.get('IDnum')
c1 = collection.count_documents({'phone': mix})
c2 = collection.count_documents({'name': mix})
c3 = collection.count_documents({'IDnum': mix})
count = c1 + c2 + c3
# 先查询返回的值是否存在
# print(phone, password, count)
if count == 0:
# 想return到一个提示错误的网页
return redirect('./search_name_error')
else:
# 跳转到一个查找结果页面search_result,类似admin
# 要传出一个键值对,到底之前给了哪个
condition = {}
if c1 == 1:
condition = {'phone': mix}
elif c2 == 1:
condition = {'name': mix}
else:
condition = {'IDnum': mix}
print(condition)
user = collection.find_one(condition)
# return render_template('search.html', user=user)
return render_template('search.html', user=user)
前端
查找
新增用户信息
查找
电话号码
姓名
密码
身份z号
是否管理员
¥话费余额
¥本期应付
¥月基本费
¥套餐外费用
套餐含语音通话/min
套餐含流量/GB
语音通话总时长/min
流量已使用/GB
是否开通VPN
超出语音/min
超出流量/GB
{#需要将python的对象数据显示到浏览器上,模板语法
比较出名的是jinjia2
#}
{# 从数组中取出数据,slice切片,for循环 #}
{# 用法{{ users }} #}
{# {% for user in users %}#}
{{ user.phone }}
{{ user.name }}
{{ user.password }}
{{ user.IDnum }}
{{ user.ADMIN }}
{{ user.balance }}
{{ user.payable }}
{{ user.basic_fee }}
{{ user.extra_fee }}
{{ user.basic_call }}
{{ user.basic_traffic }}
{{ user.total_call }}
{{ user.total_traffic }}
{{ user.VPN_service }}
{{ user.extra_call }}
{{ user.extra_traffic }}
{ user.phone }}">删除
{ user.phone }}">修改
{# {% endfor %}#}
这样就结束了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)