Home

springboot 整合 ureport2 使用mysqlProvider 并区分用户管理表单功能

主要实现区分用户来管理报表,session登录后,查询列表getReportFiles与loadReport判断用户权限

UReportConfig    Java


package com.example;

import com.bstek.ureport.UReportPropertyPlaceholderConfigurer;
import com.example.auth.AuthUreportServlet;
import com.bstek.ureport.definition.datasource.BuildinDatasource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@ImportResource("classpath:ureport-console-context.xml")//不加项目能够启动但是会导致加载数据源报错或加载不了
@EnableAutoConfiguration
@Configuration
public class UReportConfig implements BuildinDatasource {
    @Resource
    DataSource dataSource;
    private Logger log = LoggerFactory.getLogger(getClass());

    @Bean //定义ureport的启动servlet
    public ServletRegistrationBean buildUreportServlet(){
        return new ServletRegistrationBean(new AuthUreportServlet(),"/ureport/*");// /ureport/* 不可更改
    }

    @Bean
    public UReportPropertyPlaceholderConfigurer uReportPropertyPlaceholderConfigurerPlus() {
        return new UReportPropertyPlaceholderConfigurerPlus();
    }


    @Override
    public String name() {
        return "ureport2 数据源";
    }

    @Override
    public Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            log.error("Ureport 数据源 获取连接失败!");
            e.printStackTrace();
        }
        return null;
    }

}



使用时的默认配置


package com.example;

import com.bstek.ureport.UReportPropertyPlaceholderConfigurer;
import java.util.Properties;

/**
 * @author Allen
 * @date 2021/08/09
 * 重写默认的 PropertyPlaceholder
 */
public class UReportPropertyPlaceholderConfigurerPlus extends UReportPropertyPlaceholderConfigurer {

    public UReportPropertyPlaceholderConfigurerPlus() {
        Properties properties = new Properties();
        properties.setProperty("ureport.debug", "true");
        properties.setProperty("ureport.dsiableFileStoreDir", "false");
        properties.setProperty("ureport.disableFileDbProvider", "false");
        properties.setProperty("ureport.fileStoreDir", "D:/ureportfiles");
        properties.setProperty("ureport.fileToDbStoreDir", "D:/ureportdbfiles");
        properties.setProperty("ureport.disableHttpSessionReportCache", "false");
        this.setProperties(properties);
    }

}

AuthUReportServlet.java  判断是否登录


package com.example.auth;

import com.bstek.ureport.console.UReportServlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class AuthUreportServlet extends UReportServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        LoginDataHelper.init(request, response);
        try {
            super.service(request, response);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }
}

LoginDataHelper 判断session


package com.example.auth;

import com.bstek.ureport.console.cache.HttpSessionReportCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.util.WebUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginDataHelper {

    public static String USERID = "";

    protected static void init(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        System.out.println("ureport进入Filter");
        Object uname = WebUtils.getSessionAttribute(request,"uname");
        System.out.println(uname);
        if(uname == null){
            response.sendRedirect("/login");
            System.out.println("跳转login");
        } else {
            USERID = (String) uname;
        }
    }
}

MysqlProvider


package com.example.auth;

import com.bstek.ureport.exception.ReportException;
import com.bstek.ureport.provider.report.ReportFile;
import com.bstek.ureport.provider.report.ReportProvider;
import com.example.entity.UReportFile;
import com.example.repo.UReportFileRepsitory;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Component
@Setter
public class MySQLProvider implements ReportProvider {
    /**
     * 存储器名称
     */
    private static final String NAME = "mysql-provider";

    /**
     * 报表文件名前缀
     */
    private String PREFIX = "mysql:";

    /**
     * 是否禁用
     */
    private boolean DISABLED = false;

    @Autowired
    private UReportFileRepsitory uReportFileRepsitory;

    @Override
    public InputStream loadReport(String s) {
        Optional file = uReportFileRepsitory.findByName(getCorrectName(s));
        ByteArrayInputStream stream = null;
        if (file.isPresent()) {
            try {
                UReportFile u = file.get();
                String uname = LoginDataHelper.USERID;
                if(!u.getUserId().equals(uname)){
                    throw new ReportException("无权限访问");
                }
                stream = new ByteArrayInputStream(file.get().getContent());
                stream.close();
            } catch (Exception e) {
                throw new ReportException(e);
            }
        }
        return stream;
    }

    @Override
    public void deleteReport(String s) {
        Optional file = uReportFileRepsitory.findByName(getCorrectName(s));
        if (file.isPresent()){
            uReportFileRepsitory.delete(file.get());
        }
    }

    @Override
    public List getReportFiles() {
        String uname = LoginDataHelper.USERID;
        List list = uReportFileRepsitory.findAllByUserIdOrderByIdDesc(uname);
        List reportList = new ArrayList<>();
        for (UReportFile file : list) {
            reportList.add(new ReportFile(file.getName(), file.getUpdateTime()));
        }
        return reportList;
    }

    @Override
    public void saveReport(String file, String content) {
        file = getCorrectName(file);
        UReportFile reportFile;
        Optional reportFileOptional = uReportFileRepsitory.findByName(file);
        if(reportFileOptional.isPresent()){
            reportFile = reportFileOptional.get();
            reportFile.setName(PREFIX + file);
            reportFile.setContent(content.getBytes());
            reportFile.setUpdateTime(new Timestamp(System.currentTimeMillis()));
            uReportFileRepsitory.save(reportFile);
        }else{
            reportFile = new UReportFile();
            String uname = LoginDataHelper.USERID;
            reportFile.setUserId(uname);
            reportFile.setName(PREFIX + file);
            reportFile.setContent(content.getBytes());
            reportFile.setCreateTime(new Timestamp(System.currentTimeMillis()));
            reportFile.setUpdateTime(new Timestamp(System.currentTimeMillis()));
            uReportFileRepsitory.save(reportFile);
        }
    }

    @Override
    public String getName() {
        return NAME;
    }

    @Override
    public boolean disabled() {
        return DISABLED;
    }

    @Override
    public String getPrefix() {
        return PREFIX;
    }

    /**
     * 获取没有前缀的文件名
     * @param name 报表名称
     */
    private String getCorrectName(String name){
        if(name.startsWith(PREFIX)){
            name = name.substring(PREFIX.length());
        }
        return name;
    }

}

Entity


package com.example.entity;

import lombok.Data;

import javax.persistence.*;
import java.sql.Timestamp;

@Data
@Table(name="ureport_file")
@Entity
public class UReportFile {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;

    @Column(name="user_id")
    private String userId;

    private String name;

    private byte[] content;

    @Column(name="create_time")
    private Timestamp createTime;

    @Column(name="update_time")
    private Timestamp updateTime;
}

Repository


package com.example.repo;

import com.example.entity.UReportFile;
import org.springframework.data.repository.CrudRepository;

import java.util.List;
import java.util.Optional;

public interface UReportFileRepsitory extends CrudRepository<UReportFile, Long> {
    List findAllByUserIdOrderByIdDesc(String userId);
    Optional findByName(String name);
}