博主介绍:✌全网粉丝3W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌
博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦
🍅开源项目免费哦:点击这里克隆或者下载 🍅
🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟
✨【微服务】Nacos为什么丢弃短连接(http)而选择拥抱长连接(gRPC)
目录
一、前言
二、系统设计
1、系统运行环境
2、系统架构设计编辑
3、项目结构
3.1、后端项目
3.2、vue项目
3.3、uniapp项目
4、登录设计
5、管理员维护订单时序图设计:
三、非功能性与可行性分析
四、功能截图
1、首页
1.1、真机调试扫码
1.2、团体课
2、购买课程
2.1、真机调试导航
2.2、也可以返回
3、首页点击团课
3.1、首页点击私教
3.2、首页点击私教包月
3.3、首页点击vip会员卡
4、门店
4.1、门店列表
4.2、点击地图可以定位门店在地图上的位置,点击门店跳转到门店详情
PC端:
5、登录界面与首页
5.1、登录界面
5.2、首页
6、运营基础
7、会员管理
7.1、会员信息
7.2、会员等级
8、app配置
8.1、首页轮播图
9、营销管理
9.1、VIP会员卡
10、门店管理
10.1、门店信息
10.2、教练列表
11、优惠券管理
11.1、优惠券配置
12、系统管理
12.1、用户管理
12.2、角色管理
12.3、菜单管理
12.4、部门管理
12.5、岗位管理
12.6、字典管理
五、后端代码实现
1、角色控制器
2、服务接口
3、实现类
六、uniapp教程(需求分析、各模块及其节点文档、各模块案例)
六、获取源码
一、前言
纵观当下世界,科学技术日新月异,信息技术节节攀高,经济活动也越发高涨。一方面,信息科技迅猛发展带来了信息时代的兴起,其中互联网技术自出现以来便吸引了全球人类的目光,深刻地变革了人类的生存及生活方式;而另一方面,经济活动的快速发展也对安全和便利提出了更高、更为严苛的要求。人们不仅仅满足于有一个好工作,更加关注于自己的生活方方面面,而健身也是工作者下班后或周末经常提及的。但是对于健身场所的数据信息等没有及时获悉,而错过一些上课机会等等。故该健身系统app可以实时给客户提供健身馆的最新消息,环境、设备以及课程等消息,方便客户掌握健身馆的最新动态;同时也方便健身馆吸引客户,管理与运营等。
二、系统设计
1、系统运行环境
开发系统:Windows10
架构模式:MVC/前后端分离
JDK版本:Java JDK1.8
开发工具:IDEA
数据库版本: mysql5.7
数据库可视化工具: SQL yog或Navicat for MySQL
服务器:SpringBoot自带 apache tomcat
主要技术:Java、SpringBoot、MyBatis-plus、SpringSecurity、JWT、MySQL、Redis、Uniapp、Html、Vue、Elementui等
2、系统架构设计
3、项目结构
3.1、后端项目
3.2、vue项目
3.3、uniapp项目
4、登录设计
借鉴微服务单点登录设计
5、管理员维护订单时序图设计:
三、非功能性与可行性分析
2.5非功能性需求分析
非功能性需求:用户对软件质量属性、运行环境、资源约束、外部接口等方面的要求或期望,包括:
2.5.1性能需求:
用户在软件响应速度、结果精度、运行时资源消耗量等方面的要求。
2.5.2可行性需求:
用户在软件失效的频率、严重程度、易恢复性,以及故障可预测性等方面的要求。
2.5.3易用性需求:
用户在界面的易用性、美观性,以及对面向用户的文档和培训资料等方面的要求。
2.5.4安全性需求:
用户在身份证、授权控制、私密性等方面的要求。
2.5.5运行环境约束:
用户对软件系统运行环境的要求。
2.5.6外部接口:
用户对待开发软件系统与其它软件系统或设备之间的接口要求
2.6可行性分析
可行性分析是从不同的角度,对可能影响系统的各方面因素进行分析,确认系统在实际生活上是可行的。本系统只是单纯地从经济、法律、技术、操作可行性四个方面来分析说明。
2.6.1技术可行性
技术上的可行性分析主要分析技术条件能否顺利完成开发工作,软、硬件能否满足需要。本系统采用Vue+Elementui开发出友好美观的人机界面,便于用户理解、操作。数据库管理系统采用MySQL,它能够处理大量数据,同时保持数据的完整性、安全性和持久性。后端技术使用SpringBoot、MyBatis,这些技术在许多公司已经被商用了,因此本系统的开发平台已成熟可行。硬件方面,在科技飞速发展的今天,硬件更新速度越来越快,容量越来越大,可靠性越来越高,价格越来越便宜,因此硬件平台也能够满足本系统所需。
2.6.2经济可行性
项目放在阿里学生服务器或者本地虚拟机的linux环境,故可行。
2.6.3法律可行性
可行,自己写的项目,目的明确,没有违法违规。
2.6.4操作可行性
操作较为简单,而且当下信息科技发达,界面的设计也着实考虑到用户的体验,系统也是为用户而生。故操作是可行的,不存在难度大的操作。
四、功能截图
uniapp会员端:
1、首页
1.1、真机调试扫码
1)点击扫一扫
2)可直接扫码、也可以扫描相册里面的码
3)扫描提示
1.2、团体课
日历可以动态调节,课程信息与之匹配。点击具体课程可以跳转到购买课程页面
2、购买课程
如果是视频,需要可以播放;如果是图片展示图片
2.1、真机调试导航
1)点击到这去
2)点击右下角
3)任选其一或取消
4)可选择打车、驾车、公共交通等
2.2、也可以返回
3、首页点击团课
3.1、首页点击私教
3.2、首页点击私教包月
3.3、首页点击vip会员卡
4、门店
4.1、门店列表
1)点击具体门店可以跳转到具体门店,同样具备与首页类似数据
2)同样点击课程跳转到购买课程
4.2、点击地图可以定位门店在地图上的位置,点击门店跳转到门店详情
我的
PC端:
5、登录界面与首页
5.1、登录界面
5.2、首页
6、运营基础
6.1、课程管理
7、会员管理
7.1、会员信息
7.2、会员等级
8、app配置
8.1、首页轮播图
9、营销管理
9.1、VIP会员卡
10、门店管理
10.1、门店信息
10.2、教练列表
11、优惠券管理
11.1、优惠券配置
12、系统管理
12.1、用户管理
12.2、角色管理
12.3、菜单管理
12.4、部门管理
12.5、岗位管理
12.6、字典管理
五、后端代码实现
1、角色控制器
/**
* <p>
* 角色表 前端控制器
* </p>
*
* @author CeaM
* @since 2023-01-28
*/
@RestController
@AllArgsConstructor
@RequestMapping("/api/roles")
public class CeamSysRoleController {
private final ICeamSysRoleService ceamSysRoleService;
private final ICeamSysUserService ceamSysUserService;
@GetMapping
public ResponseEntity<IPage<CeaMSysRoleVO>> getRoles(PageableDTO pageable) {
IPage<CeaMSysRoleVO> mapIPage = ceamSysRoleService.pageCeaMSysRoleVO(pageable);
return ResponseEntity.ok(mapIPage);
}
@GetMapping(value = "/level")
public ResponseEntity<Object> getLevel() {
return new ResponseEntity<>(Dict.create().set("level", getLevels(null)), HttpStatus.OK);
}
@PutMapping(value = "/menu")
public ResponseEntity<Object> updateMenu(@RequestBody CeaMSysRoleDTO roleDTO) {
CeamSysRole role = ceamSysRoleService.getById(roleDTO.getId());
getLevels(role.getLevel());
ceamSysRoleService.updateMenu(roleDTO, role);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
/**
* 获取用户的角色级别
* @return /
*/
private int getLevels(Integer level) {
CeaMSysUserDTO user = ceamSysUserService.loadUserInfo(SecurityUtils.getUsername());
List<RoleDTO> roleDTOS = ceamSysRoleService.listByUserId(user.getId());
List<Integer> levels = roleDTOS.stream().map(RoleDTO::getLevel).collect(Collectors.toList());
int min = Collections.min(levels);
if (level != null) {
if (level < min) {
throw new ServiceException("权限不足,你的角色级别:" + min + ",低于操作的角色级别:" + level);
}
}
return min;
}
}
2、服务接口
/**
* <p>
* 角色表 服务类
* </p>
*
* @author CeaM
* @since 2023-01-28
*/
public interface ICeamSysRoleService extends IService<CeamSysRole> {
IPage<CeaMSysRoleVO> pageCeaMSysRoleVO(PageableDTO pageable);
/**
* 获取用户权限信息
* @param userId 用户信息
* @return 权限信息
*/
Collection<SimpleGrantedAuthority> grantedAuthorities(Long userId);
/**
*
* @param userId 用户ID
* @return RoleItemVOs
*/
List<RoleDTO> listByUserId(Long userId);
void updateMenu(CeaMSysRoleDTO roleDTO, CeamSysRole role);
}
3、实现类
/**
* <p>
* 角色表 服务实现类
* </p>
*
* @author CeaM
* @since 2023-01-28
*/
@Slf4j
@Service
@AllArgsConstructor
public class CeamSysRoleServiceImpl extends ServiceImpl<CeamSysRoleMapper, CeamSysRole> implements ICeamSysRoleService {
private ICeamSysMenuService ceamSysMenuService;
private ICeamRoleMenuService ceamRoleMenuService;
@Override
public IPage<CeaMSysRoleVO> pageCeaMSysRoleVO(PageableDTO pageable) {
LambdaQueryWrapper<CeamSysRole> queryWrapper = Wrappers.<CeamSysRole>lambdaQuery()
.eq(CeamSysRole::getDeleted, GlobalConstants.FALSE);
Page<CeamSysRole> page = new Page<>(pageable.getPage(), pageable.getSize());
// 手动设置当前页,不然分页失效
page.setCurrent((long)pageable.getPage() + GlobalConstants.ONE);
Page<CeamSysRole> ceamSysRolePage = page(page, queryWrapper);
IPage<CeaMSysRoleVO> ceaMSysRoleVOIPage = PageVOUtil.copyToPageVO(ceamSysRolePage, CeaMSysRoleVO.class);
for (CeaMSysRoleVO role : ceaMSysRoleVOIPage.getRecords()) {
List<MenuDTO> menuDTOS = ceamSysMenuService.findByRoleId(role.getId(), GlobalConstants.ZERO);
role.setMenus(menuDTOS);
}
return ceaMSysRoleVOIPage;
}
@Override
public Collection<SimpleGrantedAuthority> grantedAuthorities(Long userId) {
List<RoleDTO> roleItemDTOS = this.baseMapper.listByUserId(userId);
if (CollectionUtils.isEmpty(roleItemDTOS)) {
throw new ServiceException("没有分配角色");
}
List<MenuDTO> menuDTOS = ceamSysMenuService.findByRoles(roleItemDTOS, GlobalConstants.ZERO);
// 角色
Set<String> permissions = roleItemDTOS.stream()
.filter(role -> StringUtils.isNotBlank(role.getName()))
.map(RoleDTO::getName).collect(Collectors.toSet());
permissions.addAll(
menuDTOS.stream()
.filter(menu -> StringUtils.isNotBlank(menu.getPermission()))
.map(MenuDTO::getPermission).collect(Collectors.toSet())
);
return permissions.stream().map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());
}
@Override
public List<RoleDTO> listByUserId(Long userId) {
return this.baseMapper.listByUserId(userId);
}
@Override
public void updateMenu(CeaMSysRoleDTO roleDTO, CeamSysRole role) {
if (roleDTO.getMenus().size() > 0) {
List<CeamRoleMenu> rolesMenusList = roleDTO.getMenus().stream().map(i -> {
CeamRoleMenu rolesMenus = new CeamRoleMenu();
rolesMenus.setRoleId(roleDTO.getId());
rolesMenus.setMenuId(i.getId());
return rolesMenus;
}).collect(Collectors.toList());
ceamRoleMenuService.remove(new LambdaQueryWrapper<CeamRoleMenu>()
.eq(CeamRoleMenu::getRoleId, roleDTO.getId()));
ceamRoleMenuService.saveBatch(rolesMenusList);
}
}
}
六、uniapp教程(需求分析、各模块及其节点文档、各模块案例)
六、获取源码
大家点赞、收藏、关注、评论啦 、关注下方公众号获取联系方式👇🏻👇🏻
🍅免费下载🍅商业使用需授权:点击这里下载