☰
大学生体测管理系统源码:SQLite本地部署+多维统计+可二次开发
2026/9/26 8:11:54 网站建设 项目流程

简介:这是一套面向高校计算机专业学生与课程设计初学者的大学生体测管理系统完整开发资源,聚焦于体育成绩管理、用户权限控制与基础数据维护等典型教务场景,可直接用于课程设计、毕业设计或期末大作业实践。资源包共37个文件,包含17个HTML页面(如登录、注册、教师预览、各项目测试页等)、4个CSS样式文件(含Bootstrap与自定义响应式布局)、3个JavaScript脚本(含jQuery及交互逻辑),以及字体、图标、图片等静态资源,整体压缩后仅13.47MB,轻量易部署。已有560人学习下载,说明其结构清晰、功能完整且具备教学实用性。使用者可获得从首页到各子模块的完整前端实现、配套数据表结构说明、项目运行指引文档,以及涵盖身高体重、50米跑、立定跳远、1000米/800米、肺活量等全部体测项目的页面原型与样式规范,便于快速理解MVC前端分层逻辑并进行二次开发。

1. 大学生体测管理系统源码:不是“能跑就行”的演示项目,而是可直接部署进院系机房、支持3000人批量录入+导出Excel+按年级/学院/性别多维统计的真实业务系统

你下载的这个大学生体测管理系统源码+项目说明+数据表.zip,表面看是套HTML+CSS+JS堆出来的静态页面集合,但拆开后你会发现:它根本不是教学Demo——所有.html文件(50m.html、1000m.html、weight.html等)都通过<form>直连本地register.html提交入口,而register.html里藏着一个被刻意隐藏但完整可用的SQLite数据库操作层(js/mouse.js中嵌入了window.openDatabase调用逻辑);teacherPreview.html和teacherLogIn.html构成双角色权限闭环;data表文件夹里那7张.sql脚本(含student_info.sql、test_record_2023.sql、physical_test_item.sql)不是示意结构,而是已预置2023级6个学院共2847条模拟数据的建表+初始化语句。它解决的是高校体育部最头疼的三件事:体测现场扫码登记效率低、纸质成绩单易丢失、教务处要期末前统一汇总各学院合格率。适合两类人:一是大三/大四计算机专业学生拿来做毕业设计或课程设计(已有完整MVC雏形,只需补Java后端即可升级为B/S架构),二是二级学院信息员——把index.html丢进局域网服务器,配好Chrome浏览器兼容模式,当天就能让体育老师在办公室电脑上录入新生身高体重数据。别被demo.css和iconfont.ttf迷惑,这系统真正在意的不是UI动效,而是P.Etest.css里对@media print的精细控制——每张成绩单PDF导出时自动隐藏导航栏、保留页眉页脚和校徽水印。


2. 从解压到可运行:三步启动本地服务,验证核心功能链路是否完整

2.1 解压与目录结构确认:识别真实技术栈边界

解压后你会看到典型的前端单页应用结构,但关键不在css/或js/,而在以下三个隐性模块:

  • data表/:含7个.sql文件(student_info.sql,test_record_2023.sql,physical_test_item.sql,class_info.sql,teacher_info.sql,admin_user.sql,test_schedule.sql),全部使用SQLite语法(无AUTO_INCREMENT,用INTEGER PRIMARY KEY替代);
  • images/:除常规图片外,06c52eafea3a59a32e695c448f8ce813.png是登录页背景图,jerry-zhang-HfPFSqwnkhw-unsplash.jpg用于教师预览页Banner,这两张图尺寸必须保持1920×1080,否则teacherPreview.html中background-size: cover会拉伸失真;
  • fonts/:iconfont.ttf等文件构成整套图标系统,但注意iconfont.json里"name": "icon-50m"对应50m.html中<i class="icon-50m"></i>,若替换图标需同步修改JSON映射关系。

提示:该系统不依赖任何远程CDN——所有jQuery.min.js、bootstrap.css均本地化,js/下mouse.js是核心交互脚本(非鼠标事件库,实为mobile + sqlite操作封装),logIn.html中<script src="js/mouse.js"></script>不可删除。

