From 60e4eb508c0f73ee5ab4bc6b708b4d1e4ee49435 Mon Sep 17 00:00:00 2001
From: Mlxa0324 <mlx950324@163.com>
Date: Thu, 20 Oct 2022 23:10:46 +0800
Subject: [PATCH] =?UTF-8?q?=E6=95=99=E5=B8=88=E7=AB=AF-=E9=A6=96=E9=A1=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/ibeetl/admin/core/conf/MVCConf.java   |  79 +----------
 .../admin/core/conf/SessionInterceptor.java   |  65 +++++++++
 .../service/CoreBaseAnnotationParser.java     | 123 ++++++++++++++++++
 .../admin/core/service/CoreBaseService.java   |  99 +-------------
 .../admin/core/util/HttpRequestLocal.java     |  42 +++---
 .../cn/jlw/Interceptor/InterceptorConfig.java |  43 +++++-
 .../Interceptor/WebSessionInterceptor.java    |  71 ++++++++++
 .../jlw/dao/TeacherMergeApplicationDao.java   |   1 +
 .../jlw/entity/TeacherMergeApplication.java   |  12 +-
 .../ibeetl/jlw/entity/TeacherOpenCourse.java  |   2 +-
 .../entity/TeacherOpenCourseMergeTeacher.java |  16 +++
 .../jlw/entity/{ => api}/CurrentUserInfo.java |   5 +-
 .../entity/api/teacher/TeacherIndexData.java  |  32 +++--
 .../ibeetl/jlw/service/ApiTeacherService.java |   2 +-
 .../ibeetl/jlw/service/IndexBaseService.java  |  11 +-
 .../api/teacher/TeacherIndexService.java      |  56 +++++++-
 .../jlw/web/api/IndexBaseController.java      |   2 +-
 .../api/teacher/TeacherIndexController.java   |   4 +
 .../resources/sql/jlw/resourcesApplication.md |   4 +-
 .../sql/jlw/teacherMergeApplication.md        |  46 +++++++
 .../teacher/TeacherIndexControllerTest.java   |  43 ++++++
 21 files changed, 541 insertions(+), 217 deletions(-)
 create mode 100644 admin-core/src/main/java/com/ibeetl/admin/core/conf/SessionInterceptor.java
 create mode 100644 admin-core/src/main/java/com/ibeetl/admin/core/service/CoreBaseAnnotationParser.java
 create mode 100644 web/src/main/java/cn/jlw/Interceptor/WebSessionInterceptor.java
 rename web/src/main/java/com/ibeetl/jlw/entity/{ => api}/CurrentUserInfo.java (80%)
 create mode 100644 web/src/test/java/com/ibeetl/jlw/web/api/teacher/TeacherIndexControllerTest.java

diff --git a/admin-core/src/main/java/com/ibeetl/admin/core/conf/MVCConf.java b/admin-core/src/main/java/com/ibeetl/admin/core/conf/MVCConf.java
index 8f45b844..4aa98cc4 100644
--- a/admin-core/src/main/java/com/ibeetl/admin/core/conf/MVCConf.java
+++ b/admin-core/src/main/java/com/ibeetl/admin/core/conf/MVCConf.java
@@ -1,34 +1,25 @@
 package com.ibeetl.admin.core.conf;
 
-import com.ibeetl.admin.core.entity.CoreOrg;
-import com.ibeetl.admin.core.entity.CoreUser;
-import com.ibeetl.admin.core.service.CorePlatformService;
-import com.ibeetl.admin.core.service.CoreUserService;
-import com.ibeetl.admin.core.util.HttpRequestLocal;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.beetl.core.GroupTemplate;
-import org.beetl.ext.spring.BeetlGroupUtilConfiguration;
 import org.springframework.beans.factory.InitializingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.env.Environment;
 import org.springframework.format.FormatterRegistry;
 import org.springframework.format.datetime.DateFormatter;
-import org.springframework.web.servlet.HandlerInterceptor;
-import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 @Configuration
+@ConditionalOnMissingClass("cn.jlw.Interceptor.WebSessionInterceptor")
 public class MVCConf implements WebMvcConfigurer, InitializingBean {
 
     private final Log log = LogFactory.getLog(this.getClass());
@@ -53,23 +44,15 @@ public class MVCConf implements WebMvcConfigurer, InitializingBean {
 
     @Resource
     Environment env;
-
-    @Resource
-    CoreUserService userService;
-
-    @Resource
-    BeetlGroupUtilConfiguration beetlGroupUtilConfiguration;
-
-    @Resource
-    HttpRequestLocal httpRequestLocal;
-
     @Resource
     GroupTemplate groupTemplate;
+    @Resource
+    SessionInterceptor sessionInterceptor;
 
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
 
-        registry.addInterceptor(new SessionInterceptor(httpRequestLocal, this)).addPathPatterns("/**");
+        registry.addInterceptor(sessionInterceptor).addPathPatterns("/**");
         // super.addInterceptors(registry);
     }
 
@@ -123,58 +106,6 @@ public class MVCConf implements WebMvcConfigurer, InitializingBean {
         var.put("jsVer", System.currentTimeMillis());
        
        groupTemplate.setSharedVars(var);
-        
-        
-   
-       
     }
-
-
 }
 
