使用华为云服务器搭建基于Django的安徽省青年大学习查询网站

举报
Cute_Ra6bit 发表于 2023/10/14 15:44:40 2023/10/14
【摘要】 随着信息技术的不断发展和普及,青年大学习已成为促进青年学生全面发展的重要途径之一。然而,针对特定学院或大学的青年大学习查询系统仍然相对缺乏。为了满足学院学生查询本学院每周青年大学习参学结果的需求,本项目旨在开发一个基于Web的青年大学习查询系统,为学生提供便捷的查询服务。

一、系统开发概述

1.1 项目背景

       随着信息技术的不断发展和普及,青年大学习已成为促进青年学生全面发展的重要途径之一。然而,针对特定学院或大学的青年大学习查询系统仍然相对缺乏。为了满足学院学生查询本学院每周青年大学习参学结果的需求,本项目旨在开发一个基于Web的青年大学习查询系统,为学生提供便捷的查询服务。

1 校团委第十四期团组织学习情况

       每周学校公布每个学院的参学结果,每个学院都采用单一的统计方法进行数据整理和分析。然而,传统的数据统计方法存在一些局限性,如手动录入和处理数据的耗时和易错性、数据分析和报告生成的复杂性等。因此,开发一个基于Web的青年大学习查询系统,结合计算机与信息学院的特定需求。可以进一步突出传统统计方法的局限性和该系统的创新性,说明开发基于Web的青年大学习查询系统对于计算机与信息学院学生和管理部门的重要意义和价值。

1.2 编写目的

  1. 提供便捷查询服务:该系统旨在为学院的学生提供方便快捷的青年大学习查询服务,使他们能够及时了解自己的参学情况和学习进展。
  2. 促进学生参与:通过该系统,学生可以更加主动地关注自己的青年大学习参学情况,激发他们的参与积极性,提高参学率和学习效果。
  3. 提升信息透明度:该系统将实现青年大学习参学结果的在线查询,学生可以随时随地通过网络了解到自己的参学情况,提高信息透明度和公平性。
  4. 优化管理效率:该系统将为计算机与信息学院管理部门提供一个集中管理青年大学习数据的平台,有助于提高数据统计和分析的效率,为学院决策提供参考依据。
  5. 提高用户体验:系统将注重用户界面的设计和用户体验的优化,使学生能够轻松、直观地进行查询操作,提升用户满意度和使用效果。

       通过本项目的软件系统设计与实现,将为学院的学生和管理部门提供一个高效、便捷的青年大学习查询平台,推动学生积极参与和学习发展,促进学院的教育质量和管理效能。

1.3 设计任务要求

  1. 数据自动化处理:传统的数据统计方法通常需要手动录入和处理数据,存在较高的人力成本和错误风险。基于Web的查询系统可以引入自动化数据处理功能,通过与学校的数据源对接,实现数据的自动提取、整理和分析,从而提高数据处理的准确性和效率。
  2. 多维度数据分析:传统的统计方法可能只提供基本的汇总统计信息,难以深入挖掘数据背后的规律和趋势。该系统可以引入多维度数据分析的功能,通过数据可视化和交互式报表,为学院管理部门提供更全面、深入的参学结果分析,例如学生参与情况的趋势分析、参学成绩的统计分布等,有助于更好地了解学生的学习情况和改进教育策略。
  3. 学生个性化查询与推荐:学生的学习兴趣和需求各不相同,传统的统计方法无法满足个性化查询的需求。该系统可以引入学生个人账户和学习记录的管理,根据学生的兴趣和历史数据,提供个性化的查询和推荐功能,例如推荐相关学习资源、根据学生的参学历史提供针对性的学习建议等,提升学生的学习体验和效果。
  4. 系统安全性保障:数据的安全性在教育领域尤为重要。该系统需要具备安全的用户认证和权限管理机制,确保只有合法授权的用户才能访问和操作系统,防止数据泄露和恶意篡改,保障学生和学院数据的安全和隐私。

1.4 所用软件环境或工具

  • Microsoft Visual Studio 2022
  • MySQL 8.0
  • Python3.9
  • 宝塔面板
  • 开发环境:Windows 10 22H2
  • 华为云HECS 2核4G服务器
  • 部署环境:CentOS 8.5.2111

