欢迎光临
我们一直在努力

基于 Android + SQLite + OkHttp 的智慧农业 App:农业电商与社区一体化平台实践(源码和文档)

摘要:本文分享一款面向农业领域的 Android 综合服务平台——智慧农业 App 的设计与实现。项目以"农产品商城 + 农业社区交流"为核心,覆盖用户注册登录、农资商品浏览与购买、购物车结算、订单管理、社区发帖互动、点赞评论、管理员商品发布与订单监管、个性主题换肤等完整业务。技术栈采用 Android 原生 + SQLite 本地库 + OkHttp 网络层双模式、Glide 图片加载、PictureSelector 图片选择、skin-support 动态换肤,适合作为毕设或课程设计的完整参考案例。


一、项目概述

1.1 项目背景

随着移动互联网向三农领域下沉,农户对农资采购、种植技术交流的需求越来越强烈。传统的农资购买渠道分散、价格不透明,而种植经验又大多停留在口头传播。本项目以智慧农业为切入点,构建一个"在线农资商城 + 农业社区互动"一体化的移动平台,让农户能够一站式选购化肥、种子等农资,同时在社区中学习科学种植、分享农事经验。

1.2 功能矩阵

功能模块普通用户管理员
用户体系 注册 / 登录 / 记住密码 / 自动登录 / 修改密码 预置账号 admin/123
农资商城 首页轮播 + 搜索 + 商品列表 + 详情 + 加购/立即购买 发布商品 / 删除商品
购物车 多选 / 合计 / 结算 —
订单 我的订单 查看全部订单
农业社区 帖子列表 / 发布图文 / 点赞 / 评论 同左
个人中心 个人信息 / 我的订单 / 个性主题 / 关于 / 退出登录 同左

1.3 应用截图

图 1 — 登录页(清新绿色农业风 Logo)

在这里插入图片描述

登录页采用白绿配色,顶部为嫩芽 Logo,中部为用户名/密码输入区,底部提供"记住密码"与注册入口,登录按钮采用圆角主色填充,视觉上贴合农业主题。

图 2 — 注册页(头像选择 + 性别单选)

在这里插入图片描述

注册页支持通过 PictureSelector 选择头像,采集用户名、性别、手机号、地址、密码、确认密码等字段,并做基础非空与一致性校验。

图 3 — 普通用户首页(轮播 + 搜索 + 农资商品列表)

在这里插入图片描述
_20260524_124203.png&pos_id=img-aFGV4BSy-1787749675044)

首页由顶部搜索栏、中部 ViewPager 自动轮播横幅、底部 ListView 商品列表组成。商品覆盖化肥、菜籽种子等农资品类,展示图片、名称、简介、价格、分类与库存。

图 4 — 商品详情页(加入购物车 / 立即购买)

在这里插入图片描述

详情页展示商品大图、完整描述、价格与分类,底部提供"加入购物车"和"立即购买"两个主操作。普通用户看到购买入口,管理员进入同一页面则显示删除按钮。

图 5 — 农业社区列表页

在这里插入图片描述

社区页以卡片形式展示农业种植相关帖子,包含封面图、标题、摘要与发布时间,右下角浮动"发布"按钮,方便用户随时分享种植经验。

图 6 — 社区详情页(点赞 + 评论)

在这里插入图片描述

详情页展示帖子完整内容与配图,支持点赞切换与评论输入,评论列表按时间展示用户头像、昵称、日期与评论内容,长按可删除评论。

图 7 — 购物车列表(多选 + 合计 + 结算)

在这里插入图片描述

购物车支持条目勾选,底部实时计算已选项总价,点击"结算"将所选商品批量生成订单记录。

图 8 — 我的订单记录

在这里插入图片描述

订单记录展示当前用户历史下单信息,包括商品图片、名称、价格与收货地址,便于用户追溯。
在这里插入图片描述


二、技术栈与依赖

2.1 基础配置

配置项值
Application ID com.example.smartAgriculture
compileSdkVersion 30
targetSdkVersion 28
minSdkVersion 21(Android 5.0+)
Java 文件数 60 个
主色 薄荷绿 #09C6A0

2.2 核心依赖

// build.gradle 核心依赖
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'

// 图片加载与选择
implementation 'com.github.bumptech.glide:glide:4.11.0'
implementation 'jp.wasabeef:glide-transformations:3.3.0'
implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0'

