需求如下:
需求說明:
1.臨時用戶,設置用戶可使用時間,到期後則狀態則改爲禁用,且不可登錄,月、日按自然日計算,按用戶創建時間開始計算。
2、取消輸入密碼,後臺自動生成初始密碼,密碼規則符合:大寫字母、小寫字母、數字、特殊字符應選三種或以上
3.新建用戶成功後將自動生成的初始密碼發送至該用戶郵箱
4、用戶使用初始密碼登錄後彈出修改密碼窗口,強制修改密碼
5、登錄時檢測用戶登錄IP是否與綁定IP相同,異常則進行郵件報警,且不讓登錄提示“IP異常,無法登錄”
6、用戶若未在設置登錄時間範圍內則不可登錄,提示內容”當前時間不在登錄時間範圍內容,請稍後重試“
開發
因爲要進行編輯,所以這些字段都需要保持到數據庫中
-- 新增用戶類型:(0代表長期,1代表臨時)
ALTER TABLE user_info ADD `user_type` tinyint(4) NOT NULL COMMENT '用戶類型:0長期;1臨時' ;
-- 新增臨時用戶有效時間
ALTER TABLE user_info ADD `period` tinyint(4) COLLATE utf8_bin DEFAULT NULL COMMENT '有效時間:大於0的正整數' ;
-- 新增臨時用戶有效時間單位
ALTER TABLE user_info ADD `period_unit` varchar(8) COLLATE utf8_bin DEFAULT NULL COMMENT '有效時間單位:日day,月month' ;
-- 新增綁定ip字段
ALTER TABLE user_info ADD `user_bind_ip` varchar(16) COLLATE utf8_bin DEFAULT NULL COMMENT '綁定ip' ;
-- 登錄時間範圍:開始時間
ALTER TABLE user_info ADD `begin_time` varchar(8) COLLATE utf8_bin DEFAULT NULL COMMENT '登錄開始時間' ;
-- 登錄時間範圍:結束時間
ALTER TABLE user_info ADD `end_time` varchar(8) COLLATE utf8_bin DEFAULT NULL COMMENT '登錄結束時間' ;
-- 新增是否是否需要修改密碼
ALTER TABLE user_info ADD `change_password` tinyint(1) NOT NULL COMMENT '是否要修改密碼:0需要修改,1不需要修改' ;
ps:需要注意的是在mysql中 tinyint(1) 和 tinyint(4)是不同的意思
- tinyint(1):boolean類型(1代表true,0代表false)
- tinyint(4):Integer類型,不過只能接受最大爲9999
思路
需求:臨時用戶,設置用戶可使用時間,到期後則狀態則改爲禁用,且不可登錄,月、日按自然日計算,按用戶創建時間開始計算。
(1)當用戶設置爲臨時用戶後,每次在登錄的時候都根據用戶類型進行判斷
(2)如果是臨時用戶,則判斷當前是否過期,過期則將用戶狀態設置爲禁用
//判斷用戶類型:0爲長期;1爲臨時
Integer type = user.getType();
if (UserApi.TEMP_USER.equals(type)) {
//臨時用戶,判斷是否過期,過期則將用戶狀態設置爲禁用
Integer period = user.getPeriod(); //有效時間週期,大於0的整數
String periodUnit = user.getPeriodUnit(); //有效時間單位,day或者month
//根據用戶創建的時間,計算出過期時間
Date createdTime = user.getCreated();
Calendar validCalendar = Calendar.getInstance();
validCalendar.setTime(createdTime);
if (periodUnit.equals("day")) {
validCalendar.add(Calendar.DATE, period); //有效時間單位是day時
} else {
validCalendar.add(Calendar.MONTH, period); //有效時間單位是month時
}
//判斷當前時間是否已經過期
Calendar currentCalendar = Calendar.getInstance();
currentCalendar.setTime(new Date());
//當前時間,在有效時間以外
if (currentCalendar.after(validCalendar)) {
//將用戶狀態設置爲禁用
user.setEnabled(false);
userDao.save(user);
mav.addObject("errorMsg", "臨時用戶已過期,無法登錄!");
//跳轉到登錄頁面
return mav;
}
}
這類用戶過期,因爲跟用戶創建時間有關,當用戶過期後,狀態被設置爲禁用,即使通過管理員將其狀態重新更新爲啓用,登錄後還是會重新檢測到設置了過期時間,再次設置爲禁用,然後跳轉到登錄頁面
解決方式:不單單修改用戶的狀態,同時還要設置用戶類型
- 設置用戶類型爲長期:登錄時,不再進行用戶類型判斷,直接登錄
- 設置用戶類型爲臨時:延長過期時間,即可
需求:用戶若未在設置登錄時間範圍內則不可登錄,提示內容”當前時間不在登錄時間範圍內容,請稍後重試“
在登錄時,獲取登錄開始時間和登錄結束時間,進行判斷
//判斷用戶登錄是否在設置的登錄時間範圍內
try {
String beginTime = user.getBeginTime();
String endTime = user.getEndTime();
//兩個時間都存在時,進行登錄時間範圍校驗
if (StringUtils.isNotBlank(beginTime) && StringUtils.isNotBlank(endTime)) {
//判斷兩個時間段是否在同一天,例如23:00~02:00,就不屬於同一天
boolean isSameDay = DateUtil.isSameDay(beginTime, endTime);
if (isSameDay) {
//同一天
if (!DateUtil.withinTimeRange(beginTime, endTime)) {
mav.addObject("errorMsg", "當前時間不在登錄時間範圍內容,請稍後重試!");
return mav;
}
} else {
//隔日(進行兩次判斷)
if (!DateUtil.withinTimeRange(beginTime, "23:59") &&
!DateUtil.withinTimeRange("00:00", endTime)) {
mav.addObject("errorMsg", "當前時間不在登錄時間範圍內容,請稍後重試!");
return mav;
}
}
}
} catch (ParseException e) {
mav.addObject("errorMsg", "登錄時間範圍內容異常!");
return mav;
}
/**
* 開始時間和結束時間是否在同一天內
* @param start 開始時間 格式爲00:00(時:分)
* @param end 結束時間 格式爲00:00
* @return true代表兩個時間段在同一天;false代表兩個時間段不在同一天
* @throws ParseException
*/
public static boolean isSameDay(String start, String end) throws ParseException {
DateFormat format = new SimpleDateFormat("HH:mm");
Date startTime = format.parse(start);
Date endTime = format.parse(end);
if (endTime.after(startTime)) {
return true;
} else {
return false;
}
}