基于Spring Boot的幼儿园管理系统
引言
在数字化转型的浪潮中,教育行业的信息化建设显得尤为重要。幼儿园作为基础教育的重要环节,其管理系统的现代化水平直接关系到教育质量和运营效率。本文将深入剖析一个基于Spring Boot的幼儿园管理系统BSKMS,从技术架构、功能实现到部署运维,为开发者提供一份完整的企业级项目实战指南。
项目概述
蓝天幼儿园管理系统(BSKMS)是一个采用前后端分离架构的综合管理平台,专为幼儿园日常运营管理而设计。系统涵盖了学生管理、教师管理、课程安排、饮食管理、物资管理等核心功能模块,为幼儿园提供全方位的数字化解决方案。
系统特色
- 多角色权限管理:支持家长、教师、管理员等多角色协同工作
- 移动端适配:提供家长移动端访问支持
- 实时数据统计:完善的报表和数据可视化功能
- 安全可靠:基于Shiro的细粒度权限控制
技术架构深度解析
后端技术栈
1. Spring Boot 2.1.3.RELEASE
Spring Boot作为项目的核心框架,提供了快速开发能力和丰富的starter依赖。通过自动配置机制,大大简化了Spring应用的初始搭建和开发过程。
java
@SpringBootApplication
public class BskmsApplication {
public static void main(String[] args) {
SpringApplication.run(BskmsApplication.class, args);
}
}
2. Apache Shiro 1.3.2安全框架
Shiro作为项目的安全框架,提供了身份认证、授权、密码加密和会话管理等功能。
Shiro配置类关键代码:
java
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 自定义拦截器
Map<String, Filter> filtersMap = new LinkedHashMap<>();
filtersMap.put("roleOrFilter", new CustomRolesAuthorizationFilter());
shiroFilterFactoryBean.setFilters(filtersMap);
// 权限配置
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/sa/**", "roles[超级管理员]");
filterChainDefinitionMap.put("/jz/**", "roleOrFilter[家长|教师|超级管理员]");
filterChainDefinitionMap.put("/ls/**", "roleOrFilter[教师|超级管理员]");
return shiroFilterFactoryBean;
}
3. MyBatis + PageHelper分页插件
MyBatis作为ORM框架,配合PageHelper实现高效的数据分页查询。
分页查询示例:
java
@Override
public Object getAllMaterialByLimit(Material materialParameter) {
int size = 0;
Integer begin = (materialParameter.getPage() - 1) * materialParameter.getLimit();
materialParameter.setPage(begin);
List<Material> rows = new ArrayList<>();
try {
rows = materialMapper.getAllMaterialByLimit(materialParameter);
size = materialMapper.countAllMaterialByLimit(materialParameter);
} catch (Exception e) {
logger.error("根据查询班级 异常", e);
}
MMGridPageVoBean<Material> vo = new MMGridPageVoBean<>();
vo.setTotal(size);
vo.setRows(rows);
return vo;
}
4. 数据库连接池配置
采用Alibaba Druid作为数据源,提供监控和统计功能。
java
@Configuration
public class DruidConfiguration {
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean servletRegistrationBean =
new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// 添加初始化参数
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "admin");
return servletRegistrationBean;
}
}
前端技术栈
1. LayUI 2.4.5
LayUI作为前端UI框架,提供了丰富的组件和模块化开发支持。
2. 辅助技术
- jQuery:简化DOM操作和Ajax请求
- Layer:弹层组件,提供友好的用户交互
- zTree:树形组件,支持权限树等复杂结构展示
核心功能模块实现
1. 系统管理模块
用户管理
用户管理功能实现了基于RBAC(基于角色的访问控制)模型的权限管理系统。
用户实体类:
java
public class User extends BaseBean {
private Integer id;
private String userId;
private String password;
private String name;
private String phone;
private Date birthday;
private Integer status;
// getter和setter方法
}
权限控制实现
通过自定义Realm实现Shiro的认证和授权逻辑:
java
public class CustomRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
// 授权逻辑实现
String username = (String) principals.getPrimaryPrincipal();
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
// 查询用户角色和权限
Set<String> roles = userService.findRoles(username);
Set<String> permissions = userService.findPermissions(username);
authorizationInfo.setRoles(roles);
authorizationInfo.setStringPermissions(permissions);
return authorizationInfo;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
// 认证逻辑实现
String username = (String) token.getPrincipal();
User user = userService.findByUsername(username);
if (user == null) {
throw new UnknownAccountException(); //账号不存在
}
if (user.getStatus() == 0) {
throw new LockedAccountException(); //账号被锁定
}
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
user.getUserId(),
user.getPassword(),
getName()
);
return authenticationInfo;
}
}
2. 班级管理模块
班级管理实现了班级信息的CRUD操作,包括班主任分配、班级位置管理等功能。
班级实体类:
java
public class Classes extends BaseBean {
private Integer id;
private String name;
private Integer teacherId;
private String describe;
private Integer count;
private String position;
private Date createTime;
// getter和setter方法
}
3. 学生管理模块
学生管理模块详细记录了学生的基本信息、兴趣爱好、饮食禁忌等。
学生实体类:
java
public class Children extends BaseBean {
private Integer id;
private String name;
private Integer sex;
private Date birthday;
private Integer classId;
private String hobby;
private String foodTaboo;
private Date enterTime;
// getter和setter方法
}
4. 物资管理模块
物资管理是系统的核心功能之一,实现了物资信息的完整生命周期管理。
物资实体设计
java
public class Material extends BaseBean {
private Integer id;
private String name;
private Integer count;
private BigDecimal price;
private String from;
private String describe;
private Date createTime;
// getter和setter方法
}
控制器实现
物资管理的控制器提供了完整的RESTful接口:
java
@Controller
@RequestMapping(value = "/sa")
public class SaController {
@Autowired
private MaterialService materialService;
// 物资管理页面
@RequestMapping(value = "/materialMG")
public String materialMG() {
return "sa/material";
}
// 分页查询物资
@RequestMapping("/getAllMaterialByLimit")
@ResponseBody
public Object getAllMaterialByLimit(Material materialParameter) {
return materialService.getAllMaterialByLimit(materialParameter);
}
// 添加物资页面
@RequestMapping(value = "/addMaterialPage")
public String addMaterialPage(Integer id, Model model) {
if (null != id) {
Material material = materialService.selectByPrimaryKey(id);
model.addAttribute("manageMaterial", material);
}
return "sa/materialAdd";
}
// 添加物资
@ResponseBody
@RequestMapping("/addMaterial")
public String addMaterial(Material material) {
try {
material.setCreateTime(new Date());
materialService.addMaterial(material);
return "SUCCESS";
} catch (Exception e) {
return "ERR";
}
}
// 更新物资
@ResponseBody
@RequestMapping("/updateMaterial")
public String updateMaterial(Material material) {
return materialService.updateMaterial(material);
}
// 批量删除物资
@RequestMapping(value = "delMaterial")
@ResponseBody
@Transactional
public String delMaterial(String[] ids) {
try {
for (String id : ids) {
materialService.delMaterialById(Integer.parseInt(id));
}
return "SUCCESS";
} catch (Exception e) {
logger.error("根据班级id删除异常", e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return "ERROR";
}
}
}
服务层实现
服务层处理业务逻辑和事务管理:
java
@Service
public class MaterialServiceImpl implements MaterialService {
@Autowired
private MaterialMapper materialMapper;
@Override
public Object getAllMaterialByLimit(Material materialParameter) {
int size = 0;
Integer begin = (materialParameter.getPage() - 1) * materialParameter.getLimit();
materialParameter.setPage(begin);
List<Material> rows = new ArrayList<>();
try {
rows = materialMapper.getAllMaterialByLimit(materialParameter);
size = materialMapper.countAllMaterialByLimit(materialParameter);
} catch (Exception e) {
logger.error("根据查询班级 异常", e);
}
MMGridPageVoBean<Material> vo = new MMGridPageVoBean<>();
vo.setTotal(size);
vo.setRows(rows);
return vo;
}
@Override
public Material selectByPrimaryKey(Integer id) {
return materialMapper.selectByPrimaryKey(id);
}
@Override
public void addMaterial(Material material) {
try {
materialMapper.insert(material);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public String updateMaterial(Material material) {
try {
materialMapper.updateByPrimaryKeySelective(material);
return "SUCCESS";
} catch (Exception e) {
logger.error("根据用户id更新用户异常", e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return "ERR";
}
}
@Override
public void delMaterialById(Integer id) {
try {
materialMapper.deleteByPrimaryKey(id);
} catch (Exception e) {
logger.error("删除用户出现异常", e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
}
5. 饮食管理模块
饮食管理模块负责幼儿园每日食谱的配置和营养分析。
饮食实体类:
java
public class Foot extends BaseBean {
private Integer id;
private String breakfast;
private String lunch;
private String dinner;
private String burden;
private String nutrition;
private String remark;
private Date createTime;
// getter和setter方法
}
6. 通知公告模块
通知公告模块实现了学校通知的发布和管理功能。
通知实体类:
java
public class Notice extends BaseBean {
private Integer id;
private String title;
private String content;
private Date createTime;
// getter和setter方法
}
数据库设计与优化
数据库表结构设计
系统采用MySQL 5.7+数据库,设计了9个核心数据表:
1. 用户表 (user)
sql
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(50) NOT NULL COMMENT '用户ID',
`password` varchar(100) NOT NULL COMMENT '密码',
`name` varchar(50) DEFAULT NULL COMMENT '姓名',
`phone` varchar(20) DEFAULT NULL COMMENT '电话',
`birthday` date DEFAULT NULL COMMENT '生日',
`status` int(1) DEFAULT '1' COMMENT '状态',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 物资表 (material)
sql
CREATE TABLE `material` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '物资名称',
`count` int(11) DEFAULT '0' COMMENT '数量',
`price` decimal(10,2) DEFAULT '0.00' COMMENT '单价',
`from` varchar(200) DEFAULT NULL COMMENT '来源',
`describe` text COMMENT '描述',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
数据库优化策略
- 索引优化:为常用查询字段添加合适的索引
- 分表分库:大数据量时采用分表策略
- 查询优化:使用PageHelper进行分页查询
- 连接池优化:配置Druid连接池参数
安全设计与实现
1. 密码加密
采用MD5加密算法对用户密码进行加密存储:
java
public class MD5 {
public static String encrypt(String source) {
if (source == null) {
source = "";
}
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(source.getBytes("UTF-8"));
return byte2hex(bytes);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String byte2hex(byte[] bytes) {
StringBuilder sign = new StringBuilder();
for (byte aByte : bytes) {
String hex = Integer.toHexString(aByte & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex.toUpperCase());
}
return sign.toString();
}
}
2. SQL注入防护
通过MyBatis的参数绑定机制防止SQL注入:
xml
<select id="getAllMaterialByLimit" parameterType="com.bskms.bean.Material"
resultType="com.bskms.bean.Material">
SELECT * FROM material
WHERE 1=1
<if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
ORDER BY create_time DESC
LIMIT #{page}, #{limit}
</select>
3. XSS攻击防护
在前端使用LayUI的表单验证,后端对用户输入进行过滤:
java
public String filterXSS(String value) {
if (value == null) {
return null;
}
value = value.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll("'", "'")
.replaceAll("\"", """);
return value;
}
性能优化策略
1. 缓存策略
使用Shiro的内存缓存管理会话信息:
java
@Bean
public SecurityManager securityManager(CustomRealm customRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(customRealm);
securityManager.setSessionManager(sessionManager());
securityManager.setCacheManager(new MemoryConstrainedCacheManager());
return securityManager;
}
2. 数据库连接池优化
配置Druid连接池参数:
properties
# 初始化连接数
spring.datasource.initialSize=5
# 最小空闲连接数
spring.datasource.minIdle=5
# 最大活跃连接数
spring.datasource.maxActive=20
# 获取连接等待超时时间
spring.datasource.maxWait=60000
# 配置间隔多久才进行一次检测
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 连接在池中最小生存的时间
spring.datasource.minEvictableIdleTimeMillis=300000
3. 前端性能优化
- 使用CDN加速静态资源加载
- 压缩CSS和JavaScript文件
- 图片懒加载和缓存策略
部署与运维
1. 环境要求
- JDK 1.8或更高版本
- MySQL 5.7或更高版本
- Maven 3.5或更高版本
2. 数据库部署
bash
# 创建数据库
mysql -uroot -p -e "CREATE DATABASE bskms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 执行初始化脚本
mysql -uroot -p bskms < bskms-2019-06-22.sql
3. 项目部署
方式一:使用Maven打包部署
bash
# 清理并打包
mvn clean package
# 运行项目
java -jar target/bskms.jar
方式二:使用Spring Boot Maven插件
bash
mvn spring-boot:run
4. 多环境配置
系统支持多环境配置,通过不同的配置文件实现:
- 开发环境:application-dev.properties
- 生产环境:application-prod.properties
- 测试环境:application-test.properties
系统界面展示
登录界面
系统采用简洁的登录界面设计,支持多角色登录:
系统首页
Dashboard设计,展示关键数据统计和快捷操作:
班级管理
完整的班级信息维护界面:
学生管理
学生信息管理,支持导入导出功能:
物资管理
物资信息的增删改查和统计功能:
开发经验总结
1. 架构设计经验
- 采用分层架构,明确各层职责
- 前后端分离,提高开发效率
- 模块化设计,便于维护和扩展
2. 技术选型考量
- Spring Boot提供快速开发能力
- Shiro满足复杂权限控制需求
- MyBatis提供灵活的SQL控制
- LayUI降低前端开发难度
3. 性能优化建议
- 数据库查询优化是关键
- 合理使用缓存提升性能
- 前端资源压缩和CDN加速
4. 安全防护措施
- 密码加密存储
- SQL注入防护
- XSS攻击过滤
- 权限细粒度控制
结语
BSKMS幼儿园管理系统作为一个完整的企业级应用,不仅在功能上满足了幼儿园日常管理的需求,在技术实现上也体现了现代Java开发的最佳实践。通过本文的详细解析,希望能为开发者提供有价值的参考,特别是在Spring Boot项目开发、权限管理系统设计、数据库优化等方面。
项目的成功离不开良好的架构设计、严谨的编码规范和持续的优化改进。希望这个项目能够为教育行业的信息化建设贡献一份力量,也为Java开发者提供一个优秀的学习案例。
源码获取 :https://mbd.pub/o/bread/YZWXlZtsbQ==