健身房管理系统
简介
基于 SpringBoot + layui 的健身房管理系统,使用 Sping Data JPA 方便数据库操作,使用 mysql 作为数据库,使用 shiro 进行密码加密,使用 BootStrap 来进行响应式布局,使用 ECharts 来进行统计图表的绘制
功能
- 管理员登录模块
- 会员管理模块
- 教练管理模块
- 课程管理模块
- 器材管理模块
- 物品遗失管理模块
- 商品管理模块
- 信息统计模块
重要代码
配置 shiro 认证与授权
import com.liujian.gymxmjpa.real.MyRealm;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.CookieRememberMeManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.LinkedHashMap;
import java.util.Map;
@Configuration
public class ShiroConfig {
@Bean
public MyRealm getMyRealm(){
MyRealm myRealm = new MyRealm() ;
// myRealm.setCredentialsMatcher(getHashedCredentialsMatcher());
return myRealm ;
}
@Bean
public SimpleCookie rememberMeCookie() {
//System.out.println("ShiroConfiguration.rememberMeCookie()");
//这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
SimpleCookie simpleCookie = new SimpleCookie("ckbox");
//<!-- 记住我cookie生效时间30天 ,单位秒;-->
simpleCookie.setMaxAge(259200);
return simpleCookie;
}
@Bean
public EhCacheManager getEhCacheManager(){
EhCacheManager ehCacheManager = new EhCacheManager() ;
ehCacheManager.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
return ehCacheManager ;
}
@Bean
public CookieRememberMeManager rememberMeManager() {
//System.out.println("ShiroConfiguration.rememberMeManager()");
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
//rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
// cookieRememberMeManager.setCipherKey(Base64.decode("2AvVhdsgUs0FSA3SDFAdag=="));
return cookieRememberMeManager;
}
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(){
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager() ;
defaultWebSecurityManager.setRealm(getMyRealm());
//注册记住我
defaultWebSecurityManager.setRememberMeManager(rememberMeManager());
//注册缓存
defaultWebSecurityManager.setCacheManager(getEhCacheManager());
return defaultWebSecurityManager ;
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(){
System.out.println("开启了Shiro注解支持");
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(getDefaultWebSecurityManager());
return authorizationAttributeSourceAdvisor;
}
@Bean
@ConditionalOnMissingBean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();
defaultAAP.setProxyTargetClass(true);
return defaultAAP;
}
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean() ;
//设置网页安全管理器
shiroFilterFactoryBean.setSecurityManager(getDefaultWebSecurityManager());
Map<String,String> map = new LinkedHashMap<String,String>() ;
//定义可以直接访问的资源
map.put("/login.jsp","anon") ;
map.put("/vcode.jsp","anon");
map.put("/dl/yz","anon") ;
map.put("/static/**","anon") ;
//取消认证
map.put("/logout","logout") ;
//
// map.put("/add.jsp","perms[user:*]") ;
map.put("/**","user") ;
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
shiroFilterFactoryBean.setLoginUrl("/login.jsp");
shiroFilterFactoryBean.setUnauthorizedUrl("/unauth.jsp");
return shiroFilterFactoryBean ;
}
}
import com.liujian.gymxmjpa.dao.AdminuserDao;
import com.liujian.gymxmjpa.entity.Adminuser;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
public class MyRealm extends AuthorizingRealm {
@Autowired
private AdminuserDao adminuserDao;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("已授权");
Subject subject = SecurityUtils.getSubject();
Adminuser user = (Adminuser) principalCollection.getPrimaryPrincipal() ;
//
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo() ;
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken ;
Adminuser adminuser = adminuserDao.findByAdminNameAndAdminPassword(token.getUsername(),String.copyValueOf(token.getPassword()));
if(null == adminuser){
return null ;
}
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(adminuser.getAdminName(),adminuser.getAdminPassword(),"") ;
System.out.println("完成认证!");
return info;
}
}
示例
登录界面
数据统计界面
会员列表界面
健身卡分类管理
教练列表界面
物品遗失归还界面
商品列表界面
修改密码