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)我特别设计了前后端分离的交互方式:
- 前端通过AJAX请求RESTful API
- 后端返回JSON格式数据
- 前端使用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)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int | 主键 |
| title | varchar(255) | 计划标题 |
| starttime | datetime | 开始时间 |
| endtime | datetime | 结束时间 |
| remindtime | datetime | 提醒时间 |
| repeat | int | 重复次数 |
| level | int | 重要程度(1-5) |
| userid | int | 用户ID |
4.1.2 便签表(note)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int | 主键 |
| title | varchar(255) | 标题 |
| content | text | 内容 |
| is_show | tinyint | 是否展示 |
| is_top | tinyint | 是否置顶 |
| userid | int | 用户ID |
5. 开发经验与优化建议
5.1 踩坑记录
FullCalendar时区问题:
- 现象:前端显示时间比实际存储时间少8小时
- 解决:配置
timezone: 'local'并统一使用UTC时间存储
MyBatis-Plus逻辑删除冲突:
- 现象:自动填充字段与逻辑删除字段冲突
- 解决:自定义
MetaObjectHandler处理填充逻辑
5.2 性能优化
- 日程查询优化:
-- 添加复合索引 ALTER TABLE plan ADD INDEX idx_user_time (userid, starttime, endtime);- 缓存策略:
// 使用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 部署步骤
- 导入SQL脚本到MySQL
- 修改
application.yml中的数据库配置 - 打包项目:
mvn clean package - 部署war包到Tomcat
提示:生产环境建议使用Nginx做反向代理和静态资源缓存。
7. 项目扩展方向
- 移动端适配:开发响应式布局或独立APP
- 团队协作:增加日程共享和任务分配功能
- 数据统计:添加时间管理分析报表
- 第三方登录:集成微信、QQ等社交账号登录
这个项目从技术选型到功能实现都经过仔细考量,虽然作为毕业设计完成,但具备了实际应用的基础框架。在开发过程中,我特别注重代码的可维护性和扩展性,为后续功能迭代预留了接口。