From a659a2d9eb1dfd1170486b9be20663a76abc00d3 Mon Sep 17 00:00:00 2001
From: Mlxa0324 <mlx950324@163.com>
Date: Sun, 11 Dec 2022 17:31:24 +0800
Subject: [PATCH] =?UTF-8?q?=E6=88=91=E7=9A=84=E5=BA=94=E7=94=A8=EF=BC=8C?=
 =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E5=BA=94=E7=94=A8=E9=93=BE=E6=8E=A5?=
 =?UTF-8?q?=E7=94=9F=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/ibeetl/jlw/entity/LoginTodo.java | 100 ++++++++++++++
 .../ibeetl/jlw/service/LoginTodoService.java  | 127 ++++++++++++++++++
 .../service/ResourcesApplicationService.java  |  77 ++++++++++-
 .../com/ibeetl/jlw/web/IndexController.java   |  91 +------------
 .../web/ResourcesApplicationController.java   |  17 +++
 5 files changed, 321 insertions(+), 91 deletions(-)
 create mode 100644 web/src/main/java/com/ibeetl/jlw/entity/LoginTodo.java
 create mode 100644 web/src/main/java/com/ibeetl/jlw/service/LoginTodoService.java

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;
+
+/**
+ * 功能描述: <br>
+ * 第三方登录封装实体
+ *
+ * @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;
+
+/**
+ * 功能描述: <br>
+ * 第三方应用,登录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;
+    /**
+     * 功能描述: <br>
+     * 设置学生信息
+     *
+     * @param student  登录的学生信息
+     * @param coreUser 登录用户信息
+     * @param consumer 后置处理
+     * @return
+     * @Author: lx
+     * @Date: 2022/12/11 15:33
+     */
+    public LoginTodo buildStudentLoginTodo(Student student, CoreUser coreUser, Consumer<LoginTodo> consumer) {
+
+        Assert.isTrue(ObjectUtil.isAllNotEmpty(student, coreUser), "登录的用户信息不能为空!");
+        Long studentId = student.getStudentId();
+        List<StudentExtendSchoolInfo> 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;
+    }
+
+    /**
+     * 功能描述: <br>
+     * 设置教师信息
+     *
+     * @param teacher  登录的教师信息
+     * @param coreUser 登录用户信息
+     * @param consumer 后置处理
+     * @return
+     * @Author: lx
+     * @Date: 2022/12/11 15:33
+     */
+    public LoginTodo buildTeacherLoginTodo(Teacher teacher, CoreUser coreUser, Consumer<LoginTodo> consumer) {
+
+        Assert.isTrue(ObjectUtil.isAllNotEmpty(teacher, coreUser), "登录的用户信息不能为空!");
+
+        Long teacherId = teacher.getTeacherId();
+        List<TeacherExtendSchoolInfo> 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;
+    }
+
+    /**
+     * 功能描述: <br>
+     * 根据当前登录用户,来生成第三方应用登录信息
+     * @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 CoreBaseService<ResourcesApplic
     private TeacherService teacherService;
     @Autowired
     private StudentService studentService;
+    @Autowired
+    private LoginTodoService loginTodoService;
 
     public PageQuery<ResourcesApplication>queryByCondition(PageQuery query){
         PageQuery ret =  resourcesApplicationDao.queryByCondition(query);
@@ -196,7 +207,71 @@ public class ResourcesApplicationService extends CoreBaseService<ResourcesApplic
      */
     public PageQuery<ResourcesApplication> queryMyApplicationByConditionQuery(PageQuery query) {
         PageQuery ret =  resourcesApplicationDao.queryMyApplicationByConditionQuery(query);
-        queryListAfter(ret.getList());
+        List<ResourcesApplication> 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;
     }
+
+    /**
+     * 功能描述: <br>
+     * 通过应用设置的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 "";
+    }
+
+    /**
+     * 功能描述: <br>
+     * 解密加密的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));
+    }
+
+    /**
+     * 功能描述: <br>
+     * 用户如果输入的链接地址,不包含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);
         }
     }
+
+    /**
+     * 功能描述: <br>
+     * 获取第三方登录时候用到的实体信息,加密前的实体。
+     * 只允许教师和学生身份。
+     *
+     * @return {@link JsonResult}
+     * @Author: lx
+     * @Date: 2022/12/11 17:29
+     */
+    @GetMapping(API + "/getLoginTodo.do")
+    @ResponseBody
+    public JsonResult getLoginTodo() {
+        return JsonResult.success(loginTodoService.buildByCurrentLoginUser());
+    }
 }