一、系统概要说明
1、设计数据库,数据库设计是网站设计的重点,需要对网站需求进行分析,设计适合网站需求的数据库。
2、注册页面,设计网站需要用户的使用,注册则是重要的一部分,用户注册需要对用户信息的管理,因此,需要数据库的连接,进行用户注册的验证。
3、登录功能,在用户注册了账号后,拥有了该网站的使用权,则可以进行登录,而登录也需要数据库的验证。
4、用户发布问答,该网站是博客的发布平台,用户可以将身边的见闻发布到网站,此功能也需要数据库的连接,将用户发表的问答存到数据库的question表中,以用户唯一的id号作为外键。
5、用户发布博客的问答后则会跳到网站首页,首页是展示该网站的所以博客信息,以发布的最新日期排序进行展示,用户可根据兴趣点击查看网站的博客标题,进入博客的详情页面,了解博客的具体信息。
6、博客详情页中具有评论及推荐文章功能,用户可对博客进行评论发表还可对文章进行点赞及收藏,此操作过程存入数据库的comment表中,以用户id作为外键;网站还根据用户感兴趣的博客推荐相应类型的文章。
7、个人中心页面,网站根据用户的活跃度,呈现用户发布的新闻,评论文章,收藏文章以及点赞。
8、网站具有模糊搜索功能,当用户查找相应信息是,可根据用户输入的信息进行模糊搜索,提高用户的体验度。
9、密码保护功能,用户注册时设置的密码存储到数据库中,此时数据会将用户的密码进行加密,提高用户使用的安全性。
二、网站结构设计
1.登录注册
2.修改个人信息
3.搜索
4.发布博客和评论
三.模块详细设计
1.首页模块
@app.route(\'/\')
def index():
if request.args.get(\'info\'):
info = request.args.get(\'info\')
else:
info = None;
context = {
\'questions\': Question.query.order_by(\'-creat_time\').all(),
\'cf\': Cf.query.all(),
\'info\': info,
\'hot\': Question.query.order_by(\'-click\').all()[0:5]
} return render_template(\'index.html\', **context)
2.注册模块
@app.route(\'/regist/\', methods=[\'GET\', \'POST\'])
def regist():
if request.method == \'GET\':
# 打开注册页的模板
return render_template(\'regist.html\')
else: # 收到用户上传的信息
username = request.form.get(\'username\')
password = request.form.get(\'password\')
user = User.query.filter(User.username == username).first()
if user:
return \'error:user exitst\'
else:
user = User(username=username, password=password)
db.session.add(user) # 加入数据库
db.session.commit()
return redirect(url_for(\'login\'))
3.登录模块
@app.route(\'/login/\', methods=[\'GET\', \'POST\'])
def login():
if request.method == \'GET\':
return render_template(\'login.html\')
else:
username = request.form.get(\'username\')
password = request.form.get(\'password\')
user = User.query.filter(User.username == username).first()
if user:
if user.check_password(password):
session[\'username\'] = user.username
session[\'user_id\'] = user.id
session.permanent = True
# 重新定位到首页
return redirect(url_for(\'index\'))
else:
# 重新定位到注册
return redirect(url_for(\'login\'))
else:
return redirect(url_for(\'login\'))
4.发布模块
@app.route(\'/question\', methods=[\'GET\', \'POST\'])
@loginFirst
def question():
if request.method == \'GET\':
cf = Cf.query.all()
return render_template(\'question.html\', cf=cf)
else:
title = request.form.get(\'title\')
detail = request.form.get(\'detail\')
author_id = request.form.get(\'author_id\')
cf = request.form.get(\'cf\')
question = Question(title=title, detail=detail, author_id=author_id, cf=cf)
db.session.add(question) # 加入数据库
db.session.commit()
return redirect(url_for(\'index\'))
5.评论模块
@app.route(\'/answer/\', methods=[\'GET\', \'POST\'])
def answer():
if request.method == \'POST\':
question_id = request.form.get(\'question_id\')
author_id = request.form.get(\'author_id\')
detail = request.form.get(\'detail\')
comment = Comment(question_id=question_id, author_id=author_id, detail=detail)
db.session.add(comment)
db.session.commit()
return redirect(url_for(\'detail\', question_id=question_id))
@app.route(\'/commentaries/<user_id>\')
def commentaries(user_id):
userCommentaries = Comment.query.filter(Comment.answer_id == user_id).all()
num = len(userCommentaries)
id = session.get(\'user_id\')
if id:
user = User.query.filter(User.id == id).first()
else:
user = {}
return render_template(\'commentaries.html\', userCommentaries=userCommentaries, user=user, num=num)
6.更改个人信息
@app.route(\'/uploadLogo/<user_id>\', methods=[\'GET\', \'POST\'])
def uploadLogo(user_id):
user = User.query.filter(User.id == user_id).first()
f = request.files[\'logo\']
basepath = os.path.dirname(__file__) # 当前文件所在路径
upload_path = os.path.join(basepath, \'static/uploads\', f.filename) # 注意:没有的文件夹一定要先创建,不然会提示没有该路径
f.save(upload_path)
user.icon = \'uploads/\' + f.filename
db.session.commit()
return redirect(url_for(\'setPassword\', id=user_id));
@app.route(\'/setPassword/<id>\', methods=[\'GET\', \'POST\'])
@loginFirst
def setPassword(id):
if request.method == \'GET\':
return render_template(\'setPassword.html\')
else:
user = User.query.filter(User.id == id).first()
if user:
if user.check_password(request.form.get(\'old\')):
user.password = request.form.get(\'new1\')
db.session.commit()
info = \'修改成功\'
else:
info = \'原密码错误\'
else:
info = \'未知错误\'
return redirect(url_for(\'index\', info=info))
7.模糊查询
@app.route(\'/search\')
def search():
qu = request.args.get(\'q\')
c = \'\' if request.args.get(\'c\') == \'\' else request.args.get(\'c\')
y = \'\' if request.args.get(\'y\') == \'\' else request.args.get(\'y\')
query = Question.query.filter(
or_(
Question.title.contains(qu),
Question.detail.contains(qu),
),
Question.cf.like(\'%\' + c + \'%\'),
Question.creat_time.like(\'%\' + y + \'%\'),
).order_by(\'-creat_time\').all()
context = {
\'questions\': query,
\'cf\': Cf.query.all(),
\'hot\': Question.query.order_by(\'-click\').all()[0:5]
}
return render_template(\'index.html\', **context)
四.数据库设计
Collection = db.Table(
\'collection\',
db.Column(\'id\', db.Integer, primary_key=True, autoincrement=True),
db.Column(\'book_id\', db.Integer, db.ForeignKey(\'question.id\')), # 评论对应的文章的id
db.Column(\'collection\', db.Integer, db.ForeignKey(\'user.id\')), # 收藏用户的id
db.Column(\'createdate\', db.DATETIME) # 发布时间
)
class User(db.Model):
__tablename__ = \'user\'
# 建立一个表user
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(20), nullable=False)
_password = db.Column(db.String(200), nullable=False)
say = db.Column(db.String(50))
icon = db.Column(db.String(50))
collection = db.relationship(\'Question\', secondary=Collection, backref=db.backref(\'user\', lazy=\'dynamic\'),
lazy=\'dynamic\')
@property
def password(self):
return self._password
@password.setter
def password(self, row_password):
self._password = generate_password_hash(row_password)
def check_password(self, row_password):
return check_password_hash(self._password, row_password)
class Comment(db.Model):
__tablename__ = \'comment\'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
author_id = db.Column(db.Integer, db.ForeignKey(\'user.id\'))
question_id = db.Column(db.Integer, db.ForeignKey(\'question.id\'))
creat_time = db.Column(db.DateTime, default=datetime.now())
detail = db.Column(db.TEXT, nullable=False)
question = db.relationship(\'Question\', backref=db.backref(\'comment\'))
author = db.relationship(\'User\', backref=db.backref(\'comment\', order_by=creat_time.desc))
class Question(db.Model):
__tablename__ = \'question\'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100), nullable=False)
detail = db.Column(db.Text, nullable=False)
creat_time = db.Column(db.DateTime, default=datetime.now)
author_id = db.Column(db.Integer, db.ForeignKey(\'user.id\'))
cf = db.Column(db.Integer, db.ForeignKey(\'cf.id\'))
look = db.Column(db.Integer)
click = db.Column(db.Integer)
author = db.relationship(\'User\', backref=db.backref(\'question\'))
cfClass = db.relationship(\'Cf\', backref=db.backref(\'question\'))
六.成品展示