Java實(shí)戰(zhàn)項(xiàng)目 健身管理系統(tǒng)
主要技術(shù):springmvc、 springboot 、mybatis、mysql 、jQuery、layui、css、jsp shiro權(quán)限控制
主要功能截圖如下:
用戶登錄、首頁(yè)主要功能有:會(huì)員信息管理、會(huì)員到期續(xù)費(fèi)管理、充值管理、教練課程管理、私教管理、器材管理、小商品售賣管理、信息統(tǒng)計(jì)、修改密碼等主要功能:


會(huì)員管理、續(xù)卡、會(huì)員卡類型管理:



教練列表展示和添加修改刪除教練信息:

會(huì)員私教課程管理:

添加私教信息:


健身課程列表展示查詢和添加修改:

健身器材列表展示查詢和添加修改:

物品遺失管理、歸還、添加丟失物品、查詢、取回丟失物品等:

健身房小商品售賣管理:列表數(shù)據(jù)展示、查詢、進(jìn)貨、售賣 退貨等操作


簡(jiǎn)單的樹(shù)狀圖統(tǒng)計(jì):

代碼:

數(shù)據(jù)庫(kù)表:

管理員登錄代碼如下:
/**
* @Description: 管理員登錄Controller控制層
* xiaoc
* @Date: 2020/4/4
*/
@Controller
@RequestMapping("/")
public class AdminuserConntroller {
@Autowired
private AdminuserDao adminuserDao;
/**
* @Description: 輸入端口號(hào)直接跳轉(zhuǎn)登錄界面
* xiaoc
* @Date: 2020/4/29
*/
@RequestMapping("/")
public String beforeLogin(){
return "login";
}
/**
* @Description: 管理員登錄驗(yàn)證方法
* xiaoc
* @Date: 2020/4/4
*/
@RequestMapping("/dl/yz")
public String login(String username, String password,HttpSession httpSession,Model model){
Subject subject= SecurityUtils.getSubject();
UsernamePasswordToken userToken=new UsernamePasswordToken(username,DigestUtils.md5Hex(password));
try{
subject.login(userToken);
Adminuser a= adminuserDao.findByAdminNameAndAdminPassword(username,DigestUtils.md5Hex(password));
httpSession.setAttribute("user",a);
return "WEB-INF/jsp/index";
}catch (UnknownAccountException e){
model.addAttribute("msg","用戶名或密碼錯(cuò)誤,請(qǐng)重新輸入");
return "login";
}
/*Adminuser a= adminuserDao.findByAdminNameAndAdminmima(username,password);
if(a!=null){
httpSession.setAttribute("user",a);
return "WEB-INF/jsp/index" ;
}
model.addAttribute("mag","賬號(hào)或密碼錯(cuò)誤");
return "login";*/
}
/**
* @Description: 退出登錄后清楚session
* xiaoc
* @Date: 2020/5/1
*/
@RequestMapping("/logout")
public String logout(){
Subject subject = SecurityUtils.getSubject();
subject.logout();
return "redirect:/login";
}
/**
* @Description: 跳轉(zhuǎn)到修改密碼界面
* xiaoc
* @Date: 2020/5/1
*/
@RequestMapping("/updPassword")
public String updPassword(){
return "WEB-INF/jsp/updPassword";
}
/**
* @Description: 修改密碼
* xiaoc
* @Date: 2020/5/1
*/
@RequestMapping("/upd/updPassword")
public String updPasswordConfirm(String oldPassword,String newPassword,String newPasswordAgain,HttpSession httpSession,Model model){
Pattern p = Pattern.compile("^(?=.*[A-Za-z])(?=.*\\d)(?=.*[$@$!.%*#?&])[A-Za-z\\d$@$!.%*#?&]{8,}$");
Matcher m = p.matcher(newPassword);
if(!m.matches()){
model.addAttribute("msg","新密碼最少為8位并為字母+數(shù)字+特殊字符");
return "WEB-INF/jsp/updPassword";
}
if(!newPassword.equals(newPasswordAgain)){
model.addAttribute("msg","兩次輸入新密碼不一致,請(qǐng)重新輸入");
return "WEB-INF/jsp/updPassword";
}
Adminuser adminuser=(Adminuser) httpSession.getAttribute("user");
if(null != adminuser){
if(!adminuser.getAdminPassword().equals(DigestUtils.md5Hex(oldPassword))){
model.addAttribute("msg","原密碼不正確,請(qǐng)重新輸入");
return "WEB-INF/jsp/updPassword";
}
adminuserDao.updPassword(adminuser.getAdminId(), DigestUtils.md5Hex(newPassword));
}
Subject subject = SecurityUtils.getSubject();
subject.logout();
return "redirect:/login.jsp";
}
}
密碼加密方式:
@Configuration
public class ShiroConfig {
/**
* 密碼校驗(yàn)規(guī)則HashedCredentialsMatcher
* 這個(gè)類是為了對(duì)密碼進(jìn)行編碼的 ,
* 防止密碼在數(shù)據(jù)庫(kù)里明碼保存 , 當(dāng)然在登陸認(rèn)證的時(shí)候 ,
* 這個(gè)類也負(fù)責(zé)對(duì)form里輸入的密碼進(jìn)行編碼
* 處理認(rèn)證匹配處理器:如果自定義需要實(shí)現(xiàn)繼承HashedCredentialsMatcher
*/
// @Bean("hashedCredentialsMatcher")
// public HashedCredentialsMatcher getHashedCredentialsMatcher() {
// HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
// //指定加密方式為MD5
// credentialsMatcher.setHashAlgorithmName("MD5");
// //加密次數(shù)
// credentialsMatcher.setHashIterations(1024);
// credentialsMatcher.setStoredCredentialsHexEncoded(true);
// return credentialsMatcher;
// }
@Bean
public MyRealm getMyRealm(){
MyRealm myRealm = new MyRealm() ;
// myRealm.setCredentialsMatcher(getHashedCredentialsMatcher());
return myRealm ;
}
@Bean
public SimpleCookie rememberMeCookie() {
//System.out.println("ShiroConfiguration.rememberMeCookie()");
//這個(gè)參數(shù)是cookie的名稱,對(duì)應(yīng)前端的checkbox的name = rememberMe
SimpleCookie simpleCookie = new SimpleCookie("ckbox");
//<!-- 記住我cookie生效時(shí)間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加密的密鑰 建議每個(gè)項(xiàng)目都不一樣 默認(rèn)AES算法 密鑰長(zhǎng)度(128 256 512 位)
// cookieRememberMeManager.setCipherKey(Base64.decode("2AvVhdsgUs0FSA3SDFAdag=="));
return cookieRememberMeManager;
}
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(){
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager() ;
defaultWebSecurityManager.setRealm(getMyRealm());
//注冊(cè)記住我
defaultWebSecurityManager.setRememberMeManager(rememberMeManager());
//注冊(cè)緩存
defaultWebSecurityManager.setCacheManager(getEhCacheManager());
return defaultWebSecurityManager ;
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(){
System.out.println("開(kāi)啟了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() ;
//設(shè)置網(wǎng)頁(yè)安全管理器
shiroFilterFactoryBean.setSecurityManager(getDefaultWebSecurityManager());
Map<String,String> map = new LinkedHashMap<String,String>() ;
//定義可以直接訪問(wèn)的資源
map.put("/login.jsp","anon") ;
map.put("/vcode.jsp","anon");
map.put("/dl/yz","anon") ;
map.put("/static/**","anon") ;
//取消認(rèn)證
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 ;
}
}
到此這篇關(guān)于Java實(shí)戰(zhàn)項(xiàng)目 健身管理系統(tǒng)的文章就介紹到這了,更多相關(guān)Java 健身管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java 實(shí)戰(zhàn)項(xiàng)目之家居購(gòu)物商城系統(tǒng)詳解流程
- Java 實(shí)戰(zhàn)項(xiàng)目之疫情人員流動(dòng)管理系統(tǒng)詳解
- Java 實(shí)戰(zhàn)項(xiàng)目之疫情防控管理系統(tǒng)詳解
- JAVA實(shí)戰(zhàn)項(xiàng)目實(shí)現(xiàn)客戶選購(gòu)系統(tǒng)詳細(xì)流程
- Java實(shí)戰(zhàn)項(xiàng)目 圖書(shū)管理系統(tǒng)
- Java實(shí)戰(zhàn)項(xiàng)目 醫(yī)院預(yù)約掛號(hào)系統(tǒng)
- Java 實(shí)戰(zhàn)項(xiàng)目錘煉之樸素風(fēng)格個(gè)人博客系統(tǒng)的實(shí)現(xiàn)流程
相關(guān)文章
詳解springboot 使用c3p0數(shù)據(jù)庫(kù)連接池的方法
本篇文章主要介紹了springboot 使用c3p0數(shù)據(jù)庫(kù)連接池的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
HDFS的Java API的訪問(wèn)方式實(shí)例代碼
這篇文章主要介紹了HDFS的Java API的訪問(wèn)方式實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
java線程Thread.sleep()對(duì)比對(duì)象的wait示例解析
這篇文章主要為大家介紹了java線程Thread.sleep()對(duì)比對(duì)象的wait示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Java 延遲隊(duì)列的常用的實(shí)現(xiàn)方式
這篇文章主要介紹了Java 延遲隊(duì)列的常用的實(shí)現(xiàn)方式,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-04-04
SpringBoot框架集成token實(shí)現(xiàn)登錄校驗(yàn)功能
這篇文章主要為大家詳細(xì)介紹了SpringBoot框架集成token實(shí)現(xiàn)登錄校驗(yàn)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Spring使用@Retryable實(shí)現(xiàn)自動(dòng)重試機(jī)制
在微服務(wù)架構(gòu)中,服務(wù)之間的調(diào)用可能會(huì)因?yàn)橐恍簳r(shí)性的錯(cuò)誤而失敗,例如網(wǎng)絡(luò)波動(dòng)、數(shù)據(jù)庫(kù)連接超時(shí)或第三方服務(wù)不可用等,在本文中,我們將介紹如何在 Spring 中使用 @Retryable 實(shí)現(xiàn)自動(dòng)重試機(jī)制,需要的朋友可以參考下2025-01-01
SpringBoot應(yīng)用整合ELK實(shí)現(xiàn)日志收集的示例代碼
這篇文章主要介紹了SpringBoot應(yīng)用整合ELK實(shí)現(xiàn)日志收集的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
一篇文章帶你了解java數(shù)據(jù)庫(kù)連接
這篇文章主要介紹了Java基于連接數(shù)據(jù)庫(kù)及顯示數(shù)據(jù)操作,結(jié)合實(shí)例形式分析了Java使用jdbc進(jìn)行mysql數(shù)據(jù)庫(kù)連接與數(shù)據(jù)讀取、顯示等相關(guān)操作技巧,需要的朋友可以參考下2021-08-08