-class SessionInterceptor implements HandlerInterceptor {
-
-    MVCConf conf;
-    HttpRequestLocal httpRequestLocal;
-
-    public SessionInterceptor(HttpRequestLocal httpRequestLocal, MVCConf conf) {
-        this.conf = conf;
-        this.httpRequestLocal = httpRequestLocal;
-    }
-
-    @Override
-    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
-            throws Exception {
-
-        // 方便运行时,修改环境变量参数,用于测试类变更登录用户
-        Long userId = conf.env.getProperty("user.id", Long.class);
-        Long orgId = conf.env.getProperty("user.orgId", Long.class);
-        if (userId != null && orgId != null
-                && request.getSession().getAttribute(CorePlatformService.ACCESS_CURRENT_USER) == null) {
-            // 模拟用户登录,用于快速开发,未来用rember么代替?
-            CoreUser user = conf.userService.getUserById(userId);
-            CoreOrg org = conf.userService.getOrgById(orgId);
-            List<CoreOrg> orgs = conf.userService.getUserOrg(userId, org.getId());
-            request.getSession().setAttribute(CorePlatformService.ACCESS_CURRENT_USER, user);
-            request.getSession().setAttribute(CorePlatformService.ACCESS_CURRENT_ORG, org);
-            request.getSession().setAttribute(CorePlatformService.ACCESS_USER_ORGS, orgs);
-            request.getSession().setAttribute("ip", request.getRemoteHost());
-
-        }
-        httpRequestLocal.set(request);
-        return true;
-    }
-
-    @Override
-    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
-                           ModelAndView modelAndView) throws Exception {
-        // do nothing
-    }
-
-    @Override
-    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
-            throws Exception {
-        // do nothing
-    }
-
-}
diff --git a/admin-core/src/main/java/com/ibeetl/admin/core/conf/SessionInterceptor.java b/admin-core/src/main/java/com/ibeetl/admin/core/conf/SessionInterceptor.java
new file mode 100644
index 00000000..fa0a6b49
--- /dev/null
+++ b/admin-core/src/main/java/com/ibeetl/admin/core/conf/SessionInterceptor.java
@@ -0,0 +1,65 @@
+package com.ibeetl.admin.core.conf;
+
+import com.ibeetl.admin.core.entity.CoreOrg;
+import com.ibeetl.admin.core.entity.CoreUser;
+import com.ibeetl.admin.core.service.CorePlatformService;
+import com.ibeetl.admin.core.service.CoreUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * Session 模拟登录拦截器 多用于Test测试类
+ */
+@Component
+public class SessionInterceptor implements HandlerInterceptor {
+
+    @Resource private CoreUserService userService;
+    @Autowired private Environment environment;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+
+        /**
+         * 改用这个方法 {@link com.ibeetl.admin.core.util.servlet.ServletUtils#getRequest}
+         * ThreadLocal 会内存泄露
+         */
+//        httpRequestLocal.set(request);
+        // 方便运行时,修改环境变量参数,用于测试类变更登录用户
+        Long userId = environment.getProperty("user.id", Long.class);
+        Long orgId = environment.getProperty("user.orgId", Long.class);
+        if (userId != null && orgId != null
+                && request.getSession().getAttribute(CorePlatformService.ACCESS_CURRENT_USER) == null) {
+            // 模拟用户登录,用于快速开发,未来用rember么代替?
+            CoreUser user = userService.getUserById(userId);
+            CoreOrg org = userService.getOrgById(orgId);
+            List<CoreOrg> orgs = userService.getUserOrg(userId, org.getId());
+            request.getSession().setAttribute(CorePlatformService.ACCESS_CURRENT_USER, user);
+            request.getSession().setAttribute(CorePlatformService.ACCESS_CURRENT_ORG, org);
+            request.getSession().setAttribute(CorePlatformService.ACCESS_USER_ORGS, orgs);
+            request.getSession().setAttribute("ip", request.getRemoteHost());
+
+        }
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
+                           ModelAndView modelAndView) throws Exception {
+        // do nothing
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
+            throws Exception {
+        // do nothing
+    }
+
+}
diff --git a/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreBaseAnnotationParser.java b/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreBaseAnnotationParser.java
new file mode 100644
index 00000000..1edfd879
--- /dev/null
+++ b/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreBaseAnnotationParser.java
@@ -0,0 +1,123 @@
+package com.ibeetl.admin.core.service;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.ibeetl.admin.core.annotation.Dict;
+import com.ibeetl.admin.core.annotation.DictDeep;
+import com.ibeetl.admin.core.annotation.DictEnum;
+import com.ibeetl.admin.core.entity.CoreDict;
+import com.ibeetl.admin.core.util.PlatformException;
+import org.beetl.sql.core.TailBean;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.Resource;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.List;
+
+/**
+ * <p>
+ *  注解的解析器
+ *  从CoreBaseService 中抽离出来,方便在其他地方调用
+ *
+ * </p>
+ *
+ * @author mlx
+ * @date 2022/10/20
+ * @modified
+ */
+public class CoreBaseAnnotationParser {
+
+    private final Logger log = LoggerFactory.getLogger(this.getClass());
+
+    @Resource
+    protected CoreDictService dictUtil;
+
+    public void queryListAfter(List list) {
+        list.parallelStream().forEach(this::queryEntityAfter);
+    }
+
+    public void queryEntityAfter(Object bean) {
+        if (bean == null) {
+            return;
+        }
+
+        if (!(bean instanceof TailBean)) {
+            throw new PlatformException("指定的pojo" + bean.getClass() + " 不能获取数据字典,需要继承TailBean");
+        }
+
+        TailBean ext = (TailBean) bean;
+        Class c = ext.getClass();
+        do {
+            Field[] fields = c.getDeclaredFields();
+            for (Field field : fields) {
+                if (field.isAnnotationPresent(Dict.class)) {
+                    field.setAccessible(true);
+                    Dict dict = field.getAnnotation(Dict.class);
+
+                    try {
+                        String display = "";
+                        Object fieldValue = field.get(ext);
+                        if (fieldValue != null) {
+                            CoreDict dbDict = dict.type().contains(".") ? dictUtil.findCoreDictByTable(dict.type(), fieldValue.toString()) : dictUtil.findCoreDict(dict.type(), fieldValue.toString());
+                            display = dbDict != null ? dbDict.getName() : null;
+                        }
+                        ext.set(field.getName() + dict.suffix(), display);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    } finally {
+                        field.setAccessible(false);
+                    }
+                }
+
+                // 深度解析注解
+                if (field.isAnnotationPresent(DictDeep.class)) {
+                    field.setAccessible(true);
+
+                    try {
+                        Object res = field.get(ext);
+                        if (res instanceof List) {
+                            queryListAfter((List) res);
+                        } else {
+                            queryEntityAfter(res);
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    } finally {
+                        field.setAccessible(false);
+                    }
+                }
+
+                // 枚举自动转换中文
+                if (field.isAnnotationPresent(DictEnum.class)) {
+                    field.setAccessible(true);
+
+                    DictEnum dict = field.getAnnotation(DictEnum.class);
+
+                    try {
+                        String display = "";
+                        Method methodByName = ReflectUtil.getMethodByName(field.getType(), "get" + StrUtil.upperFirst(dict.value()));
+                        Assert.notNull(methodByName, field.getName() + " 缺少getter方法");
+                        Object o = field.get(ext);
+                        if(null != o) {
+                            Object enumValue = ReflectUtil.invoke(o, methodByName);
+                            if (ObjectUtil.isNotEmpty(enumValue)) {
+                                display = String.valueOf(enumValue);
+                            }
+                            ext.set(field.getName() + dict.suffix(), display);
+                        }
+                    } catch (IllegalArgumentException | IllegalAccessException e) {
+                        log.error("@DictEnum 注解解析异常: {}", e.getMessage());
+                    }  finally {
+                        field.setAccessible(false);
+                    }
+                }
+            }
+            c = c.getSuperclass();
+        } while (c != TailBean.class);
+
+    }
+}
diff --git a/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreBaseService.java b/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreBaseService.java
index 3aba9141..d2ff945b 100644
--- a/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreBaseService.java
+++ b/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreBaseService.java
@@ -2,11 +2,9 @@ package com.ibeetl.admin.core.service;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Assert;
-import cn.hutool.core.util.*;
-import com.ibeetl.admin.core.annotation.Dict;
-import com.ibeetl.admin.core.annotation.DictDeep;
-import com.ibeetl.admin.core.annotation.DictEnum;
-import com.ibeetl.admin.core.entity.CoreDict;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.ReUtil;
 import com.ibeetl.admin.core.util.PlatformException;
 import com.ibeetl.admin.core.util.enums.DelFlagEnum;
 import org.beetl.sql.core.SQLManager;
@@ -16,8 +14,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.annotation.Resource;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -29,12 +25,10 @@ import java.util.Map;
  * 描述:
  * @author : TLT
  */
-public class CoreBaseService<T> {
+public class CoreBaseService<T> extends CoreBaseAnnotationParser {
 
     private final Logger log = LoggerFactory.getLogger(this.getClass());
 
-    @Resource
-    protected CoreDictService dictUtil;
     @Resource
     protected SQLManager sqlManager;
 
@@ -348,89 +342,4 @@ public class CoreBaseService<T> {
         return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
     }
 
-
-    public void queryListAfter(List list) {
-        list.parallelStream().forEach(this::queryEntityAfter);
-    }
-
-    public void queryEntityAfter(Object bean) {
-        if (bean == null) {
-            return;
-        }
-
-        if (!(bean instanceof TailBean)) {
-            throw new PlatformException("指定的pojo" + bean.getClass() + " 不能获取数据字典,需要继承TailBean");
-        }
-
-        TailBean ext = (TailBean) bean;
-        Class c = ext.getClass();
-        do {
-            Field[] fields = c.getDeclaredFields();
-            for (Field field : fields) {
-                if (field.isAnnotationPresent(Dict.class)) {
-                    field.setAccessible(true);
-                    Dict dict = field.getAnnotation(Dict.class);
-
-                    try {
-                        String display = "";
-                        Object fieldValue = field.get(ext);
-                        if (fieldValue != null) {
-                            CoreDict dbDict = dict.type().contains(".") ? dictUtil.findCoreDictByTable(dict.type(), fieldValue.toString()) : dictUtil.findCoreDict(dict.type(), fieldValue.toString());
-                            display = dbDict != null ? dbDict.getName() : null;
-                        }
-                        ext.set(field.getName() + dict.suffix(), display);
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    } finally {
-                        field.setAccessible(false);
-                    }
-                }
-
-                // 深度解析注解
-                if (field.isAnnotationPresent(DictDeep.class)) {
-                    field.setAccessible(true);
-
-                    try {
-                        Object res = field.get(ext);
-                        if (res instanceof List) {
-                            queryListAfter((List) res);
-                        } else {
-                            queryEntityAfter(res);
-                        }
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    } finally {
-                        field.setAccessible(false);
-                    }
-                }
-
-                // 枚举自动转换中文
-                if (field.isAnnotationPresent(DictEnum.class)) {
-                    field.setAccessible(true);
-
-                    DictEnum dict = field.getAnnotation(DictEnum.class);
-
-                    try {
-                        String display = "";
-                        Method methodByName = ReflectUtil.getMethodByName(field.getType(), "get" + StrUtil.upperFirst(dict.value()));
-                        Assert.notNull(methodByName, field.getName() + " 缺少getter方法");
-                        Object o = field.get(ext);
-                        if(null != o) {
-                            Object enumValue = ReflectUtil.invoke(o, methodByName);
-                            if (ObjectUtil.isNotEmpty(enumValue)) {
-                                display = String.valueOf(enumValue);
-                            }
-                            ext.set(field.getName() + dict.suffix(), display);
-                        }
-                    } catch (IllegalArgumentException | IllegalAccessException e) {
-                        log.error("@DictEnum 注解解析异常: {}", e.getMessage());
-                    }  finally {
-                        field.setAccessible(false);
-                    }
-                }
-            }
-            c = c.getSuperclass();
-        } while (c != TailBean.class);
-
-    }
 }
diff --git a/admin-core/src/main/java/com/ibeetl/admin/core/util/HttpRequestLocal.java b/admin-core/src/main/java/com/ibeetl/admin/core/util/HttpRequestLocal.java
index 5453f0e8..f34ba03b 100644
--- a/admin-core/src/main/java/com/ibeetl/admin/core/util/HttpRequestLocal.java
+++ b/admin-core/src/main/java/com/ibeetl/admin/core/util/HttpRequestLocal.java
@@ -8,6 +8,8 @@ import javax.servlet.http.HttpServletRequest;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 
+import static com.ibeetl.admin.core.util.servlet.ServletUtils.getRequest;
+
 /**
  *  保留用户会话,以方便在业务代码任何地方调用
  *  {@link MVCConf}
@@ -17,42 +19,36 @@ import java.net.UnknownHostException;
 @Component
 public class HttpRequestLocal {
 	
-	public  HttpRequestLocal(){
-		
-	}
+	private HttpRequestLocal(){ }
 	
-	private static final ThreadLocal<HttpServletRequest> requests =
-		         new ThreadLocal<HttpServletRequest>() {
-		             @Override protected HttpServletRequest initialValue() {
-		                 return null;
-		         }
-		     };
+//	private static final ThreadLocal<HttpServletRequest> requests = ThreadLocal.withInitial(() -> null);
 		     
 	 public  Object getSessionValue(String attr){
-		 return  requests.get().getSession().getAttribute(attr);
+		 return  getRequest().getSession().getAttribute(attr);
 	 }
 
 
 	 public  void setSessionValue(String attr,Object obj){
-		   requests.get().getSession().setAttribute(attr,obj);
+		   getRequest().getSession().setAttribute(attr,obj);
 	 }
 
 
 	 public String getOriginalToken(){
-		String token = requests.get().getHeader("token");
+		 HttpServletRequest request = getRequest();
+		 String token = request.getHeader("token");
 		if("null".equals(token)||"NULL".equals(token)||"undefined".equals(token)||"UNDEFINED".equals(token)){
 		 	token = "";
 		}
 
-		 if(StringUtils.isBlank(token) && requests.get().getRequestURL().toString().contains("index.do")){//从参数中获取
-			 if(null != requests.get().getParameter("token")){
-				 token = requests.get().getParameter("token");
+		 if(StringUtils.isBlank(token) && request.getRequestURL().toString().contains("index.do")){//从参数中获取
+			 if(null != request.getParameter("token")){
+				 token = request.getParameter("token");
 			 }
 		 }
 
 		 if(StringUtils.isBlank(token)){//从参数中获取
-			 if(null != requests.get().getHeader("cookie") && requests.get().getHeader("cookie").contains("token=")){
-				 token = requests.get().getHeader("cookie").split("token=")[1];
+			 if(null != request.getHeader("cookie") && request.getHeader("cookie").contains("token=")){
+				 token = request.getHeader("cookie").split("token=")[1];
 			 }
 		 }
 
@@ -68,20 +64,20 @@ public class HttpRequestLocal {
 	 }
 	 
 	 public  Object getRequestValue(String attr){
-		 return  requests.get().getAttribute(attr);
+		 return  getRequest().getAttribute(attr);
 	 }
 	 
 	 public String getRequestURI(){
-		 return  requests.get().getRequestURI();
+		 return  getRequest().getRequestURI();
 	 }
 	 
 	 public String getRequestIP(){
-		 return getIpAddr(requests.get());
+		 return getIpAddr(getRequest());
 	 }
 	 
-	 public  void set(HttpServletRequest request){
-		 requests.set(request);
-	 }
+//	 public  void set(HttpServletRequest request){
+//		 requests.set(request);
+//	 }
 	 
 	 /** 
 	     * 获取当前网络ip 
diff --git a/web/src/main/java/cn/jlw/Interceptor/InterceptorConfig.java b/web/src/main/java/cn/jlw/Interceptor/InterceptorConfig.java
index fd0632a7..93412056 100644
--- a/web/src/main/java/cn/jlw/Interceptor/InterceptorConfig.java
+++ b/web/src/main/java/cn/jlw/Interceptor/InterceptorConfig.java
@@ -5,21 +5,31 @@ import com.ibeetl.admin.core.conf.MVCConf;
 import com.ibeetl.jlw.entity.FileEntity;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.beetl.core.GroupTemplate;
+import org.springframework.beans.factory.InitializingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.format.FormatterRegistry;
+import org.springframework.format.datetime.DateFormatter;
 import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.ResourceBundle;
 
+import static com.ibeetl.admin.core.conf.MVCConf.DEFAULT_APP_NAME;
+
 //拦截器
 
 @Configuration
-public class InterceptorConfig implements WebMvcConfigurer {
+public class InterceptorConfig implements WebMvcConfigurer, InitializingBean {
 
     @Resource private GetSCoreUser getSCoreUser;
     @Resource private GetFile getFile;
@@ -27,6 +37,13 @@ public class InterceptorConfig implements WebMvcConfigurer {
     @Resource private GetReferer getReferer;
     @Resource private GetIp getIp;
 
+    @Resource private WebSessionInterceptor webSessionInterceptor;
+
+    @Resource
+    Environment environment;
+    @Resource
+    GroupTemplate groupTemplate;
+
     private final Log log = LogFactory.getLog(this.getClass());
 
     private static String p = new FileEntity().getParentPath();
@@ -47,6 +64,7 @@ public class InterceptorConfig implements WebMvcConfigurer {
         registry.addInterceptor(authenticationInterceptor())
                 .addPathPatterns("/**");
         registry.addInterceptor(aliPayInterceptor()).addPathPatterns("/**");
+        registry.addInterceptor(webSessionInterceptor).addPathPatterns("/**");
     }
 
     //配置图片访问路径转换
@@ -89,4 +107,27 @@ public class InterceptorConfig implements WebMvcConfigurer {
         argumentResolvers.add(getIp);
     }
 
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**");
+    }
+
+    @Override
+    public void addFormatters(FormatterRegistry registry) {
+        registry.addFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss"));
+        registry.addFormatter(new DateFormatter("yyyy-MM-dd"));
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        Map<String, Object> var = new HashMap<>(5);
+        String appName =  environment.getProperty("app.name");
+        if(appName==null) {
+            var.put("appName",DEFAULT_APP_NAME);
+        }
+
+        var.put("jsVer", System.currentTimeMillis());
+        groupTemplate.setSharedVars(var);
+    }
+
 }
\ No newline at end of file
diff --git a/web/src/main/java/cn/jlw/Interceptor/WebSessionInterceptor.java b/web/src/main/java/cn/jlw/Interceptor/WebSessionInterceptor.java
new file mode 100644
index 00000000..6f7fbfb6
--- /dev/null
+++ b/web/src/main/java/cn/jlw/Interceptor/WebSessionInterceptor.java
@@ -0,0 +1,71 @@
+package cn.jlw.Interceptor;
+
+import com.ibeetl.admin.core.entity.CoreOrg;
+import com.ibeetl.admin.core.entity.CoreUser;
+import com.ibeetl.admin.core.service.CorePlatformService;
+import com.ibeetl.admin.core.service.CoreUserService;
+import com.ibeetl.jlw.service.WebPlatformService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * Session 模拟登录拦截器 多用于Test测试类
+ */
+@Component
+public class WebSessionInterceptor implements HandlerInterceptor {
+
+    @Resource private CoreUserService userService;
+    @Autowired private Environment environment;
+    @Autowired private WebPlatformService webPlatformService;
+
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+
+        /**
+         * 改用这个方法 {@link com.ibeetl.admin.core.util.servlet.ServletUtils#getRequest}
+         * ThreadLocal 会内存泄露
+         */
+//        httpRequestLocal.set(request);
+        // 方便运行时,修改环境变量参数,用于测试类变更登录用户
+        Long userId = environment.getProperty("user.id", Long.class);
+        Long orgId = environment.getProperty("user.orgId", Long.class);
+        if (userId != null && orgId != null
+                && request.getSession().getAttribute(CorePlatformService.ACCESS_CURRENT_USER) == null) {
+            // 模拟用户登录,用于快速开发,未来用rember么代替?
+            CoreUser user = userService.getUserById(userId);
+            CoreOrg org = userService.getOrgById(orgId);
+            List<CoreOrg> orgs = userService.getUserOrg(userId, org.getId());
+            request.getSession().setAttribute(CorePlatformService.ACCESS_CURRENT_USER, user);
+            request.getSession().setAttribute(CorePlatformService.ACCESS_CURRENT_ORG, org);
+            request.getSession().setAttribute(CorePlatformService.ACCESS_USER_ORGS, orgs);
+            request.getSession().setAttribute(CorePlatformService.ACCESS_USER_ORGS, orgs);
+            request.getSession().setAttribute("ip", request.getRemoteHost());
+            // 根据身份设置Session用户信息
+            webPlatformService.setUserInfoToSessionByIdentity(user);
+
+        }
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
+                           ModelAndView modelAndView) throws Exception {
+        // do nothing
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
+            throws Exception {
+        // do nothing
+    }
+
+}
diff --git a/web/src/main/java/com/ibeetl/jlw/dao/TeacherMergeApplicationDao.java b/web/src/main/java/com/ibeetl/jlw/dao/TeacherMergeApplicationDao.java
index cad919b3..284b4cb4 100644
--- a/web/src/main/java/com/ibeetl/jlw/dao/TeacherMergeApplicationDao.java
+++ b/web/src/main/java/com/ibeetl/jlw/dao/TeacherMergeApplicationDao.java
@@ -22,5 +22,6 @@ public interface TeacherMergeApplicationDao extends BaseMapper<TeacherMergeAppli
     int updateGivenByIds(TeacherMergeApplicationQuery teacherMergeApplicationQuery);
     List<TeacherMergeApplication> getByIds(String ids);
     List<TeacherMergeApplication> getValuesByQuery(TeacherMergeApplicationQuery teacherMergeApplicationQuery);
+    List<TeacherMergeApplication> getValuesByQueryOrderByIndex(TeacherMergeApplicationQuery teacherMergeApplicationQuery);
     List<TeacherMergeApplication> getValuesByQueryNotWithPermission(TeacherMergeApplicationQuery teacherMergeApplicationQuery);
 }
diff --git a/web/src/main/java/com/ibeetl/jlw/entity/TeacherMergeApplication.java b/web/src/main/java/com/ibeetl/jlw/entity/TeacherMergeApplication.java
index b31cb4c4..e6051a40 100644
--- a/web/src/main/java/com/ibeetl/jlw/entity/TeacherMergeApplication.java
+++ b/web/src/main/java/com/ibeetl/jlw/entity/TeacherMergeApplication.java
@@ -5,10 +5,11 @@ import com.ibeetl.admin.core.entity.BaseEntity;
 import com.ibeetl.admin.core.util.ValidateConfig;
 import org.beetl.sql.annotation.entity.AssignID;
 import org.beetl.sql.fetch.annotation.Fetch;
-import org.beetl.sql.fetch.annotation.FetchOne;
+import org.beetl.sql.fetch.annotation.FetchSql;
 
 import javax.validation.constraints.NotNull;
 import java.util.Date;
+import java.util.Map;
 
 /* 
 * 教师-关联-我的应用
@@ -34,8 +35,9 @@ public class TeacherMergeApplication extends BaseEntity{
 
     private Long resourcesApplicationId ;
 
-    @FetchOne("resourcesApplicationId")
-    private ResourcesApplication resourcesApplication;
+    @FetchSql("select resources_application_id, application_name, application_link, application_carousel, application_introduction, application_info, application_introduction_original, application_info_original " +
+            " from resources_application t where t.resources_application_id = #resourcesApplicationId# ")
+    private Map resourcesApplication;
 	
     //排序
 
@@ -148,11 +150,11 @@ public class TeacherMergeApplication extends BaseEntity{
     }
 
 
-    public ResourcesApplication getResourcesApplication() {
+    public Map getResourcesApplication() {
         return resourcesApplication;
     }
 
-    public void setResourcesApplication(ResourcesApplication resourcesApplication) {
+    public void setResourcesApplication(Map resourcesApplication) {
         this.resourcesApplication = resourcesApplication;
     }
 }
diff --git a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourse.java b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourse.java
index d7c2f7c3..19a35c52 100644
--- a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourse.java
+++ b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourse.java
@@ -33,7 +33,7 @@ public class TeacherOpenCourse extends BaseEntity{
     private String teacherOpenCourseCode ;
 	
     //封面列表(JSON格式: {封面URL:is默认封面})
-
+    // 也可以是 逗号隔开的图片列表,第一个是默认封面。只需要控制图片保存时候的位置。
     private String teacherOpenCourseCover ;
 	
     //开课状态(1启用 2禁用)
diff --git a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseMergeTeacher.java b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseMergeTeacher.java
index adf3c1ea..fdb02bb2 100644
--- a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseMergeTeacher.java
+++ b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseMergeTeacher.java
@@ -4,14 +4,18 @@ import com.ibeetl.admin.core.annotation.Dict;
 import com.ibeetl.admin.core.entity.BaseEntity;
 import com.ibeetl.admin.core.util.ValidateConfig;
 import org.beetl.sql.annotation.entity.AssignID;
+import org.beetl.sql.fetch.annotation.Fetch;
+import org.beetl.sql.fetch.annotation.FetchSql;
 
 import javax.validation.constraints.NotNull;
 import java.util.Date;
+import java.util.Map;
 
 /* 
 * 教师-课程开课-关联教师
 * gen by Spring Boot2 Admin 2022-09-12
 */
+@Fetch
 public class TeacherOpenCourseMergeTeacher extends BaseEntity{
 
     //课程开课教师关联ID
@@ -25,6 +29,11 @@ public class TeacherOpenCourseMergeTeacher extends BaseEntity{
     @Dict(type="teacher_open_course.teacher_open_course_title.teacher_open_course_status=1")
 
     private Long teacherOpenCourseId ;
+
+    @FetchSql("select teacher_open_course_id, teacher_open_course_title, teacher_open_course_code, " +
+            "teacher_open_course_cover, start_time,end_time,create_time " +
+            "from teacher_open_course where teacher_open_course_status = 1 and teacher_open_course_id = #teacherOpenCourseId# ")
+    private Map teacherOpenCourse;
 	
     //教师ID
     @Dict(type="teacher.teacher_name.teacher_status=1")
@@ -154,4 +163,11 @@ public class TeacherOpenCourseMergeTeacher extends BaseEntity{
         this.teacherOpenCourseMergeTeacherAuthCode = teacherOpenCourseMergeTeacherAuthCode;
     }
 
+    public Map getTeacherOpenCourse() {
+        return teacherOpenCourse;
+    }
+
+    public void setTeacherOpenCourse(Map teacherOpenCourse) {
+        this.teacherOpenCourse = teacherOpenCourse;
+    }
 }
diff --git a/web/src/main/java/com/ibeetl/jlw/entity/CurrentUserInfo.java b/web/src/main/java/com/ibeetl/jlw/entity/api/CurrentUserInfo.java
similarity index 80%
rename from web/src/main/java/com/ibeetl/jlw/entity/CurrentUserInfo.java
rename to web/src/main/java/com/ibeetl/jlw/entity/api/CurrentUserInfo.java
index 6b3a7898..ee5f7a85 100644
--- a/web/src/main/java/com/ibeetl/jlw/entity/CurrentUserInfo.java
+++ b/web/src/main/java/com/ibeetl/jlw/entity/api/CurrentUserInfo.java
@@ -1,4 +1,4 @@
-package com.ibeetl.jlw.entity;
+package com.ibeetl.jlw.entity.api;
 
 import com.ibeetl.admin.core.annotation.DictDeep;
 import com.ibeetl.admin.core.entity.CoreUser;
@@ -7,13 +7,14 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
+import org.beetl.sql.core.TailBean;
 
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
 @Builder
 @Accessors(chain = true)
-public class CurrentUserInfo {
+public class CurrentUserInfo extends TailBean {
 
     /**
      * 当前登录用户信息
diff --git a/web/src/main/java/com/ibeetl/jlw/entity/api/teacher/TeacherIndexData.java b/web/src/main/java/com/ibeetl/jlw/entity/api/teacher/TeacherIndexData.java
index ad35a3ed..1013c8e2 100644
--- a/web/src/main/java/com/ibeetl/jlw/entity/api/teacher/TeacherIndexData.java
+++ b/web/src/main/java/com/ibeetl/jlw/entity/api/teacher/TeacherIndexData.java
@@ -1,12 +1,17 @@
 package com.ibeetl.jlw.entity.api.teacher;
 
-import com.ibeetl.admin.core.annotation.DictDeep;
-import com.ibeetl.admin.core.entity.CoreUser;
+import com.ibeetl.jlw.entity.TeacherMergeApplication;
+import com.ibeetl.jlw.entity.TeacherOpenCourseMergeTeacher;
+import com.ibeetl.jlw.entity.TeacherOpenCourseNotice;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
+import org.beetl.sql.core.TailBean;
+import org.beetl.sql.fetch.annotation.Fetch;
+
+import java.util.List;
 
 /**
  * 教师端-首页实体
@@ -16,17 +21,28 @@ import lombok.experimental.Accessors;
 @AllArgsConstructor
 @Builder
 @Accessors(chain = true)
-public class TeacherIndexData {
+@Fetch(level = 2)
+public class TeacherIndexData extends TailBean {
+
+    /**
+     * 代办事项
+     * TODO xuliangtong 实训评阅,这里的类型要修改
+     */
+    private List<Object> toDoList;
+
+    /**
+     * 通知公告
+     */
+    private List<TeacherOpenCourseNotice> noticeList;
 
     /**
-     * 当前登录用户信息
+     * 我的应用
      */
-    @DictDeep
-    private CoreUser coreUser;
+    private List<TeacherMergeApplication> myApplicationList;
 
     /**
-     * 根据身份获取到信息
+     * 我的开课
      */
-    private Object identityInfo;
+    private List<TeacherOpenCourseMergeTeacher> myOpenCourseList;
 
 }
diff --git a/web/src/main/java/com/ibeetl/jlw/service/ApiTeacherService.java b/web/src/main/java/com/ibeetl/jlw/service/ApiTeacherService.java
index 314de4e9..5197c94f 100644
--- a/web/src/main/java/com/ibeetl/jlw/service/ApiTeacherService.java
+++ b/web/src/main/java/com/ibeetl/jlw/service/ApiTeacherService.java
@@ -1,6 +1,6 @@
 package com.ibeetl.jlw.service;
 
-import com.ibeetl.jlw.entity.CurrentUserInfo;
+import com.ibeetl.jlw.entity.api.CurrentUserInfo;
 import org.springframework.stereotype.Service;
 
 @Service
diff --git a/web/src/main/java/com/ibeetl/jlw/service/IndexBaseService.java b/web/src/main/java/com/ibeetl/jlw/service/IndexBaseService.java
index da431629..7c5572d6 100644
--- a/web/src/main/java/com/ibeetl/jlw/service/IndexBaseService.java
+++ b/web/src/main/java/com/ibeetl/jlw/service/IndexBaseService.java
@@ -1,7 +1,8 @@
 package com.ibeetl.jlw.service;
 
 import com.ibeetl.admin.core.entity.CoreUser;
-import com.ibeetl.jlw.entity.CurrentUserInfo;
+import com.ibeetl.admin.core.service.CoreBaseAnnotationParser;
+import com.ibeetl.jlw.entity.api.CurrentUserInfo;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -9,7 +10,7 @@ import javax.annotation.Resource;
 import static com.ibeetl.admin.core.util.user.CacheUserUtil.getUser;
 
 @Service
-public class IndexBaseService {
+public class IndexBaseService extends CoreBaseAnnotationParser {
 
     @Resource private WebPlatformService webPlatformService;
 
@@ -21,8 +22,12 @@ public class IndexBaseService {
      */
     public CurrentUserInfo userInfo() {
         CoreUser user = getUser();
-        return CurrentUserInfo.builder().coreUser(user)
+        CurrentUserInfo currentUserInfo = CurrentUserInfo.builder().coreUser(user)
                 .identityInfo(webPlatformService.getUserInfoFromSessionByIdentity(user))
                 .build();
+
+        // 解析注解
+        queryEntityAfter(currentUserInfo);
+        return currentUserInfo;
     }
 }
diff --git a/web/src/main/java/com/ibeetl/jlw/service/api/teacher/TeacherIndexService.java b/web/src/main/java/com/ibeetl/jlw/service/api/teacher/TeacherIndexService.java
index 71e8d7f6..a2448537 100644
--- a/web/src/main/java/com/ibeetl/jlw/service/api/teacher/TeacherIndexService.java
+++ b/web/src/main/java/com/ibeetl/jlw/service/api/teacher/TeacherIndexService.java
@@ -1,8 +1,25 @@
 package com.ibeetl.jlw.service.api.teacher;
 
+import cn.hutool.core.lang.Assert;
+import com.ibeetl.jlw.dao.TeacherMergeApplicationDao;
+import com.ibeetl.jlw.entity.Teacher;
+import com.ibeetl.jlw.entity.TeacherMergeApplication;
+import com.ibeetl.jlw.entity.TeacherOpenCourseMergeTeacher;
+import com.ibeetl.jlw.entity.TeacherOpenCourseNotice;
+import com.ibeetl.jlw.entity.api.CurrentUserInfo;
 import com.ibeetl.jlw.entity.api.teacher.TeacherIndexData;
+import com.ibeetl.jlw.service.IndexBaseService;
+import com.ibeetl.jlw.service.TeacherOpenCourseMergeTeacherService;
+import com.ibeetl.jlw.service.TeacherOpenCourseNoticeService;
+import com.ibeetl.jlw.web.query.TeacherMergeApplicationQuery;
+import com.ibeetl.jlw.web.query.TeacherOpenCourseMergeTeacherQuery;
+import com.ibeetl.jlw.web.query.TeacherOpenCourseNoticeQuery;
+import org.assertj.core.util.Lists;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.List;
+
 /**
  * <p>
  *  教师端
@@ -15,12 +32,49 @@ import org.springframework.stereotype.Service;
 @Service
 public class TeacherIndexService {
 
+    @Resource private IndexBaseService indexBaseService;
+    @Resource private TeacherOpenCourseNoticeService teacherOpenCourseNoticeService;
+    @Resource private TeacherMergeApplicationDao teacherMergeApplicationDao;
+
+    @Resource private TeacherOpenCourseMergeTeacherService teacherOpenCourseMergeTeacherService;
 
     /**
      * 教师端-首页数据
      * @return
      */
     public TeacherIndexData index() {
-        return new TeacherIndexData();
+
+        // 自动根据登录的身份获取当前用户信息。
+        CurrentUserInfo currentUserInfo = indexBaseService.userInfo();
+        Object identityInfo = currentUserInfo.getIdentityInfo();
+        Assert.isTrue(identityInfo instanceof Teacher, "该接口只能老师访问!");
+
+        // 教师ID
+        final Long teacherId = ((Teacher) identityInfo).getTeacherId();
+
+        // TODO xuliangtong 实训评阅列表查询
+        List<Object> toDoList = Lists.emptyList();
+
+        // 我的通知
+        TeacherOpenCourseNoticeQuery teacherOpenCourseNoticeQuery = new TeacherOpenCourseNoticeQuery();
+        teacherOpenCourseNoticeQuery.setCreateByTeacherId(teacherId);
+        List<TeacherOpenCourseNotice> noticeList = teacherOpenCourseNoticeService.getValuesByQuery(teacherOpenCourseNoticeQuery);
+
+        // 教师应用信息
+        TeacherMergeApplicationQuery teacherMergeApplicationQuery = new TeacherMergeApplicationQuery();
+        teacherMergeApplicationQuery.setTeacherId(teacherId);
+        List<TeacherMergeApplication> applicationList = teacherMergeApplicationDao.getValuesByQueryOrderByIndex(teacherMergeApplicationQuery);
+
+        // 我的开课信息
+        TeacherOpenCourseMergeTeacherQuery teacherOpenCourseMergeTeacherQuery = new TeacherOpenCourseMergeTeacherQuery();
+        teacherOpenCourseMergeTeacherQuery.setTeacherId(teacherId);
+        List<TeacherOpenCourseMergeTeacher> openCourseList = teacherOpenCourseMergeTeacherService.getValuesByQuery(teacherOpenCourseMergeTeacherQuery);
+
+        return TeacherIndexData.builder()
+                .toDoList(toDoList)
+                .noticeList(noticeList)
+                .myApplicationList(applicationList)
+                .myOpenCourseList(openCourseList)
+                .build();
     }
 }
diff --git a/web/src/main/java/com/ibeetl/jlw/web/api/IndexBaseController.java b/web/src/main/java/com/ibeetl/jlw/web/api/IndexBaseController.java
index 36363e09..c990ef0d 100644
--- a/web/src/main/java/com/ibeetl/jlw/web/api/IndexBaseController.java
+++ b/web/src/main/java/com/ibeetl/jlw/web/api/IndexBaseController.java
@@ -1,7 +1,7 @@
 package com.ibeetl.jlw.web.api;
 
 import com.ibeetl.admin.core.web.JsonResult;
-import com.ibeetl.jlw.entity.CurrentUserInfo;
+import com.ibeetl.jlw.entity.api.CurrentUserInfo;
 import com.ibeetl.jlw.service.IndexBaseService;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
diff --git a/web/src/main/java/com/ibeetl/jlw/web/api/teacher/TeacherIndexController.java b/web/src/main/java/com/ibeetl/jlw/web/api/teacher/TeacherIndexController.java
index 4b99f218..e9265cb6 100644
--- a/web/src/main/java/com/ibeetl/jlw/web/api/teacher/TeacherIndexController.java
+++ b/web/src/main/java/com/ibeetl/jlw/web/api/teacher/TeacherIndexController.java
@@ -19,6 +19,10 @@ public class TeacherIndexController {
 
     @Resource private TeacherIndexService teacherIndexService;
 
+    /**
+     * 教师端-首页面板
+     * @return
+     */
     @PostMapping(API + "/index.do")
     public JsonResult<TeacherIndexData> index() {
         return JsonResult.success(teacherIndexService.index());
diff --git a/web/src/main/resources/sql/jlw/resourcesApplication.md b/web/src/main/resources/sql/jlw/resourcesApplication.md
index 43893cfc..05682217 100644
--- a/web/src/main/resources/sql/jlw/resourcesApplication.md
+++ b/web/src/main/resources/sql/jlw/resourcesApplication.md
@@ -7,7 +7,7 @@ queryByCondition
     t.*
       @}
     from resources_application t
-    left join teacher_merge_application ta on ta.application_id = t.resources_application_id
+    left join teacher_merge_application ta on ta.resources_application_id = t.resources_application_id
     where 1=1  
       @//数据权限,该sql语句功能点,如果不考虑数据权限,可以删除此行  
     and #function("resourcesApplication.query")#
@@ -65,7 +65,7 @@ queryByCondition
       @if(isNotEmpty(coreUser) && isTeacher) {
         and ta.teacher_id = (select teacher_id from teacher where user_id = #coreUser.id#)
       @}
-    order by ta.order_index asc
+    order by ta.teacher_merge_application_order_index asc
     
     
 
diff --git a/web/src/main/resources/sql/jlw/teacherMergeApplication.md b/web/src/main/resources/sql/jlw/teacherMergeApplication.md
index a9600fbd..a073310a 100644
--- a/web/src/main/resources/sql/jlw/teacherMergeApplication.md
+++ b/web/src/main/resources/sql/jlw/teacherMergeApplication.md
@@ -243,6 +243,52 @@ getValuesByQuery
   and find_in_set(t.user_id,#userIdPlural#)
   @}
 
+getValuesByQueryOrderByIndex
+===
+
+* 根据不为空的参数进行查询 根据排序字段 排序
+
+  select t.*
+  from teacher_merge_application t
+  where 1=1 and #function("teacherMergeApplication.query")#
+  @if(!isEmpty(teacherMergeApplicationId)){
+  and t.teacher_merge_application_id =#teacherMergeApplicationId#
+  @}
+  @if(!isEmpty(teacherMergeApplicationIdPlural)){
+  and find_in_set(t.teacher_merge_application_id,#teacherMergeApplicationIdPlural#)
+  @}
+  @if(!isEmpty(teacherId)){
+  and t.teacher_id =#teacherId#
+  @}
+  @if(!isEmpty(teacherIdPlural)){
+  and find_in_set(t.teacher_id,#teacherIdPlural#)
+  @}
+  @if(!isEmpty(resourcesApplicationId)){
+  and t.resources_application_id =#resourcesApplicationId#
+  @}
+  @if(!isEmpty(resourcesApplicationIdPlural)){
+  and find_in_set(t.resources_application_id,#resourcesApplicationIdPlural#)
+  @}
+  @if(!isEmpty(teacherMergeApplicationOrderIndex)){
+  and t.teacher_merge_application_order_index =#teacherMergeApplicationOrderIndex#
+  @}
+  @if(!isEmpty(teacherMergeApplicationAddTime)){
+  and t.teacher_merge_application_add_time =#teacherMergeApplicationAddTime#
+  @}
+  @if(!isEmpty(orgId)){
+  and t.org_id =#orgId#
+  @}
+  @if(!isEmpty(orgIdPlural)){
+  and find_in_set(t.org_id,#orgIdPlural#)
+  @}
+  @if(!isEmpty(userId)){
+  and t.user_id =#userId#
+  @}
+  @if(!isEmpty(userIdPlural)){
+  and find_in_set(t.user_id,#userIdPlural#)
+  @}
+  order by t.teacher_merge_application_order_index desc
+
 
 getValuesByQueryNotWithPermission
 ===
diff --git a/web/src/test/java/com/ibeetl/jlw/web/api/teacher/TeacherIndexControllerTest.java b/web/src/test/java/com/ibeetl/jlw/web/api/teacher/TeacherIndexControllerTest.java
new file mode 100644
index 00000000..4764920f
--- /dev/null
+++ b/web/src/test/java/com/ibeetl/jlw/web/api/teacher/TeacherIndexControllerTest.java
@@ -0,0 +1,43 @@
+package com.ibeetl.jlw.web.api.teacher;
+
+import base.BaseTest;
+import org.junit.jupiter.api.Test;
+import org.springframework.test.web.servlet.RequestBuilder;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
+
+import java.nio.charset.Charset;
+
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author mlx
+ * @date 2022/10/20
+ * @modified
+ */
+class TeacherIndexControllerTest extends BaseTest {
+
+    private static final String API = "/api/teacherIndex";
+
+    @Test
+    void index() throws Exception {
+        //构造请求参数
+        RequestBuilder rb = MockMvcRequestBuilders.post(API + "/index.do");
+
+        // 测试账号,佟老师
+        putLoginInfoToEnv("102", "26");
+
+        //发送请求,验证返回结果
+        String result = mvc.perform(rb)
+                .andExpect(status().isOk())
+                .andExpect(MockMvcResultMatchers.jsonPath("$.code").value("0"))
+                .andReturn().getResponse().getContentAsString(Charset.defaultCharset());
+
+        System.out.println(result);
+        clearEnvLoginInfo();
+    }
+}
\ No newline at end of file