logo
0
0
WeChat Login
zhouhao<zhouhao3207@qq.com>
docs: 更新README中的文件路径为相对路径

Food(Android)

一个面向教学/练习的外卖点餐 App 示例项目,覆盖登录注册、商铺浏览、商品浏览、购物车、下单、订单列表/详情、个人中心等完整业务链路。项目使用 Android DataBinding + ViewModel 的 MVVM 组织方式,网络层基于 OkHttp + Gson,图片加载基于 Glide。

功能概览

  • 账号
    • 登录、注册(含头像裁剪/上传)
    • 个人信息:头像/用户名编辑
  • 点餐链路
    • 商铺列表
    • 商品列表(分类 + 商品)
    • 购物车(加减数量、清空、下单)
    • 订单列表、订单详情、支付弹窗
  • 其他
    • TabBar + ViewPager2 主框架
    • 加载/空态/错误态页面组件

项目 UI 截图位于 ui 目录。

技术栈

  • 语言:Kotlin
  • 架构:MVVM(ViewModel + LiveData) + DataBinding
  • 网络:OkHttp 5 + Gson
  • 图片:Glide
  • 动画:Lottie
  • 图片裁剪:uCrop
  • 异步:Kotlin Coroutines

依赖与版本统一在 libs.versions.toml 中管理。

环境要求

  • Android Studio(建议使用较新版本,支持 compileSdk 36)
  • JDK 17(项目已配置 Kotlin toolchain 17)
  • Android 设备/模拟器:Android 13+(minSdk 33)

快速开始

使用 Android Studio 运行

  1. 用 Android Studio 打开项目根目录 Food/
  2. 等待 Gradle Sync 完成
  3. 选择运行配置 app
  4. 连接 Android 13+ 设备或创建 API 33+ 模拟器
  5. 点击 Run

应用入口 Activity 在 AndroidManifest.xml 中配置为 MainActivity。如果未登录,会自动跳转到登录页。

使用命令行构建

在项目根目录执行:

./gradlew :app:assembleDebug

安装到设备(已连接 adb 设备):

./gradlew :app:installDebug

Lint:

./gradlew :app:lintDebug

服务端配置

当前服务端地址硬编码在 FoodApiClient.kt

  • SERVER_HOST = "http://food1.api.sziit.top"

如需切换服务端(或改为 https),直接修改该常量即可。

说明:

  • 项目在 AndroidManifest.xml 中启用了 usesCleartextTraffic="true",用于允许 http 明文请求(教学/测试环境常用)。如果你的服务端已支持 https,建议关闭该配置。

项目结构

app/src/main/java/com/android/practice/food ├── app/ Application ├── core/ │ ├── logging/ 日志 │ ├── network/ 网络请求与拦截器 │ └── ui/ 基础 UI、组件、图片加载等 ├── data/ │ └── model/ 数据模型 └── feature/ 各业务模块(account/store/product/cart/order/main)

主要业务模块位于 feature

  • feature/account:登录、注册、个人信息
  • feature/store:商铺列表
  • feature/product:商品列表
  • feature/cart:购物车
  • feature/order:订单列表/详情/支付
  • feature/main:主页面 + TabBar

开发约定

  • 网络请求统一通过 FoodApiClient 发起,并由 TokenHeaderInterceptor 自动补充 token 请求头
  • 图片加载统一使用 ImageLoader.load(ImageView, source, ...)
  • UI 层主要使用 DataBinding 绑定 ViewModel 的状态/数据;资源 id(如 drawable/string)建议在 Kotlin 中直接 setImageResource / setText,或在 XML 使用显式的 ContextCompat.getDrawable / context.getString 表达式

常见问题

1) Tab 图标/文案资源 id 在 XML 绑定不生效

DataBinding 对资源 id 到 Drawable / String 的自动转换能力有限。推荐两种方式:

  • Kotlin 中直接调用 setImageResource(resId)setText(resId)
  • XML 中使用显式表达式:ContextCompat.getDrawable(view.getContext(), resId)view.getContext().getString(resId)

2) 构建失败提示需要更高版本的 SDK

请在 Android Studio 的 SDK Manager 中安装对应 compileSdk 版本(当前为 36)。

License

仅用于学习与教学目的。若需开源协议,请按实际发布需求补充。