基于SpringBoot+Vue健身房管理系统的设计与实现

系统介绍
在新冠疫情期间,健身房管理系统主要采用Java语言进行开发,基于B/S架构设计,并采用Spring Boot框架进行开发.系统的运行数据将被存储于MySQL数据库中.该系统主要由管理员控制模块以及会员/教练操作模块两部分构成.其中,管理员能够维护用户信息、会员信息、健身课程信息、健身预约记录、课程预约记录等.而教练则对健身课程安排、健身预约记录等进行相关操作.此外,会员/客户也可以通过系统查询健身预约记录、课程预约记录以及器材租借状态等信息,并可自行设定个人健康目标与计划.该系统的界面设计合理,功能配置全面,有效提升了用户的使用体验感.
系统主要技术
开发语言:Java
使用框架:spring boot
前端技术:JavaScript、Vue 、css3
开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code
数据库:MySQL 5.7/8.0
数据库管理工具:phpstudy/Navicat
JDK版本:jdk1.8
Maven: apache-maven 3.8.1-bin

系统展示
健身房管理系统由三个部分构成:其中包含三个部分:用户端(如个人账户)、教练端(如课程安排)以及管理层(如权限控制)。主要包括:健身教练模块负责日常教学安排;健身课程模块提供各类课程资源;健身器材模块展示 available equipment;健身商品模块展示 available items;健身场地模块展示 available facilities;新闻活动模块发布 fitness-related news;留言板模块用于 user interaction;后台管理模块负责 data management and security;购物车模块实现 orders management;个人中心模块提供 user information management. 系统软件的功能模块图见图3-1

4.1 管理员功能模块
系统管理员在系统中通过输入用户名、密码以及选择相应的角色信息完成了 login 流程(如图所示)。

图4-1管理员登录界面图
通过管理员登录至健身房管理系统系统界面进行身份验证后,在线访问个人中心及各类资源模块(包括但不仅限于:首页信息展示区)进行相应的操作流程(如课程安排查询与报名)、功能设置与参数调整等事务处理工作(如系统权限分配与权限划分),最终完成相应的操作流程并保存相关数据记录(如课程安排变更确认与报名提交确认),系统将自动生成相应的操作记录作为可追溯的电子凭证(如课程安排变更记录与报名提交记录),并将在指定时间打印生成纸质版凭证(如课程安排变更通知单与报名提交收据)。

图4-2管理员功能界面图
管理员点击进入用户管理界面:通过用户管理页面进行录入账号信息,并完成查询功能以及新增记录或删除记录的操作。

图4-3用户管理界面图
在 coach 管理页面中点击管理员账号,在 coach 管理功能下录入教练的基本信息内容:包括教练账号信息字段录入以及各项属性设置等操作步骤

图4-4教练管理界面图
管理员通过点击"健身教练管理"按钮启动该功能。在页面中输入 coach account, coach name, 性别, avatar, years of teaching experience, height (cm), weight (kg), 和专长领域等信息。用于查询或删除 coach information. 如图4-5所示。

图4-5健身教练管理界面图
管理人员点击健身课程管理模块,在健身课程管理页面上对课程名称、封面、课程类型、目标、部位、强度、场地名称、上课时间、预约人数、教练账号以及教练姓名等信息内容进行查询或删除操作,请参考图4-6
图4-6健身课程管理界面图
管理员点击"健身预约管理"功能:在"健身预约管理"页面中对约定了编号(账号)、教练账号(姓名)、场地信息(地址)、安排时间(备注)、相关账号(姓名)、手机号码等项目进行查询或删除操作(如图4-8所示)。

图4-7健身预约管理界面图
管理员单击课程预约管理按钮:在'课程预约管理'页面上对'健身类型' '场地名称' '上课时间' '预约人数' '教练账号' '教练姓名' '报名时间' '报名备注' '账号' '姓名' '手机号码' '审核回复'以及'审核状态'等信息进行查询或删除操作 如图4-8所示

图4-8课程预约管理界面图
4.2用户功能模块实现
用户进入后台管理界面后,随后跳转至系统后端,并对首页、个人中心以及包括健身预约、课程预约、器材租借等各项功能进行操作,如图4-9所示

图4-9用户功能主界面
4.3教练功能模块实现
指导人员在系统界面单击登录按钮,在完成信息录入后执行登录操作(如图4-10及图4-11所示)

图4-10教练登录界面
教练登录系统后具备相应的功能模块供使用者完成相应的操作流程。例如,在页面上可操作的功能包括首页、个人中心以及多个管理系统等。

图4-11教练功能主界面
4.4前台系统功能模块
网站首页页面主要包含首页功能、专业指导人员以及多样化的健身课程内容,并根据用户需求提供详细的指导方案;如图4-12所示。

图4-12网站首页界面图
在注册过程中会执行密码验证步骤,在此过程中如果用户的输入与系统预设的密码不一致则不会允许其完成注册流程以确保数据安全这种机制旨在防止用户因输入错误密码而导致使用不便例如附图中的界面展示即为用户注册成功的页面如图4-13所示

