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 @@
+
+
+
+
+
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 key_content as keyContent, key_name as keyName, key_type as keyType
diff --git a/src/main/resources/mappers/LoginSqlMapper.xml b/src/main/resources/mappers/LoginSqlMapper.xml
deleted file mode 100644
index d82f9d0..0000000
--- a/src/main/resources/mappers/LoginSqlMapper.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
- 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 @@
+
+
+
+
+
+
+ select uid, uuid, passwd as password, deleted, account_status as accountStstus
+ from `account_basic`
+ where user_name = #{userName}
+
+
+
+ select exists(select 1 from `account_basic` where user_name = #{userName})
+
+
+
+ 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