二、系统规划

2.1 目标和愿景

       系统的目标是建立一个基于 Web 的青年大学习查询系统,为学院的学生提供方便快捷的查询功能。系统的愿景是成为学院学生查询青年大学习参学结果的首选平台,提供可靠、高效和用户友好的服务。

2.2 范围和功能

  1. 学生登录和认证:允许学生使用个人账号登录系统,并进行身份认证。
  2. 青年大学习查询:提供学生查询每周青年大学习参学结果的功能,按照学院、班级、学期等条件进行过滤和搜索。
  3. 数据展示和统计:呈现学生参学结果的统计数据,如学院总体参与情况、班级参与率等。
  4. 系统管理和维护:支持管理员对系统进行管理和维护,包括用户管理、数据维护等功能。

2.3 技术架构和技术选型

       系统将采用基于 Django 框架的 Web 应用程序开发。

       前端技术使用 HTML、CSS 和 JavaScript,结合 Bootstrap 或其他前端框架进行界面设计和交互。

       后端使用 Django 的 MVC(Model-View-Controller)架构,通过 Django ORM 进行数据库交互,使用 MySQL 8.0 存储数据。

       系统部署可以考虑使用 Nginx 作为 Web 服务器,结合 Gunicorn 或 uWSGI 进行应用程序的部署和运行。

2.4 数据安全和用户隐私保护

       系统将实施适当的安全措施来保护用户数据和隐私信息,包括对用户密码的加密存储、用户身份验证、权限控制等。

       在数据传输过程中采用加密协议(如 HTTPS)保护用户数据的传输安全。

       针对潜在的安全威胁,如跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等,采取相应的防护措施,如使用 CSRF 令牌、输入验证和过滤等。

2.5 系统维护和扩展性

       系统应提供良好的维护和管理功能,包括日志记录、错误处理和故障排除等,以便及时发现和解决系统问题。系统应具备一定的可扩展性,可以根据需求进行功能扩展和性能优化,如引入缓存、分布式部署等。

三、需求分析

3.1 需求说明

3.1.1 用户需求分析

  • 学生用户:

       学生需要能够方便快捷地查询自己的青年大学习参学结果,包括参学情况、学分积累等信息。他们希望系统界面友好、操作简单,能够提供个性化的查询和推荐功能,以及可视化的参学数据统计和分析报告。

  • 管理员用户:

       管理部门需要能够实时监控和管理学生的参学情况,包括参与率、成绩分布等。他们希望系统具备数据统计和分析的功能,能够生成详尽的报表和图表,支持多维度的数据查询和筛选,以便更好地了解学生的学习状况和进行教育管理决策。

3.1.2 系统需求分析

  • 用户界面:

       系统应该具有直观、易用的用户界面,提供清晰的查询入口和操作指导,以满足用户的使用需求。

  • 数据管理:

       系统需要与学校的数据源对接,实现数据的自动提取和更新,确保查询结果的准确性和实时性。

  • 查询功能:

       系统应提供学生个人查询功能,让学生能够通过学号或身份验证信息查看自己的参学结果。同时,系统应支持管理员对学院范围内的参学数据进行查询和筛选。

  • 数据分析与报表:

       系统应具备数据分析和报表生成的功能,能够提供多维度的数据统计和可视化分析,以及生成详细的参学结果报告。

  • 个性化推荐(待定):

       系统应考虑学生的个性化需求,通过学习历史和兴趣标签等信息,为学生推荐相关学习资源和活动,提供个性化的学习建议。

  • 系统性能:

       系统应具备良好的性能和稳定性,能够快速响应用户查询请求,处理大量数据并生成复杂的数据分析报告。

3.1.3 安全需求分析

  • 用户认证与权限管理:

       系统应具备安全的用户认证机制,要求用户进行身份验证后方可访问系统。同时,系统需要实现权限管理,确保只有授权用户才能进行查询和操作。

  • 数据安全性:

       系统应采取措施保护学生和学院的数据安全,包括数据加密、备份与恢复机制,防止未经授权的访问、数据泄露和篡改。

  • 系统安全性:

       系统应采用安全的开发和部署实践,及时更新和修复系统漏洞,防止恶意攻击和网络安全威胁。

