一 **** 用户模块展示
任务

用户模块
个人信息展示
密码修改
查询可借图书
查询所借图书
1. 功能
图书相关需要简历图书相关表!
1.1 个人信息展示
后台
userinfo.html页面
流程: 登录后用户资料保存再sesion中--->查询根据id查询
@users.route('/userinfo', methods=['GET'])
def user_info():
'''根据id,或用户名查询,展示用户资料'''
id = session.get('user_id')
print(f'用户id:{id}')
reader = Reader.query.filter_by(id=id).all()
if len(reader)>0:
return render_template('userinfo.html',reader=reader[0])
else:
return render_template('reader.html',msg='查询无结果!')
<!--注册需要的列: 用户名,等级,密码,电话号码-->
<form class="form-signin" role="form" method="post" action="/register">
{#设置隐藏的csrf_token,使用了CSRFProtect保护app之后,即可使用csrf_token()方法#}
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<h2 class="form-signin-heading">个人资料</h2>
<input type="text" name='id' class="form-control" value="{{ reader.id }}"
required disabled>
<select name="reader_grade" id="input${1/(\w+)/\u\1/g}" class="form-control"
required="required">1.2 密码修改
流程
<option value="1" {% if reader.grand_id==1 %} selected {% endif %}>一级读者
</option>
<option value="2" {% if reader.grand_id==2 %} selected {% endif %}>二级读者
</option>
<option value="3" {% if reader.grand_id==3 %} selected {% endif %}>三级读者
</option>
</select>
<input type="text" name='reader_name' class="form-control" placeholder="用户
名" value="{{ reader.reader_name }}" required>
<input type="text" name='reader_pass' class="form-control" placeholder="密码"
value="{{ reader.reader_pass }}" required>
<input type="text" name='phone' class="form-control" placeholder="电话"
value="{{ reader.phone }}" required>
</form>
# 完整流程
1. 前端表单校验(验证旧密码是否正确,验证三个表单数据不能为空,新密码和旧密码都相等)
`https://www.cnblogs.com/bignote/p/13307812.html`
2. 后端实现(前端未加验证,后台需要验证数据完整性)
获取数据--》验证数据完整性---》先查再改!--》跳转页面
@users.route('/updatepwd', methods=['GET','POST'])
def update_pwd():
if request.method=='GET':
return render_template('update_pwd.html')
else:
# 1.获取数据,2,完整性判断 3.修改
old_pwd = request.form.get('old_pwd')
pwd1 = request.form.get('pwd1')
pwd2 = request.form.get('pwd2')
id = session.get('user_id')修改密码页面
1.3 查询可借图书
图书馆数量大于1的全部显示给用户,并且提供用户查看书籍详细介绍
reader = Reader.query.filter_by(id=id).first()
# 判断
if not all([old_pwd,pwd1,pwd2]): # 判断列表中的所有变量是否都有值! 都有值返
回true
msg = '字段不能为空'
return render_template('update_pwd.html',msg=msg)
else:
# 判断用户名是否正确,两次密码是否相等
if reader.reader_pass !=old_pwd:
msg = '密码输入错误!'
return render_template('update_pwd.html',
msg=msg,old_pwd=old_pwd,pwd1=pwd1,pwd2=pwd2)
if pwd1 != pwd2:
msg = '密码不一致!'
return render_template('update_pwd.html',
msg=msg,old_pwd=old_pwd,pwd1=pwd1,pwd2=pwd2)
try:
reader.reader_pass = pwd2
db.session.commit()
return render_template('reader.html', msg='修改成功')
except Exception as e:
msg = '修改失败'
return render_template('reader.html', msg='修改失败')
<form class="form-signin" role="form" method="post" action="/updatepwd">
{#设置隐藏的csrf_token,使用了CSRFProtect保护app之后,即可使用csrf_token()方法#}
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<h2 class="form-signin-heading">修改密码</h2>
<input type="text" name='old_pwd' class="form-control" placeholder="请输入原
生密码" value="{{ old_pwd }}" required>
<input type="text" name='pwd1' class="form-control" placeholder="请输入新密码"
value="{{ pwd1 }}" required>
<input type="text" name='pwd2' class="form-control" placeholder="请再次输入新
密码" value="{{ pwd2 }}" required>
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<button class="btn btn-lg btn-primary btn-block" type="submit">提交</button>
</div>
</form>图书相关模型:图书类型,图书
#图书类别 BookType
class BookType(db.Model):
'''读者等级表'''
__tablename__ = "book_type" #表名
id = db.Column(db.Integer,primary_key=True,autoincrement=True) #id 主键自增
type_name = db.Column(db.String(50),nullable=True) # 级别名字
# 读者返回来引用 级别
readers =db.relationship('Book', backref='booktype')#指定读者对象,引用级别的别
名!
def __str__(self):
return self.type_name
class Book(db.Model):
'''读者等级表'''
__tablename__ = "book" #表名
id = db.Column(db.Integer,primary_key=True,autoincrement=True) #id 主键自增
book_name = db.Column(db.String(50),nullable=False) # 用户名
book_quantity = db.Column(db.Integer,nullable=False) # 书籍数量
bookInfo = db.Column(db.String(100),nullable=True) # 书籍说明
book_imgsrc = db.Column(db.String(50), nullable=True) # 书籍封面
author = db.Column(db.String(50), nullable=True) # 作者名字
price = db.Column(db.Integer,nullable=True) # 单价
bookConcern = db.Column(db.String(50), nullable=True) # 出版社
bookOutCount =db.Column(db.Integer,nullable=True) #出租次数
bookChar = db.Column(db.String(10), nullable=True) # 书籍首字母
book_type= db.Column(db.Integer,db.ForeignKey('book_type.id')) # 外键表名.id
def __str__(self):
return self.book_name
查询可借图书
图书馆数量大于1的全部显示给用户,并且提供用户查看书籍详细介绍
后台代码
@users.route('/booklist', methods=['GET'])
def book_list():
# 图书数量大于1的表示可借
books = Book.query.filter(Book.book_quantity > 1).all()
return render_template('book.html',books=books)
前台展示
<table class="table table-hover">
<thead>1.4 注销
清空session 中的所有数据,跳转到登录页面
<tr>
<th>id</th>
<th>封面</th>
<th>书名</th>
<th>作者</th>
<th>数量</th>
<th>单价</th>
<th>出版社</th>
<th>出租次数</th>
<th>书籍说明</th>
<th>图书类别</th>
<th>借阅/归还</th>
</tr>
</thead>
<tbody>
{% for item in books %}
<tr>
<td>{{ item.id }}</td>
<td>
<img src="/static/images/{{ item.book_imgsrc }}" class="img-
responsive" alt="Image" style="width:60px">
</td>
<td>{{ item.book_name }}</td>
<td>{{ item.author }}</td>
<td>{{ item.book_quantity }}</td>
<td>{{ item.price }}</td>
<td>{{ item.bookConcern }}</td>
<td>{{ item.bookOutCount }}</td>
<td>{{ item.bookInfo }}</td>
<td>{{ item.booktype.type_name }}</td>
<td>
<a type="button" href='#' class="btn btn-primary ">借阅</a>
<a type="button" href='#' class="btn btn-primary ">归还</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
@app.route("/logout",methods=['GET'])
def logout():
sesison.clear()
return render_template('index.html')
网友评论