Android+FastAPI+MySQL8.0 三层架构数据连通
目录
报错 1:连接超时 failed to connect to /10.0.2.2:8080
报错 2:bcrypt has no attribute 'about'
报错 3:500 Internal Server Error password cannot be longer than 72 bytes
报错 4:Access denied for user 'root'@xxx
摘要
在基于大模型的智能衣橱管理系统安卓项目开发中,数据持久化存储是核心环节,用户账号、衣橱衣物信息、穿搭记录、个性化标签等业务数据均需要数据库提供稳定支撑。本文以 Windows11 + Android Studio Hedgehog + MySQL 8.0.36 + Python FastAPI 为完整开发环境,完整记录安卓模拟器 + 后端服务 + MySQL三层联动的数据对接全过程。项目本身支持云端 MySQL 数据库部署,且前期测试已验证云端环境可正常连通使用;由于暂时未购买云数据库服务,现阶段开发采用本地 MySQL完成数据存储与接口调试。本文涵盖数据库远程权限配置、后端跨域处理、端口适配、bcrypt 密码加密兼容、网络请求超时、500 内部服务器错误等全场景实战踩坑,完整复盘从数据库连通失败到用户注册功能成功落地的全部解决方案,适合课程设计、毕设、安卓后端联动开发参考复用。
一、前言
在智能衣橱管理系统开发中,仅依靠安卓本地 SP、文件存储,无法实现账号登录、多设备同步、衣物数据统一管理等核心业务。因此项目采用主流三层架构:Android 客户端(Compose)+ FastAPI 后端 + 数据库
核心业务数据存储需求:
- 用户手机号、加密密码、昵称等账号数据持久化
- 衣物照片地址、分类标签、自定义备注录入入库
- 穿搭灵感收藏、穿搭方案记录、个人偏好数据同步
- 统一通过后端接口完成数据增删改查,规范前后端交互
本项目架构兼容云端数据库与本地数据库双模式,前期已完成云端 MySQL 远程连接测试,接口读写、数据交互均可正常运行;考虑到开发成本与现阶段调试需求,暂时未购置云数据库,因此本次开发全部基于本地 MySQL 8.0完成部署。
相较于安卓直连 JDBC 的简易写法,接口中转架构更贴合企业开发规范,但同时衍生大量问题:端口不匹配、跨域拦截、MySQL 远程访问限制、加密库版本冲突、模拟器网络隔离、服务启动路径错误等。
二、开发环境
- 操作系统:Windows 11 64 位
- 开发工具:Android Studio Hedgehog、Navicat Premium、PowerShell
- 数据库:MySQL 8.0.36(本地部署,项目兼容云端 MySQL)
- 后端技术:Python 3.13 + FastAPI
- 运行设备:Android 模拟器
- 项目技术栈:Kotlin + Jetpack Compose + FastAPI + MySQL8.0
三、MySQL 前期核心配置
1、创建项目专属数据库
使用 Navicat 执行 SQL,创建专属库并指定编码格式:
CREATE DATABASE IF NOT EXISTS mywardrobe DEFAULT CHARACTER SET utf8mb4;
后续后端配置文件、数据表全部依托 mywardrobe,保证项目隔离。
2、开启 MySQL 远程访问权限
MySQL 默认仅允许 127.0.0.1 本地访问,模拟器与后端属于跨 IP 请求,必须放开权限:
- 编辑 MySQL 配置文件
my.ini
bind-address = 0.0.0.0
- 重启 MySQL 服务,执行授权语句
-- 允许root用户任意IP访问
CREATE USER 'root'@'%' IDENTIFIED BY '你的MySQL密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
3、放行防火墙端口
Windows 防火墙会拦截 3306、8080 端口,导致连接超时:
- 打开 Windows 防火墙 → 高级设置
- 入站规则:新建规则,放行 3306(数据库)、8080(后端)
- 开发调试阶段可临时关闭防火墙,减少干扰
4、数据库连接必要参数
MySQL8.0 连接必须携带参数,避免时区、SSL、公钥报错:
useSSL=false
serverTimezone=UTC
allowPublicKeyRetrieval=true
补充:切换为云端数据库时,只需修改后端
.env中的MYSQL_HOST为公网 IP、端口、云端账号密码即可,业务代码无需改动,迁移成本极低。
四、FastAPI 后端配置与服务部署
1、数据库环境变量配置
后端使用 .env 文件统一管理数据库信息,避免硬编码,方便后期无缝切换本地 / 云端库:
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=你的本地MySQL密码
MYSQL_DATABASE=mywardrobe
2、全局跨域解决
安卓模拟器网络请求会被同源策略拦截,在 main.py 添加跨域中间件:
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# 全局放行跨域
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
3、后端端口统一适配
- 安卓项目内置固定请求地址:
http://10.0.2.2:8080 10.0.2.2是 Android 模拟器访问电脑宿主机的固定 IP- 最初后端默认端口 8000,端口不一致直接请求超时
✅ 最终解决方案:不修改安卓代码,统一后端为 8080 端口正确启动命令:
# 必须切入backend目录,否则找不到main.py
cd D:\my-wardrobe-main\my-wardrobe-main\backend
uvicorn main:app --reload --host 0.0.0.0 --port 8080
五、安卓端关键配置
1、清单文件权限配置
AndroidManifest.xml 添加网络权限与明文访问:
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 允许HTTP明文请求,解决本地接口拦截 -->
<application
...
android:usesCleartextTraffic="true">
2、接口请求地址
模拟器固定访问地址,全程无需修改局域网 IP:
http://10.0.2.2:8080/
3、登录注册按钮交互限制
项目原生 Compose 登录 / 注册按钮存在严格禁用逻辑:
- 手机号必须 11 位数字
- 密码长度≥6 位
- 注册页两次密码必须一致
- 加载中自动禁用按钮
调试阶段可临时修改 enabled = true 强制解锁,方便接口测试。
六、项目数据表设计
贴合智能衣橱实际业务,设计三张核心数据表,本地 / 云端数据库通用:
USE mywardrobe;
-- 用户表:账号登录、注册信息
CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT,
phone VARCHAR(11) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
nickname VARCHAR(30) NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 衣物信息表:录入的全部衣橱数据
CREATE TABLE wardrobe_item(
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
category VARCHAR(20),
image_uri VARCHAR(255),
tags TEXT,
note VARCHAR(200),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 穿搭灵感收藏表
CREATE TABLE inspire_favorite(
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
target_id VARCHAR(50) NOT NULL,
type VARCHAR(10),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
七、全流程报错复盘与解决方案
报错 1:连接超时 failed to connect to /10.0.2.2:8080
报错原因
- 后端启动端口 8000,与安卓 8080 不匹配
- 未在 backend 目录启动服务,服务未正常运行
- 防火墙拦截 8080 端口
解决办法统一后端端口为 8080,切入正确目录启动服务,放行防火墙端口。
报错 2:bcrypt has no attribute 'about'
报错原因Python3.13 新版本与高版本 bcrypt 加密库不兼容,版本冲突
解决办法降级安装稳定版依赖:
pip install bcrypt==4.0.1
报错 3:500 Internal Server Error password cannot be longer than 72 bytes
报错原因bcrypt 加密算法硬性限制:密码明文最大 72 字节,超长直接崩溃
解决办法修改后端加密函数,自动截断超长内容:
def hash_password(plain: str) -> str:
# 截断至72字节,适配bcrypt规则
plain_trimmed = plain.encode('utf-8')[:72].decode('utf-8', 'ignore')
return pwd_context.hash(plain_trimmed)
报错 4:Access denied for user 'root'@xxx
报错原因MySQL 未开放远程权限、.env账号密码填写错误
解决办法重新执行远程授权 SQL,核对数据库配置文件参数。
八、最终实现效果
如图示:成功在数据库得到注册者信息
(其他详细信息用户可在登录后补充完善,如下图)


- 本地 MySQL 服务正常运行,远程访问权限完全放开
- FastAPI 后端稳定运行在
0.0.0.0:8080,跨域生效、数据库连接成功 - Android 模拟器与后端接口通信正常,无超时、无拦截
- 用户注册、登录接口正常响应,密码加密无报错
- 注册数据成功写入 MySQL
user表,三层数据链路完全打通 - 项目原生支持云端数据库切换,后续购置云服务后,仅需修改数据库配置即可直接上线使用
- 后续衣物新增、标签存储、数据查询功能可无缝基于当前环境开发
九、开发总结与心得
-
多环境适配,架构扩展性更强本项目提前兼容本地 / 云端双数据库模式,云端连接方案已测试可行,仅因阶段性开发成本选择本地数据库过渡,后期上线部署十分便捷。
-
端口统一是网络连通核心安卓模拟器存在固定访问 IP 与端口,优先修改后端配置适配前端,避免大范围改动安卓代码,降低出错概率。
-
环境兼容问题优先降级处理新版 Python、第三方加密库容易出现底层兼容 bug,遇到依赖报错,优先选用稳定旧版本,快速解决问题。
-
权限类配置缺一不可MySQL 远程权限、安卓网络权限、后端跨域、防火墙端口放行,任何一项缺失都会导致连接失败,排查时按顺序逐一核对。
-
提前适配底层组件限制加密算法、数据库字段长度、接口参数限制等隐性规则,需要提前做代码兼容,避免运行时服务崩溃。
-
分层排查提高排错效率服务启动 → 端口连通 → 数据库连接 → 接口调试,循序渐进定位问题,防止多 bug 叠加难以排查。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)