diff --git a/web/src/main/java/com/ibeetl/jlw/entity/LoginTodo.java b/web/src/main/java/com/ibeetl/jlw/entity/LoginTodo.java
new file mode 100644
index 00000000..cc9a0327
--- /dev/null
+++ b/web/src/main/java/com/ibeetl/jlw/entity/LoginTodo.java
@@ -0,0 +1,100 @@
+package com.ibeetl.jlw.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ibeetl.admin.core.entity.CoreUser;
+import lombok.*;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 功能描述:
+ * 第三方登录封装实体
+ *
+ * @Author: lx
+ * @Date: 2022/12/11 14:56
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class LoginTodo implements Serializable {
+
+ private static final long serialVersionUID = 1257693451422916110L;
+
+ /**
+ * 账号(一般是#{@link CoreUser#getCode})
+ */
+ private String username;
+ /**
+ * 密码
+ */
+ private String password;
+ /**
+ * 角色ID 3老师 4学生
+ */
+ private ThirdRole roleid;
+ /**
+ * 教师ID
+ */
+ private String teacherid;
+ /**
+ * 学生ID
+ */
+ private String studentid;
+ /**
+ * 账号(一般是#{@link CoreUser#getName})
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private String sex;
+ /**
+ * 学校(院校)
+ */
+ private String school;
+ /**
+ * 院系
+ */
+ private String college;
+ /**
+ * 专业
+ */
+ private String major;
+ /**
+ * 班级
+ */
+ @JsonProperty("class")
+ private String schoolclass;
+ /**
+ * 学生学号
+ */
+ private String studentNo;
+
+ /**
+ * 第三方系统中定义的权限ID
+ * 3老师 4学生
+ */
+ @Getter
+ @RequiredArgsConstructor
+ public enum ThirdRole {
+ TEACHER_ROLE("3"), STUDENT_ROLE("4");
+
+ @JsonValue
+ final private String code;
+ }
+
+ /**
+ * 转换成JSON格式
+ * @return
+ */
+ @SneakyThrows
+ public String toJSONString() {
+ ObjectMapper mapper = new ObjectMapper();
+ return mapper.writeValueAsString(this);
+ }
+}
\ No newline at end of file
diff --git a/web/src/main/java/com/ibeetl/jlw/service/LoginTodoService.java b/web/src/main/java/com/ibeetl/jlw/service/LoginTodoService.java
new file mode 100644
index 00000000..e063bda5
--- /dev/null
+++ b/web/src/main/java/com/ibeetl/jlw/service/LoginTodoService.java
@@ -0,0 +1,127 @@
+package com.ibeetl.jlw.service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.ibeetl.admin.core.entity.CoreUser;
+import com.ibeetl.jlw.dao.StudentDao;
+import com.ibeetl.jlw.dao.TeacherDao;
+import com.ibeetl.jlw.entity.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.List;
+import java.util.function.Consumer;
+
+import static cn.jlw.util.CacheUserUtil.getStudent;
+import static cn.jlw.util.CacheUserUtil.getTeacher;
+import static com.ibeetl.admin.core.util.user.CacheUserUtil.getUser;
+import static com.ibeetl.jlw.enums.GenderEnum.UN_KNOW;
+
+/**
+ * 功能描述:
+ * 第三方应用,登录Service
+ * @author: mlx
+ * @description:
+ * @date: 2022/12/11 15:35
+ * @version: 1.0
+ */
+@Service
+@Transactional
+@Validated
+public class LoginTodoService {
+
+ @Autowired private TeacherDao teacherDao;
+ @Autowired private StudentDao studentDao;
+ /**
+ * 功能描述:
+ * 设置学生信息
+ *
+ * @param student 登录的学生信息
+ * @param coreUser 登录用户信息
+ * @param consumer 后置处理
+ * @return
+ * @Author: lx
+ * @Date: 2022/12/11 15:33
+ */
+ public LoginTodo buildStudentLoginTodo(Student student, CoreUser coreUser, Consumer consumer) {
+
+ Assert.isTrue(ObjectUtil.isAllNotEmpty(student, coreUser), "登录的用户信息不能为空!");
+ Long studentId = student.getStudentId();
+ List studentExtendInfoList = studentDao.getStudentExtendSchoolInfo(studentId.toString());
+ StudentExtendSchoolInfo first = CollectionUtil.getFirst(studentExtendInfoList);
+ Assert.notNull(first, "未获取到院校信息!");
+ // 类型为未知 时候,传递null
+ String gender = UN_KNOW.equals(student.getStudentGender()) || student.getStudentGender() == null ? null : student.getStudentGender().getText();
+
+ LoginTodo loginTodo = LoginTodo.builder().username(coreUser.getCode())
+ .password(coreUser.getPassword())
+ .roleid(LoginTodo.ThirdRole.STUDENT_ROLE)
+ .studentid(student.getStudentId().toString())
+ .name(coreUser.getName()).sex(gender)
+ .school(first.getUniversitiesCollegesName())
+ .college(first.getUniversityFacultyName())
+ .major(first.getUniversitySystemName())
+ .schoolclass(first.getClassName())
+ .studentNo(student.getStudentSn())
+ .build();
+ consumer.accept(loginTodo);
+ return loginTodo;
+ }
+
+ /**
+ * 功能描述:
+ * 设置教师信息
+ *
+ * @param teacher 登录的教师信息
+ * @param coreUser 登录用户信息
+ * @param consumer 后置处理
+ * @return
+ * @Author: lx
+ * @Date: 2022/12/11 15:33
+ */
+ public LoginTodo buildTeacherLoginTodo(Teacher teacher, CoreUser coreUser, Consumer consumer) {
+
+ Assert.isTrue(ObjectUtil.isAllNotEmpty(teacher, coreUser), "登录的用户信息不能为空!");
+
+ Long teacherId = teacher.getTeacherId();
+ List teacherExtendInfoList = teacherDao.getTeacherExtendSchoolInfo(teacherId.toString());
+ TeacherExtendSchoolInfo first = CollectionUtil.getFirst(teacherExtendInfoList);
+ Assert.notNull(first, "未获取到院校信息!");
+
+ // 类型为未知 时候,传递null
+ String gender = UN_KNOW.equals(teacher.getTeacherGender()) || teacher.getTeacherGender() == null ? null : teacher.getTeacherGender().getText();
+
+ LoginTodo loginTodo = LoginTodo.builder().username(coreUser.getCode())
+ .password(coreUser.getPassword())
+ .roleid(LoginTodo.ThirdRole.TEACHER_ROLE)
+ .teacherid(teacherId.toString())
+ .name(coreUser.getName()).sex(gender)
+ .school(first.getUniversitiesCollegesName())
+ .college(first.getUniversityFacultyName())
+ .major(first.getUniversitySystemName())
+ .build();
+ consumer.accept(loginTodo);
+ return loginTodo;
+ }
+
+ /**
+ * 功能描述:
+ * 根据当前登录用户,来生成第三方应用登录信息
+ * @return {@link LoginTodo}
+ * @Author: lx
+ * @Date: 2022/12/11 15:45
+ */
+ public LoginTodo buildByCurrentLoginUser() {
+ CoreUser user = getUser();
+ if (user.isStudent()) {
+ return buildStudentLoginTodo(getStudent(), user, (e)->{});
+ }
+ else if (user.isTeacher()) {
+ return buildTeacherLoginTodo(getTeacher(), user, (e)->{});
+ }
+ return null;
+ }
+}
diff --git a/web/src/main/java/com/ibeetl/jlw/service/ResourcesApplicationService.java b/web/src/main/java/com/ibeetl/jlw/service/ResourcesApplicationService.java
index 06e9efd8..be69f22c 100644
--- a/web/src/main/java/com/ibeetl/jlw/service/ResourcesApplicationService.java
+++ b/web/src/main/java/com/ibeetl/jlw/service/ResourcesApplicationService.java
@@ -1,15 +1,23 @@
package com.ibeetl.jlw.service;
+import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.URLUtil;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.interfaces.DecodedJWT;
import com.ibeetl.admin.core.service.CoreBaseService;
import com.ibeetl.admin.core.util.PlatformException;
import com.ibeetl.jlw.dao.ResourcesApplicationCourseDao;
import com.ibeetl.jlw.dao.ResourcesApplicationDao;
import com.ibeetl.jlw.dao.UniversitiesCollegesJurisdictionExperimentalSystemDao;
+import com.ibeetl.jlw.entity.LoginTodo;
import com.ibeetl.jlw.entity.ResourcesApplication;
import com.ibeetl.jlw.entity.UniversitiesCollegesJurisdictionExperimentalSystem;
import com.ibeetl.jlw.web.query.ResourcesApplicationQuery;
@@ -22,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotNull;
+import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@@ -44,6 +53,8 @@ public class ResourcesApplicationService extends CoreBaseServicequeryByCondition(PageQuery query){
PageQuery ret = resourcesApplicationDao.queryByCondition(query);
@@ -196,7 +207,71 @@ public class ResourcesApplicationService extends CoreBaseService queryMyApplicationByConditionQuery(PageQuery query) {
PageQuery ret = resourcesApplicationDao.queryMyApplicationByConditionQuery(query);
- queryListAfter(ret.getList());
+ List list = ret.getList();
+ CollectionUtil.emptyIfNull(list).forEach(item -> {
+ String applicationLink = item.getApplicationLink();
+ applicationLink = makeHaveKeyStr(applicationLink);
+ String realUrl = applicationLink.concat(getKeyByCurrentUser(item.getLinkSecretKey()));
+ item.set("realUrl", realUrl);
+ });
+ queryListAfter(list);
return ret;
}
+
+ /**
+ * 功能描述:
+ * 通过应用设置的Key来生成Jwt串,用于等于第三方应用
+ *
+ * @param linkSecretKey 链接的加密串
+ * @return {@link String}
+ * @Author: lx
+ * @Date: 2022/12/11 16:59
+ */
+ public String getKeyByCurrentUser(String linkSecretKey) {
+ if (ObjectUtil.isNotEmpty(linkSecretKey)) {
+ LoginTodo loginTodo = loginTodoService.buildByCurrentLoginUser();
+ return JWT.create().withAudience(loginTodo.toJSONString()).sign(Algorithm.HMAC256(linkSecretKey));
+ }
+ return "";
+ }
+
+ /**
+ * 功能描述:
+ * 解密加密的url,用于第三方应用
+ *
+ * @param linkSecretKey 应用密钥
+ * @param url 生成key以后,得到的 applicationLink + 加密后的jwt串。
+ * @Author: lx
+ * @Date: 2022/12/11 17:06
+ */
+ public void decodeApplicationUrl(String linkSecretKey, String url) {
+
+ JWTVerifier verifier = JWT.require(Algorithm.HMAC256(linkSecretKey)).build();
+ DecodedJWT jwt = verifier.verify(url);
+ System.out.println(jwt.getAudience().get(0));
+ }
+
+ /**
+ * 功能描述:
+ * 用户如果输入的链接地址,不包含key= 字符的话,则自动追加
+ *
+ * @param link
+ * @return {@link String}
+ * @Author: lx
+ * @Date: 2022/12/11 17:21
+ */
+ public String makeHaveKeyStr(String link) {
+ final String key = "key=", sequence = "?";
+ String query = URLUtil.toURI(link).getQuery();
+ boolean isHaveKey = Arrays.stream(query.split("&")).anyMatch(item -> item.contains(key));
+ if (ObjectUtil.isNotEmpty(link) && !isHaveKey) {
+ if (link.contains(sequence)) {
+ return StrUtil.format("{}&{}", link, key);
+ }
+ else {
+ return StrUtil.format("{}?{}", link, key);
+ }
+ }
+ return link;
+ }
}
\ No newline at end of file
diff --git a/web/src/main/java/com/ibeetl/jlw/web/IndexController.java b/web/src/main/java/com/ibeetl/jlw/web/IndexController.java
index 7cf03a7e..12c2b117 100644
--- a/web/src/main/java/com/ibeetl/jlw/web/IndexController.java
+++ b/web/src/main/java/com/ibeetl/jlw/web/IndexController.java
@@ -113,100 +113,11 @@ public class IndexController {
return JsonResult.success(TimeTool.getNowTime());
}
-
- private static class LoginTodo {
- private String username; //账号
- private String password; //密码
- private String roleid; //角色ID
- private String teacherid; //教师ID
- private String studentid; //学生ID
- private String name; //姓名
- private String sex; //性别
- private String school; //学校
- private String college; //院校
- private String major; //专业
- private String schoolclass; //班级
- private String studentNo;//学号
-
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- public String getSchool() {
- return school;
- }
- public void setSchool(String school) {
- this.school = school;
- }
- public String getCollege() {
- return college;
- }
- public void setCollege(String college) {
- this.college = college;
- }
- public String getMajor() {
- return major;
- }
- public void setMajor(String major) {
- this.major = major;
- }
- public String getSchoolclass() {
- return schoolclass;
- }
- public void setSchoolclass(String schoolclass) {
- this.schoolclass = schoolclass;
- }
- public String getStudentNo() {
- return studentNo;
- }
- public void setStudentNo(String studentNo) {
- this.studentNo = studentNo;
- }
- public String getRoleid() {
- return roleid;
- }
- public void setRoleid(String roleid) {
- this.roleid = roleid;
- }
- public String getTeacherid() {
- return teacherid;
- }
- public void setTeacherid(String teacherid) {
- this.teacherid = teacherid;
- }
- public String getStudentid() {
- return studentid;
- }
- public void setStudentid(String studentid) {
- this.studentid = studentid;
- }
- }
-
public static void main(String[] args){
LoginTodo loginTodo = new LoginTodo();
loginTodo.setUsername("测试教师");
loginTodo.setPassword("123qwe");
- loginTodo.setRoleid("3");
+ loginTodo.setRoleid(LoginTodo.ThirdRole.TEACHER_ROLE);
loginTodo.setTeacherid("1");
loginTodo.setStudentid(null);
loginTodo.setName("测试教师");
diff --git a/web/src/main/java/com/ibeetl/jlw/web/ResourcesApplicationController.java b/web/src/main/java/com/ibeetl/jlw/web/ResourcesApplicationController.java
index dbcc1f57..221fe2da 100644
--- a/web/src/main/java/com/ibeetl/jlw/web/ResourcesApplicationController.java
+++ b/web/src/main/java/com/ibeetl/jlw/web/ResourcesApplicationController.java
@@ -7,6 +7,7 @@ import com.ibeetl.admin.core.file.FileService;
import com.ibeetl.admin.core.service.CorePlatformService;
import com.ibeetl.admin.core.web.JsonResult;
import com.ibeetl.jlw.entity.ResourcesApplication;
+import com.ibeetl.jlw.service.LoginTodoService;
import com.ibeetl.jlw.service.ResourcesApplicationService;
import com.ibeetl.jlw.web.query.ResourcesApplicationQuery;
import org.apache.commons.logging.Log;
@@ -37,6 +38,7 @@ public class ResourcesApplicationController{
@Autowired private ResourcesApplicationService resourcesApplicationService;
@Autowired private CorePlatformService platformService;
+ @Autowired private LoginTodoService loginTodoService;
@Autowired
FileService fileService;
@@ -156,4 +158,19 @@ public class ResourcesApplicationController{
return JsonResult.success(page);
}
}
+
+ /**
+ * 功能描述:
+ * 获取第三方登录时候用到的实体信息,加密前的实体。
+ * 只允许教师和学生身份。
+ *
+ * @return {@link JsonResult}
+ * @Author: lx
+ * @Date: 2022/12/11 17:29
+ */
+ @GetMapping(API + "/getLoginTodo.do")
+ @ResponseBody
+ public JsonResult getLoginTodo() {
+ return JsonResult.success(loginTodoService.buildByCurrentLoginUser());
+ }
}