告别手动统计!至善云学Vue客户端全攻略:5分钟搭建智能答题分析系统

告别手动统计!至善云学Vue客户端全攻略:5分钟搭建智能答题分析系统

【免费下载链接】vue-ZhiShanYunXue-Client 至善云学 - 简易的单选题自动统计与数据分析系统。 ZhiShanYunXue - a simple Single choice question automatic statistics and data analysis system. 后端仓库:https://gitcode.com/Fer_Amiya/go-ZhiShanYunXue-Server 【免费下载链接】vue-ZhiShanYunXue-Client 项目地址: https://gitcode.com/Fer_Amiya/vue-ZhiShanYunXue-Client

你是否还在为手动批改单选题、统计正确率而头疼?教师手动核对答案耗时费力,学生等待反馈周期长,数据统计不直观——这些教学痛点如今有了开源解决方案。本文将带你从零开始部署至善云学(Vue-ZhiShanYunXue-Client),这是一套基于Vue3+Element Plus构建的轻量化答题统计系统,支持单选题自动批改、实时数据可视化和多角色权限管理,完全开源且可本地化部署。

读完本文你将获得:

  • 3步快速搭建的教学答题系统部署指南
  • 教师端5大核心功能的实操教程(含代码示例)
  • 学生答题全流程交互解析
  • 数据可视化报表的实现原理
  • 前后端分离架构的扩展指南

项目架构速览

至善云学采用前后端分离架构,前端基于Vue3生态构建单页应用,后端采用Go语言实现RESTful API(后端仓库地址:https://gitcode.com/Fer_Amiya/go-ZhiShanYunXue-Server)。系统核心功能模块如下:

mermaid

核心依赖清单

依赖名称版本用途
vue^3.4.15核心框架
vue-router^4.2.5路由管理
pinia^2.1.7状态管理
element-plus^2.5.5UI组件库
echarts^5.4.3数据可视化
axios^1.6.7HTTP请求
@element-plus/icons-vue^2.3.1图标库

环境部署实战

前置条件检查

部署前请确保本地环境满足以下要求:

  • Node.js ≥ 16.0.0
  • npm ≥ 8.0.0
  • Git ≥ 2.30.0
  • 现代浏览器(Chrome ≥ 90 / Firefox ≥ 88)

3步极速部署

# 1. 克隆仓库
git clone https://gitcode.com/Fer_Amiya/vue-ZhiShanYunXue-Client.git
cd vue-ZhiShanYunXue-Client

# 2. 安装依赖
npm install

# 3. 启动开发服务器
npm run dev

注意:默认配置下前端会连接官方测试API。如需对接本地后端,请修改public/config.js中的api_url参数:

// public/config.js
window.api_url = "http://localhost:8080/api"  // 替换为你的后端地址
window.page_url = "http://localhost:5173"     // 前端地址

启动成功后访问 http://localhost:5173 即可看到登录界面,默认端口可在vite.config.ts中修改。

教师端功能全解析

任务创建流程

教师通过NewTask.vue组件创建答题任务,核心功能包括:

  • 任务基本信息设置(标题、截止时间)
  • 单选题答案录入(支持A/B/C/D选项)
  • 任务发布与链接生成

关键代码实现(任务提交逻辑):

// src/views/NewTask.vue 核心代码片段
const submitForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) return;
  
  try {
    const valid = await formEl.validate();
    if (valid) {
      // 发送POST请求创建任务
      const response = await axios.post(api_url + '/tasks/new_task', task);
      
      if (response.status === 200 || response.status === 201) {
        // 生成学生/教师链接
        studentUrl.value = `${page_url}/tasks/check_in?task_id=${response.data.data.task_id}`;
        teacherUrl.value = `${page_url}/tasks/status?task_id=${response.data.data.task_id}`;
        centerDialogVisible.value = true; // 显示链接对话框
      }
    }
  } catch (error) {
    ElMessage.error('提交失败:' + error.response.data.msg);
  }
};

创建任务时需注意:

  • 截止时间需设置在当前时间之后
  • 至少添加1道题目(支持动态增删)
  • 系统会自动生成唯一任务ID和访问链接

实时数据监控

教师通过TaskStatus.vue查看实时答题数据,系统每30秒自动刷新统计结果。核心实现基于ECharts的数据可视化:

