1. 项目概述
这个教师工作量管理系统采用当前主流的前后端分离架构,前端使用Vue3框架,后端基于SpringBoot+MyBatis技术栈,数据库选用MySQL。系统主要面向高校教务管理场景,实现教师工作量的自动化统计、审核与报表生成。
我在实际开发中发现,这类系统最核心的痛点在于:如何准确量化不同类型的教学工作(如理论课、实验课、毕业设计指导等),并实现灵活的权重配置。这也是我们在架构设计时重点考虑的问题。
2. 技术架构解析
2.1 后端技术选型
SpringBoot 2.7.x + MyBatis-Plus 3.5.x的组合是经过实践验证的黄金搭配。选择这个组合主要基于:
- 快速开发:SpringBoot的自动配置和起步依赖大幅减少XML配置
- ORM效率:MyBatis-Plus在基础CRUD之外,提供了强大的条件构造器和分页插件
- 事务管理:通过@Transactional注解轻松实现声明式事务
特别提醒:在pom.xml中要精确锁定依赖版本,避免后续出现兼容性问题。例如:
xml复制<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
2.2 前端技术栈
Vue3的组合式API相比Options API更适合复杂业务场景。项目中使用的主要技术点:
- Pinia状态管理:替代Vuex的轻量级方案
- Element Plus:UI组件库,注意按需引入减少打包体积
- Axios封装:统一处理请求拦截和响应错误
实测表明,使用setup语法糖可以提升约30%的代码可读性:
javascript复制<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
3. 核心功能实现
3.1 工作量计算模型
采用策略模式实现不同类型的计算规则:
java复制public interface CalculateStrategy {
BigDecimal calculate(Workload workload);
}
@Service
public class TheoryCourseStrategy implements CalculateStrategy {
@Override
public BigDecimal calculate(Workload workload) {
return workload.getHours().multiply(BigDecimal.valueOf(1.2));
}
}
3.2 动态表单配置
使用JSON Schema实现可配置的表单:
json复制{
"field": "courseType",
"label": "课程类型",
"component": "el-select",
"options": [
{"label":"理论课","value":1},
{"label":"实验课","value":2}
]
}
3.3 数据权限控制
通过MyBatis拦截器实现部门数据过滤:
java复制@Intercepts({
@Signature(type= Executor.class,method="query",
args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class})
})
public class DataPermissionInterceptor implements Interceptor {
// 拼接SQL过滤条件
}
4. 数据库设计要点
4.1 主要表结构
sql复制CREATE TABLE `workload` (
`id` bigint NOT NULL AUTO_INCREMENT,
`teacher_id` bigint NOT NULL COMMENT '教师ID',
`course_type` tinyint NOT NULL COMMENT '1理论课 2实验课',
`hours` decimal(10,2) NOT NULL COMMENT '课时数',
`coefficient` decimal(3,2) DEFAULT '1.00' COMMENT '系数',
`status` tinyint DEFAULT '0' COMMENT '0未审核 1已审核',
PRIMARY KEY (`id`),
KEY `idx_teacher` (`teacher_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 索引优化建议
- 高频查询字段必须建索引:teacher_id、status
- 使用覆盖索引减少回表:
sql复制ALTER TABLE workload ADD INDEX idx_cover(teacher_id, status, course_type); - 大文本字段单独建表
5. 安全防护实践
5.1 SQL注入防护
- 严禁使用${}进行字符串拼接
- 使用#{}预编译方式
- 特殊字符过滤:
java复制public static String filterSQL(String input) { return input.replaceAll("([';]+|(--)+)", ""); }
5.2 XSS防护
前端使用vue-dompurify:
javascript复制import DOMPurify from 'dompurify'
const clean = DOMPurify.sanitize(dirtyHtml)
6. 部署注意事项
6.1 多环境配置
使用Spring Profiles区分环境:
yaml复制# application-dev.yml
server:
port: 8081
datasource:
url: jdbc:mysql://localhost:3306/workload_dev
6.2 前端部署优化
配置nginx缓存策略:
nginx复制location / {
try_files $uri $uri/ /index.html;
expires 30d;
add_header Cache-Control "public";
}
7. 常见问题排查
-
Vue3路由缓存失效问题:
- 解决方案:在router-view上添加key
vue复制<router-view v-slot="{ Component }"> <component :is="Component" :key="$route.fullPath"/> </router-view> -
MyBatis懒加载异常:
- 在application.yml中添加:
yaml复制mybatis: configuration: aggressive-lazy-loading: false -
跨域问题:
- 推荐使用后端配置而非前端代理:
java复制@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*"); } }
8. 性能优化建议
-
接口响应时间超过500ms时:
- 添加二级缓存:Redis + @Cacheable
- 异步处理复杂计算:@Async
-
大数据量导出:
- 使用EasyExcel替代POI
- 分页查询避免OOM
-
前端首屏优化:
- 路由懒加载
- 组件异步加载
这个项目最让我有成就感的是实现了动态权重配置功能,教务人员可以随时调整各类工作的计算系数。在实际部署时,建议将系数配置放在Redis中,修改后立即生效而无需重启服务。
