这个基于SpringBoot+Vue的OA管理系统是一个面向高校计算机专业毕业设计的完整解决方案。作为一名有10年Java全栈开发经验的工程师,我深知学生在毕业设计阶段面临的挑战——从选题困惑到技术实现,从文档撰写到答辩准备,每个环节都可能成为拦路虎。这个项目正是为了解决这些痛点而设计的。
系统采用主流的技术栈组合:后端使用SpringBoot+MyBatisPlus,前端采用Vue.js,数据库选用MySQL。这种技术组合在当前企业级应用开发中非常流行,学生通过学习这个项目,不仅能完成毕业设计,还能掌握实际工作中需要的技能。系统实现了完整的OA功能模块,包括用户管理、权限控制、流程审批等企业办公场景的核心功能。
选择技术栈时,我主要考虑了以下几个因素:
后端技术栈:
前端技术栈:
系统采用典型的前后端分离架构:
code复制┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Vue前端 │ ←→ │ SpringBoot │ ←→ │ MySQL数据库 │
│ (浏览器) │ │ (服务端) │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
这种架构的优势在于:
提示:在实际部署时,前端代码通常会打包成静态文件部署在Nginx等Web服务器上,后端则作为独立的服务运行。
用户认证是系统的门户,我们采用JWT(JSON Web Token)实现无状态认证:
java复制// JWT工具类核心代码示例
public class JwtUtil {
private static final String SECRET_KEY = "your-secret-key";
private static final long EXPIRATION = 86400000; // 24小时
public static String generateToken(UserDetails userDetails) {
return Jwts.builder()
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
.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));
}
}
关键点说明:
系统采用RBAC(基于角色的访问控制)模型:
code复制┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│ 用户 │───>│ 角色 │───>│ 权限 │───>│ 资源 │
└────────┘ └────────┘ └────────┘ └────────┘
数据库设计:
sql复制CREATE TABLE `sys_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
);
CREATE TABLE `sys_role` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `sys_user_role` (
`user_id` bigint NOT NULL,
`role_id` bigint NOT NULL,
PRIMARY KEY (`user_id`,`role_id`)
);
CREATE TABLE `sys_permission` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`url` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `sys_role_permission` (
`role_id` bigint NOT NULL,
`permission_id` bigint NOT NULL,
PRIMARY KEY (`role_id`,`permission_id`)
);
前端权限控制通过动态路由实现:
javascript复制// 路由守卫示例
router.beforeEach((to, from, next) => {
const hasToken = localStorage.getItem('token')
if (to.matched.some(record => record.meta.requiresAuth)) {
if (!hasToken) {
next('/login')
} else {
if (hasPermission(to.meta.permissions)) {
next()
} else {
next('/403')
}
}
} else {
next()
}
})
OA系统的核心是审批流程,我们设计了一个轻量级的工作流引擎:
java复制// 审批流程状态机
public enum ProcessStatus {
DRAFT("草稿"),
PENDING("待审批"),
APPROVED("已通过"),
REJECTED("已拒绝"),
CANCELLED("已取消");
private String desc;
ProcessStatus(String desc) {
this.desc = desc;
}
}
// 审批流程实体
@Entity
@Table(name = "oa_process")
public class Process {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@Enumerated(EnumType.STRING)
private ProcessStatus status;
@ManyToOne
@JoinColumn(name = "creator_id")
private User creator;
@OneToMany(mappedBy = "process", cascade = CascadeType.ALL)
private List<ProcessStep> steps = new ArrayList<>();
}
// 审批步骤实体
@Entity
@Table(name = "oa_process_step")
public class ProcessStep {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "process_id")
private Process process;
@ManyToOne
@JoinColumn(name = "approver_id")
private User approver;
private String comment;
private LocalDateTime approveTime;
@Enumerated(EnumType.STRING)
private StepStatus status;
}
流程设计要点:
审批过程中的消息通知至关重要,我们实现了多种通知方式:
java复制// 消息通知服务接口
public interface NotificationService {
void sendEmail(String to, String subject, String content);
void sendSystemMessage(Long userId, String content);
void sendSMS(String phone, String content);
}
// 系统消息实现
@Service
public class SystemNotificationService implements NotificationService {
@Autowired
private MessageRepository messageRepository;
@Override
public void sendSystemMessage(Long userId, String content) {
Message message = new Message();
message.setUserId(userId);
message.setContent(content);
message.setRead(false);
message.setCreateTime(LocalDateTime.now());
messageRepository.save(message);
// WebSocket实时推送
WebSocketServer.sendMessage(userId, content);
}
// 其他方法实现...
}
通知策略:
推荐两种部署方式:
开发环境部署:
生产环境部署:
bash复制# 后端打包命令
mvn clean package -DskipTests
# 启动命令
nohup java -jar oa-system.jar --spring.profiles.active=prod > oa.log 2>&1 &
数据库优化:
缓存策略:
java复制@Cacheable(value = "users", key = "#username")
public User findByUsername(String username) {
return userRepository.findByUsername(username);
}
前端优化:
技术选型章节:
系统设计章节:
实现章节:
演示准备:
常见问题准备:
PPT制作技巧:
这个基础OA系统可以进一步扩展为:
移动端适配:
智能办公:
云原生改造:
低代码平台:
在实际教学中,我发现很多学生对权限控制和流程引擎的实现最为困惑。建议在理解这部分代码时,先画出状态转换图和权限关系图,再对照代码理解实现逻辑。系统中有意保留了一些可优化的地方,比如缓存策略可以更精细,审批流程可以更灵活,这些都是学生可以发挥的地方。