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 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 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; + +/** + *

+ * 注解的解析器 + * 从CoreBaseService 中抽离出来,方便在其他地方调用 + * + *

+ * + * @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 { +public class CoreBaseService 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 { return (Class) ((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 requests = - new ThreadLocal() { - @Override protected HttpServletRequest initialValue() { - return null; - } - }; +// private static final ThreadLocal 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 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 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 getByIds(String ids); List getValuesByQuery(TeacherMergeApplicationQuery teacherMergeApplicationQuery); + List getValuesByQueryOrderByIndex(TeacherMergeApplicationQuery teacherMergeApplicationQuery); List 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 toDoList; + + /** + * 通知公告 + */ + private List noticeList; /** - * 当前登录用户信息 + * 我的应用 */ - @DictDeep - private CoreUser coreUser; + private List myApplicationList; /** - * 根据身份获取到信息 + * 我的开课 */ - private Object identityInfo; + private List 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; + /** *

* 教师端 @@ -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 toDoList = Lists.emptyList(); + + // 我的通知 + TeacherOpenCourseNoticeQuery teacherOpenCourseNoticeQuery = new TeacherOpenCourseNoticeQuery(); + teacherOpenCourseNoticeQuery.setCreateByTeacherId(teacherId); + List noticeList = teacherOpenCourseNoticeService.getValuesByQuery(teacherOpenCourseNoticeQuery); + + // 教师应用信息 + TeacherMergeApplicationQuery teacherMergeApplicationQuery = new TeacherMergeApplicationQuery(); + teacherMergeApplicationQuery.setTeacherId(teacherId); + List applicationList = teacherMergeApplicationDao.getValuesByQueryOrderByIndex(teacherMergeApplicationQuery); + + // 我的开课信息 + TeacherOpenCourseMergeTeacherQuery teacherOpenCourseMergeTeacherQuery = new TeacherOpenCourseMergeTeacherQuery(); + teacherOpenCourseMergeTeacherQuery.setTeacherId(teacherId); + List 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 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; + +/** + *

+ * + *

+ * + * @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