news 2026/10/15 15:37:27

JavaWeb运动健康管理系统:三层架构与Servlet/JSP实战解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaWeb运动健康管理系统:三层架构与Servlet/JSP实战解析

简介:基于JavaWeb的运动与健康管理系统完整源代码与数据库,适合JavaWeb方向初学者、毕业设计选题者以及健康管理类项目研究者。系统实现用户注册登录、运动数据录入、健康指标跟踪、趋势分析、个性化提醒与社区分享等功能逻辑,数据库方面包含用户表、运动记录表、健康指标表等核心表结构,另有初始化脚本可直接导入。压缩包共707个文件,以Java源码、JSP页面、JavaScript脚本、CSS样式、SQL脚本和jar依赖包为主,其中Java与JSP承担业务控制和动态页面渲染,JS与CSS负责前端交互与视觉样式,SQL用于建库建表,整体大小约9.59MB,目录划分层次清晰,便于按模块阅读。目前已有2019人学习下载,能够用于课程设计、毕业设计快速参考,也可作为理解JavaWeb分层架构和运动健康数据建模的入门素材。

1. 基于 JavaWeb 的运动与健康管理系统:不当作毕设模板,而是三层架构的完整落地方案

这套基于 JavaWeb 的运动与健康管理系统,和我见过的大多数课设源码有一个本质区别——它不只是几个 JSP 页面拼出来的展示品,而是把用户登录、运动记录、健康指标计算、饮食管理、数据统计这五块业务串成了一条完整链路,连 MySQL 建库脚本和初始数据都备好了。也就是说,你拿到的不是一堆散装代码,而是一套「导入数据库就能起服务」的完整可运行工程。适合三类人:正在做毕设或课设的 JavaWeb 初学者,想快速搭一个带完整业务闭环的管理系统做二次开发的从业者,以及想弄清楚 JSP + Servlet + JDBC 之间到底怎么协作的学习者。下面我按自己拆项目的习惯,从结构、核心实现、数据库与部署、踩坑记录、扩展思路五个层面把它讲透。

2. 先看清这套系统的骨架:MVC 分层与请求流转

2.1 三层架构里每一层都放了什么

打开源码包,目录结构一眼就能看出是标准的 MVC 分层:模型层放实体类和 DAO(数据访问对象),控制层是若干个 Servlet,视图层是 JSP 页面。这种结构的好处是职责边界清晰——JSP 只管渲染数据,Servlet 只做参数接收、调 service、转发跳转,JDBC 操作集中在 DAO 层,改数据库连接信息只需要动一个配置文件。

常见的包组织结构是这样的:

src/ ├── com.health.entity // 实体类:User, SportRecord, HealthRecord, DietRecord ├── com.health.dao // 数据访问层:UserDao, SportRecordDao, HealthRecordDao ├── com.health.service // 业务层:封装判断逻辑、卡路里计算、BMI 计算 ├── com.health.servlet // 控制层:LoginServlet, RegisterServlet, SportRecordServlet ├── com.health.filter // 登录拦截器:AuthFilter └── com.health.util // 工具类:DBUtil, DateUtil, PageUtil

这套划分我在给项目做功能改造时特别受用。比如想加一个「运动达标率」统计,直接在 service 层加一个方法,再在 Servlet 里暴露一个 URL,JSP 端加一个接口请求,不需要动任何一张表或改其他页面的代码。如果你的项目里看到的是类名略有不同的写法,也没关系——按职责去找,DAO 必然在中间层。

2.2 一个运动录入请求从浏览器到数据库走完的完整路径

理解请求流转是改代码的前提。拿「提交一条运动记录」这个操作举例:用户在 sport_add.jsp 页面填完运动类型、时长、日期,点提交后,请求交给 web.xml 里映射的 SportRecordServlet。Servlet 从 request 里取出参数,调用 service 层的方法计算出卡路里消耗,再交给 DAO 执行 INSERT,最后通过 response.sendRedirect 重定向回调到列表页。

这里有一个关键点在初学阶段特别容易忽略——Servlet 处理完请求后,为什么要重定向而不是直接转发回 JSP?原因是防止表单重复提交:用户刷新页面时浏览器会把上一个 POST 请求原样重发,如果走转发,数据库里会多出一条一模一样的记录;而 sendRedirect 发出的是全新的 GET 请求,刷新只刷新列表,不会再次触发插入。

