1. 项目概述与背景
作为一名长期从事Java开发的工程师,我最近完成了一个基于Java的个人任务管理APP开发项目。这个系统采用Android Studio作为主要开发环境,结合MySQL数据库,实现了完整的任务管理功能闭环。在移动互联网时代,高效的任务管理工具已经成为提升个人生产力的刚需。市面上的任务管理软件虽然众多,但要么功能过于复杂,要么缺乏灵活性。因此,我决定开发一款轻量级但功能完备的个人任务管理工具。
这个系统最核心的价值在于:它不仅仅是一个简单的待办事项列表,而是整合了任务管理、日程规划、工作复盘的全流程效率工具。用户可以通过它创建带有优先级和分类的任务,设置提醒,记录每日总结,并生成可视化的工作报告。整个系统采用MVC架构设计,保证了良好的扩展性和维护性。
2. 系统架构与技术选型
2.1 整体架构设计
系统采用经典的三层架构:
- 表现层:Android原生UI组件
- 业务逻辑层:Java+Spring Boot
- 数据访问层:MySQL+MyBatis
这种分层设计使得各模块职责清晰,耦合度低,便于后期维护和功能扩展。特别是在处理复杂业务逻辑时,分层架构的优势更加明显。
2.2 核心技术选型
开发环境:
- IDE:Android Studio 2022.3.1
- JDK:1.8
- 构建工具:Gradle 7.4
后端技术栈:
- Web框架:Spring Boot 2.7.5
- ORM框架:MyBatis 3.5.10
- 数据库:MySQL 8.0.31
- 应用服务器:Tomcat 9.0
前端技术栈:
- UI框架:Android原生组件
- 网络通信:Retrofit 2.9.0
- 本地存储:Room 2.4.3
选择这些技术的主要考虑:
- 成熟稳定:所有技术都有大量生产环境验证
- 社区支持:遇到问题容易找到解决方案
- 性能表现:能够满足移动端应用的性能需求
- 学习曲线:团队成员对这些技术都比较熟悉
3. 数据库设计与实现
3.1 数据库表结构
系统主要包含以下核心表:
- 用户表(user)
sql复制CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`email` varchar(100) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `username_UNIQUE` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 任务表(task)
sql复制CREATE TABLE `task` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int NOT NULL,
`title` varchar(100) NOT NULL,
`description` text,
`priority` int DEFAULT '2' COMMENT '1-高 2-中 3-低',
`status` int DEFAULT '0' COMMENT '0-未开始 1-进行中 2-已完成',
`category_id` int DEFAULT NULL,
`due_date` datetime DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `fk_task_user_idx` (`user_id`),
KEY `fk_task_category_idx` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 任务分类表(task_category)
sql复制CREATE TABLE `task_category` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int NOT NULL,
`name` varchar(50) NOT NULL,
`color` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_category_user_idx` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 每日总结表(daily_summary)
sql复制CREATE TABLE `daily_summary` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int NOT NULL,
`content` text NOT NULL,
`date` date NOT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `user_date_UNIQUE` (`user_id`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 数据库优化策略
-
索引优化:
- 为所有外键字段添加索引
- 为常用查询条件字段添加组合索引
- 避免过度索引,定期分析索引使用情况
-
查询优化:
- 使用EXPLAIN分析慢查询
- 避免SELECT *,只查询需要的字段
- 合理使用JOIN,避免笛卡尔积
-
连接池配置:
properties复制spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
4. 核心功能实现
4.1 用户认证模块
采用JWT(JSON Web Token)实现无状态认证,流程如下:
- 用户登录成功后,服务端生成JWT token
- 客户端存储token并在后续请求的Header中携带
- 服务端通过拦截器验证token有效性
关键代码实现:
java复制// JWT工具类
public class JwtUtil {
private static final String SECRET_KEY = "your-secret-key";
private static final long EXPIRATION_TIME = 86400000; // 24小时
public static String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public static Boolean validateToken(String token, UserDetails userDetails) {
final String username = extractUsername(token);
return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
}
}
4.2 任务管理模块
任务管理是系统的核心功能,主要包括:
- 任务创建与编辑
- 任务分类管理
- 任务优先级设置
- 任务提醒设置
实现要点:
- 使用Android的RecyclerView展示任务列表
- 实现下拉刷新和上拉加载更多
- 支持按分类、优先级、状态等多维度筛选
关键代码片段:
java复制// 任务列表适配器
public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder> {
private List<Task> taskList;
private OnTaskClickListener listener;
@Override
public void onBindViewHolder(@NonNull TaskViewHolder holder, int position) {
Task task = taskList.get(position);
holder.title.setText(task.getTitle());
holder.dueDate.setText(formatDate(task.getDueDate()));
// 根据优先级设置不同颜色
switch (task.getPriority()) {
case 1:
holder.priorityIndicator.setBackgroundColor(Color.RED);
break;
case 2:
holder.priorityIndicator.setBackgroundColor(Color.YELLOW);
break;
default:
holder.priorityIndicator.setBackgroundColor(Color.GREEN);
}
}
private String formatDate(Date date) {
if (date == null) return "";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault());
return sdf.format(date);
}
}
4.3 提醒功能实现
使用Android的AlarmManager实现任务提醒:
java复制public class ReminderHelper {
public static void setReminder(Context context, Task task) {
Intent intent = new Intent(context, ReminderReceiver.class);
intent.putExtra("task_id", task.getId());
intent.putExtra("task_title", task.getTitle());
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context,
task.getId(),
intent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (task.getDueDate() != null) {
// 提前10分钟提醒
long triggerAtMillis = task.getDueDate().getTime() - 600000;
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
triggerAtMillis,
pendingIntent);
}
}
}
5. 系统界面实现
5.1 登录与注册界面
采用Material Design设计规范,实现简洁美观的登录界面:
- 使用TextInputLayout实现浮动标签效果
- 添加输入验证逻辑
- 支持记住密码功能
布局文件关键代码:
xml复制<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
app:errorEnabled="true">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etUsername"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="用户名"
android:inputType="text"/>
</com.google.android.material.textfield.TextInputLayout>
5.2 主界面设计
采用BottomNavigationView实现底部导航,包含三个主要Tab:
- 今日任务:展示当天需要完成的任务
- 所有任务:按分类展示所有任务
- 我的:用户个人中心和设置
使用ViewPager2实现页面滑动切换:
java复制public class MainActivity extends AppCompatActivity {
private ViewPager2 viewPager;
private BottomNavigationView bottomNav;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.view_pager);
bottomNav = findViewById(R.id.bottom_nav);
setupViewPager();
setupBottomNav();
}
private void setupViewPager() {
ViewPagerAdapter adapter = new ViewPagerAdapter(this);
adapter.addFragment(new TodayFragment());
adapter.addFragment(new AllTasksFragment());
adapter.addFragment(new ProfileFragment());
viewPager.setAdapter(adapter);
viewPager.setUserInputEnabled(false); // 禁用滑动
}
private void setupBottomNav() {
bottomNav.setOnNavigationItemSelectedListener(item -> {
switch (item.getItemId()) {
case R.id.nav_today:
viewPager.setCurrentItem(0);
return true;
case R.id.nav_all:
viewPager.setCurrentItem(1);
return true;
case R.id.nav_profile:
viewPager.setCurrentItem(2);
return true;
}
return false;
});
}
}
6. 系统测试与优化
6.1 功能测试用例
-
用户注册测试
- 测试正常注册流程
- 测试用户名重复情况
- 测试密码强度验证
- 测试邮箱格式验证
-
任务管理测试
- 测试任务创建、编辑、删除
- 测试任务分类筛选
- 测试任务优先级设置
- 测试任务状态变更
-
提醒功能测试
- 测试提醒时间设置
- 测试提醒通知显示
- 测试无网络情况下的本地提醒
6.2 性能优化措施
-
网络请求优化
- 使用OkHttp的缓存机制
- 实现请求重试机制
- 合并多个小请求为批量请求
-
内存优化
- 使用Glide加载图片,自动管理内存
- 及时释放不再使用的资源
- 避免内存泄漏,使用LeakCanary检测
-
数据库优化
- 使用事务批量操作
- 合理使用索引
- 定期清理过期数据
7. 项目部署与发布
7.1 后端部署
采用Docker容器化部署,docker-compose.yml配置示例:
yaml复制version: '3'
services:
app:
build: .
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/task_manager
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=yourpassword
depends_on:
- mysql
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=yourpassword
- MYSQL_DATABASE=task_manager
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
7.2 APP发布流程
- 生成签名密钥:
bash复制keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias
- 配置build.gradle:
groovy复制android {
signingConfigs {
release {
storeFile file("my-release-key.jks")
storePassword "yourpassword"
keyAlias "my-alias"
keyPassword "yourpassword"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
- 生成APK并上传到应用市场
8. 开发经验与心得
在开发这个任务管理APP的过程中,我积累了一些宝贵的经验:
-
关于数据同步:
- 实现离线优先策略,本地操作立即生效,网络恢复后自动同步
- 使用时间戳解决冲突,最后修改的版本保留
- 添加同步状态指示器,让用户了解数据状态
-
关于用户体验:
- 添加空状态提示,避免空白页面让用户困惑
- 实现平滑的过渡动画,提升操作连贯性
- 提供操作反馈,如Snackbar提示操作结果
-
关于代码质量:
- 坚持单元测试,核心功能测试覆盖率超过80%
- 使用静态代码分析工具(如SonarQube)定期检查代码
- 遵循代码规范,保持风格一致
-
遇到的典型问题及解决方案:
- 问题:列表快速滚动时卡顿
解决:优化ViewHolder创建,减少布局层次,使用DiffUtil高效更新 - 问题:后台服务被系统杀死
解决:使用WorkManager处理重要后台任务,添加前台服务通知 - 问题:不同设备显示不一致
解决:使用ConstraintLayout实现响应式布局,添加多尺寸资源
- 问题:列表快速滚动时卡顿
这个项目从需求分析到最终上线,历时3个月,让我对移动应用全流程开发有了更深入的理解。特别是性能优化和用户体验方面的经验,对我后续的项目开发有很大帮助。