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);
}