Merge pull request #838 from dataease/dev

Dev
This commit is contained in:
maninhill 2021-09-19 09:37:20 +08:00 committed by GitHub
commit 32e639ee62
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
67 changed files with 2149 additions and 316 deletions

View File

@ -342,11 +342,11 @@
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>-->
<!--<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>-->
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.3.1</version>
</dependency>
</dependencies>
<build>

View File

@ -119,8 +119,11 @@ public class AuthServer implements AuthApi {
if (isOpenOidc()) {
HttpServletRequest request = ServletUtils.request();
String idToken = request.getHeader("IdToken");
OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class);
oidcXpackService.logout(idToken);
if (StringUtils.isNotBlank(idToken)) {
OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class);
oidcXpackService.logout(idToken);
}
}
if (StringUtils.isEmpty(token) || StringUtils.equals("null", token) || StringUtils.equals("undefined", token)) {
return "success";

View File

@ -13,6 +13,8 @@ public interface AuthUserService {
SysUserEntity getUserByName(String username);
SysUserEntity getUserBySub(String sub);
List<String> roles(Long userId);
List<String> permissions(Long userId);

View File

@ -52,6 +52,11 @@ public class AuthUserServiceImpl implements AuthUserService {
return authMapper.findUserByName(username);
}
@Override
public SysUserEntity getUserBySub(String sub) {
return authMapper.findUserBySub(sub);
}
@Override
public List<String> roles(Long userId){
return authMapper.roleCodes(userId);

View File

@ -13,7 +13,6 @@ import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

View File

@ -1,29 +1,28 @@
package io.dataease.base.domain;
import java.io.Serializable;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class Datasource implements Serializable {
@ApiModelProperty("ID")
private String id;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("描述")
private String desc;
@ApiModelProperty("类型")
private String type;
@ApiModelProperty("创建时间")
private Long createTime;
@ApiModelProperty("更新时间")
private Long updateTime;
@ApiModelProperty("创建者")
private String createBy;
@ApiModelProperty("状态")
private String status;
@ApiModelProperty("配置")
private String computeType;
private String configuration;
private static final long serialVersionUID = 1L;

View File

@ -643,6 +643,76 @@ public class DatasourceExample {
addCriterion("`status` not between", value1, value2, "status");
return (Criteria) this;
}
public Criteria andComputeTypeIsNull() {
addCriterion("compute_type is null");
return (Criteria) this;
}
public Criteria andComputeTypeIsNotNull() {
addCriterion("compute_type is not null");
return (Criteria) this;
}
public Criteria andComputeTypeEqualTo(String value) {
addCriterion("compute_type =", value, "computeType");
return (Criteria) this;
}
public Criteria andComputeTypeNotEqualTo(String value) {
addCriterion("compute_type <>", value, "computeType");
return (Criteria) this;
}
public Criteria andComputeTypeGreaterThan(String value) {
addCriterion("compute_type >", value, "computeType");
return (Criteria) this;
}
public Criteria andComputeTypeGreaterThanOrEqualTo(String value) {
addCriterion("compute_type >=", value, "computeType");
return (Criteria) this;
}
public Criteria andComputeTypeLessThan(String value) {
addCriterion("compute_type <", value, "computeType");
return (Criteria) this;
}
public Criteria andComputeTypeLessThanOrEqualTo(String value) {
addCriterion("compute_type <=", value, "computeType");
return (Criteria) this;
}
public Criteria andComputeTypeLike(String value) {
addCriterion("compute_type like", value, "computeType");
return (Criteria) this;
}
public Criteria andComputeTypeNotLike(String value) {
addCriterion("compute_type not like", value, "computeType");
return (Criteria) this;
}
public Criteria andComputeTypeIn(List<String> values) {
addCriterion("compute_type in", values, "computeType");
return (Criteria) this;
}
public Criteria andComputeTypeNotIn(List<String> values) {
addCriterion("compute_type not in", values, "computeType");
return (Criteria) this;
}
public Criteria andComputeTypeBetween(String value1, String value2) {
addCriterion("compute_type between", value1, value2, "computeType");
return (Criteria) this;
}
public Criteria andComputeTypeNotBetween(String value1, String value2) {
addCriterion("compute_type not between", value1, value2, "computeType");
return (Criteria) this;
}
}
public static class Criteria extends GeneratedCriteria {

View File

@ -39,5 +39,7 @@ public class SysUser implements Serializable {
private Integer from;
private String sub;
private static final long serialVersionUID = 1L;
}

View File

@ -1213,6 +1213,76 @@ public class SysUserExample {
addCriterion("`from` not between", value1, value2, "from");
return (Criteria) this;
}
public Criteria andSubIsNull() {
addCriterion("sub is null");
return (Criteria) this;
}
public Criteria andSubIsNotNull() {
addCriterion("sub is not null");
return (Criteria) this;
}
public Criteria andSubEqualTo(String value) {
addCriterion("sub =", value, "sub");
return (Criteria) this;
}
public Criteria andSubNotEqualTo(String value) {
addCriterion("sub <>", value, "sub");
return (Criteria) this;
}
public Criteria andSubGreaterThan(String value) {
addCriterion("sub >", value, "sub");
return (Criteria) this;
}
public Criteria andSubGreaterThanOrEqualTo(String value) {
addCriterion("sub >=", value, "sub");
return (Criteria) this;
}
public Criteria andSubLessThan(String value) {
addCriterion("sub <", value, "sub");
return (Criteria) this;
}
public Criteria andSubLessThanOrEqualTo(String value) {
addCriterion("sub <=", value, "sub");
return (Criteria) this;
}
public Criteria andSubLike(String value) {
addCriterion("sub like", value, "sub");
return (Criteria) this;
}
public Criteria andSubNotLike(String value) {
addCriterion("sub not like", value, "sub");
return (Criteria) this;
}
public Criteria andSubIn(List<String> values) {
addCriterion("sub in", values, "sub");
return (Criteria) this;
}
public Criteria andSubNotIn(List<String> values) {
addCriterion("sub not in", values, "sub");
return (Criteria) this;
}
public Criteria andSubBetween(String value1, String value2) {
addCriterion("sub between", value1, value2, "sub");
return (Criteria) this;
}
public Criteria andSubNotBetween(String value1, String value2) {
addCriterion("sub not between", value1, value2, "sub");
return (Criteria) this;
}
}
public static class Criteria extends GeneratedCriteria {

View File

@ -10,6 +10,7 @@
<result column="update_time" jdbcType="BIGINT" property="updateTime" />
<result column="create_by" jdbcType="VARCHAR" property="createBy" />
<result column="status" jdbcType="VARCHAR" property="status" />
<result column="compute_type" jdbcType="VARCHAR" property="computeType" />
</resultMap>
<resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="io.dataease.base.domain.Datasource">
<result column="configuration" jdbcType="LONGVARCHAR" property="configuration" />
@ -73,7 +74,7 @@
</where>
</sql>
<sql id="Base_Column_List">
id, `name`, `desc`, `type`, create_time, update_time, create_by, `status`
id, `name`, `desc`, `type`, create_time, update_time, create_by, `status`, compute_type
</sql>
<sql id="Blob_Column_List">
configuration
@ -129,12 +130,12 @@
<insert id="insert" parameterType="io.dataease.base.domain.Datasource">
insert into datasource (id, `name`, `desc`,
`type`, create_time, update_time,
create_by, `status`, configuration
)
create_by, `status`, compute_type,
configuration)
values (#{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{desc,jdbcType=VARCHAR},
#{type,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT},
#{createBy,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{configuration,jdbcType=LONGVARCHAR}
)
#{createBy,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{computeType,jdbcType=VARCHAR},
#{configuration,jdbcType=LONGVARCHAR})
</insert>
<insert id="insertSelective" parameterType="io.dataease.base.domain.Datasource">
insert into datasource
@ -163,6 +164,9 @@
<if test="status != null">
`status`,
</if>
<if test="computeType != null">
compute_type,
</if>
<if test="configuration != null">
configuration,
</if>
@ -192,6 +196,9 @@
<if test="status != null">
#{status,jdbcType=VARCHAR},
</if>
<if test="computeType != null">
#{computeType,jdbcType=VARCHAR},
</if>
<if test="configuration != null">
#{configuration,jdbcType=LONGVARCHAR},
</if>
@ -230,6 +237,9 @@
<if test="record.status != null">
`status` = #{record.status,jdbcType=VARCHAR},
</if>
<if test="record.computeType != null">
compute_type = #{record.computeType,jdbcType=VARCHAR},
</if>
<if test="record.configuration != null">
configuration = #{record.configuration,jdbcType=LONGVARCHAR},
</if>
@ -248,6 +258,7 @@
update_time = #{record.updateTime,jdbcType=BIGINT},
create_by = #{record.createBy,jdbcType=VARCHAR},
`status` = #{record.status,jdbcType=VARCHAR},
compute_type = #{record.computeType,jdbcType=VARCHAR},
configuration = #{record.configuration,jdbcType=LONGVARCHAR}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
@ -262,7 +273,8 @@
create_time = #{record.createTime,jdbcType=BIGINT},
update_time = #{record.updateTime,jdbcType=BIGINT},
create_by = #{record.createBy,jdbcType=VARCHAR},
`status` = #{record.status,jdbcType=VARCHAR}
`status` = #{record.status,jdbcType=VARCHAR},
compute_type = #{record.computeType,jdbcType=VARCHAR}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
@ -291,6 +303,9 @@
<if test="status != null">
`status` = #{status,jdbcType=VARCHAR},
</if>
<if test="computeType != null">
compute_type = #{computeType,jdbcType=VARCHAR},
</if>
<if test="configuration != null">
configuration = #{configuration,jdbcType=LONGVARCHAR},
</if>
@ -306,6 +321,7 @@
update_time = #{updateTime,jdbcType=BIGINT},
create_by = #{createBy,jdbcType=VARCHAR},
`status` = #{status,jdbcType=VARCHAR},
compute_type = #{computeType,jdbcType=VARCHAR},
configuration = #{configuration,jdbcType=LONGVARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update>
@ -317,7 +333,8 @@
create_time = #{createTime,jdbcType=BIGINT},
update_time = #{updateTime,jdbcType=BIGINT},
create_by = #{createBy,jdbcType=VARCHAR},
`status` = #{status,jdbcType=VARCHAR}
`status` = #{status,jdbcType=VARCHAR},
compute_type = #{computeType,jdbcType=VARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper>

View File

@ -19,6 +19,7 @@
<result column="update_time" jdbcType="BIGINT" property="updateTime" />
<result column="language" jdbcType="VARCHAR" property="language" />
<result column="from" jdbcType="INTEGER" property="from" />
<result column="sub" jdbcType="VARCHAR" property="sub" />
</resultMap>
<sql id="Example_Where_Clause">
<where>
@ -81,7 +82,7 @@
<sql id="Base_Column_List">
user_id, dept_id, username, nick_name, gender, phone, email, `password`, is_admin,
enabled, create_by, update_by, pwd_reset_time, create_time, update_time, `language`,
`from`
`from`, sub
</sql>
<select id="selectByExample" parameterType="io.dataease.base.domain.SysUserExample" resultMap="BaseResultMap">
select
@ -119,13 +120,15 @@
email, `password`, is_admin,
enabled, create_by, update_by,
pwd_reset_time, create_time, update_time,
`language`, `from`)
`language`, `from`, sub
)
values (#{userId,jdbcType=BIGINT}, #{deptId,jdbcType=BIGINT}, #{username,jdbcType=VARCHAR},
#{nickName,jdbcType=VARCHAR}, #{gender,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR},
#{email,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{isAdmin,jdbcType=BIT},
#{enabled,jdbcType=BIGINT}, #{createBy,jdbcType=VARCHAR}, #{updateBy,jdbcType=VARCHAR},
#{pwdResetTime,jdbcType=BIGINT}, #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT},
#{language,jdbcType=VARCHAR}, #{from,jdbcType=INTEGER})
#{language,jdbcType=VARCHAR}, #{from,jdbcType=INTEGER}, #{sub,jdbcType=VARCHAR}
)
</insert>
<insert id="insertSelective" parameterType="io.dataease.base.domain.SysUser">
insert into sys_user
@ -181,6 +184,9 @@
<if test="from != null">
`from`,
</if>
<if test="sub != null">
sub,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="userId != null">
@ -234,6 +240,9 @@
<if test="from != null">
#{from,jdbcType=INTEGER},
</if>
<if test="sub != null">
#{sub,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<select id="countByExample" parameterType="io.dataease.base.domain.SysUserExample" resultType="java.lang.Long">
@ -296,6 +305,9 @@
<if test="record.from != null">
`from` = #{record.from,jdbcType=INTEGER},
</if>
<if test="record.sub != null">
sub = #{record.sub,jdbcType=VARCHAR},
</if>
</set>
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
@ -319,7 +331,8 @@
create_time = #{record.createTime,jdbcType=BIGINT},
update_time = #{record.updateTime,jdbcType=BIGINT},
`language` = #{record.language,jdbcType=VARCHAR},
`from` = #{record.from,jdbcType=INTEGER}
`from` = #{record.from,jdbcType=INTEGER},
sub = #{record.sub,jdbcType=VARCHAR}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
@ -375,6 +388,9 @@
<if test="from != null">
`from` = #{from,jdbcType=INTEGER},
</if>
<if test="sub != null">
sub = #{sub,jdbcType=VARCHAR},
</if>
</set>
where user_id = #{userId,jdbcType=BIGINT}
</update>
@ -395,7 +411,8 @@
create_time = #{createTime,jdbcType=BIGINT},
update_time = #{updateTime,jdbcType=BIGINT},
`language` = #{language,jdbcType=VARCHAR},
`from` = #{from,jdbcType=INTEGER}
`from` = #{from,jdbcType=INTEGER},
sub = #{sub,jdbcType=VARCHAR}
where user_id = #{userId,jdbcType=BIGINT}
</update>
</mapper>

View File

@ -25,6 +25,8 @@ public interface AuthMapper {
SysUserEntity findUserByName(@Param("username") String username);
SysUserEntity findUserBySub(@Param("sub") String sub);
List<CurrentRoleDto> roles(@Param("userId") Long userId);

View File

@ -28,6 +28,10 @@
select user_id, username,nick_name, dept_id, password, enabled,email, phone, language ,is_admin from sys_user where username = #{username}
</select>
<select id="findUserBySub" resultMap="baseMap">
select user_id, username,nick_name, dept_id, password, enabled,email, phone, language ,is_admin from sys_user where sub = #{sub}
</select>
<select id="roleCodes" resultType="String">
select r.id from sys_role r
left join sys_users_roles sur on sur.role_id = r.role_id

View File

@ -8,7 +8,7 @@
</resultMap>
<select id="query" parameterType="io.dataease.base.mapper.ext.query.GridExample" resultMap="BaseResultMapDTO">
select id , name , `desc` ,`type` , configuration ,create_time ,update_time,
select datasource.*,
authInfo.privileges as `privileges`
from (select GET_V_AUTH_MODEL_ID_P_USE (#{extendCondition}, 'link') cids) t,datasource
left join (
@ -55,7 +55,7 @@
</select>
<select id="queryUnion" resultMap="BaseResultMapDTO">
select id , name , `desc` ,`type` , configuration ,create_time ,update_time, status,
select datasource.*,
authInfo.privileges as `privileges`
from (select GET_V_AUTH_MODEL_ID_P_USE (#{userId}, 'link') cids) t,datasource
left join (

View File

@ -6,6 +6,7 @@ public class AuthConstants {
public final static String USER_CACHE_NAME = "users_info";
public final static String USER_ROLE_CACHE_NAME = "users_roles_info";
public final static String USER_PERMISSION_CACHE_NAME = "users_permissions_info";
public final static String ID_TOKEN_KEY = "IdToken";
}

View File

@ -95,7 +95,7 @@ public class DateUtils {
}
public static void main(String[] args) throws Exception {
/* public static void main(String[] args) throws Exception {
// System.out.println("start:");
Date paramTime = getTime(getTimeString(new Long("1607672440731")));
@ -110,7 +110,7 @@ public class DateUtils {
// System.out.println(getTimeString(--countTimeLong));
}
} */
/**

View File

@ -68,8 +68,8 @@ public class ExcelReaderUtil {
}
}
public static void main(String[] args) throws Exception {
/* public static void main(String[] args) throws Exception {
String file ="Metersphere_case_DataEase功能用例.xlsx";
ExcelReaderUtil.readExcel(file, new FileInputStream("/Users/taojinlong/Desktop/" + file));
}
} */
}

View File

@ -7,6 +7,7 @@ public enum DatasourceTypes {
sqlServer("sqlServer", "sqlServer", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "\"", "\"", "\"", "\""),
doris("doris", "doris", "com.mysql.jdbc.Driver", "`", "`", "", ""),
oracle("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\""),
ch("ch", "ch", "ru.yandex.clickhouse.ClickHouseDriver", "`", "`", "'", "'"),
es("es", "es", "", "\"", "\"", "\"", "\"");
private String feature;

View File

@ -0,0 +1,19 @@
package io.dataease.datasource.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class CHConfigration extends JdbcDTO {
private String driver = "ru.yandex.clickhouse.ClickHouseDriver";
public String getJdbc() {
// 连接参数先写死后边要把编码时区等参数放到数据源的设置中
return "jdbc:clickhouse://HOSTNAME:PORT/DATABASE"
.replace("HOSTNAME", getHost().trim())
.replace("PORT", getPort().toString().trim())
.replace("DATABASE", getDataBase().trim());
}
}

View File

@ -11,7 +11,7 @@ public class MysqlConfigration extends JdbcDTO {
public String getJdbc() {
// 连接参数先写死后边要把编码时区等参数放到数据源的设置中
return "jdbc:mysql://HOSTNAME:PORT/DATABASE?characterEncoding=UTF-8&connectTimeout=5000"
return "jdbc:mysql://HOSTNAME:PORT/DATABASE?characterEncoding=UTF-8&connectTimeout=5000&useSSL=false"
.replace("HOSTNAME", getHost().trim())
.replace("PORT", getPort().toString().trim())
.replace("DATABASE", getDataBase().trim());

View File

@ -40,7 +40,7 @@ public class JdbcProvider extends DatasourceProvider {
List<String[]> list = new LinkedList<>();
Connection connection = null;
try {
connection = getConnectionFromPool(dsr);
connection = getConnection(dsr);
Statement stat = connection.createStatement();
ResultSet rs = stat.executeQuery(dsr.getQuery());
list = fetchResult(rs);
@ -196,7 +196,7 @@ public class JdbcProvider extends DatasourceProvider {
String queryStr = getTablesSql(datasourceRequest);
Connection con = null;
try {
con = getConnectionFromPool(datasourceRequest);
con = getConnection(datasourceRequest);
Statement statement = con.createStatement();
ResultSet resultSet = statement.executeQuery(queryStr);
while (resultSet.next()) {
@ -250,7 +250,12 @@ public class JdbcProvider extends DatasourceProvider {
ResultSet resultSet = databaseMetaData.getColumns(null, "%", datasourceRequest.getTable(), "%");
while (resultSet.next()) {
String tableName = resultSet.getString("TABLE_NAME");
String database = resultSet.getString("TABLE_CAT");
String database = null;
if(datasourceRequest.getDatasource().getType().equalsIgnoreCase("ch")){
database = resultSet.getString("TABLE_SCHEM");
}else {
database = resultSet.getString("TABLE_CAT");
}
if(database != null){
if (tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDatabase(datasourceRequest))) {
TableFiled tableFiled = getTableFiled(resultSet);
@ -436,6 +441,14 @@ public class JdbcProvider extends DatasourceProvider {
password = pgConfigration.getPassword();
driver = pgConfigration.getDriver();
jdbcurl = pgConfigration.getJdbc();
break;
case ch:
CHConfigration chConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), CHConfigration.class);
username = chConfigration.getUsername();
password = chConfigration.getPassword();
driver = chConfigration.getDriver();
jdbcurl = chConfigration.getJdbc();
break;
default:
break;
}
@ -493,6 +506,14 @@ public class JdbcProvider extends DatasourceProvider {
dataSource.setJdbcUrl(pgConfigration.getJdbc());
jdbcDTO = pgConfigration;
break;
case ch:
CHConfigration chConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), CHConfigration.class);
dataSource.setUser(chConfigration.getUsername());
dataSource.setDriverClass(chConfigration.getDriver());
dataSource.setPassword(chConfigration.getPassword());
dataSource.setJdbcUrl(chConfigration.getJdbc());
jdbcDTO = chConfigration;
break;
default:
break;
}
@ -515,7 +536,8 @@ public class JdbcProvider extends DatasourceProvider {
PgConfigration pgConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), PgConfigration.class);
return pgConfigration.getDataBase();
default:
return null;
JdbcDTO jdbcDTO = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), JdbcDTO.class);
return jdbcDTO.getDataBase();
}
}
@ -546,6 +568,9 @@ public class JdbcProvider extends DatasourceProvider {
throw new Exception(Translator.get("i18n_schema_is_empty"));
}
return "SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg%' AND tablename NOT LIKE 'sql_%' AND schemaname='SCHEMA' ;".replace("SCHEMA", pgConfigration.getSchema());
case ch:
CHConfigration chConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), CHConfigration.class);
return "SELECT name FROM system.tables where database='DATABASE';".replace("DATABASE", chConfigration.getDataBase());
default:
return "show tables;";
}

View File

@ -52,6 +52,8 @@ public class ProviderFactory implements ApplicationContextAware {
return context.getBean("oracleQuery", QueryProvider.class);
case es:
return context.getBean("esQuery", QueryProvider.class);
case ch:
return context.getBean("chQuery", QueryProvider.class);
default:
return context.getBean("mysqlQuery", QueryProvider.class);
}

View File

@ -52,10 +52,10 @@ public class SSOServer {
SSOToken ssoToken = oidcXpackService.requestSsoToken(config, code, state);
SSOUserInfo ssoUserInfo = oidcXpackService.requestUserInfo(config, ssoToken.getAccessToken());
SysUserEntity sysUserEntity = authUserService.getUserByName(ssoUserInfo.getUserName());
SysUserEntity sysUserEntity = authUserService.getUserBySub(ssoUserInfo.getSub());
if(null == sysUserEntity){
sysUserService.saveOIDCUser(ssoUserInfo);
sysUserEntity = authUserService.getUserByName(ssoUserInfo.getUserName());
sysUserEntity = authUserService.getUserBySub(ssoUserInfo.getSub());
}
TokenInfo tokenInfo = TokenInfo.builder().userId(sysUserEntity.getUserId()).username(sysUserEntity.getUsername()).build();
String realPwd = CodingUtil.md5(sysUserService.defaultPWD());

View File

@ -0,0 +1,41 @@
package io.dataease.provider.ch;
import io.dataease.provider.SQLConstants;
import static io.dataease.datasource.constants.DatasourceTypes.ch;
/**
* @Author gin
* @Date 2021/7/8 7:22 下午
*/
public class CHConstants extends SQLConstants {
public static final String KEYWORD_TABLE = ch.getKeywordPrefix() + "%s" + ch.getKeywordSuffix();
public static final String KEYWORD_FIX = "%s." + ch.getKeywordPrefix() + "%s" + ch.getKeywordSuffix();
public static final String toInt32 = "toInt32(%s)";
public static final String toDateTime = "toDateTime(%s)";
public static final String toInt64 = "toInt64(%s)";
public static final String toFloat64 = "toFloat64(%s)";
public static final String formatDateTime = "formatDateTime(%s,'%s')";
public static final String toDecimal = "toDecimal64(%s,2)";
public static final String DEFAULT_DATE_FORMAT = "%Y-%m-%d %H:%M:%S";
public static final String WHERE_VALUE_NULL = "(NULL,'')";
public static final String WHERE_VALUE_VALUE = "'%s'";
public static final String AGG_COUNT = "COUNT(*)";
public static final String AGG_FIELD = "%s(%s)";
public static final String WHERE_BETWEEN = "'%s' AND '%s'";
public static final String BRACKETS = "(%s)";
}

File diff suppressed because it is too large Load Diff

View File

@ -865,6 +865,12 @@ public class DorisQueryProvider extends QueryProvider {
split = "-";
} else if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) {
split = "/";
} else {
split = "-";
}
if (StringUtils.isEmpty(dateStyle)) {
return "%Y-%m-%d %H:%i:%S";
}
switch (dateStyle) {

View File

@ -816,6 +816,12 @@ public class EsQueryProvider extends QueryProvider {
split = "-";
} else if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) {
split = "/";
} else {
split = "-";
}
if (StringUtils.isEmpty(dateStyle)) {
return "YYYY-MM-dd HH:mm:ss";
}
switch (dateStyle) {

View File

@ -859,6 +859,12 @@ public class MysqlQueryProvider extends QueryProvider {
split = "-";
} else if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) {
split = "/";
} else {
split = "-";
}
if (StringUtils.isEmpty(dateStyle)) {
return "%Y-%m-%d %H:%i:%S";
}
switch (dateStyle) {

View File

@ -899,6 +899,12 @@ public class OracleQueryProvider extends QueryProvider {
split = "-";
} else if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) {
split = "/";
} else {
split = "-";
}
if (StringUtils.isEmpty(dateStyle)) {
return OracleConstants.DEFAULT_DATE_FORMAT;
}
switch (dateStyle) {

View File

@ -886,6 +886,12 @@ public class PgQueryProvider extends QueryProvider {
split = "-";
} else if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) {
split = "/";
} else {
split = "-";
}
if (StringUtils.isEmpty(dateStyle)) {
return "'YYYY-MM-DD HH24:MI:SS'";
}
switch (dateStyle) {

View File

@ -13,6 +13,7 @@ import io.dataease.dto.chart.ChartViewFieldDTO;
import io.dataease.dto.sqlObj.SQLObj;
import io.dataease.provider.QueryProvider;
import io.dataease.provider.SQLConstants;
import io.dataease.provider.oracle.OracleConstants;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
@ -825,6 +826,12 @@ public class SqlserverQueryProvider extends QueryProvider {
split = "-";
} else if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) {
split = "/";
} else {
split = "-";
}
if (StringUtils.isEmpty(dateStyle)) {
return "convert(varchar," + originField + ",120)";
}
switch (dateStyle) {

View File

@ -805,21 +805,35 @@ public class DataSetTableService {
String f = field.substring(0, field.length() - 1);
StringBuilder join = new StringBuilder();
List<DataSetTableUnionDTO> unions = new ArrayList<>();
for (DataTableInfoCustomUnion dataTableInfoCustomUnion : dataTableInfoDTO.getList()) {
for (DataSetTableUnionDTO dto : list) {
// 被关联表和自助数据集的表相等
if (StringUtils.equals(dto.getTargetTableId(), dataTableInfoCustomUnion.getTableId())) {
DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId());
DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId());
if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) {
DEException.throwException(Translator.get("i18n_dataset_field_delete"));
}
unions.add(dto);
}
}
}
if (CollectionUtils.isNotEmpty(unions)) {
for (int i = 0; i < unions.size(); i++) {
DataSetTableUnionDTO dto = unions.get(i);
DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId());
DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId());
if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) {
DEException.throwException(Translator.get("i18n_dataset_field_delete"));
}
if (i == 0) {
join.append(convertUnionTypeToSQL(dto.getSourceUnionRelation()))
.append(DorisTableUtils.dorisName(dto.getTargetTableId()))
.append(" ON ")
.append(DorisTableUtils.dorisName(dto.getSourceTableId())).append(".").append(sourceField.getDataeaseName())
.append(" = ")
.append(DorisTableUtils.dorisName(dto.getTargetTableId())).append(".").append(targetField.getDataeaseName());
} else {
join.append(" AND ")
.append(DorisTableUtils.dorisName(dto.getSourceTableId())).append(".").append(sourceField.getDataeaseName())
.append(" = ")
.append(DorisTableUtils.dorisName(dto.getTargetTableId())).append(".").append(targetField.getDataeaseName());
}
}
}
@ -865,25 +879,39 @@ public class DataSetTableService {
String f = field.substring(0, field.length() - 1);
StringBuilder join = new StringBuilder();
List<DataSetTableUnionDTO> unions = new ArrayList<>();
for (DataTableInfoCustomUnion dataTableInfoCustomUnion : dataTableInfoDTO.getList()) {
for (DataSetTableUnionDTO dto : list) {
// 被关联表和自助数据集的表相等
if (StringUtils.equals(dto.getTargetTableId(), dataTableInfoCustomUnion.getTableId())) {
DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId());
DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId());
if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) {
DEException.throwException(Translator.get("i18n_dataset_field_delete"));
}
DatasetTable sourceTable = datasetTableMapper.selectByPrimaryKey(dto.getSourceTableId());
String sourceTableName = new Gson().fromJson(sourceTable.getInfo(), DataTableInfoDTO.class).getTable();
DatasetTable targetTable = datasetTableMapper.selectByPrimaryKey(dto.getTargetTableId());
String targetTableName = new Gson().fromJson(targetTable.getInfo(), DataTableInfoDTO.class).getTable();
unions.add(dto);
}
}
}
if (CollectionUtils.isNotEmpty(unions)) {
for (int i = 0; i < unions.size(); i++) {
DataSetTableUnionDTO dto = unions.get(i);
DatasetTableField sourceField = dataSetTableFieldsService.get(dto.getSourceTableFieldId());
DatasetTableField targetField = dataSetTableFieldsService.get(dto.getTargetTableFieldId());
if (ObjectUtils.isEmpty(sourceField) || ObjectUtils.isEmpty(targetField)) {
DEException.throwException(Translator.get("i18n_dataset_field_delete"));
}
DatasetTable sourceTable = datasetTableMapper.selectByPrimaryKey(dto.getSourceTableId());
String sourceTableName = new Gson().fromJson(sourceTable.getInfo(), DataTableInfoDTO.class).getTable();
DatasetTable targetTable = datasetTableMapper.selectByPrimaryKey(dto.getTargetTableId());
String targetTableName = new Gson().fromJson(targetTable.getInfo(), DataTableInfoDTO.class).getTable();
if (i == 0) {
join.append(convertUnionTypeToSQL(dto.getSourceUnionRelation()))
.append(String.format(keyword, targetTableName))
.append(" ON ")
.append(String.format(keyword, sourceTableName)).append(".").append(String.format(keyword, sourceField.getOriginName()))
.append(" = ")
.append(String.format(keyword, targetTableName)).append(".").append(String.format(keyword, targetField.getOriginName()));
} else {
join.append(" AND ")
.append(String.format(keyword, sourceTableName)).append(".").append(String.format(keyword, sourceField.getOriginName()))
.append(" = ")
.append(String.format(keyword, targetTableName)).append(".").append(String.format(keyword, targetField.getOriginName()));
}
}
}

View File

@ -111,7 +111,7 @@ public class SysUserService {
public void saveOIDCUser(SSOUserInfo ssoUserInfo) {
long now = System.currentTimeMillis();
SysUser sysUser = new SysUser();
sysUser.setUsername(ssoUserInfo.getUserName());
sysUser.setUsername(ssoUserInfo.getUsername());
sysUser.setNickName(ssoUserInfo.getNickName());
sysUser.setEmail(ssoUserInfo.getEmail());
sysUser.setPassword(CodingUtil.md5(DEFAULT_PWD));
@ -120,6 +120,8 @@ public class SysUserService {
sysUser.setEnabled(1L);
sysUser.setLanguage("zh_CN");
sysUser.setFrom(2);
sysUser.setIsAdmin(false);
sysUser.setSub(ssoUserInfo.getSub());
sysUserMapper.insert(sysUser);
SysUser dbUser = findOne(sysUser);
if (null != dbUser && null != dbUser.getUserId()) {
@ -148,6 +150,7 @@ public class SysUserService {
sysUser.setUpdateTime(now);
sysUser.setEnabled(request.getEnabled());
sysUser.setLanguage("zh_CN");
sysUser.setIsAdmin(false);
sysUser.setFrom(1);
return sysUser;
}).collect(Collectors.toList());

View File

@ -229,9 +229,9 @@ public class SystemParameterService {
}
public static void main(String[] args) {
/* public static void main(String[] args) {
String info="[{\"paramKey\":\"base.url\",\"paramValue\":null,\"type\":\"text\",\"sort\":1,\"file\":null,\"fileName\":null},{\"paramKey\":\"base.title\",\"paramValue\":\"DataEase Title\",\"type\":\"text\",\"sort\":3,\"file\":null,\"fileName\":null},{\"paramKey\":\"base.logo\",\"paramValue\":\"DataEase\",\"type\":\"text\",\"sort\":4,\"file\":null,\"fileName\":\"favicon.icon.png\"}]";
List<SystemParameterDTO> temp = JSON.parseArray(info,SystemParameterDTO.class);
// System.out.println("===>");
}
} */
}

View File

@ -29,12 +29,26 @@ ALTER TABLE `sys_user` ADD COLUMN `from` int(4) NOT NULL COMMENT '来源' AFTER
INSERT INTO `sys_menu` VALUES (60, 1, 0, 1, '导入LDAP用户', 'system-user-import', 'system/user/imp-ldap', 11, NULL, 'user-ldap', b'0', b'0', b'1', 'user:import', NULL, NULL, NULL, NULL);
ALTER TABLE `datasource` ADD COLUMN `compute_type` VARCHAR(45) NULL DEFAULT 'ALL' COMMENT '数据计算模式' AFTER `status`;
update datasource set compute_type='ALL';
BEGIN;
INSERT INTO `system_parameter` VALUES ('ldap.url', NULL, 'text', 1);
INSERT INTO `system_parameter` VALUES ('ldap.dn', NULL, 'text', 2);
INSERT INTO `system_parameter` VALUES ('ldap.password', NULL, 'password', 3);
INSERT INTO `system_parameter` VALUES ('ldap.ou', NULL, 'text', 4);
INSERT INTO `system_parameter` VALUES ('ldap.mapping', NULL, 'text', 6);
INSERT INTO `system_parameter` VALUES ('ldap.open', NULL, 'text', 7);
INSERT INTO `system_parameter` VALUES ('ldap.ou', NULL, 'text', 4);
INSERT INTO `system_parameter` VALUES ('ldap.password', NULL, 'password', 3);
INSERT INTO `system_parameter` VALUES ('ldap.url', NULL, 'text', 1);
INSERT INTO `system_parameter` VALUES ('oidc.authEndpoint', NULL, 'text', 1);
INSERT INTO `system_parameter` VALUES ('oidc.tokenEndpoint', NULL, 'text', 2);
INSERT INTO `system_parameter` VALUES ('oidc.userinfoEndpoint', NULL, 'text', 3);
INSERT INTO `system_parameter` VALUES ('oidc.logoutEndpoint', NULL, 'text', 4);
INSERT INTO `system_parameter` VALUES ('oidc.clientId', NULL, 'text', 5);
INSERT INTO `system_parameter` VALUES ('oidc.secret', NULL, 'password', 6);
INSERT INTO `system_parameter` VALUES ('oidc.scope', NULL, 'text', 7);
INSERT INTO `system_parameter` VALUES ('oidc.redirectUrl', NULL, 'text', 8);
INSERT INTO `system_parameter` VALUES ('oidc.open', NULL, 'text', 9);
COMMIT;
ALTER TABLE `sys_user` ADD COLUMN `sub` varchar(255) COMMENT 'oidc用户ID' AFTER `from`;

View File

@ -65,7 +65,7 @@
<!--要生成的数据库表 -->
<table tableName="chart_view"/>
<table tableName="datasource"/>
<!-- <table tableName="sys_dict_item"/>-->
<!-- <table tableName="dataset_table_field"/>-->

View File

@ -198,6 +198,7 @@ authsource_configuration_is_null=Authentication source configuration cannot be e
删除角色=Delete Role
删除连接=Delete Connection
显示设置=Display
系统参数=System Param
参数管理=Parameter
数据源=Data Source
数据源表单=Data source form

View File

@ -198,6 +198,7 @@ authsource_configuration_is_null=认证源配置不能为空
删除角色=删除角色
删除连接=删除连接
显示设置=显示设置
系统参数=系统参数
数据源=数据源
数据源表单=数据源表单
数据集=数据集

View File

@ -200,6 +200,7 @@ authsource_configuration_is_null=認證源配置不能為空
删除角色=刪除角色
刪除连接=刪除鏈接
显示设置=顯示設置
系统参数=系統參數
参数管理=參數管理
数据源=數據源
数据源表单=數據源表單

View File

@ -0,0 +1,69 @@
<template>
<div style="z-index:-1" :style="style" />
</template>
<script>
import { mapState } from 'vuex'
export default {
replace: true,
name: 'MoveInShadow',
props: {
w: {
type: Number,
required: true
},
h: {
type: Number,
required: true
},
x: {
type: Number,
required: true
},
y: {
type: Number,
required: true
},
z: {
type: Number,
required: true
}
},
computed: {
style() {
//
let left = this.x
let top = this.y
let width = this.w
let height = this.h
if (this.canvasStyleData.auxiliaryMatrix) {
left = Math.round(left / this.curCanvasScale.matrixStyleWidth) * this.curCanvasScale.matrixStyleWidth
width = Math.round(width / this.curCanvasScale.matrixStyleWidth) * this.curCanvasScale.matrixStyleWidth
top = Math.round(top / this.curCanvasScale.matrixStyleHeight) * this.curCanvasScale.matrixStyleHeight
height = Math.round(height / this.curCanvasScale.matrixStyleHeight) * this.curCanvasScale.matrixStyleHeight
}
const style = {
transform: `translate(${left}px, ${top}px) rotate(0deg)`,
width: width + 'px',
height: height + 'px',
opacity: 0.4,
background: 'gray',
position: 'absolute'
}
// console.log('style=>' + JSON.stringify(style))
return style
},
...mapState([
'curComponent',
'editor',
'curCanvasScale',
'canvasStyleData',
'linkageSettingStatus'
])
}
}
</script>
<style scoped>
</style>

View File

@ -21,6 +21,7 @@
@mouseleave="leave"
>
<edit-bar v-if="active||linkageSettingStatus" style="transform: translateZ(10px)" :active-model="'edit'" :element="element" @showViewDetails="showViewDetails" />
<div v-if="resizing" style="transform: translateZ(11px);position: absolute; z-index: 3" :style="resizeShadowStyle" />
<div
v-for="(handlei, indexi) in actualHandles"
:key="indexi"
@ -31,7 +32,9 @@
>
<slot :name="handlei" />
</div>
<slot />
<div :style="mainSlotStyle" :class="{'gap_class':canvasStyleData.panel.gap==='yes'}">
<slot />
</div>
</div>
</template>
@ -49,7 +52,7 @@ import EditBar from '@/components/canvas/components/Editor/EditBar'
export default {
replace: true,
name: 'VueDragResizeRotate',
name: 'Dedrag',
components: { EditBar },
props: {
className: {
@ -440,6 +443,14 @@ export default {
...(this.dragging && this.disableUserSelect ? userSelectNone : userSelectAuto)
}
},
resizeShadowStyle() {
return {
width: this.computedWidth,
height: this.computedHeight,
opacity: 0.4,
background: 'gray'
}
},
//
actualHandles() {
if (!this.resizable) return []
@ -464,9 +475,48 @@ export default {
return this.height + 'px'
},
// left right
computedMainSlotWidth() {
if (this.w === 'auto') {
if (!this.widthTouched) {
return 'auto'
}
}
if (this.canvasStyleData.auxiliaryMatrix) {
const width = Math.round(this.width / this.curCanvasScale.matrixStyleWidth) * this.curCanvasScale.matrixStyleWidth
return width + 'px'
} else {
return this.width + 'px'
}
},
// top bottom
computedMainSlotHeight() {
if (this.h === 'auto') {
if (!this.heightTouched) {
return 'auto'
}
}
if (this.canvasStyleData.auxiliaryMatrix) {
const height = Math.round(this.height / this.curCanvasScale.matrixStyleHeight) * this.curCanvasScale.matrixStyleHeight
return height + 'px'
} else {
return this.height + 'px'
}
},
// private
mainSlotStyle() {
const style = {
width: this.computedMainSlotWidth,
height: this.computedMainSlotHeight
}
// console.log('style=>' + JSON.stringify(style))
return style
},
curComponent() {
return this.$store.state.curComponent
},
...mapState([
'curComponent',
'editor',
'curCanvasScale',
'canvasStyleData',
@ -566,6 +616,18 @@ export default {
this.beforeDestroyFunction()
this.createdFunction()
this.mountedFunction()
},
// private dragging resizing
dragging(val) {
if (this.enabled) {
this.curComponent.optStatus.dragging = val
}
},
// private dragging resizing
resizing(val) {
if (this.enabled) {
this.curComponent.optStatus.resizing = val
}
}
},
created: function() {
@ -610,7 +672,7 @@ export default {
const rect = this.$el.parentNode.getBoundingClientRect()
this.parentX = rect.x
this.parentY = rect.y
return [Math.round(parseFloat(style.getPropertyValue('width'), 10)), Math.round(parseFloat(style.getPropertyValue('height'), 10))]
return [Math.round(parseFloat(style.getPropertyValue('width'), 10)), 100000]
}
if (typeof this.parent === 'string') {
const parentNode = document.querySelector(this.parent)
@ -1490,7 +1552,7 @@ export default {
// resize
const self = this
setTimeout(function() {
self.$emit('resizestop')
self.$emit('resizeView')
}, 200)
},
mountedFunction() {
@ -1650,6 +1712,10 @@ export default {
opacity: 0.5;
}
.gap_class{
padding:5px;
}
/*.mouseOn >>> .icon-shezhi{*/
/* z-index: 2;*/
/* display:block!important;*/

View File

@ -0,0 +1,47 @@
<template>
<div style="z-index:1" :style="style" />
</template>
<script>
import { mapState } from 'vuex'
export default {
replace: true,
name: 'Shadow',
computed: {
style() {
//
let left = this.curComponent.style.left * this.curCanvasScale.scaleWidth / 100
let top = this.curComponent.style.top * this.curCanvasScale.scaleHeight / 100
let width = this.curComponent.style.width * this.curCanvasScale.scaleWidth / 100
let height = this.curComponent.style.height * this.curCanvasScale.scaleHeight / 100
if (this.canvasStyleData.auxiliaryMatrix) {
left = Math.round(left / this.curCanvasScale.matrixStyleWidth) * this.curCanvasScale.matrixStyleWidth
width = Math.round(width / this.curCanvasScale.matrixStyleWidth) * this.curCanvasScale.matrixStyleWidth
top = Math.round(top / this.curCanvasScale.matrixStyleHeight) * this.curCanvasScale.matrixStyleHeight
height = Math.round(height / this.curCanvasScale.matrixStyleHeight) * this.curCanvasScale.matrixStyleHeight
}
const style = {
transform: `translate(${left}px, ${top}px) rotate(0deg)`,
width: width + 'px',
height: height + 'px',
opacity: 0.4,
background: 'gray',
position: 'absolute'
}
// console.log('style=>' + JSON.stringify(style))
return style
},
...mapState([
'curComponent',
'editor',
'curCanvasScale',
'canvasStyleData',
'linkageSettingStatus'
])
}
}
</script>
<style scoped>
</style>

View File

@ -199,6 +199,7 @@ export default {
query(currentPage, pageSize, param).then(response => {
this.data = response.data.listObject
this.paginationConfig.total = response.data.itemCount
this.count = this.paginationConfig.total
}).catch(() => {
const token = getToken()
if (!token || token === 'null' || token === 'undefined') {

View File

@ -127,7 +127,7 @@ export default {
box-shadow:0px 0px 7px #0a7be0;
}
.gap_class{
padding:3px;
padding:5px;
}
.component-custom {
outline: none;

View File

@ -110,12 +110,16 @@ export default {
}
}
}
if (this.canvasStyleData.selfAdaption) {
style = {
overflow: 'hidden',
...style
}
}
// if (this.canvasStyleData.selfAdaption) {
// style = {
// overflow: 'hidden',
// ...style
// }
// }
// style = {
// overflow-x :'hidden',
// ...style
// }
return style
},
// componentData mapState
@ -168,10 +172,13 @@ export default {
const canvasWidth = document.getElementById('canvasInfoTemp').offsetWidth
this.scaleWidth = canvasWidth * 100 / parseInt(this.canvasStyleData.width)//
this.scaleHeight = canvasHeight * 100 / parseInt(this.canvasStyleData.height)//
if (this.showType === 'width') {
this.scaleHeight = this.scaleWidth
this.mainHeight = this.canvasStyleData.height * this.scaleHeight / 100 + 'px'
}
this.scaleHeight = this.scaleWidth
// this.mainHeight = this.canvasStyleData.height * this.scaleHeight / 100 + 'px'
// if (this.showType === 'width') {
// this.scaleHeight = this.scaleWidth
// this.mainHeight = this.canvasStyleData.height * this.scaleHeight / 100 + 'px'
// }
this.handleScaleChange()
},
resetID(data) {
@ -252,7 +259,7 @@ export default {
color: #9ea6b2;
}
.gap_class{
padding:3px;
padding:5px;
}
.dialog-css>>>.el-dialog__title {
font-size: 14px;

View File

@ -12,7 +12,7 @@
@mousedown="handleMouseDown"
>
<!-- 网格线 -->
<Grid v-if="canvasStyleData.auxiliaryMatrix&&!linkageSettingStatus" :matrix-style="matrixStyle" />
<!-- <Grid v-if="canvasStyleData.auxiliaryMatrix&&!linkageSettingStatus" :matrix-style="matrixStyle" />-->
<!-- 仪表板联动清除按钮-->
<canvas-opt-bar />
@ -32,7 +32,6 @@
:active="item === curComponent"
:element="item"
class-name-active="de-drag-active"
:class="{'gap_class':canvasStyleData.panel.gap==='yes'}"
:snap="true"
:snap-tolerance="2"
:change-style="customStyle"
@ -41,7 +40,7 @@
:linkage-active="linkageSettingStatus&&item===curLinkageView"
@refLineParams="getRefLineParams"
@showViewDetails="showViewDetails(index)"
@resizestop="resizestop(index,item)"
@resizeView="resizeView(index,item)"
>
<component
:is="item.component"
@ -104,6 +103,8 @@
:active="item === curComponent"
/>
</de-drag>
<!--拖拽阴影部分-->
<drag-shadow v-if="curComponent&&this.curComponent.optStatus.dragging" />
<!-- 右击菜单 -->
<ContextMenu />
<!-- 标线 (临时去掉标线 吸附等功能)-->
@ -166,9 +167,10 @@ import { deepCopy } from '@/components/canvas/utils/utils'
import UserViewDialog from '@/components/canvas/custom-component/UserViewDialog'
import DeOutWidget from '@/components/dataease/DeOutWidget'
import CanvasOptBar from '@/components/canvas/components/Editor/CanvasOptBar'
import DragShadow from '@/components/DeDrag/shadow'
export default {
components: { Shape, ContextMenu, MarkLine, Area, Grid, DeDrag, UserViewDialog, DeOutWidget, CanvasOptBar },
components: { Shape, ContextMenu, MarkLine, Area, Grid, DeDrag, UserViewDialog, DeOutWidget, CanvasOptBar, DragShadow },
props: {
isEdit: {
type: Boolean,
@ -216,10 +218,10 @@ export default {
width: 80,
height: 20
},
// 12 * 24
// 128 * 72
matrixCount: {
x: 24,
y: 72
x: 36,
y: 18
},
customStyleHistory: null,
showDrag: true,
@ -555,6 +557,9 @@ export default {
if (this.canvasStyleData.matrixCount) {
this.matrixCount = this.canvasStyleData.matrixCount
}
// 1.3 1600*900 scaleWidth
// scaleHeight = scaleWidth 128*72 12.5*12.5
if (this.outStyle.width && this.outStyle.height) {
//
if (!this.canvasStyleData.selfAdaption) {
@ -628,8 +633,9 @@ export default {
showViewDetails(index) {
this.$refs.wrapperChild[index].openChartDetailsDialog()
},
resizestop(index, item) {
resizeView(index, item) {
if (item.type === 'view') {
// console.log('view:resizeView')
this.$refs.wrapperChild[index].chartResize()
}
}
@ -642,6 +648,7 @@ export default {
position: relative;
/*background: #fff;*/
margin: auto;
overflow-x: hidden;
background-size:100% 100% !important;
/*transform-style:preserve-3d;*/
.lock {

View File

@ -17,18 +17,6 @@
<el-switch v-model="canvasStyleData.auxiliaryMatrix" :width="35" name="auxiliaryMatrix" />
<span>{{ $t('panel.matrix_design') }}</span>
</div>
<div class="canvas-config" style="margin-right: 10px">
<el-switch v-model="canvasStyleData.selfAdaption" :width="35" name="selfAdaption" />
<span>{{ $t('panel.canvas_self_adaption') }} </span>
</div>
<div class="canvas-config" style="margin-right: 55px">
<span> {{ $t('panel.canvas_size') }} </span>
<input v-model="canvasStyleData.width" :disabled="canvasStyleData.selfAdaption">
<span>*</span>
<input v-model="canvasStyleData.height" :disabled="canvasStyleData.selfAdaption">
</div>
<!-- <div class="canvas-config" style="margin-right: 10px">-->
<!-- <span> {{ $t('panel.canvas_scale') }} </span>-->
<!-- <input v-model="scale" @input="handleScaleChange"> %-->
@ -383,7 +371,7 @@ export default {
float: right;
height: 35px;
line-height: 35px;
min-width: 900px;
min-width: 500px;
/*background: #fff;*/
/*border-bottom: 1px solid #ddd;*/

View File

@ -264,6 +264,7 @@ export default {
this.chart.drillFields = this.chart.drillFields ? JSON.parse(this.chart.drillFields) : []
if (!response.data.drill) {
this.drillClickDimensionList.splice(this.drillClickDimensionList.length - 1, 1)
this.resetDrill()
}
this.drillFilters = JSON.parse(JSON.stringify(response.data.drillFilters))
this.drillFields = JSON.parse(JSON.stringify(response.data.drillFields))
@ -434,7 +435,7 @@ export default {
this.$refs[this.element.propValue.id].chartResize()
}
this.destroyTimeMachine()
}, 200)
}, 50)
}
},

View File

@ -51,9 +51,9 @@ const list = [
icon: 'wenben',
type: 'v-text',
style: {
width: 300,
width: 400,
height: 100,
fontSize: 18,
fontSize: 22,
fontWeight: 400,
lineHeight: '',
letterSpacing: 0,
@ -120,10 +120,10 @@ const list = [
icon: 'juxing',
type: 'rect-shape',
style: {
width: 200,
height: 200,
width: 400,
height: 300,
borderStyle: 'solid',
borderWidth: 1,
borderWidth: 0,
borderColor: '#000000',
backgroundColor: '#ffffff',
borderRadius: 0

View File

@ -433,6 +433,11 @@ export default {
fixedHeader: 'Fixed Header',
sidebarLogo: 'Sidebar Logo'
},
sysParams: {
display: 'Display Setting',
ldap: 'LDAP Setting',
oidc: 'OIDC Setting'
},
license: {
i18n_no_license_record: 'No License Record',
i18n_license_is_empty: 'License is empty.',
@ -500,6 +505,47 @@ export default {
change_password: 'Change Password',
search_by_name: 'Search by name'
},
ldap: {
url: 'LDAP url',
dn: 'LDAP DN',
password: 'Password',
ou: 'OU',
filter: 'filter',
mapping: 'LDAP mapping',
open: 'Enable LDAP Authentication',
input_url: 'Please key LDAP url',
input_dn: 'Please key DN',
input_password: 'Please key password',
input_ou: 'Please key OU',
input_filter: 'Please key filter',
input_mapping: 'Please key LDAP mapping',
input_username: 'Please key username',
input_url_placeholder: 'Please key url (like ldap://localhost:389)',
input_ou_placeholder: 'Please key OU ',
input_filter_placeholder: 'Please key filter',
input_mapping_placeholder: 'like{"username":"uid","name":"sn","email":"mail"}',
test_connect: 'Test connect',
edit: 'Edit',
login_success: 'Login success',
url_cannot_be_empty: 'LDAP url can not be empty',
dn_cannot_be_empty: 'LDAP DN can not be empty',
ou_cannot_be_empty: 'LDAP OU can not be empty',
filter_cannot_be_empty: 'LDAP filter can not be empty',
mapping_cannot_be_empty: 'LDAP mapping can not be empty',
password_cannot_be_empty: 'LDAP password can not be empty',
import_ldap: 'Import LDAP User'
},
oidc: {
auth_endpoint: 'Please key AuthEndpoint',
token_endpoint: 'Please key TokenEndpoint',
userinfo_endpoint: 'Please key UserinfoEndpoint',
logout_endpoint: 'Please key logoutEndpoint',
clientId: 'Please key ClientId',
secret: 'Please key Secret',
scope: 'Please key scope',
redirectUrl: 'Please key redirectUrl',
open: 'Enable OIDC Authentication'
},
role: {
menu_authorization: 'Menu Authorization',
data_authorization: 'Data Authorization',
@ -1063,6 +1109,8 @@ export default {
password: 'Password',
host: 'Host name / IP address',
port: 'Port',
datasource_url: 'URL address',
please_input_datasource_url: 'Please enter Elasticsearch 地址e.g: http://es_host:es_port',
please_input_data_base: 'Please enter the database name',
please_input_user_name: 'Please enter user name',
please_input_password: 'Please enter Password',

View File

@ -45,7 +45,7 @@ export default {
dashboard: '首頁',
documentation: '文檔',
guide: '引導頁',
permission: '全縣測試頁',
permission: '權限測試頁',
rolePermission: '角色權限',
pagePermission: '頁面權限',
directivePermission: '指令權限',
@ -91,7 +91,7 @@ export default {
errorPages: '錯誤頁面',
page401: '401',
page404: '404',
errorLog: '錯誤日',
errorLog: '錯誤日',
excel: 'Excel',
exportExcel: '導出 Excel',
selectExcel: '導出 已選擇項',
@ -109,36 +109,36 @@ export default {
navbar: {
dashboard: '首頁',
github: '項目地址',
logOut: '退出登',
logOut: '退出登',
profile: '個人中心',
theme: '換膚',
size: '局大小'
size: '局大小'
},
login: {
title: '系統登',
title: '系統登',
welcome: '歡迎使用',
logIn: '登',
username: '號',
logIn: '登',
username: '號',
password: '密碼',
any: '任意字符',
thirdparty: '第三方登',
any: '隨便填',
thirdparty: '第三方登',
thirdpartyTips: '本地不能模擬,請結合自己業務進行模擬!!!',
expires: '登陸信息過期,請重新登陸',
tokenError: '信息錯誤,請重新登陸',
expires: '登錄信息過期,請重新登錄',
tokenError: '登陸信息錯誤,請重新登錄',
username_error: '請輸入正確的 ID',
password_error: '密碼不小 8 位',
re_login: '重新登'
password_error: '密碼不小 8 位',
re_login: '重新登'
},
commons: {
search: '搜索',
folder: '目',
folder: '目',
no_target_permission: '沒有權限',
success: '成功',
switch_lang: '切換語言成功',
close: '關閉',
icon: '圖標',
all: '全部',
enable: '用',
enable: '用',
disable: '禁用',
yes: '是',
no: '否',
@ -155,30 +155,30 @@ export default {
not_cover: '不覆蓋',
import_mode: '導入模式',
import_module: '導入模塊',
please_fill_in_the_template: '請填寫模內容',
cut_back_old_version: '切舊版',
cut_back_new_version: '切新版',
please_fill_in_the_template: '請填寫模內容',
cut_back_old_version: '切舊版',
cut_back_new_version: '切新版',
comment: '評論',
examples: '示例',
help_documentation: '幫助文檔',
api_help_documentation: 'API文檔',
delete_cancelled: '已取消刪除',
workspace: '工作空開你',
workspace: '工作空',
organization: '組織',
menu: '菜單',
setting: '設置',
project: '項目',
about_us: '關',
about_us: '關',
current_project: '當前項目',
name: '名稱',
description: '描述',
annotation: '釋',
annotation: '釋',
clear: '清空',
save: '保存',
update: '更新',
save_success: '保存成功',
delete_success: '刪除成功',
copy_success: '複成功',
copy_success: '複成功',
modify_success: '修改成功',
delete_cancel: '已取消刪除',
confirm: '確定',
@ -186,8 +186,8 @@ export default {
prompt: '提示',
operating: '操作',
input_limit: '長度在 {0} 到 {1} 個字符',
login: '登',
welcome: '一站式開源數據分析平',
login: '登',
welcome: '一站式開源數據分析平',
username: '姓名',
password: '密碼',
input_username: '請輸入用戶姓名',
@ -215,11 +215,11 @@ export default {
input_content: '請輸入內容',
create: '新建',
edit: '編輯',
copy: '複',
copy: '複',
refresh: '刷新',
remark: '備',
remark: '備',
delete: '刪除',
reduction: '恢',
reduction: '恢',
not_filled: '未填寫',
please_select: '請選擇',
search_by_name: '根據名稱搜索',
@ -227,7 +227,7 @@ export default {
exit_system: '退出系統',
verification: '驗證',
title: '標題',
custom: '自義',
custom: '自義',
select_date: '選擇日期',
months_1: '一月',
months_2: '二月',
@ -252,13 +252,13 @@ export default {
connection_successful: '連接成功',
connection_failed: '連接失敗',
save_failed: '保存失敗',
host_cannot_be_empty: '主機不能空',
port_cannot_be_empty: '端口號不能空',
account_cannot_be_empty: '帳戶不能空',
host_cannot_be_empty: '主機不能空',
port_cannot_be_empty: '端口號不能空',
account_cannot_be_empty: '帳戶不能空',
remove: '移除',
remove_cancel: '移除取消',
remove_success: '移除成功',
tips: '認證信息已過期,請重新登',
tips: '認證信息已過期,請重新登',
not_performed_yet: '尚未執行',
incorrect_input: '輸入內容不正確',
delete_confirm: '請輸入以下內容,確認刪除:',
@ -266,13 +266,13 @@ export default {
input_login_username: '請輸入用戶 ID 或 郵箱',
input_name: '請輸入名稱',
please_upload: '請上傳文件',
please_fill_path: '請填寫url 路徑',
please_fill_path: '請填寫ur路徑',
formatErr: '格式錯誤',
please_save: '請先保存',
reference_documentation: '參考文檔',
id: 'ID',
millisecond: '毫秒',
cannot_be_null: '不能空',
cannot_be_null: '不能空',
required: '{0}是必填的',
already_exists: '名稱不能重複',
modifier: '修改人',
@ -290,7 +290,7 @@ export default {
start_date_time: '開始日期時間',
end_date_time: '結束日期時間',
range_separator: '至',
data_time_error: '開始日期不能大結束日期'
data_time_error: '開始日期不能大結束日期'
},
adv_search: {
title: '高級搜索',
@ -306,14 +306,14 @@ export default {
is_not_empty: '非空',
like: '包含',
not_like: '不包含',
in: '屬',
not_in: '不屬',
gt: '大',
ge: '大與等與',
lt: '小',
le: '小與等與',
equals: '等',
not_equals: '不等',
in: '屬',
not_in: '不屬',
gt: '大',
ge: '大于等于',
lt: '小',
le: '小于等于',
equals: '等',
not_equals: '不等',
between: '之間',
current_user: '是當前用戶'
},
@ -357,23 +357,23 @@ export default {
cancel: '取消'
},
guide: {
description: '引導頁對一些第一次進入項目的人很有用,你可以簡單介紹下項目的功能。本 Demo 是基',
description: '引導頁對一些第一次進入項目的人很有用,你可以簡單介紹下項目的功能。本 Demo 是基',
button: '打開引導'
},
components: {
documentation: '文檔',
tinymceTips: '富文本是管理後一個核心的功能但同時又是一個有很多坑的地方。在選擇富文本的過程中我也走了不少的彎路市面上常見的富文本都基本用過了最終權衡了一下選擇了Tinymce。更詳細的富文本比較和介紹見',
dropzoneTips: '由我司業務有特殊需求,而且要傳七牛 所以沒用第三方,選擇了自己封裝。代碼非常的簡單,具體代碼你可以在這裏看到 @/components/Dropzone',
tinymceTips: '富文本是管理後一個核心的功能但同時又是一個有很多坑的地方。在選擇富文本的過程中我也走了不少的彎路市面上常見的富文本都基本用過了最終權衡了一下選擇了Tinymce。更詳細的富文本比較和介紹見',
dropzoneTips: '由我司業務有特殊需求,而且要傳七牛 所以沒用第三方,選擇了自己封裝。代碼非常的簡單,具體代碼你可以在這裏看到 @/components/Dropzone',
stickyTips: '當頁面滾動到預設的位置會吸附在頂部',
backToTopTips1: '頁面滾動到指定位置會在右下角出現返回頂部按鈕',
backToTopTips2: '可自定義按鈕的樣式、show/hide、出現的高度、返回的位置 如需文字提示可在外部使用Element的el-tooltip元素',
imageUploadTips: '由我在使用時它只有vue@1版本而且和mockjs不兼容所以自己改造了一下如果大家要使用的話優先還是使用官方版本。'
imageUploadTips: '由我在使用時它只有vue@1版本而且和mockjs不兼容所以自己改造了一下如果大家要使用的話優先還是使用官方版本。'
},
table: {
dynamicTips1: '固定標頭,按照表頭順序排序',
dynamicTips2: '不固定頭, 按照點擊順序排序',
dragTips1: '默認序',
dragTips2: '拖拽後序',
dynamicTips1: '固定表頭, 按照表頭順序排序',
dynamicTips2: '不固定頭, 按照點擊順序排序',
dragTips1: '默認序',
dragTips2: '拖拽後序',
title: '標題',
importance: '重要性',
type: '類型',
@ -392,15 +392,15 @@ export default {
publish: '發布',
draft: '草稿',
delete: '刪除',
cancel: '取消',
confirm: '確定'
cancel: '取 消',
confirm: '確 定'
},
example: {
warning: '創建和編輯頁面是不能被 keep-alive 緩存的,因為keep-alive 的 include 目前不支持根據路由來緩存,所以目前都是基與 component name 來進行緩存的。如果你想類似的實現緩存效果,可以使用 localStorage 等覽器緩存方案。或者不要使用 keep-alive 的 include直接緩存所有頁面。詳情見'
warning: '創建和編輯頁面是不能被 keep-alive 緩存的,因爲keep-alive 的 include 目前不支持根據路由來緩存,所以目前都是基于 component name 來進行緩存的。如果你想類似的實現緩存效果,可以使用 localStorage 等覽器緩存方案。或者不要使用 keep-alive 的 include直接緩存所有頁面。詳情見'
},
errorLog: {
tips: '請點擊右上角bug小圖標',
description: '現在的管理後基本都是spa的形式了它增強了用戶體驗但同時也會增加頁面出問題的可能性可能一個小小的疏忽就導致整個頁面的死鎖。好在 Vue 官網提供了一個方法來捕獲處理異常,你可以在其中進行錯誤處理或者異常上報。',
description: '現在的管理後基本都是spa的形式了它增強了用戶體驗但同時也會增加頁面出問題的可能性可能一個小小的疏忽就導致整個頁面的死鎖。好在 Vue 官網提供了一個方法來捕獲處理異常,你可以在其中進行錯誤處理或者異常上報。',
documentation: '文檔介紹'
},
excel: {
@ -413,34 +413,39 @@ export default {
placeholder: '請輸入文件名(默認file)'
},
pdf: {
tips: '這裏使用 window.print() 來實現下載pdf的功能'
tips: '這裏使用 window.print() 來實現下載pdf的功能'
},
theme: {
change: '換膚',
documentation: '換膚文檔',
tips: 'Tips: 它區別 navbar 上的 theme-pick, 是兩種不同的換膚方法,各自有不同的應用場景,具體請參考文檔。'
tips: 'Tips: 它區別 navbar 上的 theme-pick, 是兩種不同的換膚方法,各自有不同的應用場景,具體請參考文檔。'
},
tagsView: {
refresh: '刷新',
close: '關閉',
closeOthers: '關閉其',
closeOthers: '關閉其',
closeAll: '關閉所有'
},
settings: {
title: '系統局配置',
title: '系統局配置',
theme: '主題色',
tagsView: '開 Tags-View',
tagsView: '開 Tags-View',
fixedHeader: '固定 Header',
sidebarLogo: '側邊欄 Logo'
},
sysParams: {
display: '顯示設置',
ldap: 'LDAP設置',
oidc: 'OIDC設置'
},
license: {
i18n_no_license_record: '沒有 License 紀錄',
i18n_license_is_empty: 'License 為空',
i18n_no_license_record: '沒有 License 錄',
i18n_license_is_empty: 'License 空',
title: '授權管理',
corporation: '客戶名稱',
time: '授權時間',
product: '品名稱',
edition: '品版本',
product: '品名稱',
edition: '品版本',
licenseVersion: '授權版本',
count: '授權數量',
valid_license: '授權驗證',
@ -471,7 +476,7 @@ export default {
repeat_password: '確認密碼',
inconsistent_passwords: '兩次輸入的密碼不一致',
remove_member: '確定要移除該成員嗎',
org_remove_member: '確定要移除該成員嗎?',
org_remove_member: '將該用戶從組織中移除,將同時移除該組織下所有工作空間的權限,確定要移除該成員嗎?',
input_id_or_email: '請輸入用戶 ID, 或者 用戶郵箱',
no_such_user: '無此用戶信息, 請輸入正確的用戶 ID 或者 用戶郵箱!'
},
@ -484,6 +489,7 @@ export default {
input_password: '請輸入密碼',
input_phone: '請輸入電話號碼',
input_roles: '請選擇角色',
select_users: '請選擇用戶',
special_characters_are_not_supported: '不支持特殊字符',
mobile_number_format_is_incorrect: '手機號碼格式不正確',
email_format_is_incorrect: '郵箱格式不正確',
@ -498,7 +504,49 @@ export default {
new_passwd: '新密碼',
confirm_passwd: '確認密碼',
change_password: '修改密碼',
search_by_name: '按姓名搜索'
search_by_name: '按姓名搜索',
import_ldap: '導入LDAP用戶'
},
ldap: {
url: 'LDAP地址',
dn: '綁定DN',
password: '密碼',
ou: '用戶OU',
filter: '用戶過濾器',
mapping: 'LDAP屬性映射',
open: '啓用LDAP認證',
input_url: '請輸入LDAP地址',
input_dn: '請輸入DN',
input_password: '請輸入密碼',
input_ou: '請輸入用戶OU',
input_filter: '請輸入用戶過濾器',
input_mapping: '請輸入LDAP屬性映射',
input_username: '請輸入用戶名',
input_url_placeholder: '請輸入LDAP地址 (如 ldap://localhost:389)',
input_ou_placeholder: '輸入用戶OU (使用|分隔各OU)',
input_filter_placeholder: '輸入過濾器 [可能的選項是cn或uid或sAMAccountName={0}, 如:(uid={0})]',
input_mapping_placeholder: '如:{"username":"uid","name":"sn","email":"mail"}, username映射的選項可能是cn或uid或sAMAccountName',
test_connect: '測試連接',
test_login: '測試登錄',
edit: '編輯',
login_success: '登錄成功',
url_cannot_be_empty: 'LDAP 地址不能爲空',
dn_cannot_be_empty: 'LDAP DN不能爲空',
ou_cannot_be_empty: 'LDAP OU不能爲空',
filter_cannot_be_empty: 'LDAP 用戶過濾器不能爲空',
mapping_cannot_be_empty: 'LDAP 用戶屬性映射不能爲空',
password_cannot_be_empty: 'LDAP 密碼不能爲空'
},
oidc: {
auth_endpoint: '請輸入AuthEndpoint',
token_endpoint: '請輸入TokenEndpoint',
userinfo_endpoint: '請輸入UserinfoEndpoint',
logout_endpoint: '請輸入logoutEndpoint',
clientId: '請輸入ClientId',
secret: '請輸入Secret',
scope: '請輸入scope',
redirectUrl: '請輸入redirectUrl',
open: '啓用OIDC認證'
},
role: {
menu_authorization: '菜單授權',
@ -530,7 +578,7 @@ export default {
create: '創建菜單',
modify: '修改菜單',
delete: '刪除菜單',
delete_confirm: '確定刪除菜單嗎',
delete_confirm: '確定刪除菜單嗎',
menu_type: '菜單類型'
},
organization: {
@ -553,19 +601,19 @@ export default {
},
system_parameter_setting: {
mailbox_service_settings: '郵件設置',
test_connection: '測試接',
test_connection: '測試接',
SMTP_host: 'SMTP主機',
SMTP_port: 'SMTP端口',
SMTP_account: 'SMTP帳號',
SMTP_account: 'SMTP賬戶',
SMTP_password: 'SMTP密碼',
SSL: '開啟SSL(如果SMTP端口是465通常需要啟用SSL)',
TLS: '開啟TLS(如果SMTP端口是587通常需要啟用TLS)',
SSL: '開啓SSL(如果SMTP端口是465通常需要啓用SSL)',
TLS: '開啓TLS(如果SMTP端口是587通常需要啓用TLS)',
SMTP: '是否免密 SMTP',
host: '主機不能為空',
port: '端口號不能空',
account: '帳戶不能為空',
host: '主機號不能爲空',
port: '端口號不能空',
account: '賬戶不能爲空',
test_recipients: '測試收件人',
tip: ' 提示: 僅用來作為測試郵件收件人'
tip: '提示:僅用來作爲測試郵件收件人'
},
chart: {
save_snapshot: '保存縮略圖',
@ -591,14 +639,14 @@ export default {
sql_data: 'SQL數據集',
excel_data: 'Excel數據集',
custom_data: '自定義數據集',
pls_slc_tbl_left: '請從左側選視圖',
add_db_table: '添加數據庫',
pls_slc_tbl_left: '請從左側選視圖',
add_db_table: '添加數據庫數據集',
pls_slc_data_source: '請選擇數據源',
table: '表',
edit: '編輯',
create_view: '創建圖',
create_view: '創建圖',
data_preview: '數據預覽',
dimension: '度',
dimension: '度',
quota: '指標',
title: '標題',
show: '顯示',
@ -610,22 +658,22 @@ export default {
y_axis: '縱軸',
chart: '視圖',
close: '關閉',
summary: '總方式',
summary: '總方式',
fast_calc: '快速計算',
sum: '求和',
count: '數',
count: '數',
avg: '平均',
max: '最大值',
min: '最小值',
stddev_pop: '標差',
stddev_pop: '標差',
var_pop: '方差',
quick_calc: '快速計算',
show_name_set: '顯示名設置',
color: '色',
color: '色',
color_case: '配色方案',
pls_slc_color_case: '請選配色方案',
pls_slc_color_case: '請選配色方案',
color_default: '默認',
color_retro: '古',
color_retro: '古',
color_future: '未來',
color_gradual: '漸變',
color_business: '商務',
@ -642,7 +690,7 @@ export default {
line_type: '線型',
line_symbol: '折點',
line_symbol_size: '折點大小',
line_type_solid: '實',
line_type_solid: '實',
line_type_dashed: '虛線',
line_symbol_circle: '圓形',
line_symbol_emptyCircle: '空心圓',
@ -654,13 +702,13 @@ export default {
line_symbol_arrow: '箭頭',
line_symbol_none: '無',
line_area: '面積',
pie_inner_radius: '內',
pie_outer_radius: '外',
pie_inner_radius: '內',
pie_outer_radius: '外',
funnel_width: '寬度',
line_smooth: '平滑折線',
title_style: '標題式',
title_style: '標題式',
text_fontsize: '字體大小',
text_color: '字體色',
text_color: '字體色',
text_h_position: '水平位置',
text_v_position: '垂直位置',
text_pos_left: '左',
@ -676,23 +724,23 @@ export default {
legend: '圖例',
shape: '形狀',
polygon: '多邊形',
circle: '形',
label: '標',
label_position: '標位置',
circle: '形',
label: '標',
label_position: '標位置',
content_formatter: '內容格式',
inside: '內',
tooltip: '提示',
tooltip_item: '數據項',
tooltip_axis: '標軸',
formatter_plc: '內痛格式為空時,顯示默認格式',
xAxis: '橫',
tooltip_axis: '標軸',
formatter_plc: '內容格式爲空時,顯示默認格式',
xAxis: '橫',
yAxis: '縱軸',
position: '位置',
rotate: '角度',
name: '名稱',
icon: '國際',
icon: '圖標',
trigger_position: '觸發位置',
asc: '序',
asc: '序',
desc: '降序',
sort: '排序',
filter: '過濾',
@ -703,39 +751,39 @@ export default {
border_radius: '邊框半徑',
alpha: '透明度',
add_filter: '添加過濾',
no_limit: '無顯示',
filter_eq: '等',
filter_not_eq: '不等',
filter_lt: '小',
filter_le: '小於等於',
filter_gt: '大',
filter_ge: '大於等於',
filter_null: '空',
filter_not_null: '不空',
no_limit: '無限制',
filter_eq: '等',
filter_not_eq: '不等',
filter_lt: '小',
filter_le: '小于等于',
filter_gt: '大',
filter_ge: '大于等于',
filter_null: '空',
filter_not_null: '不空',
filter_include: '包含',
filter_not_include: '不包含',
rose_type: '玫瑰圖模式',
radius_mode: '半徑',
area_mode: '面積',
rose_radius: '角',
rose_radius: '角',
view_name: '視圖標題',
belong_group: '所屬分組',
select_group: '選擇分組',
name_can_not_empty: '名稱不能空',
template_can_not_empty: '請選擇儀表',
name_can_not_empty: '名稱不能空',
template_can_not_empty: '請選擇儀表',
custom_count: '記錄數',
table_title_fontsize: '表頭字體大小',
table_item_fontsize: '表格字體大小',
table_header_bg: '表頭背景',
table_item_bg: '表格背景',
table_item_font_color: '字體色',
table_item_font_color: '字體色',
stripe: '斑馬紋',
start_angle: '起始角度',
end_angle: '結束角度',
style_priority: '樣式優先級',
dashboard: '儀表板',
dimension_color: '名稱色',
quota_color: '值色',
dimension_color: '名稱色',
quota_color: '值色',
dimension_font_size: '名稱字體大小',
quota_font_size: '值字體大小',
space_split: '名稱/值間隔',
@ -743,11 +791,11 @@ export default {
only_one_result: '僅顯示第1個計算結果',
dimension_show: '名稱顯示',
quota_show: '值顯示',
title_limit: '標題不能大50個字符',
title_limit: '標題不能大50個字符',
filter_condition: '過濾條件',
filter_field_can_null: '過濾字段必填',
preview_100_data: '預覽前100條記錄',
chart_table_normal: '總表',
chart_table_normal: '總表',
chart_table_info: '明細表',
chart_card: '指標卡',
chart_bar: '基礎柱狀圖',
@ -775,24 +823,24 @@ export default {
chartName: '新建視圖',
chart_show_error: '無法正常顯示',
chart_error_tips: '如有疑問請聯系管理員',
title_cannot_empty: '標題不能空',
title_cannot_empty: '標題不能空',
table_title_height: '表頭行高',
table_item_height: '表格行高',
axis_show: '軸線顯示',
axis_color: '軸線色',
axis_color: '軸線色',
axis_width: '軸線寬度',
axis_type: '軸線類型',
axis_type_solid: '實線',
axis_type_dashed: '虛線',
axis_type_dotted: '點',
axis_label_show: '標簽顯示',
axis_label_color: '標簽色',
axis_label_color: '標簽色',
axis_label_fontsize: '標簽大小',
text_style: '字體樣式',
bolder: '加粗',
change_ds: '更換數據集',
change_ds_tip: '提示:更換數據集將導致字段發生變化,需重新作視圖',
axis_name_color: '名稱色',
change_ds_tip: '提示:更換數據集將導致字段發生變化,需重新作視圖',
axis_name_color: '名稱色',
axis_name_fontsize: '名稱字體',
pie_label_line_show: '引導線',
outside: '外',
@ -802,10 +850,10 @@ export default {
axis_label: '軸標簽',
label_fontsize: '標簽大小',
split_line: '分割線',
split_color: '分割色',
split_color: '分割色',
shadow: '陰影',
condition: '過濾值',
filter_value_can_null: '過濾值不能空',
filter_value_can_null: '過濾值不能空',
filter_like: '包含',
filter_not_like: '不包含',
color_light: '明亮',
@ -840,7 +888,7 @@ export default {
chart_scatter: '散點圖',
bubble_size: '氣泡大小',
chart_treemap: '矩形樹圖',
drill: '取',
drill: '取',
drag_block_treemap_label: '色塊標簽',
drag_block_treemap_size: '色塊大小',
bubble_symbol: '圖形',
@ -879,7 +927,7 @@ export default {
liquid_shape_rect: '矩形'
},
dataset: {
sheet_warn: '有多個sheet頁面,默認抽取第一個',
sheet_warn: '有多個 Sheet 頁,默認抽取第一個',
datalist: '數據集',
name: '數據集名稱',
add_group: '添加分組',
@ -920,7 +968,7 @@ export default {
time: '時間',
value: '數值',
mode: '模式',
direct_connect: '直',
direct_connect: '直',
sync_data: '定時同步',
update_setting: '更新設置',
sync_now: '立即更新',
@ -939,10 +987,10 @@ export default {
add_scope: '增量更新',
select_data_time: '選擇日期時間',
execute_rate: '執行頻率',
simple_cron: '簡單重複',
execute_once: '立即執行',
cron_config: '表達時設定',
no_limit: '無限製',
simple_cron: '簡單重複',
cron_config: '表達式設定',
no_limit: '無限制',
set_end_time: '設定結束時間',
operate: '操作',
save_success: '保存成功',
@ -952,7 +1000,7 @@ export default {
add_sql_table: '添加 SQL 數據集',
preview: '預覽',
pls_input_name: '請輸入名稱',
connect_mode: '接模式',
connect_mode: '接模式',
incremental_update_type: '增量更新方式',
incremental_add: '增量添加',
incremental_delete: '增量刪除',
@ -961,7 +1009,7 @@ export default {
param: '參數',
edit_sql: '編輯 SQL 數據集',
showRow: '顯示行',
add_excel_table: ' 添加 Excel 數據集',
add_excel_table: '添加Excel數據集',
add_custom_table: '添加自定義數據集',
upload_file: '上傳文件',
detail: '詳情',
@ -983,14 +1031,14 @@ export default {
source_field: '關聯字段',
target_table: '被關聯表',
target_field: '被關聯字段',
union_relation: '關聯關',
pls_setting_union_success: '請正確設置關聯關',
invalid_dataset: ' Kettle 未運行,無效數據集',
check_all: '選',
union_relation: '關聯關',
pls_setting_union_success: '請正確設置關聯關',
invalid_dataset: 'Kettle未運行無效數據集',
check_all: '選',
can_not_union_self: '被關聯表不能與關聯表相同',
float: '小數',
edit_custom_table: '編輯自數據集',
edit_field: '編輯自斷',
edit_custom_table: '編輯自定義數據集',
edit_field: '編輯字段',
preview_100_data: '顯示前100行數據',
invalid_table_check: '非直連數據集請先完成數據同步',
parse_error: 'Excel解析失敗請檢查格式、字段等信息。具體參考https://dataease.io/docs/faq/dataset_faq/',
@ -1008,7 +1056,7 @@ export default {
sync_latter: '稍後同步',
task: {
list: '任務列表',
record: '執行錄',
record: '執行錄',
create: '新建任務',
name: '任務名稱',
last_exec_time: '上次執行時間',
@ -1044,10 +1092,10 @@ export default {
calc_field: '計算字段',
show_sql: '顯示SQL',
ple_select_excel: '請選擇要導入的 Excel',
merge: '合',
no_merge: '不合',
merge_msg: '數據表中存在自斷一直的情況,是否合併到一個數據集中?',
merge_title: '合數據',
merge: '合',
no_merge: '不合',
merge_msg: '數據表中存在字段一致的情況,是否合並到一個數據集中?',
merge_title: '合數據',
field_name_less_50: '字段名不能超過50個字符'
},
datasource: {
@ -1062,17 +1110,20 @@ export default {
password: '密碼',
host: '主機名/IP地址',
port: '端口',
datasource_url: '地址',
please_input_datasource_url: '請輸入 Elasticsearch 地址,如: http://es_host:es_port',
please_input_data_base: '請輸入數據庫名稱',
please_select_oracle_type: '選擇連接類型',
please_input_user_name: '請輸入用戶名',
please_input_password: '請輸入密碼',
please_input_host: '請輸入主機',
please_input_url: '請輸入URL地址',
please_input_port: '請輸入',
please_input_port: '請輸入端口',
modify: '編輯數據源',
validate_success: '校驗成功',
validate: '校驗',
search_by_name: '根據名稱搜索',
delete_warning: '確認刪除?',
delete_warning: '確定要刪除嗎?',
input_name: '請輸入名稱',
input_limit_2_25: '2-25字符',
input_limit_0_50: '0-50字符',
@ -1082,20 +1133,21 @@ export default {
get_schema: '獲取 Schema',
schema: '數據庫 Schema',
please_choose_schema: '請選擇數據庫 Schema',
edit_datasource_msg: '修改數據源信息,可能會導致改數據源下的數據集不可用,確認修改?',
in_valid: '無效數據源',
initial_pool_size: '初始連數',
min_pool_size: '最小連數',
max_pool_size: '最大連數',
max_idle_time: '最大空(秒)',
initial_pool_size: '初始連數',
min_pool_size: '最小連數',
max_pool_size: '最大連數',
max_idle_time: '最大空(秒)',
acquire_increment: '增長數',
connect_timeout: '連接超時(秒)',
please_input_initial_pool_size: '請輸入初始連數',
please_input_min_pool_size: '請輸入最小連數',
please_input_max_pool_size: '請輸入最大連數',
please_input_max_idle_time: '請輸入最大空(秒)',
please_input_initial_pool_size: '請輸入初始連數',
please_input_min_pool_size: '請輸入最小連數',
please_input_max_pool_size: '請輸入最大連數',
please_input_max_idle_time: '請輸入最大空(秒)',
please_input_acquire_increment: '請輸入增長數',
please_input_connect_timeout: '請輸入連接超時(秒)',
no_less_then_0: '高級設置中的參數不能小零',
no_less_then_0: '高級設置中的參數不能小零',
priority: '高級設置'
},
pblink: {
@ -1110,14 +1162,14 @@ export default {
auth_role: '已分享角色',
picture_limit: '只能插入圖片',
drag_here: '請將左側字段拖至此處',
copy_link_passwd: '複鏈接及密碼',
copy_link: '複鏈接',
copy_short_link: '複短鏈接',
copy_short_link_passwd: '複短鏈接及密碼',
copy_link_passwd: '複鏈接及密碼',
copy_link: '複鏈接',
copy_short_link: '複短鏈接',
copy_short_link_passwd: '複短鏈接及密碼',
passwd_protect: '密碼保護',
link: '鏈接',
link_share: '鏈接分享',
link_share_desc: '開鏈接後,任何人可通過此鏈接訪問儀表板。',
link_share_desc: '開鏈接後,任何人可通過此鏈接訪問儀表板。',
share: '分享',
datalist: '視圖列表',
group: '目錄',
@ -1139,7 +1191,7 @@ export default {
view: '視圖',
module: '組件',
filter_module: '過濾組件',
select_by_module: '組件選擇',
select_by_module: '組件選擇',
edit: '編輯',
sys_template: '系統模板',
user_template: '用戶模板',
@ -1153,12 +1205,12 @@ export default {
photo: '圖片',
default_panel: '默認儀表板',
create_public_links: '創建公共鏈接',
to_default: '另存默認',
to_default_panel: '另存默認儀表板',
to_default: '另存默認',
to_default_panel: '另存默認儀表板',
store: '收藏',
save_to_panel: '保存模板',
export_to_panel: '導出模板',
export_to_pdf: '導出PDF',
save_to_panel: '保存模板',
export_to_panel: '導出模板',
export_to_pdf: '導出PDF',
preview: '預覽',
fullscreen_preview: '全屏預覽',
new_tab_preview: '新Tab頁預覽',
@ -1169,21 +1221,21 @@ export default {
all_org: '所有組織',
custom: '自定義',
import_template: '導入模板',
copy_template: '用模板',
copy_template: '用模板',
upload_template: '上傳模板',
belong_to_category: '所屬類別',
pls_select_belong_to_category: '請選擇所屬類別',
template_name_cannot_be_empty: '模板名稱不能空',
select_by_table: '表選擇',
template_name_cannot_be_empty: '模板名稱不能空',
select_by_table: '表選擇',
data_list: '數據列表',
component_list: '組件列表',
custom_scope: '自定義控範圍',
custom_scope: '自定義控範圍',
multiple_choice: '多選',
single_choice: '單選',
field: '字段',
unshared_people: '未分享人員',
shared_people: '已分享人員',
error_data: '獲取數據出錯,請聯管理員',
error_data: '獲取數據出錯,請聯管理員',
canvas_size: '畫布大小',
canvas_scale: '畫布比例',
style: '樣式',
@ -1192,7 +1244,7 @@ export default {
redo: '重做',
undo: '撤銷',
panelNull: '這是個空的儀表板,可以通過編輯來豐富內容',
copy: '復製',
copy: '複制',
paste: '粘貼',
cut: '剪切',
lock: '鎖定',
@ -1210,11 +1262,11 @@ export default {
top: 'y 坐標',
height: '高',
width: '寬',
color: '色',
color: '色',
backgroundColor: '背景色',
borderStyle: '邊框風格',
borderWidth: '邊框寬度',
borderColor: '邊框色',
borderColor: '邊框色',
borderRadius: '邊框半徑',
fontSize: '字體大小',
fontWeight: '字體粗細',
@ -1267,12 +1319,21 @@ export default {
uninstall_cancel: '取消卸載插件'
},
display: {
logo: '頭部系統 Logo',
loginLogo: '登陸頁面頭部 Logo',
loginImage: '登頁面右側圖片',
loginTitle: '登頁面標題',
logo: '頭部系統logo',
loginLogo: '登錄頁面頭部logo',
loginImage: '登頁面右側圖片',
loginTitle: '登頁面標題',
title: '系統名稱',
advice_size: '建議圖片大小'
advice_size: '建議圖片大小',
theme: '主題顔色',
topMenuColor: '頭部背景',
topMenuActiveColor: '頭部選中背景',
topMenuTextColor: '頭部字體顔色',
topMenuTextActiveColor: '頭部字體選中顔色'
},
auth: {
authConfig: '權限配置',
@ -1292,6 +1353,7 @@ export default {
datasetAuthHead: '所有數據集',
chartAuthHead: '所有視圖',
panelAuthHead: '所有儀表板',
menuAuthHead: '所有菜單和操作',
view: '查看',
use: '使用',
export: '導出',
@ -1306,13 +1368,13 @@ export default {
auth_num: '授權數量',
version: '版本',
version_num: '版本號',
standard: '標版',
standard: '標版',
enterprise: '企業版',
suport: '獲取技術支持',
update_success: '更新成功'
},
template: {
exit_same_template_check: '當前存在相同名稱模板,是否覆蓋?',
exit_same_template_check: '當前分類存在相同名稱模板,是否覆蓋?',
override: '覆蓋',
cancel: '取消',
confirm_upload: '上傳確認'
@ -1328,8 +1390,8 @@ export default {
month: '月',
week: '周',
year: '年',
d_w_cant_not_set: '日期與星期不可以同時“不指定”',
d_w_must_one_set: '日期與星期必須有一個“不指定”',
d_w_cant_not_set: '日期與星期不可以同時“不指定”',
d_w_must_one_set: '日期與星期必須有一個“不指定”',
every_day: '每日',
cycle: '周期',
not_set: '不指定',
@ -1357,15 +1419,15 @@ export default {
week_end: '至星期',
every_year: '每年',
week_tips: '說明1-7 分別對應 周日-周六',
minute_limit: '分鐘不能小於1大於59',
hour_limit: '小時不能小於1大於523',
day_limit: '天不能小於1大於531'
minute_limit: '分鍾不能小于1大于59',
hour_limit: '小時不能小于1大于23',
day_limit: '天不能小于1大于31'
},
dept: {
can_not_move_change_sort: '不能移動以改變排序',
can_not_move_parent_to_children: '父組織不能移動到自己的子節點下',
move_success: '移動成功',
name_exist_pre: '下已存在名稱【',
name_exist_pre: '下已存在名稱【',
name_exist_suf: '】的組織',
root_org: '頂層組織'
},

View File

@ -433,6 +433,11 @@ export default {
fixedHeader: '固定 Header',
sidebarLogo: '侧边栏 Logo'
},
sysParams: {
display: '显示设置',
ldap: 'LDAP设置',
oidc: 'OIDC设置'
},
license: {
i18n_no_license_record: '没有 License 记录',
i18n_license_is_empty: 'License 为空',
@ -539,6 +544,8 @@ export default {
logout_endpoint: '请输入logoutEndpoint',
clientId: '请输入ClientId',
secret: '请输入Secret',
scope: '请输入scope',
redirectUrl: '请输入redirectUrl',
open: '启用OIDC认证'
},
role: {
@ -1098,11 +1105,14 @@ export default {
create: '新建数据源',
type: '类型',
please_choose_type: '请选择数据源类型',
please_choose_data_type: '请选择计算模式',
data_base: '数据库名称',
user_name: '用户名',
password: '密码',
host: '主机名/IP地址',
port: '端口',
datasource_url: '地址',
please_input_datasource_url: '请输入 Elasticsearch 地址,如: http://es_host:es_port',
please_input_data_base: '请输入数据库名称',
please_select_oracle_type: '选择连接类型',
please_input_user_name: '请输入用户名',
@ -1139,7 +1149,11 @@ export default {
please_input_acquire_increment: '请输入增长数',
please_input_connect_timeout: '请输入连接超时(秒)',
no_less_then_0: '高级设置中的参数不能小于零',
priority: '高级设置'
priority: '高级设置',
data_mode: '数据模式',
direct: '直连模式',
extract: '抽取模式',
all_compute_mode: '直连、抽取模式'
},
pblink: {
key_pwd: '请输入密码打开链接',

View File

@ -3,6 +3,9 @@ module.exports = {
RefreshTokenKey: 'refreshauthorization',
LinkTokenKey: 'LINK-PWD-TOKEN',
title: 'DataEase',
/* for sso */
IdTokenKey: 'IdToken',
AccessTokenKey: 'AccessToken',
/**
* @type {boolean} true | false

View File

@ -58,7 +58,9 @@ const data = {
// 和当前组件联动的目标组件
targetLinkageInfo: [],
// 当前仪表板联动 下钻 上卷等信息
nowPanelTrackInfo: {}
nowPanelTrackInfo: {},
// 拖拽的组件信息
dragComponentInfo: null
},
mutations: {
...animation.mutations,
@ -79,10 +81,20 @@ const data = {
},
setCanvasStyle(state, style) {
if (style) {
style['selfAdaption'] = true
}
state.canvasStyleData = style
},
setCurComponent(state, { component, index }) {
// 当前视图操作状态置空
if (component) {
component['optStatus'] = {
dragging: false,
resizing: false
}
}
state.styleChangeTimes = 0
state.curComponent = component
state.curComponentIndex = index
@ -244,6 +256,12 @@ const data = {
}
})
// state.styleChangeTimes++
},
setDragComponentInfo(state, dragComponentInfo) {
state.dragComponentInfo = dragComponentInfo
},
clearDragComponentInfo(state) {
state.dragComponentInfo = null
}
},
modules: {

View File

@ -3,8 +3,16 @@ import Config from '@/settings'
const TokenKey = Config.TokenKey
const IdTokenKey = Config.IdTokenKey
const AccessTokenKey = Config.AccessTokenKey
const linkTokenKey = Config.LinkTokenKey
export function getIdToken() {
return Cookies.get(IdTokenKey)
}
export function getToken() {
return Cookies.get(TokenKey)
}
@ -14,6 +22,8 @@ export function setToken(token) {
}
export function removeToken() {
Cookies.remove(IdTokenKey)
Cookies.remove(AccessTokenKey)
return Cookies.remove(TokenKey)
}

View File

@ -2,7 +2,7 @@ import axios from 'axios'
// import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { $alert, $error } from './message'
import { getToken } from '@/utils/auth'
import { getToken, getIdToken } from '@/utils/auth'
import Config from '@/settings'
import i18n from '@/lang'
import { tryShowLoading, tryHideLoading } from './loading'
@ -23,6 +23,10 @@ const service = axios.create({
service.interceptors.request.use(
config => {
// do something before request is sent
const idToken = getIdToken()
if (idToken) {
config.headers[Config.IdTokenKey] = idToken
}
if (store.getters.token) {
// let each request carry token

View File

@ -49,7 +49,45 @@
</el-dropdown-menu>
</el-dropdown>
</el-dropdown-item>
<el-dropdown-item v-show="conf && conf.includes('sort')">
<el-dropdown-item v-show="item.deType === 1">
<el-dropdown placement="right-start" size="mini" style="width: 100%" @command="dateStyle">
<span class="el-dropdown-link inner-dropdown-menu">
<span>
<i class="el-icon-c-scale-to-original" />
<span>{{ $t('chart.dateStyle') }}</span>
<span class="summary-span-item">({{ $t('chart.'+item.dateStyle) }})</span>
</span>
<i class="el-icon-arrow-right el-icon--right" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="beforeDateStyle('y')">{{ $t('chart.y') }}</el-dropdown-item>
<el-dropdown-item :command="beforeDateStyle('y_M')">{{ $t('chart.y_M') }}</el-dropdown-item>
<el-dropdown-item :command="beforeDateStyle('y_M_d')">{{ $t('chart.y_M_d') }}</el-dropdown-item>
<el-dropdown-item :command="beforeDateStyle('H_m_s')">{{ $t('chart.H_m_s') }}</el-dropdown-item>
<el-dropdown-item :command="beforeDateStyle('y_M_d_H_m')">{{ $t('chart.y_M_d_H_m') }}</el-dropdown-item>
<el-dropdown-item :command="beforeDateStyle('y_M_d_H_m_s')">{{ $t('chart.y_M_d_H_m_s') }}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-dropdown-item>
<el-dropdown-item v-show="item.deType === 1">
<el-dropdown placement="right-start" size="mini" style="width: 100%" @command="datePattern">
<span class="el-dropdown-link inner-dropdown-menu">
<span>
<i class="el-icon-timer" />
<span>{{ $t('chart.datePattern') }}</span>
<span class="summary-span-item">({{ $t('chart.'+item.datePattern) }})</span>
</span>
<i class="el-icon-arrow-right el-icon--right" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="beforeDatePattern('date_sub')">{{ $t('chart.date_sub') }}(1990-01-01)</el-dropdown-item>
<el-dropdown-item :command="beforeDatePattern('date_split')">{{ $t('chart.date_split') }}(1990/01/01)</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-dropdown-item>
<el-dropdown-item v-show="conf && conf.includes('sort')" :divided="item.deType === 1">
<el-dropdown placement="right-start" size="mini" style="width: 100%" @command="sort">
<span class="el-dropdown-link inner-dropdown-menu">
<span>
@ -143,6 +181,27 @@ export default {
removeItem() {
this.item.index = this.index
this.$emit('onItemRemove', this.item)
},
dateStyle(param) {
// console.log(param)
this.item.dateStyle = param.type
this.$emit('onItemChange', this.item)
},
beforeDateStyle(type) {
return {
type: type
}
},
datePattern(param) {
// console.log(param)
this.item.datePattern = param.type
this.$emit('onItemChange', this.item)
},
beforeDatePattern(type) {
return {
type: type
}
}
}
}

View File

@ -949,6 +949,12 @@ export default {
})
}
view.extStack.forEach(function(ele) {
if (!ele.dateStyle || ele.dateStyle === '') {
ele.dateStyle = 'y_M_d'
}
if (!ele.datePattern || ele.datePattern === '') {
ele.datePattern = 'date_sub'
}
if (!ele.sort || ele.sort === '') {
ele.sort = 'none'
}
@ -1058,6 +1064,8 @@ export default {
}
if (!response.data.drill) {
this.drillClickDimensionList.splice(this.drillClickDimensionList.length - 1, 1)
this.resetDrill()
}
this.drillFilters = JSON.parse(JSON.stringify(response.data.drillFilters ? response.data.drillFilters : []))
}).catch(err => {

View File

@ -28,8 +28,8 @@
</el-form-item>
<el-form-item class="form-item">
<el-select v-model="mode" filterable :placeholder="$t('dataset.connect_mode')" size="mini">
<el-option :label="$t('dataset.direct_connect')" value="0" />
<el-option :label="$t('dataset.sync_data')" value="1" :disabled="!kettleRunning" />
<el-option :label="$t('dataset.direct_connect')" value="0" :disabled="selectedDatasource.computeType==='EXTRACT'"/>
<el-option :label="$t('dataset.sync_data')" value="1" :disabled="!kettleRunning || selectedDatasource.computeType==='DIRECT'" />
</el-select>
</el-form-item>
@ -86,7 +86,8 @@ export default {
mode: '0',
syncType: 'sync_now',
tableData: [],
kettleRunning: false
kettleRunning: false,
selectedDatasource: {}
}
},
watch: {
@ -96,6 +97,11 @@ export default {
this.tables = response.data
this.tableData = JSON.parse(JSON.stringify(this.tables))
})
for (let i = 0; i < this.options.length; i++) {
if (this.options[i].id === val) {
this.selectedDatasource = this.options[i]
}
}
}
},
searchTable(val) {

View File

@ -18,7 +18,7 @@
<el-row>
<el-form :inline="true">
<el-form-item class="form-item">
<el-select v-model="dataSource" filterable :placeholder="$t('dataset.pls_slc_data_source')" size="mini">
<el-select v-model="dataSource" filterable :placeholder="$t('dataset.pls_slc_data_source')" size="mini" @change="changeDatasource()">
<el-option
v-for="item in options"
:key="item.id"
@ -32,8 +32,8 @@
</el-form-item>
<el-form-item v-if="!param.tableId" class="form-item">
<el-select v-model="mode" filterable :placeholder="$t('dataset.connect_mode')" size="mini">
<el-option :label="$t('dataset.direct_connect')" value="0" />
<el-option :label="$t('dataset.sync_data')" value="1" :disabled="!kettleRunning" />
<el-option :label="$t('dataset.direct_connect')" value="0" :disabled="selectedDatasource.computeType==='EXTRACT'"/>
<el-option :label="$t('dataset.sync_data')" value="1" :disabled="!kettleRunning || selectedDatasource.computeType==='DIRECT'" />
</el-select>
</el-form-item>
@ -145,14 +145,15 @@ export default {
theme: 'solarized',
hintOptions: { //
completeSingle: false //
}
},
},
data: [],
fields: [],
mode: '0',
syncType: 'sync_now',
height: 500,
kettleRunning: false
kettleRunning: false,
selectedDatasource: {}
}
},
computed: {
@ -189,6 +190,13 @@ export default {
this.kettleRunning = res.data
})
},
changeDatasource() {
for (let i = 0; i < this.options.length; i++) {
if (this.options[i].id === this.form.dataSource) {
this.selectedDatasource = this.options[i]
}
}
},
calHeight() {
const that = this
setTimeout(function() {

View File

@ -57,7 +57,7 @@ export default {
watch: {
'table': function() {
fieldList(this.table.id).then(response => {
this.fields = response.data
this.fields = JSON.parse(JSON.stringify(response.data)).filter(ele => ele.extField === 0)
this.checkedFields = []
this.checkedList.forEach(ele => {
@ -78,7 +78,7 @@ export default {
initField() {
if (this.table.id) {
fieldList(this.table.id).then(response => {
this.fields = response.data
this.fields = JSON.parse(JSON.stringify(response.data)).filter(ele => ele.extField === 0)
})
}
},

View File

@ -222,7 +222,7 @@ export default {
// if (response.data) {
this.union.sourceTableId = this.table.id
fieldList(this.table.id).then(response => {
this.sourceFieldOption = response.data
this.sourceFieldOption = JSON.parse(JSON.stringify(response.data)).filter(ele => ele.extField === 0)
})
this.editUnion = true
// } else {
@ -320,7 +320,7 @@ export default {
this.union.targetTableId = param.id
this.union.targetTableFieldId = ''
fieldList(param.id).then(response => {
this.targetFieldOption = response.data
this.targetFieldOption = JSON.parse(JSON.stringify(response.data)).filter(ele => ele.extField === 0)
})
this.$refs['targetTable'].doClose()
}

View File

@ -105,11 +105,13 @@ export default {
})
},
handleDragStart(node, ev) {
this.$store.commit('setDragComponentInfo', node)
ev.dataTransfer.effectAllowed = 'copy'
const dataTrans = {
type: 'view',
id: node.data.id
}
ev.dataTransfer.setData('componentInfo', JSON.stringify(dataTrans))
},

View File

@ -96,7 +96,6 @@
<div
id="canvasInfo"
:class="{'style-hidden':canvasStyleData.selfAdaption}"
class="content this_canvas"
@drop="handleDrop"
@dragover="handleDragOver"
@ -441,6 +440,7 @@ export default {
return data
},
handleDrop(e) {
this.$store.commit('clearDragComponentInfo')
this.currentDropElement = e
e.preventDefault()
e.stopPropagation()
@ -510,6 +510,7 @@ export default {
},
handleDragOver(e) {
console.log('handleDragOver=>x:' + this.getPositionX(e.layerX) + ';y=' + this.getPositionY(e.layerY) + e.dataTransfer.getData('componentInfo'))
e.preventDefault()
e.dataTransfer.dropEffect = 'copy'
},
@ -839,7 +840,7 @@ export default {
}
}
.style-hidden{
overflow: hidden;
overflow-x: hidden;
}
</style>

View File

@ -56,7 +56,7 @@
<el-row class="panel-design-preview">
<div id="imageWrapper" ref="imageWrapper" style="width: 100%;height: 100%">
<fullscreen style="height: 100%;background: #f7f8fa;overflow-y: auto" :fullscreen.sync="fullscreen">
<Preview v-if="showMain" :in-screen="!fullscreen" :show-type="canvasStyleData.selfAdaption?'full':'width'" />
<Preview v-if="showMain" :in-screen="!fullscreen" :show-type="'width'" />
</fullscreen>
</div>
</el-row>

View File

@ -154,6 +154,10 @@ export default {
return 'Oracle'
} else if (type === 'pg') {
return 'PostgreSQL'
} else if (type === 'es') {
return 'Elasticsearch'
} else if (type === 'ch') {
return 'ClickHouse'
}
},

View File

@ -24,11 +24,22 @@
</el-select>
</el-form-item>
<el-form-item :label="$t('datasource.data_mode')" prop="type">
<el-select v-model="form.computeType" :placeholder="$t('datasource.please_choose_data_type')" class="select-width" :disabled="formType=='modify' || (formType==='add' && params && !!params.computeMode)">
<el-option
v-for="item in compute_mode"
:key="item.type"
:label="item.label"
:value="item.type"
/>
</el-select>
</el-form-item>
<el-form-item v-if="form.configuration.dataSourceType=='jdbc'" :label="$t('datasource.host')" prop="configuration.host">
<el-input v-model="form.configuration.host" autocomplete="off" />
</el-form-item>
<el-form-item v-if="form.configuration.dataSourceType=='es'" :label="$t('datasource.url')" prop="configuration.url">
<el-input v-model="form.configuration.url" placeholder="请输入 Elasticsearch 地址,如: http://es_host:es_port" autocomplete="off" />
<el-form-item v-if="form.configuration.dataSourceType=='es'" :label="$t('datasource.datasource_url')" prop="configuration.url">
<el-input v-model="form.configuration.url" :placeholder="$t('datasource.please_input_datasource_url')" autocomplete="off" />
</el-form-item>
<el-form-item v-if="form.configuration.dataSourceType=='jdbc'" :label="$t('datasource.data_base')" prop="configuration.dataBase">
<el-input v-model="form.configuration.dataBase" autocomplete="off" />
@ -147,12 +158,20 @@ export default {
'configuration.acquireIncrement': [{ required: true, message: this.$t('datasource.please_input_acquire_increment'), trigger: 'change' }],
'configuration.connectTimeout': [{ required: true, message: this.$t('datasource.please_input_connect_timeout'), trigger: 'change' }]
},
allTypes: [{ name: 'mysql', label: 'MySQL', type: 'jdbc' },
allTypes: [
{ name: 'mysql', label: 'MySQL', type: 'jdbc'},
{ name: 'oracle', label: 'Oracle', type: 'jdbc' },
{ name: 'sqlServer', label: 'SQL Server', type: 'jdbc' },
{ name: 'pg', label: 'PostgreSQL', type: 'jdbc' },
{ name: 'es', label: 'Elasticsearch', type: 'es' }],
{ name: 'es', label: 'Elasticsearch', type: 'es' },
{ name: 'ch', label: 'ClickHouse', type: 'jdbc' }
],
schemas: [],
compute_mode: [
{type: "DIRECT", label: this.$t('datasource.direct')},
{type: "EXTRACT", label: this.$t('datasource.extract')},
{type: "ALL", label: this.$t('datasource.all_compute_mode')}
],
canEdit: false,
originConfiguration: {}
}
@ -293,6 +312,15 @@ export default {
this.form.configuration.dataSourceType = this.allTypes[i].type
}
}
if(this.form.type === 'es'){
this.compute_mode = [{type: "DIRECT", label: this.$t('datasource.direct')}];
}else {
this.compute_mode = [
{type: "DIRECT", label: this.$t('datasource.direct')},
{type: "EXTRACT", label: this.$t('datasource.extract')},
{type: "ALL", label: this.$t('datasource.all_compute_mode')}
];
}
},
backToList() {
this.$emit('switch-component', { })