diff --git a/src/main/webapp/404.html b/front-end/404.html similarity index 100% rename from src/main/webapp/404.html rename to front-end/404.html diff --git a/front-end/MaskDialogTest.html b/front-end/MaskDialogTest.html new file mode 100644 index 0000000..36f9591 --- /dev/null +++ b/front-end/MaskDialogTest.html @@ -0,0 +1,45 @@ + + + + + + + 欢迎 - LittleBusters + + + + + + + + + + +
+
+
+
+ + +
+
+ +
+
+ +
+
+ +
+ +
+ + + + \ No newline at end of file diff --git a/src/main/webapp/css/welcomepage.css b/front-end/css/welcomepage.css similarity index 100% rename from src/main/webapp/css/welcomepage.css rename to front-end/css/welcomepage.css diff --git a/src/main/webapp/images/54120216_p0_conpressed.jpg b/front-end/images/54120216_p0_conpressed.jpg similarity index 100% rename from src/main/webapp/images/54120216_p0_conpressed.jpg rename to front-end/images/54120216_p0_conpressed.jpg diff --git a/src/main/webapp/index.html b/front-end/index.html similarity index 93% rename from src/main/webapp/index.html rename to front-end/index.html index 1b1a5f9..ac1fd7a 100644 --- a/src/main/webapp/index.html +++ b/front-end/index.html @@ -19,7 +19,8 @@ - + +
diff --git a/front-end/js/events.js b/front-end/js/events.js new file mode 100644 index 0000000..2ce26cb --- /dev/null +++ b/front-end/js/events.js @@ -0,0 +1,94 @@ +function login() { + + username = $("#username").val(); + password = $("#passwd").val(); + + if (!checkInputDataCorrect(username, password)) { + return; + } + + encPassword = encryptPassword(password); + postData = { + "user_name": username, + "password": encPassword + }; + + $.ajax({ + url: "/api/v1/login", + type: "post", + dataType: "json", + data: JSON.stringify(postData), + success: (result) => { + console.log("获取到数据:" + JSON.stringify(result)); + resultCode = result.code; + switch(resultCode) { + case 1: + showMessage("好啦"); + storeToken(result.data.access_token); + break; + case 2: + showMessage("请求的数据不对哦"); + break; + case 3: + showMessage("密码或用户名不正确..."); + break; + case -1: + showMessage("哦豁,有个家伙写BUG了"); + break; + default : + showMessage("出现了不知道什么原因的错误,应给是服务器那边的锅") + } + }, + error: (msg, status) => { + console.log(msg.status); + showMessage("登录时发生错误:" + status + " " + msg.status); + } + }) +} + +function register() { + username = $("#username").val(); + password = $("#passwd").val(); + + if (!checkInputDataCorrect(username, password)) { + return; + } + + encPassword = encryptPassword(password); + postData = { + "user_name": username, + "password": encPassword + }; + + $.ajax({ + url: "/api/v1/register", + type: "post", + dataType: "json", + data: JSON.stringify(postData), + success: (result) => { + console.log("获取到数据:" + JSON.stringify(result)); + resultCode = result.code; + switch(resultCode) { + case 1: + showMessage("好啦"); + storeToken(result.data.access_token); + break; + case 2: + showMessage("请求的数据不对哦"); + break; + case 4: + showMessage("用户名已经被别人用啦"); + break; + case -1: + showMessage("哦豁,有个家伙写BUG了"); + break; + default : + showMessage("出现了不知道什么原因的错误,应给是服务器那边的锅") + } + }, + error: (msg, status) => { + console.log(msg.status); + showMessage("注册时发生错误:" + status + " " + msg.status); + } + }) +} \ No newline at end of file diff --git a/src/main/webapp/js/init.js b/front-end/js/init.js similarity index 100% rename from src/main/webapp/js/init.js rename to front-end/js/init.js diff --git a/src/main/webapp/js/jquery-3.6.0.min.js b/front-end/js/jquery-3.6.0.min.js similarity index 100% rename from src/main/webapp/js/jquery-3.6.0.min.js rename to front-end/js/jquery-3.6.0.min.js diff --git a/src/main/webapp/js/sha256-min.js b/front-end/js/sha256-min.js similarity index 100% rename from src/main/webapp/js/sha256-min.js rename to front-end/js/sha256-min.js diff --git a/src/main/webapp/js/utils.js b/front-end/js/utils.js similarity index 76% rename from src/main/webapp/js/utils.js rename to front-end/js/utils.js index b003c1a..4ae7563 100644 --- a/src/main/webapp/js/utils.js +++ b/front-end/js/utils.js @@ -24,5 +24,9 @@ function isNormalCharacter(source) { function encryptPassword(password) { sha256 = CryptoJS.SHA256; - return sha256(sha256(password).toString()).toString(); + return sha256(sha256(password).toString() + password).toString(); +} + +function storeToken(token) { + localStorage.setItem("access_token", token); } \ No newline at end of file diff --git a/src/main/webapp/js/welcomepage_message.js b/front-end/js/welcomepage_message.js similarity index 89% rename from src/main/webapp/js/welcomepage_message.js rename to front-end/js/welcomepage_message.js index dc805fb..2ac7c65 100644 --- a/src/main/webapp/js/welcomepage_message.js +++ b/front-end/js/welcomepage_message.js @@ -2,10 +2,6 @@ function forgotPasswd() { showDialog("( ̄﹏ ̄;)", "欸这个嘛...我还没做完呢...( ̄﹏ ̄;)"); } -function register() { - showDialog("( ̄﹏ ̄;)", "欸这个嘛...我还没做完呢...( ̄﹏ ̄;)"); -} - function closeDialog() { $("#dialogMask").fadeOut(400); } @@ -32,6 +28,10 @@ function showMessage(message) { $("#errMsgBox")[0].innerHTML = `

${message}

`; } +function clearMessage() { + $("#errMsgBox")[0].innerHTML = ``; +} + function showDialog(title, message) { html = `
diff --git a/front-end/login.html b/front-end/login.html new file mode 100644 index 0000000..ac1fd7a --- /dev/null +++ b/front-end/login.html @@ -0,0 +1,53 @@ + + + + + + + 欢迎 - LittleBusters + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/src/main/java/me/lensfrex/littlebusters/RestTest.java b/src/main/java/me/lensfrex/littlebusters/RestTest.java deleted file mode 100644 index 09503c0..0000000 --- a/src/main/java/me/lensfrex/littlebusters/RestTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.lensfrex.littlebusters; - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -@Path("/lb") -public class RestTest { - @GET - @Produces(MediaType.TEXT_PLAIN) - public String getMessage() { - return "ASJKDFHYG"; - } -} diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/Register.java b/src/main/java/me/lensfrex/littlebusters/api/v1/Register.java deleted file mode 100644 index b5a0531..0000000 --- a/src/main/java/me/lensfrex/littlebusters/api/v1/Register.java +++ /dev/null @@ -1,57 +0,0 @@ -package me.lensfrex.littlebusters.api.v1; - -import com.google.gson.Gson; -import jakarta.ws.rs.POST; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; -import me.lensfrex.littlebusters.api.v1.beans.requests.RegisterRequestBody; -import me.lensfrex.littlebusters.api.v1.dao.UserOperators; -import me.lensfrex.littlebusters.api.v1.beans.responses.RegisterResponseData; -import me.lensfrex.littlebusters.api.v1.beans.responses.general.ErrorResponse; -import me.lensfrex.littlebusters.api.v1.beans.responses.general.ResponseBase; -import me.lensfrex.littlebusters.api.v1.utils.InputChecker; -import me.lensfrex.littlebusters.api.v1.utils.database.MyBatisUtil; -import org.apache.ibatis.session.SqlSession; -import org.mindrot.jbcrypt.BCrypt; - -import java.util.UUID; - -@Path("/register") -public class Register { - private final static Gson gson = new Gson(); - - @POST - @Produces(MediaType.APPLICATION_JSON) - public String register(String request) { - System.out.println("Start register."); - RegisterRequestBody registerRequestBody; - try { - registerRequestBody = gson.fromJson(request, RegisterRequestBody.class); - if (InputChecker.hasInvalidChar(registerRequestBody.getUserName()) || - InputChecker.hasInvisibleChar(registerRequestBody.getPassword())) { - ErrorResponse errorResponse = new ErrorResponse(1, "用户名或密码非法"); - - return gson.toJson(errorResponse); - } - } catch (Exception e) { - System.err.println(request); - ErrorResponse errorResponse = new ErrorResponse(2, "请求的数据格式不对"); - - return gson.toJson(errorResponse); - } - - String userUUID = UUID.randomUUID().toString(); - String userBcryptPasswd = BCrypt.hashpw(registerRequestBody.getPassword(), BCrypt.gensalt()); - - SqlSession sqlSession = MyBatisUtil.getSqlSession(true); - UserOperators userOperators = sqlSession.getMapper(UserOperators.class); - - userOperators.addRegisterInfoIntoDb(userUUID, registerRequestBody.getUserName(), userBcryptPasswd); - - RegisterResponseData registerResponseBody = new RegisterResponseData(10101, userUUID, userBcryptPasswd); - ResponseBase response = new ResponseBase<>(200, "success", registerResponseBody); - - return gson.toJson(response); - } -} \ No newline at end of file diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/LoginResponseData.java b/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/LoginResponseData.java index cde9974..eb62a55 100644 --- a/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/LoginResponseData.java +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/LoginResponseData.java @@ -23,9 +23,9 @@ public class LoginResponseData { * 用户此次得到的token的过期时间 */ @SerializedName("expired_at") - private String expiredAt; + private long expiredAt; - public LoginResponseData(long uid, String uuid, String accessToken, String expiredAt) { + public LoginResponseData(long uid, String uuid, String accessToken, long expiredAt) { this.uid = uid; this.uuid = uuid; this.accessToken = accessToken; @@ -56,11 +56,11 @@ public class LoginResponseData { this.accessToken = accessToken; } - public String getExpiredAt() { + public long getExpiredAt() { return expiredAt; } - public void setExpiredAt(String expiredAt) { + public void setExpiredAt(long expiredAt) { this.expiredAt = expiredAt; } } diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/RegisterResponseData.java b/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/RegisterResponseData.java index 0b2309e..530aef7 100644 --- a/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/RegisterResponseData.java +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/RegisterResponseData.java @@ -8,6 +8,11 @@ public class RegisterResponseData { */ private int uid; + /** + * 用户注册分派到的uuid + */ + private String UUID; + /** * 用户本次注册时得到的token */ @@ -18,10 +23,11 @@ public class RegisterResponseData { * 用户此次得到的token的过期时间 */ @SerializedName("expired_at") - private String expiredAt; + private long expiredAt; - public RegisterResponseData(int uid, String accessToken, String expiredAt) { + public RegisterResponseData(int uid, String UUID, String accessToken, long expiredAt) { this.uid = uid; + this.UUID = UUID; this.accessToken = accessToken; this.expiredAt = expiredAt; } @@ -34,6 +40,14 @@ public class RegisterResponseData { this.uid = uid; } + public String getUUID() { + return UUID; + } + + public void setUUID(String UUID) { + this.UUID = UUID; + } + public String getAccessToken() { return accessToken; } @@ -42,11 +56,11 @@ public class RegisterResponseData { this.accessToken = accessToken; } - public String getExpiredAt() { + public long getExpiredAt() { return expiredAt; } - public void setExpiredAt(String expiredAt) { + public void setExpiredAt(long expiredAt) { this.expiredAt = expiredAt; } } diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/general/ResponseBase.java b/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/general/ResponseBase.java index ba3657c..dbfad02 100644 --- a/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/general/ResponseBase.java +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/general/ResponseBase.java @@ -50,4 +50,12 @@ public class ResponseBase { public void setData(T data) { this.data = data; } -} + + public static ResponseBase success(S data) { + return new ResponseBase<>(ResponseCode.SUCCESS, "success", data); + } + + public static ResponseBase error(int responseCode, String message) { + return new ResponseBase<>(responseCode, message, null); + } +} \ No newline at end of file diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/general/ResponseCode.java b/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/general/ResponseCode.java new file mode 100644 index 0000000..804649f --- /dev/null +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/beans/responses/general/ResponseCode.java @@ -0,0 +1,13 @@ +package me.lensfrex.littlebusters.api.v1.beans.responses.general; + +public class ResponseCode { + public final static int SERVER_ERROR = -1; + + public final static int SUCCESS = 1; + public final static int REQUEST_FORMAT_INVALID = 2; + public final static int PASSWORD_WRONG = 3; + public final static int USER_ALREADY_EXISTS = 4; + + public final static int LOGIN_DATA_INVALID = 5; + public final static int TOKEN_INVALID = 6; +} diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/dao/UserDao.java b/src/main/java/me/lensfrex/littlebusters/api/v1/dao/UserDao.java new file mode 100644 index 0000000..64e2020 --- /dev/null +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/dao/UserDao.java @@ -0,0 +1,32 @@ +package me.lensfrex.littlebusters.api.v1.dao; + +import me.lensfrex.littlebusters.api.v1.dao.sql.UserDaoInterface; +import me.lensfrex.littlebusters.api.v1.pojos.UserInformation; +import me.lensfrex.littlebusters.api.v1.utils.database.MyBatisUtil; +import org.apache.ibatis.session.SqlSession; + +public class UserDao { + public static UserInformation getUser(String userName) { + SqlSession sqlSession = MyBatisUtil.getSqlSession(true); + + UserDaoInterface mapper = sqlSession.getMapper(UserDaoInterface.class); + + return mapper.getBasicInfoByUserName(userName); + } + + public static boolean isUserAlreadyExist(String userName) { + SqlSession sqlSession = MyBatisUtil.getSqlSession(true); + + UserDaoInterface mapper = sqlSession.getMapper(UserDaoInterface.class); + + return mapper.isUserNameAlreadyExists(userName); + } + + public static int addUser(String UUID, String userName, String password) { + SqlSession sqlSession = MyBatisUtil.getSqlSession(true); + + UserDaoInterface mapper = sqlSession.getMapper(UserDaoInterface.class); + + return mapper.addRegisterInfoIntoDb(UUID, userName, password); + } +} diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/dao/KeyDatabase.java b/src/main/java/me/lensfrex/littlebusters/api/v1/dao/sql/KeyDaoInterface.java similarity index 67% rename from src/main/java/me/lensfrex/littlebusters/api/v1/dao/KeyDatabase.java rename to src/main/java/me/lensfrex/littlebusters/api/v1/dao/sql/KeyDaoInterface.java index f5cb74a..e34f3a9 100644 --- a/src/main/java/me/lensfrex/littlebusters/api/v1/dao/KeyDatabase.java +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/dao/sql/KeyDaoInterface.java @@ -1,8 +1,8 @@ -package me.lensfrex.littlebusters.api.v1.dao; +package me.lensfrex.littlebusters.api.v1.dao.sql; import me.lensfrex.littlebusters.api.v1.pojos.StoredKey; -public interface KeyDatabase { +public interface KeyDaoInterface { StoredKey getKeyContentByKeyName(String keyName); int addKeyIntoDatabase(String keyContent, String keyName, int keyType); diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/dao/UserOperators.java b/src/main/java/me/lensfrex/littlebusters/api/v1/dao/sql/UserDaoInterface.java similarity index 68% rename from src/main/java/me/lensfrex/littlebusters/api/v1/dao/UserOperators.java rename to src/main/java/me/lensfrex/littlebusters/api/v1/dao/sql/UserDaoInterface.java index 73d8da5..3882744 100644 --- a/src/main/java/me/lensfrex/littlebusters/api/v1/dao/UserOperators.java +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/dao/sql/UserDaoInterface.java @@ -1,12 +1,16 @@ -package me.lensfrex.littlebusters.api.v1.dao; +package me.lensfrex.littlebusters.api.v1.dao.sql; import me.lensfrex.littlebusters.api.v1.pojos.UserInformation; import org.apache.ibatis.annotations.Param; -public interface UserOperators { +public interface UserDaoInterface { + boolean isUserNameAlreadyExists(@Param("userName") String userName); + int addRegisterInfoIntoDb(@Param("uuid") String UUID, @Param("userName") String userName, @Param("password") String password); UserInformation getBasicInfoByUserName(@Param("userName") String userName); + + } \ No newline at end of file diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/exceptions/RequestDataInvalidException.java b/src/main/java/me/lensfrex/littlebusters/api/v1/exceptions/RequestDataInvalidException.java new file mode 100644 index 0000000..d223022 --- /dev/null +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/exceptions/RequestDataInvalidException.java @@ -0,0 +1,11 @@ +package me.lensfrex.littlebusters.api.v1.exceptions; + +public class RequestDataInvalidException extends Exception { + public RequestDataInvalidException(String message) { + super(message); + } + + public RequestDataInvalidException() { + super("请求的数据有误"); + } +} diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/exceptions/user/LoginInfoWrongException.java b/src/main/java/me/lensfrex/littlebusters/api/v1/exceptions/user/LoginInfoWrongException.java new file mode 100644 index 0000000..0bf2b92 --- /dev/null +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/exceptions/user/LoginInfoWrongException.java @@ -0,0 +1,11 @@ +package me.lensfrex.littlebusters.api.v1.exceptions.user; + +public class LoginInfoWrongException extends Exception { + public LoginInfoWrongException(String message) { + super(message); + } + + public LoginInfoWrongException() { + super("用户名或密码错误"); + } +} diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/inputTest.java b/src/main/java/me/lensfrex/littlebusters/api/v1/inputTest.java deleted file mode 100644 index 21536e2..0000000 --- a/src/main/java/me/lensfrex/littlebusters/api/v1/inputTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.lensfrex.littlebusters.api.v1; - -import jakarta.ws.rs.POST; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -@Path("/inputTest") -public class inputTest { - @POST - @Produces(MediaType.APPLICATION_JSON) - public String inputTest(String string) { - return string; - } -} diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/service/FeedBack.java b/src/main/java/me/lensfrex/littlebusters/api/v1/service/FeedBack.java new file mode 100644 index 0000000..7fc403c --- /dev/null +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/service/FeedBack.java @@ -0,0 +1,20 @@ +package me.lensfrex.littlebusters.api.v1.service; + +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +/** + * 只是方便前端测试自己到底发了什么数据给后端 + * 返回数据不是很详细,只是把数据体原样给返回了 + * 但是header信息之类的并没有提供 + */ +@Path("/test") +public class FeedBack { + @POST + @Produces(MediaType.TEXT_PLAIN) + public String returnRequest(String string) { + return string; + } +} \ No newline at end of file diff --git a/src/main/java/me/lensfrex/littlebusters/ApiIndex.java b/src/main/java/me/lensfrex/littlebusters/api/v1/service/Index.java similarity index 81% rename from src/main/java/me/lensfrex/littlebusters/ApiIndex.java rename to src/main/java/me/lensfrex/littlebusters/api/v1/service/Index.java index 2d0967d..b8c0178 100644 --- a/src/main/java/me/lensfrex/littlebusters/ApiIndex.java +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/service/Index.java @@ -1,4 +1,4 @@ -package me.lensfrex.littlebusters; +package me.lensfrex.littlebusters.api.v1.service; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @@ -6,7 +6,7 @@ import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; @Path("/") -public class ApiIndex { +public class Index { @GET @Produces(MediaType.TEXT_HTML) public String index() { diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/login/Login.java b/src/main/java/me/lensfrex/littlebusters/api/v1/service/login/Login.java similarity index 54% rename from src/main/java/me/lensfrex/littlebusters/api/v1/login/Login.java rename to src/main/java/me/lensfrex/littlebusters/api/v1/service/login/Login.java index 18667cc..cf64c44 100644 --- a/src/main/java/me/lensfrex/littlebusters/api/v1/login/Login.java +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/service/login/Login.java @@ -1,4 +1,4 @@ -package me.lensfrex.littlebusters.api.v1.login; +package me.lensfrex.littlebusters.api.v1.service.login; import com.google.gson.Gson; import com.google.gson.JsonParseException; @@ -10,20 +10,22 @@ import me.lensfrex.littlebusters.api.v1.beans.requests.LoginRequestBody; import me.lensfrex.littlebusters.api.v1.beans.responses.LoginResponseData; import me.lensfrex.littlebusters.api.v1.beans.responses.general.ErrorResponse; import me.lensfrex.littlebusters.api.v1.beans.responses.general.ResponseBase; +import me.lensfrex.littlebusters.api.v1.beans.responses.general.ResponseCode; +import me.lensfrex.littlebusters.api.v1.exceptions.user.LoginInfoWrongException; import me.lensfrex.littlebusters.api.v1.pojos.UserInformation; import me.lensfrex.littlebusters.api.v1.utils.InputChecker; -import me.lensfrex.littlebusters.api.v1.utils.database.User; +import me.lensfrex.littlebusters.api.v1.dao.UserDao; import me.lensfrex.littlebusters.api.v1.utils.jwt.JWTManager; import org.mindrot.jbcrypt.BCrypt; -import java.time.LocalDateTime; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Date; @Path("/login") public class Login { - private final static int TOKEN_EXPIRE_DAY = 15; - private final static Gson gson = new Gson(); - private final static JWTManager jwtManager = new JWTManager(); - User userTools = new User(); + private static final Gson gson = new Gson(); + private static final JWTManager jwtManager = JWTManager.getInstance(); @POST @Produces(MediaType.APPLICATION_JSON) @@ -38,43 +40,34 @@ public class Login { return gson.toJson(errorResponse); } - UserInformation userDatabaseInformation = userTools.getUser(loginRequestBody.getUserName()); + UserInformation userDatabaseInformation = UserDao.getUser(loginRequestBody.getUserName()); - // todo 这些情况用异常处理会好点吧 分散在代码里面很难看 - // 过会改改 if (userDatabaseInformation == null) { - ErrorResponse errorResponse = new ErrorResponse(400, "用户名或密码错误"); - return gson.toJson(errorResponse); + throw new LoginInfoWrongException(); } if (!identifyPassword(loginRequestBody.getPassword(), userDatabaseInformation.password)) { - ErrorResponse errorResponse = new ErrorResponse(400, "用户名或密码错误"); - return gson.toJson(errorResponse); + throw new LoginInfoWrongException(); } - String userToken = jwtManager.createNewJWT("login", loginRequestBody.getUserName(), TOKEN_EXPIRE_DAY); + Date expireDate = Date.from(Instant.now().plus(JWTManager.TOKEN_DEFAULT_EXPIRE_DAY, ChronoUnit.DAYS)); + String userToken = jwtManager.createNewJWT(loginRequestBody.getUserName(), expireDate); LoginResponseData loginResponseData = new LoginResponseData( userDatabaseInformation.uid, userDatabaseInformation.uuid, userToken, - LocalDateTime.now().plusDays(TOKEN_EXPIRE_DAY).toString()); + expireDate.getTime()); - ResponseBase response = new ResponseBase<>(200, "success", loginResponseData); + ResponseBase response = ResponseBase.success(loginResponseData); return gson.toJson(response); - } catch (JsonParseException e) { - System.err.println(request); - - ErrorResponse errorResponse = new ErrorResponse(300, "请求的数据格式不对"); - return gson.toJson(errorResponse); + return gson.toJson(ResponseBase.error(ResponseCode.REQUEST_FORMAT_INVALID, "请求的数据格式不对")); + } catch (LoginInfoWrongException e) { + return gson.toJson(ResponseBase.error(ResponseCode.PASSWORD_WRONG, "用户名或密码错误")); } catch (Exception e) { - System.err.println(request); - System.err.println(e.getMessage()); - - ErrorResponse errorResponse = new ErrorResponse(400, "服务器内部错误,请联系那个背锅的家伙"); - return gson.toJson(errorResponse); + return gson.toJson(ResponseBase.error(ResponseCode.SERVER_ERROR, "服务器内部错误,请联系那个背锅的家伙")); } } diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/service/register/Register.java b/src/main/java/me/lensfrex/littlebusters/api/v1/service/register/Register.java new file mode 100644 index 0000000..581be1d --- /dev/null +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/service/register/Register.java @@ -0,0 +1,68 @@ +package me.lensfrex.littlebusters.api.v1.service.register; + +import com.google.gson.Gson; +import com.google.gson.JsonParseException; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import me.lensfrex.littlebusters.api.v1.beans.requests.RegisterRequestBody; +import me.lensfrex.littlebusters.api.v1.beans.responses.general.ResponseCode; +import me.lensfrex.littlebusters.api.v1.beans.responses.RegisterResponseData; +import me.lensfrex.littlebusters.api.v1.beans.responses.general.ResponseBase; +import me.lensfrex.littlebusters.api.v1.dao.UserDao; +import me.lensfrex.littlebusters.api.v1.exceptions.RequestDataInvalidException; +import me.lensfrex.littlebusters.api.v1.utils.InputChecker; +import me.lensfrex.littlebusters.api.v1.utils.jwt.JWTManager; +import org.mindrot.jbcrypt.BCrypt; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.UUID; + +@Path("/register") +public class Register { + private static final JWTManager jwtManager = JWTManager.getInstance(); + private static final Gson gson = new Gson(); + + @POST + @Produces(MediaType.APPLICATION_JSON) + public String register(String request) { + RegisterRequestBody registerRequestBody; + + try { + registerRequestBody = gson.fromJson(request, RegisterRequestBody.class); + + if (registerRequestBody == null || + InputChecker.hasInvalidChar(registerRequestBody.getUserName()) || + InputChecker.hasInvisibleChar(registerRequestBody.getPassword())) { + + throw new RequestDataInvalidException(); + } + + if (UserDao.isUserAlreadyExist(registerRequestBody.getUserName())) { + return gson.toJson(ResponseBase.error(ResponseCode.USER_ALREADY_EXISTS, "申请注册的用户已经存在")); + } + + String userUUID = UUID.randomUUID().toString(); + String userBcryptPasswd = BCrypt.hashpw(registerRequestBody.getPassword(), BCrypt.gensalt()); + + int newUid = UserDao.addUser(userUUID, registerRequestBody.getUserName(), userBcryptPasswd); + + Date expireDate = Date.from(Instant.now().plus(JWTManager.TOKEN_DEFAULT_EXPIRE_DAY, ChronoUnit.DAYS)); + RegisterResponseData registerResponseBody = new RegisterResponseData( + newUid, + userUUID, + jwtManager.createNewJWT(registerRequestBody.getUserName(), expireDate), + expireDate.getTime()); + + return gson.toJson(ResponseBase.success(registerResponseBody)); + } catch (JsonParseException | RequestDataInvalidException e) { + return gson.toJson(ResponseBase.error(ResponseCode.REQUEST_FORMAT_INVALID, "请求的数据不正确")); + } catch (Exception e) { + return gson.toJson(ResponseBase.error(ResponseCode.SERVER_ERROR, "服务器程序发生错误,有个家伙又写bug了。Error:" + e.getMessage())); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/service/token/TokenChecker.java b/src/main/java/me/lensfrex/littlebusters/api/v1/service/token/TokenChecker.java new file mode 100644 index 0000000..640592c --- /dev/null +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/service/token/TokenChecker.java @@ -0,0 +1,19 @@ +package me.lensfrex.littlebusters.api.v1.service.token; + +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import me.lensfrex.littlebusters.api.v1.utils.jwt.JWTManager; + +@Path("/token") +public class TokenChecker { + public static final JWTManager jwtManager = JWTManager.getInstance(); + + @POST + @Path("/check") + @Produces(MediaType.APPLICATION_JSON) + public String checkTokenAvailable(String request) { + return String.valueOf(jwtManager.verifyToken(request)); + } +} diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/service/token/TokenRefresher.java b/src/main/java/me/lensfrex/littlebusters/api/v1/service/token/TokenRefresher.java new file mode 100644 index 0000000..0b9dc07 --- /dev/null +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/service/token/TokenRefresher.java @@ -0,0 +1,16 @@ +package me.lensfrex.littlebusters.api.v1.service.token; + +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +@Path("/token") +public class TokenRefresher { + @Path("/refresh") + @POST + @Produces(MediaType.APPLICATION_JSON) + public String refreshToken(String request) { + return request; + } +} diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/utils/database/User.java b/src/main/java/me/lensfrex/littlebusters/api/v1/utils/database/User.java deleted file mode 100644 index ed9f670..0000000 --- a/src/main/java/me/lensfrex/littlebusters/api/v1/utils/database/User.java +++ /dev/null @@ -1,14 +0,0 @@ -package me.lensfrex.littlebusters.api.v1.utils.database; - -import me.lensfrex.littlebusters.api.v1.dao.UserOperators; -import me.lensfrex.littlebusters.api.v1.pojos.UserInformation; -import org.apache.ibatis.session.SqlSession; - -public class User { - public UserInformation getUser(String userName) { - SqlSession sqlSession = MyBatisUtil.getSqlSession(true); - - UserOperators mapper = sqlSession.getMapper(UserOperators.class); - return mapper.getBasicInfoByUserName(userName); - } -} diff --git a/src/main/java/me/lensfrex/littlebusters/api/v1/utils/jwt/JWTManager.java b/src/main/java/me/lensfrex/littlebusters/api/v1/utils/jwt/JWTManager.java index d1d8037..a5b89b3 100644 --- a/src/main/java/me/lensfrex/littlebusters/api/v1/utils/jwt/JWTManager.java +++ b/src/main/java/me/lensfrex/littlebusters/api/v1/utils/jwt/JWTManager.java @@ -2,34 +2,43 @@ package me.lensfrex.littlebusters.api.v1.utils.jwt; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; -import io.jsonwebtoken.security.SignatureException; -import me.lensfrex.littlebusters.api.v1.utils.Time; import java.security.Key; -import java.time.LocalDateTime; +import java.time.LocalDate; +import java.util.Date; import java.util.HashMap; import java.util.Map; public class JWTManager { + public static final int TOKEN_DEFAULT_EXPIRE_DAY = 15; + // todo 时间有限先这样写能跑起来吧 + // todo 第一次生成之后应该存到数据库里边去的 + // todo 这样写的话每一次启动都是不同的密钥,已经生成的密钥会失效的 private final static Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256); - public String createNewJWT(String subject, String user, int invalidDays) { + private final static JWTManager self = new JWTManager(); + private JWTManager() {} + + public static JWTManager getInstance() { + return self; + } + + public String createNewJWT(String user, Date invalidDate) { Map header = new HashMap<>(); header.put("alg", "HS256"); header.put("typ", "JWT"); - LocalDateTime now = Time.getNowDayTime(); + LocalDate now = LocalDate.now(); Map payload = new HashMap<>(); payload.put("user", user); - payload.put("start", now.toString()); - payload.put("exp", now.plusDays(invalidDays).toString()); payload.put("api_ver", "1"); // payload.put("iss", machineId); return Jwts.builder() .setHeader(header) .setClaims(payload) + .setExpiration(invalidDate) .signWith(key) .compact(); diff --git a/src/main/resources/mappers/DatabaseInitSqlMapper.xml b/src/main/resources/mappers/DatabaseInitSqlMapper.xml index 414e4ae..0922d52 100644 --- a/src/main/resources/mappers/DatabaseInitSqlMapper.xml +++ b/src/main/resources/mappers/DatabaseInitSqlMapper.xml @@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + CREATE TABLE `account_basic` ( `uid` int(18) unsigned unique NOT NULL AUTO_INCREMENT COMMENT '用户id,1起,给人看的', diff --git a/src/main/resources/mappers/KeySqlMapper.xml b/src/main/resources/mappers/KeySqlMapper.xml index a660d75..a99b52b 100644 --- a/src/main/resources/mappers/KeySqlMapper.xml +++ b/src/main/resources/mappers/KeySqlMapper.xml @@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - select uid, uuid, passwd as password, deleted, account_status as accountStstus - from `account_basic` - where user_name = #{userName} - - \ No newline at end of file diff --git a/src/main/resources/mappers/RegisterSqlMapper.xml b/src/main/resources/mappers/RegisterSqlMapper.xml deleted file mode 100644 index 689f8ff..0000000 --- a/src/main/resources/mappers/RegisterSqlMapper.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - insert into `LittleBusters`.`account_basic` (`uuid`, `user_name`, `passwd`) - values (#{uuid}, #{userName}, #{password}) - - \ No newline at end of file diff --git a/src/main/resources/mappers/UserSqlMapper.xml b/src/main/resources/mappers/UserSqlMapper.xml new file mode 100644 index 0000000..1272ec8 --- /dev/null +++ b/src/main/resources/mappers/UserSqlMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + insert into `LittleBusters`.`account_basic` (`uuid`, `user_name`, `passwd`) + values (#{uuid}, #{userName}, #{password}) + + + select LAST_INSERT_ID(); + + + \ No newline at end of file diff --git a/src/main/webapp/js/events.js b/src/main/webapp/js/events.js deleted file mode 100644 index 2b5ceaa..0000000 --- a/src/main/webapp/js/events.js +++ /dev/null @@ -1,28 +0,0 @@ -function login() { - console.log("start login"); - username = $("#username").val(); - password = $("#passwd").val(); - - if (!checkInputDataCorrect(username, password)) { - return; - } - - encPassword = encryptPassword(password); - postData = { - "user_name": username, - "password": encPassword - }; - - $.ajax({ - url: "/api/v1/login", - type: "post", - dataType: "json", - data: JSON.stringify(postData), - success: (result) => { - showDialog("Test", "获取到数据:" + JSON.stringify(result)); - }, - error: (msg, status) => { - showMessage("登陆时发生错误:",JSON.stringify(msg)); - } - }) -} \ No newline at end of file