Merge remote-tracking branch 'origin/main' into main

This commit is contained in:
wangjiahao 2021-06-03 14:01:33 +08:00
commit 0a99716b09
23 changed files with 156 additions and 115 deletions

View File

@ -6,7 +6,6 @@ import io.dataease.auth.entity.TokenInfo;
import io.dataease.auth.service.AuthUserService;
import io.dataease.auth.util.JWTUtils;
import io.dataease.commons.utils.CommonBeanFactory;
import io.dataease.commons.utils.ServletUtils;
import io.dataease.i18n.Translator;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authc.AuthenticationException;

View File

@ -84,24 +84,17 @@ public class JWTUtils {
*/
public static boolean loginExpire(String token){
if (Login_Interval==0) {
String property = CommonBeanFactory.getBean(Environment.class).getProperty("dataease.login_timeout");
// 默认超时时间是8h
int minute = StringUtils.isNotEmpty(property) ? Integer.parseInt(property): (8*60);
int minute = CommonBeanFactory.getBean(Environment.class).getProperty("dataease.login_timeout", Integer.class, 8*60);
// 分钟换算成毫秒
Login_Interval = minute * 1000 * 60;
}
Long now = System.currentTimeMillis();
Long lastOperateTime = tokenLastOperateTime(token);
if (ObjectUtils.isEmpty(lastOperateTime)) return true;
boolean isExpire = false;
if (lastOperateTime != null) {
isExpire = now - lastOperateTime > Login_Interval;
}
if (isExpire) {
// System.out.println("-----------------------");
// System.out.println("-----上次操作时间是["+lastOperateTime+"]-----");
// System.out.println("-----当前操作时间是["+now+"]-----");
// System.out.println("-----------------------");
}
return isExpire;
}
@ -116,7 +109,7 @@ public class JWTUtils {
}
/**
* 生成签名,5min后过期
* 生成签名,1min后过期
* @param tokenInfo 用户信息
* @param secret 用户的密码
* @return 加密的token

View File

@ -7,12 +7,13 @@ import io.dataease.dto.panel.PanelSharePo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface ExtPanelShareMapper {
int batchInsert(@Param("shares") List<PanelShare> shares);
List<PanelSharePo> query(GridExample example);
List<PanelSharePo> query(Map<String, Object> param);
List<PanelShare> queryWithResource(GridExample example);
}

View File

@ -16,16 +16,17 @@
</foreach>
</insert>
<select id="query" parameterType="io.dataease.base.mapper.ext.query.GridExample" resultMap="treeNodeMap">
<select id="query" resultMap="treeNodeMap">
select distinct s.panel_group_id as id, g.create_by as creator, g.name
from panel_share s
left join panel_group g on g.id = s.panel_group_id
<if test="_parameter != null">
<include refid="io.dataease.base.mapper.ext.query.GridSql.gridCondition" />
</if>
<if test="orderByClause != null">
order by ${orderByClause}
</if>
where
( s.target_id = #{userId} and s.type = 0 ) or
( s.target_id = #{deptId} and s.type = 1 ) or
s.target_id in
<foreach collection="roleIds" item="roleId" open='(' separator=',' close=')'>
#{roleId}
</foreach>
<if test="orderByClause == null">
order by s.create_time desc
</if>

View File

@ -21,18 +21,21 @@
<result column="dept_name" property="deptName" />
</association>
<association property="dept" column="dept_id" javaType="io.dataease.controller.sys.response.SysUserDept" resultMap="sysUserDept"/>
<collection property="roles" ofType="io.dataease.controller.sys.response.SysUserRole" >
<id column="role_id" property="roleId" />
<result column="role_name" property="roleName"/>
<collection property="roles"
javaType="java.util.ArrayList"
ofType="io.dataease.controller.sys.response.SysUserRole"
column="user_id"
select="queryRole">
</collection>
</resultMap>
<select id="query" parameterType="io.dataease.base.mapper.ext.query.GridExample" resultMap="BaseResultMap">
select u.*,u.user_id as id, r.role_id,r.name as role_name , d.pid, d.name as dept_name
from sys_user u left join sys_users_roles ur on u.user_id = ur.user_id
left join sys_role r on r.role_id = ur.role_id
select u.*,u.user_id as id, d.pid, d.name as dept_name
from sys_user u
left join sys_dept d on d.dept_id = u.dept_id
<if test="_parameter != null">
@ -45,4 +48,11 @@
order by u.update_time desc
</if>
</select>
<select id="queryRole" resultMap="sysUserRole">
select r.role_id, r.name as role_name
from sys_users_roles sur
left join sys_role r on r.role_id = sur.role_id
where sur.user_id = #{user_id}
</select>
</mapper>

View File

@ -202,7 +202,7 @@ public class JdbcProvider extends DatasourceProvider {
tableFiled.setFieldSize(Integer.valueOf(resultSet.getString("COLUMN_SIZE")));
String dbType = resultSet.getString("TYPE_NAME");
tableFiled.setFieldType(dbType);
if(StringUtils.isNotEmpty(dbType) && dbType.equalsIgnoreCase("date") && tableFiled.getFieldSize() < 50 ){
if(StringUtils.isNotEmpty(dbType) && dbType.toLowerCase().contains("date") && tableFiled.getFieldSize() < 50 ){
tableFiled.setFieldSize(50);
}
list.add(tableFiled);

View File

@ -73,12 +73,17 @@ public class ScheduleManager {
triggerBuilder.withIdentity(triggerKey);
Date nTimeByCron = getNTimeByCron(cron);
if (startTime.before(new Date())) {
triggerBuilder.startAt(getNTimeByCron(cron));
triggerBuilder.startAt(nTimeByCron);
}
if (endTime != null) {
triggerBuilder.endAt(endTime);
if (endTime.before(nTimeByCron)) {
triggerBuilder.endAt(nTimeByCron);
} else {
triggerBuilder.endAt(endTime);
}
}
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
@ -151,12 +156,17 @@ public class ScheduleManager {
triggerBuilder.withIdentity(triggerKey);// 触发器名,触发器组
Date nTimeByCron = getNTimeByCron(cron);
if (startTime.before(new Date())) {
triggerBuilder.startAt(getNTimeByCron(cron));
triggerBuilder.startAt(nTimeByCron);
}
if (endTime != null) {
triggerBuilder.endAt(endTime);
if (endTime.before(nTimeByCron)) {
triggerBuilder.endAt(nTimeByCron);
} else {
triggerBuilder.endAt(endTime);
}
}
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 触发器时间设定

View File

@ -132,6 +132,8 @@ public class DataSetTableService {
dataSetTableFieldsService.deleteByTableId(id);
// 删除同步任务
dataSetTableTaskService.deleteByTableId(id);
// 删除关联关系
dataSetTableUnionService.deleteUnionByTableId(id);
try {
deleteDorisTable(id, table);
} catch (Exception e) {
@ -359,7 +361,7 @@ public class DataSetTableService {
datasourceRequest.setDatasource(ds);
String sql = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class).getSql();
// 使用输入的sql先预执行一次,并拿到所有字段
if(StringUtils.isEmpty(sql)){
if (StringUtils.isEmpty(sql)) {
throw new Exception(Translator.get("i18n_sql_not_empty"));
}
datasourceRequest.setQuery(sql);

View File

@ -76,6 +76,14 @@ public class DataSetTableUnionService {
return sourceList;
}
public void deleteUnionByTableId(String tableId) {
DatasetTableUnionExample datasetTableUnionExample = new DatasetTableUnionExample();
DatasetTableUnionExample.Criteria criteriaSource = datasetTableUnionExample.createCriteria().andSourceTableIdEqualTo(tableId);
DatasetTableUnionExample.Criteria criteriaTarget = datasetTableUnionExample.createCriteria().andTargetTableIdEqualTo(tableId);
datasetTableUnionExample.or(criteriaTarget);
datasetTableUnionMapper.deleteByExample(datasetTableUnionExample);
}
private void checkUnion(DatasetTableUnion datasetTableUnion) {
// check 关联关系是否存在
DatasetTableUnionExample datasetTableUnionExample = new DatasetTableUnionExample();

View File

@ -27,10 +27,6 @@ import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
@ -38,8 +34,6 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.pentaho.di.cluster.SlaveServer;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.util.HttpClientManager;
import org.pentaho.di.core.util.Utils;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobExecutionConfiguration;
import org.pentaho.di.job.JobHopMeta;
@ -57,7 +51,6 @@ import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.steps.excelinput.ExcelInputField;
import org.pentaho.di.trans.steps.excelinput.ExcelInputMeta;
import org.pentaho.di.trans.steps.excelinput.SpreadSheetType;
import org.pentaho.di.trans.steps.sql.ExecSQLMeta;
import org.pentaho.di.trans.steps.tableinput.TableInputMeta;
import org.pentaho.di.trans.steps.textfileoutput.TextFileField;
import org.pentaho.di.trans.steps.textfileoutput.TextFileOutputMeta;
@ -70,16 +63,11 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.naming.AuthenticationException;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
@Service
@ -133,7 +121,7 @@ public class ExtractDataService {
switch (datasetTableField.getDeExtractType()) {
case 0:
if (datasetTableField.getSize() > 65533) {
Column_Fields = Column_Fields + "String" + ",`";
Column_Fields = Column_Fields + "varchar(65533)" + ",`";
} else {
Column_Fields = Column_Fields + "varchar(lenth)".replace("lenth", String.valueOf(datasetTableField.getSize())) + ",`";
}
@ -513,9 +501,14 @@ public class ExtractDataService {
tmpSql = tmpSql + " limit 0";
}
datasourceRequest.setQuery(tmpSql);
return String.join(",", datasourceProvider.fetchResultField(datasourceRequest).stream().map(TableFiled::getFieldName).collect(Collectors.toList()));
List<String>dorisFileds = new ArrayList<>();
datasourceProvider.fetchResultField(datasourceRequest).stream().map(TableFiled::getFieldName).forEach(filed ->{
dorisFileds.add(DorisTableUtils.columnName(filed));
});
return String.join(",", dorisFileds);
}
private void generateTransFile(String extractType, DatasetTable datasetTable, Datasource datasource, List<DatasetTableField> datasetTableFields, String selectSQL) throws Exception {
TransMeta transMeta = new TransMeta();
String dorisOutputTable = null;
@ -532,6 +525,7 @@ public class ExtractDataService {
case mysql:
MysqlConfigration mysqlConfigration = new Gson().fromJson(datasource.getConfiguration(), MysqlConfigration.class);
dataMeta = new DatabaseMeta("db", "MYSQL", "Native", mysqlConfigration.getHost(), mysqlConfigration.getDataBase(), mysqlConfigration.getPort().toString(), mysqlConfigration.getUsername(), mysqlConfigration.getPassword());
dataMeta.addExtraOption("MYSQL","characterEncoding", "UTF-8");
transMeta.addDatabase(dataMeta);
if (extractType.equalsIgnoreCase("all_scope")) {
String tableName = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class).getTable();

View File

@ -23,6 +23,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -92,7 +93,14 @@ public class ShareService {
Long deptId = user.getDeptId();
List<Long> roleIds = user.getRoles().stream().map(CurrentRoleDto::getId).collect(Collectors.toList());
List<Long> targetIds = new ArrayList<>();
Map<String, Object> param = new HashMap<>();
param.put("userId", userId);
param.put("deptId", deptId);
param.put("roleIds", roleIds);
List<PanelSharePo> datas = extPanelShareMapper.query(param);
/*List<Long> targetIds = new ArrayList<>();
targetIds.add(userId);
targetIds.add(deptId);
targetIds.addAll(roleIds);
@ -105,14 +113,15 @@ public class ShareService {
request.setConditions(new ArrayList<ConditionEntity>(){{add(condition);}});
GridExample example = request.convertExample();
List<PanelSharePo> datas = extPanelShareMapper.query(example);
List<PanelSharePo> datas = extPanelShareMapper.query(example);*/
List<PanelShareDto> dtoLists = datas.stream().map(po -> BeanUtils.copyBean(new PanelShareDto(), po)).collect(Collectors.toList());
return convertTree(dtoLists);
}
//List构建Tree
private List<PanelShareDto> convertTree(List<PanelShareDto> datas){
Map<String, List<PanelShareDto>> map = datas.stream().filter(panelShareDto -> StringUtils.isNotEmpty(panelShareDto.getCreator())).collect(Collectors.groupingBy(PanelShareDto::getCreator));
String username = AuthUtils.getUser().getUsername();
Map<String, List<PanelShareDto>> map = datas.stream().filter(panelShareDto -> StringUtils.isNotEmpty(panelShareDto.getCreator()) && !StringUtils.equals(username, panelShareDto.getCreator())).collect(Collectors.groupingBy(PanelShareDto::getCreator));
return map.entrySet().stream().map(entry -> {
PanelShareDto panelShareDto = new PanelShareDto();
panelShareDto.setName(entry.getKey());

View File

@ -29,7 +29,7 @@
<defaultCache
eternal="false"
maxElementsInMemory="1000"
overflowToDisk="false"
overflowToDisk="true"
diskPersistent="false"
timeToIdleSeconds="0"
timeToLiveSeconds="600"
@ -38,46 +38,46 @@
<cache
name="users_info"
eternal="false"
maxElementsInMemory="100"
maxElementsOnDisk="1000"
maxElementsInMemory="1000"
maxElementsOnDisk="0"
overflowToDisk="true"
diskPersistent="true"
timeToIdleSeconds="1800"
timeToLiveSeconds="3600"
diskPersistent="false"
timeToIdleSeconds="28800"
timeToLiveSeconds="36000"
memoryStoreEvictionPolicy="LRU"
/>
<cache
name="users_roles_info"
eternal="false"
maxElementsInMemory="100"
maxElementsOnDisk="1000"
maxElementsInMemory="1000"
maxElementsOnDisk="0"
overflowToDisk="true"
diskPersistent="true"
timeToIdleSeconds="1800"
timeToLiveSeconds="3600"
diskPersistent="false"
timeToIdleSeconds="28800"
timeToLiveSeconds="36000"
memoryStoreEvictionPolicy="LRU"
/>
<cache
name="users_permissions_info"
eternal="false"
maxElementsInMemory="100"
maxElementsOnDisk="1000"
maxElementsInMemory="1000"
maxElementsOnDisk="0"
overflowToDisk="true"
diskPersistent="true"
timeToIdleSeconds="1800"
timeToLiveSeconds="3600"
diskPersistent="false"
timeToIdleSeconds="28800"
timeToLiveSeconds="36000"
memoryStoreEvictionPolicy="LRU"
/>
<cache
name="tokens_expire"
eternal="false"
maxElementsInMemory="100"
maxElementsOnDisk="1000"
maxElementsInMemory="1000"
maxElementsOnDisk="0"
overflowToDisk="true"
diskPersistent="true"
timeToIdleSeconds="1800"
timeToLiveSeconds="3600"
diskPersistent="false"
timeToIdleSeconds="28800"
timeToLiveSeconds="36000"
memoryStoreEvictionPolicy="LRU"
/>

View File

@ -119,11 +119,11 @@ export function fieldValues(fieldId) {
})
}
export function isKettleRunning() {
export function isKettleRunning(showLoading = true) {
return request({
url: '/dataset/group/isKettleRunning',
method: 'post',
loading: true
loading: showLoading
})
}

View File

@ -158,7 +158,7 @@ export default {
}
</script>
<style lang="css">
<style lang="css" scoped>
.cron {
text-align: left;
padding: 10px;

View File

@ -238,7 +238,9 @@ div:focus {
color: #23beef;
margin: 0 2px 0 0;
}
.el-popper{
position: fixed!important;
.showRightPanel{
.el-popper{
position: fixed!important;
}
}

View File

@ -20,6 +20,7 @@ import Group from './group/Group'
import ChartHome from './data/ChartHome'
import ChartEdit from './view/ChartEdit'
import { removeClass } from '@/utils'
export default {
name: 'Chart',
@ -30,6 +31,9 @@ export default {
param: {}
}
},
mounted() {
removeClass(document.body, 'showRightPanel')
},
methods: {
switchComponent(c) {
this.param = c.param
@ -49,7 +53,7 @@ export default {
<style scoped>
.ms-aside-container {
height: calc(100vh - 56px);
padding: 15px;
padding: 10px 15px;
min-width: 260px;
max-width: 460px;
}

View File

@ -281,7 +281,7 @@ export default {
}
.span-number{
color: #f18126;
color: #0a7be0;
}
.table-count{
color: #606266;

View File

@ -335,7 +335,7 @@ export default {
font-size: 14px;
}
.span-number{
color: #f18126;
color: #0a7be0;
}
.table-count{
color: #606266;

View File

@ -188,7 +188,7 @@ export default {
},
methods: {
kettleState() {
isKettleRunning().then(res => {
isKettleRunning(false).then(res => {
this.kettleRunning = res.data
})
},

View File

@ -25,6 +25,7 @@ import AddSQL from './add/AddSQL'
import AddExcel from './add/AddExcel'
import AddCustom from './add/AddCustom'
import FieldEdit from './data/FieldEdit'
import { removeClass } from '@/utils'
export default {
name: 'DataSet',
@ -35,6 +36,9 @@ export default {
param: {}
}
},
mounted() {
removeClass(document.body, 'showRightPanel')
},
methods: {
switchComponent(c) {
this.param = c.param
@ -69,14 +73,14 @@ export default {
<style scoped>
.ms-aside-container {
height: calc(100vh - 56px);
padding: 15px;
padding: 10px 15px;
min-width: 260px;
max-width: 460px;
}
.ms-main-container {
height: calc(100vh - 56px);
padding: 15px 15px 0 15px;
padding: 10px 15px 0 15px;
}
</style>

View File

@ -1,5 +1,5 @@
<template xmlns:el-col="http://www.w3.org/1999/html">
<el-col style="padding: 0 10px 0 10px;">
<el-col style="padding: 0 5px 0 5px;">
<el-col>
<el-row>
<span class="header-title">{{ $t('panel.default_panel') }}</span>

View File

@ -1,6 +1,6 @@
<template>
<de-container>
<de-aside-container>
<de-aside-container style="padding: 0 10px;">
<el-tabs v-model="activeName" class="tab-panel" :stretch="true" @tab-click="handleClick">
<el-tab-pane name="PanelList">
<span slot="label"><i class="el-icon-document" />{{ $t('panel.panel_list') }}</span>
@ -107,4 +107,8 @@ export default {
.tab-panel>>>.el-tabs__nav-wrap::after {
height: 1px;
}
.tab-panel>>>.el-tabs__item{
/* width: 10px; */
padding: 0 10px;
}
</style>

View File

@ -3,39 +3,40 @@
<el-col v-if="panelInfo.name.length>0" class="panel-design">
<el-row class="panel-design-head">
<!--仪表板头部区域-->
<el-col :span="12" style="text-overflow:ellipsis;overflow: hidden;white-space: nowrap;font-size: 14px">
<span>{{ panelInfo.name || '测试仪表板' }}</span>
</el-col>
<el-col :span="12">
<span v-if="hasDataPermission('export',panelInfo.privileges)" style="float: right;margin-right: 10px">
<el-tooltip :content="$t('panel.save_to_panel')">
<el-button class="el-icon-folder-checked" size="mini" circle @click="saveToTemplate" />
</el-tooltip>
</span>
<span v-if="hasDataPermission('export',panelInfo.privileges)" style="float: right;margin-right: 10px">
<el-tooltip :content="$t('panel.export_to_panel')">
<el-button class="el-icon-download" size="mini" circle @click="downloadToTemplate" />
</el-tooltip>
</span>
<span style="float: right;margin-right: 10px">
<el-tooltip :content="$t('panel.preview')">
<el-button class="el-icon-view" size="mini" circle @click="clickPreview" />
</el-tooltip>
</span>
<div style="border-bottom: 1px solid #dfe4ed;height: 100%;">
<el-col :span="12" style="text-overflow:ellipsis;overflow: hidden;white-space: nowrap;font-size: 14px">
<span>{{ panelInfo.name || '测试仪表板' }}</span>
</el-col>
<el-col :span="12">
<span v-if="hasDataPermission('export',panelInfo.privileges)" style="float: right;margin-right: 10px">
<el-tooltip :content="$t('panel.save_to_panel')">
<el-button class="el-icon-folder-checked" size="mini" circle @click="saveToTemplate" />
</el-tooltip>
</span>
<span v-if="hasDataPermission('export',panelInfo.privileges)" style="float: right;margin-right: 10px">
<el-tooltip :content="$t('panel.export_to_panel')">
<el-button class="el-icon-download" size="mini" circle @click="downloadToTemplate" />
</el-tooltip>
</span>
<span style="float: right;margin-right: 10px">
<el-tooltip :content="$t('panel.preview')">
<el-button class="el-icon-view" size="mini" circle @click="clickPreview" />
</el-tooltip>
</span>
<span v-if="!hasStar && panelInfo" style="float: right;margin-right: 10px">
<el-tooltip :content="$t('panel.store')">
<el-button class="el-icon-star-off" size="mini" circle @click="star" />
</el-tooltip>
</span>
<span v-if="hasStar && panelInfo" style="float: right;margin-right: 10px">
<el-tooltip :content="$t('commons.cancel')">
<el-button class="el-icon-star-on" size="mini" circle @click="unstar" />
</el-tooltip>
</span>
</el-col>
<span v-if="!hasStar && panelInfo" style="float: right;margin-right: 10px">
<el-tooltip :content="$t('panel.store')">
<el-button class="el-icon-star-off" size="mini" circle @click="star" />
</el-tooltip>
</span>
<span v-if="hasStar && panelInfo" style="float: right;margin-right: 10px">
<el-tooltip :content="$t('commons.cancel')">
<el-button class="el-icon-star-on" size="mini" circle @click="unstar" />
</el-tooltip>
</span>
</el-col>
</div>
</el-row>
<!-- 仪表板预览区域-->
<el-row class="panel-design-preview">
@ -217,9 +218,8 @@ export default {
.panel-design-head {
height: 40px;
background-color: white;
padding: 0 6px;
padding: 0 10px;
line-height: 40px;
border-bottom: 1px solid #dfe4ed;
}
.panel-design-preview {