// 网络与序列化
implementation 'com.squareup.okhttp3:okhttp:4.4.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'io.reactivex.rxjava2:rxjava:2.2.9'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'

// 主题换肤
implementation 'skin.support:skin-support:4.0.5'
implementation 'skin.support:skin-support-appcompat:4.0.5'
implementation 'skin.support:skin-support-design:4.0.5'

// 历史兼容
implementation files('libs\\\\volley.jar')

设计说明:项目保留了 OkHttp 网络层实现,同时支持离线 SQLite 模式。通过登录页的"自动登录"开关(对应 MyApplication.offlineLogin)可在本地登录与网络登录之间切换:勾选自动登录时直接走 SQLite 校验;取消勾选则通过 OkHttp 向后端接口发起账号校验。这种"双模式"设计既保证了 demo 可离线运行,也为后续接入服务端预留了扩展能力。


三、架构设计

3.1 整体架构

项目采用经典的 Activity + Fragment + DAO 三层结构,未引入 MVP/MVVM,保持代码直观、易于阅读,非常适合学习与二次开发:

UI 层: Activity(15 个)/ Fragment(7 个)/ Adapter(7 个)
│
业务层: Okhttp 网络层 + DBHelper / DBUser / DBStuff / DBRecord /
│ DBCart / DBCommunity / DBCommunityComment(7 个 DAO)
│
数据层: entity(本地实体)+ bean(网络响应)+ utils(工具类)

3.2 包结构

com.example.order/
├── MyApplication.java 自定义 Application(初始化 skin-support)
├── activity/ 15 个 Activity
│ ├── BaseActivity.java Activity 基类(换肤)
│ ├── OpenActivity.java 启动/欢迎页
│ ├── LoginActivity.java 登录(区分本地/网络模式与角色)
│ ├── RegisterActivity.java 注册(上传头像)
│ ├── MainActivity.java 普通用户主页
│ ├── AdminMainActivity.java 管理员主页
│ ├── DetailActivity.java 商品详情 / 购买 / 删除
│ ├── ShoppingCartActivity.java 购物车结算
│ ├── PublishProductActivity.java 发布/上架商品(管理员)
│ ├── MyInfoActivity.java 个人信息编辑
│ ├── MyRecordActivity.java 我的订单记录
│ ├── AddCommunityActivity.java 发布社区图文
│ ├── CommunityDetailActivity.java 社区详情 + 点赞 + 评论
│ ├── AboutActivity.java 关于
│ ├── PasswordActivity.java 重置密码
│ └── ThemeActivity.java 主题换肤设置
├── fragment/ 7 个 Fragment
│ ├── BaseFragment.java
│ ├── UserShopFragment.java 普通用户-商城页
│ ├── CommunityFragment.java 社区列表页
│ ├── BlankFragment_me.java 普通用户-我的页
│ ├── BlankFragment_Cart.java 普通用户-购物车页
│ ├── FragmentMainAdmin.java 管理员-商城管理页
│ ├── FragmentCartAdmin.java 管理员-全部订单页
│ └── FragmentMeAdmin.java 管理员-我的页
├── adapter/ 7 个 Adapter
│ ├── AdPagerAdapter 轮播图
│ ├── StuffAdapter 商品列表
│ ├── CommunityAdapter 社区帖子列表
│ ├── CartAdapter 购物车
│ ├── RecordAdapter 我的订单
│ ├── AdminAllRecordAdapter 全部订单
│ └── CommentListAdapter 评论列表
├── bean/ 网络响应实体
├── entity/ 本地实体
├── database/ 7 个 DAO
└── utils/ 工具类

3.3 多角色路由

应用在 DBHelper.init() 中预置管理员账号,登录成功后通过 DBUser.isAdmin() 决定进入普通用户主页还是管理员主页:

// DBHelper.java
public void init(){
DBUser user = new DBUser(context);
if (!user.checkUser("admin")) {
User user1 = new User("admin", "123", "广东省广州市", "男",
"17620885471", "管理员", UserTypeEnum.Admin.getDesc());
user.add(user1);
}
DBUser.user = user.get(SPUtils.getName(context));
// …
}

// LoginActivity.java
private void start() {
if (DBUser.isAdmin()) {
startActivity(new Intent(LoginActivity.this, AdminMainActivity.class));
} else {
startActivity(new Intent(LoginActivity.this, MainActivity.class));
}
finish();
}

