🔖 🔖 🔖 Releasing / Version tags. v4.4 mojito

🔖 🔖 🔖 Releasing / Version tags. v4.4 mojito

🔖 🔖 🔖 Releasing / Version tags. v4.4 mojito
This commit is contained in:
lbw committed 2022-05-15 20:44:42 +08:00
1 parent 0ae9122740
commit 60c9844062
426 files changed
+59294 -678

No files matched your search

+2 -9
View File
@@ -367,6 +367,7 @@ INSERT INTO `sys_menu` VALUES (1400, '部门管理', NULL, '/admin/dept/index',
INSERT INTO `sys_menu` VALUES (1401, '部门新增', 'sys_dept_add', NULL, 1400, NULL, 1, '0', '1', ' ', '2018-01-20 14:56:16', ' ', '2021-05-25 03:12:55', '0', 1);
INSERT INTO `sys_menu` VALUES (1402, '部门修改', 'sys_dept_edit', NULL, 1400, NULL, 1, '0', '1', ' ', '2018-01-20 14:56:59', ' ', '2021-05-25 03:12:55', '0', 1);
INSERT INTO `sys_menu` VALUES (1403, '部门删除', 'sys_dept_del', NULL, 1400, NULL, 1, '0', '1', ' ', '2018-01-20 14:57:28', ' ', '2021-05-25 03:12:55', '0', 1);
INSERT INTO `sys_menu` VALUES (1404, '开放互联', 'sys_connect_sync', NULL, 1400, NULL, 1, '0', '1', ' ', '2018-01-20 14:57:28', ' ', '2021-05-25 03:12:55', '0', 1);
INSERT INTO `sys_menu` VALUES (1500, '租户管理', '', '/admin/tenant/index', 1000, 'icon-erji-zuhushouye', 5, '0', '0', ' ', '2018-01-20 13:17:19', ' ', '2022-01-27 11:59:14', '0', 1);
INSERT INTO `sys_menu` VALUES (1501, '租户新增', 'admin_systenant_add', NULL, 1500, '1', 0, '0', '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:56:52', '0', 1);
INSERT INTO `sys_menu` VALUES (1502, '租户修改', 'admin_systenant_edit', NULL, 1500, '1', 1, '0', '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:56:53', '0', 1);
@@ -631,6 +632,7 @@ INSERT INTO `sys_role_menu` VALUES (1, 1400);
INSERT INTO `sys_role_menu` VALUES (1, 1401);
INSERT INTO `sys_role_menu` VALUES (1, 1402);
INSERT INTO `sys_role_menu` VALUES (1, 1403);
INSERT INTO `sys_role_menu` VALUES (1, 1404);
INSERT INTO `sys_role_menu` VALUES (1, 1500);
INSERT INTO `sys_role_menu` VALUES (1, 1501);
INSERT INTO `sys_role_menu` VALUES (1, 1502);
@@ -816,15 +818,6 @@ CREATE TABLE `sys_social_details` (
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统社交登录账号表';
-- ----------------------------
-- Records of sys_social_details
-- ----------------------------
BEGIN;
INSERT INTO `sys_social_details` VALUES (1, 'WX', '微信互联参数', 'wxd1678d3f83b1d83a', '6ddb043f94da5d2172926abe8533504f', 'daoweicloud.com', ' ', ' ', '2018-08-16 14:24:25', '2019-03-02 09:43:13', '0', 1);
INSERT INTO `sys_social_details` VALUES (2, 'GITEE', '码云登录', '8fc54e0e76e7842cf767c3ae3b9fdc48c03cefed27aa565ff7b2a39d142d9892', 'c544469ce78a67d9fcf9b28cd9f310b73f5cbc46a1b993e0802ad61517deb221', 'http://gitee.huaxiadaowei.com/#/authredirect', ' ', ' ', '2019-06-28 09:59:55', '2019-06-28 09:59:55', '0', 1);
INSERT INTO `sys_social_details` VALUES (3, 'OSC', '开源中国', 'neIIqlwGsjsfsA6uxNqD', 'aOPhRuOOJNXV1x7JrTJ9qIyRCAPXoO0l', 'http://gitee.huaxiadaowei.com/#/authredirect', ' ', ' ', '2019-06-28 10:05:37', '2019-06-28 10:05:37', '0', 1);
INSERT INTO `sys_social_details` VALUES (4, 'MINI', '小程序', 'wx6832be859d0e1cf5', '08036aef810dcb2f8ae31510910ba631', NULL, ' ', ' ', '2019-11-02 22:08:03', '2019-11-02 22:10:53', '0', 1);
COMMIT;
-- ----------------------------
-- Table structure for sys_tenant
-15
View File
@@ -27,21 +27,6 @@ services:
ports:
- 6379:6379
pigx-minio:
container_name: pigx-minio
image: minio/minio:RELEASE.2021-12-27T07-23-18Z.fips
command: server /data --console-address ":9001"
ports:
- 9000:9000
- 9001:9001
volumes:
- ./data:/data
- ./config:/root/.minio
environment:
- MINIO_DOMAIN=pigx-minio
- MINIO_ROOT_USER=lengleng
- MINIO_ROOT_PASSWORD=lengleng
pigx-register:
build:
context: ./pigx-register
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-auth</artifactId>
+2 -2
View File
@@ -17,11 +17,11 @@
<description>pigx 公共版本控制</description>
<properties>
<pigx.version>4.3.0</pigx.version>
<pigx.version>4.4.0</pigx.version>
<mybatis-plus.version>3.5.1</mybatis-plus.version>
<dynamic-ds.version>3.4.1</dynamic-ds.version>
<druid.version>1.2.9</druid.version>
<hutool.version>5.7.22</hutool.version>
<hutool.version>5.8.0</hutool.version>
<mysql.connector.version>8.0.29</mysql.connector.version>
<oracle.version>21.3.0.0</oracle.version>
<sqlserver.version>8.4.1.jre8</sqlserver.version>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-core</artifactId>
@@ -238,9 +238,9 @@ public class RetOps<T> {
* @see RetOps#HAS_ELEMENT
* @see RetOps#DATA_AVAILABLE
*/
public <U> RetOps<U> mapIf(Predicate<? super R<T>> predicate,Function<? super T, ? extends U> mapper) {
public <U> RetOps<U> mapIf(Predicate<? super R<T>> predicate, Function<? super T, ? extends U> mapper) {
R<U> result = R.restResult(mapper.apply(original.getData()), original.getCode(), original.getMsg());
return of(result);??
return of(result);
}
// ~ 数据消费
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-data</artifactId>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<artifactId>pigx-common</artifactId>
<groupId>com.pig4cloud</groupId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-excel</artifactId>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-gateway</artifactId>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-gray</artifactId>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-idempotent</artifactId>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-job</artifactId>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-log</artifactId>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-oss</artifactId>
+1 -1
View File
@@ -23,7 +23,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-seata</artifactId>
+1 -1
View File
@@ -23,7 +23,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-security</artifactId>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-sequence</artifactId>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-swagger</artifactId>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-test</artifactId>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-websocket</artifactId>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common-xss</artifactId>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-common</artifactId>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-gateway</artifactId>
+1 -1
View File
@@ -18,7 +18,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-register</artifactId>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-upms</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-upms-api</artifactId>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-upms</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-upms-biz</artifactId>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-upms</artifactId>
-100
View File
@@ -1,100 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-visual</artifactId>
<version>4.3.0</version>
</parent>
<artifactId>pigx-bi-platform</artifactId>
<packaging>jar</packaging>
<description>基于 ureport 的报表系统</description>
<dependencies>
<!--注册中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--配置中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--sentinel-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-sentinel</artifactId>
</dependency>
<!--ureport-->
<dependency>
<groupId>com.bstek.ureport</groupId>
<artifactId>ureport2-console</artifactId>
<version>${ureport.version}</version>
</dependency>
<!--web 模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--undertow容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<!--server-api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<!--oss-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-oss</artifactId>
</dependency>
<!--security-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--feign 调用依赖-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-feign</artifactId>
</dependency>
<!--MYSQL 数据驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- ojdbc8 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
</dependency>
<!--PG-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
@@ -1,42 +0,0 @@
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.pig4cloud.pigx.ureport;
import com.pig4cloud.pigx.common.feign.annotation.EnablePigxFeignClients;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author lengleng
* @date 2020-10-15 报表模块
* <p>
* 此模块由于使用的是ureport 封装报表设计器,无法区分租户权限较大建议不提供具体租户使用。
* <p>
* http://127.0.0.1:5006/ureport/designer
*/
@EnablePigxFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class PigxBiApplication {
public static void main(String[] args) {
SpringApplication.run(PigxBiApplication.class, args);
}
}
@@ -1,26 +0,0 @@
package com.pig4cloud.pigx.ureport.config;
import com.bstek.ureport.console.UReportServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
/**
* @author lengleng
* @date 2020/7/25
* <p>
* ureport 配置类
*/
@Configuration(proxyBeanMethods = false)
@ImportResource(UreportAutoConfiguration.CONTEXT)
public class UreportAutoConfiguration {
static final String CONTEXT = "classpath:ureport-console-context.xml";
@Bean
public ServletRegistrationBean<UReportServlet> buildUreportServlet() {
return new ServletRegistrationBean<>(new UReportServlet(), "/ureport/*");
}
}
@@ -1,53 +0,0 @@
package com.pig4cloud.pigx.ureport.config;
import com.bstek.ureport.UReportPropertyPlaceholderConfigurer;
import com.bstek.ureport.provider.report.ReportProvider;
import com.pig4cloud.pigx.common.file.core.FileProperties;
import com.pig4cloud.pigx.common.file.core.FileTemplate;
import com.pig4cloud.pigx.common.file.oss.service.OssTemplate;
import com.pig4cloud.pigx.ureport.processor.UReportPropertyPlaceholderConfigurerPlus;
import com.pig4cloud.pigx.ureport.provider.DfsReportProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
import java.util.Locale;
/**
* @author lengleng
* @date 2020/7/25
* <p>
* 增强默认Ureport 行为
*/
@ConditionalOnClass(OssTemplate.class)
@Configuration(proxyBeanMethods = false)
public class UreportExtConfig {
@Bean
public ReportProvider dfsReportProvider(FileTemplate template, FileProperties properties) {
return new DfsReportProvider(template, properties);
}
@Bean
public UReportPropertyPlaceholderConfigurer uReportPropertyPlaceholderConfigurerPlus() {
return new UReportPropertyPlaceholderConfigurerPlus();
}
@Bean
@Primary
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver lr = new AcceptHeaderLocaleResolver();
// 设置默认区域,
lr.setDefaultLocale(Locale.CHINA);
return lr;
}
}
@@ -1,81 +0,0 @@
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.pig4cloud.pigx.ureport.config;
import lombok.SneakyThrows;
import org.springframework.context.annotation.Configuration;
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.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
/**
* WebSecurityConfigurer
*
* @author lengleng
* @date 2020-12-05
*/
@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
@Override
@SneakyThrows
protected void configure(HttpSecurity http) {
http.headers().frameOptions().disable().and().formLogin().loginPage("/login.html").loginProcessingUrl("/login")
.failureHandler(new LoginFailureHandler()).and().authorizeRequests()
.antMatchers("/login.html", "/login", "/actuator/**", "/ureport/preview").permitAll().anyRequest()
.authenticated().and().csrf().disable();
}
/**
* 不拦截静态资源
* @param web
*/
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/favicon.ico", "/css/**", "/ureport/res/**", "/error");
}
/**
* 登录失败处理器,携带错误信息重定向到首页
*/
static class LoginFailureHandler implements AuthenticationFailureHandler {
/**
* Called when an authentication attempt fails.
* @param request the request during which the authentication attempt occurred.
* @param response the response.
* @param exception the exception which was thrown to reject the authentication
*/
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException {
response.sendRedirect("/login.html?error="
+ URLEncoder.encode(exception.getLocalizedMessage(), StandardCharsets.UTF_8.name()));
}
}
}
@@ -1,29 +0,0 @@
package com.pig4cloud.pigx.ureport.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @author lengleng
* @date 2020/12/5
* <p>
* 页面跳转
*/
@Controller
public class PageController {
/**
* 表单设计URL
*/
private static final String REDIRECT_UREPORT_DESIGNER = "redirect:/ureport/designer";
/**
* 跳转至表单设计
* @return
*/
@GetMapping
public String designer() {
return REDIRECT_UREPORT_DESIGNER;
}
}
@@ -1,23 +0,0 @@
package com.pig4cloud.pigx.ureport.processor;
import com.bstek.ureport.UReportPropertyPlaceholderConfigurer;
import java.util.Properties;
/**
* @author lengleng
* @date 2020/7/25
* <p>
* 重写默认的 PropertyPlaceholder
*/
public class UReportPropertyPlaceholderConfigurerPlus extends UReportPropertyPlaceholderConfigurer {
public UReportPropertyPlaceholderConfigurerPlus() {
Properties properties = new Properties();
properties.setProperty("ureport.fileStoreDir", "");
properties.setProperty("ureport.debug", "false");
properties.setProperty("ureport.disableHttpSessionReportCache", "false");
this.setProperties(properties);
}
}
@@ -1,91 +0,0 @@
package com.pig4cloud.pigx.ureport.provider;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.bstek.ureport.provider.report.ReportFile;
import com.bstek.ureport.provider.report.ReportProvider;
import com.pig4cloud.pigx.common.file.core.FileProperties;
import com.pig4cloud.pigx.common.file.core.FileTemplate;
import lombok.Cleanup;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import java.io.InputStream;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author lengleng
* @date 2020/7/25
* <p>
* 基于OSS 的文件存储支持
*/
@Slf4j
@RequiredArgsConstructor
public class DfsReportProvider implements ReportProvider {
/**
* 保存文件增加默认前缀,方便查找
*/
private static final String PREFIX = "oss_";
private final FileTemplate fileTemplate;
private final FileProperties properties;
@Override
public InputStream loadReport(String file) {
S3Object object = fileTemplate.getObject(properties.getBucketName(), file);
return object.getObjectContent();
}
@Override
public void deleteReport(String file) {
try {
fileTemplate.removeObject(properties.getBucketName(), file);
}
catch (Exception e) {
log.error("文件删除失败 ", e);
}
}
@Override
public List<ReportFile> getReportFiles() {
List<S3ObjectSummary> objectSummaryList = fileTemplate.getAllObjectsByPrefix(properties.getBucketName(), PREFIX,
true);
return objectSummaryList.stream()
.map(s3ObjectSummary -> new ReportFile(s3ObjectSummary.getKey().replaceAll(PREFIX, ""),
s3ObjectSummary.getLastModified()))
.collect(Collectors.toList());
}
@Override
public void saveReport(String file, String content) {
try {
@Cleanup
InputStream inputStream = IOUtils.toInputStream(content);
fileTemplate.putObject(properties.getBucketName(), file, inputStream);
}
catch (Exception e) {
log.error("文件上传失败", e);
}
}
@Override
public String getName() {
return "分布式文件存储";
}
@Override
public boolean disabled() {
return false;
}
@Override
public String getPrefix() {
return PREFIX;
}
}
@@ -1,25 +0,0 @@
{
"properties": [
{
"name": "ureport.disableFileProvider",
"type": "java.lang.String",
"description": "是否开启本地文件系统 true/false"
},
{
"name": "ureport.fileStoreDir",
"type": "java.lang.String",
"description": "本地文件保存路径"
},
{
"name": "ureport.debug",
"type": "java.lang.String",
"description": "DEBUG模式 true/false"
},
{
"name": "ureport.disableHttpSessionReportCache",
"type": "java.lang.String",
"description": "是否关闭 session cache"
}
],
"hints": []
}
@@ -1,6 +0,0 @@
/*!
* Bootstrap v3.3.7 (http://getbootstrap.com)
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\Line truncated
/*# sourceMappingURL=bootstrap.min.css.map */
@@ -1,67 +0,0 @@
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
.sign_body {
padding-top: 40px;
padding-bottom: 40px;
background-color: #eee;
}
.form-signin {
max-width: 330px;
padding: 15px;
margin: 0 auto;
}
.form-margin-top {
margin-top: 50px;
}
.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
position: relative;
height: auto;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 10px;
font-size: 16px;
}
.form-signin .form-control:focus {
z-index: 2;
}
.form-signin input[type="email"] {
margin-bottom: -1px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.form-signin input[type="password"] {
margin-bottom: 10px;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
footer{
text-align: center;
position:absolute;
bottom:0;
width:100%;
height:100px;
}
@@ -1,38 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="">
<meta name="author" content="">
<title>PigX报表系统</title>
<link href="/css/bootstrap.min.css" rel="stylesheet">
<link href="/css/signin.css" rel="stylesheet">
</head>
<body class="sign_body">
<div class="container form-margin-top">
<form class="form-signin" action="/login" method="post">
<h2 class="form-signin-heading" align="center">报表系统认证</h2>
<input type="text" name="username" class="form-control" placeholder="账号" required autofocus>
<input type="password" name="password" class="form-control" placeholder="密码" required>
<button class="btn btn-lg btn-primary btn-block" type="submit">sign in</button>
<span style="color: red;" id="error"></span>
</form>
</div>
<footer>
<p>support by: pig4cloud</p>
<p>email: <a href="mailto:support@mail.pigx.vip">support@mail.pigx.vip</a></p>
</footer>
</body>
</html>
<script>
window.onload = function () {
let params = window.location.href.split('error=');
if (params.length === 2) {
document.getElementById("error").innerText = decodeURI(params[1])
}
}
</script>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-visual</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-codegen</artifactId>
+1 -1
View File
@@ -23,7 +23,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-visual</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-daemon-elastic-job</artifactId>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-visual</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-visual</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-jimu-platform</artifactId>
+1 -1
View File
@@ -24,7 +24,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-visual</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-monitor</artifactId>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-visual</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-mp-platform</artifactId>
+1 -1
View File
@@ -23,7 +23,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-visual</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-oa-platform</artifactId>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-visual</artifactId>
<version>4.3.0</version>
<version>4.4.0</version>
</parent>
<artifactId>pigx-pay-platform</artifactId>
@@ -7,12 +7,12 @@ ENV JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir -p /pigx-bi-platform
RUN mkdir -p /pigx-report-platform
WORKDIR /pigx-bi-platform
WORKDIR /pigx-report-platform
EXPOSE 5006
EXPOSE 9095
ADD ./target/pigx-bi-platform.jar ./
ADD ./target/pigx-report-platform.jar ./
CMD sleep 120;java $JAVA_OPTS -jar pigx-bi-platform.jar
CMD sleep 180;java $JAVA_OPTS -jar pigx-report-platform.jar
+161
View File
@@ -0,0 +1,161 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-visual</artifactId>
<version>4.4.0</version>
</parent>
<artifactId>pigx-report-platform</artifactId>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<description>基于 aj-report 的大屏设计系统</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.anji-plus</groupId>
<artifactId>spring-boot-gaea</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
</dependency>
<!--PG-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<!--undertow容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<!--配置中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- druid 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.3.2</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.woff</exclude>
<exclude>**/*.woff2</exclude>
<exclude>**/*.ttf</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.woff</include>
<include>**/*.woff2</include>
<include>**/*.ttf</include>
</includes>
</resource>
</resources>
</build>
</project>
@@ -0,0 +1,101 @@
package com.anji.plus.gaea.curd.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.util.Date;
/**
* 基础数据库实体
*
* @author lr
* @since 2021-01-12
*/
public class GaeaBaseEntity extends BaseEntity {
/**
* 数据ID
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 版本号
* @Version:乐观锁,,需要添加mybatis plus插件optimisticLockerInterceptor
*/
@TableField(fill = FieldFill.INSERT_UPDATE, update = "%s+1")
@Version
private Integer version;
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
@@ -0,0 +1,24 @@
package com.anjiplus.template.gaea.business;
import com.anji.plus.gaea.annotation.enabled.EnabledGaeaConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 业务模板
*
* @author lr
* @since 2021-02-03
*/
@EnabledGaeaConfiguration
@SpringBootApplication(scanBasePackages = { "com.anjiplus.template.gaea", "com.anji.plus" })
@MapperScan(basePackages = { "com.anjiplus.template.gaea.business.modules.*.dao",
"com.anjiplus.template.gaea.business.modules.*.**.dao", "com.anji.plus.gaea.*.module.*.dao" })
public class PigxReportPlatformApplication {
public static void main(String[] args) {
SpringApplication.run(PigxReportPlatformApplication.class);
}
}
@@ -0,0 +1,26 @@
package com.anjiplus.template.gaea.business.base;
import com.anji.plus.gaea.curd.controller.GaeaBaseController;
import com.anji.plus.gaea.curd.dto.BaseDTO;
import com.anji.plus.gaea.curd.entity.BaseEntity;
import com.anji.plus.gaea.curd.params.PageParam;
import org.springframework.context.i18n.LocaleContextHolder;
/**
* 项目级的Controller公共处理基类
*
* @author WongBin
* @date 2021/3/26
*/
public abstract class BaseController<P extends PageParam, T extends BaseEntity, D extends BaseDTO>
extends GaeaBaseController<P, T, D> {
/**
* 获取当前语言类型
* @return
*/
public String getI18nLang() {
return LocaleContextHolder.getLocale().getLanguage();
}
}
@@ -0,0 +1,15 @@
package com.anjiplus.template.gaea.business.base;
import com.anji.plus.gaea.curd.entity.BaseEntity;
import com.anji.plus.gaea.curd.params.PageParam;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
/**
* 项目级的Service公共处理基类
*
* @author WongBin
* @date 2021/3/26
*/
public interface BaseService<P extends PageParam, T extends BaseEntity> extends GaeaBaseService<P, T> {
}
@@ -0,0 +1,20 @@
package com.anjiplus.template.gaea.business.base;
import com.anji.plus.gaea.bean.ResponseBean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @desc 用户管理 controller
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902
**/
@RestController
public class HealthController {
@GetMapping("health")
public ResponseBean health() {
return ResponseBean.builder().build();
}
}
@@ -0,0 +1,147 @@
package com.anjiplus.template.gaea.business.cache;
import com.anji.plus.gaea.cache.CacheHelper;
import com.google.common.collect.Maps;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ReportCacheHelper implements CacheHelper, ApplicationContextAware {
@Autowired
private Cache cache;
@Override
public String stringGet(String key) {
Cache.ValueWrapper valueWrapper = cache.get(key);
if (valueWrapper != null) {
return (String) valueWrapper.get();
}
return CacheHelper.super.stringGet(key);
}
@Override
public Boolean setIfAbsent(String key, String value) {
cache.putIfAbsent(key, value);
return true;
}
@Override
public boolean exist(String key) {
String cacheHoldTime = stringGet(key + "_HoldTime");
if (cacheHoldTime != null && Long.parseLong(cacheHoldTime) > 0) {
if (Long.parseLong(cacheHoldTime) < System.currentTimeMillis()) {
delete(key + "_HoldTime");
delete(key);
return false;
}
}
return cache.get(key) != null;
}
@Override
public void stringSet(String key, String value) {
cache.put(key, value);
}
@Override
public String regKey(String key) {
return CacheHelper.super.regKey(key);
}
@Override
public void stringSetExpire(String key, String value, long seconds) {
stringSet(key, value);
if (seconds > 0) {
// 缓存失效时间
stringSet(key + "_HoldTime", String.valueOf(System.currentTimeMillis() + seconds * 1000));
}
}
@Override
public Map<String, String> hashGet(String key) {
Cache.ValueWrapper t = cache.get(key);
if (t != null) {
return (Map<String, String>) t.get();
}
return Maps.newHashMap();
}
@Override
public String hashGetString(String key, String hashKey) {
Map<String, String> stringStringMap = hashGet(key);
return stringStringMap.get(hashKey);
}
@Override
public void hashDel(String key, String hashKey) {
Map<String, String> stringStringMap = hashGet(key);
stringStringMap.remove(hashKey);
}
@Override
public void hashBatchDel(String key, Set<String> hashKeys) {
Map<String, String> stringStringMap = hashGet(key);
hashKeys.forEach(stringStringMap::remove);
}
@Override
public boolean hashExist(String key, String hashKey) {
if (exist(key)) {
Map<String, String> map = hashGet(key);
return map.containsKey(hashKey);
}
return false;
}
@Override
public boolean hashAnyExist(String key, String[] hashKeys) {
return CacheHelper.super.hashAnyExist(key, hashKeys);
}
@Override
public void hashSet(String key, String hashKey, String hashValue) {
Map<String, String> map;
if (exist(key)) {
map = hashGet(key);
}
else {
map = new HashMap<>();
}
map.put(hashKey, hashValue);
hashSet(key, map);
}
@Override
public void hashSet(String key, Map<String, String> hash) {
cache.put(key, hash);
}
@Override
public boolean delete(String key) {
if (exist(key)) {
cache.evict(key);
}
return true;
}
@Override
public boolean delete(List<String> keys) {
keys.forEach(this::delete);
return true;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
/* 基于内存的本地缓存 */
cache = (Cache) applicationContext.getBean("ehCacheCache");
}
}
@@ -0,0 +1,172 @@
package com.anjiplus.template.gaea.business.code;
/**
* 响应码
*
* @author lr
* @since 2021-02-22
*/
public interface ResponseCode {
String NOT_NULL = "field.not.null";
String NOT_EMPTY = "field.not.empty";
String MIN = "field.min";
String MAX = "field.max";
String DICT_ERROR = "field.dict.error";
String USER_PASSWORD_ERROR = "User.password.error";
/**
* 用户名或者密码不正确
*/
String LOGIN_ERROR = "login.error";
/**
* 新密码不能和原密码一致
*/
String USER_PASSWORD_CONFIG_PASSWORD_CANOT_EQUAL = "user.password.config.password.canot.equal";
/**
* 密码和确认密码不一致
*/
String USER_INCONSISTENT_PASSWORD_ERROR = "user.inconsistent.password.error";
/**
* 旧密码不正确
*/
String USER_OLD_PASSWORD_ERROR = "user.old.password.error";
/**
* 用户token过期
*/
String USER_TOKEN_EXPIRED = "User.token.expired";
/**
* 字典项重复
*/
String DICT_ITEM_REPEAT = "Dict.item.code.exist";
/**
* 数字字典国际化标识不能为null
*/
String DICT_CODE_LOCALE_NULL = "500-00002";
/**
* 参数为空
*/
String PARAM_IS_NULL = "Rule.execute.param.null";
/**
* 规则编译不通过
*/
String RULE_CONTENT_COMPILE_ERROR = "Rule.content.compile.error";
/**
* 规则执行不通过
*/
String RULE_CONTENT_EXECUTE_ERROR = "Rule.content.execute.error";
/**
* 规则编码已存在
*/
String RULE_CODE_EXIST = "Rule.code.exist";
/**
* 对应规则内容不存在
*/
String RULE_CONTENT_NOT_EXIST = "Rule.content.not.exist";
/**
* 对应规则字段值不存在
*/
String RULE_FIELDS_NOT_EXIST = "Rule.fields.not.exist";
/**
* 规则字段必填
*/
String RULE_FIELD_VALUE_IS_REQUIRED = "Rule.field.value.is.required";
/**
* 规则字段值类型错误
*/
String RULE_FIELD_VALUE_TYPE_ERROR = "Rule.field.value.type.error";
/**
* 规则参数校验不通过
*/
String RULE_FIELDS_CHECK_ERROR = "Rule.fields.check.error";
/**
* 组件未加载
*/
String COMPONENT_NOT_LOAD = "Component.load.check.error";
String AUTH_PASSWORD_NOTSAME = "1001";
String OLD_PASSWORD_ERROR = "1003";
String USER_ONTEXIST_ORGINFO = "1004";
String USER_ONTEXIST_ROLEINFO = "1005";
String MENU_TABLE_CODE_EXIST = "1006";
String USER_CODE_ISEXIST = "1007";
String ROLE_CODE_ISEXIST = "1008";
String MENU_CODE_ISEXIST = "1009";
String ORG_CODE_ISEXIST = "1010";
String SEARCHNAME_ISEXIST = "1011";
String SETTINGNAME_ISEXIST = "1012";
String DICCODE_ISEXIST = "1013";
String DEVICEID_LENGTH = "1014";
String USERINFO_EMPTY = "1015";
String FILE_EMPTY_FILENAME = "2001";
String FILE_SUFFIX_UNSUPPORTED = "2002";
String FILE_UPLOAD_ERROR = "2003";
String FILE_ONT_EXSIT = "2004";
String LIST_IS_EMPTY = "2005";
String PUSHCODE_NEED_UNIQUE = "3001";
String RECEIVER_IS_EMPTY = "3002";
String DATA_SOURCE_CONNECTION_FAILED = "4001";
String DATA_SOURCE_TYPE_DOES_NOT_MATCH_TEMPORARILY = "4002";
String EXECUTE_SQL_ERROR = "4003";
String INCOMPLETE_PARAMETER_REPLACEMENT_VALUES = "4004";
String EXECUTE_JS_ERROR = "4005";
String ANALYSIS_DATA_ERROR = "4006";
String REPORT_CODE_ISEXIST = "4007";
String SET_CODE_ISEXIST = "4008";
String SOURCE_CODE_ISEXIST = "4009";
String CLASS_NOT_FOUND = "4010";
String REPORT_SHARE_LINK_INVALID = "report.share.link.invalid";
}
@@ -0,0 +1,85 @@
package com.anjiplus.template.gaea.business.config;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* Created by raodeming on 2021/8/6.
*/
@Component
@ConfigurationProperties(prefix = "spring.druid")
@Data
public class DruidProperties {
/**
* 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
*/
private int initialSize;
/**
* 最小连接池数量
*/
private int minIdle;
/**
* 最大连接池数量
*/
private int maxActive;
/**
* 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置
*/
private int maxWait;
/**
* 关闭空闲连接的检测时间间隔.Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。
*/
private int timeBetweenEvictionRunsMillis;
/**
* 连接的最小生存时间.连接保持空闲而不被驱逐的最小时间
*/
private int minEvictableIdleTimeMillis;
/**
* 申请连接时检测空闲时间,根据空闲时间再检测连接是否有效.建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRun
*/
private boolean testWhileIdle;
/**
* 开启PSCache
*/
private boolean poolPreparedStatements;
/**
* 设置PSCache值
*/
private int maxPoolPreparedStatementPerConnectionSize;
/**
* 连接出错后再尝试连接三次
*/
private int connectionErrorRetryAttempts;
/**
* 数据库服务宕机自动重连机制
*/
private boolean breakAfterAcquireFailure;
/**
* 连接出错后重试时间间隔
*/
private int timeBetweenConnectErrorMillis;
public DruidDataSource dataSource(String url, String username, String password, String driverClassName) {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(url);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
return datasource;
}
}
@@ -0,0 +1,30 @@
package com.anjiplus.template.gaea.business.config;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Locale;
import java.util.TimeZone;
/**
* @author lengleng
* @date 2022/2/13
*/
@Configuration
public class JacksonConfiguration {
private static final String ASIA_SHANGHAI = "Asia/Shanghai";
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return builder -> {
builder.locale(Locale.CHINA);
builder.timeZone(TimeZone.getTimeZone(ASIA_SHANGHAI));
builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
builder.serializerByType(Long.class, ToStringSerializer.instance);
};
}
}
@@ -0,0 +1,39 @@
package com.anjiplus.template.gaea.business.constant;
/**
* 常量
*
* @author lr
* @since 2021-03-26
*/
public interface BusinessConstant {
String LEFT_BIG_BOAST = "{";
String RIGTH_BIG_BOAST = "}";
String LEFT_MIDDLE_BOAST = "[";
String RIGHT_MIDDLE_BOAST = "]";
/**
* 字典项重复
*/
String DICT_ITEM_EXIST_GROUP = "dictItemExist";
/**
* 所有url的权限码缓存key
*/
String GAEA_SECURITY_AUTHORITIES = "gaea:security:authorities:all";
/**
* 用户登录的token缓存key
*/
String GAEA_SECURITY_LOGIN_TOKEN = "gaea:security:login:token:%s";
/**
* 用户登录的主信息缓存信息
*/
String GAEA_SECURITY_LOGIN_USER = "gaea:security:login:user:%s";
}
@@ -0,0 +1,55 @@
package com.anjiplus.template.gaea.business.enums;
public enum DeleteFlagEnum {
DELETED(1, "已删除"), UNDELETED(0, "未删除"),;
private int codeValue;
private String codeDesc;
private DeleteFlagEnum(int codeValue, String codeDesc) {
this.codeValue = codeValue;
this.codeDesc = codeDesc;
}
public int getCodeValue() {
return this.codeValue;
}
public String getCodeDesc() {
return this.codeDesc;
}
// 根据codeValue获取枚举
public static DeleteFlagEnum parseFromCodeValue(int codeValue) {
for (DeleteFlagEnum e : DeleteFlagEnum.values()) {
if (e.codeValue == codeValue) {
return e;
}
}
return null;
}
// 根据codeValue获取描述
public static String getCodeDescByCodeValue(int codeValue) {
DeleteFlagEnum enumItem = parseFromCodeValue(codeValue);
return enumItem == null ? "" : enumItem.getCodeDesc();
}
// 验证codeValue是否有效
public static boolean validateCodeValue(int codeValue) {
return parseFromCodeValue(codeValue) != null;
}
// 列出所有值字符串
public static String getString() {
StringBuffer buffer = new StringBuffer();
for (DeleteFlagEnum e : DeleteFlagEnum.values()) {
buffer.append(e.codeValue).append("--").append(e.getCodeDesc()).append(", ");
}
buffer.deleteCharAt(buffer.lastIndexOf(","));
return buffer.toString().trim();
}
}
@@ -0,0 +1,55 @@
package com.anjiplus.template.gaea.business.enums;
public enum EnableFlagEnum {
ENABLE(1, "启用"), DISABLE(0, "禁用"),;
private int codeValue;
private String codeDesc;
private EnableFlagEnum(int codeValue, String codeDesc) {
this.codeValue = codeValue;
this.codeDesc = codeDesc;
}
public int getCodeValue() {
return this.codeValue;
}
public String getCodeDesc() {
return this.codeDesc;
}
// 根据codeValue获取枚举
public static EnableFlagEnum parseFromCodeValue(int codeValue) {
for (EnableFlagEnum e : EnableFlagEnum.values()) {
if (e.codeValue == codeValue) {
return e;
}
}
return null;
}
// 根据codeValue获取描述
public static String getCodeDescByCodeBalue(int codeValue) {
EnableFlagEnum enumItem = parseFromCodeValue(codeValue);
return enumItem == null ? "" : enumItem.getCodeDesc();
}
// 验证codeValue是否有效
public static boolean validateCodeValue(int codeValue) {
return parseFromCodeValue(codeValue) != null;
}
// 列出所有值字符串
public static String getString() {
StringBuffer buffer = new StringBuffer();
for (EnableFlagEnum e : EnableFlagEnum.values()) {
buffer.append(e.codeValue).append("--").append(e.getCodeDesc()).append(", ");
}
buffer.deleteCharAt(buffer.lastIndexOf(","));
return buffer.toString().trim();
}
}
@@ -0,0 +1,72 @@
package com.anjiplus.template.gaea.business.enums;
/**
* @author zhouhang
* @description EXCEL居中方式
* @date 2021/4/26
*/
public enum ExcelCenterStyleEnum {
/**
* 左对齐
*/
LEFT((short) 1, 1, "左对齐"),
/**
* 右对齐
*/
RIGHT((short) 3, 2, "右对齐"),
/**
* 居中
*/
CENTER((short) 2, 0, "居中"),;
/**
* excel居中code
*/
private final short excelCode;
/**
* 在线文档居中code
*/
private final Integer onlineExcelCode;
/**
* 名称
*/
private final String name;
public Integer getOnlineExcelCode() {
return onlineExcelCode;
}
public String getName() {
return name;
}
public short getExcelCode() {
return excelCode;
}
ExcelCenterStyleEnum(short excelCode, Integer onlineExcelCode, String name) {
this.excelCode = excelCode;
this.onlineExcelCode = onlineExcelCode;
this.name = name;
}
/**
* @param code excel居中样式code
* @return Enum_ExcelCenterStyle
* @description 根据excel居中样式获取在线文档居中样式
* @author zhouhang
* @date 2021/4/26
*/
public static ExcelCenterStyleEnum getExcelCenterStyleByExcelCenterCode(short code) {
for (ExcelCenterStyleEnum value : ExcelCenterStyleEnum.values()) {
if (code == value.getExcelCode()) {
return value;
}
}
return CENTER;
}
}
@@ -0,0 +1,30 @@
package com.anjiplus.template.gaea.business.enums;
/**
* Created by raodeming on 2021/9/3.
*/
public enum ExportTypeEnum {
/** gaea_excel */
GAEA_TEMPLATE_EXCEL("gaea_template_excel", "gaea_template_excel"),
/** gaea_pdf */
GAEA_TEMPLATE_PDF("gaea_template_pdf", "gaea_template_pdf"),;
private String codeValue;
private String codeDesc;
private ExportTypeEnum(String codeValue, String codeDesc) {
this.codeValue = codeValue;
this.codeDesc = codeDesc;
}
public String getCodeValue() {
return this.codeValue;
}
public String getCodeDesc() {
return this.codeDesc;
}
}
@@ -0,0 +1,55 @@
package com.anjiplus.template.gaea.business.enums;
public enum SetTypeEnum {
SQL("sql", "sql"), HTTP("http", "http"),;
private String codeValue;
private String codeDesc;
private SetTypeEnum(String codeValue, String codeDesc) {
this.codeValue = codeValue;
this.codeDesc = codeDesc;
}
public String getCodeValue() {
return this.codeValue;
}
public String getCodeDesc() {
return this.codeDesc;
}
// 根据codeValue获取枚举
public static SetTypeEnum parseFromCodeValue(String codeValue) {
for (SetTypeEnum e : SetTypeEnum.values()) {
if (e.codeValue == codeValue) {
return e;
}
}
return null;
}
// 根据codeValue获取描述
public static String getCodeDescByCodeBalue(String codeValue) {
SetTypeEnum enumItem = parseFromCodeValue(codeValue);
return enumItem == null ? "" : enumItem.getCodeDesc();
}
// 验证codeValue是否有效
public static boolean validateCodeValue(String codeValue) {
return parseFromCodeValue(codeValue) != null;
}
// 列出所有值字符串
public static String getString() {
StringBuffer buffer = new StringBuffer();
for (SetTypeEnum e : SetTypeEnum.values()) {
buffer.append(e.codeValue).append("--").append(e.getCodeDesc()).append(", ");
}
buffer.deleteCharAt(buffer.lastIndexOf(","));
return buffer.toString().trim();
}
}
@@ -0,0 +1,44 @@
package com.anjiplus.template.gaea.business.filter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by raodeming on 2021/6/24.
*/
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
// 设置允许Cookie
res.addHeader("Access-Control-Allow-Credentials", "true");
// 允许http://www.xxx.com域(自行设置,这里只做示例)发起跨域请求
res.addHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
// 设置允许跨域请求的方法
res.addHeader("Access-Control-Allow-Methods", "*");
// 允许跨域请求包含content-type
res.addHeader("Access-Control-Allow-Headers", "*");
res.addHeader("Access-Control-Expose-Headers", "*");
chain.doFilter(req, res);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
@@ -0,0 +1,64 @@
package com.anjiplus.template.gaea.business.modules.accessauthority.controller;
import com.anji.plus.gaea.annotation.Permission;
import com.anji.plus.gaea.bean.ResponseBean;
import com.anji.plus.gaea.bean.TreeNode;
import com.anji.plus.gaea.curd.controller.GaeaBaseController;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import com.anji.plus.gaea.holder.UserContentHolder;
import com.anjiplus.template.gaea.business.modules.accessauthority.controller.dto.AccessAuthorityDto;
import com.anjiplus.template.gaea.business.modules.accessauthority.controller.param.AccessAuthorityParam;
import com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity.AccessAuthority;
import com.anjiplus.template.gaea.business.modules.accessauthority.service.AccessAuthorityService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @desc 权限管理 controller
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:10.009
**/
@RestController
@Api(tags = "权限管理管理")
@RequestMapping("/accessAuthority")
@Permission(code = "authorityManage", name = "权限管理")
public class AccessAuthorityController
extends GaeaBaseController<AccessAuthorityParam, AccessAuthority, AccessAuthorityDto> {
@Autowired
private AccessAuthorityService accessAuthorityService;
@Override
public GaeaBaseService<AccessAuthorityParam, AccessAuthority> getService() {
return accessAuthorityService;
}
@Override
public AccessAuthority getEntity() {
return new AccessAuthority();
}
@Override
public AccessAuthorityDto getDTO() {
return new AccessAuthorityDto();
}
/**
* 获取一二级菜单
* @return
*/
@Permission(code = "query", name = "查询")
@GetMapping("/menuTree")
public ResponseBean menuTree() {
String username = UserContentHolder.getContext().getUsername();
List<TreeNode> parentTreeList = accessAuthorityService.getAuthorityTree(username, false);
return responseSuccessWithData(parentTreeList);
}
}
@@ -0,0 +1,56 @@
package com.anjiplus.template.gaea.business.modules.accessauthority.controller.dto;
import com.anji.plus.gaea.curd.dto.GaeaBaseDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @description 权限管理 dto
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:10.009
**/
@Data
public class AccessAuthorityDto extends GaeaBaseDTO implements Serializable {
/** 父菜单代码 */
@ApiModelProperty(value = "父菜单代码")
private String parentTarget;
/** 目标菜单 */
@ApiModelProperty(value = "菜单代码")
@NotEmpty(message = "6002")
private String target;
/** 目标菜单名称 */
@ApiModelProperty(value = "菜单名称")
@NotEmpty(message = "6002")
private String targetName;
/** 目标按钮 */
@ApiModelProperty(value = "按钮代码")
@NotEmpty(message = "6002")
private String action;
/** 目标按钮名称 */
@ApiModelProperty(value = "按钮名称")
@NotEmpty(message = "6002")
private String actionName;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
@ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG")
private Integer deleteFlag;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
@ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG")
@NotNull(message = "6002")
private Integer enableFlag;
@ApiModelProperty(value = "sort")
private Integer sort;
}
@@ -0,0 +1,43 @@
/**/
package com.anjiplus.template.gaea.business.modules.accessauthority.controller.param;
import com.anji.plus.gaea.annotation.Query;
import com.anji.plus.gaea.constant.QueryEnum;
import com.anji.plus.gaea.curd.params.PageParam;
import lombok.Data;
import java.io.Serializable;
/**
* @desc AccessAuthority 权限管理查询输入类
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:10.009
**/
@Data
public class AccessAuthorityParam extends PageParam implements Serializable {
/** 父菜单代码 */
@Query(value = QueryEnum.LIKE)
private String parentTarget;
/** 菜单代码 */
@Query(value = QueryEnum.LIKE)
private String target;
/** 菜单名称 */
@Query(value = QueryEnum.LIKE)
private String targetName;
/** 按钮代码 */
@Query(value = QueryEnum.LIKE)
private String action;
/** 按钮名称 */
@Query(value = QueryEnum.LIKE)
private String actionName;
// 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG
@Query
private Integer enableFlag;
}
@@ -0,0 +1,16 @@
package com.anjiplus.template.gaea.business.modules.accessauthority.dao;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity.AccessAuthority;
import org.apache.ibatis.annotations.Mapper;
/**
* AccessAuthority Mapper
*
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:10.009
**/
@Mapper
public interface AccessAuthorityMapper extends GaeaBaseMapper<AccessAuthority> {
}
@@ -0,0 +1,40 @@
package com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity;
import com.anji.plus.gaea.curd.entity.GaeaBaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* @description 权限管理 entity
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:10.009
**/
@TableName(keepGlobalPrefix = true, value = "access_authority")
@Data
public class AccessAuthority extends GaeaBaseEntity {
/** 父菜单代码 */
private String parentTarget;
/** 菜单代码 */
private String target;
/** 菜单名称 */
private String targetName;
/** 按钮代码 */
private String action;
/** 按钮名称 */
private String actionName;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
private Integer deleteFlag;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer enableFlag;
private Integer sort;
}
@@ -0,0 +1,30 @@
package com.anjiplus.template.gaea.business.modules.accessauthority.service;
import com.anji.plus.gaea.bean.TreeNode;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import com.anjiplus.template.gaea.business.modules.accessauthority.controller.param.AccessAuthorityParam;
import com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity.AccessAuthority;
import java.util.List;
/**
* @desc AccessAuthority 权限管理服务接口
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:10.009
**/
public interface AccessAuthorityService extends GaeaBaseService<AccessAuthorityParam, AccessAuthority> {
/**
* @param loginName 当前登录的用户名
* @param withActionNode 带第三层的按钮节点
* @return
*/
List<TreeNode> getAuthorityTree(String loginName, boolean withActionNode);
/**
* 扫描所有mvc url的需要权限码,建立拦截体系
*/
void scanGaeaSecurityAuthorities();
}
@@ -0,0 +1,138 @@
package com.anjiplus.template.gaea.business.modules.accessauthority.service.impl;
import com.anji.plus.gaea.bean.TreeNode;
import com.anji.plus.gaea.cache.CacheHelper;
import com.anji.plus.gaea.constant.Enabled;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anji.plus.gaea.init.InitRequestUrlMappings;
import com.anjiplus.template.gaea.business.constant.BusinessConstant;
import com.anjiplus.template.gaea.business.modules.accessauthority.dao.AccessAuthorityMapper;
import com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity.AccessAuthority;
import com.anjiplus.template.gaea.business.modules.accessauthority.service.AccessAuthorityService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @desc AccessAuthority 权限管理服务实现
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:10.009
**/
@Service
public class AccessAuthorityServiceImpl implements AccessAuthorityService {
@Autowired
private InitRequestUrlMappings initRequestUrlMappings;
@Autowired
private CacheHelper cacheHelper;
@Autowired
private AccessAuthorityMapper accessAuthorityMapper;
@Override
public GaeaBaseMapper<AccessAuthority> getMapper() {
return accessAuthorityMapper;
}
@Override
public List<TreeNode> getAuthorityTree(String loginName, boolean withActionNode) {
// 查询出所有的菜单记录
LambdaQueryWrapper<AccessAuthority> wrapper = Wrappers.lambdaQuery();
wrapper.select(AccessAuthority::getParentTarget, AccessAuthority::getTarget, AccessAuthority::getTargetName,
AccessAuthority::getAction, AccessAuthority::getActionName).eq(AccessAuthority::getEnableFlag, 1)
.eq(AccessAuthority::getDeleteFlag, 0).orderByAsc(AccessAuthority::getSort);
// 按operator去筛选 后面再加where
List<AccessAuthority> accessAuthorityList = getMapper().selectList(wrapper);
// 筛选出一级菜单
List<TreeNode> parentNodes = accessAuthorityList.stream()
.filter(accessAuthority -> StringUtils.isBlank(accessAuthority.getParentTarget())).map(item -> {
TreeNode treeNode = new TreeNode();
treeNode.setId(item.getTarget());
treeNode.setLabel(item.getTargetName());
return treeNode;
}).collect(Collectors.toList());
// 菜单-按钮的map
Map<String, List<AccessAuthority>> targetActionsMap = accessAuthorityList.stream()
.filter(accessAuthority -> StringUtils.isNoneBlank(accessAuthority.getParentTarget()))
.collect(Collectors.groupingBy(AccessAuthority::getTarget));
// 设置每个一级菜单的二菜单
parentNodes.stream().forEach(parentNode -> {
List<String> alreadyTargets = new ArrayList<>();
accessAuthorityList.stream().forEach(authority -> {
if (!StringUtils.equals(parentNode.getId(), authority.getParentTarget())
|| alreadyTargets.contains(authority.getTarget())) {
return;
}
// 找到一级菜单对应的二级菜单
// 初始化二级菜单节点
TreeNode levelTwoMenuNode = new TreeNode();
levelTwoMenuNode.setId(authority.getTarget());
levelTwoMenuNode.setLabel(authority.getTargetName());
levelTwoMenuNode.setChildren(new ArrayList<TreeNode>());
// 初始化二级菜单的按钮
if (withActionNode) {
List<AccessAuthority> actionList = targetActionsMap.get(authority.getTarget());
if (actionList != null && !actionList.isEmpty()) {
actionList.stream().forEach(action -> {
TreeNode buttonNode = new TreeNode();
buttonNode.setId(String.format("%s_%s", action.getTarget(), action.getAction()));
buttonNode.setLabel(action.getActionName());
levelTwoMenuNode.getChildren().add(buttonNode);
});
}
}
// 将上面找到的二级菜单加入到一菜单的子树中去
List<TreeNode> children = parentNode.getChildren();
if (children == null) {
children = new ArrayList<TreeNode>();
}
children.add(levelTwoMenuNode);
parentNode.setChildren(children);
// 已经找过的二级菜单,后面不在重复添加
alreadyTargets.add(authority.getTarget());
});
});
return parentNodes;
}
@Override
public void scanGaeaSecurityAuthorities() {
/*
* 获取当前应用中所有的请求信息 { "applicationName": "aj-report", "authCode":
* "authorityManage:query", "authName": "权限管理查询", "beanName":
* "accessAuthorityController", "menuCode": "authorityManage", "path":
* "GET#/accessAuthority/menuTree" }
*/
List<InitRequestUrlMappings.RequestInfo> requestInfos = initRequestUrlMappings
.getRequestInfos(Enabled.YES.getValue());
// key="GET#/accessAuthority/menuTree" value="authorityManage:query"
Map<String, String> securityAuthorityMap = new HashMap<String, String>();
requestInfos.stream().forEach(requestInfo -> {
securityAuthorityMap.put(requestInfo.getPath(), requestInfo.getAuthCode());
});
// 将key存入到缓存中
cacheHelper.hashSet(BusinessConstant.GAEA_SECURITY_AUTHORITIES, securityAuthorityMap);
}
}
@@ -0,0 +1,71 @@
package com.anjiplus.template.gaea.business.modules.accessrole.controller;
import com.anji.plus.gaea.annotation.Permission;
import com.anji.plus.gaea.bean.ResponseBean;
import com.anji.plus.gaea.curd.controller.GaeaBaseController;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import com.anji.plus.gaea.holder.UserContentHolder;
import com.anjiplus.template.gaea.business.modules.accessrole.controller.dto.AccessRoleDto;
import com.anjiplus.template.gaea.business.modules.accessrole.controller.param.AccessRoleParam;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole;
import com.anjiplus.template.gaea.business.modules.accessrole.service.AccessRoleService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* @desc 角色管理 controller
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136
**/
@RestController
@Api(tags = "角色管理管理")
@RequestMapping("/accessRole")
@Permission(code = "roleManage", name = "角色管理")
public class AccessRoleController extends GaeaBaseController<AccessRoleParam, AccessRole, AccessRoleDto> {
@Autowired
private AccessRoleService accessRoleService;
@Override
public GaeaBaseService<AccessRoleParam, AccessRole> getService() {
return accessRoleService;
}
@Override
public AccessRole getEntity() {
return new AccessRole();
}
@Override
public AccessRoleDto getDTO() {
return new AccessRoleDto();
}
/**
* 获取角色的 菜单按钮树 一级菜单 二级菜单 三级按钮
* @return
*/
@Permission(code = "grantAuthority", name = "分配权限")
@GetMapping("/authorityTree/{roleCode}")
public ResponseBean authorityTree(@PathVariable("roleCode") String roleCode) {
String operator = UserContentHolder.getContext().getUsername();
Map map = accessRoleService.getAuthorityTree(roleCode, operator);
return responseSuccessWithData(map);
}
/**
* 保存角色的权限
* @return
*/
@Permission(code = "grantAuthority", name = "分配权限")
@PostMapping("/saveAuthorityTree")
public ResponseBean saveAuthorityTree(@RequestBody AccessRoleDto dto) {
Boolean data = accessRoleService.saveAuthorityTree(dto);
return responseSuccessWithData(data);
}
}
@@ -0,0 +1,43 @@
package com.anjiplus.template.gaea.business.modules.accessrole.controller.dto;
import com.anji.plus.gaea.curd.dto.GaeaBaseDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* @description 角色管理 dto
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136
**/
@Data
public class AccessRoleDto extends GaeaBaseDTO implements Serializable {
/** 角色编码 */
@ApiModelProperty(value = "角色编码")
@NotEmpty(message = "6002")
private String roleCode;
/** 角色名称 */
@ApiModelProperty(value = "角色名称")
@NotEmpty(message = "6002")
private String roleName;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
@ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG")
private Integer deleteFlag;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
@ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG")
@NotNull(message = "6002")
private Integer enableFlag;
/** 角色保存的权限 */
private List<String> authorityList;
}
@@ -0,0 +1,31 @@
/**/
package com.anjiplus.template.gaea.business.modules.accessrole.controller.param;
import com.anji.plus.gaea.annotation.Query;
import com.anji.plus.gaea.constant.QueryEnum;
import com.anji.plus.gaea.curd.params.PageParam;
import lombok.Data;
import java.io.Serializable;
/**
* @desc AccessRole 角色管理查询输入类
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136
**/
@Data
public class AccessRoleParam extends PageParam implements Serializable {
/** 角色编码 */
@Query(value = QueryEnum.LIKE)
private String roleCode;
// 角色名称
@Query(value = QueryEnum.LIKE)
private String roleName;
// 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG
@Query
private Integer enableFlag;
}
@@ -0,0 +1,16 @@
package com.anjiplus.template.gaea.business.modules.accessrole.dao;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRoleAuthority;
import org.apache.ibatis.annotations.Mapper;
/**
* AccessRoleAuthority Mapper
*
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136
**/
@Mapper
public interface AccessRoleAuthorityMapper extends GaeaBaseMapper<AccessRoleAuthority> {
}
@@ -0,0 +1,21 @@
package com.anjiplus.template.gaea.business.modules.accessrole.dao;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* AccessRole Mapper
*
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136
**/
@Mapper
public interface AccessRoleMapper extends GaeaBaseMapper<AccessRole> {
List<String> checkedAuthoritys(@Param("roleCode") String roleCode);
}
@@ -0,0 +1,29 @@
package com.anjiplus.template.gaea.business.modules.accessrole.dao.entity;
import com.anji.plus.gaea.curd.entity.GaeaBaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* @description 角色管理 entity
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136
**/
@TableName(keepGlobalPrefix = true, value = "access_role")
@Data
public class AccessRole extends GaeaBaseEntity {
/** 角色编码 */
private String roleCode;
/** 角色名称 */
private String roleName;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
private Integer deleteFlag;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer enableFlag;
}
@@ -0,0 +1,43 @@
package com.anjiplus.template.gaea.business.modules.accessrole.dao.entity;
import com.anji.plus.gaea.curd.entity.GaeaBaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* @description 角色--菜单--按钮关联关系 entity
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136
**/
@TableName(keepGlobalPrefix = true, value = "access_role_authority")
@Data
public class AccessRoleAuthority extends GaeaBaseEntity {
/** 角色编码 */
private String roleCode;
/** 菜单代码 */
private String target;
/** 按钮代码 */
private String action;
@TableField(exist = false)
private String createBy;
@TableField(exist = false)
private Date createTime;
@TableField(exist = false)
private String updateBy;
@TableField(exist = false)
private Date updateTime;
@TableField(exist = false)
private Integer version;
}
@@ -0,0 +1,33 @@
package com.anjiplus.template.gaea.business.modules.accessrole.service;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import com.anjiplus.template.gaea.business.modules.accessrole.controller.dto.AccessRoleDto;
import com.anjiplus.template.gaea.business.modules.accessrole.controller.param.AccessRoleParam;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole;
import java.util.Map;
/**
* @desc AccessRole 角色管理服务接口
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136
**/
public interface AccessRoleService extends GaeaBaseService<AccessRoleParam, AccessRole> {
/**
* 查询某角色的权限树
* @param roleCode 被操作的对象
* @param operator 当前登录者
* @return
*/
Map getAuthorityTree(String roleCode, String operator);
/**
* 保存角色的权限
* @param accessRoleDto
* @return
*/
Boolean saveAuthorityTree(AccessRoleDto accessRoleDto);
}
@@ -0,0 +1,104 @@
package com.anjiplus.template.gaea.business.modules.accessrole.service.impl;
import com.anji.plus.gaea.bean.TreeNode;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anji.plus.gaea.exception.BusinessExceptionBuilder;
import com.anjiplus.template.gaea.business.code.ResponseCode;
import com.anjiplus.template.gaea.business.modules.accessauthority.service.AccessAuthorityService;
import com.anjiplus.template.gaea.business.modules.accessrole.controller.dto.AccessRoleDto;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.AccessRoleAuthorityMapper;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.AccessRoleMapper;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRoleAuthority;
import com.anjiplus.template.gaea.business.modules.accessrole.service.AccessRoleService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @desc AccessRole 角色管理服务实现
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136
**/
@Service
public class AccessRoleServiceImpl implements AccessRoleService {
@Autowired
private AccessRoleMapper accessRoleMapper;
@Autowired
private AccessRoleAuthorityMapper accessRoleAuthorityMapper;
@Autowired
private AccessAuthorityService accessAuthorityService;
@Override
public GaeaBaseMapper<AccessRole> getMapper() {
return accessRoleMapper;
}
@Override
public Map getAuthorityTree(String roleCode, String operator) {
Map<String, Object> result = new HashMap<String, Object>();
// 菜单按钮树
List<TreeNode> treeData = accessAuthorityService.getAuthorityTree(operator, true);
// 该角色已选中的菜单及按钮
// List<String> checkedKeys = accessRoleMapper.checkedAuthoritys(roleCode);
LambdaQueryWrapper<AccessRoleAuthority> accessRoleAuthorityWrapper = Wrappers.lambdaQuery();
accessRoleAuthorityWrapper.select(AccessRoleAuthority::getTarget, AccessRoleAuthority::getAction);
accessRoleAuthorityWrapper.eq(AccessRoleAuthority::getRoleCode, roleCode);
List<AccessRoleAuthority> accessRoleAuthorities = accessRoleAuthorityMapper
.selectList(accessRoleAuthorityWrapper);
List<String> checkedKeys = accessRoleAuthorities.stream().map(accessRoleAuthority -> accessRoleAuthority
.getTarget().concat("_").concat(accessRoleAuthority.getAction())).distinct()
.collect(Collectors.toList());
result.put("treeData", treeData);
result.put("checkedKeys", checkedKeys);
return result;
}
@Override
public Boolean saveAuthorityTree(AccessRoleDto accessRoleDto) {
// 校验
String roleCode = accessRoleDto.getRoleCode();
List<String> authorityList = accessRoleDto.getAuthorityList();
if (StringUtils.isBlank(roleCode)) {
throw BusinessExceptionBuilder.build(ResponseCode.NOT_EMPTY, roleCode);
}
if (authorityList == null || authorityList.isEmpty()) {
throw BusinessExceptionBuilder.build(ResponseCode.NOT_EMPTY, authorityList);
}
// 先清除该角色已保存的权限
LambdaQueryWrapper<AccessRoleAuthority> wrapper = Wrappers.lambdaQuery();
wrapper.eq(AccessRoleAuthority::getRoleCode, roleCode);
accessRoleAuthorityMapper.delete(wrapper);
// 保存勾选的权限(菜单和按钮)
authorityList.stream().forEach(authorityStr -> {
if (!authorityStr.contains("_")) {
return;
}
String[] array = authorityStr.split("_");
AccessRoleAuthority accessRoleAuthority = new AccessRoleAuthority();
accessRoleAuthority.setRoleCode(roleCode);
accessRoleAuthority.setTarget(array[0].trim());
accessRoleAuthority.setAction(array[1].trim());
accessRoleAuthorityMapper.insert(accessRoleAuthority);
});
return true;
}
}
@@ -0,0 +1,106 @@
package com.anjiplus.template.gaea.business.modules.accessuser.controller;
import com.anji.plus.gaea.annotation.Permission;
import com.anji.plus.gaea.bean.ResponseBean;
import com.anji.plus.gaea.curd.controller.GaeaBaseController;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import com.anji.plus.gaea.holder.UserContentHolder;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.AccessUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.GaeaUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.UpdatePasswordDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.param.AccessUserParam;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser;
import com.anjiplus.template.gaea.business.modules.accessuser.service.AccessUserService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* @desc 用户管理 controller
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902
**/
@RestController
@Api(tags = "用户管理管理")
@RequestMapping("/accessUser")
@Permission(code = "userManage", name = "用户管理")
public class AccessUserController extends GaeaBaseController<AccessUserParam, AccessUser, AccessUserDto> {
@Autowired
private AccessUserService accessUserService;
@Override
public GaeaBaseService<AccessUserParam, AccessUser> getService() {
return accessUserService;
}
@Override
public AccessUser getEntity() {
return new AccessUser();
}
@Override
public AccessUserDto getDTO() {
return new AccessUserDto();
}
/**
* 获取用户的角色树
* @return
*/
@Permission(code = "grantRole", name = "分配角色")
@GetMapping("/roleTree/{loginName}")
public ResponseBean getRoleTree(@PathVariable("loginName") String loginName) {
String operator = UserContentHolder.getContext().getUsername();
Map map = accessUserService.getRoleTree(loginName, operator);
return responseSuccessWithData(map);
}
/**
* 保存用户的角色树
* @return
*/
@Permission(code = "grantRole", name = "分配角色")
@PostMapping("/saveRoleTree")
public ResponseBean saveRoleTree(@RequestBody AccessUserDto dto) {
Boolean data = accessUserService.saveRoleTree(dto);
return responseSuccessWithData(data);
}
/**
* 重置密码
* @param dto
* @return
*/
@Permission(code = "resetPassword", name = "重置密码")
@PostMapping({ "/resetPassword" })
public ResponseBean resetPassword(@RequestBody @Validated GaeaUserDto dto) {
Boolean data = accessUserService.resetPassword(dto);
return responseSuccessWithData(data);
}
/**
* 简单实现登录
* @param dto
* @return
*/
@PostMapping({ "/login" })
public ResponseBean login(@RequestBody @Validated GaeaUserDto dto) {
return responseSuccessWithData(accessUserService.login(dto));
}
/**
* 修改自己的密码
* @param dto
* @return
*/
@PostMapping("/updatePassword")
public ResponseBean updatePassword(@RequestBody UpdatePasswordDto dto) {
return responseSuccessWithData(accessUserService.updatePassword(dto));
}
}
@@ -0,0 +1,64 @@
package com.anjiplus.template.gaea.business.modules.accessuser.controller.dto;
import com.anji.plus.gaea.curd.dto.GaeaBaseDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* @description 用户管理 dto
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902
**/
@Data
public class AccessUserDto extends GaeaBaseDTO implements Serializable {
/**  登录名 */
@ApiModelProperty(value = " 登录名")
@NotEmpty(message = "6002")
private String loginName;
/** 真实用户 */
@ApiModelProperty(value = "真实用户")
@NotEmpty(message = "6002")
private String realName;
/** 手机号码 */
@ApiModelProperty(value = "手机号码")
private String phone;
/** 用户邮箱 */
@ApiModelProperty(value = "用户邮箱")
private String email;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
@ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG")
@NotNull(message = "6002")
private Integer enableFlag;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
@ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG")
private Integer deleteFlag;
/** 最后一次登录IP */
@ApiModelProperty(value = "最后一次登录IP")
private String lastLoginIp;
/** 最后一次登陆时间 */
@ApiModelProperty(value = "最后一次登陆时间")
private Date lastLoginTime;
/** 备注 */
@ApiModelProperty(value = "备注")
private String remark;
/** 用户勾选的角色 */
private List<String> roleCodeList;
}
@@ -0,0 +1,31 @@
package com.anjiplus.template.gaea.business.modules.accessuser.controller.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.List;
@ApiModel(value = "用户登录")
@Data
public class GaeaUserDto {
@ApiModelProperty(value = "登录名")
@NotBlank
private String loginName;
@ApiModelProperty(value = "密码")
@NotBlank
private String password;
/** 真实用户 */
private String realName;
/** 登录成功后的 */
private String token;
/** 用户所拥有的权限合集 */
private List<String> authorities;
}
@@ -0,0 +1,25 @@
package com.anjiplus.template.gaea.business.modules.accessuser.controller.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@ApiModel(value = "修改密码")
@Data
public class UpdatePasswordDto {
@ApiModelProperty(value = "旧密码密码")
@NotBlank
private String oldPassword;
@ApiModelProperty(value = "密码")
@NotBlank
private String password;
@ApiModelProperty(value = "密码")
@NotBlank
private String confirmPassword;
}
@@ -0,0 +1,35 @@
/**/
package com.anjiplus.template.gaea.business.modules.accessuser.controller.param;
import com.anji.plus.gaea.annotation.Query;
import com.anji.plus.gaea.constant.QueryEnum;
import com.anji.plus.gaea.curd.params.PageParam;
import lombok.Data;
import java.io.Serializable;
/**
* @desc AccessUser 用户管理查询输入类
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902
**/
@Data
public class AccessUserParam extends PageParam implements Serializable {
//  登录名
@Query(value = QueryEnum.LIKE)
private String loginName;
// 真实用户
@Query(value = QueryEnum.LIKE)
private String realName;
// 手机号码
@Query(value = QueryEnum.LIKE)
private String phone;
// 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG
@Query
private Integer enableFlag;
}
@@ -0,0 +1,26 @@
package com.anjiplus.template.gaea.business.modules.accessuser.dao;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* AccessUser Mapper
*
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902
**/
@Mapper
public interface AccessUserMapper extends GaeaBaseMapper<AccessUser> {
/**
* 查询用户所拥有的所有角色下的权限
* @param loginName
* @return
*/
List<String> queryAuthoritiesByLoginName(@Param("loginName") String loginName);
}
@@ -0,0 +1,16 @@
package com.anjiplus.template.gaea.business.modules.accessuser.dao;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUserRole;
import org.apache.ibatis.annotations.Mapper;
/**
* AccessUser Mapper
*
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902
**/
@Mapper
public interface AccessUserRoleMapper extends GaeaBaseMapper<AccessUserRole> {
}
@@ -0,0 +1,49 @@
package com.anjiplus.template.gaea.business.modules.accessuser.dao.entity;
import com.anji.plus.gaea.curd.entity.GaeaBaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* @description 用户管理 entity
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902
**/
@TableName(keepGlobalPrefix = true, value = "access_user")
@Data
public class AccessUser extends GaeaBaseEntity {
/**  登录名 */
private String loginName;
/** 密码 */
private String password;
/** 真实用户 */
private String realName;
/** 手机号码 */
private String phone;
/** 用户邮箱 */
private String email;
/** 备注 */
private String remark;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer enableFlag;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
private Integer deleteFlag;
/** 最后一次登录IP */
private String lastLoginIp;
/** 最后一次登陆时间 */
private Date lastLoginTime;
}
@@ -0,0 +1,41 @@
package com.anjiplus.template.gaea.business.modules.accessuser.dao.entity;
import com.anji.plus.gaea.curd.entity.GaeaBaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* @description 用户--角色关联关系 entity
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902
**/
@TableName(keepGlobalPrefix = true, value = "access_user_role")
@Data
public class AccessUserRole extends GaeaBaseEntity {
/**  登录名 */
private String loginName;
/** 角色编码 */
private String roleCode;
@TableField(exist = false)
private String createBy;
@TableField(exist = false)
private Date createTime;
@TableField(exist = false)
private String updateBy;
@TableField(exist = false)
private Date updateTime;
@TableField(exist = false)
private Integer version;
}
@@ -0,0 +1,56 @@
package com.anjiplus.template.gaea.business.modules.accessuser.service;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.AccessUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.GaeaUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.UpdatePasswordDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.param.AccessUserParam;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser;
import java.util.Map;
/**
* @desc AccessUser 用户管理服务接口
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902
**/
public interface AccessUserService extends GaeaBaseService<AccessUserParam, AccessUser> {
/**
* 获取用户的角色树
* @param loginName 被操作的对象
* @param operator 当前登录者
* @return
*/
Map getRoleTree(String loginName, String operator);
/**
* 保存用户的角色树
* @param accessUserDto
* @return
*/
Boolean saveRoleTree(AccessUserDto accessUserDto);
/**
* 重置密码
* @param gaeaUserDto
* @return
*/
Boolean resetPassword(GaeaUserDto gaeaUserDto);
/**
* 用户登录
* @param gaeaUserDto
* @return
*/
GaeaUserDto login(GaeaUserDto gaeaUserDto);
/**
* 修改密码
* @param dto
* @return
*/
Boolean updatePassword(UpdatePasswordDto dto);
}
@@ -0,0 +1,264 @@
package com.anjiplus.template.gaea.business.modules.accessuser.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.anji.plus.gaea.bean.TreeNode;
import com.anji.plus.gaea.cache.CacheHelper;
import com.anji.plus.gaea.constant.BaseOperationEnum;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anji.plus.gaea.exception.BusinessException;
import com.anji.plus.gaea.exception.BusinessExceptionBuilder;
import com.anji.plus.gaea.holder.UserContentHolder;
import com.anji.plus.gaea.utils.GaeaUtils;
import com.anji.plus.gaea.utils.JwtBean;
import com.anjiplus.template.gaea.business.code.ResponseCode;
import com.anjiplus.template.gaea.business.constant.BusinessConstant;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.AccessRoleAuthorityMapper;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.AccessRoleMapper;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRoleAuthority;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.AccessUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.GaeaUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.UpdatePasswordDto;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.AccessUserMapper;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.AccessUserRoleMapper;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUserRole;
import com.anjiplus.template.gaea.business.modules.accessuser.service.AccessUserService;
import com.anjiplus.template.gaea.business.util.MD5Util;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* @desc AccessUser 用户管理服务实现
* @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902
**/
@Service
public class AccessUserServiceImpl implements AccessUserService {
@Autowired
private AccessRoleMapper accessRoleMapper;
@Autowired
private AccessUserMapper accessUserMapper;
@Autowired
private AccessUserRoleMapper accessUserRoleMapper;
@Autowired
private AccessRoleAuthorityMapper accessRoleAuthorityMapper;
@Value("${customer.user.default.password:'123456'}")
private String defaultPassword;
@Override
public GaeaBaseMapper<AccessUser> getMapper() {
return accessUserMapper;
}
@Autowired
private JwtBean jwtBean;
@Autowired
private CacheHelper cacheHelper;
@Override
public Map getRoleTree(String loginName, String operator) {
Map<String, Object> result = new HashMap<String, Object>();
List<TreeNode> treeData = new ArrayList<>();
List checkedKeys = new ArrayList();
// 角色树
LambdaQueryWrapper<AccessRole> roleQuery = Wrappers.lambdaQuery();
roleQuery.select(AccessRole::getRoleCode, AccessRole::getRoleName);
// 按operator去筛选role 后面再加where
List<AccessRole> roleList = accessRoleMapper.selectList(roleQuery);
if (roleList == null || roleList.isEmpty()) {
result.put("treeData", treeData);
result.put("checkedKeys", checkedKeys);
return result;
}
treeData = roleList.stream().map(role -> {
TreeNode treeNode = new TreeNode();
treeNode.setId(role.getRoleCode());
treeNode.setLabel(role.getRoleName());
return treeNode;
}).collect(Collectors.toList());
// 该用户已保存的角色
LambdaQueryWrapper<AccessUserRole> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.select(AccessUserRole::getRoleCode).eq(AccessUserRole::getLoginName, loginName);
checkedKeys = accessUserRoleMapper.selectObjs(queryWrapper);
result.put("treeData", treeData);
result.put("checkedKeys", checkedKeys);
return result;
}
@Override
public Boolean saveRoleTree(AccessUserDto accessUserDto) {
// 校验
String loginName = accessUserDto.getLoginName();
List<String> roleCodeList = accessUserDto.getRoleCodeList();
if (StringUtils.isBlank(loginName)) {
throw BusinessExceptionBuilder.build(ResponseCode.NOT_EMPTY, loginName);
}
if (roleCodeList == null || roleCodeList.isEmpty()) {
throw BusinessExceptionBuilder.build(ResponseCode.NOT_EMPTY, roleCodeList);
}
// 先清除该用户已保存的角色
LambdaQueryWrapper<AccessUserRole> wrapper = Wrappers.lambdaQuery();
wrapper.eq(AccessUserRole::getLoginName, loginName);
accessUserRoleMapper.delete(wrapper);
// 保存勾选的角色
roleCodeList.stream().forEach(roleCode -> {
AccessUserRole accessUserRole = new AccessUserRole();
accessUserRole.setLoginName(loginName);
accessUserRole.setRoleCode(roleCode);
accessUserRoleMapper.insert(accessUserRole);
});
return true;
}
@Override
public Boolean resetPassword(GaeaUserDto gaeaUserDto) {
return false;
}
@Override
public GaeaUserDto login(GaeaUserDto gaeaUserDto) {
String loginName = gaeaUserDto.getLoginName();
String password = gaeaUserDto.getPassword();
// 1.判断用户是否存在
LambdaQueryWrapper<AccessUser> wrapper = Wrappers.lambdaQuery();
wrapper.eq(AccessUser::getLoginName, loginName);
AccessUser accessUser = accessUserMapper.selectOne(wrapper);
if (null == accessUser) {
throw BusinessExceptionBuilder.build(ResponseCode.LOGIN_ERROR);
}
// 2.密码错误
if (!accessUser.getPassword().equals(MD5Util.encrypt(password))) {
throw BusinessExceptionBuilder.build(ResponseCode.USER_PASSWORD_ERROR);
}
// 3.如果该用户登录未过期,这里允许一个用户在多个终端登录
String tokenKey = String.format(BusinessConstant.GAEA_SECURITY_LOGIN_TOKEN, loginName);
String token = "";
GaeaUserDto gaeaUser = new GaeaUserDto();
if (cacheHelper.exist(tokenKey)) {
token = cacheHelper.stringGet(tokenKey);
}
else {
// 生成用户token
String uuid = GaeaUtils.UUID();
token = jwtBean.createToken(loginName, uuid);
cacheHelper.stringSetExpire(tokenKey, token, 3600);
}
// 4.读取用户最新人权限主信息
String userKey = String.format(BusinessConstant.GAEA_SECURITY_LOGIN_USER, loginName);
// 为了兼容底层其他数据库,不再写自定义sql
// List<String> authorities =
// accessUserMapper.queryAuthoritiesByLoginName(loginName);
// 当前用户的roleCode集合
LambdaQueryWrapper<AccessUserRole> accessUserWrapper = Wrappers.lambdaQuery();
accessUserWrapper.select(AccessUserRole::getRoleCode);
accessUserWrapper.eq(AccessUserRole::getLoginName, loginName);
List<AccessUserRole> accessUserRoles = accessUserRoleMapper.selectList(accessUserWrapper);
Set<String> roleCodeSet = accessUserRoles.stream().map(AccessUserRole::getRoleCode).collect(Collectors.toSet());
if (roleCodeSet.size() < 1) {
gaeaUser.setAuthorities(new ArrayList<>());
}
else {
LambdaQueryWrapper<AccessRoleAuthority> accessRoleAuthorityWrapper = Wrappers.lambdaQuery();
accessRoleAuthorityWrapper.select(AccessRoleAuthority::getTarget, AccessRoleAuthority::getAction);
accessRoleAuthorityWrapper.in(AccessRoleAuthority::getRoleCode, roleCodeSet);
List<AccessRoleAuthority> accessRoleAuthorities = accessRoleAuthorityMapper
.selectList(accessRoleAuthorityWrapper);
List<String> authorities = accessRoleAuthorities.stream().map(accessRoleAuthority -> accessRoleAuthority
.getTarget().concat(":").concat(accessRoleAuthority.getAction())).distinct()
.collect(Collectors.toList());
gaeaUser.setAuthorities(authorities);
}
gaeaUser.setLoginName(loginName);
gaeaUser.setRealName(accessUser.getRealName());
gaeaUser.setToken(token);
String gaeaUserStr = JSONObject.toJSONString(gaeaUser);
cacheHelper.stringSetExpire(userKey, gaeaUserStr, 3600);
return gaeaUser;
}
/**
* 修改密码
* @param dto
* @return
*/
@Override
public Boolean updatePassword(UpdatePasswordDto dto) {
if (!dto.getConfirmPassword().equals(dto.getPassword())) {
// 密码和确认密码不一致
throw BusinessExceptionBuilder.build(ResponseCode.USER_INCONSISTENT_PASSWORD_ERROR);
}
// 新密码不能与老密码一样
if (StringUtils.equals(dto.getOldPassword(), dto.getPassword())) {
throw BusinessExceptionBuilder.build(ResponseCode.USER_PASSWORD_CONFIG_PASSWORD_CANOT_EQUAL);
}
String username = UserContentHolder.getUsername();
LambdaQueryWrapper<AccessUser> wrapper = Wrappers.lambdaQuery();
wrapper.eq(AccessUser::getLoginName, username);
AccessUser accessUser = selectOne(wrapper);
String password = accessUser.getPassword();
if (!MD5Util.encrypt(dto.getOldPassword()).equals(password)) {
throw BusinessExceptionBuilder.build(ResponseCode.USER_OLD_PASSWORD_ERROR);
}
accessUser.setPassword(MD5Util.encrypt(dto.getPassword()));
accessUserMapper.updateById(accessUser);
return true;
}
/**
* 操作前处理
* @param entity 前端传递的对象
* @param operationEnum 操作类型
* @throws BusinessException 阻止程序继续执行或回滚事务
*/
@Override
public void processBeforeOperation(AccessUser entity, BaseOperationEnum operationEnum) throws BusinessException {
// 过滤密码
switch (operationEnum) {
case INSERT:
// gaea是为了和前端加密保持一致
entity.setPassword(MD5Util.encrypt(MD5Util.encrypt(defaultPassword.concat("gaea"))));
break;
case UPDATE:
// 更新用户不允许修改密码
entity.setPassword(null);
break;
default:
break;
}
}
}
@@ -0,0 +1,108 @@
package com.anjiplus.template.gaea.business.modules.dashboard.controller;
import com.anji.plus.gaea.annotation.Permission;
import com.anji.plus.gaea.annotation.log.GaeaAuditLog;
import com.anji.plus.gaea.bean.ResponseBean;
import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ChartDto;
import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ReportDashboardObjectDto;
import com.anjiplus.template.gaea.business.modules.dashboard.service.ReportDashboardService;
import com.anjiplus.template.gaea.business.modules.reportshare.controller.dto.ReportShareDto;
import com.anjiplus.template.gaea.business.modules.reportshare.service.ReportShareService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @desc 大屏设计 controller
* @website https://gitee.com/anji-plus/gaea
* @author Raod
* @date 2021-04-12 14:52:21.761
**/
@RestController
@Api(tags = "大屏设计管理")
@Permission(code = "bigScreenManage", name = "大屏报表")
@RequestMapping("/reportDashboard")
public class ReportDashboardController {
@Autowired
private ReportDashboardService reportDashboardService;
@Autowired
private ReportShareService reportShareService;
/**
* 预览、查询大屏详情
* @param reportCode
* @return
*/
@GetMapping({ "/{reportCode}" })
@Permission(code = "view", name = "查看大屏")
public ResponseBean detail(@PathVariable("reportCode") String reportCode) {
return ResponseBean.builder().data(reportDashboardService.getDetail(reportCode)).build();
}
/**
* 保存大屏设计
* @param dto
* @return
*/
@PostMapping
@Permission(code = "design", name = "设计大屏")
@GaeaAuditLog(pageTitle = "新增")
public ResponseBean insert(@RequestBody ReportDashboardObjectDto dto) {
reportDashboardService.insertDashboard(dto);
return ResponseBean.builder().build();
}
/**
* 获取去单个图层数据
* @param dto
* @return
*/
@PostMapping("/getData")
@Permission(code = "view", name = "查看大屏")
public ResponseBean getData(@RequestBody ChartDto dto) {
return ResponseBean.builder().data(reportDashboardService.getChartData(dto)).build();
}
/**
* 导出大屏
* @param reportCode
* @return
*/
@GetMapping("/export")
@Permission(code = "export", name = "导出大屏")
public ResponseEntity<byte[]> exportDashboard(HttpServletRequest request, HttpServletResponse response,
@RequestParam("reportCode") String reportCode,
@RequestParam(value = "showDataSet", required = false, defaultValue = "1") Integer showDataSet) {
return reportDashboardService.exportDashboard(request, response, reportCode, showDataSet);
}
/**
* 导入大屏
* @param file 导入的zip文件
* @param reportCode
* @return
*/
@PostMapping("/import/{reportCode}")
@Permission(code = "import", name = "导入大屏")
public ResponseBean importDashboard(@RequestParam("file") MultipartFile file,
@PathVariable("reportCode") String reportCode) {
reportDashboardService.importDashboard(file, reportCode);
return ResponseBean.builder().build();
}
@PostMapping("/share")
@GaeaAuditLog(pageTitle = "分享")
public ResponseBean share(@Validated @RequestBody ReportShareDto dto) {
return ResponseBean.builder().data(reportShareService.insertShare(dto)).build();
}
}
@@ -0,0 +1,48 @@
package com.anjiplus.template.gaea.business.modules.dashboard.controller.dto;
import lombok.Data;
import java.io.Serializable;
import java.util.Map;
/**
* @description 大屏设计 dto
* @author Raod
* @date 2021-04-12 14:52:21.761
**/
@Data
public class ChartDto implements Serializable {
private String chartType;
/** 数据集编码 */
private String setCode;
/** 传入的自定义参数 */
private Map<String, Object> contextData;
/** 图表属性 */
private Map<String, String> chartProperties;
/** 时间字段 */
private String timeLineFiled;
/** 时间颗粒度 */
private String particles;
/** 时间格式化 */
private String dataTimeFormat;
/** 时间展示层 */
private String timeLineFormat;
private int timeUnit;
/** 时间区间 */
private String startTime;
/** 时间区间 */
private String endTime;
}
@@ -0,0 +1,54 @@
package com.anjiplus.template.gaea.business.modules.dashboard.controller.dto;
import com.anji.plus.gaea.curd.dto.GaeaBaseDTO;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.controller.dto.ReportDashboardWidgetDto;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @description 大屏设计 dto
* @author Raod
* @date 2021-04-12 14:52:21.761
**/
@Data
public class ReportDashboardDto extends GaeaBaseDTO implements Serializable {
/** 报表编码 */
private String reportCode;
/** 看板标题 */
private String title;
/** 宽度px */
private Long width;
/** 高度px */
private Long height;
/** 背景色 */
private String backgroundColor;
/** 背景图片 */
private String backgroundImage;
/** 工作台中的辅助线 */
private String presetLine;
/** 自动刷新间隔秒,数据字典REFRESH_TYPE */
private Integer refreshSeconds;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer enableFlag;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
private Integer deleteFlag;
/** 排序,降序 */
private Integer sort;
private List<ReportDashboardWidgetDto> widgets;
}
@@ -0,0 +1,31 @@
package com.anjiplus.template.gaea.business.modules.dashboard.controller.dto;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.controller.dto.ReportDashboardWidgetDto;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @description 大屏设计 dto
* @author Raod
* @date 2021-04-12 14:52:21.761
**/
@Data
public class ReportDashboardObjectDto implements Serializable {
/** 报表编码 */
private String reportCode;
/**
* 报表编码
*/
private ReportDashboardDto dashboard;
/**
* 大屏画布中的组件
*/
private List<ReportDashboardWidgetDto> widgets;
}
@@ -0,0 +1,17 @@
/**/
package com.anjiplus.template.gaea.business.modules.dashboard.controller.param;
import com.anji.plus.gaea.curd.params.PageParam;
import lombok.Data;
import java.io.Serializable;
/**
* @desc ReportDashboard 大屏设计查询输入类
* @author Raod
* @date 2021-04-12 14:52:21.761
**/
@Data
public class ReportDashboardParam extends PageParam implements Serializable {
}
Loaded 100 of 426 files, more files were not shown because too many files have changed in this diff. Show more