ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Android+XAMPP+MySQL家校互动平台:从环境搭建到接口联调

Android+XAMPP+MySQL家校互动平台:从环境搭建到接口联调 简介一套基于Android、XAMPP与MySQL实现的家校互动平台项目资料面向计算机相关专业学生及需要完成毕业设计、课程设计或相关课题开发的开发者。资源定位明确能帮助掌握Android客户端与PHP/MySQL服务端的数据交互方式理解CS架构在真实场景中的落地。压缩包大小约151.66MB内部以项目全套源码和完整文档为主包含Android工程代码、服务端脚本、数据库相关文件及设计说明文档结构清晰便于对照学习与二次开发目前已有293人学习下载。所有源码均经过测试校正可正常运行适合作为相关项目设计的参考蓝本配套文档可辅助梳理系统需求、功能模块、数据库设计与实现思路有效节省从零搭建的时间。对于希望快速上手Android联网应用、或需要完整项目案例进行改造的读者是一份具备较高参考价值的资料。1. Android XAMPP MySQL 的家校互动平台这套方案解决的是哪种场景老师要在群里发通知、布置作业、登记考勤家长想知道孩子今天到没到校、作业截止到哪天——消息一多微信群就被刷屏私聊又容易漏。这个标题给出的是一套典型的小型 CS 架构方案Android 客户端负责展示和录入XAMPP 里的 Apache 跑 PHP 接口MySQL 存业务数据。适合毕业设计选题、课程设计也适合给学校或培训机构做一套能跑在局域网里的轻量工具。拿到源码和文档后先别急着改界面把服务端到客户端的这条链跑通后面的功能都是在这条链上长出来的。2. 服务端先立住XAMPP 安装、MySQL 建库与四张核心业务表2.1 为什么用 XAMPP 而不单独装 MySQLCS 架构下的分工与取舍XAMPP 把 Apache、MySQL、PHP 打包在一起装完就有了一套能跑动态接口的服务器。家校互动这个项目里Android 端不是直连 MySQL 的——移动端直连数据库端口既危险又难以维护所以标题里写的是 CS 架构本质上是三层手机上的 App 是客户端Apache 上跑的 PHP 是中间的服务层MySQL 是数据层。XAMPP 的好处是环境一致。Windows 电脑也好Linux 服务器也好下载对应版本解压就能用。团队协作时每个人本地的 XAMPP 版本一致数据库导出的 SQL 文件就能互相导入不会因为环境差异浪费一个下午。单独装 MySQL 当然也可以但还要配 Apache、配 PHP 扩展对一个以业务功能为主的项目来说性价比不高。我一般建议新手从 XAMPP 起步把精力留给接口设计和 Android 端布局。安装时记几个关键点Apache 默认监听 80 端口MySQL 监听 3306PHP 版本建议选 7.4 或 8.x 系列。装完后打开 XAMPP Control Panel把 Apache 和 MySQL 两个模块点 Start看到端口号旁边显示绿色就说明起来了。这时候在浏览器输入http://localhost能看到 XAMPP 的欢迎页环境就算通了。2.2 数据库初始化从建库到四张业务表家校互动平台的核心数据可以收敛成四张表用户表、通知表、作业表、考勤表。用户表用 role 字段区分老师、家长和学生避免把三类人拆成三张表导致关联查询变复杂。其他三张表分别对应三个高频功能。下面是完整的初始化 SQL直接在 phpMyAdmin 的 SQL 页签里执行或者用命令行执行都行CREATE DATABASE IF NOT EXISTS school_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE school_db; CREATE TABLE t_user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(32) NOT NULL UNIQUE COMMENT 登录名, password VARCHAR(64) NOT NULL COMMENT md5加盐后的摘要, role TINYINT NOT NULL DEFAULT 2 COMMENT 0老师 1家长 2学生, real_name VARCHAR(32) NOT NULL COMMENT 姓名, phone VARCHAR(20) DEFAULT , class_id INT DEFAULT 0 COMMENT 班级ID0表示未分配, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB; CREATE TABLE t_notice ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(128) NOT NULL, content TEXT, publisher_id INT NOT NULL COMMENT 发布人ID对应t_user.id, publish_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB; CREATE TABLE t_homework ( id INT AUTO_INCREMENT PRIMARY KEY, subject VARCHAR(32) NOT NULL COMMENT 学科, content TEXT NOT NULL, class_id INT NOT NULL COMMENT 布置给哪个班级, deadline DATETIME COMMENT 截止时间, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB; CREATE TABLE t_attendance ( id INT AUTO_INCREMENT PRIMARY KEY, student_id INT NOT NULL COMMENT 关联t_user中学生ID, date DATE NOT NULL, status TINYINT NOT NULL DEFAULT 1 COMMENT 1正常 2迟到 3请假, remark VARCHAR(128) DEFAULT ) ENGINEInnoDB;几个参数说明字符集用utf8mb4而不是utf8是因为utf8mb4才能完整存下 emoji 和生僻字通知内容、作业内容里出现这些字符时不会报错或变成问号。排序规则utf8mb4_unicode_ci对中文拼音排序更友好。密码字段长度设 64是因为 md5 摘要固定是 32 个十六进制字符有些方案还会加盐后再做一次 hash留 64 位更稳妥。所有表都用 InnoDB因为后续接口要支持并发写行级锁比 MyISAM 的表级锁更适合。如果你打开源码里的 SQL 文件看到的是别的表名或字段名不用慌。核心思路是一样的先把用户体系建出来再围绕业务动作建表。字段命名尽量用英文下划线PHP 端取数据时不用做键名转换JSON 输出也干净。2.3 MySQL 初始化与测试连接用命令行确认数据库能进很多项目跑不起来不是代码问题是 MySQL 服务没起来或者密码不对。XAMPP 默认安装下 root 用户没有密码这个配置在本地开发够用但注意不要直接把 XAMPP 暴露到公网。启动 MySQL 后打开命令行工具验证mysql -u root -p school_db -e SELECT id, real_name FROM t_user LIMIT 5;带上-p是为了习惯线上环境的操作方式本地没密码时直接回车跳过。如果返回ERROR 2002 (HY000)说明 MySQL 服务没启动回到 XAMPP Control Panel 把 MySQL 点 Start。如果返回ERROR 1045 (28000)说明密码不对检查是不是自己改过 root 密码。这里再多说一句为了后续 PHP 能连上 MySQL连接参数要统一。开发阶段就把主机名写成127.0.0.1而不是localhost避免 PHP 在部分系统上把 localhost 解析成 socket 文件路径导致Cant connect to local MySQL server through socket这类玄学报错。端口 3306 除非被占用否则不要动。3. PHP 接口层把 MySQL 里的家校数据变成 Android 可用的 JSON API3.1 接口目录与统一返回格式服务端的功能不是把数据表直接暴露给客户端而是提供一组 HTTP 接口。Android 端只认 JSON不认识 MySQL 的查询结果。所以我们要在 XAMPP 的htdocs下建一个项目目录例如school里面的结构分两块config放数据库连接和公共函数api放业务接口。每个接口文件只做三件事读参数、查数据库、输出 JSON。为了让客户端解析逻辑简单所有接口统一返回格式{code: 0, msg: ok, data: {}}code是业务状态码0 表示成功非 0 表示各类失败msg是人类可读的提示data是真正的业务数据可能是对象也可能是数组。客户端只需要写一个通用的解析类判断 code 是否为 0再取 data 里的内容不用每个接口单独处理异常结构。先看公共配置文件?php // 文件htdocs/school/config/config.php // 统一JSON响应头解决中文乱码的关键之一 header(Content-Type: application/json; charsetutf-8); // 数据库连接参数主机、端口、库名、用户名、密码 $host 127.0.0.1; $port 3306; $db school_db; $user root; $pass ; // XAMPP默认root无密码正式部署必须改 // 用mysqli连接同时指定端口 $conn new mysqli($host, $user, $pass, $db, $port); if ($conn-connect_errno) { // 连接失败也输出JSON方便Android端统一处理 echo json_encode([code 5000, msg 数据库连接失败]); exit; } // 显式设置字符集保证写入和读取都是utf8mb4 $conn-set_charset(utf8mb4);这里每个参数都值得留意header必须在任何输出之前调用否则会报 headers already sentset_charset是防止写入数据库时变成乱码的第二道保险connect_errno判断连接是否成功比!$conn更可靠。把这些公共逻辑收敛在一个文件里每个接口require_once一次后续改数据库密码只改一处。3.2 一个完整的登录接口从查询到 JSON 输出登录接口是理解整个服务端工作方式的最佳样例因为它同时涉及参数接收、数据库查询和结果返回。Android 端会把用户名和密码通过 POST 方式提交过来PHP 端拿到后去 t_user 表里比对?php // 文件htdocs/school/api/login.php require_once __DIR__ . /../config/config.php; // 从POST参数中取用户名和密码trim去掉首尾空格 $username isset($_POST[username]) ? trim($_POST[username]) : ; $password isset($_POST[password]) ? trim($_POST[password]) : ; // 参数校验空值直接返回业务错误码 if ($username || $password ) { echo json_encode([code 1001, msg 用户名或密码不能为空]); exit; } // 演示项目用md5做摘要正式项目推荐password_hash $pwd_hash md5($password); // 预处理查询防止SQL注入 $sql SELECT id, username, real_name, role, class_id FROM t_user WHERE username ? AND password ?; $stmt $conn-prepare($sql); $stmt-bind_param(ss, $username, $pwd_hash); $stmt-execute(); $res $stmt-get_result(); if ($row $res-fetch_assoc()) { // 登录成功返回用户基本信息 echo json_encode([code 0, msg ok, data $row]); } else { // 没查到记录统一报用户名或密码错误 echo json_encode([code 1002, msg 用户名或密码错误]); } $stmt-close(); $conn-close();这段代码的逻辑线很清晰先取参数参数不合法就尽早返回再查数据库最后根据查询结果输出。几个细节__DIR__ . /../config/config.php用的是相对路径解析无论从哪个目录包含文件都能正确找到配置。bind_param(ss, ...)的第一个参数是类型模板两个 s 表示两个字符串参数这样即使用户输入了单引号或百分号MySQL 也会当成字面量处理而不是拼进 SQL 里。查询失败和账号错误区分开是有意为之——统一返回1002避免接口被用来探测哪些用户名存在。3.3 参数命名、SQL 防注入与返回码约定后端接口最容易出的问题不是功能跑不通而是客户端和服务端对参数名、返回码各说各话。这里需要一套约定并且写进文档里。我一般会这样做接口路径与文件名一致比如login.php对应登录POST 参数统一小写下划线命名返回码集中在文档里列一张表比如 0 成功、1001 参数缺失、1002 账号密码错误、5000 服务器内部错误。客户端拿到 code 后把 msg 直接展示给用户即可不用自己去猜错误原因。SQL 防注入要养成习惯任何用户输入拼进 SQL 前要么用prepare bind_param要么用mysqli_real_escape_string转义。字符串拼接这种方式在登录接口里最容易翻车比如用户名传一个admin OR 11如果直接用拼接 SQL等于把整个表的用户都查出来了。用预处理语句之后这类输入只会被当成一个普通的字符串去匹配查不到结果自然就返回密码错误了。关于密码存储多说一句md5 在现代硬件下已经不够安全但很多课设源码里还在用。如果你不打算改结构至少加盐比如md5($password . school_salt_2024)能让撞库成本高一点。如果愿意改动password_hash和password_verify是 PHP 官方推荐的方案改造成本也不高只需要新建用户和校验登录时各改一处。4. Android 客户端接入Retrofit 请求 PHP 接口并渲染列表数据4.1 网络层配置CS 架构下把 IP 写在什么地方Android Studio 里新建项目后第一件事不是画界面而是把网络依赖和权限配好。CS 架构里客户端必须知道服务端的入口地址。开发阶段电脑连着 WiFi手机也连着同一个 WiFi电脑的局域网 IP 就是服务端地址。在命令行执行ipconfigWindows或ifconfigmacOS/Linux找到 IPv4 地址比如192.168.1.100那么接口的 baseUrl 就是http://192.168.1.100/school/。这里容易踩一个坑Android 模拟器访问宿主机要用10.0.2.2而不是localhost因为模拟器里的 localhost 是模拟器自己。真机调试则必须用电脑的局域网 IP而且要保证手机和电脑在同一网络下。把 baseUrl 写成一个常量放到项目里的ApiConfig.java中之后切换模拟器或真机只改这一处。网络相关的依赖在build.gradle里加上 Retrofit 和 Gson 转换器implementation com.squareup.retrofit2:retrofit:2.9.0 implementation com.squareup.retrofit2:converter-gson:2.9.0然后是 AndroidManifest 里的网络配置。Android 9 开始默认禁止明文 HTTP 流量而我们的 PHP 接口在局域网里跑的是 http 不是 https所以要么在application节点加android:usesCleartextTraffictrue要么用network_security_config.xml只对指定域名放行。开发阶段直接加usesCleartextTraffic最快但上线前一定要收回去改为白名单方式。4.2 用 Retrofit 定义接口并解析 JSON从登录到列表展示接口定义是 Retrofit 的核心。它用注解声明 HTTP 方法和路径方法的参数会自动拼到请求里。定义一个登录接口import retrofit2.Call; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; // 定义所有后端接口的通用形状 public interface SchoolApi { // 登录接口POST api/login.php参数通过Form表单传递 FormUrlEncoded POST(api/login.php) CallLoginResponse login( Field(username) String username, Field(password) String password ); }FormUrlEncoded告诉 Retrofit 用表单格式提交参数Field对应 POST 体里的字段名必须和 PHP 端$_POST[username]保持一致。返回的LoginResponse是一个普通 Java 类字段名对应 JSON 里的键public class LoginResponse { public int code; public String msg; public UserData data; public static class UserData { public int id; public String username; public String real_name; public int role; public int class_id; } }Gson 转换器会把 JSON 自动映射到这个类的字段上。这里注意一个命名问题PHP 端的字段是real_nameJava 这边也用real_name而不是转成realName省去SerializedName注解的额外维护。很多源码里习惯用驼峰也不是不行但映射规则一定要和接口实际输出对齐。4.3 主线程限制为什么网络请求不能在 UI 线程跑Android 有个硬性规则网络操作不能在主线程执行否则直接抛NetworkOnMainThreadException崩溃。原理是主线程负责界面绘制和触摸事件网络请求动辄几百毫秒阻塞几秒就会 ANR。Retrofit 提供了enqueue方法自动把请求放到子线程完成后通过回调切回主线程Retrofit retrofit new Retrofit.Builder() .baseUrl(http://192.168.1.100/school/) .addConverterFactory(GsonConverterFactory.create()) .build(); SchoolApi api retrofit.create(SchoolApi.class); // enqueue是异步方法回调一定回到主线程 api.login(zhangsan, 123456).enqueue(new CallbackLoginResponse() { Override public void onResponse(CallLoginResponse call, ResponseLoginResponse response) { if (response.body() ! null response.body().code 0) { // 登录成功跳转到主界面 startActivity(new Intent(LoginActivity.this, MainActivity.class)); } else { Toast.makeText(LoginActivity.this, 登录失败, Toast.LENGTH_SHORT).show(); } } Override public void onFailure(CallLoginResponse call, Throwable t) { // 网络不通或超时t.getMessage()是排查线索 Toast.makeText(LoginActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show(); } });注意baseUrl必须以/结尾否则 Retrofit 在拼接api/login.php时会抛IllegalArgumentException。enqueue的回调里已经切回主线程所以能直接操作 UI如果你用execute()同步调用就要自己包Thread或Handler容易出现内存泄漏。建议项目里统一用enqueue只在单元测试里用execute。5. 联调避坑真机连不上、中文乱码、MySQL 8 认证插件的 5 个翻车现场5.1 真机访问不到 XAMPP先查这三个地址现象电脑浏览器访问http://localhost/school/api/xxx.php正常手机 App 却一直提示连接超时或连接失败。原因手机上访问的地址不对或者 Windows 防火墙拦住了 Apache。先确认三件事手机和电脑是否在同一 WiFi电脑 IP 是否还是192.168.1.100路由器重启后 DHCP 可能分配新 IP防火墙是否放行httpd.exe。解决在电脑上执行ipconfig重新确认 IP用手机浏览器访问http://电脑IP/school/api/xxx.php能看到 JSON 输出就说明网络通。如果浏览器打不开多半是防火墙拦截。Windows 下用管理员权限执行netsh advfirewall firewall add rule nameApache HTTP dirin actionallow programC:\xampp\apache\bin\httpd.exe enableyes这条命令把 Apache 程序加入入站放行列表。开发时也可以临时关闭防火墙测试但测试完记得开回来不然演示时别人电脑连不上你的服务。5.2 中文乱码一套 UTF-8 从 PHP 贯穿到 MySQL现象接口返回 JSON浏览器里看是正常中文Android 端解析出来变成å®¶é•¿这类乱码或者写入数据库后变成???。原因乱码几乎都是字符集不一致导致的。PHP 文件本身不是 UTF-8 编码、MySQL 连接没设utf8mb4、页面声明了错误的 charset这三处只要有一处掉链子中文就会翻车。解决从三个地方排查缺一不可。PHP 文件用编辑器另存为 UTF-8不要带 BOMBOM 会输出隐藏字符导致 JSON 解析失败config.php里的header和set_charset保持住数据库连接建库 SQL 里已经写了utf8mb4_unicode_ci。如果改了配置还乱码检查一下是不是在 Windows 上用记事本改过 PHP 文件记事本默认可能不是 UTF-8 无 BOM。5.3 用户名密码都对但连不上MySQL 8 的 caching_sha2_password 坑现象XAMPP 装的是 MySQL 8.xPHP 端new mysqli()报错authentication method unknown to the client [caching_sha2_password]但用 phpMyAdmin 能正常登录。原因MySQL 8 默认的认证插件是caching_sha2_password老版本的 PHP mysqli 扩展不认识这个插件。XAMPP 自带的 PHP 和 MySQL 版本如果搭配不当就会出现这种兼容性问题。解决把用户的认证插件改回mysql_native_password。在 MySQL 命令行执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY ; FLUSH PRIVILEGES;改成空密码只是为了本地开发和测试部署到正式环境时把密码换掉。注意BY 这部分是设置密码本地保持和config.php里的$pass 一致。如果不想改全局默认插件也可以只新建一个专用账号并指定插件例如CREATE USER school_applocalhost IDENTIFIED WITH mysql_native_password BY school123; GRANT ALL PRIVILEGES ON school_db.* TO school_applocalhost;然后把config.php里的用户名密码对应改掉。这种做法在多人协作时更安全每个人用的账号权限独立不至于全部共用 root。5.4 浏览器能访问接口但 App 不行Android 明文流量限制现象同一个地址手机浏览器打开能正常返回 JSONApp 里请求却报CLEARTEXT communication to 192.168.1.100 not permitted by network security policy。原因Android 9 起默认禁止明文 HTTP。浏览器自身有豁免逻辑但 App 必须显式声明允许。这是 4.1 节提过的那个问题的具体报错形态。解决在AndroidManifest.xml的application节点加android:usesCleartextTraffictrue。更规范的做法是配置network_security_config.xml只对192.168.1.100和localhost放行明文其余域名仍要求 HTTPS。如果项目里用了 OkHttp 且设置了自定义ConnectionSpec还要检查有没有把CLEARTEXT加进允许列表。5.5 XAMPP 启动不了80 端口被占用的处理思路现象点 XAMPP 的 Apache Start日志里报Address already in use或者状态一直不变。原因80 端口被其他程序占用。Windows 下最常见的是 IIS、其他 Web 服务器或者某些软件自带的 HTTP 服务。解决两种路线。第一把 Apache 改成监听 8080 端口编辑C:\xampp\apache\conf\httpd.conf把Listen 80改成Listen 8080同时把ServerName localhost:80改成ServerName localhost:8080。改完后访问地址带端口baseUrl 也相应变成http://192.168.1.100:8080/school/。第二找到占用进程并结束它netstat -ano | findstr :80 taskkill /PID 占用进程ID /F注意第二条命令要管理员权限而且要先确认那个进程不是系统关键服务。改端口的方式更省事推荐优先尝试。6. 从能跑到能演示接口验证清单与数据备份习惯项目能跑只是第一步演示和答辩才见真章。我通常会在交付前按下面的清单过一遍用浏览器直接访问每个接口检查 code 是否为 0、data 是否完整用 curl 在命令行模拟 POST 请求确认参数缺失时能返回 1001再在 Android 端测试弱网和断网场景空列表要有暂无数据的占位而不是白屏。这些边界不处理演示时一个弹窗报错就能让整个项目显得不专业。MySQL 的备份是个容易忽略的环节。XAMPP 环境里数据全在school_db这一个库中演示前导出一份 SQL 文件既是对数据的保险也方便换电脑后快速恢复# 导出整个库到时间戳命名的SQL文件 mysqldump -u root school_db school_db_$(date %Y%m%d).sql # 恢复数据先建库再导入 mysql -u root -e CREATE DATABASE IF NOT EXISTS school_db DEFAULT CHARACTER SET utf8mb4 mysql -u root school_db school_db_20250101.sql导出文件前确保 MySQL 服务在运行恢复时注意导入的文件路径不要有中文否则命令行会读不到文件。我自己的习惯是每次改完表结构就导出一次文件名带日期这样出了问题能快速回退到上一个可用版本也算给自己留一份后悔药。最后一条建议演示前 10 分钟关掉手机上其他占用网络的 App把手机和电脑都插上电源数据用一套固定的测试账号比如家长、老师各一个。别小看这些准备很多次翻车都是现场网络抖动、账号忘记密码这种小问题。希望帮到你这套方案的骨架不难搭把服务端到客户端的链路走通剩下就是填业务的血肉了。本文还有配套的精品资源点击获取
返回列表