3.2 数据字典

  • 表名 Dxxlist

字段

数据类型

说明

dxxno

整数型

青年大学习编号,唯一标识每一期的青年大学习活动。

period

字符串型

青年大学习期数,表示青年大学习的具体期数。

dxxurl

字符串型

青年大学习查询链接,用于爬取数据

  • 表名:user

字段

数据类型

说明

id

整数型

用户ID,用于唯一标识每个用户。

password

字符串型

用户密码,存储用户的密码信息,通常会进行哈希加密。

last_login

日期时间型

最后登录时间,记录用户最后一次登录系统的日期和时间。

username

字符串型

用户名,用于唯一标识用户并进行登录认证。

is_superuser

布尔型

超级用户标识,表示用户是否是超级用户(管理员),具有特殊权限和访问级别。

email

字符串型

电子邮件地址,用于与用户进行沟通和发送重要信息。

  • 表名:Student

字段

数据类型

说明

sno

整数型

学生学号,表示计算机学院的学生学号

sname

字符串型

学生姓名,表示计算机学院的学生姓名。

classname

字符串型

班级名称,表示学院的班级名称。

  • 表名Classes

字段

数据类型

说明

clsno

整数型

班级编号,用于唯一标识每个班级。

classname

字符串型

班级名称,表示学院的班级名称。

classnum

整数型

班级人数,记录班级中的学生人数。

grade

字符串型

年级,表示所属的年级。

  • 表名StudentStudy23

字段

数据类型

说明

sname

字符串型

学生姓名,表示参与青年大学习的学生姓名。

classname

字符串型

班级名称,表示学生所在的班级名称。

period

字符串型

青年大学习期数,表示学生参与的青年大学习期数。

study_date

日期型

学习日期,表示学生参与青年大学习的具体日期。

student_update_time

日期时间型

日期时间型,学生信息更新时间,记录学生信息的最后更新时间。

  • 表名: StudentunStudy23

字段

数据类型

说明

sname

字符串型

学生姓名,表示参与青年大学习的学生姓名。

sno

整数型

学生学号,表示参与大学习的学生学号

classname

字符串型

班级名称,表示学生所在的班级名称。

period

字符串型

青年大学习期数,表示学生参与的青年大学习期数。

  • 表名:ClassesStudy23

字段

数据类型

说明

clsno

整数型

班级编号,用于唯一标识每个班级。

classname

字符串型

班级名称,表示学生所在的班级名称。

period

字符串型

青年大学习期数,表示学生参与的青年大学习期数。

study_num

整数型

学习人数,表示班级参与青年大学习的人数

study_date

日期型

学习日期,表示班级参与青年大学习的具体日期。

class_update_time

日期时间型

日期时间型,班级信息更新时间,记录班级信息的最后更新时间。

四、数据库概念设计和逻辑设计

4.1 E-R图

2E-R

4.2 关系表

Dxxlist(编号,期数,查询链接)

User(序号,账号,密码,邮箱,登录日期,是否管理员)

Student(学号,姓名,班级)

Classes(班级号,班级,班级人数,年级)

