一、 项目背景与意义

随着社会节奏加快和学业压力增大,大学生心理健康问题日益凸显。然而,传统的心理健康服务模式(如线下咨询、纸质问卷)存在覆盖范围有限、数据难以追踪、隐私保护不足、学生求助意愿低等问题。构建一个基于Web的大学生心理健康管理系统,旨在利用信息化手段,为高校提供一套高效、便捷、私密的心理健康服务与管理工具。

项目意义:

  • 对学生:提供匿名测评、在线预约咨询、获取心理知识等一站式服务,降低求助门槛。
  • 对心理咨询师:实现学生档案数字化管理、测评结果智能分析、咨询日程在线安排,提升工作效率。
  • 对学校管理者:通过数据看板宏观掌握学生整体心理状况,及时发现潜在风险群体,实现精准干预。
  • 技术实践价值:本项目综合运用了Django全栈开发、数据库设计、前后端交互、权限控制等核心技术,是一个典型的教育信息化应用案例。

二、 系统技术栈

本系统采用经典的Python Web开发技术栈,遵循MVC(MTV)设计模式,确保系统稳定、可维护、易扩展。

层次 技术选型 说明
后端框架 Django 4.x 核心Web框架,提供ORM、模板、路由、Admin后台等全套功能。
前端展示 Django Template (HTML) + Bootstrap 5 + JavaScript 使用Django模板引擎渲染页面,Bootstrap进行快速响应式布局,原生JS/jQuery处理交互。
数据库 MySQL 8.0 / PostgreSQL 关系型数据库,用于存储用户、测评、咨询等核心业务数据。
ORM Django ORM 实现Python对象与数据库表的映射,无需编写原生SQL。
用户认证 Django内置auth系统 处理用户注册、登录、权限分组(学生、咨询师、管理员)。
开发环境 Python 3.9+, Pipenv/Virtualenv 虚拟环境管理,隔离项目依赖。
版本控制 Git 代码管理与协作。

三、 系统核心功能模块设计

系统主要分为三个角色端:学生端、心理咨询师端、系统管理员端。

1. 学生端功能

  • 注册与登录:学生使用学号等信息注册,登录后进入个人中心。
  • 心理测评:在线完成标准化心理量表(如SCL-90、SDS),系统自动评分并生成报告。
  • 咨询预约:查看咨询师排班表,选择时间段进行在线预约。
  • 我的咨询:查看预约记录、咨询记录(摘要)。
  • 心理知识库:浏览文章、视频等科普资源。
  • 消息通知:接收预约成功、咨询提醒等系统消息。

2. 心理咨询师端功能

  • 个案管理:查看分配给自己的学生列表、档案及历史测评报告。
  • 日程管理:设置可预约的时间段,查看自己的预约安排。
  • 咨询记录:在每次咨询后,填写并保存咨询记录。
  • 报告查看:查看所负责学生的详细测评报告。

3. 系统管理员端功能

  • 用户管理:管理学生、咨询师账号,分配角色。
  • 测评管理:管理心理测评量表题库。
  • 数据统计:查看整体测评数据统计、预约趋势等可视化报表。
  • 内容管理:管理心理知识库的文章和资源。
  • 系统设置:进行基础参数配置。

四、 数据库核心模型设计(Models.py)

以下是部分核心数据模型的Django定义,展示了系统的数据结构。

# models.py
from django.db import models
from django.contrib.auth.models import User

class StudentProfile(models.Model):
    """学生扩展信息"""
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='student_profile')
    student_id = models.CharField(max_length=20, unique=True, verbose_name='学号')
    faculty = models.CharField(max_length=100, verbose_name='院系')
    phone = models.CharField(max_length=15, blank=True, verbose_name='联系电话')
    emergency_contact = models.CharField(max_length=100, blank=True, verbose_name='紧急联系人')
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = '学生档案'
        verbose_name_plural = verbose_name

    def __str__(self):
        return f'{self.user.get_full_name()} ({self.student_id})'

class CounselorProfile(models.Model):
    """心理咨询师信息"""
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='counselor_profile')
    employee_id = models.CharField(max_length=20, unique=True, verbose_name='工号')
    title = models.CharField(max_length=50, verbose_name='职称')
    introduction = models.TextField(blank=True, verbose_name='个人介绍')
    is_active = models.BooleanField(default=True, verbose_name='是否可预约')

    class Meta:
        verbose_name = '咨询师档案'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.user.get_full_name()

class PsychologicalTest(models.Model):
    """心理测评量表"""
    name = models.CharField(max_length=200, verbose_name='量表名称')
    description = models.TextField(blank=True, verbose_name='量表说明')
    is_published = models.BooleanField(default=False, verbose_name='是否发布')

    def __str__(self):
        return self.name

class TestQuestion(models.Model):
    """测评题目"""
    test = models.ForeignKey(PsychologicalTest, on_delete=models.CASCADE, related_name='questions')
    question_text = models.TextField(verbose_name='题目内容')
    option_a = models.CharField(max_length=200, verbose_name='选项A')
    option_b = models.CharField(max_length=200, verbose_name='选项B')
    option_c = models.CharField(max_length=200, verbose_name='选项C')
    option_d = models.CharField(max_length=200, verbose_name='选项D')
    # 可根据需要增加更多选项字段或使用JSONField存储

    class Meta:
        ordering = ['id']