注意:AndroidManifest.xml 中声明的 package="com.example.smallshop" 与业务代码主包 com.example.order 不一致,R 类引用也使用 com.example.smallshop.R。这是历史遗留问题,不影响运行,但生产环境建议统一包名。


四、数据库设计

数据库名:smartAgricultureApp.db,版本 1,存放于外部存储根目录,便于调试查看。

4.1 建表 SQL

// DBHelper.onCreate()
// 用户表
String sql = "create table user(id integer primary key autoincrement," +
"name text not null,password text not null,address text not null," +
"sex text not null,phone text not null,photo text not null," +
"user_type text not null)";
sqLiteDatabase.execSQL(sql);

// 购物车表
sql = "create table cart(id text not null,username text not null,PRIMARY KEY(id,username))";
sqLiteDatabase.execSQL(sql);

// 订单表
sql = "create table Record(username text not null,id text not null," +
"name text not null,price text not null,address text not null)";
sqLiteDatabase.execSQL(sql);

// 商品表(含库存)
sql = "CREATE TABLE Stuff (id integer primary key autoincrement, " +
"name text not null, title text not null, kind text not null, " +
"price text not null, path text not null, inventory integer)";
sqLiteDatabase.execSQL(sql);

// 社区帖子表
sql = "CREATE TABLE community (id integer primary key autoincrement, " +
"user_id integer, title text not null, photo text not null, " +
"content text not null, date text not null, likes INTEGER)";
sqLiteDatabase.execSQL(sql);

// 社区评论表
sql = "CREATE TABLE communityComments (id integer primary key autoincrement, " +
"user_id integer, community_id INTEGER, name text not null, " +
"comment_text text not null, comment_date text not null)";
sqLiteDatabase.execSQL(sql);

4.2 表结构说明

表名核心字段说明
user name, password, address, sex, phone, photo, user_type 用户基本信息与角色
cart id, username 联合主键,避免同一用户重复加购
Record username, id, name, price, address 订单快照,记录下单时商品与地址
Stuff name, title, kind, price, path, inventory 农资商品,新增库存字段
community user_id, title, photo, content, date, likes 社区帖子,支持点赞数
communityComments user_id, community_id, name, comment_text, comment_date 帖子评论

4.3 预置数据

首次启动时 DBHelper.init() 写入以下数据:

  • 用户:admin/123(管理员)、小李/123、小王/123(普通用户)。
  • 商品:化肥类(硝酸铵钙 ¥138、大量元素水溶肥料 ¥166、腐植酸复合肥 ¥155、中量元素水溶肥 ¥169);菜籽种子类(华油杂 62 ¥49、沣油 737 ¥55、浙油 50 ¥59)。
  • 社区帖子:4 篇农业主题帖子,涵盖种地初心、科学施肥、农事预防、深耕乡土,并预置评论。

五、关键模块实现

5.1 首页:轮播 + 搜索 + 列表

UserShopFragment 使用 Handler + Runnable 实现 3 秒自动轮播,并在用户触摸时暂停、松开后恢复:

private Runnable mRunnable = new Runnable() {
@Override
public void run() {
int currentItem = mViewPager.getCurrentItem();
int itemCount = mViewPager.getAdapter().getCount();
int nextItem = (currentItem + 1) % itemCount;
mViewPager.setCurrentItem(nextItem);
mHandler.postDelayed(this, 3000);
}
};

搜索逻辑遍历商品名称与详情,命中即刷新列表;未命中则提示并回退原始列表。列表点击后通过 Intent 传递商品 ID 到 DetailActivity。

5.3 社区互动:点赞 + 评论

CommunityDetailActivity 接收帖子实体后展示详情,点击爱心图标切换点赞状态并更新数据库:

like.setOnClickListener(v -> {
if (bean.getLike() == 0) {
like.setImageResource(R.drawable.like);
bean.setLike(1);
} else {
like.setImageResource(R.drawable.unlike);
bean.setLike(0);
}
DBHelper.GetInstance(this).getDBCommunity().change(bean);
});

评论通过 DBCommunityComment 写入,并按 community_id 过滤展示,支持长按删除。

5.4 主题换肤

项目引入 skin-support 框架,所有 Activity 继承 BaseActivity,在 onCreate() 中根据 SPUtils 保存的主题类型动态设置颜色:

