jeecgboot结构业务简单介绍

一.业务功能介绍

功能上jeecgboot主要提供了系列的代码生成器、模板页面、报表页面。

1.报表功能

主要提供报表的相关操作。提供了积木报表插件,可以自定义数据报表、图形报表。并将报表挂载到菜单上。

jeecgboot结构业务简单介绍_第1张图片

2.在线开发

也就是代码生成器,可以可视化的在页面上新建数据库表,并通过数据库表生成前后台代码。减少业务代码开发的时间。

jeecgboot结构业务简单介绍_第2张图片

3.系统管理

用户管理、角色管理、机构管理、消息管理等基础模块。
jeecgboot结构业务简单介绍_第3张图片

4.系统监控

主要负责各种日志、监控的统一处理。

jeecgboot结构业务简单介绍_第4张图片

5.页面组件样式

常见案例、详情页、结果页、异常页、列表页、表单页主要提供了样式页面与控件页面示例。在开发过程中如果需要模板直接复制代码即可。详情请
jeecgboot结构业务简单介绍_第5张图片

二.后台架构介绍

1.概括

jeecgboot结构业务简单介绍_第6张图片

其中报表和代码生成器没有提供源码,如果有兴趣可以自行查看jar包源码。
在这里插入图片描述

2.架构核心包jeecg-boot-base

jeecg-boot-base包括了下文的几个部分。
在这里插入图片描述

2.1 接口包jeecg-boot-base-api

在这里插入图片描述
1.对外接口jeecg-system-cloud-api
使用feign+hystrix实现了服务间调用加熔断,单机环境并没有使用。
jeecgboot结构业务简单介绍_第7张图片

2.服务内接口jeecg-system-local-api
该包提供了下文使用的常用方法接口。仅提供了接口并无其他配置。
jeecgboot结构业务简单介绍_第8张图片

2.2 核心配置包jeecg-boot-base-core

jeecgboot结构业务简单介绍_第9张图片
1.通用类common
1.api
其中为通用接口与通用返回对象。

1.Result
其中Result为所有类的返回实体,这样能够通过code编码和message获取是否成功和成功/失败的信息。此类是常用的架构设计
jeecgboot结构业务简单介绍_第10张图片
2.aspect
为项目的自定义注解,使用了AOP的切面方式实现,这里就不详细说了,比较简单都可以看懂。
jeecgboot结构业务简单介绍_第11张图片
3.constant
存放着枚举类与常量池,这里不多说了。
jeecgboot结构业务简单介绍_第12张图片
jeecgboot结构业务简单介绍_第13张图片
4.es
为操作es的通用类,主要是配置es连接和查询时动态拼接and/or的方法。
jeecgboot结构业务简单介绍_第14张图片
5.exception
exception为自定义的异常类。

1.JeecgBootExceptionHandler
这里详细说一下JeecgBootExceptionHandler,该类也是常见的架构设计之一,核心为@RestControllerAdvice、@ExceptionHandler。当业务代码中没有对异常拦截时,该类会自动拦截异常,并数据log日志。所以某些日志在该类配置后,就不需要在每个接口中都捕获这个异常了。
jeecgboot结构业务简单介绍_第15张图片
6.handler
为下文规范提供了接口类。没有其他特别说明。
jeecgboot结构业务简单介绍_第16张图片
7.system类
这里主要说controller、entity、service等业务代码的父类
jeecgboot结构业务简单介绍_第17张图片
1.JeecgController

所以controller的父类,提供了导入导出的功能。还可以在里面扩展分页、排序、常用调用方法等,这样就可以避免相同的代码多次添加。这也是架构设计中常用的技巧。
jeecgboot结构业务简单介绍_第18张图片
2.JeecgEntity

将通用字段如id、创建人、修改人、创建时间、修改时间等字段统一封装在一个实体中,使用其他实体继承。这也是架构设计中常用的技巧。
jeecgboot结构业务简单介绍_第19张图片
3.service