StudentStudy23(姓名班级期数,学习日期,更新日期

StudentunStudy23(姓名,学号,班级,期数

ClassesStudy23(班级号,班级,期数,学习人数,学习日期,更新日期)

4.3 视图

1. robots(request)

功能:返回爬虫限制文件(robots.txt)的内容。

参数:request - Django的请求对象。

返回:包含爬虫限制文件内容的HttpResponse对象。

2. show_student_study(request)

功能:显示已学习的学生列表。

参数:request - Django的请求对象。

返回:渲染student_study.html模板并传递学生数据、最新一期名称和班级过滤参数的上下文。

3. show_student_unstudy(request)

功能:显示未学习的学生列表。

参数:request - Django的请求对象。

返回:渲染student_unstudy.html模板并传递学生数据、最新一期名称和班级过滤参数的上下文。

4. show_classes_study(request)

功能:显示班级学习情况。

参数:request - Django的请求对象。

返回:渲染hostpage.html模板并传递班级数据和最新一期名称的上下文。

5. show_grade_study(request)

功能:显示年级学习情况。

参数:request - Django的请求对象。

返回:渲染grade_study.html模板并传递年级数据和最新一期名称的上下文。

6. show_grade_studystudent(request)

功能:显示指定年级已学习的学生列表。

参数:request - Django的请求对象。

返回:渲染grade_studystudent.html模板并传递学生数据、最新一期名称和年级过滤参数的上下文。

7. show_grade_unstudystudent(request)

功能:显示指定年级未学习的学生列表。

参数:request - Django的请求对象。

返回:渲染grade_unstudydtudent.html模板并传递学生数据、最新一期名称和年级过滤参数的上下文。

       这些视图函数实现了根据不同需求展示学生、班级和年级的学习情况。通过获取最新一期的数据并进行筛选,提供了对学生学习状态的查看,并按班级和年级进行了统计和分类展示。

五、数据库物理设计

5.1 索引

       在处理大量数据时,查询操作可能会变得耗时。为了加快查询速度,可以通过建立索引来优化数据库性能。数据库索引类似于书籍的目录,可以快速定位到需要查询的内容。用户可以根据应用环境的需求,在基本表上创建一个或多个索引,以提供多种访问路径,从而加快查找速度。

3ClassesStudy23索引

4StudentStudy23索引

5StudentunStudy23索引

       然而,需要注意的是,索引会占用一定的存储空间,并且在基本表更新时需要进行相应的维护操作,这些都会增加数据库的负担。因此,在创建索引时需要根据实际应用的需求进行选择,避免过度索引。

       在MySQL中,默认会在每个表的主键上创建索引。在系统符合BC范式的情况下,为了节约空间,并没有添加其他索引来进行额外的维护。这样设计可以减少索引的存储空间和更新维护的开销。

       总之,在进行数据库物理设计时,需要权衡索引的创建与维护成本,结合具体应用需求进行选择,以达到提高查询性能的目的。

5.2 触发器

       触发器是由insert、update和delete等事件来触发某种特定操作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样做可以保证某些操作之间的一致性。例如,当学生表中增加了一个学生信息时,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录,就执行一次计算学生总数的操作。这样就可以保证每次增加学生的记录后,学生总数是与记录数一致的。触发器触发的执行语句可能只有一个,也可能有多个。

1. create trigger 触发器名 before | after 触发事件

2. on 表名 for each row 执行语句

       在我的项目中,可以考虑在以下情况下使用触发器:

       数据完整性约束:使用触发器来实施数据完整性约束,确保数据的一致性和有效性。例如,在插入或更新数据时,可以使用触发器来验证特定条件并拒绝不符合规定的操作。

       数据衍生:如果需要从现有数据中计算或生成其他数据,可以使用触发器来自动执行这些计算或生成过程。例如,当某个表中的数据发生变化时,可以使用触发器来更新相关表中的计算结果或派生数据。

       日志记录:通过触发器可以实现对特定表的操作进行日志记录,记录数据的变更历史和操作日志。这对于审计和跟踪数据变更非常有用。

6日志记录数据库操作

       数据复制和同步:在进行数据复制或数据同步操作时,可以使用触发器来捕捉源表中的变化并将其应用到目标表中,以保持数据的一致性。

       自动化业务逻辑:如果有一些常规的业务逻辑需要在特定条件下自动执行,可以使用触发器来触发相关的业务操作。例如,当某个订单状态变为已完成时,可以使用触发器自动触发生成发票或发送确认邮件等操作。

六、应用程序设计

6.1 功能分解与模块设计

  • 用户认证与权限管理模块:

1. 注册与登录功能:实现用户注册和登录功能,确保用户身份认证的安全性。

2. 用户权限管理:定义不同用户角色的权限,限制用户访问和操作系统的范围。

  • 数据管理模块:

1. 数据库连接:与MySQL 8.0数据库建立连接,进行数据的读取和写入操作。

2. 数据库模型设计:设计与青年大学习相关的数据库表,包括学生信息、参学记录等。

3. 数据更新与同步:实现数据的自动更新和同步,确保查询结果的实时性。

  • 查询功能模块:

1. 个人参学查询:学生通过学号或身份验证信息查询自己的青年大学习参学结果。

2. 学院参学查询:管理员通过学院范围内的条件筛选,查询学院学生的参学结果。

3. 数据可视化:根据查询结果,生成可视化的图表和报表,展示参学数据的统计和分析结果。

  • 个性化推荐模块(待定):

1. 学习历史记录:记录学生的参学历史和学习兴趣,为个性化推荐提供数据支持。

2. 相关资源推荐:根据学生的学习历史和兴趣标签,推荐相关的学习资源和活动。

  • 系统性能优化模块:

1. 缓存机制:使用缓存技术(如Redis)提高查询性能,减轻数据库负载。

2. 异步任务处理:采用异步任务队列(如Celery)处理耗时的任务,提高系统的响应速度。

  • 安全性模块:

1. 数据加密:对敏感数据进行加密处理,确保数据的安全性。

2. 输入验证:对用户输入的数据进行验证,防止恶意攻击和数据注入。

3. 日志记录与监控:记录系统操作日志,监控系统的安全状态和异常行为。

6.2 威胁建模与缓解措施

  • 威胁建模:

身份验证漏洞:攻击者可能尝试通过猜测密码、暴力破解等方式获取用户账户的访问权限。

缓解措施:采用强密码策略,包括密码复杂性要求和定期密码更换。实施账户锁定机制,在多次登录失败后暂时锁定账户。使用双因素身份验证增加登录安全性。

数据泄露:攻击者可能通过数据库注入、未经授权的访问等方式获取敏感数据。

缓解措施:对用户输入数据进行严格验证和过滤,使用参数化查询或ORM框架来防止SQL注入。确保数据库访问权限的最小化,并加密敏感数据。定期进行安全审计和漏洞扫描,及时修复系统漏洞。

会话劫持:攻击者可能截获用户的会话标识,冒充用户身份进行未经授权的操作。

缓解措施:使用HTTPS协议保护会话数据的传输,防止信息被窃取。为每个会话生成唯一的会话标识,并对会话进行有效期管理。使用CSRF令牌保护表单提交,防止跨站请求伪造攻击。

  • 缓解措施:
  1. 数据备份与恢复:定期对数据库进行备份,确保在意外数据损坏或丢失时能够及时恢复数据。
  2. 访问控制和权限管理:严格控制系统的访问权限,限制用户和管理员的操作范围。为不同角色分配不同的权限,确保数据和功能的安全性。
  3. 安全日志记录与监控:记录系统操作日志,包括登录记录、敏感操作记录等,用于安全审计和追踪异常行为。实施实时监控系统的安全状态,及时检测和应对潜在的安全威胁。
  4. 定期安全更新与补丁:及时更新系统框架、库和组件的安全补丁,保持系统的安全性。
  5. 安全培训与意识提升:对用户和管理员进行安全培训,提高其对安全风险的认识和应对能力。加强安全意识,鼓励使用强密码、定期更换密码,并避免共享账户和敏感信息。

       通过以上缓解措施,可以有效降低系统面临的安全威胁,并增强系统的安全性和防护能力。然而,安全性是一个持续的过程,需要不断更新和完善防护措施,以适应不断演变的威胁环境。

6.3 界面设计

7网站大致界面

       网页页面具有以下特点:

清晰的导航栏:在页面的顶部或侧边,设计一个清晰易见的导航栏,包含主要功能的链接,例如首页、个人查询、学院查询等。导航栏在不同页面保持一致,以方便用户导航。

首页概览:在首页展示一个概览部分,包括系统的简要介绍、特点和重要功能的快速访问入口,以及最新的参学活动或相关通知。

用户登录:提供用户登录功能(因内部人员使用,无需开放注册界面),让用户能够访问个人查询和其他相关功能。设计简洁明了的登录和注册界面,包括输入框、按钮和提示信息,以及密码重置选项。

学院查询界面:为管理员提供一个学院查询界面,以便他们可以根据学院范围内的条件筛选和查询学生的参学结果。

数据可视化和报表:提供可视化的参学数据统计和分析报表,以图表、图形或表格的形式展示参学情况、学分积累和成绩分布等数据。确保图表和报表具有良好的可读性和交互性。

风格和布局:选择了适合青年大学习主题的界面风格和布局,简洁、现代、专业,凸显界面的美观性和可读性。

6.4 算法设计

  • django登录

1. 用户注册:

用户提供密码时,Django会使用哈希算法对密码进行加密,并添加一个随机生成的盐值。

哈希算法是一种单向函数,将密码和盐值作为输入,生成一个固定长度的哈希值。

哈希值和盐值一起存储在数据库中,作为用户的密码凭证。

2. 用户登录:

用户在登录时输入密码。

Django从数据库中获取存储的哈希值和盐值。

使用相同的哈希算法和存储的盐值,对用户输入的密码进行哈希运算。

将计算得到的哈希值与存储的哈希值进行比较。

如果两个哈希值匹配,则用户认证成功,允许登录。

1. def login_view(request):

2.     if request.method == 'POST':

3.         username = request.POST.get('username',None)

4.         password = request.POST.get('password',None)

5.         

6.         使用 authenticate() 函数进行用户验证

7.         user = authenticate(request, username=username, password=password)

8.         if user is not None:

9.             验证成功,登录用户

10.             login(request, user)

11.             request.session["is_login"] = True

12.             request.session["user_id"] = user.id  仅存储用户ID

13.             return redirect('../admin')

14.         

15.         else:

16.             验证失败,显示错误消息

17.             error_message = '用户名或密码错误'

18.             #return HttpResponse(username)

19.             return render(request, 'login.html', {'error_message': error_message})

20.     else:

21.         设置一个默认密码值

22.         password = ''

23.     return render(request, 'login.html')

       通过使用哈希算法和盐值,Django可以保护用户密码的安全性。即使数据库遭到未授权访问,攻击者也无法直接获取用户的原始密码,因为哈希算法是不可逆的。

       Django中默认使用的哈希算法是PBKDF2(Password-Based Key Derivation Function 2),它是一种基于密码的密钥派生函数,通过多次迭代和盐值,增加了密码破解的难度和计算复杂性。同时,Django还支持其他哈希算法,如bcrypt和Argon2,它们提供更高的安全性。

  • 爬取官网数据

1. 定时任务设置:使用定时任务工具或框架(如crontab、APScheduler等)设置一个定时任务,每隔五分钟触发一次。

2. 网络请求:在每次触发定时任务时,爬虫程序会发起一个网络请求,访问官网的目标页面。

3. 页面解析:获取到目标页面的HTML内容后,爬虫程序会使用相应的解析工具(如BeautifulSoup、XPath等)解析HTML结构,提取所需的数据。

1. url1 = url.replace('%25','%')

2. url2 = url1.replace('?t=3#/pages/class/ranking/ranking','api/peopleRankStage')              #url改为api调用格式

3. response = requests.get(url2)

4. if response.status_code == 200:

5.     data = response.json()

6.     #print(data)

7.     dt_string =datetime.now().strftime("%Y/%m/%d %H:%M:%S")

8.     for item in data['list']['list']:

9.         #print(item['level4'])

10.         cursor = connection.cursor()            #创建游标对象

11.         sql = "SELECT ClsNO,classnum FROM classes WHERE classname ='{}'".format(item['level4'])          #查询班级是否存在class表中

12.         cursor.execute(sql)

13.         result = cursor.fetchone()

14.         关闭游标和连接

15.         cursor.close()

16.         #print(ClsNO,classnum,item['level4'])

17.         if result is None:

18.             continue

19.

20.         else:

21.             ClsNO, classnum = result

22.             cursor = connection.cursor()            #创建游标对象

23.             sql = "SELECT study_num FROM 2023classes_study WHERE classname = '{}' AND period = '{}'".format(item['level4'], period)           #查询班级是否存在class_study表中,如果存在则更新,如果不存在,则插入 

24.             cursor.execute(sql)

25.             study_num = cursor.fetchone()

26.             studynum = str(study_num)

27.             关闭游标和连接

28.             cursor.close()

4. 数据处理与存储:对提取到的数据进行处理和清洗,将其存储到适当的数据结构(如数据库、文件等)中,以便后续使用或展示。

5. 重复执行:完成数据处理和存储后,等待下一次定时任务的触发,然后重复上述步骤,实现定时爬取官网数据的循环。

8设置定时运行

图 9安徽省团委开放的查询链接

图 10官网开放的接口所返回的数据

  • 视图

       用了 Django ORM(对象关系映射)来进行数据库查询和过滤。没有明显涉及到特定的算法,但有一些常见的数据库查询和数据处理操作。

1. def show_student_study(request):                        #显示已学的同学

2.     max_dxxno = Dxxlist.objects.aggregate(Max('dxxno'))['dxxno__max']

3.     maxdxxno = Dxxlist.objects.filter(dxxno = max_dxxno).first()

4.     period = maxdxxno.period                    #获取最新一期的名称

5.

6.     study_data = StudentStudy23.objects.filter(period = period)     筛选为最新一期的数据

7.

8.     检查url中是否有参数phonenumber

9.     ph =  request.GET.get('classname',None)

10.

11.     classes_data = Classes.objects.filter(classname = ph)

12.     如果有,添加过滤条件

13.     if classes_data.exists():

14.         study_data = study_data.filter(classname=ph)

15.     else:

16.         return render(request, '404.html')

17.

18.     student_data = []

19.

20.     for item in  study_data:

21.         student_data.append({

22.             'Sname': item.sname,

23.             'classname': item.classname,

24.             'period': item.period,

25.             'study_date': item.study_date,

26.             'student_update_time': item.student_update_time

27.         })

28.     return render(request, 'student_study.html', {'student_data': student_data, 'period': period, 'ph':ph})

       这些操作主要是基于 Django ORM 的数据库查询、过滤和数据处理方法,而非特定的算法。它们用于根据特定条件从数据库中获取数据,并将符合条件的数据处理后传递给前端模板进行渲染。

6.5 安全机制设计

  • 身份认证与授权:

       使用强大的身份认证机制,例如使用用户名和密码进行登录验证,或者采用更安全的双因素身份验证。

图 12登录页面

       使用访问控制列表(ACL)或基于角色的访问控制(RBAC)来管理用户的权限,确保只有授权用户可以访问相应的功能和数据。

  • 数据加密:

       对存储在数据库中的敏感数据进行加密,以防止数据库被未授权的访问者读取。

       在数据传输过程中使用安全协议(如HTTPS)加密敏感信息,以防止信息在传输过程中被窃听或篡改。

图 13加密过后的密码

  • 输入验证与过滤:

       对用户输入进行严格的验证和过滤,以防止常见的安全漏洞,如SQL注入、跨站脚本攻击(XSS)等。

图 14关键词过滤

       使用白名单过滤或输入转义来防止恶意内容的注入。

1.  检查url中是否有参数phonenumber

2.     ph =  request.GET.get('classname',None)

3.

4.     classes_data = Classes.objects.filter(classname = ph)

5.     如果有,添加过滤条件

6.     if classes_data.exists():

7.         study_data = study_data.filter(classname=ph)

8.     else:

9.         return render(request, '404.html')

  • 安全日志与监控:

       实施安全日志记录机制,记录关键操作和异常事件,以便进行安全审计和故障排查。

图 15日志

设置实时监控和警报系统,用于检测潜在的安全威胁和异常行为。

  • 异常处理与错误消息:

确保系统能够适当处理异常情况,并提供有用但不过于详细的错误消息,以防止信息泄露和攻击者获取敏感信息。

  • 定期更新与漏洞修复:

定期更新系统依赖的软件包、库和框架,确保系统使用的组件没有已知的安全漏洞。

及时应用软件供应商发布的安全补丁和更新,以修复已知的漏洞和缺陷。

  • 安全培训与意识提升:

为系统管理员和用户提供安全培训,加强他们对安全风险的认识和防范意识。

提供用户教育和建议,如使用强密码、定期更改密码、不与他人共享账户等。

6.6 功能模块联调

确定联调顺序:根据功能的依赖关系和优先级,确定功能模块的联调顺序。一般建议从基础功能开始,逐步添加和测试其他功能模块。

创建联调环境:搭建一个专门用于联调的环境,包括数据库、服务器、第三方服务等,并确保各个模块都能正常访问和使用这些资源。

编写联调测试用例:根据每个功能模块的需求和设计,编写相应的联调测试用例。测试用例应该覆盖各种情况,包括正常流程、异常情况和边界条件。

执行功能模块联调测试:按照联调测试用例,逐个执行功能模块的联调测试。确保模块之间的接口和数据传递正常,功能按预期工作。

处理问题和冲突:在联调测试过程中,可能会发现功能模块之间的问题和冲突。及时记录和报告问题,并与相关开发人员合作解决。

日志和错误处理:确保每个功能模块都能正确记录日志,并在发生错误或异常情况时进行适当的处理。日志记录和错误处理是系统的重要部分,有助于故障排查和安全性分析。

性能和负载测试:在功能模块联调的过程中,可以进行一些性能和负载测试,以确保系统能够处理预期的并发请求和大量数据。

验收测试:在功能模块联调测试完成后,进行验收测试以验证系统是否满足用户需求和预期功能。

回归测试:在修改和更新系统后,进行回归测试以确保功能模块联调的稳定性和一致性。

文档记录:在联调测试的过程中,记录测试结果、发现的问题和解决方案,以便后续参考和复查。

七、测试和运行

7.1 功能测试

图 9主页(显示各班级参学情况)

图 10每个班级的详细参学情况

图 11每年级参学情况

图 12管理员界面

7.2 安全性测试

  • 加入robots.txt文件

图 13robots.

       明确该网站不允许爬虫

  • 加入csrf验证

1. <h3>欢迎登录青年大学习统计平台</h3>

2.             <form action="/login/" method="POST" class="m-t" role="form">

3.                 {% csrf_token %}

4.                 <h3 style="color: red;">{{ error_message }}</h3>

5.                 <div class="form-group">

6.                     <input type="text" class="form-control" placeholder="用户名" name="username" required="">

7.                 </div>

8.                 <div class="form-group">

9.                     <input type="password" class="form-control" placeholder="密码" name="password" required="">

10.                 </div>

11.                 <button type="submit" class="btn btn-primary block full-width m-b">登录</button>

12.

13.                 <p class="text-muted text-center"><small>请联系超级管理员获取账号</small></p>

14.             </form>

       在 Django 中,CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的安全威胁,用于防止恶意网站对用户进行伪造请求。Django 提供了内置的 CSRF 防护机制来保护你的应用程序免受此类攻击。

       在 Django 中,CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的安全威胁,用于防止恶意网站对用户进行伪造请求。Django 提供了内置的 CSRF 防护机制来保护你的应用程序免受此类攻击。

       CSRF 防护机制的核心是在表单中添加 CSRF 令牌(CSRF Token),并在服务器端验证该令牌的有效性。下面是使用 Django 进行 CSRF 防护的基本步骤:

  1. 启用 CSRF 中间件:在 Django 项目的设置文件中(settings.py),确保 MIDDLEWARE 配置中包含 django.middleware.csrf.CsrfViewMiddleware。这将启用 Django 的 CSRF 中间件,用于处理 CSRF 验证。
  2. 在表单中添加 CSRF 令牌:在你的表单模板中,确保使用 {% csrf_token %} 模板标签来生成 CSRF 令牌。这将在表单中添加一个隐藏的输入字段,包含了 CSRF 令牌的值。
  3. 验证 CSRF 令牌:在处理表单提交的视图函数中,Django 会自动验证请求中的 CSRF 令牌。如果令牌无效或缺失,Django 将抛出 django.middleware.csrf.CsrfViewMiddleware 异常。

7.3 软件系统部署

       购买华为云服务器并且购买域名备案

主页 beat (hfutscidxx.top) 点击即可访问网站

图 14网站备案

图 15宝塔面板安装

       安装mysql、python等程序

图 16安装相应程序

图 17数据库导入

图 18项目部署

. 参考文献

[1] Web 开发简介 | 白月黑羽 (byhy.net)

[2] (7 条消息 ) [ 项目部署 ] 宝塔部署项目 _AnnieRabbit 的博客 -CSDN 博客

[3] (7 条消息 ) Django 之操作 MySQL_django 使用 mysql 数据库 _Soulmate. 的博客 -CSDN 博客

[4] Python Django 连接(听明白了是连接不是创建!) Mysql 已存在的数据库 - 程序员大本营 (pianshen.com)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。