web.xml 里的映射配置长这样:

<servlet> <servlet-name>SportRecordServlet</servlet-name> <servlet-class>com.health.servlet.SportRecordServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SportRecordServlet</servlet-name> <url-pattern>/sport/add</url-pattern> </servlet-mapping>

如果你把这个资源导入 IDEA 后启动 Tomcat,访问/sport/add报 404,先别急着怀疑代码有问题——大概率是 web.xml 里的 url-pattern 与前端表单 action 的路径写岔了。前端 JSP 里 form 的 action 值必须和 url-pattern 完全一致,多一个斜杠少一个斜杠都会匹配失败。

2.3 登录状态的保持:Session 与 Filter 拦截实现

这套系统的登录模块用的是 HttpSession + Servlet Filter 的组合方式,也是传统 JavaWeb 项目里最通用的方案。用户登录成功后,User 对象被塞进 session 的 user 属性里;后续每个需要鉴权的请求进来之前,AuthFilter 先拦截检查 session 里有没有这个属性,没有就重定向到登录页。

AuthFilter 的核心判断逻辑:

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; HttpSession session = request.getSession(false); // 不主动创建 session // 已登录用户直接放行 if (session != null && session.getAttribute("user") != null) { chain.doFilter(req, resp); return; } // 未登录则打回登录页 response.sendRedirect(request.getContextPath() + "/login.jsp"); }

这里有个细节值得注意:getSession(false) 表示「如果当前没有 session 就返回 null」,而不是强制新建一个 session。如果在拦截器里用 getSession(true) 或 getSession(),未登录用户每次访问任何页面都会生成一个无用的 HttpSession 对象,高并发场景下内存会迅速被垃圾对象占满。这一点在监控机器内存时会看得很明显——并发一上来,堆内存曲线像锯齿一样抖。

把 Filter 注册进 web.xml 时注意过滤范围。常见配置是拦截所有请求,然后把登录页和静态资源排除掉:

<filter> <filter-name>AuthFilter</filter-name> <filter-class>com.health.filter.AuthFilter</filter-class> </filter> <filter-mapping> <filter-name>AuthFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

用户名密码的校验逻辑在 UserDao 里实现,典型做法是用 PreparedStatement 完成参数化查询:

public User findByUsernameAndPassword(String username, String password) { String sql = "SELECT * FROM user WHERE username = ? AND password = ?"; try (PreparedStatement ps = DBUtil.getConnection().prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, password); try (ResultSet rs = ps.executeQuery()) { return rs.next() ? new User(rs) : null; } } catch (SQLException e) { e.printStackTrace(); return null; } }

每次取数据库连接前应校验连接是否有效,避免 MySQL 的 wait_timeout 默认 8 小时把连接置为失效后,程序还拿着死连接去查询,报 Communications link failure。常见做法是每 10 分钟用 SELECT 1 做一次连接探活,这个在第五章节的避坑内容里我再细说。

3. 手把手读懂核心业务代码:登录、运动记录与健康指标计算

3.1 注册与登录:密码校验和 Session 的建立流程

注册的逻辑比登录多一步——先做用户名重名校验,再做数据插入。这个流程在 RegisterServlet 里写得很清晰:第一步用 DAO 层的 findByUsername 判断用户名是否已存在,第二步才执行 insert,而不是直接插数据等 DuplicateKeyException。原因是在作用于正式系统时,用户名的重名错误应该转换成友好的前端提示(「该用户名已被注册」),而不是让用户看到一条堆栈日志。

登录 Servlet 中拿到数据库返回的 User 对象后,通常会再做一层状态判断:

if (user == null) { // 用户名或密码错误,回登录页并带上错误提示 request.setAttribute("errorMsg", "用户名或密码错误"); request.getRequestDispatcher("/login.jsp").forward(request, response); } else { HttpSession session = request.getSession(); session.setAttribute("user", user); session.setMaxInactiveInterval(30 * 60); // 30 分钟无操作自动失效 response.sendRedirect(request.getContextPath() + "/index.jsp"); }

session.setMaxInactiveInterval 这个参数值得记一下:如果不设置,Tomcat 的默认会话超时是 30 分钟(在 web.xml 里可以用 session-config 覆盖)。对运动健康类管理系统来说,30 分钟是个合理的体验值——用户填一条运动记录的中途不会被强制踢下线,又不会让 session 在后台挂一整天占用内存。

3.2 运动记录模块:卡路里消耗计算与记录列表的分页查询

运动记录是一套系统的核心业务表。每条记录至少包含:运动类型、运动时长(分钟)、运动日期、消耗卡路里、所属用户 ID。卡路里的计算方式不是拍脑袋写的——资源里用的是 MET 值法(代谢当量),公式是:

public double calcCalories(String sportType, double weightKg, double durationMin) { // METs 表:跑步 8.0、游泳 6.0、篮球 6.5、瑜伽 2.5、散步 3.5 double mets = getMetValue(sportType); double hours = durationMin / 60.0; return mets * weightKg * hours * 1.05; // 单位:千卡 }

MET 值表示的是某种运动强度下,人体代谢率是静息代谢率的多少倍。拿一个 60kg 的用户举例:跑步 30 分钟消耗约 8.0 × 60 × 0.5 × 1.05 = 252 千卡;散步 30 分钟只有约 3.5 × 60 × 0.5 × 1.05 = 110 千卡。差距很大,所以 METs 表的准确性直接决定了记录的可信度。你可以在 resources 目录下找一个运动类型映射表,想扩充运动项目时往这个表里加一行即可——注意不同来源的 METs 值有出入,以项目内置的为准,别混用。

分页查询是这里另一个值得细看的点。列表页不可能把所有历史记录一次性查出来,资源内的 DAO 用 LIMIT 做分页:

public List<SportRecord> findRecordsByUserId(int userId, int page, int pageSize) { int offset = (page - 1) * pageSize; String sql = "SELECT * FROM sport_record WHERE user_id = ? " + "ORDER BY sport_date DESC, id DESC LIMIT ?, ?"; try (PreparedStatement ps = DBUtil.getConnection().prepareStatement(sql)) { ps.setInt(1, userId); ps.setInt(2, offset); ps.setInt(3, pageSize); // 省略结果集组装 } }

ORDER BY sport_date DESC, id DESC 里的双重排序是个容易被忽略的 bug 点:同一天只有一条记录时用单个字段排序没问题,但如果同一天录了两次运动且 sport_date 没有精确到秒,两条记录的顺序就变成不确定的。加上 id DESC 让后插入的记录排在前面,列表数据的顺序才完全稳定。

3.3 健康指标模块:BMI 计算与状态判定逻辑

健康指标这一块,资源的思路是:用户维护身高体重,系统在每次提交新体重数据时自动算 BMI 并给出健康状态标签。这里的陷阱在于体重变化数据的分组统计——要弄清楚「历史趋势」和「当前状态」的区别。当前状态直接用最新一条记录算 BMI,趋势统计则要按日期 GROUP BY 再算。

先看单次 BMI 的计算:

public HealthStatus calcBmi(double heightCm, double weightKg) { double heightM = heightCm / 100.0; double bmi = weightKg / (heightM * heightM); String status; if (bmi < 18.5) { status = "偏瘦"; } else if (bmi < 24.0) { status = "正常"; } else if (bmi < 28.0) { status = "偏胖"; } else { status = "肥胖"; } return new HealthStatus(bmi, status); }

这套 BMI 判定用的是国内标准(18.5/24/28 三个切点),和国际标准(18.5/25/30)不一样。如果你想把系统里的标准改成国际参考值,只需要调整这些切点数字,其他地方(存储结构、前端展示)都不用动。这就是把判定逻辑从页面代码中抽到 service 层的好处——改一处全系统生效。做二次开发时建议把切点值做成配置文件而不是硬编码在 Java 里,这样非技术人员也能调整。

4. 数据库初始化与部署全流程:从建库到 Tomcat 跑通

4.1 MySQL 初始化脚本:建库、建表、种子数据

数据库脚本是这套资源除了代码之外最有价值的部分。拿到压缩包后先找 sql 目录下的 init.sql(也可能叫 health.sql 或 db_health.sql),推荐的执行流程是:

mysql -u root -p # 进入 MySQL 命令行后依次执行 mysql> source /path/to/init.sql;

脚本内部做的事按顺序分三步:第一步 CREATE DATABASE,第二步 USE 并 CREATE TABLE,第三步 INSERT 种子数据。建表语句里值得注意的几点:

CREATE TABLE `user` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL UNIQUE, `password` VARCHAR(255) NOT NULL COMMENT '建议存 MD5 或后续升级 BCrypt', `height` DOUBLE NOT NULL DEFAULT 170, `weight` DOUBLE NOT NULL DEFAULT 60, `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; CREATE TABLE `sport_record` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `user_id` INT NOT NULL, `sport_type` VARCHAR(50) NOT NULL, `duration_min` INT NOT NULL COMMENT '运动时长,单位分钟', `sport_date` DATE NOT NULL, `calories` DOUBLE NOT NULL COMMENT '消耗千卡', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='运动记录表';

建表脚本用的都是 InnoDB 引擎。InnoDB 支持外键约束和行级锁,对这个业务场景(有明确的 user 与 sport_record 关联关系)是正确选型。表名user是 MySQL 的保留字,脚本里用反引号包住了它——自己写 SQL 时如果遇到奇怪的语法报错,先检查是不是表名或字段名撞了保留字,这是最容易被忽视的报错原因。种子数据一般会给三个测试账号(如 alex、nina、leon),密码通常是 123456,方便你登录后立刻看到预置的运动记录和健康数据。

4.2 JDBC 连接配置:驱动版本与连接参数

数据库初始化完成后,下一步是把工程的数据库连接地址改成你自己的环境。连接配置集中在 DBUtil.java 或 db.properties 文件里:

jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/health?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4 jdbc.username=root jdbc.password=你的密码

注意驱动类名:如果你用的是 MySQL 8.0+ 的驱动,驱动类是com.mysql.cj.jdbc.Driver(多了一个 cj 包名);MySQL 5.x 时代的老驱动是com.mysql.jdbc.Driver。常见的翻车现场是驱动 jar 包是 8.x 版本,代码里却还写着老驱动名,抛 ClassNotFoundException。往下排查的顺序应该是:先看 MySQL 版本,再确认 pom.xml 或 lib 目录里对应版本的 driver jar,最后核对 driver 类名与连接 URL 里的参数是否配套。

serverTimezone=Asia/Shanghai 这个参数建议加上。不加的话 MySQL 8.x 会报 「The server time zone value 'CST' is unrecognized」的运行时异常,整个 JDBC 连接无法建立。同样要注意 useSSL=false——本地开发环境不需要 SSL 加密,打开反而会在控制台刷一堆 SSL 告警日志干扰排错。

4.3 部署与启动:IDEA 配置 Tomcat 的具体步骤

部署这块我会分场景说明。如果你用的是 IntelliJ IDEA,操作路径是:Run → Edit Configurations → 左上角加号 → Tomcat Server → Local。Deployment 选项卡里把工程 artifact 加进去,Application context 设置为/health(与首页链接保持一致)。Tomcat 版本推荐用 Tomcat 8.5 或 Tomcat 9.0,兼容性最稳。

如果你更习惯传统方式在命令行启动 Tomcat,流程是:

# 将项目打包成 war(Maven 工程执行) mvn clean package # 把 war 包拷到 Tomcat webapps 目录 cp target/health.war /path/to/tomcat/webapps/ # 启动 Tomcat /path/to/tomcat/bin/startup.sh

浏览器访问http://localhost:8080/health/,看到登录页就说明启动成功。项目用哪个账号登录都能进系统,测试账号的初始密码要翻一下 README 或 init.sql 里的种子数据。

5. 避坑与常见问题:五个高频踩坑记录

这一章我把拆这份资源过程中遇到的、以及后台问得最多的问题集中写出来。每一条都是从现场报错倒推定位的,翻车原因和解决办法按顺序列好。

5.1 登录后跳转 405 错误

现象:输入正确的账号密码,URL 变成/health/index.jsp后浏览器直接报 405 Method Not Allowed。

原因:登录表单 method 配的是 POST,而 LoginServlet 处理成功后用 sendRedirect 跳转到一个 JSP;如果这个 JSP 恰好也叫login之类被 Servlet 映射覆盖的路径,请求方法就变成了 POST 进入一个只允许 GET 的 Servlet,触发 405。另一个常见原因是 Filter 拦截范围误伤了 JSP 资源。

解决:确认登录成功后跳转的地址是纯静态 JSP 页面路径(以.jsp结尾),而不是被 url-pattern 映射过的 Servlet 别名。同理,如果在 Filter 里对所有/*做拦截,要在 chain.doFilter 之前放行/login.jsp、/css/*、/js/*这类路径:

String path = request.getRequestURI().substring(request.getContextPath().length()); if (path.equals("/login.jsp") || path.startsWith("/css/") || path.startsWith("/js/")) { chain.doFilter(req, resp); return; }

5.2 MySQL 8 连接失败并提示「Public Key Retrieval is not allowed」

现象:程序启动后第一次访问数据库即抛异常,日志里出现 Public Key Retrieval is not allowed。

原因:MySQL 8 默认使用 caching_sha2_password 认证插件,客户端在非 SSL 连接下需要先向服务器请求公钥做加密通信,如果没有在 URL 里显式允许这个行为,驱动就会拒绝连接。

解决:在 JDBC URL 末尾追加allowPublicKeyRetrieval=true:

jdbc.url=jdbc:mysql://localhost:3306/health?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4&allowPublicKeyRetrieval=true

也可以把 MySQL 用户的认证插件改成 mysql_native_password,但改数据库账号配置在很多环境里权限受限,所以更推荐改 URL 参数,一行代码解决。

5.3 JSP 页面中文显示乱码

现象:页面上所有中文文字都变成菱形问号,或者前端传入的中文运动名称存进数据库后变成了乱码。

原因:这个坑往往不是单一原因,而是三个环节叠加——JSP 页面本身的编码不是 UTF-8、Servlet 接收参数时没有指定编码、MySQL 表字符集不是 utf8mb4。只修其中一个环节乱码依然存在。

解决:三个地方逐一确认到位。JSP 文件头部要有<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>;Servlet 的 doPost 方法第一行加request.setCharacterEncoding("UTF-8");MySQL 表的 charset 必须是 utf8mb4,连接 URL 里带characterEncoding=utf8mb4。三条缺一不可,我一般在新项目里直接把这三处写成固定习惯,省得每次出问题再从头排查。

5.4 部署到云服务器后只能本机访问

现象:本地起服务一切正常,部署到云服务器后,自己机器上的浏览器访问公网 IP 加端口就超时。

原因:Tomcat 默认监听 127.0.0.1,只接受本机回环地址的请求;或云服务器安全组没有放行 8080 端口。这两个问题你本地环境是测不出来的,只有部署到远程才能暴露。

解决:先改 Tomcat 的 server.xml 里 Connector 的 address 配置,将默认的 127.0.0.1 改为 0.0.0.0(表示监听所有网卡地址),然后到云厂商控制台检查安全组——必须放行 TCP 8080 入方向。改完记得重启 Tomcat 再验证,因为 server.xml 的修改在启动时才会重新加载。

5.5 长时间挂机后首次操作报「Connection is not available」

现象:系统在非使用时段(比如隔了一夜)后,第二天第一次操作数据就抛 SQLException,重启 Tomcat 后恢复,但过几小时又复发。

原因:MySQL 的 wait_timeout 默认 8 小时,连接空闲超过这个时间会被服务端主动断开。数据库连接池不知道这件事,继续把已断开的连接发给应用,应用拿它去查询就会报通信链路异常。

解决:给 DBUtil 里的取连接逻辑加一次探活校验,每次连接时执行SELECT 1测试:

Connection conn = dataSource.getConnection(); try (Statement st = conn.createStatement()) { st.execute("SELECT 1"); // 探活,失败则抛异常触发连接重建 } catch (SQLException e) { // 连接已失效,丢弃并重建 conn.close(); conn = dataSource.getConnection(); }

如果没有用连接池而是每次手动 DriverManager.getConnection,建议两个动作结合:一是把 MySQL 的 wait_timeout 调大到 86400(一天),二是每 10 分钟跑一次定时任务保持连接活性。从那以后我每次部署 JavaWeb 项目都会强制把这些连接超时参数和探活逻辑走一遍,这个习惯帮我省掉了大量的凌晨告警。

6. 进阶:给这套系统加一层「周运动报表」导出功能

前面的内容解决了「把项目跑起来」的问题,这一章给一个具体的二次开发方向——导出 CSV 格式的周运动报表。选择 CSV 而不是 Excel 是因为 CSV 不需要引入 Apache POI 依赖,准守 CSV 格式规范后 Excel 也能直接打开,成本最低。

在 HealthReportServlet 里加一个方法做查询并输出:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/csv;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=sport_report_" + System.currentTimeMillis() + ".csv"); User user = (User) request.getSession().getAttribute("user"); List<SportRecord> records = dao.findRecordsByUserIdWithinWeek(user.getId()); PrintWriter out = response.getWriter(); out.write("\uFEFF"); // BOM,让 Excel 正确识别 UTF-8 中文 out.println("日期,运动类型,时长(分钟),消耗(千卡)"); for (SportRecord r : records) { out.println(r.getSportDate() + "," + r.getSportType() + "," + r.getDurationMin() + "," + r.getCalories()); } // 底部追加合计行 out.println("合计,,," + records.stream().mapToDouble(SportRecord::getCalories).sum()); }

这段代码里\uFEFF的 BOM 头必须保留——没有它 Excel 打开 CSV 时中文列名会乱码,但用记事本看又是正常的,这类「本地看是好的,发给对方就乱」的问题大多源于此。生成的文件名带时间戳是为了避免浏览器缓存同名文件,让用户每次都拿到新的报表。

最后聊两句我自己的体感。拆这套资源之前我其实是抱着「JSP 项目还能玩出什么花」的心态去评估的,真正把代码看完才发现,JSP 项目作为 JavaWeb 入门并不算落后——三层架构、面向接口编程、JDBC 参数化查询这些基础思维,换到什么框架上都不过时。如果你拿到的这套源码里有任何一层结构和我说的不完全一致,以你手里的实际代码为准,先跑通再理解,理解后再改,这个顺序不要颠倒了。希望能帮到你少走几步弯路。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 15:37:04

STM32F10x系统时钟初始化详解:SystemInit与system_stm32f10x.c核心解析

简介&#xff1a;本资源是STM32F10x系列微控制器系统级初始化核心代码包&#xff0c;面向嵌入式初学者与中级开发者&#xff0c;解决ARM Cortex-M3芯片启动配置、时钟树搭建及中断向量管理等关键工程入门难题。压缩包共6个文件&#xff08;3个C源文件3个H头文件&#xff09;&am…

作者头像 李华
网站建设 2026/10/15 15:37:02

轻量级学生行为积分系统:规则引擎驱动的闭环管理平台

简介&#xff1a;学院学生积分管理系统是一套面向高校学生管理部门的Java Web应用&#xff0c;旨在解决学生行为量化评估、积分动态追踪与综合激励机制落地等管理痛点&#xff0c;适用于辅导员、教务人员及信息化建设者开展德育与学业过程性评价。资源包共364个文件&#xff0c…

作者头像 李华
网站建设 2026/10/15 15:36:43

TDesign 小程序 Calendar 日历组件实战指南:从配置到源码解析

前端UI组件小程序设计系统移动开发 【免费下载链接】tdesign-miniprogram Wechat MiniProgram and Uniapp UI components lib for TDesign 项目地址&#xff1a; https://gitcode.com/gh_mirrors/tde/tdesign-miniprogram 点击查看 免费下载 导读 Calendar 是 TDesign 小程序…

作者头像 李华
网站建设 2026/10/15 15:36:25

Arduino BLE FTMS 实战:让老健身车接入 Zwift 等训练 App

简介&#xff1a;这份资源面向嵌入式开发与室内骑行训练爱好者&#xff0c;提供一套基于Arduino与ESP32的BLE FTMS室内自行车健身机实现方案&#xff0c;用两块ESP32分别模拟功率计与智能骑行台&#xff0c;解决商用骑行台价格高昂、协议封闭的问题。压缩包共30个文件&#xff…

作者头像 李华
网站建设 2026/10/15 15:36:12

Loop Engineering:从“提示 AI”到“设计自运转系统”

1. 引言 当我们谈论 AI 辅助开发时&#xff0c;最常见的画面是&#xff1a;开发者打开对话框&#xff0c;输入一段提示词&#xff0c;等待模型生成代码&#xff0c;复制粘贴&#xff0c;再继续下一个问题。这种“提示-响应”模式虽然高效&#xff0c;却把人类牢牢钉在循环的中心…

作者头像 李华