Compare commits

..

No commits in common. 'master' and '0.0.1-SNAPSHOT' have entirely different histories.

Binary file not shown.

Binary file not shown.

@ -21,26 +21,22 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<maven.test.skip>true</maven.test.skip>
<commons-io-version>2.6</commons-io-version>
<pagehelper-version>1.2.5</pagehelper-version>
<mybatis-version>1.3.2</mybatis-version>
<ehcache-version>1.1.0</ehcache-version>
<dozer-version>5.5.1</dozer-version>
<spring-cloud.version>Greenwich.RC2</spring-cloud.version>
<poi-ooxml-version>3.8</poi-ooxml-version>
</properties>
<repositories>
<!-- 将中央仓库地址指向阿里云聚合仓库,提高下载速度 -->
<repository>
<id>central</id>
<name>Central Repository</name>
<layout>default</layout>
<url>https://maven.aliyun.com/repository/public</url>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<pluginRepositories>
<!-- 将插件的仓库指向阿里云聚合仓库解决低版本maven下载插件异常或提高下载速度 -->
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://maven.aliyun.com/repository/public</url>
<layout>default</layout>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
@ -52,61 +48,99 @@
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
</dependency>
<!-- mybatis 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
<!-- freemarker模板框架 -->
<!-- freemarker -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- 安全框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<artifactId>spring-boot-devtools</artifactId>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<!-- 阿里巴巴旗下关于Excel处理类性能优化可处理超大数据量 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Java Bean映射工具,已集成中MapperUtil工具类中 -->
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.21.0.1</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>provided</scope>
<optional>true</optional>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper-version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>${ehcache-version}</version>
</dependency>
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>${dozer-version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi-ooxml-version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!-- 项目名称 -->

@ -4,11 +4,8 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.event.ApplicationContextInitializedEvent;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import xyz.wbsite.frame.base.LocalData;
import xyz.wbsite.frame.auth.LocalData;
@SpringBootApplication
@EnableAutoConfiguration
@ -20,25 +17,6 @@ public class Application extends SpringBootServletInitializer {
}
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.addListeners(getListener());
application.run(args);
}
/**
* LocalData.getContext()null
* SpringApplication
*
* @return ApplicationListener
*/
private static ApplicationListener getListener() {
return new ApplicationListener<ApplicationEvent>() {
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
if (applicationEvent instanceof ApplicationContextInitializedEvent) {
LocalData.setContext(((ApplicationContextInitializedEvent) applicationEvent).getApplicationContext());
}
}
};
LocalData.setApplicationContext(SpringApplication.run(Application.class, args));
}
}