主要提供Mybatis-plus提供的curd方法。
jeecgboot结构业务简单介绍_第20张图片
8.utli
提供了一大波的工具类,如果在工作中需要,直接复制使用。
jeecgboot结构业务简单介绍_第21张图片
2.通用配置类config
jeecgboot结构业务简单介绍_第22张图片

  • mybatis
    在这里插入图片描述
    1.MybatisInterceptor
    MybatisInterceptor这里主要说MybatisInterceptor,该类负责在mybatis执行语句前,拦截并获取参数,将创建人、创建时间等字符动态插入。这里上部分核心代码
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
		String sqlId = mappedStatement.getId();
		log.debug("------sqlId------" + sqlId);
		//获取sql类型是插入还是修改
		SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
		//获取插入参数
		Object parameter = invocation.getArgs()[1];
		if (parameter == null) {
			return invocation.proceed();
		}
		if (SqlCommandType.INSERT == sqlCommandType) {
			LoginUser sysUser = this.getLoginUser();
			//通过反射获取入参的类
			Field[] fields = oConvertUtils.getAllFields(parameter);
			for (Field field : fields) {
				log.debug("------field.name------" + field.getName());
				try {
				    //将创建人信息动态加入
					if ("createBy".equals(field.getName())) {
						field.setAccessible(true);
						Object local_createBy = field.get(parameter);
						field.setAccessible(false);
						if (local_createBy == null || local_createBy.equals("")) {
							if (sysUser != null) {
								// 登录人账号
								field.setAccessible(true);
								field.set(parameter, sysUser.getUsername());
								field.setAccessible(false);
							}
						}
					}
			}		

2.MybatisPlusSaasConfig

该类主要负责多租户,什么是多租户呢?

多租户:就是多个公司/客户公用一套系统/数据库,这就需要保证数据的权限。

该场景比较少不详细说明。

  • oss
    主要从application-dev.yml获取到上传的路径与配置。
    jeecgboot结构业务简单介绍_第23张图片
  • shiro
    安全框架主要有两个目标:认证与鉴权。
    认证:判断用户名密码是否正确。
    鉴权:判断用户是否有权限访问该接口。

这里本文着重讲解,如果遇到shiro相关应用,可以项目直接移植使用。
jeecgboot结构业务简单介绍_第24张图片
1.CustomShiroFilterFactoryBean

该类主要负责解决资源中文路径问题。这里有个通用的解决方式。

新建类集成ShiroFilterFactoryBean方法,并重写核心方法createInstance(),并在注入时,注入新建的类CustomShiroFilterFactoryBean,这样就达到的以往重新源码的功能。因为spring提供的功能都是用该思想,所以修改源码的地方就原来越少了,都可以使用该方式实现。

2.JwtFilter

同上文,复写BasicHttpAuthenticationFilter的验证登录用户的方法,在执行登录接口后判断用户是否正确。

3.ResourceCheckFilter

负责鉴权使用,判断当前用户是否有权限访问。

    //表示是否允许访问 ,如果允许访问返回true,否则false;
    @Override
    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
        Subject subject = getSubject(servletRequest, servletResponse);
        //获取当前url
        String url = getPathWithinApplication(servletRequest);
        log.info("当前用户正在访问的 url => " + url);
        return subject.isPermitted(url);
    }

    //onAccessDenied:表示当访问拒绝时是否已经处理了; 如果返回 true 表示需要继续处理; 如果返回 false
    @Override
    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.sendRedirect(request.getContextPath() + this.errorUrl);
        // 返回 false 表示已经处理,例如页面跳转啥的,表示不在走以下的拦截器了(如果还有配置的话)
        return false;
    }

4.ShiroRealm
主要负责获取用户所有的菜单权限,并提供token的一系列方法。

    //获取所有菜单权限集合
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  
    }

    //验证用户输入的账号和密码是否正确
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
    }

    //校验token的有效性
    public LoginUser checkUserTokenIsEffect(String token) throws AuthenticationException {
    }

    //刷新token有效时间
    public boolean jwtTokenRefresh(String token, String userName, String passWord) {
    }

    //清除当前用户的权限认证缓存
    @Override
    public void clearCache(PrincipalCollection principals) {
        super.clearCache(principals);
    }

5.ShiroConfig

此为shiro的核心配置类,大多数写法都是固定写法。

public class ShiroConfig {

    @Value("${jeecg.shiro.excludeUrls}")
    private String excludeUrls;
    @Resource
    LettuceConnectionFactory lettuceConnectionFactory;
    @Autowired
    private Environment env;


    /**
     * Filter Chain定义说明
     *
     * 1、一个URL可以配置多个Filter,使用逗号分隔
     * 2、当设置多个过滤器时,全部验证通过,才视为通过
     * 3、部分过滤器可指定参数,如perms,roles
     */
    @Bean("shiroFilter")
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        CustomShiroFilterFactoryBean shiroFilterFactoryBean = new CustomShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        // 拦截器
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
        if(oConvertUtils.isNotEmpty(excludeUrls)){
            String[] permissionUrl = excludeUrls.split(",");
            for(String url : permissionUrl){
                filterChainDefinitionMap.put(url,"anon");
            }
        }
        // 配置不会被拦截的链接 顺序判断 也就是不同通过token访问的地址
        filterChainDefinitionMap.put("/sys/cas/client/validateLogin", "anon"); /
  
        // 添加自己的过滤器并且取名为jwt
        Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
        //如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】
        Object cloudServer = env.getProperty(CommonConstant.CLOUD_SERVER_KEY);
        //前文定义的过滤器
        filterMap.put("jwt", new JwtFilter(cloudServer==null));
        shiroFilterFactoryBean.setFilters(filterMap);
        // 
                    

你可能感兴趣的:(JeecgBoot,css3,前端)