在当今数字化信息时代,个人博客已成为人们分享知识、经验和观点的重要平台。然而,现有博客系统往往存在功能单一、用户互动不足以及个性化推荐缺失等问题。为此,本论文设计并实现了一个的个人博客系统,采用Flask框架开发,旨在为博主、读者及管理员打造一个功能丰富、互动性强且高度个性化的博客平台。系统为博主用户提供通提供了包括首页展示、网站公告、新闻资讯、博客文章创作与管理以及个人中心管理在内的全方位功能;针对读者用户,系统提供了个性化的博客文章推荐服务,基于用户注册时选择的标签,精准推荐符合用户兴趣的博客文章,同时支持文章浏览、收藏和评论管理功能,为读者带来优质的阅读体验;管理员则可通过后台进行系统用户管理、博客标签管理、博客文章管理、系统设置管理、网站公告管理以及资源管理等一系列操作,确保系统的稳定运行和内容质量。经过严格的测试与优化,系统运行稳定,操作简便,不仅有效提升了博主的创作效率和内容管理能力,增强了读者的阅读体验和互动性,还为管理员提供了便捷的管理工具,有力推动了个人博客平台向更加个性化、智能化的方向发展,为用户提供一个良好的博客创作与阅读环境。
关键词:Flask框架;个人博客系统;Python;MySQL
Abstract
In today’s digital information age, personal blogs have become an important platform for people to share knowledge, experience, and perspectives. However, existing blog systems often have problems such as single functionality, insufficient user interaction, and lack of personalized recommendations. Therefore, this paper designs and implements a personal blog system developed using the Flask framework, aiming to create a feature rich, interactive, and highly personalized blog platform for bloggers, readers, and administrators. The system provides blogger users with comprehensive functions including homepage display, website announcements, news and information, blog article creation and management, and personal center management; For readers, the system provides personalized blog article recommendation services. Based on the tags selected by users during registration, it accurately recommends blog articles that meet their interests. At the same time, it supports article browsing, bookmarking, and comment management functions, bringing readers a high-quality reading experience; Administrators can perform a series of operations such as system user management, blog tag management, blog article management, system settings management, website announcement management, and resource management through the backend to ensure the stable operation and content quality of the system. After rigorous testing and optimization, the system runs stably and is easy to operate. It not only effectively improves the creative efficiency and content management ability of bloggers, enhances the reading experience and interactivity of readers, but also provides convenient management tools for administrators, effectively promoting the development of personal blog platforms towards a more personalized and intelligent direction, and providing users with a good environment for blog creation and reading.
Keywords: Flask framework; Personal blog system; Python;MySQL
目 录
随着互联网的普及和信息传播方式的多样化,个人博客逐渐成为人们分享知识、经验和创意的重要平台。在这样的时代背景下,人们对信息的获取和交流提出了更高的要求,传统博客系统在功能和用户体验方面逐渐暴露出一些局限性,如博主创作与管理不便、读者阅读体验不佳、用户互动性不足以及个性化推荐功能缺失等。因此,开发一款能够满足现代用户需求的个人博客系统具有重要的现实意义。
个人博客系统具有多方面重要意义。对于博主而言,它提供了一个自由创作与分享的平台,博主能够将自身的专业知识、兴趣爱好转化为文字内容,实现个人价值的输出与传播,还可通过读者反馈不断优化创作。对读者来说,丰富多样的博客文章为其提供了海量信息资源,涵盖不同领域与视角,满足了个性化的阅读需求,拓宽了知识视野。从宏观层面看,个人博客系统促进了知识在网络空间的广泛传播与交流,加速了信息流通,营造了良好的知识共享氛围,对推动互联网文化繁荣与发展起到积极作用。
国外在个人博客系统领域发展历史较为悠久,积累了丰富经验。众多成熟的博客平台,如 WordPress、Blogger 等,在全球范围内拥有庞大用户群体。它们凭借先进技术,实现了高度个性化定制,从页面布局到功能模块,博主可按需设置。在内容创作辅助方面,配备智能语法检查、写作建议等工具,提升创作效率。在社区建设上,构建完善社交网络,支持博主与读者深度互动,通过推荐算法精准推送内容,增强用户粘性,推动知识高效传播与交流。
国内随着互联网生态日益完善,个人博客系统研究与应用取得显著进展。国内博客平台结合本土用户习惯,创新推出多种功能。例如,部分平台强化移动端适配,实现随时随地创作与阅读。在内容审核上,利用高效算法与人工审核结合,保障内容合规。同时,积极挖掘垂直领域市场,针对不同兴趣爱好、专业领域打造特色博客社区,聚集同好人群,促进专业知识深度分享与交流,为博主与读者提供更精准服务。
综合国内外研究现状,当前个人博客系统在功能完善、用户体验优化方面成果斐然,但仍面临挑战。不同平台数据兼容性欠佳,限制用户跨平台迁移与信息共享。在内容管理上,如何在保障信息质量的同时,平衡审核效率与用户创作自由,是亟待解决的问题。此外,随着网络安全形势严峻,用户隐私保护成为焦点。未来,个人博客系统研究将聚焦提升系统兼容性,制定统一数据标准;优化内容管理机制,实现高效审核与创作自由的平衡;强化安全防护技术,保障用户信息安全,推动系统向更开放、规范、安全方向发展。
第一章是绪论,本文的开头部分,对本题目的研究背景和研究意义等一些做文字性的描述。
第二章研究了个人博客系统的所采用的开发技术和开发工具。
第三章是系统分析部分,包括系统总体需求描述、功能性角度分析系统需求、非功能性等各个方面分析系统是否可以实现。
第四章是系统设计部分,本文的重要部分,提供了系统架构的详细设计和一些主要功能模块的设计说明。
第五章是系统的具体实现,介绍系统的各个模块的具体实现。
第六章在前几章的基础上对系统进行测试和运行。
最后对系统进行了认真的总结,以此对未来有一个新的展望。
B/S(Browser/Server)架构是一种基于浏览器和服务器的应用架构模式。它以Web浏览器作为客户端,服务器端通过Web技术提供应用服务。客户端通过浏览器与服务器进行交互,用户无需安装专门的客户端应用程序,只需要通过互联网连接即可访问应用程序[1]。在B/S架构中,客户端主要承担用户界面的呈现和基本的输入输出功能,而核心的业务处理、数据存储等操作则由服务器端完成。这种架构的核心优势在于无需在每个客户端机器上安装或更新软件,只要用户的浏览器符合要求,就可以使用系统。
B/S(Browser/Server)架构是一种网络架构模型,其主要特点是客户端通过浏览器与服务器进行通信,所有的业务逻辑和数据处理都在服务器端完成,客户端仅负责展示数据[2]。B/S架构本质上是一种客户端-服务器模式的变体,它通过将传统的C/S(Client/Server)架构中的客户端功能移到浏览器中,简化了客户端的开发和维护工作。在B/S架构中,用户通过浏览器发送请求,浏览器负责展示从服务器获取的数据,服务器则处理请求并返回响应。该架构避免了安装和配置客户端软件的麻烦,也减少了对客户端硬件的依赖,适合于需要大规模部署和跨平台支持的应用系统。
Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站[3]。
Flask是目前十分流行的web框架,采用Python编程语言来实现相关功能。它被称为微框架(microframework),“微”并不是意味着把整个Web应用放入到一个Python文件,微框架中的“微”是指Flask旨在保持代码简洁且易于扩展,Flask框架的主要特征是核心构成比较简单,但具有很强的扩展性和兼容性,程序员可以使用Python语言快速实现一个网站或Web服务。一般情况下,它不会指定数据库和模板引擎等对象,用户可以根据需要自己选择各种数据库。Flask自身不会提供表单验证功能,在项目实施过程中可以自由配置,从而为应用程序开发提供数据库抽象层基础组件,支持进行表单数据合法性验证、文件上传处理、用户身份认证和数据库集成等功能。Flask主要包括Werkzeug和Jinja2两个核心函数库,它们分别负责业务处理和安全方面的功能,这些基础函数为web项目开发过程提供了丰富的基础组件。Werkzeug库十分强大,功能比较完善,支持URL路由请求集成,一次可以响应多个用户的访问请求;支持Cookie和会话管理,通过身份缓存数据建立长久连接关系,并提高用户访问速度;支持交互式Javascript调试,提高用户体验;可以处理HTTP基本事务,快速响应客户端推送过来的访问请求。Jinja2库支持自动HTML转移功能,能够很好控制外部黑客的脚本攻击。系统运行速度很快,页面加载过程会将源码进行编译形成Python字节码,从而实现模板的高效运行;模板继承机制可以对模板内容进行修改和维护,为不同需求的用户提供相应的模板。目前Python的web框架有很多。除了Flask,还有django、Web2py等。其中Django是目前Python的框架中使用度最高的。但是Django如同java EJB(EnterpriseJavaBeansJavaEE服务器端组件模型)多被用于大型网站的开发,但对于大多数的小型网站的开发,使用SSH(Struts+Spring+Hibernat的一个JavaEE集成框架)就可以满足,和其他的轻量级框架相比较,Flask框架有很好的扩展性,这是其他Web框架不可替代的[4]。
Vue.js是一款用于构建用户界面的渐进式JavaScript框架,提供一种灵活而高效的方式来开发单页面应用(SPA)。Vue的设计理念是通过尽量简化开发过程,提供一种声明式的方式来构建用户界面[5]。Vue.js通过数据驱动的视图模型,允许开发者以声明式语法绑定数据与视图,使得应用的状态和界面表现更加简洁和可维护。它的核心思想是通过组件化开发将复杂的UI拆分为可重用的独立模块,从而提升了代码的模块化、可维护性和可扩展性。
Vue.js具备响应式数据绑定和虚拟DOM的特性。响应式数据绑定意味着当数据变化时,Vue会自动更新与之绑定的DOM元素,从而实现视图的实时更新。虚拟DOM则是Vue.js的一种优化手段,通过将对DOM的操作抽象为一个虚拟的DOM树来提高性能,减少实际DOM操作的开销[6]。Vue还提供了丰富的插件和工具,如Vue Router用于路由管理,Vuex用于状态管理,方便开发者构建复杂的前端应用。Vue的灵活性和简洁性使其成为现代Web开发中常用的前端框架之一。
MySQL是一种开源的关系型数据库管理系统(RDBMS),基于SQL(结构化查询语言)进行数据操作。作为一个被广泛使用的数据库系统,MySQL具有高度的性能、可扩展性和可靠性。MySQL使用表格结构来存储数据,每个表由多个列和行组成,数据通过SQL查询语言进行操作[7]。MySQL支持多种数据类型,如整数、浮动小数、字符串、日期等,以满足不同应用场景对数据存储的需求。在实际应用中,MySQL通常用于存储和管理结构化数据,通过索引、视图、触发器等功能提升数据查询的效率和数据的完整性。
MySQL支持ACID事务特性(原子性、一致性、隔离性、持久性),确保数据库操作的可靠性和数据的一致性。它还支持多种存储引擎,其中InnoDB是最常用的存储引擎,具备事务支持、行级锁定和外键约束等特性,适用于高并发、高可靠性的数据存储需求。MySQL可以通过主从复制、分区和分库分表等技术实现横向扩展,以应对大规模数据存储和高负载的应用需求。MySQL还具有灵活的权限管理机制,支持用户角色管理、细粒度的权限控制等,保障数据的安全性。
开发任何一个系统,都要对其可行性进行分析,对其时间和资源上的限制进行考虑,这样可以减少系统开发的风险。同时,分析之后不仅能够合理的运用人力,还能在各方面资源的消耗上得到节省。下面就对技术、经济和社会三个方面来介绍。
技术可行性主要考虑当前项目所用的技术是否能够符合,在设备上是否能够满足,及各种辅助工具是否提供帮助。本系统用的是python开发语言,调试相对简单,当前的计算机硬件配置也完全能满足开发的需求,因此在技术上是绝对可行的。软件方面:由于软件的开发平台成熟可行,它们速度快、容量大、可靠性能高、价格低,完全能满足系统的需求。采用python编程语言,已无技术上的问题。
系统所采用的ZendStudio开发平台和Mysql后端数据库均为免费开发工具。故开发成本主要集中在后期的推广及系统维护上。相对于成本较高的C/S模式,也是选用了成本较低的B/S模式,所以经济上几乎没任何问题。
采用Flask框架的个人博客系统在操作可行性方面具备显著优势。系统采用用户友好的界面设计,使得用户能够轻松地进行操作,无需具备专业的技术背景。同时,系统支持多种设备访问,包括电脑、手机和平板等,满足用户在不同场景下的使用需求。此外,系统还提供了详细的操作指南,帮助用户快速掌握使用技巧,解决在使用过程中遇到的问题。因此,个人博客系统在操作层面是完全可行的。
1.博主用户功能
首页:作为博主进入系统的起始界面,首页整合展示系统核心功能区域。
网站公告:博主可查看管理员发布的各类系统公告,如系统维护通知、规则更新说明等。
新闻资讯:提供行业新闻、写作技巧等资讯,助力博主紧跟博客领域趋势,获取创作灵感,提升文章质量。
博客文章:博主撰写新文章,完成后可发布、编辑、删除文章,已发布文章在个人博客及平台相关页面展示。
个人中心:博主自定义个人资料,管理文章分类、检索,收藏优质内容,处理读者评论,塑造个人品牌,增强与读者互动。
2.读者用户功能
首页:首页突出网站公告,展示新闻资讯、热门博客及分类导航,便于读者快速定位感兴趣内容,开启阅读之旅。
网站公告:读者获取平台功能更新、活动等通知,确保享受良好的平台服务体验。
新闻资讯:包含热门博主故事、写作技巧分享等,帮助读者提升阅读水平,发掘更多优质博客。
博客文章:读者可通过分类、搜索查找文章,对文章进行点赞、评论、收藏,与博主交流互动。
个人中心:读者管理收藏文章,查看评论及回复,提升阅读参与感。
3.管理员功能
后台首页:提供各管理功能入口,辅助管理员决策。
系统用户:管理员添加、删除、修改各类用户信息,设置权限,封禁违规用户,维护平台用户秩序。
博客标签管理:管理员添加、删除、修改标签及分类,优化文章检索体系,方便用户查找内容。
博客文章管理:审核新发布文章,编辑或删除问题文章,保障平台内容质量。
系统管理:管理轮播图展示效果,过滤敏感词,确保平台内容合规,营造良好环境。
网站公告管理:发布、编辑、删除公告,向用户传达系统重要信息。
资源管理:更新新闻资讯,优化资讯分类,丰富平台资源。
非功能性需求主要关注的是系统如何运行,而不是它具体完成什么功能。这些需求包括性能、可用性、安全性、可维护性、可扩展性、易用性等方面。以下是一个关于个人博客系统非功能性需求分析的概要。
性能需求:系统需确保快速响应和高吞吐量,以支持大量用户同时访问,即使在高峰时段也能保持流畅的操作体验,避免因延迟或卡顿影响用户体验。
可用性:系统必须具备高可用性,采用冗余部署、负载均衡等策略,确保即使部分组件故障也能迅速恢复服务,减少服务中断时间,保障用户业务的连续性。
安全性:鉴于系统处理用户敏感信息,如个人信息等,必须实施严格的安全措施,包括数据加密、访问控制、防攻击机制等,以保护用户数据免受未授权访问或泄露。
可维护性:系统设计应注重可维护性,采用模块化、标准化的架构,提供详尽的开发文档和用户手册,确保系统易于理解和维护,降低长期运维成本。
可扩展性:随着业务的发展,系统可能需要扩展功能或提升性能。因此,系统需具备灵活的可扩展性,能够轻松添加新模块、优化性能,以应对未来增长的需求。
易用性:用户界面应直观易用,符合用户习惯,提供清晰的导航和友好的操作反馈,帮助用户快速上手并高效完成任务,提升整体用户满意度。
-
- 系统用例分析
根据3.2功能需求,得出以下用例图:
博主用户用例图如下所示。
图3-1 博主用户用例图
读者用户用例图如下所示。
图3-2 读者用户用例图
管理员用例图如下所示。
图3-3 管理员用例图
用户访问系统,可以选择进行注册或登录操作。注册成功后,用户可以使用注册的账号登录系统。登录后的用户可以进入系统功能界面,使用自己权限内的功能操作。程序操作流程图如图3-4所示。
图3-4 程序操作流程图
用户访问系统,进入登录页面页面,入其用户名和密码,后端服务接收登录请求,验证用户提供的用户名和密码是否匹配数据库中存储的信息,验证通过即可登录成功。登录流程图如图3-5所示。
图3-5 登录流程图
未有账号的用户可进入注册界面进行注册操作,填写注册表格,包括用户名、密码、电子邮件等必要信息。后台系统验证并保存用户提交的信息。分配唯一用户标识符。注册成功后,用户可以使用账号密码进行登录。用户注册流程图如图3-6所示。
图3-6 注册流程图
采用Flask框架的个人博客系统的架构设计主要分为可以3层,主要有Web层,业务层,Model层。其中web层还包括View层和Controller层,Model层包括元数据扩展层和数据访问层。
系统架构如下图所示。
图4-1 系统架构
采用Flask框架的个人博客系统总体分为前台用户模块和后台管理员模块。两个模块表现上是分别独立存在,但是访问的数据库是一样的。每一个模块的功能都是根据先前完成的需求分析,并查阅相关资料后整理制作的。系统功能结构图如下图所示。
图4-2 系统功能结构图
数据库实体设计是数据库设计的关键步骤,对实际业务逻辑中涉及的实体及其属性进行抽象建模,明确系统中的主要信息对象及其关系[8]。在实体设计中,根据需求分析确定系统的核心实体,如用户、角色、权限等,提取实体的主要属性,如用户的ID、姓名、联系方式,名称、类型等,同时定义各实体之间的关系,包括一对一、一对多、多对多等。在设计过程中,注重实体的完整性、规范性和唯一性,确保设计能够满足系统功能需求,并为后续的表设计提供清晰的结构框架。实体设计需遵循数据库设计的标准化要求,避免数据冗余和不必要的复杂度。
系统全局E-R图如下图所示。
图4-3 系统ER图
数据库表设计基于实体设计,将抽象的实体映射为具体的表结构。设计过程中,为每个实体定义表名、字段名及数据类型[9]。根据业务需求,合理定义主键、外键及约束条件,确保表之间的关联性,例如通过外键建立用户表和角色表之间的关系。表设计时注重数据存储的完整性、一致性,并通过索引优化查询效率,最终确保数据库结构能够支持系统的功能需求。以下是系统的数据库表设计展示。
表 4-1-access_token(登陆访问时长)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | token_id | int | 是 | 是 | 临时访问牌ID | |
2 | token | varchar | 64 | 否 | 否 | 临时访问牌 |
3 | info | text | 65535 | 否 | 否 | 信息 |
4 | maxage | int | 是 | 否 | 最大寿命:默认2小时 | |
5 | create_time | timestamp | 是 | 否 | 创建时间 | |
6 | update_time | timestamp | 是 | 否 | 更新时间 | |
7 | user_id | int | 是 | 否 | 用户编号 |
表 4-2-article(文章)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | article_id | mediumint | 是 | 是 | 文章id | |
2 | title | varchar | 125 | 是 | 是 | 标题 |
3 | type | varchar | 64 | 是 | 否 | 文章分类 |
4 | hits | int | 是 | 否 | 点击数 | |
5 | praise_len | int | 是 | 否 | 点赞数 | |
6 | create_time | timestamp | 是 | 否 | 创建时间 | |
7 | update_time | timestamp | 是 | 否 | 更新时间 | |
8 | source | varchar | 255 | 否 | 否 | 来源 |
9 | url | varchar | 255 | 否 | 否 | 来源地址 |
10 | tag | varchar | 255 | 否 | 否 | 标签 |
11 | content | longtext | 4294967295 | 否 | 否 | 正文 |
12 | img | varchar | 255 | 否 | 否 | 封面图 |
13 | description | text | 65535 | 否 | 否 | 文章描述 |
表 4-3-article_type(文章分类)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | type_id | smallint | 是 | 是 | 分类ID | |
2 | display | smallint | 是 | 否 | 显示顺序 | |
3 | name | varchar | 16 | 是 | 否 | 分类名称 |
4 | father_id | smallint | 是 | 否 | 上级分类ID | |
5 | description | varchar | 255 | 否 | 否 | 描述 |
6 | icon | text | 65535 | 否 | 否 | 分类图标 |
7 | url | varchar | 255 | 否 | 否 | 外链地址 |
8 | create_time | timestamp | 是 | 否 | 创建时间 | |
9 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-4-auth(用户权限管理
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | auth_id | int | 是 | 是 | 授权ID | |
2 | user_group | varchar | 64 | 否 | 否 | 用户组 |
3 | mod_name | varchar | 64 | 否 | 否 | 模块名 |
4 | table_name | varchar | 64 | 否 | 否 | 表名 |
5 | page_title | varchar | 255 | 否 | 否 | 页面标题 |
6 | path | varchar | 255 | 否 | 否 | 路由路径 |
7 | parent | varchar | 64 | 否 | 否 | 父级菜单 |
8 | parent_sort | int | 是 | 否 | 父级菜单排序 | |
9 | position | varchar | 32 | 否 | 否 | 位置 |
10 | mode | varchar | 32 | 是 | 否 | 跳转方式 |
11 | add | tinyint | 是 | 否 | 是否可增加 | |
12 | del | tinyint | 是 | 否 | 是否可删除 | |
13 | set | tinyint | 是 | 否 | 是否可修改 | |
14 | get | tinyint | 是 | 否 | 是否可查看 | |
15 | field_add | text | 65535 | 否 | 否 | 添加字段 |
16 | field_set | text | 65535 | 否 | 否 | 修改字段 |
17 | field_get | text | 65535 | 否 | 否 | 查询字段 |
18 | table_nav_name | varchar | 500 | 否 | 否 | 跨表导航名称 |
19 | table_nav | varchar | 500 | 否 | 否 | 跨表导航 |
20 | option | text | 65535 | 否 | 否 | 配置 |
21 | create_time | timestamp | 是 | 否 | 创建时间 | |
22 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-5-blogger_user(博主用户)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | blogger_user_id | int | 是 | 是 | 博主用户ID | |
2 | name_of_blogger | varchar | 64 | 否 | 否 | 博主姓名 |
3 | gender_of_broadcaster | varchar | 64 | 否 | 否 | 播主性别 |
4 | contact_information | varchar | 64 | 否 | 否 | 联系方式 |
5 | examine_state | varchar | 16 | 是 | 否 | 审核状态 |
6 | user_id | int | 是 | 否 | 用户ID | |
7 | create_time | datetime | 是 | 否 | 创建时间 | |
8 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-6-blog_article(博客文章)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | blog_article_id | int | 是 | 是 | 博客文章ID | |
2 | blog_title | varchar | 64 | 否 | 否 | 博客标题 |
3 | blog_tags | varchar | 64 | 否 | 否 | 博客标签 |
4 | blog_cover | varchar | 255 | 否 | 否 | 博客封面 |
5 | blogger_user | int | 否 | 否 | 博主用户 | |
6 | name_of_blogger | varchar | 64 | 否 | 否 | 博主姓名 |
7 | blog_introduction | text | 65535 | 否 | 否 | 博客简介 |
8 | blog_details | longtext | 4294967295 | 否 | 否 | 博客详情 |
9 | hits | int | 是 | 否 | 点击数 | |
10 | praise_len | int | 是 | 否 | 点赞数 | |
11 | collect_len | int | 是 | 否 | 收藏数 | |
12 | comment_len | int | 是 | 否 | 评论数 | |
13 | recommend | int | 是 | 否 | 智能推荐 | |
14 | create_time | datetime | 是 | 否 | 创建时间 | |
15 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-7-blog_tags(博客标签)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | blog_tags_id | int | 是 | 是 | 博客标签ID | |
2 | label | varchar | 64 | 否 | 否 | 标签 |
3 | create_time | datetime | 是 | 否 | 创建时间 | |
4 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-8-code_token(验证码)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | code_token_id | int | 是 | 是 | 验证码ID | |
2 | token | varchar | 255 | 否 | 否 | 令牌 |
3 | code | varchar | 255 | 否 | 否 | 验证码 |
4 | expire_time | timestamp | 是 | 否 | 失效时间 | |
5 | create_time | timestamp | 是 | 否 | 创建时间 | |
6 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-9-collect(收藏)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | collect_id | int | 是 | 是 | 收藏ID | |
2 | user_id | int | 是 | 是 | 收藏人ID | |
3 | source_table | varchar | 255 | 否 | 否 | 来源表 |
4 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
5 | source_id | int | 是 | 否 | 来源ID | |
6 | title | varchar | 255 | 否 | 否 | 标题 |
7 | img | varchar | 255 | 否 | 否 | 封面 |
8 | create_time | timestamp | 是 | 否 | 创建时间 | |
9 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-10-comment(评论)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | comment_id | int | 是 | 是 | 评论ID | |
2 | user_id | int | 是 | 是 | 评论人ID | |
3 | reply_to_id | int | 是 | 否 | 回复评论ID | |
4 | content | longtext | 4294967295 | 否 | 否 | 内容 |
5 | nickname | varchar | 255 | 否 | 否 | 昵称 |
6 | avatar | varchar | 255 | 否 | 否 | 头像地址 |
7 | create_time | timestamp | 是 | 否 | 创建时间 | |
8 | update_time | timestamp | 是 | 否 | 更新时间 | |
9 | source_table | varchar | 255 | 否 | 否 | 来源表 |
10 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
11 | source_id | int | 是 | 否 | 来源ID |
表 4-11-hits(用户点击)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | hits_id | int | 是 | 是 | 点赞ID | |
2 | user_id | int | 是 | 否 | 点赞人 | |
3 | create_time | timestamp | 是 | 否 | 创建时间 | |
4 | update_time | timestamp | 是 | 否 | 更新时间 | |
5 | source_table | varchar | 255 | 否 | 否 | 来源表 |
6 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
7 | source_id | int | 是 | 否 | 来源ID |
表 4-12-notice(公告)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | notice_id | mediumint | 是 | 是 | 公告ID | |
2 | title | varchar | 125 | 是 | 否 | 标题 |
3 | content | longtext | 4294967295 | 否 | 否 | 正文 |
4 | create_time | timestamp | 是 | 否 | 创建时间 | |
5 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-13-praise(点赞)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | praise_id | int | 是 | 是 | 点赞ID | |
2 | user_id | int | 是 | 是 | 点赞人 | |
3 | create_time | timestamp | 是 | 否 | 创建时间 | |
4 | update_time | timestamp | 是 | 否 | 更新时间 | |
5 | source_table | varchar | 255 | 否 | 否 | 来源表 |
6 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
7 | source_id | int | 是 | 否 | 来源ID | |
8 | status | tinyint | 是 | 否 | 点赞状态:1为点赞,0已取消 |
表 4-14-reader_users(读者用户)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | reader_users_id | int | 是 | 是 | 读者用户ID | |
2 | user_name | varchar | 64 | 否 | 否 | 用户姓名 |
3 | user_gender | varchar | 64 | 否 | 否 | 用户性别 |
4 | contact_information | varchar | 64 | 否 | 否 | 联系方式 |
5 | favorite_tags | varchar | 64 | 否 | 否 | 喜爱标签 |
6 | examine_state | varchar | 16 | 是 | 否 | 审核状态 |
7 | user_id | int | 是 | 否 | 用户ID | |
8 | create_time | datetime | 是 | 否 | 创建时间 | |
9 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-15-sensitive_vocabulary(敏感词汇
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | sensitive_vocabulary_id | int | 是 | 是 | 敏感词汇ID | |
2 | sensitive_vocabulary | varchar | 64 | 否 | 否 | 敏感词汇 |
3 | create_time | datetime | 是 | 否 | 创建时间 | |
4 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-16-slides(轮播图)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | slides_id | int | 是 | 是 | 轮播图ID | |
2 | title | varchar | 64 | 否 | 否 | 标题 |
3 | content | varchar | 255 | 否 | 否 | 内容 |
4 | url | varchar | 255 | 否 | 否 | 链接 |
5 | img | varchar | 255 | 否 | 否 | 轮播图 |
6 | hits | int | 是 | 否 | 点击量 | |
7 | create_time | timestamp | 是 | 否 | 创建时间 | |
8 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-17-upload(文件上传)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | upload_id | int | 是 | 是 | 上传ID | |
2 | name | varchar | 64 | 否 | 否 | 文件名 |
3 | path | varchar | 255 | 否 | 否 | 访问路径 |
4 | file | varchar | 255 | 否 | 否 | 文件路径 |
5 | display | varchar | 255 | 否 | 否 | 显示顺序 |
6 | father_id | int | 否 | 否 | 父级ID | |
7 | dir | varchar | 255 | 否 | 否 | 文件夹 |
8 | type | varchar | 32 | 否 | 否 | 文件类型 |
表 4-18-user(用户账户)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | user_id | int | 是 | 是 | 用户ID | |
2 | state | smallint | 是 | 否 | 账户状态:(1可用|2异常|3已冻结|4已注销) | |
3 | user_group | varchar | 32 | 否 | 否 | 所在用户组 |
4 | login_time | timestamp | 是 | 否 | 上次登录时间 | |
5 | phone | varchar | 11 | 否 | 否 | 手机号码 |
6 | phone_state | smallint | 是 | 否 | 手机认证:(0未认证|1审核中|2已认证) | |
7 | username | varchar | 16 | 是 | 否 | 用户名 |
8 | nickname | varchar | 16 | 否 | 否 | 昵称 |
9 | password | varchar | 64 | 是 | 否 | 密码 |
10 | | varchar | 64 | 否 | 否 | 邮箱 |
11 | email_state | smallint | 是 | 否 | 邮箱认证:(0未认证|1审核中|2已认证) | |
12 | avatar | varchar | 255 | 否 | 否 | 头像地址 |
13 | open_id | varchar | 255 | 否 | 否 | 针对获取用户信息字段 |
14 | create_time | timestamp | 是 | 否 | 创建时间 |
表 4-19-user_group(用户组)
编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
1 | group_id | mediumint | 是 | 是 | 用户组ID | |
2 | display | smallint | 是 | 否 | 显示顺序 | |
3 | name | varchar | 16 | 是 | 否 | 名称 |
4 | description | varchar | 255 | 否 | 否 | 描述 |
5 | source_table | varchar | 255 | 否 | 否 | 来源表 |
6 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
7 | source_id | int | 是 | 否 | 来源ID | |
8 | register | smallint | 否 | 否 | 注册位置 | |
9 | create_time | timestamp | 是 | 否 | 创建时间 | |
10 | update_time | timestamp | 是 | 否 | 更新时间 |
采用Flask框架的个人博客系统的详细设计与实现主要是根据前面的采用Flask框架的个人博客系统的需求分析和采用Flask框架的个人博客系统的总体设计来设计页面并实现业务逻辑。主要从采用Flask框架的个人博客系统界面实现、业务逻辑实现这两部分进行介绍。
5.1.1 前台首页界面
博主登录系统进入首页,首先映入眼帘的是网站公告栏,博主能及时获取系统维护、规则更新等重要通知。新闻资讯板块展示行业动态、写作技巧等内容,为创作提供灵感。热门博客文章区呈现平台热门内容,方便博主了解流行趋势。其主界面展示如下图所示。

图5-1 前台首页界面图
5.1.2 用户注册界面
用户可以通过系统进行注册,创建个人账户。在注册页面,用户需要填写基本信息,如姓名、联系方式、邮箱等,并设置用户名和密码。系统会通过验证用户的身份信息来保证安全性。用户注册成功后,可以使用用户名和密码登录系统,享受平台提供的各项服务。普通用户注册界面展示如下图所示。

图5-2注册界面图
注册代码如下:
# 用户类
class User(controllerClass):
def __init__(self, config={}):
"""
构造函数
@param {Object} config 配置参数
"""
config_init = {
# 选择的模板那路径模板
"tpl": "./user/",
# 选择的服务
"services": "user",
# 注册API
"get_api": ["state", "quit"],
"post_api": ["login", "register", "change_password", "forget_password"],
# 唯一判断
"unique": ["username"]
}
config_temp = config
config_temp.update(config_init)
super(User, self).__init__(config_temp)
def Register(self, ctx):
"""
注册API
@param {Object} config 配置参数
"""
print("===================注册=====================")
userService = service_select("user")
body = ctx.body
# 判断必须信息
if "username" not in body and body["username"] == '':
return {"error": {
"code": 70000,
"message": "用户名不能为空",
}}
if "user_group" not in body and body["user_group"] == '':
return {
"error": {
"code": 70000,
"message": "用户组不能为空",
}
}
if "password" not in body and body["password"] == '':
return {
"error": {
"code": 70000,
"message": "密码不能为空",
}
}
# 取出表单
post_param = body
post_param['nickname'] = body["nickname"] or ""
post_param['password'] = md5hash(body["password"])
# 校验是否存在用户
obj = userService.Get_obj({"username": post_param['username']}, {"like": False})
if obj:
return {
"error": {
"code": 70000,
"message": "用户名已存在",
}
}
ret = {
"error": {
"code": 70000,
"message": "注册失败",
}
}
# 添加
bl = userService.Add(post_param)
if bl:
ret = {
"result": {
"bl": True,
"message": "注册成功"
}
}
return ret
5.1.3 用户登录界面
用户可以通过用户名和密码登录系统。登录页面提供简洁明了的输入框,用户输入正确的用户名和密码后,点击“登录”按钮即可进入系统。系统会验证用户的身份信息,确保登录的安全性。用户登录界面如下图所示。

图5-3用户登录界面图
登录代码如下:
def Login(self, ctx):
"""
登录API
@param {Object} ctx http请求上下文
"""
print("===================登录=====================")
ret = {
"error": {
"code": 70000,
"message": "账户不存在",
}
}
body = ctx.body
# 获取用户
password = md5hash(body["password"]) or ""
obj = service_select("user").Get_obj(
{"username": body["username"]}, {"like": False}
)
if obj:
# 检查用户所属用户组
user_group = service_select("user_group").Get_obj({'name': obj['user_group']}, {"like": False})
if user_group and user_group['source_table'] != '':
user_obj = service_select(user_group['source_table']).Get_obj({"user_id": obj['user_id']},
{"like": False})
if user_obj['examine_state'] == '未通过':
ret = {
"error": {
"code": 70000,
"message": "账户未通过审核",
}
}
return ret
if user_obj['examine_state'] == '未审核':
ret = {
"error": {
"code": 70000,
"message": "账户未审核",
}
}
return ret
# 校验用户状态
if obj["state"] == 1:
# 校验密码
if obj["password"] == password:
# 生成Token
timeout = datetime.now(tz=timezone.utc)
timestamp = int(time.mktime(timeout.timetuple())) * 1000
token = md5hash(str(obj["user_id"]) + "_" + str(timestamp))
# 存储Token
# session[token] = obj["user_id"]
session.setdefault(token, obj["user_id"])
session.permanent = True
service_select("access_token").Add(
{"token": token, "user_id": obj["user_id"]}
)
# 回传用户
obj["token"] = token
ret = {
"result": {"obj": obj}
}
else:
ret = {
"error": {
"code": 70000,
"message": "密码错误",
}
}
else:
ret = {
"error": {
"code": 70000,
"message": "用户账户不可用,请联系管理员",
}
}
return ret
5.1.4 撰写博客文章界面
博主登录系统后,进入“个人中心”的博客文章板块。在此输入文字内容,通过排版工具设置字体、字号、段落格式。可插入图片、链接、视频等多媒体元素,丰富文章表现形式。撰写博客文章界面如下图所示。

图5-4撰写博客文章界面图
5.2读者用户功能模块
5.2.1 浏览博客文章界面
读者登录系统,在首页通过热门推荐、分类导航或搜索框找到感兴趣的博客文章。点击文章标题进入详情页,阅读文章内容,可通过点赞按钮表达喜爱,在评论区发表看法与博主交流。浏览博客文章界面如下图所示。

图5-5浏览博客文章界面图
5.3.1 系统用户管理界面
管理员负责管理系统的用户,包括管理员账户、博主用户和读者用户。通过这一功能,管理员可以创建、编辑和删除用户账户,分配不同的角色和权限,确保每个用户在平台上的操作符合其身份和职责。系统用户管理界面如下图所示。

图5-6系统用户管理界面图
管理员在博客标签管理模块,可进行全方位标签管控。能根据平台内容发展需求添加新标签。对于不再适用或使用率极低的标签,可予以删除,精简标签体系。还能修改标签名称、调整所属分类,优化标签逻辑结构。博客标签管理界面如下图所示。

图5-7博客标签管理界面图
5.3.3 轮播图管理界面
管理员可以对系统前台展示的轮播图进行增删改查,方便用户进行查看。轮播图管理界面如下图所示。

图5-8轮播图管理界面图
添加信息代码:
def Add(self, ctx):
"""
增
@param {Object} ctx http请求上下文
@return {Object} 返回json-rpc格式结果
"""
body = ctx.body
unique = self.config.get("unique")
obj = None
if unique:
qy = {}
for i in range(len(unique)):
key = unique[i]
qy[key] = body.get(key)
obj = self.service.Get_obj(qy)
if not obj:
# 添加数据前
error = self.Add_before(ctx)
if error["code"]:
return {"error": error}
error = self.Events("add_before", ctx, None)
if error["code"]:
return {"error": error}
# 添加数据
result = self.service.Add(body, self.config)
# 添加数据发生错误
if self.service.error:
return {"error": self.service.error}
# 添加数据成功后
res = self.Add_after(ctx, result)
if res:
result = res
res = self.Events("add_after", ctx, result)
if res:
result = res
return {"result": result}
else:
return {"error": {"code": 10000, "message": "已存在"}}
删除代码:
# 删
def Del(self, ctx):
"""
删
@param {Object} ctx http请求上下文
@return {Object} 返回json-rpc格式结果
"""
if len(ctx.query) == 0:
errorMsg = {"code": 30000, "message": "删除条件不能为空!"}
return errorMsg
result = self.service.Del(ctx.query, self.config)
if self.service.error:
return {"error": self.service.error}
return {"result": result}
修改信息代码:
# 改
def Set(self, ctx):
"""
改
@param {Object} ctx http请求上下文
@return {Object} 返回json-rpc格式结果
"""
# 修改数据前
error = self.Set_before(ctx)
if error["code"]:
return {"error": error}
error = self.Events("set_before", ctx, None)
if error["code"]:
return {"error": error}
query = ctx.query
if 'page' in query.keys():
del ctx.query['page']
if 'size' in query.keys():
del ctx.query['size']
if 'orderby' in query.keys():
del ctx.query['orderby']
# 修改数据
result = self.service.Set(ctx.query, ctx.body, self.config)
# 修改数据发生错误
if self.service.error:
return {"error": self.service.error}
# 修改数据成功后
res = self.Set_after(ctx, result)
if res:
result = res
res = self.Events("set_after", ctx, result)
if res:
result = res
return {"result": result}
查询代码:
# 查多条
def Get_list(self, ctx):
"""
查多条
@param {Object} ctx http请求上下文
@return {Object} 返回json-rpc格式结果
"""
query = dict(ctx.query)
config_plus = {}
if "field" in query:
field = query.pop("field")
config_plus["field"] = field
if "page" in query:
config_plus["page"] = query.pop("page")
if "size" in query:
config_plus["size"] = query.pop("size")
if "orderby" in query:
config_plus["orderby"] = query.pop("orderby")
if "like" in query:
config_plus["like"] = query.pop("like")
if "groupby" in query:
config_plus["groupby"] = query.pop("groupby")
count = self.service.Count(query)
lst = []
if self.service.error:
return {"error": self.service.error}
elif count:
lst = self.service.Get_list(query,
obj_update(self.config, config_plus))
if self.service.error:
return {"error": self.service.error}
self.interact_list(ctx, lst)
return {"result": {"list": lst, "count": count}}
# 查一条
def Get_obj(self, ctx):
"""
查一条
@param {Object} ctx http请求上下文
@return {Object} 返回json-rpc格式结果
"""
query = dict(ctx.query)
config_plus = {}
if "field" in query:
field = query.pop("field")
config_plus["field"] = field
obj = self.service.Get_obj(query, obj_update(self.config, config_plus))
if self.service.error:
return {"error": self.service.error}
if obj:
self.interact_obj(ctx, obj)
return {"result": {"obj": obj}}
对任何系统而言,测试都是必不可少的环节,测试可以发现系统存在的很多问题,所有的软件上线之前,都应该进行充足的测试之后才能保证上线后不会Bug频发,或者是功能不满足需求等问题的发生。下面分别从单元测试,功能测试和用例测试来对系统进行测试以保证系统的稳定性和可靠性。
下表是系统登录功能测试用例,检测了用户名和密码的不同的输入情况,观察系统的响应情况。得出该功能达到了设计目标。
表6-1 系统登录功能测试用例
功能描述 | 用于系统登录 | |
测试目的 | 检测登录时的合法性检查 | |
测试数据以及操作 | 预期结果 | 实际结果 |
输入的用户名和密码带有非法字符 | 提示用户名或者密码错误 | 与预期结果一致 |
输入的用户名或者密码为空 | 提示用户名或者密码错误 | 与预期结果一致 |
输入的用户名和密码不存在 | 提示用户名或者密码错误 | 与预期结果一致 |
输入正确的用户名和密码 | 登录成功 | 与预期结果一致 |
下表是注册功能测试用例,检测了各种数据的输入情况,观察系统的响应情况。得出该功能达到了设计目标。
表6-2 注册功能测试用例
功能描述 | 用于用户注册 | |
测试目的 | 检测用户注册时的合法性检查 | |
测试数据以及操作 | 预期结果 | 实际结果 |
输入的手机号不合法 | 提示请输入正确的手机号码 | 与预期结果一致 |
输入的字段为空 | 提示必填项不能为空 | 与预期结果一致 |
输入的密码少于6位 | 提示密码必须为6-12位 | 与预期结果一致 |
输入的密码大于12位 | 提示密码必须为6-12位 | 与预期结果一致 |
下表是预约信息功能的测试用例,检测了预约信息的增加,删除,修改,查询操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
前置条件;用户登录系统。
表6-3 预约信息的测试用例
功能描述 | 用于预约信息 | |
测试目的 | 检测预约信息时的各种操作的运行情况 | |
测试数据以及操作 | 预期结果 | 实际结果 |
点击添加预约信息,必填项合法输入,点击保存 | 提示添加成功 | 与预期结果一致 |
点击添加预约信息,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改预约信息,必填项修改为空,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改预约信息,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击删除预约信息,选择预约信息删除 | 提示删除成功 | 与预期结果一致 |
点击搜索预约信息,输入存在的预约编号 | 查找出预约信息 | 与预期结果一致 |
点击搜索预约信息,输入不存在的预约编号 | 不显示预约信息 | 与预期结果一致 |
使用阿里云PTS(Performance Testing Service)性能测试服务对线上系统进行压力测试。线上服务器环境为:1核心CPU,1G内存,1Mbps公网带宽,Centos7.0操作系统。
压测过程中使用了2台并发机器,每台机器20个用户并发,对系统主页,登录,数据查询和数据维护等模块进行并发访问,测试结果是有40个用户并发时,数据管理相关页面的响应时间甚至达到了7s,通过查看服务器出网流量发现已经达到1381kb/s,可以看出服务器的带宽已经达到峰值,如果系统使用5Mbps的带宽,系统的响应时间和TPS将会大大增加。在整个测试的过程中,CPU的使用率占用仅8%,也提现出带宽瓶颈对系统的影响非常严重。
本基于 Flask 框架构建的个人博客系统,成功整合了博主创作、读者阅读及管理员管理的多元功能。博主可便捷地创作、发布文章;读者能借助分类、搜索功能精准获取感兴趣内容,通过点赞、评论参与互动;管理员通过全面的后台管理,保障系统稳定运行与内容质量。系统实现了预期的功能需求,为用户提供了流畅的使用体验。展望未来,可进一步优化基于标签的文章推荐算法,提升推荐精准度,增强用户粘性。引入更多社交功能,如用户关注、群组讨论,构建更活跃的博客社区生态。同时,持续优化系统性能,应对高并发访问,为用户提供更优质、高效的服务,推动个人博客系统向更智能、更具活力的方向发展。
参考文献
- 郦昕昕.基于B/S模式的人事管理系统设计与实现[J].集成电路应用,2024,41(05):246-247.
- 赵惠.基于B/S模式的实验室管理系统设计和实现[J].中国新通信,2023,25(21):72-74.
- 王朝辉.基于Flask框架的测试集成系统设计与实现[J].科技创新与应用,2024,14(33):115-118.
- 王晓雷,王钱庆,王鲜芳.基于Flask数据可视化的网页端显示方法研究[J].无线互联科技,2024,21(15):10-13+20.
- 赵媛.基于Vue的Web系统前端性能优化分析[J].电脑编程技巧与维护,2024,(09):44-46.
- 秦冬.浅析Vue框架在前端开发中的应用[J].信息与电脑(理论版),2024,36(13):61-63.
- 李艳杰.MySQL数据库下存储过程的综合运用研究[J].现代信息科技,2023,7(11):80-82+88.
- 马艳艳,吴晓光.计算机软件与数据库的设计策略分析[J].电子技术,2024,53(05):104-105.
- 李俊萌.计算机软件测试技术与开发应用策略分析[J].信息记录材料,2023,24(03):50-52.
- 吴公莹.基于Python语言的数据处理与特征工程方法研究[J].现代计算机,2024,30(23):73-76.
- 张金聪,高晓红,郑艺文.基于Flask和Vue的猕猴桃信息管理系统的设计与开发[J].电脑知识与技术,2024,20(20):47-49.
- 吴小凤,王天淼,朱文秀.基于Flask框架的监控平台可视化设计研究[J].工业控制计算机,2024,37(03):90-91.
- 范路桥,段班祥,高洁,刘小强.基于Python+Flask+MySQL的知宝问答系统[J].现代计算机,2022,28(22):93-98.
- 来思琪,孔华锋.基于Flask框架的新闻聚合系统设计与实现[J].电脑编程技巧与维护,2022,(11):30-33.
- 张旭.基于FLASK的疫情分析与可视化系统设计与实现[D]. 首都经济贸易大学, 2022.
- 刘子凡,郭昱君.基于SpringBoot+Mybatis的个人博客系统设计与实现[J].现代信息科技,2021,5(08):104-107+111.
- 常佳宁,李阳齐.基于Django的个人博客系统设计开发[J].中国科技信息,2021,(02):75-77.
致谢
本次设计历时3个月。在这个毕业设计中,离不开指导教师的指导,使事情基本顺利。指导老师无论是在毕业设计历经中,还是在论文做完中都给了了我特别大的助益。另1个方面,教师认真负责的工作姿态,谨慎的教学精神厚重的理论水准都使我获益匪浅。他勤恳谨慎的教学育人学习姿态也给我留下了特别特别深的感觉。我从老师那里学到了很多东西。在理论和实践中,我的技能得到了特别大的提高。在此,特向教师表示由衷的感激。
经过对该毕业设计的全部研究和开发,我的系统研发经历了从需求分析到实现详细功能,再到最终测试和维护的特殊进展。让我对系统研发有了更深层次的认识。如今我的动手本领单独处理疑惑的本领也获取到了特别大的演练学习增多,这是这次毕业设计最好的收获。
最后,在整个系统开发过程中,我周围的同学和朋友给了我很多意见,所以我很快就确认了系统的商业思想。在次,我由衷的向他们表示感激。
免费领取项目源码,请关注❥点赞收藏并私信博主+v,谢谢~