// BaseActivity.java
protected void setTheme() {
int type = SPUtils.getTheme(this);
if (type == 0) {
setTheme(R.style.AppTheme);
SkinCompatUserThemeManager.get().addColorState(R.color.colorPrimary,
new ColorState.ColorBuilder()
.setColorDefault("#09C6A0")
.setColorActivated("#09C6A0").build());
} else if (type == 1) {
setTheme(R.style.AppTheme1);
SkinCompatUserThemeManager.get().addColorState(R.color.colorPrimary,
new ColorState.ColorBuilder()
.setColorDefault("#000000")
.setColorActivated("#000000").build());
} else if (type == 2) {
setTheme(R.style.AppTheme3);
SkinCompatUserThemeManager.get().addColorState(R.color.colorPrimary,
new ColorState.ColorBuilder()
.setColorDefault("#6633FF")
.setColorActivated("#6633FF").build());
}
}

@Override
public AppCompatDelegate getDelegate() {
return SkinAppCompatDelegateImpl.get(this, this);
}

MyApplication 在启动时初始化 SkinCompatManager,并添加 AppCompat 与 Material Design 控件换肤支持。


六、业务流程串讲

6.1 普通用户下单流程

UserShopFragment / DetailActivity
├─ 加入购物车:DBCart.add(id, username) → ShoppingCartActivity
└─ 立即购买:DBRecord.add(快照) → MyRecordActivity

ShoppingCartActivity(多选 → 结算)
└─ 遍历勾选项:DBRecord.add(快照) × N
DBCart.delete(id, username) × N

6.2 社区互动流程

CommunityFragment
→ 点击帖子 → CommunityDetailActivity
→ 点赞:更新 community.likes
→ 评论:写入 communityComments
→ 长按评论:删除评论
→ 点击发布 → AddCommunityActivity
→ 填写标题/内容/选择图片 → DBCommunity.add()

6.3 管理员商品管理流程

AdminMainActivity
→ FragmentMainAdmin(商城页)
→ 浮动 "+" 按钮 → PublishProductActivity
→ 填写名称/详情/分类/价格/库存 → DBStuff.add()
→ 点击商品 → DetailActivity
→ 删除 → DBStuff.delete()
→ FragmentCartAdmin(所有订单)
→ 查看全部用户订单


七、权限与清单

权限用途
WRITE_EXTERNAL_STORAGE 数据库存放于外部存储、图片选择保存
READ_EXTERNAL_STORAGE 相册选图
INTERNET OkHttp 网络请求
CAMERA 拍照上传头像/帖子图片
CALL_PHONE 预留电话联系

清单中声明 15 个 Activity,OpenActivity 为 LAUNCHER,并使用自定义 MyApplication 初始化换肤框架。


八、可优化方向

  • 密码安全:当前密码以明文存储,生产环境应使用加盐哈希。
  • 网络层统一:将本地 SQLite 与网络接口抽象为统一的 Repository 层,业务代码只依赖数据流。
  • 库存扣减:下单时同步扣减 Stuff.inventory,避免超卖。
  • 订单状态机:为 Record 增加 status 字段,支持待发货/已发货/已完成等状态。
  • 图片上传:社区与商品发布目前多为本地图片,可对接 OSS 服务端上传。
  • 包名统一:修正 com.example.smallshop 与 com.example.order 不一致的问题。
  • 架构升级:引入 MVVM + LiveData/ViewModel,降低 UI 与数据耦合。

  • 九、写在最后

    智慧农业 App 以农业电商与社区交流为业务载体,完整覆盖了 Android 应用开发中的用户体系、角色路由、列表/详情、购物车/订单、SQLite 持久化、图片加载与选择、ViewPager 轮播、社区互动、动态换肤等核心技能点。项目采用"SQLite + OkHttp 双模式"设计,既能在无后端环境下独立演示,也方便后续平滑接入服务端,是一款适合毕设、课程设计或 Android 进阶练手的完整模板。

    后续可在此基础上继续扩展农技问答、农资行情、定位推荐、天气对接等模块,进一步贴近真实农业服务场景。

    赞(0)
    未经允许不得转载:171主机测评 » 基于 Android + SQLite + OkHttp 的智慧农业 App:农业电商与社区一体化平台实践(源码和文档)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址