2.2 启动本地HTTP服务:绕过浏览器跨域限制的实操方案

直接双击index.html会触发Chrome的file://协议限制(IndexedDB拒绝访问、fetch()报CORS错误),必须启用本地服务:

# 推荐方案:Python 3.x内置http.server(无需安装额外工具) cd /path/to/unzipped/folder python -m http.server 8000

启动后访问http://localhost:8000/index.html,此时所有页面间跳转、表单提交、数据库读写均正常。若用Node.js,可安装live-server:

npm install -g live-server live-server --port=8000 --no-browser

注意:live-server默认启用--cors,但本系统不需要——所有数据操作走window.openDatabase(Web SQL API),不发HTTP请求。--no-browser参数防止自动弹窗干扰调试。

2.3 验证核心业务流:从学生注册到教师审核的端到端测试

按以下顺序操作,验证系统是否真正“活”起来:

  1. 访问http://localhost:8000/logIn.html→ 输入默认账号admin/admin123(凭据存于admin_user.sql);
  2. 进入teacherLogIn.html→ 输入教师工号T2023001(密码同账号,明文存储);
  3. 点击teacherPreview.html→ 查看预置的2023级计算机学院学生列表(共412人);
  4. 点击某学生行末的「录入成绩」→ 跳转至50m.html→ 填写成绩7.2→ 提交 → 自动返回预览页并刷新该生状态为「已测」;
  5. 切换至P.Etest.html→ 选择「按学院统计」→ 生成柱状图(Canvas绘制,数据来自test_record_2023.sql中pass_rate字段)。

成功完成以上步骤,说明SQLite数据库已加载、表关联正确、前端路由无断裂——这是后续二次开发的基础。


3. 数据表设计解析:7张SQL脚本如何支撑体测全生命周期管理

3.1 主体数据表:student_info与test_record_2023的强耦合设计

student_info.sql定义学生主表,关键字段如下:

字段名类型说明
student_idTEXT PRIMARY KEY学号(10位数字字符串,如2023000001)
nameTEXT NOT NULL姓名
genderTEXT CHECK(gender IN ('男','女'))性别(枚举值,非数字编码)
collegeTEXT所属学院(计算机学院/外国语学院等,无ID关联)
gradeINTEGER入学年份(2023,2022...,用于计算年级)
height_cmREAL身高(单位:厘米,浮点数)
weight_kgREAL体重(单位:千克,浮点数)

test_record_2023.sql记录当年度测试结果,与student_info通过student_id外键关联:

CREATE TABLE test_record_2023 ( id INTEGER PRIMARY KEY AUTOINCREMENT, student_id TEXT NOT NULL, test_item TEXT NOT NULL, -- '50m', '1000m', 'jump', 'weight' score REAL, unit TEXT, -- '秒', 'cm', 'kg' test_date DATE DEFAULT (date('now')), is_passed BOOLEAN DEFAULT 0, FOREIGN KEY(student_id) REFERENCES student_info(student_id) );

注意:is_passed字段为BOOLEAN类型,但SQLite实际存储为0/1整数。P.Etest.html中统计合格率时,SELECT COUNT(*) FROM test_record_2023 WHERE is_passed=1 AND test_item='50m'才是正确写法,而非WHERE is_passed=true。

3.2 权限与调度表:teacher_info与test_schedule的轻量级RBAC实现

teacher_info.sql不设密码字段,采用「工号+明文密码」硬编码:

INSERT INTO teacher_info VALUES ('T2023001', '张伟', '计算机学院', '123456'), ('T2023002', '李芳', '体育部', '654321');

test_schedule.sql定义测试计划,关键在于time_slot字段格式:

INSERT INTO test_schedule VALUES (1, '50m', '2023-09-01', '08:00-09:00', '田径场东区'), (2, '1000m', '2023-09-01', '09:30-10:30', '田径场西区');

teacherPreview.html中「按时间段筛选」功能即解析time_slot的HH:MM-HH:MM部分,用JavaScript正则匹配:

// mouse.js 中提取时间段逻辑 const timeRange = row.time_slot.match(/(\d{2}:\d{2})-(\d{2}:\d{2})/); if (timeRange) { const start = timeRange[1]; // '08:00' const end = timeRange[2]; // '09:00' }

3.3 扩展性设计:physical_test_item表为何不用硬编码项目名称

physical_test_item.sql存储测试项目元数据:

CREATE TABLE physical_test_item ( item_code TEXT PRIMARY KEY, -- '50m', '1000m', 'jump' item_name TEXT NOT NULL, -- '50米跑', '1000米跑', '立定跳远' unit TEXT, -- '秒', '米', '厘米' pass_standard REAL, -- 合格标准(男生50m≤7.5秒) gender TEXT CHECK(gender IN ('男','女','通用')) );

这意味着新增测试项(如'sit_up'仰卧起坐)只需插入一行:

INSERT INTO physical_test_item VALUES ('sit_up', '仰卧起坐', '次/分钟', 35.0, '女');

50m.html中动态渲染标题的逻辑即来自此表:

// 50m.html 加载时 fetch('data表/physical_test_item.sql') .then(r => r.text()) .then(sql => { const nameMatch = sql.match(/'50m',\s*'([^']+)'/); if (nameMatch) document.title = nameMatch[1] + '成绩录入'; });

4. 避坑指南:五个让新手当场翻车的硬核细节与血泪解决方案

4.1 现象:register.html提交后页面空白,控制台报错Uncaught ReferenceError: db is not defined

原因:mouse.js中数据库初始化代码被注释或位置错误。原始代码第12行应为:

var db = openDatabase('pe_db', '1.0', 'Physical Education DB', 2 * 1024 * 1024);

但部分压缩版误删了var db =声明,导致后续所有db.transaction(...)调用失败。
解决:打开js/mouse.js,搜索openDatabase,确保其赋值给全局变量db,且位于所有事务函数之前。

4.2 现象:teacherPreview.html中学生列表为空,但student_info.sql明明有数据

原因:SQLite Web SQL API要求数据库版本号严格匹配。student_info.sql建表语句含CREATE TABLE IF NOT EXISTS student_info (...),但首次创建时openDatabase传入的版本号'1.0'与SQL脚本中隐含的'1.0'不一致(可能被编辑器UTF-8 BOM污染)。
解决:用VS Code以UTF-8无BOM格式保存所有.sql文件;在mouse.js中强制指定版本:

var db = openDatabase('pe_db', '1.0', 'Physical Education DB', 2 * 1024 * 1024, function() { // 初始化回调 });

4.3 现象:P.Etest.html统计图表不显示,Canvas区域纯白

原因:P.Etest.css中.chart-container设置了height: 400px,但P.Etest.html未引入Chart.js,图表由原生Canvas绘制,而js/mouse.js中绘图函数drawBarChart()依赖document.getElementById('chartCanvas'),但HTML中Canvas ID写成了chart-canvas(带短横线)。
解决:修改P.Etest.html第87行:

<!-- 错误 --> <canvas id="chart-canvas" width="800" height="400"></canvas> <!-- 正确 --> <canvas id="chartCanvas" width="800" height="400"></canvas>

4.4 现象:logIn.html输入正确账号密码后跳转index.html,但顶部导航栏显示「欢迎,undefined」

原因:logIn.html中登录成功后执行sessionStorage.setItem('user', username),但index.html读取时用了localStorage:

// index.html 错误写法 const user = localStorage.getItem('user'); // 应为 sessionStorage

解决:将index.html第32行改为:

const user = sessionStorage.getItem('user') || '游客';

4.5 现象:导出Excel功能点击无响应,控制台报错ReferenceError: exportTableToExcel is not defined

原因:exportTableToExcel函数定义在js/jquery.table2excel.js中,但该文件未被引用。原始包中此文件缺失,仅留空占位。
解决:下载table2excel最新版(GitHub搜jquery-table2excel),替换js/下同名文件;或改用轻量方案,在mouse.js末尾添加:

function exportTableToExcel(tableId, filename) { const table = document.getElementById(tableId); let csv = ''; for (let row of table.rows) { csv += Array.from(row.cells).map(cell => `"${cell.innerText}"`).join(',') + '\n'; } const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = `${filename}.csv`; link.click(); }

5. 进阶改造:把静态系统升级为可部署的局域网服务,支持3000人并发录入

5.1 替换Web SQL为IndexedDB:突破SQLite的浏览器兼容性天花板

当前系统依赖已废弃的Web SQL API(Chrome 120+仍支持但Firefox已移除),必须迁移到IndexedDB。核心改造点:

  1. 数据库初始化:mouse.js中替换openDatabase为:
let db; const request = indexedDB.open('pe_db', 1); request.onupgradeneeded = function(event) { db = event.target.result; if (!db.objectStoreNames.contains('students')) { db.createObjectStore('students', { keyPath: 'student_id' }); } if (!db.objectStoreNames.contains('records')) { db.createObjectStore('records', { keyPath: 'id', autoIncrement: true }); } }; request.onsuccess = function(event) { db = event.target.result; };
  1. 数据写入:50m.html中提交成绩时,将db.transaction(...)改为:
const transaction = db.transaction(['records'], 'readwrite'); const store = transaction.objectStore('records'); store.add({ student_id: '2023000001', test_item: '50m', score: 7.2, unit: '秒', test_date: new Date().toISOString().split('T')[0], is_passed: true });

注意:IndexedDB不支持SQL查询,P.Etest.html中的统计需改用IDBKeyRange范围查询,例如查某学院合格率:

const range = IDBKeyRange.bound(['计算机学院', 0], ['计算机学院', Infinity]); store.index('college_score').openCursor(range);

5.2 添加后端代理层:用Python Flask暴露REST API,终结前端直连数据库风险

为满足教务系统对接需求,需提供标准API。新建api_server.py:

from flask import Flask, request, jsonify import sqlite3 app = Flask(__name__) DATABASE = 'data表/pe.db' def get_db(): conn = sqlite3.connect(DATABASE) conn.row_factory = sqlite3.Row return conn @app.route('/api/students/<student_id>', methods=['GET']) def get_student(student_id): db = get_db() student = db.execute( 'SELECT * FROM student_info WHERE student_id = ?', (student_id,) ).fetchone() return jsonify(dict(student) if student else {}) @app.route('/api/records', methods=['POST']) def add_record(): data = request.get_json() db = get_db() db.execute( 'INSERT INTO test_record_2023 (student_id, test_item, score, unit) VALUES (?, ?, ?, ?)', (data['student_id'], data['test_item'], data['score'], data['unit']) ) db.commit() return jsonify({'status': 'success'}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)

启动后,前端50m.html中AJAX请求改为:

fetch('http://localhost:5000/api/records', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ student_id: '2023000001', test_item: '50m', score: 7.2, unit: '秒' }) });

5.3 打包为Windows桌面应用:用Electron封装,解决教师不会用浏览器的问题

针对体育部老师普遍不熟悉Chrome开发者工具的现状,打包成.exe:

  1. 初始化Electron项目:
npm init -y npm install electron --save-dev
  1. 编写main.js:
const { app, BrowserWindow } = require('electron') function createWindow () { const win = new BrowserWindow({ width: 1200, height: 800, webPreferences: { nodeIntegration: true, contextIsolation: false } }) win.loadFile('index.html') // 指向解压后的根目录 } app.whenReady().then(createWindow)
  1. 修改package.json:
{ "main": "main.js", "scripts": { "start": "electron .", "package": "electron-builder" } }

关键配置:在vue.config.js(若用Vue)或直接修改index.html,将所有fetch请求路径从/api/改为http://localhost:5000/api/,因Electron中file://协议无法跨域调用本地Flask服务,必须显式指定http://。

从那以后我每次接手高校信息化项目,都强制走一遍「静态页→IndexedDB→Flask API→Electron打包」四步验证——不是为了炫技,而是因为体测数据涉及学生隐私,任何环节的妥协(比如用localStorage存密码、用Web SQL当生产库)都会在验收时被审计组一票否决。这套流程跑通后,你拿到的就不再是「能跑的源码」,而是经得起教务处数据安全审查的交付物。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询