org.springframework.cloud
spring-cloud-starter-openfeign
@@ -96,11 +96,20 @@
org.springframework.boot
spring-boot-maven-plugin
+ ${springboot.version}
UTF-8
+ wusthelper.WebBackendMain
+
+
+
+ repackage
+
+
+
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/annotation/RequireToken.java b/backend-main/backend-web/src/main/java/wusthelper/web/annotation/RequireToken.java
new file mode 100644
index 0000000..499f521
--- /dev/null
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/annotation/RequireToken.java
@@ -0,0 +1,12 @@
+package wusthelper.web.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD, ElementType.TYPE})
+public @interface RequireToken {
+ boolean require() default true;
+}
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/TokenTool.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/TokenTool.java
index 1ffbc73..998ab2a 100644
--- a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/TokenTool.java
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/TokenTool.java
@@ -13,7 +13,7 @@ public class TokenTool {
private final static String SECRET = "LingHangStudio.WustHelper";
- private final static long EXPIRE_SCD = Duration.ofDays(3).toSeconds();
+ private final static long EXPIRE_MILLIS = Duration.ofDays(3).toMillis();
private static final Algorithm jwtAlgorithm = Algorithm.HMAC256(SECRET);
@@ -25,7 +25,7 @@ public class TokenTool {
public static String signToken(Long uid, String studentNumber) {
try {
Date now = new Date();
- Date expireAt = new Date(now.getTime() + EXPIRE_SCD);
+ Date expireAt = new Date(now.getTime() + EXPIRE_MILLIS);
return JWT.create()
.withClaim("StuId", uid.toString())
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/code/V2ResponseCode.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/code/V2ResponseCode.java
new file mode 100644
index 0000000..1ed29f6
--- /dev/null
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/code/V2ResponseCode.java
@@ -0,0 +1,486 @@
+package wusthelper.web.api.v2.code;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 响应码枚举
+ *
+ * - BASE_ 基本状态码: 10000-19999
+ * - AUTH_ 用户身份验证C: 20000-29999
+ * - JWC_ 教务处: 30000-39999
+ * - LIB_ 图书馆: 40000-49999
+ * - VOL_ 工时: 50000-59999
+ * - YJS_ 研究生: 80000-89999
+ *
+ * 状态码表示含义:
+ * 12345: 1号模块23号接口45型状态
+ *
+ *
+ *
+ *
+ * 关于状态码统一:
+ * 由于安卓端表示成功状态码过于繁杂,这里对成功的状态码进行了统一:
+ * 所有成功状态: 10000
+ * 所有因官方崩溃产生的失败,但读取本地数据成功的状态: 11000
+ * 修改: 2021/3/12 田
+ *
+ *
+ * LingHang业务接口
+ *
+ * @Author WSharkCoder
+ * @Date 2021/1/15 21:40
+ * @ClassName ResponseCode
+ */
+@AllArgsConstructor
+@Getter
+public enum V2ResponseCode {
+ //基本状态码 START (1)
+ /**
+ * 成功
+ */
+ SUC(10000, "成功"),
+ /**
+ * 本地成功
+ */
+ LOCAL_SUC(11000, "本地成功"),
+
+ /**
+ * 操作频繁
+ */
+ LIMIT_REQUEST(99999, "操作频繁,请稍后再试"),
+ /**
+ * 失败
+ */
+ ERR(11111, "失败"),
+ /**
+ * 参数缺失或参数类型错误
+ */
+ BASE_PARAM_ERR(10001, "参数缺失或参数类型错误"),
+ /**
+ * 拒绝请求
+ */
+ REQUEST_DENIED(10002, "请求错误"),
+ /**
+ * 接口调用错误:请求方式出错或者参数缺失
+ */
+ REQUEST_CALLED_ERR(10003, "接口调用错误:请求出错,data中为错误信息,请检查并详细参照api文档使用该接口"),
+ /**
+ * 客户端连接中断
+ */
+ CLIENT_ABORT_ERR(10004, "连接中断"),
+ //基本状态码 END
+
+ //身份验证状态码 START (2)
+ /**
+ * 用户身份验证模块异常
+ */
+ AUTH_ERR(20001, "用户身份验证模块异常"),
+ /**
+ * 用户身份校验失败:请求缺失令牌TOKEN
+ */
+ AUTH_ERR_TOKEN_MISS(21001, "用户身份校验失败:请求缺失令牌TOKEN"),
+ /**
+ * 用户身份校验失败:TOKEN无效或过期
+ */
+ AUTH_ERR_TOKEN_INVALID(21002, "用户身份校验失败:TOKEN无效或过期"),
+ /**
+ * TOKEN解密成功
+ */
+ AUTH_DECODE_FOR_STUNUM_SUC(10000, "TOKEN解密成功"),
+ /**
+ * TOKEN解密失败
+ */
+ AUTH_DECODE_FOR_STUNUM_ERR(21101, "TOKEN解密失败"),
+ //身份验证状态码 END
+
+
+ //JWC模块状态码 START (3)
+ /**
+ * 教务处密码已修改,请重新登录!
+ */
+ JWC_PWD_NED_UPD(30001, "教务处密码已修改,请重新登录"),
+ /**
+ * 教务处登录成功
+ */
+ JWC_LOGIN_SUC(10000, "教务处登录成功"),
+ /**
+ * 教务登录失败:教务崩溃
+ */
+ JWC_LOGIN_ERR_JWC_ERR(30104, "登录失败:教务系统异常,请重试"),
+ /**
+ * 教务处登录失败:账号或密码错误
+ */
+ JWC_LOGIN_ERR_JWC_FIN_INFO_ERR(30101, "登陆失败:账号或密码错误"),
+ /**
+ * 教务处登录失败:需用户前往教务处修改默认密码
+ */
+ JWC_LOGIN_ERR_JWC_MOD_DEF_PWD(30102, "登录失败:请前往教务官网修改默认密码"),
+ /**
+ * 教务登录失败:教务崩溃|本地登录失败:本地账号或密码错误
+ */
+ JWC_LOGIN_ERR_JWC_ERR_INFO_ERR(30103, "登录失败:账号或密码错误,或教务异常,请重试"),
+ /**
+ * 教务处登录失败:重试次数过多
+ */
+ JWC_LOGIN_ERR_JWC_RETRY_TOO_MANY_TIMES_ERR(30101, "登录失败:密码重试次数已达三次,继续重试可能会导致暂时封禁,请等待约三分钟后重试,请确保账号和密码为“统一认证平台”的账号和密码,如忘记可前往官网进行密码找回"),
+ /**
+ * 教务处登录失败:重试次数过多被封禁
+ */
+ JWC_LOGIN_ERR_JWC_USER_WAS_BANNED_ERR(30101, "登录失败:密码总重试次数已达五次,已被暂时封禁,请等待约十分钟后重试,请确保账号和密码为“统一认证平台”的账号和密码,如忘记可前往官网进行密码找回"),
+ /**
+ * 教务登录失败:教务崩溃|本地登录成功
+ */
+ JWC_LOGIN_SUC_JWC_ERR_LOC_SUC(11000, "教务异常:缓存登录成功"),
+ /**
+ * 教务处获取用户信息成功
+ */
+ JWC_GETSTUINFO_SUC(10000, "教务处获取用户信息成功"),
+ /**
+ * 教务处获取用户信息失败:教务处崩溃|本地学生信息获取成功
+ */
+ JWC_GETSTUINFO_SUC_JWC_ERR_LOC_SUC(11000, "教务异常:缓存学生信息获取成功"),
+ /**
+ * 教务处获取用户信息失败,用户不存在
+ */
+ JWC_GETSTUINFO_ERR_NO_SUCH_STU(30201, "教务处获取用户信息失败:用户不存在"),
+ /**
+ * 教务处获取课表信息成功
+ */
+ JWC_GETCURRICULUM_SUC(10000, "教务处获取课表信息成功"),
+ /**
+ * 教务处获取课表信息失败:教务崩溃|本地课表信息获取成功
+ */
+ JWC_GETCURRICULUM_SUC_JWC_ERR_LOC_SUC(11000, "教务异常:缓存课表信息获取成功"),
+ /**
+ * 教务异常:获取课表失败
+ */
+ JWC_GETCURRICULUM_ERR_JWC_ERR(30301, "教务异常:获取课表失败"),
+ /**
+ * 教务公告列表获取成功
+ */
+ JWC_GETJWCANNLIST_SUC(10000, "教务公告列表获取成功"),
+ /**
+ * 教务公告内容获取成功
+ */
+ JWC_GETJWCANNCNT_SUC(10000, "教务公告内容获取成功"),
+ /**
+ * 教务处成绩获取成功
+ */
+ JWC_GETGRADE_SUC(10000, "教务处成绩获取成功"),
+ /**
+ * 教务处成绩获取失败:需用户前往教务处评教|本地成绩获取成功
+ */
+ JWC_GETGRADE_ERR_NEED_EVALUATE_TEACHING(30601, "教务处成绩获取失败:请前往教务官网评教"),
+ /**
+ * 教务处成绩获取失败:教务处崩溃|本地成绩获取成功
+ */
+ JWC_GETGRADE_ERR_JWC_ERR_LOC_SUC(11000, "教务异常:缓存成绩获取成功"),
+ /**
+ * 教务处学分明细获取成功
+ */
+ JWC_GETCREDIT_SUC(10000, "教务处学分明细获取成功"),
+ /**
+ * 教务处学分明细获取失败:教务处崩溃|本地学分明细获取成功
+ */
+ JWC_GETCREDIT_SUC_JWC_ERR_LOC_SUC(11000, "教务异常:缓存学分明细获取成功"),
+
+ JWC_TRAINING_SCHEME_SUC(10000, "教务处培养方案获取成功"),
+ JWC_TRAINING_SCHEME_ERR(30701, "教务异常,培养方案获取失败"),
+
+ //JWC模块验证码 END
+
+
+ //LIB状态码 START (4)
+ /**
+ * 图书馆密码已经修改,请重新登录!
+ */
+ LIB_PWD_NED_UPD(40001, "图书馆密码已经修改,请重新登录!"),
+ /**
+ * 图书馆登录已过期,请重新登录
+ */
+ LIB_LOGIN_EXPIRE(40002, "图书馆登录已过期,请重新登录"),
+ /**
+ * 图书馆登录成功
+ */
+ LIB_LOGIN_SUC(10000, "图书馆登录成功"),
+ /**
+ * 图书馆登录失败:账号或密码错误
+ */
+ LIB_LOGIN_ERR_LIB_FIN_INFO_ERR(40101, "登录失败:账号或密码错误"),
+ /**
+ * 图书馆登录失败:验证码错误
+ */
+ LIB_LOGIN_ERR_WRONG_AUTH_CODE(40103, "登录失败:验证码错误"),
+ /**
+ * 图书馆登录失败:登陆失败次数过多,请稍后重试
+ */
+ LIB_LOGIN_ERR_TOO_MUCH_TIME(40104, "登录失败:登陆失败次数过多,请稍后重试"),
+ /**
+ * 图书馆登录失败:图书馆崩溃|本地登录失败:账号或密码错误
+ */
+ LIB_LOGIN_ERR_LIB_ERR_INFO_ERR(40102, "登录失败:账号或密码错误"),
+ /**
+ * 图书馆登录失败:图书管崩溃|本地登录成功
+ */
+ LIB_LOGIN_ERR_LIB_ERR_LOC_SUC(11000, "图书管异常:缓存登录成功"),
+ /**
+ * 图书馆历史借阅记录获取成功
+ */
+ LIB_GETRENTHISTORY_SUC(10000, "图书馆历史借阅记录获取成功"),
+ /**
+ * 图书馆崩溃|本地图书馆借阅历史缓存获取成功
+ */
+ LIB_GETRENTHISTORY_SUC_LIB_ERR_LOC_SUC(11000, "图书馆异常:缓存图书馆借阅历史缓存获取成功"),
+ /**
+ * 图书馆当前借阅记录获取成功
+ */
+ LIB_GETCURRENTRENT_SUC(10000, "图书馆当前借阅记录获取成功"),
+ /**
+ * 图书馆崩溃|本地当前借阅获取成功
+ */
+ LIB_GETCURRENTRENT_SUC_LIB_ERR_LOC_SUC(11000, "图书馆异常:缓存当前借阅获取成功"),
+ /**
+ * 图书馆异常:缓存借阅记录获取成功
+ */
+ LIB_GETRENT_SUC_LIB_ERR_LOC_SUC(11000, "图书馆异常:缓存借阅记录获取成功"),
+ /**
+ * 借阅记录获取成功
+ */
+ LIB_GETRENT_SUC(10000, "借阅记录获取成功"),
+ /**
+ * 图书馆公告列表获取成功
+ */
+ LIB_GETLIBANNLIST_SUC(10000, "图书馆公告列表获取成功"),
+ /**
+ * 图书馆公告内容获取成功
+ */
+ LIB_GETLIBANNCNT_SUC(10000, "图书馆公告内容获取成功"),
+ /**
+ * 图书馆检索图书成功
+ */
+ LIB_SEARCH_SUC(10000, "图书馆检索图书成功"),
+ /**
+ * 图书馆检索图书异常
+ */
+ LIB_SEARCH_ERR(40601, "图书馆检索图书异常"),
+ /**
+ * 图书馆获取图书详情成功
+ */
+ LIB_GETBOOKDETAIL_SUC(10000, "图书馆获取图书详情成功"),
+ /**
+ * 图书馆获取图书详情异常
+ */
+ LIB_GETBOOKDETAIL_ERR(40701, "图书馆获取图书详情异常"),
+ /**
+ * 图书馆增添收藏成功
+ */
+ LIB_ADDCOLLECTION_SUC(10000, "图书馆增添收藏成功"),
+ /**
+ * 图书馆添加收藏异常
+ */
+ LIB_ADDCOLLECTION_ERR(40801, "图书馆添加收藏异常"),
+ /**
+ * 图书馆收藏列表查询成功
+ */
+ LIB_LISTCOLLECTION_SUC(10000, "图书馆收藏列表查询成功"),
+ /**
+ * 图书馆收藏删除成功
+ */
+ LIB_DELCOLLECTION_SUC(10000, "图书馆收藏删除成功"),
+ /**
+ * 图书馆获取验证码成功
+ */
+ LIB_GETYZM_SUC(11111, "图书馆获取验证码成功"),
+ /**
+ * 图书馆获取借阅历史和当前借阅成功
+ */
+ LIB_GETCRH_SUC(10101, "图书馆获取借阅历史和当前借阅成功"),
+
+ //LIB状态码 END
+
+ //YJS状态码 START ()
+
+ /**
+ * 研究生官网登录成功
+ */
+ YJS_LOGIN_SUC(10000, "研究生官网登录成功"),
+ /**
+ * 研究生官网登录失败:账号或密码错误
+ */
+ YJS_LOGIN_ERR_YJS_FIN_INFO_ERR(80002, "登录失败:账号或密码错误"),
+
+ YJS_LOGIN_ERROR(11111, "登录失败,研究生官网异常,请稍后再试"),
+
+ YJS_GETSTUINFO_SUC(10000, "研究生官网获取用户信息成功"),
+
+ YJS_GETSTUINFO_ERR(11111, "研究生官网异常,获取用户信息失败,请稍后再试"),
+
+ YJS_GETGRADE_SUC(10000, "研究生官网成绩获取成功"),
+
+ YJS_GETGRADE_ERR(11111, "研究生官网异常,获取成绩失败,请稍后再试"),
+
+ YJS_GETCOURSE_SUC(10000, "研究生官网课表获取成功"),
+
+ YJS_GETCOURSE_ERR(11111, "研究生官网异常,刷新课表失败,请稍后再试"),
+
+ YJS_GETTRAINPLAN_SUC(10000, "研究生官网培养管理获取成功"),
+
+ YJS_GETTRAINPLAN_ERR(11111, "研究生官网异常,获取培养管理失败,请稍后再试"),
+
+ YJS_PWD_NED_UPD(80001, "研究生官网密码已修改,请重新登录"),
+
+
+ //YJS状态码 END
+
+ //倒计时 START (5)
+ /**
+ * 倒计时:操作成功
+ */
+ COUNTDOWN_OPERATION_SUC(10000, "倒计时:操作成功"),
+ //倒计时 END
+
+
+ //消息中心 START (6)
+ /**
+ * 发送邮件成功
+ */
+ SEND_EMAIL_SUC(10000, "发送邮件成功"),
+ /**
+ * 无效的消息来源
+ */
+ MSG_ORIGIN_INVALID(60003, "无效的消息来源"),
+ /**
+ * 发送邮件失败
+ */
+ SEND_EMAIL_ERR(60001, "发送邮件失败"),
+ /**
+ * 发送邮件失败,收件邮箱不存在
+ */
+ SEND_EMAIL_ERR_INVALID_TAR_ERR(60002, "发送邮件失败,收件邮箱不存在或产生其他问题"),
+ /**
+ * 向飞书通知群发送消息成功
+ */
+ SEND_MSG_TO_FEISHU_SUC(10000, "向飞书通知群发送消息成功"),
+ /**
+ * 向飞书通知群发送消息失败
+ */
+ SEND_MSG_TO_FEISHU_ERR(60101, "向飞书通知群发送消息失败"),
+ /**
+ * 向安卓客户端发送消息成功
+ */
+ SEND_MSG_TO_ANDROID_SUC(10000, "向安卓客户端发送消息成功"),
+ /**
+ * 向安卓客户端发送消息失败
+ */
+ SEND_MSG_TO_ANDROID_ERR(60201, "向安卓客户端发送消息失败,用户可能不在线上,或是发生错误"),
+ /**
+ * 获取全部安卓端记录消息成功
+ */
+ ANDROID_MSG_GET_SUC(10000, "获取全部安卓端记录消息成功"),
+ //消息中心 END
+
+
+ //物理实验 START (7)
+ /**
+ * 登陆失败:账号或密码错误,或不在实验课不在本学期
+ */
+ WLSY_LOGIN_ERR_WLSY_FIN_INFO_ERR(70001, "登陆失败:账号或密码错误,或不在实验课不在本学期"),
+ /**
+ * 登陆失败:实验系统官网异常,请重试
+ */
+ WLSY_LOGIN_ERR_WLSY_ERR(70002, "登陆失败:实验系统官网异常,请重试"),
+ /**
+ * 实验系统异常:缓存登陆成功
+ */
+ WLSY_LOGIN_ERR_WLSY_ERR_LOC_SUC(11000, "实验系统异常:缓存登陆成功"),
+ /**
+ * 物理实验系统登陆成功
+ */
+ WLSY_LOGIN_SUC(10000, "物理实验系统登陆成功"),
+ /**
+ * 获取已选实验课失败:实验系统官网异常
+ */
+ WLSY_GETCOURSE_ERR_WLSY_ERR(70101, "获取已选实验课失败:实验系统官网异常"),
+ /**
+ * 获取已选实验课失败:登录过期
+ */
+ WLSY_GETCOURSE_ERR_LOGIN_EXPIRED(70102, "获取已选实验课失败:登录过期"),
+ /**
+ * 实验系统异常:缓存获取已选实验课成功
+ */
+ WLSY_GETCOURSE_ERR_WLSY_ERR_LOC_SUC(11000, "实验系统异常:缓存获取已选实验课成功"),
+ /**
+ * 获取已选实验课成功
+ */
+ WLSY_GETCOURSE_SUC(10000, "获取已选实验课成功"),
+ //物理实验 END
+
+
+ //教室查询 START (8)
+ /**
+ * 查询空教室成功
+ */
+ CLSR_SEARCH_EMPTY_CLASSROOM_SUC(10000, "查询空教室成功"),
+ /**
+ * 查询学院列表成功
+ */
+ CLSR_GET_COLLEGE_LIST_SUC(10000, "查询学院列表成功"),
+ /**
+ * 查询课名列表成功
+ */
+ CLSR_GET_COURSE_NAME_LIST_SUC(10000, "查询课名列表成功"),
+ /**
+ * 查询课程详情成功
+ */
+ CLSR_GET_COURSE_DETAIL_LIST_SUC(10000, "查询课程详情成功"),
+ /**
+ * 查询结果为空
+ */
+ CLSR_RESULT_EMPTY(80001, "查询结果为空"),
+ /**
+ * 已是最后一页
+ */
+ CLSR_NO_MORE_PAGE(80002, "已是最后一页"),
+ //教室查询 END (8)
+
+
+ //助手信息查询 BEGIN (9)
+ /**
+ * 获取用户详情信息成功
+ */
+ GET_USER_INFO_SUC(10000, "获取用户详情信息成功"),
+ /**
+ * 获取用户操作记录成功
+ */
+ GET_USER_OPE_RECORD_SUC(10000, "获取用户操作记录成功"),
+ /**
+ * 获取学号列表成功
+ */
+ GET_STU_NUM_LIST_SUC(10000, "获取学号列表成功"),
+ /**
+ * 获取用户信息失败,用户不存在
+ */
+ GET_USER_INFO_ERR_USER_NOT_EXIST(90001, "获取用户信息失败,用户不存在"),
+ /**
+ * 获取用户操作记录失败,用户不存在
+ */
+ GET_USER_OPE_RECORD_ERR_USER_NOT_EXIST(90101, "获取用户操作记录失败,用户不存在"),
+ /**
+ * 目标日志不存在或为空
+ */
+ LOG_EMPTY_OR_NOT_EXIST(90201, "目标日志不存在或为空"),
+ /**
+ * 获取日志信息成功
+ */
+ GET_LOG_INFO_SUC(10000, "获取日志信息成功"),
+ /**
+ * 获取时段请求信息成功
+ */
+ GET_TIME_REPORT_SUC(10000, "获取时段请求信息成功"),
+ //助手信息查询 END (9)
+ ;
+
+ private final int code;
+ private final String msg;
+}
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/CourseResponse.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/CourseResponse.java
index 1526933..3264acb 100644
--- a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/CourseResponse.java
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/CourseResponse.java
@@ -1,9 +1,15 @@
package wusthelper.web.api.v2.dto.response;
import cn.wustlinghang.mywust.data.global.Course;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class CourseResponse {
/**
* 课程名称
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/GraduateScoreResponse.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/graduate/GraduateScoreResponse.java
similarity index 87%
rename from backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/GraduateScoreResponse.java
rename to backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/graduate/GraduateScoreResponse.java
index 397043e..5411a15 100644
--- a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/GraduateScoreResponse.java
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/graduate/GraduateScoreResponse.java
@@ -1,4 +1,4 @@
-package wusthelper.web.api.v2.dto.response;
+package wusthelper.web.api.v2.dto.response.graduate;
import cn.wustlinghang.mywust.data.global.Score;
import lombok.Data;
@@ -25,7 +25,7 @@ public class GraduateScoreResponse {
graduateScoreResponse.setName(score.getCourseName());
graduateScoreResponse.setCredit(Double.parseDouble(score.getCredit()));
graduateScoreResponse.setTerm(Integer.parseInt(score.getTerm()));
- graduateScoreResponse.setPoint(score.getGradePoint());
+ graduateScoreResponse.setPoint(score.getScore());
return graduateScoreResponse;
}
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/GraduateStudentInfoResponse.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/graduate/GraduateStudentInfoResponse.java
similarity index 96%
rename from backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/GraduateStudentInfoResponse.java
rename to backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/graduate/GraduateStudentInfoResponse.java
index f171837..8e53efd 100644
--- a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/GraduateStudentInfoResponse.java
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/graduate/GraduateStudentInfoResponse.java
@@ -1,4 +1,4 @@
-package wusthelper.web.api.v2.dto.response;
+package wusthelper.web.api.v2.dto.response.graduate;
import cn.wustlinghang.mywust.data.global.StudentInfo;
import com.fasterxml.jackson.annotation.JsonInclude;
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/library/BookDetailResponse.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/library/BookDetailResponse.java
new file mode 100644
index 0000000..9968f62
--- /dev/null
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/library/BookDetailResponse.java
@@ -0,0 +1,94 @@
+package wusthelper.web.api.v2.dto.response.library;
+
+import cn.wustlinghang.mywust.data.library.origin.BookSearchResult;
+import cn.wustlinghang.mywust.data.library.parsed.BookDetail;
+import cn.wustlinghang.mywust.data.library.parsed.BookHolding;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class BookDetailResponse {
+ /**
+ * 题名/责任者
+ */
+ private String bookNameAndAuth;
+
+ /**
+ * 出版发行项
+ */
+ private String publisher;
+
+ /**
+ * ISBN及定价
+ */
+ private String ISBN;
+
+ /**
+ * 内容简介
+ */
+ private String introduction;
+
+ /**
+ * 图片URL
+ */
+ private String imgUrl;
+
+ /**
+ * 是否已经收藏
+ */
+ private Integer isCollection;
+
+ /**
+ * 租借信息
+ */
+ private List list;
+
+ public static BookDetailResponse from(BookDetail bookDetail) {
+ BookDetailResponse bookDetailResponse = new BookDetailResponse();
+
+ var extraInfo = bookDetail.getExtraInfoMap();
+ bookDetailResponse.setBookNameAndAuth(extraInfo.get("题名/责任者"));
+ bookDetailResponse.setPublisher(extraInfo.get("出版发行项"));
+
+ bookDetailResponse.setISBN(bookDetail.getIsbn());
+ bookDetailResponse.setIntroduction(bookDetail.getIntroduction());
+ bookDetailResponse.setIsCollection(0);
+ bookDetailResponse.setImgUrl(bookDetail.getCoverUrl());
+// bookDetailResponse.setList();
+
+ return bookDetailResponse;
+ }
+
+ @Data
+ public static class BookHoldingInfo {
+ /**
+ * 索书号
+ */
+ private String callNo;
+ /**
+ * 条号码
+ */
+ private String barCode;
+ /**
+ * 馆藏地
+ */
+ private String location;
+ /**
+ * 是否可借
+ */
+ private String status;
+
+ public static BookHoldingInfo from(BookHolding bookHolding) {
+ BookHoldingInfo bookHoldingInfo = new BookHoldingInfo();
+ bookHoldingInfo.setCallNo(bookHolding.getCallNumber());
+ bookHoldingInfo.setBarCode(bookHolding.getBarCode());
+ bookHoldingInfo.setLocation(bookHolding.getLocation());
+ bookHoldingInfo.setStatus(bookHolding.getStatus());
+
+ return bookHoldingInfo;
+ }
+ }
+}
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/library/BookSearchResponseItem.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/library/BookSearchResponseItem.java
new file mode 100644
index 0000000..fc8fe92
--- /dev/null
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/library/BookSearchResponseItem.java
@@ -0,0 +1,78 @@
+package wusthelper.web.api.v2.dto.response.library;
+
+import cn.wustlinghang.mywust.data.library.origin.BookSearchResult;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+import java.util.Arrays;
+
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class BookSearchResponseItem {
+ /**
+ * 书名
+ */
+ private String title;
+
+ /**
+ * 作者
+ */
+ private String author;
+
+ /**
+ * 发布时间
+ */
+ private String pubYear;
+
+ /**
+ * 出版方
+ */
+ private String publisher;
+
+ /**
+ * 索书号
+ */
+ private String callNo;
+
+ /**
+ * 书籍详情URL
+ */
+ private String detailUrl;
+
+ /**
+ * 图片URL
+ */
+ private String imgUrl;
+
+ /**
+ * 馆藏总数
+ */
+ private String allNum;
+
+ /**
+ * 可借数目
+ */
+ private String remainNum;
+
+ private String isbn;
+
+ @JsonInclude(JsonInclude.Include.NON_NULL)
+ public static BookSearchResponseItem from(BookSearchResult bookSearchResult) {
+ BookSearchResponseItem bookSearchResponseItem = new BookSearchResponseItem();
+ bookSearchResponseItem.setTitle(bookSearchResult.getTitle());
+ bookSearchResponseItem.setAuthor(bookSearchResult.getAuthor());
+ bookSearchResponseItem.setPubYear(bookSearchResult.getPubYear());
+ bookSearchResponseItem.setPublisher(bookSearchResult.getPublisher());
+
+ var callNumberString = Arrays.toString(bookSearchResult.getCallNumber().toArray(new String[0]));
+ bookSearchResponseItem.setCallNo(callNumberString);
+
+ bookSearchResponseItem.setIsbn(bookSearchResult.getIsbn());
+// bookSearchResponseItem.setDetailUrl();
+// bookSearchResponseItem.setImgUrl();
+// bookSearchResponseItem.setAllNum();
+// bookSearchResponseItem.setRemainNum();
+
+ return bookSearchResponseItem;
+ }
+}
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/library/CurrentRentResponse.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/library/CurrentRentResponse.java
new file mode 100644
index 0000000..bc2b900
--- /dev/null
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/library/CurrentRentResponse.java
@@ -0,0 +1,31 @@
+package wusthelper.web.api.v2.dto.response.library;
+
+import cn.wustlinghang.mywust.data.library.origin.CurrentLoanBook;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class CurrentRentResponse {
+ private String bookCode;
+ private String reRentNum = "";
+ private String bookPlace;
+ private String bookUrl;
+ private String rentTime;
+ private String bookName;
+ private String returnTime;
+
+ private static final String bookUrlFormat = "https://libsys.wust.edu.cn/meta-local/opac/bibs/%s/infos";
+
+ public static CurrentRentResponse from(CurrentLoanBook currentLoanBook) {
+ CurrentRentResponse currentRentResponse = new CurrentRentResponse();
+ currentRentResponse.setBookCode(currentLoanBook.getBarCode());
+ currentRentResponse.setBookPlace(currentLoanBook.getLocation());
+ currentRentResponse.setBookUrl(bookUrlFormat.formatted(currentLoanBook.getBibId()));
+ currentRentResponse.setRentTime(currentLoanBook.getLoanDate());
+ currentRentResponse.setBookName(currentLoanBook.getTitle());
+ currentRentResponse.setReturnTime(currentLoanBook.getDueDate());
+
+ return currentRentResponse;
+ }
+}
\ No newline at end of file
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/library/RentHistoryResponse.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/library/RentHistoryResponse.java
new file mode 100644
index 0000000..d84cbf9
--- /dev/null
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/library/RentHistoryResponse.java
@@ -0,0 +1,29 @@
+package wusthelper.web.api.v2.dto.response.library;
+
+import cn.wustlinghang.mywust.data.library.origin.HistoryLoanBook;
+import lombok.Data;
+
+@Data
+public class RentHistoryResponse {
+ private String bookCode;
+ private String bookPlace;
+ private String bookAuthor;
+ private String bookUrl;
+ private String rentTime;
+ private String bookName;
+ private String returnTime;
+
+ private static final String bookUrlFormat = "https://libsys.wust.edu.cn/meta-local/opac/bibs/%s/infos";
+
+ public static RentHistoryResponse from(HistoryLoanBook historyLoanBook) {
+ RentHistoryResponse currentRentResponse = new RentHistoryResponse();
+ currentRentResponse.setBookCode(historyLoanBook.getBarCode());
+ currentRentResponse.setBookPlace(historyLoanBook.getLocation());
+ currentRentResponse.setBookUrl(bookUrlFormat.formatted(historyLoanBook.getBibId()));
+ currentRentResponse.setRentTime(historyLoanBook.getLoanDate());
+ currentRentResponse.setBookName(historyLoanBook.getTitle());
+ currentRentResponse.setReturnTime(historyLoanBook.getReturnDate());
+
+ return currentRentResponse;
+ }
+}
\ No newline at end of file
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/PhysicsCourseResponse.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/physics/PhysicsCourseResponse.java
similarity index 96%
rename from backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/PhysicsCourseResponse.java
rename to backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/physics/PhysicsCourseResponse.java
index 00b9720..008b652 100644
--- a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/PhysicsCourseResponse.java
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/physics/PhysicsCourseResponse.java
@@ -1,8 +1,7 @@
-package wusthelper.web.api.v2.dto.response;
+package wusthelper.web.api.v2.dto.response.physics;
import cn.wustlinghang.mywust.data.physics.PhysicsCourse;
import lombok.Data;
-import wusthelper.WebBackendMain;
import wusthelper.web.util.GlobalLogger;
import java.sql.Date;
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/CombineLoginResponse.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/undergrad/CombineLoginResponse.java
similarity index 61%
rename from backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/CombineLoginResponse.java
rename to backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/undergrad/CombineLoginResponse.java
index b6aa63b..f0826e3 100644
--- a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/CombineLoginResponse.java
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/undergrad/CombineLoginResponse.java
@@ -1,6 +1,6 @@
-package wusthelper.web.api.v2.dto.response;
+package wusthelper.web.api.v2.dto.response.undergrad;
-import cn.wustlinghang.mywust.data.global.Course;
+import wusthelper.web.api.v2.dto.response.CourseResponse;
import java.util.List;
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/StudentInfoResponse.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/undergrad/StudentInfoResponse.java
similarity index 93%
rename from backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/StudentInfoResponse.java
rename to backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/undergrad/StudentInfoResponse.java
index b5f5b1e..2e86134 100644
--- a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/StudentInfoResponse.java
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/dto/response/undergrad/StudentInfoResponse.java
@@ -1,4 +1,4 @@
-package wusthelper.web.api.v2.dto.response;
+package wusthelper.web.api.v2.dto.response.undergrad;
import cn.wustlinghang.mywust.data.global.StudentInfo;
import lombok.Data;
diff --git a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/handler/GlobalExceptionHandler.java b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/handler/GlobalExceptionHandler.java
index 41ac441..afefde1 100644
--- a/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/handler/GlobalExceptionHandler.java
+++ b/backend-main/backend-web/src/main/java/wusthelper/web/api/v2/handler/GlobalExceptionHandler.java
@@ -2,8 +2,11 @@ package wusthelper.web.api.v2.handler;
import cn.wustlinghang.mywust.exception.ApiException;
import cn.wustlinghang.mywust.exception.ParseException;
+import com.auth0.jwt.exceptions.JWTVerificationException;
+import com.auth0.jwt.exceptions.TokenExpiredException;
import com.fasterxml.jackson.databind.JsonMappingException;
import feign.FeignException;
+import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.HttpMediaTypeNotSupportedException;
@@ -12,8 +15,12 @@ import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
+import org.springframework.web.servlet.NoHandlerFoundException;
import wusthelper.code.ServiceCode;
+import wusthelper.web.api.v2.code.V2ResponseCode;
import wusthelper.web.exception.ServiceException;
import wusthelper.web.response.Response;
@@ -47,6 +54,24 @@ public class GlobalExceptionHandler {
return Response.error(ServiceCode.ServerInternalError);
}
+ @ResponseBody
+ @ExceptionHandler(JWTVerificationException.class)
+ public Response
+
+
+