图4-13用户注册界面图
用户将在该界面实施身份验证和登录操作,在此页面提交数据给后台之前对表单中的用户名和密码进行格式检查,并确保输入的信息不能为空,并给出相应的提示信息;下图展示的是用户登录成功页面。

图4-14用户登录界面图
用户进入健身教练页面,在搜索栏输入 coach 账号和信息。该页面具备 coach 查询功能。此外还可以在 coach 页面浏览其个人资料信息以及身材参数等细节内容。此外还能查看 coaches 的专长领域以及职业履历等背景资料。在 coaches 页面上可记录 fitness 培训课程安排以及其他相关记录信息,并选择关注与收藏感兴趣的内容。点击后还可以进行 fitness 记录或其他操作等操作选项。如图4-15所示

图4-15健身教练界面图
用户在健身商品页面点击,在搜索栏内依次输入商品名称、品牌名称以及生产商信息,并完成信息检索;即可浏览其名称信息以及价格等详细内容;还可以了解其成分与功能,并加入购物车列表或者完成购买与收藏操作;如图4-16所示。

图4-16健身商品界面图
当用户点击进入个人中心时,在该页面上可以完成个人信息的更新以及密码的更改。接着,用户还可以对订单信息、地址信息以及收藏记录进行具体管理,请参考图4-17。

图4-17个人中心界面图
部分核心代码
/** * 登录相关
*/
@RequestMapping("users")
@RestController
public class UsersController {
@Autowired
private UsersService usersService;
@Autowired
private TokenService tokenService;
/** * 登录
*/
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
UsersEntity user = usersService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username));
if(user==null || !user.getPassword().equals(password)) {
return R.error("账号或密码不正确");
}
String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
R r = R.ok();
r.put("token", token);
r.put("role",user.getRole());
r.put("userId",user.getId());
return r;
}
/** * 注册
*/
@IgnoreAuth
@PostMapping(value = "/register")
public R register(@RequestBody UsersEntity user){
// ValidatorUtils.validateEntity(user);
if(usersService.selectOne(new EntityWrapper<UsersEntity>().eq("username", user.getUsername())) !=null) {
return R.error("用户已存在");
}
usersService.insert(user);
return R.ok();
}
/** * 退出
*/
@GetMapping(value = "logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("退出成功");
}
/** * 修改密码
*/
@GetMapping(value = "/updatePassword")
public R updatePassword(String oldPassword, String newPassword, HttpServletRequest request) {
UsersEntity users = usersService.selectById((Integer)request.getSession().getAttribute("userId"));
if(newPassword == null){
return R.error("新密码不能为空") ;
}
if(!oldPassword.equals(users.getPassword())){
return R.error("原密码输入错误");
}
if(newPassword.equals(users.getPassword())){
return R.error("新密码不能和原密码一致") ;
}
users.setPassword(newPassword);
usersService.updateById(users);
return R.ok();
}
/** * 密码重置
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request){
UsersEntity user = usersService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username));
if(user==null) {
return R.error("账号不存在");
}
user.setPassword("123456");
usersService.update(user,null);
return R.ok("密码已重置为:123456");
}
/** * 列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,UsersEntity user){
EntityWrapper<UsersEntity> ew = new EntityWrapper<UsersEntity>();
PageUtils page = usersService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
return R.ok().put("data", page);
}
/** * 列表
*/
@RequestMapping("/list")
public R list( UsersEntity user){
EntityWrapper<UsersEntity> ew = new EntityWrapper<UsersEntity>();
ew.allEq(MPUtil.allEQMapPre( user, "user"));
return R.ok().put("data", usersService.selectListView(ew));
}
/** * 信息
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") String id){
UsersEntity user = usersService.selectById(id);
return R.ok().put("data", user);
}
/** * 获取用户的session用户信息
*/
@RequestMapping("/session")
public R getCurrUser(HttpServletRequest request){
Integer id = (Integer)request.getSession().getAttribute("userId");
UsersEntity user = usersService.selectById(id);
return R.ok().put("data", user);
}
/** * 保存
*/
@PostMapping("/save")
public R save(@RequestBody UsersEntity user){
// ValidatorUtils.validateEntity(user);
if(usersService.selectOne(new EntityWrapper<UsersEntity>().eq("username", user.getUsername())) !=null) {
return R.error("用户已存在");
}
usersService.insert(user);
return R.ok();
}
/** * 修改
*/
@RequestMapping("/update")
public R update(@RequestBody UsersEntity user){
// ValidatorUtils.validateEntity(user);
usersService.updateById(user);//全部更新
return R.ok();
}
/** * 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
List<UsersEntity> user = usersService.selectList(null);
if(user.size() > 1){
usersService.deleteBatchIds(Arrays.asList(ids));
}else{
return R.error("管理员最少保留一个");
}
return R.ok();
}
}

[gitCode源码哆哆入口

https://gitcode.com/yuanmadd/ymgg/blob/main/README.md?init=initTree](https://gitcode.com/yuanmadd/ymgg/blob/main/README.md?init=initTree "gitCode源码哆哆入口")
