基于Spring Boot与Vue的养老院信息管理平台设计与实现
系统运行环境
后端技术栈: Java 语言,采用 Spring Boot 框架构建服务层,JDK 版本为 1.8,服务器容器使用 Tomcat 7。
数据库: MySQL 5.7(需确保版本一致),通过 Navicat 11 进行数据管理。
前端开发: 基于 Vue.js 构建用户界面,打包后部署于静态资源目录。
开发工具: 支持 Eclipse、MyEclipse 或 IntelliJ IDEA,Maven 构建工具版本为 3.3.9。
访问路径:
- 管理员后台地址:
http://localhost:8080/项目名/admin/dist/index.html - 前台页面地址:
http://localhost:8080/项目名/front/dist/index.html(如无独立前台可忽略)
默认登录账户: 账号:admin,密码:admin
核心技术选型说明
Java 编程语言
Java 是一种强类型的面向对象编程语言,具备良好的跨平台能力。其核心特性包括封装、继承和多态,支持模块化开发,提升代码复用性与可维护性。Java 内置自动垃圾回收机制和异常处理体系,增强了程序稳定性。此外,Java 提供丰富的类库支持网络通信、文件操作和数据库交互,广泛应用于企业级应用开发中。
Spring Boot 框架
Spring Boot 是基于 Spring 的快速开发框架,极大简化了传统 Spring 项目的配置流程。它通过自动装配机制预设常用组件,减少手动配置工作量。内置 Tomcat 容器支持独立运行,同时整合 MyBatis-Plus 等持久层框架,便于实现数据访问逻辑。Spring Boot 还提供统一依赖管理,避免版本冲突,显著提升开发效率,特别适合中小型系统的快速搭建。
MySQL 数据库系统
MySQL 是一款开源的关系型数据库管理系统,属于 Oracle 公司产品线。以其高性能、高可靠性和易用性著称,广泛用于 Web 应用的数据存储。MySQL 支持标准 SQL 语法,结构清晰,学习成本低。其事务处理机制保障数据一致性,权限控制模型确保系统安全。结合 InnoDB 存储引擎,支持外键约束与行级锁,适用于复杂业务场景下的数据管理需求。
系统功能展示
系统涵盖老人信息管理、员工调度、健康档案记录、费用结算、访客登记及内部论坛交流等核心模块。界面采用响应式布局,适配不同终端设备。
关键代码实现
以下为文件上传与论坛模块的核心接口实现:
package com.controller;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
@RestController
@RequestMapping("/upload")
public class FileUploadController {
@Autowired
private SystemConfigService configService;
/**
* 文件上传接口
*/
@PostMapping("/file")
public ResponseEntity<Map<String, Object>> uploadFile(
@RequestParam("file") MultipartFile file,
@RequestParam(value = "type", required = false) String category) {
if (file.isEmpty()) {
return ResponseEntity.badRequest().body(Map.of("msg", "文件为空"));
}
// 获取原始扩展名
String ext = file.getOriginalFilename().substring(
file.getOriginalFilename().lastIndexOf(".") + 1);
String fileName = System.currentTimeMillis() + "_" +
new Random().nextInt(1000) + "." + ext;
try {
// 构建上传路径
File basePath = new File(ResourceUtils.getURL("classpath:static").getPath());
if (!basePath.exists()) basePath = new File("");
File targetDir = new File(basePath.getAbsolutePath(), "/upload/");
if (!targetDir.exists()) targetDir.mkdirs();
File targetFile = new File(targetDir, fileName);
file.transferTo(targetFile);
// 可选:复制到固定资源路径(防止重启丢失)
// FileUtils.copyFile(targetFile, new File("D:/your_project_path/static/upload/" + fileName));
// 若为特定类型,更新系统配置
if ("faceImage".equals(category)) {
SystemConfig config = configService.getConfigByName("elderPhoto");
if (config == null) {
config = new SystemConfig();
config.setName("elderPhoto");
}
config.setValue(fileName);
configService.saveOrUpdate(config);
}
return ResponseEntity.ok(Map.of("fileName", fileName));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(500).body(Map.of("msg", "上传失败"));
}
}
/**
* 文件下载接口
*/
@GetMapping("/download")
public ResponseEntity<byte[]> downloadFile(@RequestParam String name) {
try {
File base = new File(ResourceUtils.getURL("classpath:static").getPath());
File uploadDir = new File(base, "upload/");
File file = new File(uploadDir, name);
if (!file.exists()) {
return ResponseEntity.notFound().build();
}
byte[] data = FileUtils.readFileToByteArray(file);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", name);
return new ResponseEntity<>(data, headers, HttpStatus.OK);
} catch (Exception e) {
return ResponseEntity.status(500).build();
}
}
}
package com.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.utils.PageUtils;
import com.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/discussion")
public class DiscussionForumController {
@Autowired
private ForumPostService postService;
/**
* 分页查询帖子列表(支持权限过滤)
*/
@GetMapping("/list")
public R getPostList(
@RequestParam Map<String, Object> params,
HttpServletRequest request) {
QueryWrapper<ForumPost> wrapper = new QueryWrapper<>();
// 非管理员仅查看个人发布内容
String role = (String) request.getSession().getAttribute("role");
if (!"admin".equals(role)) {
Long userId = (Long) request.getSession().getAttribute("userId");
wrapper.eq("user_id", userId);
}
Page<ForumPost> page = postService.page(new Page<>((Integer)params.get("page"),
(Integer)params.get("limit")), wrapper);
return R.ok().put("data", new PageUtils(page));
}
/**
* 发布新帖
*/
@PostMapping("/publish")
public R publishPost(@RequestBody ForumPost post, HttpServletRequest request) {
Long userId = (Long) request.getSession().getAttribute("userId");
post.setUserId(userId);
post.setId(System.currentTimeMillis() + Math.round(Math.random() * 1000));
post.setCreateTime(new Date());
post.setStatus("normal");
postService.save(post);
return R.ok("发布成功");
}
/**
* 删除多个帖子
*/
@PostMapping("/remove")
public R deletePosts(@RequestBody Long[] ids) {
postService.removeByIds(Arrays.asList(ids));
return R.ok("删除成功");
}
/**
* 根据ID获取详情
*/
@GetMapping("/info/{id}")
public R getDetail(@PathVariable Long id) {
ForumPost post = postService.getById(id);
return R.ok().put("data", post);
}
}
系统测试策略
系统在本地环境中完成部署后,实施了完整的测试流程。测试阶段包含单元测试、集成测试以及用户验收测试。采用黑盒与白盒相结合的方法验证功能正确性与代码覆盖率。依据 Pareto 原则,重点针对高频使用模块进行深度测试,优先检测核心业务路径。测试计划从需求分析阶段即开始制定,确保每个功能点均可追溯至原始需求。通过边界值分析、等价类划分等方式设计测试用例,力求全面覆盖各类输入场景。
总结与展望
本养老院管理系统实现了机构日常运营所需的主要功能,具备良好的扩展性与可维护性。系统采用前后端分离架构,前端使用 Vue 实现动态交互,后端基于 Spring Boot 快速构建 RESTful 接口,整体结构清晰,便于后续迭代升级。数据库选用 MySQL,保证了数据的一致性与安全性。未来可进一步引入定时任务实现健康提醒、费用催缴等功能,并接入智能硬件采集生理指标,推动智能化养老服务发展。