// 数据可视化核心配置(src/views/TaskStatus.vue)
const option: echarts.EChartsOption = {
  tooltip: {
    trigger: 'axis',
    formatter: function (params: any[]) {
      let res = params[0].name + '<br/>';
      params.forEach((item: any) => {
        if (item.seriesName === '正确人数') {
          const correctCount = item.data;
          const qaId = getQaIdByOrder(Number.parseInt(item.name.match(/\d+/)[0]) - 1);
          if (qaId && detailData.value.qaAnswersCount[qaId]) {
            const incorrectCount = detailData.value.qaAnswersCount[qaId].wrong;
            res += `${item.seriesName}: ${correctCount}人<br/>错误人数: ${incorrectCount}人<br/>`;
          }
        }
      });
      return res;
    }
  },
  xAxis: { type: 'category', data: xAxisData.value },
  yAxis: [
    { name: "人数", type: 'value', max: taskData.value.studentAnswer.length },
    { name: '正确率', type: 'value', position: 'right', min: 0, max: 100 }
  ],
  series: [
    { name: '正确人数', type: 'bar', data: Object.values(detailData.value.qaAnswersCount).map(item => item.correct) },
    { name: '正确率', type: 'line', data: questionAccuracy.value, yAxisIndex: 1 }
  ]
};

数据面板展示内容包括:

  • 每道题的正确率曲线(实时更新)
  • 正确/错误人数柱状图
  • 总体正确率统计
  • 提交人数实时监控

任务管理功能

系统提供任务全生命周期管理:

  • 创建任务:设置基本信息和答案
  • 发布任务:生成访问链接(支持复制功能)
  • 监控进度:实时查看答题数据
  • 查看报告:导出统计结果(计划开发中)

学生端交互流程

身份验证与任务进入

学生通过教师提供的链接访问答题页面,首先需要在UserCheckin.vue页面输入5位学号进行身份验证:

<!-- src/views/UserCheckin.vue核心模板 -->
<div class="box">
  <h2>{{ taskInfo.TaskTitle }}</h2>
  <h2>{{ taskInfo.TaskDescription }}</h2>
  <h2>发布:{{ taskInfo.PublishTime }}</h2>
  <h2>截止:{{ taskInfo.Deadline }}</h2>
  <form class="input-box">
    <label>5位学号</label>
    <input type="text" v-model="studentId" maxlength="5" />
  </form>
  <div class="btn-box">
    <button @click="login">开始作答</button>
  </div>
</div>

系统会验证任务有效性和截止时间,超时任务将无法进入答题环节。

答题界面详解

答题界面TaskDetail.vue采用分步导航设计,核心功能包括:

  • 题目导航进度条
  • 单选题选项交互
  • 答题时间记录
  • 未完成题目提示

关键交互实现:

// 答案选择逻辑
const selectAnswer = (choice: string) => {
  selectedAnswer.value = choice;
  
  if (currentQuestion.value?.qa_id && currentQuestionIndex.value >= 0) {
    const existingAnswer = answers.value[currentQuestionIndex.value];
    if (existingAnswer) {
      existingAnswer.q_answer = choice;
    }
  }
};

// 提交答案处理
const submitAnswers = (isDig = false) => {
  if (isDig || unfinishedQuestions.value === 0) {
    const data = {
      "student_id": studentId.value,
      "task_id": taskId.value,
      "task_data": answers.value
    };
    
    axios.post(`${api_url}/tasks/push_answer`, data)
      .then((response) => {
        if (response.data.code === 200) {
          ElMessage.success('提交成功');
          setTimeout(() => {
            window.location.href = `${page_url}/tasks/get_report?student_id=${studentId.value}&task_id=${taskId.value}`;
          }, 3000);
        }
      });
  } else {
    centerDialogVisible.value = true; // 显示未完成提示
  }
};

即时反馈报告

答题完成后自动跳转至Report.vue生成结果报告,包含:

  • 总分与正确率统计
  • 每道题的作答情况(正确/错误标记)
  • 用时分析
  • 正确答案对照

报告页面采用响应式设计,适配手机和桌面端查看:

<!-- 报告页面结果展示 -->
<el-main v-if="taskReportData && taskReportData.TaskData">
  <el-card v-for="(item, index) in taskReportData.TaskData" :key="item.QaId">
    <div style="text-align: left">
      <p>
        第 {{ index + 1 }} 题:
        <span :class="{ 'correct': item.tea_answer === item.stu_answer, 'incorrect': item.tea_answer !== item.stu_answer }">
          {{ item.tea_answer === item.stu_answer ? '正确' : '错误' }}
          <el-icon v-show="item.tea_answer === item.stu_answer"><CircleCheck/></el-icon>
          <el-icon v-show="item.tea_answer !== item.stu_answer"><CircleClose/></el-icon>
        </span>
      </p>
      <p>正确答案:<span>{{ item.tea_answer }}</span></p>
      <p>我的答案:<span :class="item.tea_answer === item.stu_answer ? 'correct' : 'incorrect'">
        {{ item.stu_answer }}</span></p>
    </div>
  </el-card>
