全场景教育 AI 助手实战:Web 管理台 + 小程序 + 实时同步一把梭

全场景教育 AI 助手实战:Web 管理台 + 小程序 + 实时同步一把梭

序章:为什么“多端协同”会成为刚需?

在很多教育类产品里,最先跑通的往往是“单端闭环”:比如只做一个 PC 后台,或者只做一个小程序。短期能用,但一旦用户角色变多(教师/家长/学生),场景就会立刻撕裂:

  • 教师更需要 Web 端批量处理:导入名单、导出报表、批量预测、统一管理。
  • 家长更需要 移动端随时查看:成绩、提醒、学习建议,最好还能消息推送。
  • 学生更需要 轻量互动与问答:随手提问、查看建议、学习任务追踪。

于是你会发现:不是功能不够,而是端不够“统一”。真正好用的系统,必须做到——一处更新,多端同步;一套数据,多端复用;一次开发,多端扩展

本篇文章就用一个“闯关式路线”,带你从 0 到 1 做出一个 Web 端管理后台 + 微信小程序 + 实时同步中枢 的全场景教育 AI 助手骨架(架构与代码都给到可落地的示例)。


探险地图:三大关卡与通关标准

关卡 核心任务 通关标准 面向用户
第一关:Web 管理后台 批量导入、批量预测、数据导出、管理视图 3 分钟处理 100 条数据并可导出报表 教师
第二关:微信小程序 成绩查询、学习建议、轻量问答、提醒 10 秒内打开数据并可交互 家长/学生
第三关:实时同步中枢 一端更新触发事件,多端即时刷新 修改后 1 秒内同步可见 所有人

第一关:Web 管理后台(教师的“指挥室”)

1)痛点拆解:为什么教师端必须是 Web?

教师端有几个天然“重操作”需求,小程序很难替代:

  • 批量导入:Excel/CSV 一次性导入整班数据
  • 批量预测/分析:一键生成整班预测结果与建议
  • 导出报表:教研、家校沟通、阶段对比都离不开报表
  • 管理视图:筛选、排序、分页、标签、分班级、按风险等级

所以 Web 端最合适的组合通常是:

  • 前端:Vue3 + Element Plus(上手快、组件全)
  • 后端:FastAPI(接口清晰、性能好)
  • 数据库:MySQL(结构化数据最稳)
  • 业务层:AI/模型服务(可独立成模块)

2)后端:FastAPI 设计一套“多端共用 API”

下面是一个“批量导入 + 批量预测 + 入库”的核心接口示意。重点不是把代码写满,而是把边界划清楚

  • API 只负责接收文件/参数与返回结果
  • 预测逻辑走 predict_batch()
  • 数据落库走 save_batch() 这样后面小程序也能复用同一套服务。
# main.py
from fastapi import FastAPI, UploadFile, File
from fastapi.middleware.cors import CORSMiddleware
import pandas as pd

app = FastAPI(title="Edu AI Assistant API")

app.add_middleware( CORSMiddleware, allow_origins=[""], # 演示用,生产环境要收敛域名 allow_credentials=True, allow_methods=[""], allow_headers=["*"], )

假设:模型与数据库封装在独立模块里

from core.model_service import predict_batch from core.db_service import save_batch, query_by_class

@app.post("/api/batch/predict") async def batch_predict(file: UploadFile = File(...), class_name: str = ""): raw = await file.read() df = pd.read_excel(raw)

# 取特征(示例:你可以换成自己的列)
feature_cols = ["math", "english", "science", "attendance"]
X = df[feature_cols].values

# 批量预测
df["pred_score"] = predict_batch(X)

# 入库(让 Web 与小程序都能查)
save_batch(df, class_name=class_name)

return {
    "code": 200,
    "msg": "批量预测成功",
    "data": df.to_dict(orient="records")
}

@app.get("/api/class/list") async def class_list(class_name: str = ""): data = query_by_class(class_name) return {"code": 200, "data": data}

> 小提示:真实项目里建议把“文件解析、字段校验、异常提示、缺失值填充”做得更严谨。教育数据最怕悄悄脏掉,后面分析全都会偏。


3)前端:Vue3 做“上传 + 结果表格 + 导出”的最小闭环

