ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Java+MyBatis+MySQL时间管理系统开发实践

Java+MyBatis+MySQL时间管理系统开发实践

1. 项目概述

这个基于Java+MyBatis+MySQL的Web时间日程管理系统是我在2017年12月开始的毕业设计项目。作为一个完整的Web应用,它实现了个人和团队的时间管理功能,包括计划安排、便签记录、提醒设置等核心功能。系统采用B/S架构,前端使用Bootstrap框架和FullCalendar插件,后端基于Guns快速开发框架构建。

提示:Guns框架整合了SpringBoot、Shiro、MyBatis-Plus等主流技术栈,可以快速构建企业级应用。我在选择这个框架时主要考虑了开发效率和功能完整性。

2. 技术选型与架构设计

2.1 技术栈组成

2.1.1 前端技术
  • Bootstrap 3.3.7:响应式布局框架
  • jQuery 2.1.4:DOM操作和AJAX请求
  • FullCalendar 3.9.0:日程展示插件
  • Layer 3.0.3:弹层组件
2.1.2 后端技术
  • Spring Boot 1.5.6:基础框架
  • MyBatis-Plus 2.1.9:ORM框架
  • Shiro 1.4.0:权限控制
  • Beetl 2.8.1:模板引擎
2.1.3 数据库
  • MySQL 5.7:关系型数据库
  • Druid 1.1.5:数据库连接池

2.2 系统架构设计

系统采用经典的三层架构:

表示层(Web) → 业务逻辑层(Service) → 数据访问层(DAO)

我特别设计了前后端分离的交互方式:

  1. 前端通过AJAX请求RESTful API
  2. 后端返回JSON格式数据
  3. 前端使用JavaScript渲染页面

注意:虽然采用了Beetl模板引擎,但主要业务逻辑都通过API接口实现,保持了前后端的松耦合。

3. 核心功能实现

3.1 日程管理模块

3.1.1 计划管理
// PlanController.java @PostMapping("/add") @ResponseBody public Object add(Plan plan) { // 自动填充创建时间和用户ID plan.setCreatetime(new Date()); plan.setUserid(ShiroKit.getUser().getId()); // 计算时间长度(分钟) long diff = plan.getEndtime().getTime() - plan.getStarttime().getTime(); plan.setTimelength((int) (diff / (1000 * 60))); return planService.insert(plan) ? SUCCESS_TIP : ERROR_TIP; }
3.1.2 提醒功能实现
// plan.js function setReminder(plan) { let now = new Date(); let remindTime = new Date(plan.remindtime); if(remindTime > now) { let delay = remindTime - now; setTimeout(() => { layer.msg('提醒:' + plan.title, { icon: 1, time: 5000 }); // 播放提醒音效 document.getElementById('remindAudio').play(); }, delay); } }

3.2 用户权限设计

3.2.1 角色划分
  • 普通用户:管理个人日程
  • 管理员:管理系统所有用户和日程
3.2.2 Shiro配置
// ShiroConfig.java @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean() { ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); // 设置过滤规则 Map<String, String> filterMap = new LinkedHashMap<>(); filterMap.put("/user/**", "roles[admin]"); filterMap.put("/admin/**", "roles[admin]"); shiroFilter.setFilterChainDefinitionMap(filterMap); return shiroFilter; }

4. 数据库设计

4.1 核心表结构

4.1.1 计划表(plan)
字段类型说明
idint主键
titlevarchar(255)计划标题
starttimedatetime开始时间
endtimedatetime结束时间
remindtimedatetime提醒时间
repeatint重复次数
levelint重要程度(1-5)
useridint用户ID
4.1.2 便签表(note)
字段类型说明
idint主键
titlevarchar(255)标题
contenttext内容
is_showtinyint是否展示
is_toptinyint是否置顶
useridint用户ID

5. 开发经验与优化建议

5.1 踩坑记录

  1. FullCalendar时区问题:

    • 现象:前端显示时间比实际存储时间少8小时
    • 解决:配置timezone: 'local'并统一使用UTC时间存储
  2. MyBatis-Plus逻辑删除冲突:

    • 现象:自动填充字段与逻辑删除字段冲突
    • 解决:自定义MetaObjectHandler处理填充逻辑

5.2 性能优化

  1. 日程查询优化:
-- 添加复合索引 ALTER TABLE plan ADD INDEX idx_user_time (userid, starttime, endtime);
  1. 缓存策略:
// 使用Spring Cache缓存用户数据 @Cacheable(value = "user", key = "#id") public User getUserById(Integer id) { return userMapper.selectById(id); }

6. 部署方案

6.1 环境要求

  • JDK 1.8+
  • MySQL 5.7+
  • Tomcat 8.5+

6.2 部署步骤

  1. 导入SQL脚本到MySQL
  2. 修改application.yml中的数据库配置
  3. 打包项目:mvn clean package
  4. 部署war包到Tomcat

提示:生产环境建议使用Nginx做反向代理和静态资源缓存。

7. 项目扩展方向

  1. 移动端适配:开发响应式布局或独立APP
  2. 团队协作:增加日程共享和任务分配功能
  3. 数据统计:添加时间管理分析报表
  4. 第三方登录:集成微信、QQ等社交账号登录

这个项目从技术选型到功能实现都经过仔细考量,虽然作为毕业设计完成,但具备了实际应用的基础框架。在开发过程中,我特别注重代码的可维护性和扩展性,为后续功能迭代预留了接口。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进