</el-main>

高级功能与扩展

数据持久化与同步

系统采用Axios拦截器处理API请求,确保数据可靠传输:

// 请求拦截器配置(可在main.ts中实现)
axios.interceptors.request.use(
  config => {
    // 可添加认证token
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 响应拦截器
axios.interceptors.response.use(
  response => {
    return response;
  },
  error => {
    ElMessage.error({
      message: error.response?.data?.msg || '请求失败',
      duration: 3000
    });
    return Promise.reject(error);
  }
);

系统定制与二次开发

如需扩展功能,建议从以下方面入手:

  1. 题型扩展:修改TaskDetail.vue和后端API支持多选题
  2. 用户管理:添加src/views/UserManage.vue实现多角色管理
  3. 文件导出:在Report.vue中集成xlsx库实现Excel导出
  4. 通知系统:使用WebSocket实现答题实时通知

部署与运维指南

生产环境构建

# 构建优化版
npm run build

# 构建产物位于dist目录,可直接部署到Nginx/Apache

Nginx配置示例

server {
    listen 80;
    server_name zsyx.example.com;  # 替换为你的域名

    root /path/to/vue-ZhiShanYunXue-Client/dist;
    index index.html;

    # 支持SPA路由
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 代理API请求到后端服务
    location /api/ {
        proxy_pass http://localhost:8080/api/;  # 替换为后端地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

常见问题排查

问题现象可能原因解决方案
无法创建任务后端服务未启动启动go-ZhiShanYunXue-Server
数据不刷新API地址配置错误检查public/config.js
样式错乱依赖版本不匹配删除node_modules后重新安装
部署后白屏Nginx配置问题检查try_files配置

项目 roadmap

根据项目README.md的Todo清单,未来版本将支持:

  •  任务列表管理页面
  •  批量导入题目功能
  •  更丰富的数据可视化报表
  •  用户权限细粒度控制

结语与致谢

至善云学作为开源教育工具,致力于减轻教师工作负担,提升教学反馈效率。项目源码完全开放,欢迎教育工作者和开发者参与贡献:

# 贡献流程
1. Fork本仓库
2. 创建特性分支 (git checkout -b feature/amazing-feature)
3. 提交更改 (git commit -m 'Add some amazing feature')
4. 推送到分支 (git push origin feature/amazing-feature)
5. 创建Pull Request

如果本项目对你的教学工作有帮助,请点赞收藏本教程,并关注项目更新。如有功能建议或bug反馈,欢迎在GitCode仓库提交Issue。

项目许可:本项目基于LGPL-3.0许可开源,仅供个人学习研究使用,禁止用于商业及非法用途。

附录:完整目录结构

vue-ZhiShanYunXue-Client/
├── LICENSE
├── README.md
├── auto-imports.d.ts
├── components.d.ts
├── env.d.ts
├── images/                # 静态图片资源
├── index.html             # 入口HTML
├── package.json           # 项目依赖
├── public/                # 静态资源
│   ├── config.js          # 配置文件
│   └── favicon.ico
├── src/
│   ├── App.vue            # 根组件
│   ├── assets/            # 样式和资源
│   ├── main.ts            # 入口文件
│   ├── router/            # 路由配置
│   │   └── index.ts
│   ├── stores/            # 状态管理
│   │   └── counter.ts
│   └── views/             # 页面组件
│       ├── NewTask.vue    # 教师创建任务
│       ├── Report.vue     # 学生报告
│       ├── TaskDetail.vue # 答题页面
│       ├── TaskStatus.vue # 教师数据面板
│       └── UserCheckin.vue # 学生登录
├── tailwind.config.js     # Tailwind配置
├── tsconfig.*.json        # TypeScript配置
└── vite.config.ts         # Vite配置

【免费下载链接】vue-ZhiShanYunXue-Client 至善云学 - 简易的单选题自动统计与数据分析系统。 ZhiShanYunXue - a simple Single choice question automatic statistics and data analysis system. 后端仓库:https://gitcode.com/Fer_Amiya/go-ZhiShanYunXue-Server 【免费下载链接】vue-ZhiShanYunXue-Client 项目地址: https://gitcode.com/Fer_Amiya/vue-ZhiShanYunXue-Client

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值