教师端第一版不要追求花里胡哨,核心是: 上传 → 展示 → 导出 → 可筛选(这是能不能用的分水岭)

<template>
  <div class="page">
    <h2>班级批量预测</h2>

<div class="toolbar">
  <el-select v-model="className" placeholder="选择班级" style="width: 220px;">
    <el-option label="一年级1班" value="一年级1班"></el-option>
    <el-option label="一年级2班" value="一年级2班"></el-option>
  </el-select>

  <el-upload
    :action="apiUrl"
    :data="{ class_name: className }"
    :on-success="onSuccess"
    :before-upload="beforeUpload"
    accept=".xlsx,.xls"
    :show-file-list="false"
  >
    <el-button type="primary">上传 Excel 并预测</el-button>
  </el-upload>

  <el-button @click="refresh" plain>刷新数据</el-button>
</div>

<el-table :data="rows" stripe style="width: 100%; margin-top: 16px;">
  <el-table-column prop="name" label="姓名" width="140" />
  <el-table-column prop="pred_score" label="预测成绩" width="140" />
  <el-table-column prop="risk_level" label="风险等级" />
</el-table>

</div> </template>

<script setup> import { ref } from "vue"; import { ElMessage } from "element-plus"; import axios from "axios";

const apiUrl = "http://127.0.0.1:8000/api/batch/predict"; const className = ref("一年级1班"); const rows = ref([]);

function beforeUpload(file) { const ok = file.name.endsWith(".xlsx") || file.name.endsWith(".xls"); if (!ok) ElMessage.error("请上传 Excel 文件(.xlsx/.xls)"); return ok; }

function onSuccess(res) { if (res.code === 200) { rows.value = res.data; ElMessage.success(预测完成,共 ${res.data.length} 条); } else { ElMessage.error(res.msg || "预测失败"); } }

async function refresh() { const { data } = await axios.get("http://127.0.0.1:8000/api/class/list", { params: { class_name: className.value }, }); rows.value = data.data || []; } </script>

通关测试(教师端)

  • 上传 100 条学生数据 Excel
  • 3 分钟内完成预测并看到表格
  • 刷新后数据仍存在(证明入库成功)

到这一步,你已经有了“可用的教师端”。


第二关:微信小程序(家长/学生的口袋助手)

1)移动端要克制:先做“高频动作”

小程序端建议只做最高频、最刚需的三件事:

  1. 成绩/预测结果查询
  2. 学习建议(AI 生成或规则生成)
  3. 提醒/消息(先做站内提醒,再做推送)

很多人一上来就做“全功能”,结果每个功能都浅,用户依然觉得不好用。移动端体验最怕“功能多但不顺”。


2)小程序页面:成绩卡片 + 一键建议

页面结构保持清爽:信息卡 + 行动按钮(不要让家长找半天)。

<view class="container">
  <view class="card">
    <view class="row">学生:{{studentName}}</view>
    <view class="row">班级:{{className}}</view>
    <view class="score">预测成绩:{{predScore}}</view>
  </view>

<button type="primary" bindtap="getSuggestion">获取学习建议</button> <button bindtap="refreshScore">刷新成绩</button>

<view class="suggestion" wx:if="{{suggestion}}"> <view class="title">建议</view> <view class="text">{{suggestion}}</view> </view> </view>

// pages/home/home.js
Page({
  data: {
    studentName: "张同学",
    className: "一年级1班",
    predScore: "--",
    suggestion: ""
  },

  onLoad() {
    this.refreshScore();
  },

  refreshScore() {
    wx.request({
      url: "http://127.0.0.1:8000/api/score/query",
      data: {
        studentName: this.data.studentName,
        className: this.data.className
      },
      success: (res) => {
        this.setData({ predScore: res.data.data?.predScore ?? "--" });
      }
    });
  },

  getSuggestion() {
    wx.request({
      url: "http://127.0.0.1:8000/api/suggestion",
      data: {
        studentName: this.data.studentName,
        className: this.data.className
      },
      success: (res) => {
        this.setData({ suggestion: res.data.data?.text ?? "暂无建议" });
      }
    });
  }
});

> 真实上线时,域名要配置到小程序后台的“request 合法域名”,本地 127.0.0.1 仅用于演示。