class TestRecord(models.Model):
    """学生测评记录"""
    student = models.ForeignKey(StudentProfile, on_delete=models.CASCADE, related_name='test_records')
    test = models.ForeignKey(PsychologicalTest, on_delete=models.CASCADE)
    score = models.IntegerField(verbose_name='得分')
    result_level = models.CharField(max_length=50, verbose_name='结果等级')  # 如:正常、轻度、中度、重度
    detail = models.JSONField(default=dict, verbose_name='详细结果(JSON)')  # 存储各维度分
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']

class Appointment(models.Model):
    """咨询预约"""
    STATUS_CHOICES = (
        ('pending', '待确认'),
        ('confirmed', '已确认'),
        ('completed', '已完成'),
        ('cancelled', '已取消'),
    )
    student = models.ForeignKey(StudentProfile, on_delete=models.CASCADE, related_name='appointments')
    counselor = models.ForeignKey(CounselorProfile, on_delete=models.CASCADE, related_name='appointments')
    scheduled_time = models.DateTimeField(verbose_name='预约时间')
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
    student_notes = models.TextField(blank=True, verbose_name='学生备注')
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['scheduled_time']

五、 核心业务逻辑与视图示例(Views.py)

以下展示学生进行心理测评和预约咨询的两个核心视图函数。

# views.py (部分)
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import ListView, DetailView
from django.utils import timezone
from .models import PsychologicalTest, TestRecord, Appointment, CounselorProfile
from .forms import TestSubmissionForm, AppointmentForm

@login_required
def take_test(request, test_id):
    """进行心理测评"""
    test = get_object_or_404(PsychologicalTest, id=test_id, is_published=True)
    questions = test.questions.all()

    if request.method == 'POST':
        form = TestSubmissionForm(request.POST, questions=questions)
        if form.is_valid():
            # 计算得分 (此处为简化逻辑,实际应根据量表规则计算)
            total_score = 0
            answer_details = {}
            for question in questions:
                field_name = f'question_{question.id}'
                answer = form.cleaned_data.get(field_name)
                # 假设选项A-D对应分值1-4
                score_map = {'A': 1, 'B': 2, 'C': 3, 'D': 4}
                question_score = score_map.get(answer, 0)
                total_score += question_score
                answer_details[str(question.id)] = {'answer': answer, 'score': question_score}

            # 评估结果等级
            if total_score <= 20:
                level = '正常'
            elif total_score <= 40:
                level = '轻度'
            elif total_score <= 60:
                level = '中度'
            else:
                level = '重度'

            # 保存测评记录
            TestRecord.objects.create(
                student=request.user.student_profile,
                test=test,
                score=total_score,
                result_level=level,
                detail=answer_details
            )
            return redirect('test_result', record_id=...)
    else:
        form = TestSubmissionForm(questions=questions)

    context = {'test': test, 'questions': questions, 'form': form}
    return render(request, 'mental_health/take_test.html', context)

@login_required
def make_appointment(request, counselor_id):
    """学生预约咨询"""
    counselor = get_object_or_404(CounselorProfile, id=counselor_id, is_active=True)
    # 获取该咨询师未来可预约的时间段(简化逻辑,实际应有更复杂的排班规则)
    # 假设这里从另一个模型 CounselorSchedule 获取
    available_slots = [...]  # 可用时间段列表

    if request.method == 'POST':
        form = AppointmentForm(request.POST, available_slots=available_slots)
        if form.is_valid():
            appointment = form.save(commit=False)
            appointment.student = request.user.student_profile
            appointment.counselor = counselor
            appointment.status = 'pending'
            appointment.save()
            # 可以在此处触发邮件或站内信通知
            return redirect('my_appointments')
    else:
        form = AppointmentForm(available_slots=available_slots)

    context = {'counselor': counselor, 'form': form}
    return render(request, 'mental_health/make_appointment.html', context)

class MyAppointmentListView(LoginRequiredMixin, ListView):
    """我的预约列表"""
    model = Appointment
    template_name = 'mental_health/my_appointments.html'
    paginate_by = 10

    def get_queryset(self):
        return Appointment.objects.filter(
            student=self.request.user.student_profile
        ).order_by('-scheduled_time')

六、 总结与展望

本文介绍了基于Django的大学生心理健康管理系统的设计与实现,涵盖了项目背景、技术栈选型、功能模块、数据库设计以及核心代码示例。该系统能够有效整合高校心理健康服务资源,为学生提供便捷的在线服务,同时提升管理效率。

后续可扩展方向:

  • AI初步筛查:集成自然语言处理模型,对学生的留言或开放式问题进行情感分析,实现风险预警。
  • 移动端适配:开发微信小程序或React Native App,提供更便捷的移动端体验。
  • 数据深度分析:利用BI工具对历年测评数据进行趋势分析,为心理健康教育工作提供决策支持。
  • 匿名树洞社区:增加轻量级的匿名交流板块,促进学生间的互助支持。

该系统代码结构清晰,遵循Django最佳实践,适合作为高校计算机相关专业的毕业设计或课程设计项目,也具备进一步产品化的潜力。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