@ -4,11 +4,14 @@ import com.fasterxml.jackson.core.TreeNode;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@ -20,35 +23,35 @@ import org.springframework.web.servlet.View;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
import xyz.wbsite.config.ActionConfig;
import xyz.wbsite.frame.base.LocalData;
import xyz.wbsite.frame.base.Token;
import xyz.wbsite.frame.base.VisitorEntity;
import xyz.wbsite.frame.auth.LocalData;
import xyz.wbsite.frame.base.BaseRequest;
import xyz.wbsite.frame.base.BaseResponse;
import xyz.wbsite.frame.base.ErrorType;
import xyz.wbsite.frame.base.Screen;
import xyz.wbsite.frame.listener.FrameListener;
import xyz.wbsite.frame.provider.TokenProvider;
import xyz.wbsite.frame.provider.VisitorProvider;
import xyz.wbsite.frame.sse.Sser;
import xyz.wbsite.frame.auth.Token;
import xyz.wbsite.frame.utils.AESUtil;
import xyz.wbsite.frame.utils.LogUtil;
import xyz.wbsite.frame.utils.MD5Util;
import xyz.wbsite.frame.utils.MapperUtil;
import xyz.wbsite.frame.utils.RequestUtil;
import xyz.wbsite.frame.utils.StringUtil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Locale;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* ControllerController
* htm{@link GlobalController#page(Model, HttpServletRequest, HttpServletResponse)}
* htm{@link GlobalController#action(Model, HttpServletRequest, HttpServletResponse)}
* ajax{@link GlobalController#ajax(String, String, String, HttpServletRequest, HttpServletResponse, String, MultipartFile)}
* {@link GlobalController#exceptionHandler(HttpServletRequest, HttpServletResponse, Model, Exception)}
* {@link GlobalController#sse(String)}
* <p>
* Request
@ -59,17 +62,77 @@ import java.util.Locale;
* @since 2017-01-01
*/
@Controller
public class GlobalController {
@ControllerAdvice
public class GlobalController implements ErrorController {
@Value("${server.servlet.context-path}")
private String context;
@Value("${web.url.index}")
@Value("${web.home.page}")
private String homePage;
@Value("${web.url.login}")
@Value("${web.login.page}")
private String loginPage;
@Autowired
private FreeMarkerViewResolver viewResolver;
/**
*
*
* @param request
* @param response
* @param exception
* @return
*/
@ExceptionHandler(Exception.class)
public String exceptionHandler(HttpServletRequest request, HttpServletResponse response, Model model, Exception exception) {
StringBuffer msg = new StringBuffer("");
if (exception != null) {
msg = new StringBuffer("");
String message = exception.toString();
int length = exception.getStackTrace().length;
if (length > 0) {
msg.append("<a>").append(message).append("</a><br>");
for (int i = 0; i < length; i++) {
msg.append("<a>").append(exception.getStackTrace()[i]).append("</a><br>");
}
} else {
msg.append(message);
}
}
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
model.addAttribute("msg", msg.toString());
return "500";
}
private final static String ERROR_PATH = "/error";
@Override
public String getErrorPath() {
return ERROR_PATH;
}
@RequestMapping(value = ERROR_PATH)
public String error(HttpServletRequest request, HttpServletResponse response) {
switch (response.getStatus()) {
case 404:
return "404";
case 403:
String errorUrl = RequestUtil.getErrorUrl(request);
errorUrl = errorUrl.replaceFirst(context, "");
if ((errorUrl.equals(homePage) || errorUrl.equals("/")) && LocalData.getToken() == null) {
try {
response.sendRedirect(context + loginPage);
} catch (IOException e) {
e.printStackTrace();
}
}
return "403";
case 500:
return "500";
default:
return "403";
}
}
@RequestMapping("/")
public String home() {
Token token = LocalData.getToken();
@ -88,17 +151,31 @@ public class GlobalController {
* @param request
*/
@RequestMapping({"/**/*.htm"})
public String page(Model model, HttpServletRequest request, HttpServletResponse response) {
public String action(Model model, HttpServletRequest request, HttpServletResponse response) {
String servletPath = request.getServletPath();// /**/*.htm
String layout = "/layout/default";
String page = RequestUtil.getPage();
String action = LocalData.getAction();// **/*
Pattern compile = Pattern.compile("^/(.+)\\.htm");
Matcher matcher = compile.matcher(servletPath);
if (matcher.find()) {
action = matcher.group(1);
LocalData.setAction(action);
}
try {
LocaleResolver localeResolver = (LocaleResolver) request.getAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE);
Locale locale = localeResolver.resolveLocale(request);
{//查询screen
layout = "screen/" + page;
String[] split = action.split("/");
StringBuilder sb = new StringBuilder("");
sb.append("screen");
for (int i = 0; i < split.length; i++) {
sb.append(File.separator);
sb.append(split[i]);
}
layout = sb.toString();
View view = viewResolver.resolveViewName(layout, locale);
if (view == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,"");
@ -107,7 +184,7 @@ public class GlobalController {
// 尝试执行Screen执行器(服务器渲染),并返回视图模板
try {
String beanClassName = (ActionConfig.SCREEN_PREFIX + page).toLowerCase();
String beanClassName = (ActionConfig.SCREEN_PREFIX + action).toLowerCase();
Screen screenExec = LocalData.getApplicationContext().getBean(beanClassName, Screen.class);
screenExec.exec(model, request, response);
@ -121,7 +198,7 @@ public class GlobalController {
}
{//查找layout
String[] split = page.split("/");
String[] split = action.split("/");
int lt = split.length;
while (lt > 0) {
@ -153,12 +230,11 @@ public class GlobalController {
}
}
} catch (Exception e) {
throw new RuntimeException(e);
return exceptionHandler(request, response, model, e);
}
// todo 可在此获取共性数据(也可以在全局拦截器GlobalHandlerInterceptor、拦截器作用域比此更高)
// todo 例如用户信息等。其他业务数据在页面渲染后通过Ajax请求
model.addAttribute("token", LocalData.getToken());
return layout;
}
@ -189,7 +265,7 @@ public class GlobalController {
if (methodC == null) {
BaseResponse baseResponse = new BaseResponse();
baseResponse.addError(ErrorType.BUSINESS_ERROR, "未实现的资源方法!");
baseResponse.addError(ErrorType.BUSINESS_ERROR, "未找到对应的方法!");
return baseResponse;
}
@ -225,16 +301,17 @@ public class GlobalController {
} catch (IllegalAccessException e) {
e.printStackTrace();
BaseResponse baseResponse = new BaseResponse();
baseResponse.addError(ErrorType.BUSINESS_ERROR, "私有的资源方法!");
baseResponse.addError(ErrorType.BUSINESS_ERROR, "方法执必须公开!");
return baseResponse;
} catch (InvocationTargetException e) {
e.getTargetException().printStackTrace();
BaseResponse baseResponse = new BaseResponse();
baseResponse.addError(ErrorType.BUSINESS_ERROR, "资源方法执行错误[" + e.getTargetException().getMessage() + "]");
baseResponse.addError(ErrorType.BUSINESS_ERROR, "方法执行错误[" + e.getTargetException().getMessage() + "]");
return baseResponse;
}
}
@RequestMapping(path = "/api/{module}/{target}/{method}", method = RequestMethod.POST)
@ResponseBody
public String api(
@ -260,60 +337,34 @@ public class GlobalController {
return MapperUtil.toJson(response);
}
String data;
VisitorProvider visitorProvider = LocalData.getBean(VisitorProvider.class);
if (visitorProvider == null) {
response.addError(ErrorType.BUSINESS_ERROR, "接入提供者不存在!");
return MapperUtil.toJson(response);
}
// 检索接入对象
VisitorEntity visitorEntity = visitorProvider.getVisitor(appKey);
if (visitorEntity == null) {
response.addError(ErrorType.BUSINESS_ERROR, "接入信息错误!");
return MapperUtil.toJson(response);
}
String data = null;
String appSecret = "1234567890123456";
// 解码
try {
data = AESUtil.decrypt2String(encryptData, visitorEntity.getAppSecret());
data = AESUtil.decrypt2String(encryptData, appSecret);
} catch (Exception e) {
response.addError(ErrorType.BUSINESS_ERROR, "解码失败,请确认编码是否正确!");
return MapperUtil.toJson(response);
}
// 验证签名
String sign_ = MD5Util.encode(visitorEntity.getAppSecret() + data + timestamp);
String sign_ = MD5Util.encode(appSecret + data + timestamp);
if (!sign_.equals(sign)) {
response.addError(ErrorType.BUSINESS_ERROR, "签名验证失败!");
return AESUtil.encrypt2Base64(MapperUtil.toJson(response).getBytes(), visitorEntity.getAppSecret());
return AESUtil.encrypt2Base64(MapperUtil.toJson(response).getBytes(), appSecret);
}
// 时效性验证
long currentTime = System.currentTimeMillis();
if (currentTime - timestamp > 2 * 60 * 1000) {
response.addError(ErrorType.BUSINESS_ERROR, "请求过期, 或本地时间错误!");
return AESUtil.encrypt2Base64(MapperUtil.toJson(response).getBytes(), visitorEntity.getAppSecret());
return AESUtil.encrypt2Base64(MapperUtil.toJson(response).getBytes(), appSecret);
}
// 权限验证
if (StringUtil.isNotEmpty(token)) {
TokenProvider tokenProvider = LocalData.getBean(TokenProvider.class);
if (tokenProvider == null) {
LocalData.setToken(null);
} else {
Token build = tokenProvider.build(token);
LocalData.setToken(build);
}
if (!LocalData.getToken().hasRes(httpServletRequest.getServletPath())) {
response.addError(ErrorType.BUSINESS_ERROR, "[" + httpServletRequest.getServletPath() + "]未授权的资源!");
return AESUtil.encrypt2Base64(MapperUtil.toJson(response).getBytes(), visitorEntity.getAppSecret());
}
} else {
String excluded = LocalData.getEnvironment().getProperty("web.url.auth.excluded", "") + ",/api/wsys/User/login";
if (!excluded.contains(excluded)) {
response.addError(ErrorType.BUSINESS_ERROR, "请通过登录接口获取Token!");
return AESUtil.encrypt2Base64(MapperUtil.toJson(response).getBytes(), visitorEntity.getAppSecret());
}
return AESUtil.encrypt2Base64(MapperUtil.toJson(response).getBytes(), appSecret);
}
// 开始处理业务
@ -332,7 +383,7 @@ public class GlobalController {
if (methodC == null) {
response.addError(ErrorType.BUSINESS_ERROR, "未找到对应的方法!");
return AESUtil.encrypt2Base64(MapperUtil.toJson(response).getBytes(), visitorEntity.getAppSecret());
return AESUtil.encrypt2Base64(MapperUtil.toJson(response).getBytes(), appSecret);
}
Parameter[] parameters = methodC.getParameters();
@ -362,79 +413,42 @@ public class GlobalController {
e.printStackTrace();
response.addError(ErrorType.BUSINESS_ERROR, "方法执必须公开!");
} catch (InvocationTargetException e) {
FrameListener instance = FrameListener.getInstance();
instance.onError(e.getTargetException());
LogUtil.dumpException(e.getTargetException());
e.getTargetException().printStackTrace();
response.addError(ErrorType.BUSINESS_ERROR, "方法执行错误[" + e.getTargetException().getMessage() + "]");
}
return AESUtil.encrypt2Base64(MapperUtil.toJson(response).getBytes(), visitorEntity.getAppSecret());
}
@RequestMapping(path = "/msvr/{module}/{target}/{method}", method = RequestMethod.POST)
@ResponseBody
public BaseResponse msvr(
@PathVariable String module,
@PathVariable String target,
@PathVariable String method,
@RequestBody String data,
@RequestHeader String token) {
BaseResponse response = new BaseResponse();
LocalData.setToken(MapperUtil.toJava(token, Token.class));
// 开始处理业务
try {
String beanClassName = (ActionConfig.MSVR_PREFIX + module + "/" + target).toLowerCase();
Object ajax = LocalData.getApplicationContext().getBean(beanClassName);
Class ajaxClass = ajax.getClass();
Method[] methods = ajaxClass.getDeclaredMethods();
Method methodC = null;
for (Method meth : methods) {
if (meth.getName().equals(method)) {
methodC = meth;
}
return AESUtil.encrypt2Base64(MapperUtil.toJson(response).getBytes(), appSecret);
}
if (methodC == null) {
response.addError(ErrorType.BUSINESS_ERROR, "未找到对应的服务方法!");
return response;
}
Parameter[] parameters = methodC.getParameters();
Object[] arg = new Object[parameters.length];
for (int i = 0; i < parameters.length; i++) {
Parameter parameter = parameters[i];
if (BaseRequest.class.isAssignableFrom(parameter.getType())) {
arg[i] = MapperUtil.toJava(data, parameter.getType());
} else if (parameter.getType() == Token.class) {
arg[i] = LocalData.getToken();
} else {
arg[i] = null;
}
}
response = (BaseResponse) methodC.invoke(ajax, arg);
} catch (BeansException e) {
e.printStackTrace();
response.addError(ErrorType.BUSINESS_ERROR, "未找到对应的目标!");
} catch (IllegalAccessException e) {
e.printStackTrace();
response.addError(ErrorType.BUSINESS_ERROR, "方法执必须公开!");
} catch (InvocationTargetException e) {
FrameListener instance = FrameListener.getInstance();
instance.onError(e.getTargetException());
response.addError(ErrorType.BUSINESS_ERROR, "服务方法执行错误[" + e.getTargetException().getMessage() + "]");
}
return response;
}
private static ConcurrentHashMap<String, SseEmitter> sseMap = new ConcurrentHashMap();
/**
* Ssejs
* Sse{@link Sser#push(String, Object)}
* Sse{@link Sser#pushAll(Object)}
* Sse{@link GlobalController#sseMap}
* Sse{@link GlobalController#pushAll}
*/
@RequestMapping(value = "/sse/{userId}", produces = "text/event-stream;charset=UTF-8")
public SseEmitter sse(@PathVariable String userId) {
return Sser.register(userId, new SseEmitter(10000000L));
SseEmitter sseEmitter = new SseEmitter(10000000L);
if (sseMap.get(userId) != null) {
sseMap.remove(userId);
}
sseMap.put(userId, sseEmitter);
return sseEmitter;
}
/**
* Sse
*
* @param data
*/
public static void pushAll(Object data) {
for (String s : sseMap.keySet()) {
try {
sseMap.get(s).send(MapperUtil.toJson(data), MediaType.APPLICATION_JSON);
} catch (IOException e) {
sseMap.remove(s);
}
}
}
}

@ -1,81 +0,0 @@
package xyz.wbsite.action;
import org.springframework.boot.autoconfigure.web.ErrorProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import xyz.wbsite.frame.base.LocalData;
import xyz.wbsite.frame.listener.FrameListener;
import xyz.wbsite.frame.utils.LogUtil;
import xyz.wbsite.frame.utils.RequestUtil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collections;
import java.util.Map;
/**
*
*
* @author author
* @version 0.0.1
* @since 2017-01-01
*/
@Controller
public class GlobalErrorController extends BasicErrorController {
public GlobalErrorController() {
super(new DefaultErrorAttributes(), new ErrorProperties());
}
@Override
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
return super.error(request);
}
@Override
@RequestMapping(produces = "text/html")
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
HttpStatus status = this.getStatus(request);
Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, true));
response.setStatus(status.value());
ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);
if (modelAndView == null) {
modelAndView = new ModelAndView("error", model);
}
switch (status) {
case FORBIDDEN://403
String errorUrl = RequestUtil.getErrorUrl(request);
errorUrl = errorUrl.replaceFirst(LocalData.getContext(), "");
String indexPage = LocalData.getEnvironment().getProperty("web.url.index", "/index.htm");
String loginPage = LocalData.getEnvironment().getProperty("web.url.login", "/login.htm");
if ((errorUrl.equals(indexPage) || errorUrl.equals("/")) && LocalData.getToken() == null) {
RequestUtil.setRedirect(loginPage);
} else {
modelAndView.setViewName("403");
}
break;
case NOT_FOUND://404
modelAndView.setViewName("404");
break;
case INTERNAL_SERVER_ERROR://500
default:
try {
FrameListener instance = FrameListener.getInstance();
instance.onError((String) model.get("trace"));
modelAndView.setViewName("500");
} catch (Exception ex) {
LogUtil.dumpException(ex);
} finally {
modelAndView.setViewName("500");
}
break;
}
return modelAndView;
}
}

@ -1,108 +0,0 @@
package xyz.wbsite.action.ajax.admin;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;
import xyz.wbsite.frame.base.Error;
import xyz.wbsite.frame.excel.WExcel;
import xyz.wbsite.frame.utils.LogUtil;
import xyz.wbsite.frame.base.LocalData;
import xyz.wbsite.frame.base.ErrorType;
import xyz.wbsite.frame.utils.MapperUtil;
import xyz.wbsite.frame.base.BaseResponse;
import xyz.wbsite.frame.utils.ResponseUtil;
import xyz.wbsite.frame.utils.ValidationUtil;
import xyz.wbsite.frame.excel.exception.TemplateNotMatchException;
import xyz.wbsite.module.admin.ent.ConfigData;
import xyz.wbsite.module.admin.mgr.ConfigDataManager;
import xyz.wbsite.module.admin.req.ConfigDataCreateRequest;
import xyz.wbsite.module.admin.req.ConfigDataDeleteRequest;
import xyz.wbsite.module.admin.req.ConfigDataFindRequest;
import xyz.wbsite.module.admin.req.ConfigDataUpdateRequest;
import xyz.wbsite.module.admin.rsp.ConfigDataCreateResponse;
import xyz.wbsite.module.admin.rsp.ConfigDataDeleteResponse;
import xyz.wbsite.module.admin.rsp.ConfigDataFindResponse;
import xyz.wbsite.module.admin.rsp.ConfigDataUpdateResponse;
import java.io.IOException;
import java.util.List;
public class ConfigDataAjax{
@Autowired
private ConfigDataManager configDataManager;
public ConfigDataCreateResponse create(ConfigDataCreateRequest request) {
return configDataManager.create(request, LocalData.getToken());
}
public ConfigDataDeleteResponse delete(ConfigDataDeleteRequest request) {
return configDataManager.delete(request, LocalData.getToken());
}
public ConfigDataUpdateResponse update(ConfigDataUpdateRequest request) {
return configDataManager.update(request, LocalData.getToken());
}
public ConfigDataFindResponse find(ConfigDataFindRequest request) {
return configDataManager.find(request, LocalData.getToken());
}
public Object template(){
return ResponseUtil.apply(new WExcel<>(ConfigData.class));
}
public Object exports(ConfigDataFindRequest request) {
ConfigDataFindResponse response = configDataManager.find(request, LocalData.getToken());
if (response.hasError()) {
return response;
} else if (response.getTotalCount() == 0) {
response.addError(ErrorType.BUSINESS_ERROR, "导出数据为空");
return response;
}
return ResponseUtil.apply(new WExcel<>(ConfigData.class).addDatas(response.getResult()));
}
public Object imports(MultipartFile file) {
BaseResponse baseResponse = new BaseResponse();
try {
// 检查文件格式
String originalFilename = file.getOriginalFilename() != null ? file.getOriginalFilename() : "";
if (!originalFilename.matches(".+(.xlsx?|.XLSX?)$")) {
baseResponse.addError(ErrorType.BUSINESS_ERROR, "上传文件格式错误!");
return baseResponse;
}
// 兼容2003以前老版本.xls
ExcelTypeEnum excelTypeEnum = originalFilename.matches(".+(.xlsx|.XLSX)$") ? ExcelTypeEnum.XLSX : ExcelTypeEnum.XLS;
WExcel sheet = new WExcel<>(ConfigData.class).read(file.getBytes(), excelTypeEnum, new WExcel.Processor<ConfigData>() {
@Override
public List<String> exec(ConfigData o, int index) {
ConfigDataCreateRequest request = MapperUtil.map(o, ConfigDataCreateRequest.class);
List<String> validate = ValidationUtil.validate(request);
if (validate == null || validate.size() == 0) {
ConfigDataCreateResponse configDataCreateResponse = configDataManager.create(request, LocalData.getToken());
if (configDataCreateResponse.hasError()) {
for (Error error : configDataCreateResponse.getErrors()) {
validate.add(error.getMessage());
}
}
}
return validate;
}
});
// 当导入出现错误时可以将存在标注错误的Excel返回给用户改正
if (sheet.hasError()) {
return ResponseUtil.apply(sheet.getBytes(), sheet.getName() + "-检查.xlsx");
} else {
return baseResponse;
}
} catch (IOException e) {
e.printStackTrace();
LogUtil.dumpException(e);
baseResponse.addError(ErrorType.BUSINESS_ERROR, "上传文件出错");
} catch (TemplateNotMatchException e) {
baseResponse.addError(ErrorType.BUSINESS_ERROR, e.getMessage());
}
return baseResponse;
}
}

@ -1,108 +0,0 @@
package xyz.wbsite.action.ajax.admin;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;
import xyz.wbsite.frame.base.Error;
import xyz.wbsite.frame.excel.WExcel;
import xyz.wbsite.frame.utils.LogUtil;
import xyz.wbsite.frame.base.LocalData;
import xyz.wbsite.frame.base.ErrorType;
import xyz.wbsite.frame.utils.MapperUtil;
import xyz.wbsite.frame.base.BaseResponse;
import xyz.wbsite.frame.utils.ResponseUtil;
import xyz.wbsite.frame.utils.ValidationUtil;
import xyz.wbsite.frame.excel.exception.TemplateNotMatchException;
import xyz.wbsite.module.admin.ent.Locations;
import xyz.wbsite.module.admin.mgr.LocationsManager;
import xyz.wbsite.module.admin.req.LocationsCreateRequest;
import xyz.wbsite.module.admin.req.LocationsDeleteRequest;
import xyz.wbsite.module.admin.req.LocationsFindRequest;
import xyz.wbsite.module.admin.req.LocationsUpdateRequest;
import xyz.wbsite.module.admin.rsp.LocationsCreateResponse;
import xyz.wbsite.module.admin.rsp.LocationsDeleteResponse;
import xyz.wbsite.module.admin.rsp.LocationsFindResponse;
import xyz.wbsite.module.admin.rsp.LocationsUpdateResponse;
import java.io.IOException;
import java.util.List;
public class LocationsAjax{
@Autowired
private LocationsManager locationsManager;
public LocationsCreateResponse create(LocationsCreateRequest request) {
return locationsManager.create(request, LocalData.getToken());
}
public LocationsDeleteResponse delete(LocationsDeleteRequest request) {
return locationsManager.delete(request, LocalData.getToken());
}
public LocationsUpdateResponse update(LocationsUpdateRequest request) {
return locationsManager.update(request, LocalData.getToken());
}
public LocationsFindResponse find(LocationsFindRequest request) {
return locationsManager.find(request, LocalData.getToken());
}
public Object template(){
return ResponseUtil.apply(new WExcel<>(Locations.class));
}
public Object exports(LocationsFindRequest request) {
LocationsFindResponse response = locationsManager.find(request, LocalData.getToken());
if (response.hasError()) {
return response;
} else if (response.getTotalCount() == 0) {
response.addError(ErrorType.BUSINESS_ERROR, "导出数据为空");
return response;
}
return ResponseUtil.apply(new WExcel<>(Locations.class).addDatas(response.getResult()));
}
public Object imports(MultipartFile file) {
BaseResponse baseResponse = new BaseResponse();
try {
// 检查文件格式
String originalFilename = file.getOriginalFilename() != null ? file.getOriginalFilename() : "";
if (!originalFilename.matches(".+(.xlsx?|.XLSX?)$")) {
baseResponse.addError(ErrorType.BUSINESS_ERROR, "上传文件格式错误!");
return baseResponse;
}
// 兼容2003以前老版本.xls
ExcelTypeEnum excelTypeEnum = originalFilename.matches(".+(.xlsx|.XLSX)$") ? ExcelTypeEnum.XLSX : ExcelTypeEnum.XLS;
WExcel sheet = new WExcel<>(Locations.class).read(file.getBytes(), excelTypeEnum, new WExcel.Processor<Locations>() {
@Override
public List<String> exec(Locations o, int index) {
LocationsCreateRequest request = MapperUtil.map(o, LocationsCreateRequest.class);
List<String> validate = ValidationUtil.validate(request);
if (validate == null || validate.size() == 0) {
LocationsCreateResponse locationsCreateResponse = locationsManager.create(request, LocalData.getToken());
if (locationsCreateResponse.hasError()) {
for (Error error : locationsCreateResponse.getErrors()) {
validate.add(error.getMessage());
}
}
}
return validate;
}
});
// 当导入出现错误时可以将存在标注错误的Excel返回给用户改正
if (sheet.hasError()) {
return ResponseUtil.apply(sheet.getBytes(), sheet.getName() + "-检查.xlsx");
} else {
return baseResponse;
}
} catch (IOException e) {
e.printStackTrace();
LogUtil.dumpException(e);
baseResponse.addError(ErrorType.BUSINESS_ERROR, "上传文件出错");
} catch (TemplateNotMatchException e) {
baseResponse.addError(ErrorType.BUSINESS_ERROR, e.getMessage());
}
return baseResponse;
}
}

@ -1,108 +0,0 @@
package xyz.wbsite.action.ajax.admin;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;
import xyz.wbsite.frame.base.Error;
import xyz.wbsite.frame.excel.WExcel;
import xyz.wbsite.frame.utils.LogUtil;
import xyz.wbsite.frame.base.LocalData;
import xyz.wbsite.frame.base.ErrorType;
import xyz.wbsite.frame.utils.MapperUtil;
import xyz.wbsite.frame.base.BaseResponse;
import xyz.wbsite.frame.utils.ResponseUtil;
import xyz.wbsite.frame.utils.ValidationUtil;
import xyz.wbsite.frame.excel.exception.TemplateNotMatchException;
import xyz.wbsite.module.admin.ent.Rules;
import xyz.wbsite.module.admin.mgr.RulesManager;
import xyz.wbsite.module.admin.req.RulesCreateRequest;
import xyz.wbsite.module.admin.req.RulesDeleteRequest;
import xyz.wbsite.module.admin.req.RulesFindRequest;
import xyz.wbsite.module.admin.req.RulesUpdateRequest;
import xyz.wbsite.module.admin.rsp.RulesCreateResponse;
import xyz.wbsite.module.admin.rsp.RulesDeleteResponse;
import xyz.wbsite.module.admin.rsp.RulesFindResponse;
import xyz.wbsite.module.admin.rsp.RulesUpdateResponse;
import java.io.IOException;
import java.util.List;
public class RulesAjax{
@Autowired
private RulesManager rulesManager;
public RulesCreateResponse create(RulesCreateRequest request) {
return rulesManager.create(request, LocalData.getToken());
}
public RulesDeleteResponse delete(RulesDeleteRequest request) {
return rulesManager.delete(request, LocalData.getToken());
}
public RulesUpdateResponse update(RulesUpdateRequest request) {
return rulesManager.update(request, LocalData.getToken());
}
public RulesFindResponse find(RulesFindRequest request) {
return rulesManager.find(request, LocalData.getToken());
}
public Object template(){
return ResponseUtil.apply(new WExcel<>(Rules.class));
}
public Object exports(RulesFindRequest request) {
RulesFindResponse response = rulesManager.find(request, LocalData.getToken());
if (response.hasError()) {
return response;
} else if (response.getTotalCount() == 0) {
response.addError(ErrorType.BUSINESS_ERROR, "导出数据为空");
return response;
}
return ResponseUtil.apply(new WExcel<>(Rules.class).addDatas(response.getResult()));
}
public Object imports(MultipartFile file) {
BaseResponse baseResponse = new BaseResponse();
try {
// 检查文件格式
String originalFilename = file.getOriginalFilename() != null ? file.getOriginalFilename() : "";
if (!originalFilename.matches(".+(.xlsx?|.XLSX?)$")) {
baseResponse.addError(ErrorType.BUSINESS_ERROR, "上传文件格式错误!");
return baseResponse;
}
// 兼容2003以前老版本.xls
ExcelTypeEnum excelTypeEnum = originalFilename.matches(".+(.xlsx|.XLSX)$") ? ExcelTypeEnum.XLSX : ExcelTypeEnum.XLS;
WExcel sheet = new WExcel<>(Rules.class).read(file.getBytes(), excelTypeEnum, new WExcel.Processor<Rules>() {
@Override
public List<String> exec(Rules o, int index) {
RulesCreateRequest request = MapperUtil.map(o, RulesCreateRequest.class);
List<String> validate = ValidationUtil.validate(request);
if (validate == null || validate.size() == 0) {
RulesCreateResponse rulesCreateResponse = rulesManager.create(request, LocalData.getToken());
if (rulesCreateResponse.hasError()) {
for (Error error : rulesCreateResponse.getErrors()) {
validate.add(error.getMessage());
}
}
}
return validate;
}
});
// 当导入出现错误时可以将存在标注错误的Excel返回给用户改正
if (sheet.hasError()) {
return ResponseUtil.apply(sheet.getBytes(), sheet.getName() + "-检查.xlsx");
} else {
return baseResponse;
}
} catch (IOException e) {
e.printStackTrace();
LogUtil.dumpException(e);
baseResponse.addError(ErrorType.BUSINESS_ERROR, "上传文件出错");
} catch (TemplateNotMatchException e) {
baseResponse.addError(ErrorType.BUSINESS_ERROR, e.getMessage());
}
return baseResponse;
}
}

@ -1,108 +0,0 @@
package xyz.wbsite.action.ajax.admin;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;
import xyz.wbsite.frame.base.Error;
import xyz.wbsite.frame.excel.WExcel;
import xyz.wbsite.frame.utils.LogUtil;
import xyz.wbsite.frame.base.LocalData;
import xyz.wbsite.frame.base.ErrorType;
import xyz.wbsite.frame.utils.MapperUtil;
import xyz.wbsite.frame.base.BaseResponse;
import xyz.wbsite.frame.utils.ResponseUtil;
import xyz.wbsite.frame.utils.ValidationUtil;
import xyz.wbsite.frame.excel.exception.TemplateNotMatchException;
import xyz.wbsite.module.admin.ent.Services;
import xyz.wbsite.module.admin.mgr.ServicesManager;
import xyz.wbsite.module.admin.req.ServicesCreateRequest;
import xyz.wbsite.module.admin.req.ServicesDeleteRequest;
import xyz.wbsite.module.admin.req.ServicesFindRequest;
import xyz.wbsite.module.admin.req.ServicesUpdateRequest;
import xyz.wbsite.module.admin.rsp.ServicesCreateResponse;
import xyz.wbsite.module.admin.rsp.ServicesDeleteResponse;
import xyz.wbsite.module.admin.rsp.ServicesFindResponse;
import xyz.wbsite.module.admin.rsp.ServicesUpdateResponse;
import java.io.IOException;
import java.util.List;
public class ServicesAjax{
@Autowired
private ServicesManager servicesManager;
public ServicesCreateResponse create(ServicesCreateRequest request) {
return servicesManager.create(request, LocalData.getToken());
}
public ServicesDeleteResponse delete(ServicesDeleteRequest request) {
return servicesManager.delete(request, LocalData.getToken());
}
public ServicesUpdateResponse update(ServicesUpdateRequest request) {
return servicesManager.update(request, LocalData.getToken());
}
public ServicesFindResponse find(ServicesFindRequest request) {
return servicesManager.find(request, LocalData.getToken());
}
public Object template(){
return ResponseUtil.apply(new WExcel<>(Services.class));
}
public Object exports(ServicesFindRequest request) {
ServicesFindResponse response = servicesManager.find(request, LocalData.getToken());
if (response.hasError()) {
return response;
} else if (response.getTotalCount() == 0) {
response.addError(ErrorType.BUSINESS_ERROR, "导出数据为空");
return response;
}
return ResponseUtil.apply(new WExcel<>(Services.class).addDatas(response.getResult()));
}
public Object imports(MultipartFile file) {
BaseResponse baseResponse = new BaseResponse();
try {
// 检查文件格式
String originalFilename = file.getOriginalFilename() != null ? file.getOriginalFilename() : "";
if (!originalFilename.matches(".+(.xlsx?|.XLSX?)$")) {
baseResponse.addError(ErrorType.BUSINESS_ERROR, "上传文件格式错误!");
return baseResponse;
}
// 兼容2003以前老版本.xls
ExcelTypeEnum excelTypeEnum = originalFilename.matches(".+(.xlsx|.XLSX)$") ? ExcelTypeEnum.XLSX : ExcelTypeEnum.XLS;
WExcel sheet = new WExcel<>(Services.class).read(file.getBytes(), excelTypeEnum, new WExcel.Processor<Services>() {
@Override
public List<String> exec(Services o, int index) {
ServicesCreateRequest request = MapperUtil.map(o, ServicesCreateRequest.class);
List<String> validate = ValidationUtil.validate(request);
if (validate == null || validate.size() == 0) {
ServicesCreateResponse servicesCreateResponse = servicesManager.create(request, LocalData.getToken());
if (servicesCreateResponse.hasError()) {
for (Error error : servicesCreateResponse.getErrors()) {
validate.add(error.getMessage());
}
}
}
return validate;
}
});
// 当导入出现错误时可以将存在标注错误的Excel返回给用户改正
if (sheet.hasError()) {
return ResponseUtil.apply(sheet.getBytes(), sheet.getName() + "-检查.xlsx");
} else {
return baseResponse;
}
} catch (IOException e) {
e.printStackTrace();
LogUtil.dumpException(e);
baseResponse.addError(ErrorType.BUSINESS_ERROR, "上传文件出错");
} catch (TemplateNotMatchException e) {
baseResponse.addError(ErrorType.BUSINESS_ERROR, e.getMessage());
}
return baseResponse;
}
}

@ -0,0 +1,60 @@
package xyz.wbsite.action.ajax.conf;
import org.springframework.beans.factory.annotation.Autowired;
import xyz.wbsite.frame.auth.LocalData;
import xyz.wbsite.module.conf.mgr.MappingManager;
import xyz.wbsite.module.conf.req.MappingCreateRequest;
import xyz.wbsite.module.conf.req.MappingDeleteRequest;
import xyz.wbsite.module.conf.req.MappingFindRequest;
import xyz.wbsite.module.conf.req.MappingGetRequest;
import xyz.wbsite.module.conf.req.MappingUpdateRequest;
import xyz.wbsite.module.conf.req.NginxReloadRequest;
import xyz.wbsite.module.conf.rsp.MappingCreateResponse;
import xyz.wbsite.module.conf.rsp.MappingDeleteResponse;
import xyz.wbsite.module.conf.rsp.MappingFindResponse;
import xyz.wbsite.module.conf.rsp.MappingGetResponse;
import xyz.wbsite.module.conf.rsp.MappingUpdateResponse;
public class MappingAjax {
@Autowired
private MappingManager mappingManager;
public MappingCreateResponse create(MappingCreateRequest request) {
MappingCreateResponse response = mappingManager.create(request, LocalData.getToken());
if (!response.hasError()) {
NginxAjax nginxAjax = LocalData.getBean(NginxAjax.class);
nginxAjax.flushConfig();
nginxAjax.reload(new NginxReloadRequest());
}
return response;
}
public MappingDeleteResponse delete(MappingDeleteRequest request) {
MappingDeleteResponse response = mappingManager.delete(request, LocalData.getToken());
if (!response.hasError()) {
NginxAjax nginxAjax = LocalData.getBean(NginxAjax.class);
nginxAjax.flushConfig();
nginxAjax.reload(new NginxReloadRequest());
}
return response;
}
public MappingUpdateResponse update(MappingUpdateRequest request) {
MappingUpdateResponse response = mappingManager.update(request, LocalData.getToken());
if (!response.hasError()) {
NginxAjax nginxAjax = LocalData.getBean(NginxAjax.class);
nginxAjax.flushConfig();
nginxAjax.reload(new NginxReloadRequest());
}
return response;
}
public MappingFindResponse find(MappingFindRequest request) {
return mappingManager.find(request, LocalData.getToken());
}
public MappingGetResponse get(MappingGetRequest request) {
return mappingManager.get(request, LocalData.getToken());
}
}

@ -0,0 +1,119 @@
package xyz.wbsite.action.ajax.conf;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import xyz.wbsite.frame.auth.LocalData;
import xyz.wbsite.frame.base.ErrorType;
import xyz.wbsite.frame.base.SortType;
import xyz.wbsite.frame.utils.ProcessUtil;
import xyz.wbsite.module.conf.ent.Mapping;
import xyz.wbsite.module.conf.ent.NginxCtrl;
import xyz.wbsite.module.conf.mgr.MappingManager;
import xyz.wbsite.module.conf.req.MappingFindRequest;
import xyz.wbsite.module.conf.req.NginxReloadRequest;
import xyz.wbsite.module.conf.req.NginxStartRequest;
import xyz.wbsite.module.conf.req.NginxStopRequest;
import xyz.wbsite.module.conf.rsp.MappingFindResponse;
import xyz.wbsite.module.conf.rsp.NginxReloadResponse;
import xyz.wbsite.module.conf.rsp.NginxStartResponse;
import xyz.wbsite.module.conf.rsp.NginxStopResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class NginxAjax {
@Autowired
private NginxCtrl nginxCtrl;
@Autowired
private MappingManager mappingManager;
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
public NginxStartResponse start(NginxStartRequest request) {
NginxStartResponse response = new NginxStartResponse();
if (nginxCtrl.isRunning()) {
response.addError(ErrorType.BUSINESS_ERROR, "程序已经运行");
return response;
}
ProcessUtil.execBat(nginxCtrl.getStartCmd());
return response;
}
public NginxStopResponse stop(NginxStopRequest request) {
NginxStopResponse response = new NginxStopResponse();
if (!nginxCtrl.isRunning()) {
response.addError(ErrorType.BUSINESS_ERROR, "程序尚未运行");
return response;
}
ProcessUtil.execBat(nginxCtrl.getStopCmd());
return response;
}
public NginxReloadResponse reload(NginxReloadRequest request) {
NginxReloadResponse response = new NginxReloadResponse();
if (!nginxCtrl.isRunning()) {
response.addError(ErrorType.BUSINESS_ERROR, "程序尚未运行");
return response;
}
// 刷新配置文件
flushConfig();
// 重新加载配置文件
ProcessUtil.execBat(nginxCtrl.getReloadCmd());
return response;
}
public synchronized void flushConfig() {
Writer wr = null;
try {
File config = nginxCtrl.getConfig();
HashMap<String, Object> context = new HashMap<>();
MappingFindRequest mappingFindRequest = new MappingFindRequest();
mappingFindRequest.setPageSize(0);
mappingFindRequest.setSortKey("PORT");
mappingFindRequest.setSortType(SortType.ASC);
MappingFindResponse mappingFindResponse = mappingManager.find(mappingFindRequest, LocalData.getSysToken());
Map<String, List<Mapping>> services = new HashMap<>();
for (Mapping mapping : mappingFindResponse.getResult()) {
List<Mapping> mappings = services.get(mapping.getPort());
if (mappings == null) {
mappings = new ArrayList<>();
services.put(mapping.getPort(), mappings);
}
mappings.add(mapping);
}
context.put("services", services);
Template template = freeMarkerConfigurer.getConfiguration().getTemplate("nginx.conf.ftl");
wr = new OutputStreamWriter(new FileOutputStream(config), "UTF-8");
//写入
template.process(context, wr);
//关闭流
wr.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
} finally {
try {
wr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

@ -0,0 +1,63 @@
package xyz.wbsite.action.ajax.system;
import org.springframework.beans.factory.annotation.Value;
import xyz.wbsite.frame.auth.LocalData;
import xyz.wbsite.frame.auth.Token;
import xyz.wbsite.frame.base.ErrorType;
import xyz.wbsite.frame.utils.CookieUtil;
import xyz.wbsite.frame.utils.IDgenerator;
import xyz.wbsite.frame.utils.MD5Util;
import xyz.wbsite.frame.utils.ValidationUtil;
import xyz.wbsite.module.system.req.UserLoginRequest;
import xyz.wbsite.module.system.req.UserLogoutRequest;
import xyz.wbsite.module.system.rsp.UserLoginResponse;
import xyz.wbsite.module.system.rsp.UserLogoutResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Calendar;
import java.util.Date;
public class UserAjax {
@Value("${web.url.auth.admin}")
private String admin;
@Value("${web.url.auth.pwd}")
private String pwd;
public UserLoginResponse login(UserLoginRequest request, Token token, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
UserLoginResponse response = new UserLoginResponse();
ValidationUtil.validate(request, response);
if (response.hasError()) {
return response;
}
if (request.getUsername().equals(admin)) {//超级管理员登录
String generatePwd = MD5Util.generatePwd(request.getPassword());
if (!generatePwd.equals(pwd)) {
response.addError(ErrorType.BUSINESS_ERROR, "用户名或密码错误!");
} else {
Date current = new Date();
Calendar instance = Calendar.getInstance();
instance.setTime(current);
instance.add(Calendar.HOUR_OF_DAY, 1);//默认一个小时内有效
Token sysToken = LocalData.getSysToken();
sysToken.setToken(IDgenerator.nextUUID());
Cookie cookie = CookieUtil.newCookie("token", sysToken.getToken());
httpServletResponse.addCookie(cookie);
response.setToken(sysToken.getToken());
}
}
return response;
}
public UserLogoutResponse logout(UserLogoutRequest request, Token token) {
UserLogoutResponse response = new UserLogoutResponse();
CookieUtil.clearCookie("token");
return response;
}
}

@ -1,124 +0,0 @@
package xyz.wbsite.action.ajax.wframe;
import org.springframework.beans.factory.annotation.Autowired;
import xyz.wbsite.config.CacheConfig;
import xyz.wbsite.frame.base.ErrorType;
import xyz.wbsite.frame.base.LocalData;
import xyz.wbsite.frame.base.LoginRequest;
import xyz.wbsite.frame.base.LoginResponse;
import xyz.wbsite.frame.base.LogoutRequest;
import xyz.wbsite.frame.base.LogoutResponse;
import xyz.wbsite.frame.base.Token;
import xyz.wbsite.frame.base.UserEntity;
import xyz.wbsite.frame.base.VerifyCodeRequest;
import xyz.wbsite.frame.base.VerifyCodeResponse;
import xyz.wbsite.frame.provider.FrameProvider;
import xyz.wbsite.frame.provider.TokenProvider;
import xyz.wbsite.frame.provider.UserProvider;
import xyz.wbsite.frame.utils.CookieUtil;
import xyz.wbsite.frame.utils.IDgenerator;
import xyz.wbsite.frame.utils.MD5Util;
import xyz.wbsite.frame.utils.ValidationUtil;
import xyz.wbsite.frame.utils.VerifyCodeUtil;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
public class AuthAjax {
@Autowired
private CacheConfig cacheConfig;
public VerifyCodeResponse verifyCode(VerifyCodeRequest request) {
VerifyCodeResponse response = new VerifyCodeResponse();
VerifyCodeUtil.Builder builder = new VerifyCodeUtil.Builder().build();
response.setVerifyCodeId(IDgenerator.nextId());
response.setVerifyCodeBase64(builder.toBase64());
cacheConfig.put(response.getVerifyCodeId(), builder.toCode(), 3 * 60 * 1000);
return response;
}
public LoginResponse login(LoginRequest request, HttpServletResponse httpServletResponse) {
LoginResponse response = new LoginResponse();
ValidationUtil.validate(request, response);
if (response.hasError()) {
return response;
}
// 获取验证码
String o = cacheConfig.remove(request.getVerifyCodeId(), String.class);
if (o == null) {
response.addError(ErrorType.BUSINESS_ERROR, "验证码已过期!");
return response;
}
// 验证验证码
if (!request.getVerifyCodeCode().toLowerCase().equals(o.toLowerCase())) {
response.addError(ErrorType.BUSINESS_ERROR, "验证码错误!");
cacheConfig.remove(request.getVerifyCodeId());
return response;
}
// 获取用户提供者
UserProvider userProvider = FrameProvider.getInstance().getUserProvider();
if (userProvider == null) {
response.addError(ErrorType.BUSINESS_ERROR, "用户提供者未实现!");
return response;
}
// 获取用户信息
UserEntity userEntity = userProvider.getUser(request.getUsername());
if (userEntity == null) {
response.addError(ErrorType.BUSINESS_ERROR, "用户名或密码错误!");
return response;
}
// 验证密码
String generatePwd = MD5Util.generatePwd(request.getPassword());
if (!generatePwd.equals(userEntity.getPassword())) {
response.addError(ErrorType.BUSINESS_ERROR, "用户名或密码错误!");
return response;
}
// 获取通行证提供者
TokenProvider tokenProvider = FrameProvider.getInstance().getTokenProvider();
if (tokenProvider == null) {
response.addError(ErrorType.BUSINESS_ERROR, "通行证提供者未实现!");
return response;
}
// 构建通行证
Token token = tokenProvider.build(userEntity);
if (token == null) {
response.addError(ErrorType.BUSINESS_ERROR, "通行证构建失败!");
return response;
}
response.setToken(token.getToken());
Cookie cookie = CookieUtil.newCookie("token", response.getToken());
httpServletResponse.addCookie(cookie);
return response;
}
public LogoutResponse logout(LogoutRequest request) {
LogoutResponse response = new LogoutResponse();
Token token = LocalData.getToken();
if (token != null) {
cacheConfig.clear(token.getToken());
}
CookieUtil.clearCookie("token");
return response;
}
public LogoutResponse changePwd(LogoutRequest request) {
LogoutResponse response = new LogoutResponse();
Token token = LocalData.getToken();
if (token != null) {
cacheConfig.clear(token.getToken());
}
CookieUtil.clearCookie("token");
return response;
}
}

@ -1,23 +0,0 @@
package xyz.wbsite.action.ajax.wframe;
import xyz.wbsite.frame.base.DictLoadRequest;
import xyz.wbsite.frame.base.DictLoadResponse;
import xyz.wbsite.frame.provider.DictProvider;
import xyz.wbsite.frame.provider.FrameProvider;
import xyz.wbsite.frame.utils.ValidationUtil;
public class DictAjax {
public DictLoadResponse load(DictLoadRequest request) {
DictLoadResponse response = new DictLoadResponse();
ValidationUtil.validate(request, response);
if (response.hasError()) {
return response;
}
DictProvider dictProvider = FrameProvider.getInstance().getDictProvider();
response.setResult(dictProvider.getDict(request.getDictName()));
return response;
}
}

@ -0,0 +1,33 @@
package xyz.wbsite.action.api.conf;
import xyz.wbsite.frame.auth.LocalData;
import xyz.wbsite.module.conf.mgr.MappingManager;
import xyz.wbsite.module.conf.req.*;
import xyz.wbsite.module.conf.rsp.*;
import org.springframework.beans.factory.annotation.Autowired;
public class MappingApi{
@Autowired
private MappingManager mappingManager;
public MappingCreateResponse create(MappingCreateRequest request) {
return mappingManager.create(request, LocalData.getToken());
}
public MappingDeleteResponse delete(MappingDeleteRequest request) {
return mappingManager.delete(request, LocalData.getToken());
}
public MappingUpdateResponse update(MappingUpdateRequest request) {
return mappingManager.update(request, LocalData.getToken());
}
public MappingFindResponse find(MappingFindRequest request) {
return mappingManager.find(request, LocalData.getToken());
}
public MappingGetResponse get(MappingGetRequest request) {
return mappingManager.get(request, LocalData.getToken());
}
}

@ -0,0 +1,15 @@
package xyz.wbsite.action.control;
import xyz.wbsite.frame.base.Control;
import org.springframework.ui.Model;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Header extends Control {
@Override
public void exec(Model model, HttpServletRequest request, HttpServletResponse response) {
}
}

@ -1,24 +0,0 @@
package xyz.wbsite.action.page.control;
import xyz.wbsite.frame.base.Control;
import org.springframework.ui.Model;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* resources/templates/control/header.ftl<#include controlHolder("nav")/> 访
* <br>
* 访Screen
*
* @author author
* @version 0.0.1
* @since 2020-11-01
*/
public class Header extends Control {
@Override
public void exec(Model model, HttpServletRequest request, HttpServletResponse response) {
}
}

@ -0,0 +1,23 @@
package xyz.wbsite.action.screen;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.ui.Model;
import xyz.wbsite.frame.base.Screen;
import xyz.wbsite.module.conf.ent.NginxCtrl;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Home extends Screen {
@Autowired
private NginxCtrl nginxCtrl;
@Value("${mapping.default.port}")
private String serverPort;
@Override
public void exec(Model model, HttpServletRequest request, HttpServletResponse response) {
model.addAttribute("run", nginxCtrl.isRunning() ? "true" : "false");
model.addAttribute("serverPort", serverPort);
}
}

@ -1,19 +1,11 @@
package xyz.wbsite.action.page.screen;
package xyz.wbsite.action.screen;
import xyz.wbsite.frame.base.Screen;
import xyz.wbsite.frame.base.LocalData;
import org.springframework.ui.Model;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* resources/templates/screen/index.ftl访Screen
*
* @author author
* @version 0.0.1
* @since 2020-11-01
*/
public class Index extends Screen {
@Override
@ -22,11 +14,9 @@ public class Index extends Screen {
// 获取配置
HashMap<String, Object> prop = new HashMap<>();
prop.put("open", true);//是否保持一个子菜单展开
prop.put("coll", false);//左侧菜单是否收缩
prop.put("coll", true);//左侧菜单是否收缩
prop.put("tran", false);//是否展示动画
prop.put("full", false);//是否全屏
prop.put("active", LocalData.getActive());//当前激活环境
model.addAttribute("prop", prop);
model.addAttribute("token", LocalData.getToken());
}
}

@ -25,9 +25,6 @@ import java.util.regex.Pattern;
* <p>
* Screen {@link ActionConfig#registryScreen}
* Control {@link ActionConfig#registryControl}
* Ajax {@link ActionConfig#registryAjax}
* Api {@link ActionConfig#registryApi}
* Wsvr {@link ActionConfig#registryWsvr}
*
* @author wangbing
* @version 0.0.1
@ -40,7 +37,6 @@ public class ActionConfig implements BeanDefinitionRegistryPostProcessor {
public static String CONTROL_PREFIX = "/control/";
public static String AJAX_PREFIX = "/ajax/";
public static String API_PREFIX = "/api/";
public static String MSVR_PREFIX = "/wsvr/";
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
@ -48,12 +44,11 @@ public class ActionConfig implements BeanDefinitionRegistryPostProcessor {
Pattern compile = Pattern.compile("(.*)\\.config");
Matcher matcher = compile.matcher(aPackage);
if (matcher.find()) {
String domain = matcher.group(1);
registryScreen(domain + ".action.page.screen", beanDefinitionRegistry);
registryControl(domain + ".action.page.control", beanDefinitionRegistry);
registryAjax(domain + ".action.ajax", beanDefinitionRegistry);
registryApi(domain + ".action.api", beanDefinitionRegistry);
registryWsvr(domain + ".action.msvr", beanDefinitionRegistry);
String basePackage = matcher.group(1);
registryScreen(basePackage + ".action.screen", beanDefinitionRegistry);
registryControl(basePackage + ".action.control", beanDefinitionRegistry);
registryAjax(basePackage + ".action.ajax", beanDefinitionRegistry);
registryApi(basePackage + ".action.api", beanDefinitionRegistry);
}
}
@ -62,7 +57,7 @@ public class ActionConfig implements BeanDefinitionRegistryPostProcessor {
}
private int registryScreen(String domain, BeanDefinitionRegistry beanDefinitionRegistry) {
private int registryScreen(String basePackage, BeanDefinitionRegistry beanDefinitionRegistry) {
ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(beanDefinitionRegistry);
classPathBeanDefinitionScanner.resetFilters(false);
classPathBeanDefinitionScanner.addIncludeFilter(new AssignableTypeFilter(Screen.class));
@ -70,15 +65,15 @@ public class ActionConfig implements BeanDefinitionRegistryPostProcessor {
@Override
public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) {
String beanClassName = beanDefinition.getBeanClassName();
String beamName = beanClassName.replaceAll(domain + ".", SCREEN_PREFIX).replaceAll("\\.","/").toLowerCase();
String beamName = beanClassName.replaceAll(basePackage + ".", SCREEN_PREFIX).replaceAll("\\.","/").toLowerCase();
LogUtil.i("registry screen " + beamName);
return beamName;
}
});
return classPathBeanDefinitionScanner.scan(domain);
return classPathBeanDefinitionScanner.scan(basePackage);
}
private int registryControl(String domain, BeanDefinitionRegistry beanDefinitionRegistry) {
private int registryControl(String basePackage, BeanDefinitionRegistry beanDefinitionRegistry) {
ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(beanDefinitionRegistry);
classPathBeanDefinitionScanner.resetFilters(false);
classPathBeanDefinitionScanner.addIncludeFilter(new AssignableTypeFilter(Control.class));
@ -86,15 +81,15 @@ public class ActionConfig implements BeanDefinitionRegistryPostProcessor {
@Override
public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) {
String beanClassName = beanDefinition.getBeanClassName();
String beamName = beanClassName.replaceAll(domain + ".", CONTROL_PREFIX).replaceAll("\\.","/").toLowerCase();
String beamName = beanClassName.replaceAll(basePackage + ".", CONTROL_PREFIX).replaceAll("\\.","/").toLowerCase();
LogUtil.i("registry control " + beamName);
return beamName;
}
});
return classPathBeanDefinitionScanner.scan(domain);
return classPathBeanDefinitionScanner.scan(basePackage);
}
private int registryAjax(String domain, BeanDefinitionRegistry beanDefinitionRegistry) {
private int registryAjax(String basePackage, BeanDefinitionRegistry beanDefinitionRegistry) {
ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(beanDefinitionRegistry);
classPathBeanDefinitionScanner.resetFilters(false);
classPathBeanDefinitionScanner.addIncludeFilter(new TypeFilter() {
@ -108,17 +103,17 @@ public class ActionConfig implements BeanDefinitionRegistryPostProcessor {
public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) {
String beanClassName = beanDefinition.getBeanClassName();
if (beanClassName != null && beanClassName.endsWith("Ajax")) {
beanClassName = beanClassName.substring(0, beanClassName.lastIndexOf("Ajax"));
beanClassName = beanClassName.substring(0, beanClassName.length() - 4);
}
String beamName = beanClassName.replaceAll(domain + ".", AJAX_PREFIX).replaceAll("\\.","/").toLowerCase();
String beamName = beanClassName.replaceAll(basePackage + ".", AJAX_PREFIX).replaceAll("\\.","/").toLowerCase();
LogUtil.i("registry ajax " + beamName);
return beamName;
}
});
return classPathBeanDefinitionScanner.scan(domain);
return classPathBeanDefinitionScanner.scan(basePackage);
}
private int registryApi(String domain, BeanDefinitionRegistry beanDefinitionRegistry) {
private int registryApi(String basePackage, BeanDefinitionRegistry beanDefinitionRegistry) {
ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(beanDefinitionRegistry);
classPathBeanDefinitionScanner.addIncludeFilter(new TypeFilter() {
@Override
@ -131,36 +126,13 @@ public class ActionConfig implements BeanDefinitionRegistryPostProcessor {
public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) {
String beanClassName = beanDefinition.getBeanClassName();
if (beanClassName != null && beanClassName.endsWith("Api")) {
beanClassName = beanClassName.substring(0, beanClassName.lastIndexOf("Api"));
beanClassName = beanClassName.substring(0, beanClassName.length() - 3);
}
String beamName = beanClassName.replaceAll(domain + ".", API_PREFIX).replaceAll("\\.","/").toLowerCase();
String beamName = beanClassName.replaceAll(basePackage + ".", API_PREFIX).replaceAll("\\.","/").toLowerCase();
LogUtil.i("registry api " + beamName);
return beamName;
}
});
return classPathBeanDefinitionScanner.scan(domain);
}
private int registryWsvr(String domain, BeanDefinitionRegistry beanDefinitionRegistry) {
ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(beanDefinitionRegistry);
classPathBeanDefinitionScanner.addIncludeFilter(new TypeFilter() {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
return true;
}
});
classPathBeanDefinitionScanner.setBeanNameGenerator(new BeanNameGenerator() {
@Override
public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) {
String beanClassName = beanDefinition.getBeanClassName();
if (beanClassName != null && beanClassName.endsWith("Msvr")) {
beanClassName = beanClassName.substring(0, beanClassName.lastIndexOf("Msvr"));
}
String beamName = beanClassName.replaceAll(domain + ".", MSVR_PREFIX).replaceAll("\\.","/").toLowerCase();
LogUtil.i("registry wsvr " + beamName);
return beamName;
}
});
return classPathBeanDefinitionScanner.scan(domain);
return classPathBeanDefinitionScanner.scan(basePackage);
}
}

@ -1,90 +0,0 @@
package xyz.wbsite.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* CacheRedisCacheEhCacheCacheConcurrentMapCache
* CacheManager(Cache)
*
* @EnableCaching
* @Cacheable condition:使 unless:
* @CacheEvict
* @CachePut
* <p>
* keyGenerator key
* serialize value
*/
@Configuration
@EnableCaching
@EnableScheduling
public class CacheConfig {
@Autowired
private CacheConfig cacheConfig;
private Map<Object, Long> expireMap = new HashMap<>();
public static final String DEFAULT_CACHE_NAME = "default_cache_name";
public <T> T put(Object key, T value) {
return cacheConfig.put(key, value, 0);
}
@Cacheable(value = DEFAULT_CACHE_NAME, key = "#key", unless = "#result==null")
public <T> T put(Object key, T value, long expire) {
if (value != null && expire > 0) {
expireMap.put(key, System.currentTimeMillis() + expire);
}
return value;
}
@CacheEvict(cacheNames = DEFAULT_CACHE_NAME, key = "#key")
public void clear(Object key) {
}
public Object get(Object key) {
return cacheConfig.get(key, Object.class);
}
public <T> T get(Object key, Class<T> tClass) {
return cacheConfig.put(key, null);
}
public Object remove(Object key) {
return remove(key, Object.class);
}
public <T> T remove(Object key, Class<T> tClass) {
T t = cacheConfig.get(key, tClass);
cacheConfig.clear(key);
return t;
}
@Scheduled(fixedDelay = 1000)
public void expireTask() {
Iterator<Object> iterator = expireMap.keySet().iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
Long aLong = expireMap.get(next);
if (aLong == null) {
cacheConfig.remove(next);
iterator.remove();
}
if (aLong < System.currentTimeMillis()) {
cacheConfig.remove(next);
iterator.remove();
}
}
}
}

@ -1,9 +1,5 @@
package xyz.wbsite.config;
import xyz.wbsite.frame.base.LocalData;
import xyz.wbsite.frame.base.Control;
import xyz.wbsite.frame.utils.RequestUtil;
import xyz.wbsite.frame.utils.UrlUtil;
import freemarker.template.SimpleScalar;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModelException;
@ -18,6 +14,9 @@ import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
import xyz.wbsite.frame.auth.LocalData;
import xyz.wbsite.frame.base.Control;
import xyz.wbsite.frame.utils.UrlUtil;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
@ -56,15 +55,28 @@ public class FreeMarkerConfig {
try {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
LocaleResolver localeResolver = (LocaleResolver) request.getAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE);
String page = RequestUtil.getPage();
String servletPath = LocalData.getAction();
servletPath = servletPath.replaceAll("^/", "");
String[] split = servletPath.split("/");
StringBuilder sb = new StringBuilder("");
// 分割组装路径
for (int i = 0; i < split.length; i++) {
sb.append(split[i]);
if (i != split.length - 1) {
sb.append(File.separator);
}
}
Locale locale = localeResolver.resolveLocale(request);
String viewName = "screen/" + page;
String viewName = "screen" + File.separator + sb.toString();
View view = viewResolver.resolveViewName(viewName, locale);
//无法找到对应screen
if (view == null) {
return "";
} else {
return SCREEN_PREFIX + page + suffix;
return SCREEN_PREFIX + servletPath + suffix;
}
} catch (Exception e) {
e.printStackTrace();

@ -0,0 +1,69 @@
package xyz.wbsite.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.StringUtils;
import xyz.wbsite.frame.utils.FileUtil;
import xyz.wbsite.frame.utils.ZipUtil;
import xyz.wbsite.module.conf.ent.NginxCtrl;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@Configuration
public class NginxConfig {
@Autowired
private Environment environment;
@Bean
public NginxCtrl initNginx() {
String property = environment.getProperty("nginx-path");
File nginxHome = null;
if (StringUtils.isEmpty(property)) {
ApplicationHome home = new ApplicationHome(getClass());
// 当前运行jar文件
File jarFile = home.getSource() != null ? home.getSource() : home.getDir();
//jar同目录
nginxHome = new File(jarFile.getParent(), "nginx");
if (!nginxHome.exists()) {
ClassPathResource classPathResource = new ClassPathResource("nginx-1.16.1.zip");
try {
InputStream inputStream = classPathResource.getInputStream();
File nginxDir = new File(jarFile.getParent(), "nginx");
File nginxZip = new File(jarFile.getParent(), "nginx.zip");
FileUtil.inputStream2File(inputStream, nginxZip);
ZipUtil.unZip(nginxZip, nginxDir);
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
nginxHome = new File(property);
}
if (!nginxHome.exists()) {
throw new RuntimeException("nginx home not exists!");
}
File start = new File(nginxHome, "start.bat");
File stop = new File(nginxHome, "stop.bat");
File reload = new File(nginxHome, "reload.bat");
NginxCtrl nginxCtrl = new NginxCtrl();
nginxCtrl.setStartCmd(start.getAbsolutePath());
nginxCtrl.setStopCmd(stop.getAbsolutePath());
nginxCtrl.setReloadCmd(reload.getAbsolutePath());
nginxCtrl.setVersionCmd(nginxHome.getAbsolutePath() + " -v ");
nginxCtrl.setConfig(new File(new File(nginxHome, "conf"), "nginx.conf"));
return nginxCtrl;
}
}

@ -6,7 +6,6 @@ import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -18,8 +17,7 @@ public class SQLiteConfig {
@PostConstruct
public void generateDB() {
try {
Pattern compile = Pattern.compile("jdbc:sqlite:(.*.db3).*");
Pattern compile = Pattern.compile("jdbc:sqlite:(.*.db).*");
Matcher matcher = compile.matcher(url);
if (matcher.find()) {
String group = matcher.group(1);
@ -27,12 +25,8 @@ public class SQLiteConfig {
if (!file.exists()) {
File path = file.getAbsoluteFile().getParentFile();
if (!path.exists()) path.mkdirs();
if (!file.exists()) file.createNewFile();
ResourceUtil.copyToFile("nginx-admin.db3", file);
ResourceUtil.copyResource2File("nginx-admin.db", file);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

@ -0,0 +1,91 @@
package xyz.wbsite.config;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.core.type.filter.AssignableTypeFilter;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;
import xyz.wbsite.frame.schedule.RunTask;
import xyz.wbsite.frame.utils.LogUtil;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* ,
* :@Profile("dev") ()
*/
@Configuration
@Component
public class ScheduleConfig extends ThreadPoolTaskScheduler implements BeanDefinitionRegistryPostProcessor {
private Map<String, Class<RunTask>> classMap;
private Map<String, ScheduledFuture<?>> futureMap;
public ScheduleConfig() {
classMap = new HashMap<>();
futureMap = new HashMap<>();
setPoolSize(4);
initialize();
}
public boolean createOrRepeat(RunTask task) {
if (futureMap.containsKey(task.taskId())) {
ScheduledFuture<?> scheduledFuture = futureMap.get(task.taskId());
scheduledFuture.cancel(false);
}
classMap.put(task.taskId(), (Class<RunTask>) task.getClass());
futureMap.put(task.taskId(), task.schedule(this));
return true;
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
String aPackage = this.getClass().getPackage().getName();
Pattern compile = Pattern.compile("(.*)\\.config");
Matcher matcher = compile.matcher(aPackage);
if (matcher.find()) {
String basePackage = matcher.group(1);
registryTask(basePackage, beanDefinitionRegistry);
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
private int registryTask(String basePackage, BeanDefinitionRegistry beanDefinitionRegistry) {
ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(beanDefinitionRegistry);
classPathBeanDefinitionScanner.resetFilters(false);
classPathBeanDefinitionScanner.addIncludeFilter(new AssignableTypeFilter(RunTask.class));
classPathBeanDefinitionScanner.setBeanNameGenerator(new BeanNameGenerator() {
@Override
public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) {
String beanClassName = beanDefinition.getBeanClassName();
try {
Class<?> aClass = Class.forName(beanClassName);
Object instance = aClass.newInstance();
RunTask task = (RunTask) instance;
ScheduleConfig.this.createOrRepeat(task);
} catch (Exception e) {
e.printStackTrace();
}
LogUtil.i("registry task " + beanClassName);
return beanClassName;
}
});
return classPathBeanDefinitionScanner.scan(basePackage);
}
}

@ -7,16 +7,14 @@ import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
import xyz.wbsite.frame.base.LocalData;
import xyz.wbsite.frame.base.Token;
import xyz.wbsite.frame.provider.FrameProvider;
import xyz.wbsite.frame.provider.TokenProvider;
import xyz.wbsite.frame.auth.LocalData;
import xyz.wbsite.frame.auth.Token;
import xyz.wbsite.frame.utils.CookieUtil;
import xyz.wbsite.frame.utils.RequestUtil;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
@ -26,6 +24,8 @@ import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
@ -35,9 +35,16 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
private String[] included;
@Value("${web.url.auth.excluded}")
private String[] excluded;
@Value("${web.url.login}")
@Value("${spring.mvc.static-path-pattern}")
private String[] staticPath;
@Value("${web.login.page}")
private String loginPage;
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().mvcMatchers(staticPath);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
@ -70,30 +77,26 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 1优先获取参数中的token
String token = request.getParameter("token");
// 2其次获取Cookie中的token
if (token == null || token.isEmpty()) {
token = CookieUtil.getCookieValue(request.getCookies(), "token");
}
// 3其次获取Header中的token
if (token == null || token.isEmpty()) {
token = RequestUtil.getHeader(request, "token");
}
// 组装Token ~ 这边根据实际的业务组装Token
if (token != null) {
TokenProvider tokenProvider = FrameProvider.getInstance().getTokenProvider();
if (tokenProvider == null) {
LocalData.setToken(null);
} else {
Token build = tokenProvider.build(token);
LocalData.setToken(build);
}
LocalData.setToken( LocalData.getSysToken());
} else {
LocalData.setToken(null);
}
// Action
String servletPath = request.getServletPath().toLowerCase();
Pattern compile = Pattern.compile("^/(.+)\\.htm");
Matcher matcher = compile.matcher(servletPath);
if (matcher.find()) {
LocalData.setAction(matcher.group(1));
}
try {
filterChain.doFilter(servletRequest, servletResponse);
} catch (AccessDeniedException e) {
@ -123,4 +126,5 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
};
}
}

@ -1,63 +0,0 @@
package xyz.wbsite.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.type.filter.AssignableTypeFilter;
import xyz.wbsite.frame.schedule.RunTask;
import xyz.wbsite.frame.schedule.Scheduler;
import xyz.wbsite.frame.utils.LogUtil;
import javax.annotation.PostConstruct;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Configuration
public class TaskConfig {
@Autowired
private Scheduler scheduler;
@Bean
public Scheduler registerScheduler() {
return new Scheduler();
}
@PostConstruct
public void registryTask() {
{// 扫描类任务
String aPackage = this.getClass().getPackage().getName();
Pattern compile = Pattern.compile("(.*)\\.config");
Matcher matcher = compile.matcher(aPackage);
if (matcher.find()) {
DefaultListableBeanFactory simpleBeanDefinitionRegistry = new DefaultListableBeanFactory();
ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(simpleBeanDefinitionRegistry);
classPathBeanDefinitionScanner.resetFilters(false);
classPathBeanDefinitionScanner.addIncludeFilter(new AssignableTypeFilter(RunTask.class));
classPathBeanDefinitionScanner.setBeanNameGenerator(new BeanNameGenerator() {
@Override
public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) {
String beanClassName = beanDefinition.getBeanClassName();
try {
Class<?> aClass = Class.forName(beanClassName);
Object instance = aClass.newInstance();
RunTask task = (RunTask) instance;
scheduler.createOrRepeat(task);
} catch (Exception e) {
e.printStackTrace();
}
LogUtil.i("registry task " + beanClassName);
return beanClassName;
}
});
classPathBeanDefinitionScanner.scan(matcher.group(1));
}
}
}
}

@ -0,0 +1,56 @@
package xyz.wbsite.config;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.Nullable;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.lang.reflect.Method;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@EnableAsync
public class ThreadPoolConfig implements AsyncConfigurer {
private ThreadPoolTaskExecutor executor;
private int corePoolSize = 10;//线程池维护线程的最少数量
private int maxPoolSize = 30;//线程池维护线程的最大数量
private int queueCapacity = 8; //缓存队列
private int keepAlive = 60;//允许的空闲时间
@Nullable
@Override
public Executor getAsyncExecutor() {
executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix("mqExecutor-");
// rejection-policy当pool已经达到max size的时候如何处理新任务
// CALLER_RUNS不在新线程中执行任务而是由调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //对拒绝task的处理策略
executor.setKeepAliveSeconds(keepAlive);
executor.initialize();
return executor;
}
@Nullable
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new AsyncUncaughtExceptionHandler() {
@Override
public void handleUncaughtException(Throwable throwable, Method method, Object... objects) {
System.out.println("-------------》》》捕获线程异常信息");
}
};
}
}

@ -1,72 +1,55 @@
package xyz.wbsite.config;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import xyz.wbsite.frame.provider.SimpleTokenProvider;
import xyz.wbsite.frame.provider.SimpleUserProvider;
import xyz.wbsite.frame.provider.TokenProvider;
import xyz.wbsite.frame.provider.UserProvider;
import xyz.wbsite.frame.utils.LogUtil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Value("${web.url.index}")
@Value("${web.home.page}")
private String homePage;
@Value("${spring.mvc.static-path-pattern}")
private String[] staticPath;
/**
*
*
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 全局拦截器
// 全局异常收集拦截器
registry.addInterceptor(new HandlerInterceptorAdapter() {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);
if (ex != null) {
LogUtil.dumpException(ex);
}
}
}).addPathPatterns("/**").excludePathPatterns(staticPath);
}
/**
*
*
* @param registry
*/
// @Override
// public void addCorsMappings(CorsRegistry registry) {
// registry.addMapping("/**")
// .allowedOrigins("*")
// .allowCredentials(true)
// .allowedMethods("GET", "POST", "DELETE", "PUT")
// .maxAge(3600);
// }
/**
* Jackson
* <p>
* 1LonglongStringjavascriptNumber
*
* @param converters
*/
@ -76,60 +59,64 @@ public class WebMvcConfig implements WebMvcConfigurer {
if (converter instanceof MappingJackson2HttpMessageConverter) {
ObjectMapper objectMapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
SimpleModule simpleModule = new SimpleModule();
{// 序列化时Long或long类型在转String防止出现javascript中Number精度丢失的情况。
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
}
{// 反序列化时Boolean和boolean可以识别0和1数字
simpleModule.addDeserializer(Boolean.class, new JsonDeserializer<Boolean>() {
@Override
public Boolean deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
String text = jsonParser.getText();
if (text == null || "".equals(text)) {
return null;
} else {
return text.matches("1|true");
}
}
});
simpleModule.addDeserializer(Boolean.TYPE, new JsonDeserializer<Boolean>() {
@Override
public Boolean deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
String text = jsonParser.getText();
if (text == null || "".equals(text)) {
return false;
} else {
return text.matches("1|true");
}
}
});
objectMapper.registerModule(simpleModule);
}
objectMapper.registerModule(simpleModule);
}
}
}
/**
*
*
* @return
*/
@Bean
@ConditionalOnMissingBean
public UserProvider userProviderImpl() {
return new SimpleUserProvider();
}
/**
*
*
* @return
*/
@Bean
@ConditionalOnMissingBean
public TokenProvider tokenProviderImpl() {
return new SimpleTokenProvider();
}
// @Bean
// @Profile("prod")
// public ServletWebServerFactory servletContainer() {
// TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
//
// // 基本参数
// String keyStore = "1754557_www.wbsite.xyz.pfx";
// String keyStorePassword = "s98n7CLd";
// String keyStoreType = "PKCS12";
// int httpsPort = 443;
//
// File keystore = null;
// // 正常开发可以通过getFile()获取打包jar后无法直接获取File对象需将文件考出
// try {
// keystore = new ClassPathResource(keyStore).getFile();
// } catch (IOException ex) {
// try {
// ApplicationHome home = new ApplicationHome(getClass());
// // 当前运行jar文件
// File jarFile = home.getSource();
// //jar同目录
// keystore = new File(jarFile.getParent(), keyStore);
//
// InputStream inputStream = new ClassPathResource(keyStore).getInputStream();
// byte[] bytes = new byte[inputStream.available()];
//
// inputStream.read(bytes);
//
// inputStream.close();
//
// FileOutputStream fileOutputStream = new FileOutputStream(keystore);
// fileOutputStream.write(bytes);
// fileOutputStream.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
//
// // 创建Connector
// Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
// Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// connector.setScheme("https");
// connector.setSecure(true);
// connector.setPort(httpsPort);
// protocol.setSSLEnabled(true);
// protocol.setKeystoreFile(keystore.getAbsolutePath());
// protocol.setKeystorePass(keyStorePassword);
// protocol.setKeystoreType(keyStoreType);
//
// // 添加
// tomcat.addAdditionalTomcatConnectors(connector);
// return tomcat;
// }
}

@ -1,17 +1,14 @@
package xyz.wbsite.frame.base;
package xyz.wbsite.frame.auth;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import xyz.wbsite.frame.utils.PropertiesUtil;
import xyz.wbsite.frame.utils.StringUtil;
import xyz.wbsite.frame.auth.Token;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* LocalData -
@ -22,8 +19,6 @@ import java.util.regex.Pattern;
*/
public class LocalData {
private static String[] applicationArgs = null;
private static ApplicationContext applicationContext = null;
private static Token system = null;
@ -41,6 +36,19 @@ public class LocalData {
return system;
}
/**
* target = '/aa/bb'
*/
private static final ThreadLocal<String> actionHolder = new ThreadLocal();
public static String getAction() {
return actionHolder.get();
}
public static void setAction(String action) {
actionHolder.set(action);
}
/**
*
*/
@ -66,8 +74,8 @@ public class LocalData {
return LocalData.applicationContext;
}
public static void setContext(ApplicationContext context) {
LocalData.applicationContext = context;
public static void setApplicationContext(ApplicationContext applicationContext) {
LocalData.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> t) {
@ -81,52 +89,7 @@ public class LocalData {
}
}
public static Object getBean(String beanName) {
if (getApplicationContext() == null) {
return null;
}
try {
return getApplicationContext().getBean(beanName);
} catch (BeansException ignored) {
return null;
}
}
public static <T> T getBean(String beanName, Class<T> t) {
if (getApplicationContext() == null) {
return null;
}
try {
return getApplicationContext().getBean(beanName, t);
} catch (BeansException ignored) {
return null;
}
}
public static Environment getEnvironment() {
return getBean(Environment.class);
}
public static String getProperty(String key, String defaultValue) {
Environment environment = getEnvironment();
if (environment != null) {
return environment.getProperty(key, defaultValue);
} else {
String active = LocalData.getActive();
if (StringUtil.isEmpty(active)) {
return PropertiesUtil.getProp("application.properties", key, defaultValue);
} else {
return PropertiesUtil.getProp("application-" + active + ".properties", key, defaultValue);
}
}
}
public static String getActive() {
Environment environment = getEnvironment();
return environment.getActiveProfiles()[0];
}
public static String getContext() {
return getRequest().getContextPath();
}
}

@ -1,7 +1,6 @@
package xyz.wbsite.frame.base;
import xyz.wbsite.frame.listener.FrameListener;
package xyz.wbsite.frame.auth;
import xyz.wbsite.frame.utils.IDgenerator;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
@ -31,22 +30,10 @@ public class Token implements Serializable {
*
*/
private String userName;
/**
*
*/
private String userAlias;
private Set<String> resSet = new HashSet<>();
public boolean hasRes(String res) {
{// todo 开发初期收集资源,后期删除
String active = LocalData.getActive();
if (active.contains("dev")) {//测试环境捕获资源
FrameListener instance = FrameListener.getInstance();
instance.onRes(res);
}
}
for (String s : resSet) {
if (res.matches(s)) {
return true;
@ -64,10 +51,12 @@ public class Token implements Serializable {
this.resSet.addAll(resourceSet);
}
public Set<String> getResSet() {
return resSet;
}
public long getId() {
return id;
}
@ -92,14 +81,6 @@ public class Token implements Serializable {
this.userName = userName;
}
public String getUserAlias() {
return userAlias;
}
public void setUserAlias(String userAlias) {
this.userAlias = userAlias;
}
public String getToken() {
return token;
}

@ -1,8 +1,6 @@
package xyz.wbsite.frame.base;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.io.Serializable;
import java.util.Date;
@ -18,47 +16,40 @@ public class BaseEntity implements Serializable {
/**
*
*/
@ExcelIgnore
private long id;
/**
*
*/
@ExcelIgnore
private long rowVersion;
/**
*
*/
@JsonIgnore
@ExcelIgnore
private long createBy;
/**
*
*/
@ExcelIgnore
private Date createTime;
/**
*
*/
@JsonIgnore
@ExcelIgnore
private long lastUpdateBy;
/**
*
*/
@JsonIgnore
@ExcelIgnore
private Date lastUpdateTime;
/**
*
*/
@JsonIgnore
@ExcelIgnore
private boolean isDeleted;
public long getRowVersion() {

@ -1,44 +0,0 @@
package xyz.wbsite.frame.base;
import java.util.List;
public class DictEntity extends BaseEntity {
/**
*
*/
private String label;
/**
*
*/
private String value;
/**
*
*/
private List<DictEntity> children;
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public List<DictEntity> getChildren() {
return children;
}
public void setChildren(List<DictEntity> children) {
this.children = children;
}
}

@ -1,17 +0,0 @@
package xyz.wbsite.frame.base;
import javax.validation.constraints.NotEmpty;
public class DictLoadRequest extends BaseRequest{
@NotEmpty(message = "字典名称不能为空")
private String dictName;
public String getDictName() {
return dictName;
}
public void setDictName(String dictName) {
this.dictName = dictName;
}
}

@ -1,23 +0,0 @@
package xyz.wbsite.frame.base;
import xyz.wbsite.frame.base.DictEntity;
import java.util.ArrayList;
import java.util.List;
public class DictLoadResponse extends BaseResponse {
private List<DictEntity> result = new ArrayList<>();
public List<DictEntity> getResult() {
return result;
}
public void setResult(List<DictEntity> result) {
this.result = result;
}
public void put(DictEntity entity) {
this.result.add(entity);
}
}

@ -1,92 +0,0 @@
package xyz.wbsite.frame.base;
import java.io.Serializable;
import java.util.Date;
public class LogTaskEntity implements Serializable {
/**
* TASK_ID -
*/
private String taskId;
/**
* TASK_NAME -
*/
private String taskName;
/**
* START_TIME -
*/
private Date startTime;
/**
* END_TIME -
*/
private Date endTime;
/**
* EXEC_TIME -
*/
private Integer execTime;
/**
* EXEC_STATE -
*/
private String execState;
/**
* EXEC_RESULT -
*/
private String execResult;
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public Integer getExecTime() {
return execTime;
}
public void setExecTime(Integer execTime) {
this.execTime = execTime;
}
public String getExecState() {
return execState;
}
public void setExecState(String execState) {
this.execState = execState;
}
public String getExecResult() {
return execResult;
}
public void setExecResult(String execResult) {
this.execResult = execResult;
}
}

@ -1,60 +0,0 @@
package xyz.wbsite.frame.base;
import xyz.wbsite.frame.base.BaseRequest;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* LoginRequest -
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class LoginRequest extends BaseRequest {
@NotBlank(message = "[username]用户名不能为空")
private String username;
@NotBlank(message = "[password]用户密码不能为空")
private String password;
@NotNull(message = "[verifyCodeId]验证码ID不能为空")
private Long verifyCodeId;
@NotBlank(message = "[verifyCodeCode]验证码不能为空")
private String verifyCodeCode;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Long getVerifyCodeId() {
return verifyCodeId;
}
public void setVerifyCodeId(Long verifyCodeId) {
this.verifyCodeId = verifyCodeId;
}
public String getVerifyCodeCode() {
return verifyCodeCode;
}
public void setVerifyCodeCode(String verifyCodeCode) {
this.verifyCodeCode = verifyCodeCode;
}
}

@ -1,14 +0,0 @@
package xyz.wbsite.frame.base;
import xyz.wbsite.frame.base.BaseRequest;
/**
* LogoutRequest -
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class LogoutRequest extends BaseRequest {
}

@ -1,14 +0,0 @@
package xyz.wbsite.frame.base;
import xyz.wbsite.frame.base.BaseResponse;
/**
* LogoutResponse -
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class LogoutResponse extends BaseResponse {
}

@ -1,71 +0,0 @@
package xyz.wbsite.frame.base;
import java.io.Serializable;
public class SqlTaskEntity implements Serializable {
/**
* TASK_NAME -
*/
private String taskName;
/**
* TASK_NOTE -
*/
private String taskNote;
/**
* .
* Cron:Cron
* DelayRepeat:()
* FixRepeat:()
*/
private String taskType;
/**
* TYPE_VALUE -
*/
private String typeValue;
/**
* TASK_SQL - SQL
*/
private String taskSql;
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public String getTaskNote() {
return taskNote;
}
public void setTaskNote(String taskNote) {
this.taskNote = taskNote;
}
public String getTaskType() {
return taskType;
}
public void setTaskType(String taskType) {
this.taskType = taskType;
}
public String getTypeValue() {
return typeValue;
}
public void setTypeValue(String typeValue) {
this.typeValue = typeValue;
}
public String getTaskSql() {
return taskSql;
}
public void setTaskSql(String taskSql) {
this.taskSql = taskSql;
}
}

@ -1,55 +0,0 @@
package xyz.wbsite.frame.base;
import java.util.HashSet;
import java.util.Set;
public class UserEntity extends BaseEntity {
private String userName;
private String userAlias;
private String password;
private Set<String> resSet = new HashSet<>();
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserAlias() {
return userAlias;
}
public void setUserAlias(String userAlias) {
this.userAlias = userAlias;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Set<String> getResSet() {
return resSet;
}
public void setResSet(Set<String> resSet) {
this.resSet = resSet;
}
public void putRes(String resource) {
resSet.add(resource);
}
public void putRes(Set<String> resourceSet) {
this.resSet.addAll(resourceSet);
}
}

@ -1,14 +0,0 @@
package xyz.wbsite.frame.base;
import xyz.wbsite.frame.base.BaseRequest;
/**
* VerifyCodeRequest -
*
* @author wangbing
* @version 0.0.1
* @since 2020-12-24
*/
public class VerifyCodeRequest extends BaseRequest {
}

@ -1,39 +0,0 @@
package xyz.wbsite.frame.base;
import xyz.wbsite.frame.base.BaseResponse;
/**
* VerifyCodeResponse -
*
* @author wangbing
* @version 0.0.1
* @since 2020-12-24
*/
public class VerifyCodeResponse extends BaseResponse {
/**
* ID
*/
private Long verifyCodeId;
/**
* base64
*/
private String verifyCodeBase64;
public Long getVerifyCodeId() {
return verifyCodeId;
}
public void setVerifyCodeId(Long verifyCodeId) {
this.verifyCodeId = verifyCodeId;
}
public String getVerifyCodeBase64() {
return verifyCodeBase64;
}
public void setVerifyCodeBase64(String verifyCodeBase64) {
this.verifyCodeBase64 = verifyCodeBase64;
}
}

@ -1,76 +0,0 @@
package xyz.wbsite.frame.base;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class VisitorEntity implements Serializable {
/**
* APP_NAME -
*/
private String appName;
/**
* APP_NOTE -
*/
private String appNote;
/**
* APP_KEY -
*/
private String appKey;
/**
* APP_SECRET -
*/
private String appSecret;
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getAppNote() {
return appNote;
}
public void setAppNote(String appNote) {
this.appNote = appNote;
}
public String getAppKey() {
return appKey;
}
public void setAppKey(String appKey) {
this.appKey = appKey;
}
public String getAppSecret() {
return appSecret;
}
public void setAppSecret(String appSecret) {
this.appSecret = appSecret;
}
private Set<String> resSet = new HashSet<>();
public Set<String> getResSet() {
return resSet;
}
public void setResSet(Set<String> resSet) {
this.resSet = resSet;
}
public void putRes(String resource) {
resSet.add(resource);
}
public void putRes(Set<String> resourceSet) {
this.resSet.addAll(resourceSet);
}
}

@ -1,151 +0,0 @@
package xyz.wbsite.frame.excel;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.format.NumberFormat;
import xyz.wbsite.frame.base.BaseEntity;
import xyz.wbsite.frame.excel.annotation.ExcelNote;
import xyz.wbsite.frame.excel.annotation.ExcelSelect;
import xyz.wbsite.frame.excel.annotation.ExcelSheet;
import java.util.Date;
@ExcelSheet("应用接入")
public class DemoData extends BaseEntity {
@ExcelProperty({"字符列", "普通字符列"})
@ExcelNote("字符列描述")
private String str1;
@ExcelProperty({"字符列", "可选字符列"})
@ExcelSelect({"选项一", "选项二"})
@ExcelNote("可选字符列(选项一,选项二)")
private String str2;
@ExcelNote("无ExcelProperty默认为字段名称")
private String str3;//无ExcelProperty默认为字段名称
@ExcelIgnore
private String str4;//忽略的字段
@ExcelProperty("短整数列")
@ExcelNote("短整数列")
private short sint;
@ExcelProperty("整数列")
@ExcelNote("整数列")
private int mint;
@ExcelProperty("长整数列")
@ExcelNote("长整数列")
private long lint;
@ExcelProperty("双精度列")
@NumberFormat("#.##")
@ExcelNote("双精度列,格式化#.##")
private double dbn;
@ExcelProperty("单精度列")
@NumberFormat("#.##")
@ExcelNote("单精度列,格式化#.##")
private float fln;
@ExcelProperty("时间列")
@DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
@ExcelNote("时间列格式化yyyy年MM月dd日 HH时mm分ss秒")
private Date date;
@ExcelProperty("是否有效")
@ExcelSelect({"是", "否"})
@ExcelNote("布尔值(是, 否)")
private boolean valid;
public String getStr1() {
return str1;
}
public void setStr1(String str1) {
this.str1 = str1;
}
public String getStr2() {
return str2;
}
public void setStr2(String str2) {
this.str2 = str2;
}
public String getStr3() {
return str3;
}
public void setStr3(String str3) {
this.str3 = str3;
}
public String getStr4() {
return str4;
}
public void setStr4(String str4) {
this.str4 = str4;
}
public short getSint() {
return sint;
}
public void setSint(short sint) {
this.sint = sint;
}
public int getMint() {
return mint;
}
public void setMint(int mint) {
this.mint = mint;
}
public long getLint() {
return lint;
}
public void setLint(long lint) {
this.lint = lint;
}
public double getDbn() {
return dbn;
}
public void setDbn(double dbn) {
this.dbn = dbn;
}
public float getFln() {
return fln;
}
public void setFln(float fln) {
this.fln = fln;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public boolean isValid() {
return valid;
}
public void setValid(boolean valid) {
this.valid = valid;
}
}

@ -0,0 +1,47 @@
package xyz.wbsite.frame.excel;
import java.io.Serializable;
/**
* WCell - Excel
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class WCell implements Serializable {
/**
*
*/
private String value;
/**
* excel
*/
private String error;
public WCell() {
this.value = "";
}
public WCell(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
}

@ -0,0 +1,146 @@
package xyz.wbsite.frame.excel;
import xyz.wbsite.frame.excel.converter.Converter;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* WColumn - Excel()
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class WColumn implements Serializable {
/**
*
*/
private String name = "";
/**
*
*/
private int cellWidth = 8;
/**
*
*/
private boolean isRequired = false;
/**
*
*/
private String description = "";
/**
*
*/
private Converter converter;
/**
* Field
*/
private Field field;
/**
* set
*/
private Method setMethod;
/**
* get
*/
private Method getMethod;
/**
* ExcelType
*/
private int cellType = 1;
/**
*
*/
private String[] cellList;
public WColumn() {
this.name = "";
}
public WColumn(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Field getField() {
return field;
}
public void setField(Field field) {
this.field = field;
}
public int getCellWidth() {
return cellWidth;
}
public void setCellWidth(int cellWidth) {
this.cellWidth = cellWidth;
}
public boolean isRequired() {
return isRequired;
}
public void setRequired(boolean isRequired) {
this.isRequired = isRequired;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Converter getConverter() {
return converter;
}
public void setConverter(Converter converter) {
this.converter = converter;
}
public int getCellType() {
return cellType;
}
public void setCellType(int cellType) {
this.cellType = cellType;
}
public Method getSetMethod() {
return setMethod;
}
public void setSetMethod(Method setMethod) {
this.setMethod = setMethod;
}
public Method getGetMethod() {
return getMethod;
}
public void setGetMethod(Method getMethod) {
this.getMethod = getMethod;
}
public String[] getCellList() {
return cellList;
}
public void setCellList(String[] cellList) {
this.cellList = cellList;
}
}

@ -1,360 +1,681 @@
package xyz.wbsite.frame.excel;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import xyz.wbsite.frame.excel.annotation.ExcelNote;
import xyz.wbsite.frame.excel.annotation.ExcelSelect;
import xyz.wbsite.frame.excel.annotation.ExcelSheet;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFComment;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.ss.util.NumberToTextConverter;
import xyz.wbsite.frame.excel.annotation.ColumnDescription;
import xyz.wbsite.frame.excel.annotation.ColumnList;
import xyz.wbsite.frame.excel.annotation.ColumnName;
import xyz.wbsite.frame.excel.annotation.Convert;
import xyz.wbsite.frame.excel.annotation.Ignore;
import xyz.wbsite.frame.excel.annotation.ParentFirst;
import xyz.wbsite.frame.excel.annotation.SheetName;
import xyz.wbsite.frame.excel.converter.BooleanConverter;
import xyz.wbsite.frame.excel.converter.ByteConverter;
import xyz.wbsite.frame.excel.converter.CharacterConverter;
import xyz.wbsite.frame.excel.converter.Converter;
import xyz.wbsite.frame.excel.converter.DateConverter;
import xyz.wbsite.frame.excel.converter.DoubleConverter;
import xyz.wbsite.frame.excel.converter.FloatConverter;
import xyz.wbsite.frame.excel.converter.IntegerConverter;
import xyz.wbsite.frame.excel.converter.LongConverter;
import xyz.wbsite.frame.excel.converter.ShortConverter;
import xyz.wbsite.frame.excel.converter.StringConverter;
import xyz.wbsite.frame.excel.exception.ReadErrorException;
import xyz.wbsite.frame.excel.exception.TemplateNotMatchException;
import xyz.wbsite.frame.excel.handler.HeadWriteHandler;
import xyz.wbsite.frame.excel.handler.WCellWriteHandler;
import xyz.wbsite.frame.excel.handler.WRowWriteHandler;
import xyz.wbsite.frame.excel.handler.WSheetWriteHandler;
import xyz.wbsite.frame.excel.listener.WReadListener;
import xyz.wbsite.frame.excel.exception.ValueConverterException;
import xyz.wbsite.frame.excel.style.DataCellStyle;
import xyz.wbsite.frame.excel.style.ErrorCellStyle;
import xyz.wbsite.frame.excel.style.HeadCellStyle;
import xyz.wbsite.frame.excel.style.RedFont;
import xyz.wbsite.frame.excel.style.SuccessCellStyle;
import xyz.wbsite.frame.utils.ClassUtil;
import xyz.wbsite.frame.utils.FileUtil;
import xyz.wbsite.frame.utils.LogUtil;
import xyz.wbsite.frame.utils.ValidationUtil;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class WExcel<T> {
/**
* WExcel - Excel
*
*
* new WExcel<Dept>(Dept.class).loadData(depts).toFile(file);<br>
*
*
* byte[] bytes = FileUtil.readFileToByteArray(new File("E:\\E.xlsx"));<br>
* WExcel check = new WExcel<Dept>(Dept.class).loadData(bytes);
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class WExcel<T> implements Serializable, Cloneable {
/**
* 簿,{@link ExcelSelect}.
*
*/
private String name;
/**
*
*
*/
private Class<T> clazz;
private boolean freezeFirst;
/**
* {@link com.alibaba.excel.annotation.ExcelProperty}.
*
*/
private List<WHead> wHeads;
private Class<T> templateClass;
/**
*
*
*/
private List<T> data;
private List<WColumn> columnList = new ArrayList<>();
/**
* Map key:,String:
*
*/
private Map<Integer, List<String>> errMap;
private List<WRow> rowList = new ArrayList<>();
/**
* ,{@link WSheetWriteHandler#beforeSheetCreate}.
* <p>
* :styles[0]styles[1]
*
*/
private CellStyle[] styles = new CellStyle[2];
public WExcel(Class<T> tClass) {
this.templateClass = tClass;
initColumns(tClass);
}
/**
*
* DataTable
*
* @return WColumn
*/
public WExcel(Class<T> clazz) {
this.clazz = clazz;
this.wHeads = new ArrayList<>();
this.data = new ArrayList<>();
this.errMap = new LinkedHashMap<>();
private List<WColumn> initColumns(Class<?> clazz) {
//获取工作簿名称,没有则以类名为默认工作簿名称
if (clazz.isAnnotationPresent(ExcelSheet.class)) {
ExcelSheet ExcelSheet = clazz.getAnnotation(ExcelSheet.class);
this.name = ExcelSheet.value();
if (clazz.isAnnotationPresent(SheetName.class)) {
SheetName sheetName = clazz.getAnnotation(SheetName.class);
this.setName(sheetName.value());
this.setFreezeFirst(sheetName.freezeFirst());
} else {
this.name = clazz.getSimpleName();
this.setName(clazz.getSimpleName());
}
// 获取实体所有字段
Field[] fields = ClassUtil.getFields(clazz, true);
Map<String, Field> fieldMap = new HashMap<>();
//是否关注父类属性
boolean parentFirst = clazz.isAnnotationPresent(ParentFirst.class) && clazz.getAnnotation(ParentFirst.class).value();
Field[] fields = ClassUtil.getFields(clazz, parentFirst);
for (Field field : fields) {
fieldMap.put(field.getName(), field);
if (field.isAnnotationPresent(Ignore.class) && field.getAnnotation(Ignore.class).value()) {
continue;
}
WColumn WColumn = new WColumn();
WColumn.setField(field);
Map<String, WHead> wHeadMap = new LinkedHashMap<>();
// 获取导出Head
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
EasyExcel.write(outputStream)
.head(this.clazz)
.useDefaultStyle(false)
.registerConverter(new BooleanConverter())
.registerWriteHandler(new HeadWriteHandler() {
@Override
protected void handlerHead(Head head) {
WHead wHead = new WHead(head);
Field field = fieldMap.get(wHead.getHead().getFieldName());
// 获取HeadName
wHead.setName(head.getHeadNameList().get(head.getHeadNameList().size() - 1));
// 获取注释
if (field.isAnnotationPresent(ExcelNote.class)) {
wHead.setNote(field.getAnnotation(ExcelNote.class).value());
Method set = ClassUtil.setMethod(field.getName(), clazz, field.getType());
WColumn.setSetMethod(set);
Method get = ClassUtil.getMethod(field.getName(), clazz);
WColumn.setGetMethod(get);
//获取列名称
if (!field.isAnnotationPresent(ColumnName.class)) {
WColumn.setName(field.getName());
} else {
ColumnName columnColumnName = field.getAnnotation(ColumnName.class);
WColumn.setName(columnColumnName.value());
WColumn.setCellWidth(columnColumnName.width());
WColumn.setRequired(columnColumnName.required());
}
//获取列填写说明或描述
if (field.isAnnotationPresent(ColumnDescription.class)) {
WColumn.setDescription(field.getAnnotation(ColumnDescription.class).value());
}
//获取下拉列表
if (field.isAnnotationPresent(ExcelSelect.class)) {
wHead.setSelectList(field.getAnnotation(ExcelSelect.class).value());
if (field.isAnnotationPresent(ColumnList.class)) {
WColumn.setCellList(field.getAnnotation(ColumnList.class).value());
}
//获取列类型
if (field.isAnnotationPresent(Convert.class)) {
Convert converter = field.getAnnotation(Convert.class);
Class target = converter.target();
try {
WColumn.setConverter((Converter) target.newInstance());
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
} else {
if (field.getType() == boolean.class || field.getType() == Boolean.class) {
WColumn.setConverter(new BooleanConverter());
WColumn.setCellType(Cell.CELL_TYPE_BOOLEAN);
} else if (field.getType() == byte.class || field.getType() == Byte.class) {
WColumn.setConverter(new ByteConverter());
WColumn.setCellType(Cell.CELL_TYPE_NUMERIC);
} else if (field.getType() == char.class || field.getType() == Character.class) {
WColumn.setConverter(new CharacterConverter());
WColumn.setCellType(Cell.CELL_TYPE_STRING);
} else if (field.getType() == short.class || field.getType() == Short.class) {
WColumn.setConverter(new ShortConverter());
WColumn.setCellType(Cell.CELL_TYPE_NUMERIC);
} else if (field.getType() == int.class || field.getType() == Integer.class) {
WColumn.setConverter(new IntegerConverter());
WColumn.setCellType(Cell.CELL_TYPE_NUMERIC);
} else if (field.getType() == long.class || field.getType() == Long.class) {
WColumn.setConverter(new LongConverter());
WColumn.setCellType(Cell.CELL_TYPE_NUMERIC);
} else if (field.getType() == float.class || field.getType() == Float.class) {
WColumn.setConverter(new FloatConverter());
WColumn.setCellType(Cell.CELL_TYPE_NUMERIC);
} else if (field.getType() == double.class || field.getType() == Double.class) {
WColumn.setConverter(new DoubleConverter());
WColumn.setCellType(Cell.CELL_TYPE_NUMERIC);
} else if (field.getType() == Date.class) {
WColumn.setConverter(new DateConverter());
WColumn.setCellType(Cell.CELL_TYPE_NUMERIC);
} else if (field.getType() == String.class) {
WColumn.setConverter(new StringConverter());
WColumn.setCellType(Cell.CELL_TYPE_STRING);
} else {
throw new RuntimeException("Can not find Converter");
}
}
wHeadMap.put(head.getFieldName(), wHead);
columnList.add(WColumn);
}
})
.sheet(this.name).doWrite(Collections.EMPTY_LIST);
wHeads.addAll(wHeadMap.values());
return columnList;
}
/**
*
*
* @param os
* @return WExcel
*/
public WExcel addDatas(List<T> os) {
return addDatas(os, null);
public WExcel loadData(List<T> list) {
return loadData(list, null);
}
/**
*
* <br/>
*
*
* @param os
* @param processor
* @return WExcel
* @param list
*/
public WExcel addDatas(List<T> os, Processor<T> processor) {
for (T o : os) {
addData(o, processor);
public WExcel loadData(List<T> list, Processor<T> processor) {
if (list.size() > 0) {
for (T t : list) {
WRow row = new WRow();
for (WColumn column : columnList) {
if (column == null) {
continue;
}
Method method = column.getGetMethod();
try {
Object value = method.invoke(t);
if (null == value) {
row.put(column.getName(), new WCell());
} else {
String string = column.getConverter().string(value);
row.put(column.getName(), new WCell(string));
}
} catch (IllegalAccessException e) {
LogUtil.w("can not invoke get method!");
} catch (InvocationTargetException e) {
LogUtil.w(method.getName() + " unexpected exception!");
}
// <2层检查>检查模板注解验证是否通过
row.addErrors(ValidationUtil.validate(t));
// <3层检查>如果没有错误,则可以执行处理器进行业务处理
if (!row.hasError() && processor != null) {
List<String> exec = processor.exec(t);
row.addErrors(exec != null ? exec : Collections.EMPTY_LIST);
}
}
this.rowList.add(row);
}
}
return this;
}
/**
*
*
* @param o
* @return WExcel
*/
public WExcel addData(T o) {
return addData(o, null);
public WExcel loadData(File file) throws TemplateNotMatchException, ReadErrorException, IOException {
return loadData(FileUtil.readFileToByteArray(file), null);
}
/**
*
*
* @param o
* @param processor
* @return WExcel
*/
public WExcel addData(T o, Processor<T> processor) {
// 注解检查验证
List<String> validate = ValidationUtil.validate(o);
// 处理器执行
if ((validate == null || validate.isEmpty()) && processor != null) {
List<String> exec = processor.exec(o, this.data.size());
if (exec != null && exec.size() > 0) {
errMap.computeIfAbsent(data.size(), k -> new ArrayList<>());
List<String> errs = errMap.get(data.size());
errs.addAll(exec);
}
}
this.data.add(o);
return this;
public WExcel loadData(File file, Processor<T> processor) throws TemplateNotMatchException, ReadErrorException, IOException {
return loadData(FileUtil.readFileToByteArray(file), processor);
}
public WExcel loadData(byte[] bytes) throws TemplateNotMatchException, ReadErrorException {
return loadData(bytes, null);
}
/**
* @return
* Excel<br/>
* <br/>
*/
public List<T> getDatas() {
return this.data;
public WExcel loadData(byte[] bytes, Processor<T> processor) throws TemplateNotMatchException, ReadErrorException {
Workbook workbook = null;
InputStream is = null;
boolean flag;
try {
flag = true;
is = new ByteArrayInputStream(bytes); //读取文件流
workbook = new HSSFWorkbook(is);
} catch (Exception e) {
flag = false;
}
if (!flag) {
try {
flag = true;
is = new ByteArrayInputStream(bytes); //读取文件流
workbook = new XSSFWorkbook(is);
} catch (Exception e) {
flag = false;
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (!flag) {
throw new ReadErrorException("读取Excel文件错误");
}
//第一张Sheet表
Sheet sheet = workbook.getSheetAt(0);
//获取Sheet名称
if (templateClass.isAnnotationPresent(SheetName.class)) {//如果模板存在注解则使用注解名称
SheetName sheetName = templateClass.getAnnotation(SheetName.class);
this.setName(sheetName.value());
} else {//将类名设为表名如果类名不存在将Excel表名设为表名
this.setName(sheet.getSheetName());
}
//读取表头
Row headRow = sheet.getRow(0);
//获取Excel列的总数
int columnSum = headRow.getPhysicalNumberOfCells();
//检查列数量
if (columnList.size() != columnSum) {
throw new TemplateNotMatchException("与模板列数量不同。");
} else {
for (int i = 0; i < columnList.size(); i++) {
WColumn wColumn = columnList.get(i);
Cell cell = headRow.getCell(i);
String headValue = getValue(cell);
headValue = headValue.replace("*", "");
headValue = headValue.replace(" ", "");
if (!wColumn.getName().equals(headValue)) {
throw new TemplateNotMatchException("第" + (i + 1) + "项,不匹配的列名," + wColumn.getName() + "和" + headValue);
}
}
}
//Excel文件的总行数
int maxRowNumber = sheet.getLastRowNum();
// 逐行读取导入文件的数据
for (int i = 0; i < maxRowNumber; i++) {
//Excel中的一行数据第0行为表头所以要加1
Row inputRow = sheet.getRow(i + 1);
WRow row = new WRow();
rowList.add(row);
if (null != inputRow) {
for (int j = 0; j < columnList.size(); j++) {
WColumn wcolumn = columnList.get(j);
/* 取得当前格子的值 */
Cell excelCell = inputRow.getCell(j);
WCell WCell = new WCell();
row.put(wcolumn.getName(), WCell);
String value = "";
if (null != excelCell) {
value = getValue(excelCell);
}
value = value.trim();
WCell.setValue(value);
}
}
try {
T t = templateClass.newInstance();
// <1层检查>检查数据格式是否正确
row.addErrors(transferMap(row, t));
// <2层检查>检查模板注解验证是否通过
row.addErrors(ValidationUtil.validate(t));
// <3层检查>如果没有错误,则可以执行处理器进行业务处理
if (!row.hasError() && processor != null) {
List<String> exec = processor.exec(t);
row.addErrors(exec != null ? exec : Collections.EMPTY_LIST);
}
} catch (InstantiationException | IllegalAccessException e) {
row.addError("模板对象默认构造函数错误");
}
}
return this;
}
/**
* @return Excel
*
*
* @param row
* @param target
* @return
*/
public byte[] getBytes() {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
EasyExcel.write(outputStream)
.head(this.clazz)
.useDefaultStyle(false)
.registerConverter(new BooleanConverter())
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
.registerWriteHandler(new WSheetWriteHandler(wHeads, styles))
.registerWriteHandler(new WRowWriteHandler(wHeads, errMap))
.registerWriteHandler(new WCellWriteHandler(wHeads, styles, errMap))
.sheet(this.name).doWrite(data);
return outputStream.toByteArray();
public List<String> transferMap(WRow row, T target) {
List<String> err = new ArrayList<>();
for (String key : row.keySet()) {
for (WColumn column : columnList) {
String name = column.getName();
Method setMethod = column.getSetMethod();
if (key.equals(name)) {
WCell WCell = row.get(column.getName());
if (null != WCell) {
String value = WCell.getValue();
//获取转换器
Converter converter = column.getConverter();
try {
setMethod.invoke(target, converter.convert(value));
} catch (ValueConverterException e) {
e.printStackTrace();
err.add(e.getMessage());
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
err.add("[" + setMethod.getName() + "]执行错误");
}
}
break;
}
}
}
return err;
}
/**
* Excel
*
*
* @param file
* @return
*/
public void toFile(File file) {
byte[] aByte = getBytes();
FileUtil.writeBytesToFile(aByte, file);
public String getName() {
return name;
}
/**
* @param file
* @param processor
* @return WExcel
* @throws TemplateNotMatchException
* @throws IOException
*
*
* @param name
*/
public WExcel<T> read(File file, Processor<T> processor) throws TemplateNotMatchException, IOException {
ExcelTypeEnum et;
if (file.getName().endsWith(".xls")) {
et = ExcelTypeEnum.XLS;
} else if (file.getName().endsWith(".xlsx")) {
et = ExcelTypeEnum.XLSX;
} else {
throw new RuntimeException("The file is not an excel file!");
public void setName(String name) {
this.name = name;
}
byte[] bytes = FileUtil.readFileToByteArray(file);
return read(bytes, et, processor);
public boolean getFreezeFirst() {
return freezeFirst;
}
/**
* @param bytes
* @return WExcel
* @throws TemplateNotMatchException
* @throws IOException
*/
public WExcel<T> read(byte[] bytes) throws TemplateNotMatchException, IOException {
return read(bytes, ExcelTypeEnum.XLSX, null);
public void setFreezeFirst(boolean freezeFirst) {
this.freezeFirst = freezeFirst;
}
/**
* @param bytes
* @param processor
* @return WExcel
* @throws TemplateNotMatchException
* @throws IOException
*/
public WExcel<T> read(byte[] bytes, Processor<T> processor) throws TemplateNotMatchException, IOException {
return read(bytes, ExcelTypeEnum.XLSX, processor);
public final String toCSV() {
StringBuilder sb = new StringBuilder();
for (WColumn WColumn : this.columnList) {
if (WColumn != null) {
sb.append(WColumn.getName()).append(",");
}
}
sb.append("\n");
/**
* @param bytes
* @param et Excel
* @param processor
* @return WExcel
* @throws TemplateNotMatchException
* @throws IOException
*/
public WExcel<T> read(byte[] bytes, ExcelTypeEnum et, Processor<T> processor) throws TemplateNotMatchException, IOException {
ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
return read(stream, et, processor);
for (int i = 0; i < this.rowList.size(); i++) {
for (int j = 0; j < this.columnList.size(); j++) {
WColumn wColumn = this.columnList.get(j);
WCell wCell = this.rowList.get(i).get(wColumn.getName());
sb.append(wCell.getValue()).append(",");
}
sb.append("\n");
}
/**
* @param in
* @return WExcel
* @throws TemplateNotMatchException
* @throws IOException
*/
public WExcel<T> read(InputStream in) throws TemplateNotMatchException {
return read(in, ExcelTypeEnum.XLSX, null);
return sb.toString();
}
/**
* @param in
* @param processor
* @return WExcel
* @throws TemplateNotMatchException
* @throws IOException
* DataTable
*
* @return .
*/
public WExcel<T> read(InputStream in, Processor<T> processor) throws TemplateNotMatchException {
return read(in, ExcelTypeEnum.XLSX, processor);
public final boolean hasError() {
for (WRow wRow : rowList) {
if (wRow.hasError()) {
return true;
}
}
return false;
}
/**
* @param in
* @param processor
* @param et Excel
* @return WExcel
* @throws TemplateNotMatchException
* @throws IOException
*/
public WExcel<T> read(InputStream in, ExcelTypeEnum et, Processor<T> processor) throws TemplateNotMatchException {
final TemplateNotMatchException[] e = new TemplateNotMatchException[1];
// 读取Head 验证模板是否符合情况
EasyExcel.read(in)
.excelType(et)
.head(this.clazz)
.registerConverter(new BooleanConverter())
.registerReadListener(new WReadListener<T>(wHeads, e) {
@Override
public void onException(Exception exception, AnalysisContext context) throws Exception {
if (exception instanceof ExcelDataConvertException) {
ExcelDataConvertException convertException = (ExcelDataConvertException) exception;
errMap.computeIfAbsent(data.size(), k -> new ArrayList<>());
List<String> errs = errMap.get(data.size());
errs.add(convertException.getCause().getMessage());
public byte[] getBytes() {
XSSFWorkbook workbook = getExcel();
if (workbook != null) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
workbook.write(outputStream);
} catch (IOException e) {
return null;
}
return outputStream.toByteArray();
}
return null;
}
public XSSFWorkbook getExcel() {
XSSFWorkbook workbook = new XSSFWorkbook();
//创建一个Sheet表
XSSFSheet sheet = workbook.createSheet(name);
sheet.setDefaultRowHeightInPoints(18);
Row firstRow = sheet.createRow(0); // 下标为0的行开始
XSSFDrawing drawing = sheet.createDrawingPatriarch();
int offset = 0;
// 添加结果和错误说明列
if (hasError()) {
offset++;
{// 第一栏结果栏
Cell firstCell = firstRow.createCell(0);
firstCell.setCellStyle(new HeadCellStyle(workbook).getStyle());
firstCell.setCellValue(new XSSFRichTextString("执行结果"));
XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6);
XSSFComment comment = drawing.createCellComment(anchor);
comment.setString("此列为检查结果,导入时请处理完错误,并删除该列!");
firstCell.setCellComment(comment);
}
offset++;
{// 第二栏错误信息栏
Cell secondCell = firstRow.createCell(1);
secondCell.setCellStyle(new HeadCellStyle(workbook).getStyle());
secondCell.setCellValue(new XSSFRichTextString("结果说明"));
sheet.setColumnWidth(1, 18 * 256);
XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6);
XSSFComment comment = drawing.createCellComment(anchor);
comment.setString("此列为检查结果信息列,导入时请处理完错误,并删除该列!");
secondCell.setCellComment(comment);
}
}
for (int j = 0; j < this.columnList.size(); j++) {
WColumn column = this.columnList.get(j);
Cell firstCell = firstRow.createCell(j + offset);
String columnName = column.getName();
XSSFRichTextString textString;
if (column.isRequired()) {
textString = new XSSFRichTextString("*" + columnName);
textString.applyFont(0, 1, new RedFont(workbook).getFont());
textString.applyFont(1, textString.length(), workbook.createFont());
} else {
textString = new XSSFRichTextString(columnName);
textString.applyFont(workbook.createFont());
}
StringBuilder sb = new StringBuilder();
sb.append(column.getDescription()).append("\n");
// 如果填写了注释信息
if (sb.length() > 1) {
XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6);
XSSFComment comment = drawing.createCellComment(anchor);
comment.setString(sb.toString());
firstCell.setCellComment(comment);
}
firstCell.setCellValue(textString);
firstCell.setCellStyle(new HeadCellStyle(workbook).getStyle());
sheet.setColumnWidth(j + offset, (4 + column.getCellWidth()) * 256);
if (column.getCellList() != null){
CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, 65535, j+offset, j+offset);
DataValidationHelper helper = sheet.getDataValidationHelper();
DataValidationConstraint constraint = helper.createExplicitListConstraint(column.getCellList());
DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
//处理Excel兼容性问题
if (dataValidation instanceof XSSFDataValidation) {
dataValidation.setSuppressDropDownArrow(true);
dataValidation.setShowErrorBox(true);
} else {
super.onException(exception, context);
dataValidation.setSuppressDropDownArrow(false);
}
dataValidation.setEmptyCellAllowed(true);
dataValidation.setShowPromptBox(true);
dataValidation.createPromptBox("规则", "请选择下拉框里面的数据");
sheet.addValidationData(dataValidation);
}
}
@Override
public void invoke(T o) {
if (processor != null) {
List<String> exec = processor.exec(o, data.size());
if (exec != null && exec.size() > 0) {
errMap.computeIfAbsent(data.size(), k -> new ArrayList<>());
List<String> errs = errMap.get(data.size());
errs.addAll(exec);
// 冻结第一行
if (freezeFirst) {
sheet.createFreezePane(255, 1);
}
// 填充数据
for (int i = 0; i < this.rowList.size(); i++) {
WRow wRow = this.rowList.get(i);
Row row = sheet.createRow(i + 1);
if (offset > 0) {
if (this.rowList.get(i).hasError()) {
// 添加结果
List<String> errorList = wRow.getErrorList();
Cell resultCell = row.createCell(0);
resultCell.setCellStyle(new ErrorCellStyle(workbook).getStyle());
resultCell.setCellValue("错误");
// 添加错误信息详细说明
Cell errsCell = row.createCell(1);
errsCell.setCellStyle(new ErrorCellStyle(workbook).getStyle());
String join = String.join(";\n", errorList);
errsCell.setCellValue(new XSSFRichTextString(join));
} else {
// 添加结果
Cell resultCell = row.createCell(0);
resultCell.setCellStyle(new SuccessCellStyle(workbook).getStyle());
resultCell.setCellValue("成功");
// 添加错误信息详细说明
Cell errsCell = row.createCell(1);
errsCell.setCellStyle(new SuccessCellStyle(workbook).getStyle());
errsCell.setCellValue("");
}
data.add(o);
}
})
.sheet().doRead();
if (e[0] != null) {
throw e[0];
for (int j = 0; j < this.columnList.size(); j++) {
WColumn column = this.columnList.get(j);
Cell xssfCell = row.createCell(j + offset);
WCell WCell = this.rowList.get(i).get(column.getName());
if (null == WCell) {
continue;
}
return this;
String value = WCell.getValue();
xssfCell.setCellType(column.getCellType());
if (column.getCellType() == Cell.CELL_TYPE_NUMERIC || column.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
xssfCell.setCellStyle(new DataCellStyle(workbook, CellStyle.ALIGN_RIGHT, wRow.hasError()).getStyle());
} else {
xssfCell.setCellStyle(new DataCellStyle(workbook, CellStyle.ALIGN_LEFT, wRow.hasError()).getStyle());
}
public interface Processor<T> {
List<String> exec(T t, int index);
xssfCell.setCellValue(value);
}
}
return workbook;
}
/**
* @return
*
*
* @param cell
* @return
*/
public boolean hasError() {
return !errMap.isEmpty();
public static String getValue(Cell cell) {
if (cell == null) {
return "";
}
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
return cell.getStringCellValue();
case Cell.CELL_TYPE_BOOLEAN:
return String.valueOf(cell.getBooleanCellValue());
case Cell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date value = cell.getDateCellValue();
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(value);
} else {
return NumberToTextConverter.toText(cell.getNumericCellValue());
}
default:
return cell.getStringCellValue();
}
}
/**
* @return
*/
public String getName() {
return name;
public interface Processor<T> {
List<String> exec(T t);
}
public void toFile(File file) throws IOException {
File parentFile = file.getParentFile();
if (!parentFile.exists() && !parentFile.mkdirs()) {
throw new RuntimeException("路径创建失败");
}
if (!file.exists() && !file.createNewFile()) {
throw new RuntimeException("文件创建失败");
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(getBytes());
fileOutputStream.close();
}
}

@ -1,65 +0,0 @@
package xyz.wbsite.frame.excel;
import com.alibaba.excel.metadata.Head;
/**
* WHead - Excel()
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class WHead {
public WHead(Head head) {
this.head = head;
}
/**
*
*/
private Head head;
/**
*
*/
private String name = "";
/**
*
*/
private String note = "";
/**
*
*/
private String[] selectList;
public Head getHead() {
return head;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public String[] getSelectList() {
return selectList;
}
public void setSelectList(String[] selectList) {
this.selectList = selectList;
}
}

@ -0,0 +1,34 @@
package xyz.wbsite.frame.excel;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* WRow - ExcelWCell<br>HashMap<String, WCell>,keyvalue
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class WRow extends HashMap<String, WCell> implements Serializable {
private List<String> errorList = new ArrayList<>();
public final boolean hasError() {
return errorList.size() > 0;
}
public final void addError(String errorMsg) {
errorList.add(errorMsg);
}
public final void addErrors(List<String> errorMsgs) {
errorList.addAll(errorMsgs);
}
public List<String> getErrorList() {
return errorList;
}
}

@ -7,7 +7,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* ExcelNote - Excel
* ColumnDescription - Excel
*
* @author wangbing
* @version 0.0.1
@ -16,7 +16,7 @@ import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelNote {
public @interface ColumnDescription {
String value() default "";
}

@ -7,7 +7,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* ExcelSelect -
* ColumnList -
*
* @author wangbing
* @version 0.0.1
@ -16,7 +16,7 @@ import java.lang.annotation.Target;
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelSelect {
public @interface ColumnList {
/**
*

@ -0,0 +1,40 @@
package xyz.wbsite.frame.excel.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* ColumnName - ExcelExcel使
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ColumnName {
/**
*
*/
String value();
/**
*
*/
int width() default 8;
/**
* *
*/
boolean required() default false;
/**
*
*/
String dateFormat() default "yyyy-MM-dd";
}

@ -7,13 +7,15 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Converter - Excel
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
@Target({ElementType.TYPE})
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelSheet {
String value();
public @interface Convert {
Class target();
}

@ -0,0 +1,21 @@
package xyz.wbsite.frame.excel.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Ignore - Excel
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Ignore {
boolean value() default true;
}

@ -0,0 +1,21 @@
package xyz.wbsite.frame.excel.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* ParentFirst -
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ParentFirst {
boolean value() default true;
}

@ -0,0 +1,23 @@
package xyz.wbsite.frame.excel.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* SheetName - Excel使Class
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SheetName {
String value();
boolean freezeFirst() default false;
}

@ -1,23 +1,24 @@
package xyz.wbsite.frame.excel.converter;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import xyz.wbsite.frame.excel.exception.ValueConverterException;
/**
* BooleanConverter - BooleanStringString
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class BooleanConverter implements Converter<Boolean> {
public Class supportJavaTypeKey() {
return Boolean.class;
@Override
public Boolean convert(String var) throws ValueConverterException {
if (null == var || "".equals(var)) {
return false;
}
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
String lowerCase = var.toLowerCase();
public Boolean convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
String lowerCase = cellData.getStringValue().toLowerCase();
if (lowerCase.matches("y|n")) {
return "y".equals(lowerCase);
} else if (lowerCase.matches("yes|no")) {
@ -31,14 +32,15 @@ public class BooleanConverter implements Converter<Boolean> {
} else if (lowerCase.matches("是|不是")) {
return "是".equals(lowerCase);
} else {
throw new RuntimeException("[" + cellData.getStringValue() + "] 值有错误!");
throw new ValueConverterException("[" + var + "] can not convert to Boolean");
}
}
public CellData convertToExcelData(Boolean value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
if (value == null) {
return new CellData("");
@Override
public String string(Boolean var) {
if (var == null) {
return "";
}
return new CellData(value ? "是" : "否");
return var ? "是" : "否";
}
}

@ -0,0 +1,28 @@
package xyz.wbsite.frame.excel.converter;
/**
* ByteConverter - ByteStringString
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class ByteConverter implements Converter<Byte> {
@Override
public Byte convert(String var) {
try {
return Byte.parseByte(var);
} catch (Exception e) {
return 0;
}
}
@Override
public String string(Byte var) {
if (var == null) {
return "";
}
return String.valueOf(var);
}
}

@ -0,0 +1,28 @@
package xyz.wbsite.frame.excel.converter;
/**
* CharacterConverter - CharacterStringString
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class CharacterConverter implements Converter<Character> {
@Override
public Character convert(String var) {
if (var == null || var.equals("")) {
return '0';
} else {
return var.charAt(0);
}
}
@Override
public String string(Character var) {
if (var == null) {
return "";
}
return String.valueOf(var).trim();
}
}

@ -0,0 +1,17 @@
package xyz.wbsite.frame.excel.converter;
import xyz.wbsite.frame.excel.exception.ValueConverterException;
/**
* Converter -
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public interface Converter<T> {
T convert(String var) throws ValueConverterException;
String string(T var);
}

@ -0,0 +1,51 @@
package xyz.wbsite.frame.excel.converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* DateConverter - DateStringString
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class DateConverter implements Converter<Date> {
@Override
public Date convert(String var) {
if (var == null) {
return null;
}
Date date = null;
try {
var = var.trim();
if (var.matches("[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(var);
} else if (var.matches("[0-9]{4}/[0-9]{1,2}/[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(var);
} else if (var.matches("[0-9]{4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = sdf.parse(var);
} else if (var.matches("[0-9]{4}年[0-9]{1,2}月[0-9]{1,2}日 [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
date = sdf.parse(var);
}
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
@Override
public String string(Date var) {
if (var == null) {
return "";
}
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(var);
}
}

@ -0,0 +1,28 @@
package xyz.wbsite.frame.excel.converter;
/**
* DoubleConverter - DoubleStringString
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class DoubleConverter implements Converter<Double> {
@Override
public Double convert(String var) {
try {
return Double.parseDouble(var);
} catch (Exception e) {
return 0d;
}
}
@Override
public String string(Double var) {
if (var == null) {
return "";
}
return String.valueOf(var);
}
}

@ -0,0 +1,33 @@
package xyz.wbsite.frame.excel.converter;
/**
* FloatConverter - FloatStringString
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class FloatConverter implements Converter<Float> {
@Override
public Float convert(String var) {
try {
//增加对1.0一类的的优化显示
if (var.matches("(\\d+)\\.0")) {
var = var.replaceAll("\\.0$", "");
}
return Float.parseFloat(var);
} catch (Exception e) {
return 0f;
}
}
@Override
public String string(Float var) {
if (var == null) {
return "";
}
return String.valueOf(var);
}
}

@ -0,0 +1,28 @@
package xyz.wbsite.frame.excel.converter;
/**
* IntegerConverter - IntegerStringString
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class IntegerConverter implements Converter<Integer> {
@Override
public Integer convert(String var) {
try {
return Integer.parseInt(var);
} catch (Exception e) {
return 0;
}
}
@Override
public String string(Integer var) {
if (var == null) {
return "";
}
return String.valueOf(var);
}
}

@ -0,0 +1,40 @@
package xyz.wbsite.frame.excel.converter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* LongConverter - LongStringString
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class LongConverter implements Converter<Long> {
@Override
public Long convert(String var) {
try {
//增加对1.0一类的的兼容性
if (var.matches("(\\d+)\\.(\\d*)")) {
Pattern compile = Pattern.compile("(\\d+)\\.(\\d*)");
Matcher matcher = compile.matcher(var);
if (matcher.find()) {
var = matcher.group(1);
}
}
return Long.parseLong(var);
} catch (Exception e) {
return 0L;
}
}
@Override
public String string(Long var) {
if (var == null) {
return "";
}
return String.valueOf(var);
}
}

@ -0,0 +1,28 @@
package xyz.wbsite.frame.excel.converter;
/**
* ShortConverter - ShortStringString
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class ShortConverter implements Converter<Short> {
@Override
public Short convert(String var) {
try {
return Short.parseShort(var);
} catch (Exception e) {
return 0;
}
}
@Override
public String string(Short var) {
if (var == null) {
return "";
}
return String.valueOf(var);
}
}

@ -0,0 +1,24 @@
package xyz.wbsite.frame.excel.converter;
/**
* StringConverter - StringStringString
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class StringConverter implements Converter<String> {
@Override
public String convert(String var) {
return var != null ? var.trim() : null;
}
@Override
public String string(String var) {
if (var == null) {
return "";
}
return String.valueOf(var);
}
}

@ -0,0 +1,17 @@
package xyz.wbsite.frame.excel.exception;
/**
* Excel
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class ReadErrorException extends Exception {
public ReadErrorException() {
}
public ReadErrorException(String s) {
super(s);
}
}

@ -0,0 +1,15 @@
package xyz.wbsite.frame.excel.exception;
/**
*
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class ValueConverterException extends Exception {
public ValueConverterException(String s) {
super(s);
}
}

@ -1,24 +0,0 @@
package xyz.wbsite.frame.excel.handler;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.AbstractCellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.Cell;
import java.util.List;
public abstract class HeadWriteHandler extends AbstractCellWriteHandler {
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
super.afterCellDispose(writeSheetHolder, writeTableHolder, cellDataList, cell, head, relativeRowIndex, isHead);
if (isHead) {
handlerHead(head);
}
}
protected abstract void handlerHead(Head head);
}

@ -1,50 +0,0 @@
package xyz.wbsite.frame.excel.handler;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import xyz.wbsite.frame.excel.WHead;
import java.util.List;
import java.util.Map;
public class WCellWriteHandler implements CellWriteHandler {
private CellStyle[] styles;
private Map<Integer, List<String>> errMap;
public WCellWriteHandler(List<WHead> wHeads, CellStyle[] styles, Map<Integer, List<String>> errMap) {
this.styles = styles;
this.errMap = errMap;
}
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean isHead) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean isHead) {
}
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean isHead) {
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer rowIndex, Boolean isHead) {
if (isHead) {
cell.setCellStyle(styles[0]);
} else if (errMap.get(rowIndex) != null) {
cell.setCellStyle(styles[1]);
}
}
}

@ -1,87 +0,0 @@
package xyz.wbsite.frame.excel.handler;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import xyz.wbsite.frame.excel.WHead;
import xyz.wbsite.frame.utils.StringUtil;
import java.util.List;
import java.util.Map;
public class WRowWriteHandler implements RowWriteHandler {
private List<WHead> wHeads;
private Map<Integer, List<String>> errMap;
public WRowWriteHandler(List<WHead> wHeads, Map<Integer, List<String>> errMap) {
this.wHeads = wHeads;
this.errMap = errMap;
}
@Override
public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer integer, Integer integer1, Boolean isHead) {
}
@Override
public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean isHead) {
}
@Override
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer rowIndex, Boolean isHead) {
if (isHead && getHeadMaxRow() == rowIndex) {
for (int i = 0; i < wHeads.size(); i++) {
WHead wHead = wHeads.get(i);
if (StringUtil.isNotEmpty(wHead.getNote())) {
Drawing<?> drawingPatriarch = writeSheetHolder.getSheet().createDrawingPatriarch();
// 创建一个批注
int headRow = getHeadRow(wHead.getHead());
Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) i, headRow, (short) i + 1, headRow + 3));
// 输入批注信息
comment.setString(new XSSFRichTextString(wHead.getNote()));
// 将批注添加到标题对象中
writeSheetHolder.getSheet().getRow(headRow).getCell(i).setCellComment(comment);
}
}
}
if (!isHead && errMap.get(rowIndex) != null) {
Cell cell = row.createCell(wHeads.size());
cell.getCellStyle().setWrapText(true);
List<String> errs = errMap.get(rowIndex);
cell.setCellValue(String.join("\r\n", errs));
}
}
public int getHeadMaxRow() {
int r = 0;
for (WHead wHead : wHeads) {
if (wHead.getHead().getHeadNameList().size() - 1 > r) r = wHead.getHead().getHeadNameList().size() - 1;
}
return r;
}
public int getHeadRow(Head head) {
List<String> nameList = head.getHeadNameList();
if (nameList.size() == 1) {
return 0;
}
int r = nameList.size() - 1;
String last = nameList.get(r);
for (int i = nameList.size() - 2; i >= 0; i--) {
String s = nameList.get(i);
if (s.equals(last)) {
r--;
}
}
return r;
}
}

@ -1,68 +0,0 @@
package xyz.wbsite.frame.excel.handler;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.util.CellRangeAddressList;
import xyz.wbsite.frame.excel.WHead;
import java.util.List;
public class WSheetWriteHandler implements SheetWriteHandler {
private List<WHead> wHeads;
private CellStyle[] styles;
public WSheetWriteHandler(List<WHead> wHeads, CellStyle[] styles) {
this.wHeads = wHeads;
this.styles = styles;
}
@Override
public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
{
styles[1] = writeWorkbookHolder.getWorkbook().createCellStyle();
styles[1].setFillForegroundColor(IndexedColors.RED.getIndex());
styles[1].setFillPattern(FillPatternType.SOLID_FOREGROUND);
}
{
styles[0] = writeWorkbookHolder.getWorkbook().createCellStyle();
styles[0].setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
styles[0].setFillPattern(FillPatternType.SOLID_FOREGROUND);
styles[0].setBorderBottom(BorderStyle.THIN);
styles[0].setBorderLeft(BorderStyle.THIN);
styles[0].setBorderRight(BorderStyle.THIN);
styles[0].setBorderTop(BorderStyle.THIN);
styles[0].setAlignment(HorizontalAlignment.CENTER);
Font font = writeWorkbookHolder.getWorkbook().createFont();
font.setColor(IndexedColors.BLACK.getIndex());
font.setFontHeightInPoints((short) 12);
font.setBold(true);
styles[0].setFont(font);
}
}
@Override
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
for (int i = 0; i < wHeads.size(); i++) {
WHead col = wHeads.get(i);
if (col.getSelectList() != null && col.getSelectList().length > 0) {
CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(0, 500, i, i);
DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper();
DataValidationConstraint constraint = helper.createExplicitListConstraint(col.getSelectList());
DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
writeSheetHolder.getSheet().addValidationData(dataValidation);
}
}
}
}

@ -1,64 +0,0 @@
package xyz.wbsite.frame.excel.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import xyz.wbsite.frame.excel.WHead;
import xyz.wbsite.frame.excel.exception.TemplateNotMatchException;
import java.util.List;
import java.util.Map;
public abstract class WReadListener<T> extends AnalysisEventListener<T> {
private List<WHead> wHeads;
private TemplateNotMatchException[] es;
private boolean isHead;
public WReadListener(List<WHead> wHeads, TemplateNotMatchException[] es) {
this.wHeads = wHeads;
this.es = es;
this.isHead = true;
}
@Override
public void invokeHeadMap(Map headMap, AnalysisContext context) {
if (wHeads.size() != headMap.size()) {
es[0] = new TemplateNotMatchException("文件列数量与模板不一致!");
return;
}
es[0] = null;
for (int i = 0; i < wHeads.size(); i++) {
WHead wCol = wHeads.get(i);
String cellValue = headMap.get(i).toString();
if (!wCol.getName().equals(cellValue)) {
es[0] = new TemplateNotMatchException(String.format("第 %d 列应为[ %s ]", i + 1, wCol.getName()));
break;
}
}
}
@Override
public void invoke(T o, AnalysisContext analysisContext) {
isHead = false;
invoke(o);
}
public abstract void invoke(T o);
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
@Override
public boolean hasNext(AnalysisContext context) {
// 请求head
if (isHead) {//多级表头,头部未结束
return true;
}
if (!isHead && es[0] == null) {
return true;
}
return false;
}
}

@ -0,0 +1,57 @@
package xyz.wbsite.frame.excel.style;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Workbook;
/**
* Created on 2015/1/29.
*
* @author
* @since 2.0.0
*/
public class BaseCellStyle {
/**
*
*/
protected CellStyle style;
public BaseCellStyle(Workbook workbook) {
style = workbook.createCellStyle();
style.setFillPattern(CellStyle.NO_FILL);
//下边框
style.setBorderBottom(CellStyle.SOLID_FOREGROUND);
//下边框颜色
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
//左边框
style.setBorderLeft(CellStyle.SOLID_FOREGROUND);
//左边框颜色
style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
//右边框
style.setBorderRight(CellStyle.SOLID_FOREGROUND);
//右边框颜色
style.setRightBorderColor(IndexedColors.BLACK.getIndex());
//上边框
style.setBorderTop(CellStyle.SOLID_FOREGROUND);
//上边框颜色
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); //上下居中
style.setBorderBottom(CellStyle.SOLID_FOREGROUND); //下边框
style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); //下边框颜色
style.setBorderLeft(CellStyle.SOLID_FOREGROUND); //左边框
style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); //左边框颜色
style.setBorderRight(CellStyle.SOLID_FOREGROUND); //右边框
style.setRightBorderColor(IndexedColors.BLACK.getIndex()); //右边框颜色
style.setBorderTop(CellStyle.SOLID_FOREGROUND); //上边框
style.setTopBorderColor(IndexedColors.BLACK.getIndex()); //上边框颜色
}
public CellStyle getStyle() {
return style;
}
public void setStyle(CellStyle style) {
this.style = style;
}
}

@ -0,0 +1,29 @@
package xyz.wbsite.frame.excel.style;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Workbook;
/**
* Created on 2015/1/29.
*
* @author
* @since 2.0.0
*/
public class BaseFont {
/**
*
*/
protected Font font;
public BaseFont(Workbook workbook) {
font = workbook.createFont();
}
public Font getFont() {
return font;
}
public void setFont(Font font) {
this.font = font;
}
}

@ -0,0 +1,29 @@
package xyz.wbsite.frame.excel.style;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Workbook;
public class DataCellStyle extends BaseCellStyle {
public DataCellStyle(Workbook workbook, short align, boolean error) {
super(workbook);
style.setAlignment(align);
if (error) {
style.setFillForegroundColor(HSSFColor.RED.index); //背景颜色红色
style.setFillPattern(CellStyle.SOLID_FOREGROUND); //设置单元格填充样式
}
}
public DataCellStyle(Workbook workbook, short align) {
this(workbook, align, false);
}
public DataCellStyle(Workbook workbook, boolean error) {
this(workbook, CellStyle.ALIGN_LEFT, error);
}
public DataCellStyle(Workbook workbook) {
this(workbook, CellStyle.ALIGN_LEFT, false);
}
}

@ -0,0 +1,22 @@
package xyz.wbsite.frame.excel.style;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Workbook;
public class ErrorCellStyle extends BaseCellStyle {
public ErrorCellStyle(Workbook workbook) {
super(workbook);
style.setFillForegroundColor(HSSFColor.RED.index); //背景颜色红色
style.setFillPattern(CellStyle.SOLID_FOREGROUND); //设置单元格填充样式
}
public CellStyle getStyle() {
return style;
}
public void setStyle(CellStyle style) {
this.style = style;
}
}

@ -0,0 +1,15 @@
package xyz.wbsite.frame.excel.style;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Workbook;
public class HeadCellStyle extends BaseCellStyle {
public HeadCellStyle(Workbook workbook) {
super(workbook);
style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index); //背景颜色-灰色
style.setFillPattern(CellStyle.SOLID_FOREGROUND); // 设置单元格填充样式
style.setAlignment(CellStyle.ALIGN_CENTER); // 居中
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//上下居中
}
}

@ -0,0 +1,18 @@
package xyz.wbsite.frame.excel.style;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Workbook;
/**
* .
* Created on 2015/1/29.
*
* @author
* @since 2.0.0
*/
public class NormalFont extends BaseFont {
public NormalFont(Workbook workbook) {
super(workbook);
font.setColor(HSSFColor.BLACK.index); //字体颜色-黑色
}
}

@ -0,0 +1,18 @@
package xyz.wbsite.frame.excel.style;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Workbook;
/**
* .
* Created on 2015/1/29.
*
* @author
* @since 2.0.0
*/
public class RedFont extends BaseFont {
public RedFont(Workbook workbook) {
super(workbook);
font.setColor(HSSFColor.RED.index); //字体颜色-黑色
}
}

@ -0,0 +1,22 @@
package xyz.wbsite.frame.excel.style;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Workbook;
public class SuccessCellStyle extends BaseCellStyle {
public SuccessCellStyle(Workbook workbook) {
super(workbook);
style.setFillForegroundColor(HSSFColor.GREEN.index); //背景颜色红色
style.setFillPattern(CellStyle.SOLID_FOREGROUND); //设置单元格填充样式
}
public CellStyle getStyle() {
return style;
}
public void setStyle(CellStyle style) {
this.style = style;
}
}

@ -1,46 +0,0 @@
package xyz.wbsite.frame.listener;
import xyz.wbsite.frame.base.LocalData;
import java.util.Map;
public class FrameListener {
private static FrameListener ourInstance = new FrameListener();
public static FrameListener getInstance() {
return ourInstance;
}
private FrameListener() {
}
public void onRes(String res) {
Map<String, IResListener> beansOfType = LocalData.getApplicationContext().getBeansOfType(IResListener.class);
for (IResListener resListener : beansOfType.values()) {
resListener.onRes(res);
}
}
public void onError(Throwable throwable) {
Map<String, IErrorListener> beansOfType = LocalData.getApplicationContext().getBeansOfType(IErrorListener.class);
for (IErrorListener errorListener : beansOfType.values()) {
errorListener.error(throwable);
}
}
public void onError(String message) {
onError(new RuntimeException(message));
}
public void onTaskError(Throwable error) {
Map<String, IErrorListener> beansOfType = LocalData.getApplicationContext().getBeansOfType(IErrorListener.class);
for (IErrorListener errorListener : beansOfType.values()) {
errorListener.error(error);
}
}
public void onTaskError(String message) {
onTaskError(new RuntimeException(message));
}
}

@ -1,9 +0,0 @@
package xyz.wbsite.frame.listener;
/**
*
*/
public interface IErrorListener {
void error(Throwable error);
}

@ -1,9 +0,0 @@
package xyz.wbsite.frame.listener;
/**
*
*/
public interface IResListener {
void onRes(String res);
}

@ -1,9 +0,0 @@
package xyz.wbsite.frame.listener;
/**
*
*/
public interface ITaskErrorListener {
void error(Throwable error);
}

@ -1,15 +0,0 @@
package xyz.wbsite.frame.provider;
import xyz.wbsite.frame.base.DictEntity;
import javax.validation.constraints.NotNull;
import java.util.List;
public interface DictProvider {
List<DictEntity> getDict(@NotNull String dictName);
boolean isExist(@NotNull String dictName);
boolean isExistValue(@NotNull String dictName, @NotNull String dictKey);
}

@ -1,74 +0,0 @@
package xyz.wbsite.frame.provider;
import xyz.wbsite.frame.base.LocalData;
import java.util.Iterator;
import java.util.Map;
public class FrameProvider {
private static FrameProvider ourInstance = new FrameProvider();
public static FrameProvider getInstance() {
return ourInstance;
}
private FrameProvider() {
}
public UserProvider getUserProvider() {
Map<String, UserProvider> beansOfType = LocalData.getApplicationContext().getBeansOfType(UserProvider.class);
if (beansOfType.size() == 0) {
return null;
}
Iterator<String> iterator = beansOfType.keySet().iterator();
String name = iterator.next();
while (iterator.hasNext()) {
String next = iterator.next();
name = !"simpleUserProvider".equals(next) ? next : name;
}
return beansOfType.get(name);
}
public TokenProvider getTokenProvider() {
Map<String, TokenProvider> beansOfType = LocalData.getApplicationContext().getBeansOfType(TokenProvider.class);
if (beansOfType.size() == 0) {
return null;
}
Iterator<String> iterator = beansOfType.keySet().iterator();
String name = iterator.next();
while (iterator.hasNext()) {
String next = iterator.next();
name = !"simpleTokenProvider".equals(next) ? next : name;
}
return beansOfType.get(name);
}
public ProfileProvider getProfileProvider() {
Map<String, ProfileProvider> beansOfType = LocalData.getApplicationContext().getBeansOfType(ProfileProvider.class);
if (beansOfType.size() == 0) {
return null;
}
Iterator<String> iterator = beansOfType.keySet().iterator();
String name = iterator.next();
while (iterator.hasNext()) {
String next = iterator.next();
name = !"simpleProfileProvider".equals(next) ? next : name;
}
return beansOfType.get(name);
}
public DictProvider getDictProvider() {
Map<String, DictProvider> beansOfType = LocalData.getApplicationContext().getBeansOfType(DictProvider.class);
if (beansOfType.size() == 0) {
return null;
}
Iterator<String> iterator = beansOfType.keySet().iterator();
String name = iterator.next();
while (iterator.hasNext()) {
String next = iterator.next();
name = !"simpleDictProvider".equals(next) ? next : name;
}
return beansOfType.get(name);
}
}

@ -1,7 +0,0 @@
package xyz.wbsite.frame.provider;
import xyz.wbsite.frame.base.LogTaskEntity;
public interface LogTaskCollector {
void collector(LogTaskEntity entity);
}

@ -1,40 +0,0 @@
package xyz.wbsite.frame.provider;
public interface ProfileProvider {
/**
*
*
* @param key
* @param defaultValue
* @return
*/
String getString(String key, String defaultValue);
/**
*
*
* @param key
* @param defaultValue
* @return
*/
int getInt(String key, int defaultValue);
/**
*
*
* @param key
* @param defaultValue
* @return
*/
long getLong(String key, long defaultValue);
/**
*
*
* @param key
* @param defaultValue
* @return
*/
boolean getBoolean(String key, boolean defaultValue);
}

@ -1,51 +0,0 @@
package xyz.wbsite.frame.provider;
import xyz.wbsite.frame.base.LocalData;
import xyz.wbsite.frame.utils.StringUtil;
public class SimpleProfileProvider implements ProfileProvider {
@Override
public String getString(String key, String defaultValue) {
return LocalData.getProperty(key, defaultValue);
}
@Override
public int getInt(String key, int defaultValue) {
String string = getString(key, String.valueOf(defaultValue));
if (!StringUtil.isEmpty(string)) {
try {
return Integer.parseInt(string);
} catch (Exception ignored) {
}
}
return defaultValue;
}
@Override
public long getLong(String key, long defaultValue) {
String string = this.getString(key, String.valueOf(defaultValue));
if (!StringUtil.isEmpty(string)) {
try {
return Long.parseLong(string);
} catch (Exception ignored) {
}
}
return defaultValue;
}
@Override
public boolean getBoolean(String key, boolean defaultValue) {
String string = this.getString(key, String.valueOf(defaultValue));
if (!StringUtil.isEmpty(string)) {
try {
return Boolean.parseBoolean(string);
} catch (Exception ignored) {
}
}
return defaultValue;
}
}

@ -1,38 +0,0 @@
package xyz.wbsite.frame.provider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import xyz.wbsite.config.CacheConfig;
import xyz.wbsite.frame.base.Token;
import xyz.wbsite.frame.base.UserEntity;
import xyz.wbsite.frame.utils.IDgenerator;
import javax.validation.constraints.NotNull;
@Component
public class SimpleTokenProvider implements TokenProvider {
@Autowired
private CacheConfig cacheConfig;
public Token build(@NotNull UserEntity userEntity) {
Token token = new Token();
token.setId(IDgenerator.nextId());
token.setUserId(userEntity.getId());
token.setToken(IDgenerator.nextUUID());
token.setUserName(userEntity.getUserName());
token.setUserAlias(userEntity.getUserAlias());
token.putRes(userEntity.getResSet());
cacheConfig.put(token.getToken(), token, 3 * 60 * 60 * 1000);
return token;
}
public Token build(@NotNull String token) {
// 检索缓存Token
Object o = cacheConfig.get(token);
if (o != null && o instanceof Token) {
return (Token) o;
}
return null;
}
}

@ -1,23 +0,0 @@
package xyz.wbsite.frame.provider;
import org.springframework.stereotype.Component;
import xyz.wbsite.frame.base.LocalData;
import xyz.wbsite.frame.base.UserEntity;
@Component
public class SimpleUserProvider implements UserProvider {
public UserEntity getUser(String username) {
String admin = LocalData.getProperty("web.url.auth.admin", "");
if (!username.equals(admin)) {
return null;
}
UserEntity userEntity = new UserEntity();
userEntity.setId(0L);
userEntity.setUserName(username);
userEntity.setUserAlias("超级管理员");
userEntity.setPassword(LocalData.getProperty("web.url.auth.pwd", ""));
userEntity.putRes(".*");
return userEntity;
}
}

@ -1,9 +0,0 @@
package xyz.wbsite.frame.provider;
import xyz.wbsite.frame.base.SqlTaskEntity;
import java.util.List;
public interface SqlTaskProvider {
List<SqlTaskEntity> getSqlTask();
}

@ -1,13 +0,0 @@
package xyz.wbsite.frame.provider;
import xyz.wbsite.frame.base.Token;
import xyz.wbsite.frame.base.UserEntity;
import javax.validation.constraints.NotNull;
public interface TokenProvider {
Token build(@NotNull UserEntity userEntity);
Token build(@NotNull String token);
}

@ -1,8 +0,0 @@
package xyz.wbsite.frame.provider;
import xyz.wbsite.frame.base.UserEntity;
public interface UserProvider {
UserEntity getUser(String username);
}

@ -1,8 +0,0 @@
package xyz.wbsite.frame.provider;
import xyz.wbsite.frame.base.VisitorEntity;
public interface VisitorProvider {
VisitorEntity getVisitor(String appKey);
}

@ -6,16 +6,9 @@ import org.springframework.util.Assert;
import java.util.concurrent.ScheduledFuture;
/**
* Cron
*
* @author wangbing
* @version 0.0.1
* @since 2020-01-01
*/
public abstract class RunCronTask extends RunTask {
public abstract String cron();
abstract String cron();
@Override
public ScheduledFuture<?> schedule(ThreadPoolTaskScheduler poolTaskScheduler) {

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save

Powered by TurnKey Linux.