完整代码:https://download.csdn.net/download/qq_38735017/87382415
题目描述
用户登陆后能发布留言,能对自己发布的留言进行管理,能查看分页显示留言列表。
能根据留言的发布者,和留言内容,做模糊查询。
功能设计
登录与注册
用户通过用户名、昵称、密码进行注册
用户通过用户名、密码进行登录
用户登录状态的保持
留言发布
- 留言标题
- 留言内容(富文本)
- 留言分类
- 保存留言草稿
留言阅读与评论
- 留言评论(回复评论)
- 留言阅读量
- 留言回复量
个人信息管理
- 显示用户注册时长
- 上传头像
- 修改昵称
- 修改密码
个人留言管理
- 留言修改
- 留言隐藏
- 评论管理
- 我的消息(对我留言的评论,对我评论的回复)
全局搜索
- 模糊搜索所有可见留言
- 模糊搜索用户
- 详细设计
- 数据库设计
- 表 2.1.1 user 用户表(标蓝约束非数据库约束,由后端程序控制)
表 2.1.2 message 留言表
表 2.1.3 comment 评论表
使用的框架和库
前端:
Bootstrap--用于为组件提供美观的外观Bootbox--Bootstrap插件,用于显示美观的对话框JQuery--用于简化JavaScript操作MD5--用于对密码传输进行加密UEditor--百度富文本编辑器,用于对留言内容的编辑
后端
Flask--PythonWeb框架SQLAlchemy--数据库ORMJinja2--模板引擎,用于后端渲染页面mysql-connector-python--MySQL
程序结构
程序采用 MVC 架构,以业务逻辑、数据、显示界面分离的方式组织代码,保证了代码的可读性和可扩展性。
Model 使用 SQLAlchemy 映射到数据库,将用户数据持久化到数据库,并提供数据存取的接口; 前端页面 View 由 Jinja2 渲染,将数据显示给用户,并接受用户的输入;Controller 负责 Model 和 View 间的同步,当用户发出请求时,Controller 从 Model 中读取数据更新 View,用户输入数据时,Controller 检查数据的合理性并将数据更新到 Model。
最终项目结构如下:
图 2.3.1 Model 按映射的数据库表进行分类
图 2.3.2 View 按页面进行分类
图 2.3.3 Controller 按服务功能进行分类
功能介绍
登录与注册
首先用户在未登录状态下访问任何需要登录的页面,将自动重定向到登录页面,在登录完成后将自动重定向回原来要访问的页面,原页面地址保存在查询参数 from 中,如图 3.1.1 所示:
图 3.1.1 重定向到登录页面功能
在未登录状态,可以访问的页面右上角均有注册按钮,单击注册按钮将跳转到注册页面,注册完成后页面自动跳转到原来的页面,原页面地址保存在查询参数 from 中,如图 3.1.2 所示:
图 3.1.2 注册页面
在注册时,需要输入用户名(用户名不可重复)、昵称、密码,并确认输入的密码,单击注册,会检查输入数据的合法性,若某项数据有误,将给出相应的提示,如图 3.1.3 和图 3.1.4 所示:
图 3.1.3 确认密码与密码不相同时给出的提示
图 3.1.4 用户名重复给出的提示
一旦提交了正确的数据,将提示注册成功,并且自动跳转到原来的页面。下一步,用户可以通过刚刚注册的账号进行登录,用户既可以在上文提到的自动重定向的登录页面登录,也可以点击页面右上角的登录按钮,在弹出的模态框中进行登录,如图 3.1.5 所示:
图 3.1.5 登录模态框
在登录模态框中,输入用户名和密码,单击登录尝试登录。如果输入数据非法或密码错误,同样会弹出提示,这里不太展示。另外,可以勾选“记住我”复选框,在下次访问页面时,将使用保存的 Cookie 自动进行登录验证,Cookie 有效期 30 天,30 天后需要再次手动登录刷新有效期限。登录成功后,页面给出提示,并自动刷新页面。登录后页面右上角将展示用户中心,如图 3.1.6 所示:
图 3.1.6 登录后右上角显示用户中心
留言发布
用户在登录后,在页面右上角出现留言发布按钮,单击此按钮进入留言发布界面,如图 3.2.1 所示:
图 3.2.1 留言发布页面
发布留言时,需要填写留言标题、留言内容,并选择留言类型。留言内容不只可以输入文字,而且支持多数富文本格式,如表情、动图、图片、表格以及各种格式化文本,如图 3.2.2 所示:
图 3.2.2 留言的富文本编辑功能
用户编辑留言完成后,可选择存为草稿,待日后修改后再发布,也可以立即发布。单击发布留言按钮,若留言满足格式要求则发布成功,发布成功提示后自动跳转到留言阅读界面,以便作者观察效果是否符合预期,如图 3.2.3 所示:
图 3.2.3 留言发布成功后自动跳转到阅读页面
留言阅读与评论
留言根据作者在发布时选择的类型分类显示,在首页,每个类型占据一个版块,版块显示目前最热门(根据回复数量排名)的前三条留言。版块顶部标明了留言分类名称和该分类下的留言数量,如图 3.3.1 所示:
图 3.3.1 首页显示热门留言
用户可以直接点击留言标题进入留言阅读界面,也可点击版块上方或右侧边栏分类名称,进入该分类下了留言列表界面,如单击学习交流区,进入学习交流分类的留言列表,如图 3.3.2 所示:
图 3.3.2 分类留言列表界面
留言列表每页显示 10 条,以发布时间降序排列,页面最下方显示了分页按钮,点击后页面显示下一页内容,如图 3.3.3 和图 3.3.4 所示:
图 3.3.3 页面底部显示分页按钮
图 3.3.4 列表显示下一页内容
点击留言标题进入留言阅读界面,界面与上文图 3.2.3 给出的相同。在阅读界面,显示留言作者、发布时间、阅读次数、回复次数等信息,同时可以在下方评论框对留言内容进行评论,评论发表后立即显示在留言下方评论区,如图 3.3.5 所示:
图 3.3.5 对留言进行评论
对于自己发表的评论,用户可以进行隐藏/显示的控制,对于所有一级评论,用户可以对评论进行回复,单击回复按钮,将弹出一个回复框,发表后回复显示在对应评论下方,如图 3.3.6 和图 3.3.7 所示:
图 3.3.6 弹出的回复框
图 3.3.7 回复显示在对应评论下方
评论同样分页显示,项目使用 AJAX 异步加载渲染评论,评论换页时不需要页面整体刷新。
个人信息管理
用户将鼠标悬停在右上角头像上,可唤出个人信息管理菜单,如图 3.4.1 所示:
图 3.4.1 个人信息管理下拉列表
单击注销按钮,可以退出登录当前账号,以便切换账号。单击个人中心按钮,进入个人信息管理页面,在该页面用户可以修改自己的昵称、头像和密码,如图 3.4.2 所示:
图 3.4.2 个人中心
若需要修改昵称,在文本框输入新的昵称,点击保存按钮,若输入合法,则修改昵称成功,新昵称在用户昵称区显示。
若需要修改密码,进入修改密码 Tab,输入原密码和新密码进行密码更改,下次进入网站时需要重新输入密码手动登录。
若需要修改头像,点击修改头像按钮,弹出文件选择对话框,选择要上传的图片,若图片格式正确,则头像上传成功,页面显示新上传的头像,如图 3.4.3 和图 3.4.4 所示:
图 3.4.3 文件选择对话框
- 图 3.4.4 更换的头像立即显示
- 个人留言管理
- 在上文图 3.4.1 所示的个人信息管理下拉列表中,还可以管理自己发布的留言(留言管理)、评论(评论管理),还可以看到别人给自己留言的评论和回复。
单击留言管理按钮,分页显示自己发布的所有留言,对于每条留言,可以进行隐藏/显示切换和修改操作。另外,如果一条留言是隐藏的,则会在标题前显示红色 hidden 标签,如果一条留言是草稿,则会在标题前显示黄色 drafted 标签,如图 3.5.1 所示:
图 3.5.1 留言管理页面
单击评论管理按钮,分页显示自己发表过的所有评论,并显示回复的用户头像和昵称,以及评论发表的日期等信息,同样,自己的评论可以进行隐藏/显示切换,另外点击评论内容可以跳转到相应留言阅读界面,如图 3.5.2 所示:
图 3.5.2 评论管理页面
单击我的消息按钮,分页显示与我相关的评论和回复,点击评论内容可以进入相应留言阅读页面,如图 3.5.3 所示:
图 3.5.3 我的消息页面
全局搜索
点击任何页面上方导航栏的搜索按钮,可以进入全局内容搜索页面,如图 3.6.1 所示:
图 3.6.1 全局搜索页面入口
搜索页面可以搜索留言,也可以搜素用户,默认搜索的是留言,都使用了模糊匹配的搜索方式。在搜索栏输入需要检索的关键词,敲击回车或点击搜索按钮进行留言搜索,将显示所有标题和内容包含关键字的留言,如图 3.6.2 所示:
图 3.6.2 搜索留言
若需要搜索用户,则点击搜索栏下方用户 Tab,将自动对关键字进行查询并显示结果,如图 3.6.3 所示:
图 3.6.3 搜索用户
搜索结果同样使用 AJAX 技术异步分页加载,不需要刷新整个页面即可显示搜索结果。
建议老师代码验证的步骤
数据库建立
项目下有建表脚本,bbs-demo/sql/setup.sql 包含项目需要的所有表以及测试数据,在运行项目前请老师先使用 source 命令或相关工具建立表结构:
source 所在路径\setup.sql
项目依赖
项目后端代码依赖的库和框架保存在 bbs-demo/requirements.txt 中,请老师使用 pip 或类似命令安装项目依赖:
pipinstall-rrequirements.txt
总结
项目难点及解决方案
难点:系统较复杂,若功能分层不合理将各模块循环引用,降低代码可读性、可扩展性不说,还极有可能导致 ImportError,当后期功能增多时,各功能模块耦合严重,ImportError 发生的可能大大增加。
解决方案:查阅了几种常见的 Web 项目代码组织方式和几种软件架构模式,选择了 Model-View-Controller 的软件架构,再结合 Flask 提供的模块化工具 Blueprint 类和 init_app()等方法,成功解决了循环引用问题,并获得了较为清晰的代码层次结构。
难点:原生的 HTML 组件难以做到美观。
解决方案:搭配使用了 CSS 和 Bootstrap 框架,使用了许多 Bootstrap 提供的简约美观的组件,解决了页面美观问题。
难点:纯后端渲染的页面不够灵活,比如分页时必须刷新整个页面,且得到的页面不够动态,用户交互感不足。
解决方案:利用两天的时间学习了 JS、CSS、jQuery 和 AJAX 技术,分页时使用 AJAX 异步动态获取数据,再使用 jQuery 局部刷新页面,解决了分页问题;利用 CSS 配合 JS 以及 jQuery 提供的简单动画,实现了前端交互的动态效果,如上文图 3.4.1 所示鼠标悬浮显示下拉菜单的效果,提高了页面交互感。
缺点和不足
原计划增加绑定安全邮箱和找回密码的功能,但低估了项目的难度,时间不足,只是增加了相应的页面,但并没有后端功能支持
有些页面加载需要多次访问数据库,有些页面刷新一次就要访问一次数据库,造成性能的降低,可以考虑增加缓存和页面静态化功能
收获
首先,这次课程设计不仅是对 Python 基础知识的全面检验,也一定程度上促使了我接触新的技术,为了做出美观的界面,我学习了 CSS 和 Bootstrap;为了给页面添加动态效果,我学习了 JS 和 AJAX;为了简化 JS 编程,我又学习了 jQuery。这让我加深了对前端代码的运行方式以及前后端的交互机理的理解,我想无论以后从事前端还是后端工作,这次课程设计的经历都会对我的工作有所帮助。
另外,独立完成一个实用的项目,是对我编程能力的一次巨大提升。通过这次机会,我把以前理解并不深刻的 MVC 架构模式用到了实际项目中,把 Python 的基础知识又翻出来重新巩固了一遍,锻炼到了对代码结构的组织能力和对编程知识的全面运用能力。而这是做小练习,编写一些支离破碎的代码片段,所锻炼不到的。