拣学--基于vue3和django框架实现的辅助考研系统

目录

一.背景和项目介绍

核心功能模块

技术亮点

二.项目准备

2.1前端准备

2.2后端准备

2.3dify本地部署

2.4知识库准备

2.5数据库配置

三.项目流程

[3.1 项目的基本架构图](#3.1 项目的基本架构图)

[3.2 用户生命周期流程](#3.2 用户生命周期流程)

3.3具体功能流程图

四、具体模块实现

[4.1 登陆注册](#4.1 登陆注册)

[4.1.1 功能流程](#4.1.1 功能流程)

[4.1.2 核心代码实现](#4.1.2 核心代码实现)

[前端:Canvas 验证码与登录逻辑](#前端:Canvas 验证码与登录逻辑)

[后端:JWT 认证 (基于 django-rest-framework-jwt)](#后端:JWT 认证 (基于 django-rest-framework-jwt))

4.2首页仪表盘

[4.2.1 功能流程](#4.2.1 功能流程)

[4.2.2 核心代码实现](#4.2.2 核心代码实现)

[前端:ECharts 集成与数据聚合](#前端:ECharts 集成与数据聚合)

后端:数据聚合接口

4.3模考中心

[4.3.1 功能流程](#4.3.1 功能流程)

[4.3.2 核心代码实现](#4.3.2 核心代码实现)

后端:双轨处理与自动入库

前端:流式接收

4.4错题本

[4.4.1 功能流程](#4.4.1 功能流程)

[4.4.2 核心代码实现](#4.4.2 核心代码实现)

后端:去重逻辑

4.5择校报告

[4.5.1 功能流程](#4.5.1 功能流程)

[4.5.2 核心代码实现](#4.5.2 核心代码实现)

[后端:调用 Dify 文本生成](#后端:调用 Dify 文本生成)

前端:展示逻辑

五、项目演示

六、总结与收获

技术整合经验

全栈开发心得


一.背景和项目介绍

在数字化教育飞速发展的今天,个性化学习与智能化辅导已成为教育技术的重要趋势。传统的在线考试系统往往缺乏互动性,且对主观题的批改依赖人工,效率较低;同时,学生在面对海量的错题时,缺乏有效的整理与针对性分析工具。此外,高考/考研志愿填报对于许多学生而言是一个信息不对称的难题,急需智能化的数据分析支持。

基于上述痛点,本项目旨在构建一个集智能对话考试自动化错题管理个性化志愿分析于一体的综合性教育辅助平台。通过引入大语言模型(LLM)能力,实现像真人导师一样的交互式辅导体验,帮助学生提高学习效率,科学规划升学路径。

本项目名为"智能教育辅助平台",是一个基于 Django 5 + Vue 3 前后端分离架构的全栈应用,深度集成了 Dify AI 工作流,为用户提供智能化的学习服务。

核心功能模块

  • 在线考试中心 (Exam Center)

    • 智能出题与批改:支持上传试卷文档(PDF/TXT),利用 AI 对话能力进行实时出题或整卷测验。
    • 流式交互体验:采用 SSE (Server-Sent Events) 技术,实现类似 ChatGPT 的打字机式流畅对话。
    • 自动归档:考试结束后,系统自动解析 AI 返回的结构化数据,记录总分、科目及详细的答题情况。
  • 智能错题本 (Smart Mistake Book)

    • 自动收集:无需手动录入,系统自动从考试记录中筛选错题并归档。
    • 详细解析:每道错题均包含用户错解、正确答案及 AI 生成的评分要点。
    • 薄弱点追踪:记录错题次数,帮助用户识别知识盲区。
  • 院校志愿分析 (School Report)

    • AI 咨询顾问:基于用户的专业、分数及目标地区,生成个性化的录取概率分析报告。
    • 复习建议:提供针对性的备考策略与复习方向。
  • 用户个人中心 (User Profile)

    • 全方位画像:管理用户的基本信息、专业背景、目标院校等,为 AI 分析提供数据支撑。
    • 数据可视化:展示近期成绩走势与学习进度。

技术亮点

  • 双轨数据处理机制:后端创新性地实现了 AI 响应的"展示-存储"分离,前端展示清洗后的纯净文本,后台保留完整的 JSON 数据用于业务逻辑处理。
  • 低代码 AI 编排:通过 Dify 平台编排复杂的 Prompt 工作流,降低了 LLM 应用的开发门槛,同时保证了输出内容的结构化与稳定性。
  • 现代化技术栈:使用 Django 5 的异步特性与 Vue 3 的组合式 API,构建了高性能、易维护的系统架构。

二.项目准备

2.1前端准备

npm create vue@latest frontend 创建项目工程

cd 进入当前项目工程目录之后输入指令 npm i 安装项目所需要的包

2.2后端准备

pip install Django 安装django包后输入命令指令:

  • django-admin startproject 项⽬名称 -- 创建项目主应用

  • startapp 子应用名称 -- 创建子应用

2.3dify本地部署

Github 开源地址: https://github.com/nashsu/FreeAskInternet

点击Tags后选择版本下载zip在本地

命令提示符:

python 复制代码
cd dify
cd docker
cp .env.example .env
docker compose up -d

若安装时出现问题,可能是镜像的问题,可以搜索dify本地部署观看具体安装教程。

2.4知识库准备

下载影刀RPA进行数据的爬取,存入知识库来进行精确的查询与分析

本项目中主要是爬取各学校的各专业的近几年考研分数线

2.5数据库配置

后端django中的setting.py文件中的DATABASE连接本地的mysql数据库,并且创建子应用,在子应用中的model.py文件中设计数据库字段。最后使用指令 "makemigrations 子应用名称 " 创建迁移文件后使用指令"migrate 子应用名称"成功迁移

三.项目流程

3.1 项目的基本架构图

本项目围绕用户的学习闭环展开,从入学评估(注册/画像)学习检测(考试) ,再到问题反馈(错题本) ,最后进行升学规划(志愿分析)

3.2 用户生命周期流程

  1. 用户注册与画像构建

    • 用户注册账号,完善个人信息(专业、目标院校)。

    • 系统建立初始用户画像,为后续 AI 个性化服务提供上下文。

  2. 在线模拟考试

    • 用户进入考试中心,上传试卷或直接开始对话。

    • 系统调用 AI 进行出题或批改。

    • 用户获得即时反馈与分数。

  3. 错题自动归集

    • 系统自动识别考试中的错题。

    • 生成详细解析并存入错题本。

  4. 针对性复习:用户查看错题本,进行针对性训练。

  5. 升学志愿规划:基于累积的考试成绩与专业和地区选择,AI 生成录取概率分析报告与复习建议。

3.3具体功能流程图

针对具体的功能步骤分析:

阶段1:用户进入模考中心模块,在输入框进行输入,传送出去的信息会传入后端dify接口,并且识别传送的数据是纯文本还是附带文件。然后进行JWT身份校验验证token,验证成功就能使用。

阶段2:dify工作流启动开始运行,携带两个参数:文本和文件,并且对接流式输出接口,信息流式返回到前端显示

阶段3:流式输出接口接收到数据,yiled返回出去到前端,并且提炼出dify返回中的数据中需要的内容,缓存原始JSON并使用SSE流式输出

四、具体模块实现

4.1 登陆注册

4.1.1 功能流程

  1. 用户进入 :访问 /login/register 页面。

  2. 验证码生成:前端本地通过 Canvas 绘制算术验证码(如 "12 + 5 = ?"),减少对后端的非必要请求。

  3. 信息提交:用户输入账号、密码及验证码,点击提交。

  4. 后端验证:Django 接收请求,校验账号密码(使用 JWT)。

  5. 状态持久化 :验证通过后,前端接收 JWT Token 并存储于 localStoragesessionStorage,同时利用 Pinia 更新全局用户状态。

  6. 路由跳转:成功登录后跳转至首页;若 Token 失效则被路由守卫拦截回登录页。

4.1.2 核心代码实现

前端:Canvas 验证码与登录逻辑
TypeScript 复制代码
// 1. 生成算术验证码
const generateCaptcha = () => {
  const num1 = Math.floor(Math.random() * 10)
  const num2 = Math.floor(Math.random() * 10)
  // ... 随机选择运算符 ...
  captchaCode.value = result.toString() // 保存正确结果用于比对
  drawCaptcha(expression) // 绘制到 Canvas
}

// 2. 登录处理
const handleLogin = async () => {
  // 本地校验验证码
  if (captchaInput.value !== captchaCode.value) {
    errors.value.captcha = '验证码错误'
    return
  }

  // 发送请求
  const response = await post('/user/login/', { ... })
  if (response.data.code === 200) {
    const token = response.data.data.token
    // 存储 Token
    localStorage.setItem('token', token)
    // 更新 Pinia 状态
    userStore.login(response.data.data)
    router.push('/')
  }
}
后端:JWT 认证 (基于 django-rest-framework-jwt)

后端主要依赖 DRF 的 JWT 插件进行 Token 签发与验证,在 views.py 中通过装饰器或中间件保护需要登录的接口,添加登陆与注册路由到白名单。

4.2首页仪表盘

4.2.1 功能流程

  1. 数据加载 :页面挂载 (onMounted) 时,并发请求多个 API 获取数据:

    • /exam/trends/:获取近期模考分数趋势。

    • /exam/latest-score/:获取最新一次专业课成绩。

    • mistakeStore.fetchMistakes():获取错题数量。

  2. 图表渲染:使用 ECharts 渲染折线图(模考趋势)和南丁格尔玫瑰图(学科分布)。

  3. 智能分析:根据当前分数,前端通过简单的规则逻辑生成一段"成绩分析"文案。

4.2.2 核心代码实现

前端:ECharts 集成与数据聚合
TypeScript 复制代码
// 并发获取数据
onMounted(() => {
  fetchExamTrends() // 获取折线图数据
  initPieChart()    // 初始化饼图
  fetchLatestScore() // 更新饼图中"专业课"的分数
  mistakeStore.fetchMistakes() // 更新错题数
})

// ECharts 配置示例 (折线图)
const initChart = (data) => {
  const option = {
    xAxis: { data: data.dates },
    series: [{
      type: 'line',
      data: data.scores,
      areaStyle: { ... } // 渐变填充效果
    }]
  }
  chartInstance.setOption(option)
}
后端:数据聚合接口
python 复制代码
class ExamTrendsView(View):
    def get(self, request):
        # 获取当前用户最近5次考试
        recent_exams = UserExam.objects.filter(user_id=user_id).order_by('-create_time')[:5]
        # 翻转为时间正序用于图表展示
        recent_exams = reversed(recent_exams)
        
        # 构造 ECharts 所需的数组
        dates = [exam.create_time.strftime('%m-%d') for exam in recent_exams]
        scores = [exam.score + 275 for exam in recent_exams] # 示例分数修正
        
        return JsonResponse({"data": {"dates": dates, "scores": scores}})

4.3模考中心

4.3.1 功能流程

  1. 文件上传/输入:用户上传试卷(PDF/Word)或直接输入题目文本。

  2. 流式交互

    • 前端将文件/文本发送至后端 /exam/chat/

    • 后端调用 Dify API 处理文件并进行对话。

    • Dify 返回流式数据 (SSE)。

  3. 双轨数据处理

    • 前端流 :后端将 Dify 的响应实时转发给前端,前端实时清洗 JSON 符号({, }),只展示纯文本给用户。

    • 后端流:后端同时累积完整的 JSON 数据。

  4. 自动归档 :对话结束时,后端解析累积的 JSON,提取"总分"存入 UserExam 表,提取"错题"存入 UserWrongQuestion 表。

4.3.2 核心代码实现

后端:双轨处理与自动入库
python 复制代码
def process_and_save(self, generator, user, exam_name):
    full_response = ""
    for item in generator:
        # item 是从 Dify 拿到的数据片段
        if isinstance(item, dict) and item.get('type') == 'answer':
            content = item.get('content', '')
            full_response += content # 1. 后端留底:累积完整 JSON
            
            # 2. 前端展示:清洗掉 JSON 格式符号,只给用户看内容
            clean_content = content.replace('{', '').replace('}', '').replace('"', '')
            yield clean_content 
            
    # 流结束后,解析 full_response 进行入库
    try:
        data = json.loads(extract_json(full_response))
        # 保存考试记录
        UserExam.objects.create(user=user, score=data['总分'], ...)
        # 保存错题
        for q in data['result']:
            if not q['是否正确']:
                UserWrongQuestion.objects.create(...)
    except:
        pass
前端:流式接收
TypeScript 复制代码
const sendMessage = async () => {
    const response = await fetch('/exam/chat/', { ... })
    const reader = response.body.getReader()
    
    while (true) {
        const { done, value } = await reader.read()
        if (done) break
        // 实时将清洗后的文本追加到对话框
        assistantMessage.content += new TextDecoder().decode(value)
    }
}

4.4错题本

4.4.1 功能流程

  1. 数据来源 :如上所述,完全由模考中心自动触发存入,用户无需手动录入。

  2. 列表展示MistakeBookView 从 Pinia Store (mistake.ts) 获取错题列表。

  3. 筛选与搜索:支持按"题型"(选择/简答)和"关键字"过滤。

  4. 详情查看:点击卡片,弹窗展示"您的答案"与"正确答案"的对比。

  5. 去重机制 :后端在保存错题时使用 update_or_create,如果同一题再次做错,只增加"错误次数"并更新最新错误答案,避免重复记录。

4.4.2 核心代码实现

后端:去重逻辑
python 复制代码
# 检查该用户是否已存在该错题
existing_wrong = UserWrongQuestion.objects.filter(
    user=user, 
    question_text=question_text
).first()

if existing_wrong:
    # 存在则更新:错误次数 +1,更新最新错误答案
    existing_wrong.error_count += 1
    existing_wrong.user_answer = new_wrong_answer
    existing_wrong.save()
else:
    # 不存在则创建
    UserWrongQuestion.objects.create(...)

4.5择校报告

4.5.1 功能流程

  1. 参数收集:从用户画像中获取"专业"、"模考总分",用户补充"目标地区"。

  2. Prompt 构建 :后端将这些参数拼接成一段 Prompt:"专业:计算机,分数:350,目标:北京。请分析..."

  3. AI 生成:调用 Dify 的文本生成型应用。

  4. 结果展示:前端接收流式文本,支持 Markdown 渲染或结构化卡片展示(如果 AI 返回 JSON)。

4.5.2 核心代码实现

后端:调用 Dify 文本生成
python 复制代码
# 构造 Prompt
message = f"请根据以下学生情况生成一份分析报告:\n专业:{major}\n模考总分:{score}\n目标地区:{target_place}..."

# 调用 Dify 并流式返回
return StreamingHttpResponse(
    run_dify_workflow(message),
    content_type='text/event-stream'
)
前端:展示逻辑
TypeScript 复制代码
// 简单的流式读取与 Markdown 渲染
const generateReport = async () => {
    // ... fetch ...
    while (true) {
        const { done, value } = await reader.read()
        reportResult.value += decoder.decode(value)
    }
}
// 使用 computed 属性实时渲染 Markdown
const renderedReport = computed(() => md.render(reportResult.value))

五、项目演示

注册页面:

登陆页面:

首页:

模考中心页面:

错题本页面:

择校报告:

六、总结与收获

技术整合经验

通过本项目,深刻理解了 Django + Vue3 全栈开发的配合模式,特别是如何处理 JWT 认证跨域资源共享 (CORS) 以及 SSE 流式传输。成功打通了业务系统与 AI 大模型(Dify)的连接,探索了 LLM 在垂直领域(教育)落地的可行路径。

全栈开发心得

  • 数据驱动设计:在开发错题本时,先设计好数据库模型(Model),再反推前端展示需求,能够有效避免逻辑漏洞。

  • 用户体验优先:为了解决 AI 响应慢的问题,采用了流式输出(Streaming),极大缓解了用户的等待焦虑,这是提升 AI 应用体验的关键一环。

  • 模块化思维:将 Dify 调用封装为独立的 Utils 工具类,使得代码复用性极高,后续扩展新的 AI 功能非常便捷。

相关推荐
Darenm1117 小时前
关于AI 面试官项目:智选ai 基于 Vue3 + Django + Dify 的全栈开发实战
人工智能·python·django
JIngJaneIL7 小时前
基于java+ vue畅游游戏销售管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·游戏
摸鱼少侠梁先生7 小时前
通过接口获取字典的数据进行渲染
前端·javascript·vue.js
詹姆斯爱研究Java7 小时前
基于Django的租房网站的设计与实现
数据库·python·django
拉姆哥的小屋7 小时前
基于多模态深度学习的城市公园社交媒体评论智能分析系统——从BERTopic主题建模到CLIP图文一致性的全栈实践
人工智能·python·深度学习·矩阵·媒体
ZAz_7 小时前
DAY 41 图像数据与显存
python
曲幽7 小时前
Python环境管理利器Conda:从入门到避坑实战指南
python·conda·pip·anaconda·uv·venv·miniconda
艾莉丝努力练剑7 小时前
【Python库和代码案例:第一课】Python 标准库与第三方库实战指南:从日期处理到 Excel 操作
java·服务器·开发语言·人工智能·python·pycharm·pip
爱打代码的小林7 小时前
python(爬虫selenium)
爬虫·python·selenium