3)小程序通关标准

  • 家长打开小程序后,10 秒内看到成绩卡片
  • 点击“获取建议”可拿到文字建议
  • 刷新后能看到最新预测结果(下一关会实现“秒级同步”)

到这一步,小程序也“能用了”。


第三关:实时同步中枢(让多端真正像一个系统)

1)为什么一定要有“同步中枢”?

没有同步中枢的系统,用户体验会很割裂:

  • 教师 Web 端刚更新完,家长小程序还在看旧数据
  • 学生提交的问题,教师后台看不到或延迟很久
  • 同一条数据在不同端被改来改去,最后不知道哪个是真的

解决方案核心就一句话: 把“数据变化”当成事件发布出去,让其它端订阅并刷新。

常见实现有三类:

  • Redis Pub/Sub(轻量、快,适合事件通知)
  • WebSocket(端到端实时连接)
  • 消息队列(Kafka/RabbitMQ,适合复杂大系统)

这里用“Redis + WebSocket”做一个简洁可落地的方案。


2)后端:更新后发布事件

当教师端批量预测入库后,发布一条事件: score_update + class_name + count

import json
import redis
from fastapi import WebSocket

r = redis.Redis(host="localhost", port=6379, db=0) CHANNEL = "edu_sync"

def publish_event(payload: dict): r.publish(CHANNEL, json.dumps(payload))

在 batch_predict 完成后调用:

publish_event({ "type": "score_update", "class_name": class_name, "count": len(df) })


3)Web 端:订阅 WebSocket,收到事件就刷新

// sync.js
export function connectSync(onEvent) {
  const ws = new WebSocket("ws://127.0.0.1:8000/ws/sync");
  ws.onmessage = (e) => {
    try {
      const data = JSON.parse(e.data);
      onEvent(data);
    } catch (_) {}
  };
  ws.onclose = () => setTimeout(() => connectSync(onEvent), 1000); // 简单重连
  return ws;
}

当收到 score_update 且班级匹配,就执行 refresh()


4)小程序:收到事件后提示并刷新

小程序也可以连 WebSocket(注意生产环境要稳定与重连)。

// pages/home/home.js 里增加
connectSync() {
  wx.connectSocket({ url: "ws://127.0.0.1:8000/ws/sync" });

wx.onSocketMessage((res) => { const data = JSON.parse(res.data); if (data.type === "score_update" && data.class_name === this.data.className) { wx.showToast({ title: "成绩已更新", icon: "none" }); this.refreshScore(); } });

wx.onSocketClose(() => { setTimeout(() => this.connectSync(), 1000); }); }


终极验收:真实协同场景走一遍

场景 操作 结果
教师更新 → 家长查看 Web 批量预测并入库 小程序 1 秒内提示并刷新
学生提问 → 教师处理 小程序提交问题 Web 后台实时出现新问题
教师导出 → 家长接收 Web 导出报告 小程序提示“报告可查看/可下载”(可后续拓展)

运维避坑清单(别等上线才踩雷)

  1. 跨域与域名白名单:Web 端跨域要放行,小程序要配置合法域名。
  2. 权限控制:同班级数据、不同角色权限一定要在后端校验,不要相信前端传参。
  3. 数据校验:Excel 列名/缺失值/异常值要在入库前清洗,不然后面 AI 建议会变“胡说”。
  4. 重连机制:WebSocket 必须考虑断线重连,否则“同步”会变成偶发事件。
  5. 日志与回放:建议加一个“同步事件日志表”,出现争议能回溯谁在何时改了什么。

本期总结:从“能用”到“好用”的关键,是让多端像一个系统

单端产品可以靠功能堆起来;多端产品必须靠一致性撑起来。 当你完成了 Web 管理台、小程序入口、同步中枢这三件事,你的教育 AI 助手就从“工具”进化成了“平台”:

  • 教师端效率上来了(批量、报表、管理)
  • 家长/学生体验顺了(随时查看、轻量交互)
  • 数据不再割裂(实时同步、统一入口)

如果你准备继续升级下一期,我建议从这两个方向选一个:

  • 生态整合:对接教务系统/消息推送/作业系统
  • 智能升级:把“学习建议”从模板升级为“可解释的个性化策略”(带理由、带对比、带趋势)

评论 0