diff --git a/backend/pom.xml b/backend/pom.xml index fe17cb8c80..908d3ba808 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -342,11 +342,11 @@ spring-boot-starter-data-ldap --> - + + ru.yandex.clickhouse + clickhouse-jdbc + 0.3.1 + diff --git a/backend/src/main/java/io/dataease/auth/server/AuthServer.java b/backend/src/main/java/io/dataease/auth/server/AuthServer.java index 03925bb8b8..57bce9fbaa 100644 --- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java +++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java @@ -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"; diff --git a/backend/src/main/java/io/dataease/auth/service/AuthUserService.java b/backend/src/main/java/io/dataease/auth/service/AuthUserService.java index 2c2c6cf08b..22462d5fe9 100644 --- a/backend/src/main/java/io/dataease/auth/service/AuthUserService.java +++ b/backend/src/main/java/io/dataease/auth/service/AuthUserService.java @@ -13,6 +13,8 @@ public interface AuthUserService { SysUserEntity getUserByName(String username); + SysUserEntity getUserBySub(String sub); + List roles(Long userId); List permissions(Long userId); diff --git a/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java index 614d6d54f2..fe11af4de1 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java @@ -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 roles(Long userId){ return authMapper.roleCodes(userId); diff --git a/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java index 70b7f9f280..667aaa09e6 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java @@ -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; diff --git a/backend/src/main/java/io/dataease/base/domain/Datasource.java b/backend/src/main/java/io/dataease/base/domain/Datasource.java index 86b2bca643..d8a2f6c4ac 100644 --- a/backend/src/main/java/io/dataease/base/domain/Datasource.java +++ b/backend/src/main/java/io/dataease/base/domain/Datasource.java @@ -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; diff --git a/backend/src/main/java/io/dataease/base/domain/DatasourceExample.java b/backend/src/main/java/io/dataease/base/domain/DatasourceExample.java index c59e358431..c0fe88e1a8 100644 --- a/backend/src/main/java/io/dataease/base/domain/DatasourceExample.java +++ b/backend/src/main/java/io/dataease/base/domain/DatasourceExample.java @@ -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 values) { + addCriterion("compute_type in", values, "computeType"); + return (Criteria) this; + } + + public Criteria andComputeTypeNotIn(List 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 { diff --git a/backend/src/main/java/io/dataease/base/domain/SysUser.java b/backend/src/main/java/io/dataease/base/domain/SysUser.java index e07c73e757..8867cc75c4 100644 --- a/backend/src/main/java/io/dataease/base/domain/SysUser.java +++ b/backend/src/main/java/io/dataease/base/domain/SysUser.java @@ -39,5 +39,7 @@ public class SysUser implements Serializable { private Integer from; + private String sub; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/SysUserExample.java b/backend/src/main/java/io/dataease/base/domain/SysUserExample.java index 800cfe3d76..1b8fc36618 100644 --- a/backend/src/main/java/io/dataease/base/domain/SysUserExample.java +++ b/backend/src/main/java/io/dataease/base/domain/SysUserExample.java @@ -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 values) { + addCriterion("sub in", values, "sub"); + return (Criteria) this; + } + + public Criteria andSubNotIn(List 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 { diff --git a/backend/src/main/java/io/dataease/base/mapper/DatasourceMapper.xml b/backend/src/main/java/io/dataease/base/mapper/DatasourceMapper.xml index 67713c420f..29abb1dcfb 100644 --- a/backend/src/main/java/io/dataease/base/mapper/DatasourceMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/DatasourceMapper.xml @@ -10,6 +10,7 @@ + @@ -73,7 +74,7 @@ - id, `name`, `desc`, `type`, create_time, update_time, create_by, `status` + id, `name`, `desc`, `type`, create_time, update_time, create_by, `status`, compute_type configuration @@ -129,12 +130,12 @@ 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 into datasource @@ -163,6 +164,9 @@ `status`, + + compute_type, + configuration, @@ -192,6 +196,9 @@ #{status,jdbcType=VARCHAR}, + + #{computeType,jdbcType=VARCHAR}, + #{configuration,jdbcType=LONGVARCHAR}, @@ -230,6 +237,9 @@ `status` = #{record.status,jdbcType=VARCHAR}, + + compute_type = #{record.computeType,jdbcType=VARCHAR}, + configuration = #{record.configuration,jdbcType=LONGVARCHAR}, @@ -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} @@ -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} @@ -291,6 +303,9 @@ `status` = #{status,jdbcType=VARCHAR}, + + compute_type = #{computeType,jdbcType=VARCHAR}, + configuration = #{configuration,jdbcType=LONGVARCHAR}, @@ -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} @@ -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} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/SysUserMapper.xml b/backend/src/main/java/io/dataease/base/mapper/SysUserMapper.xml index d2f11fdd43..b779a3a538 100644 --- a/backend/src/main/java/io/dataease/base/mapper/SysUserMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/SysUserMapper.xml @@ -19,6 +19,7 @@ + @@ -81,7 +82,7 @@ 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 @@ -296,6 +305,9 @@ `from` = #{record.from,jdbcType=INTEGER}, + + sub = #{record.sub,jdbcType=VARCHAR}, + @@ -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} @@ -375,6 +388,9 @@ `from` = #{from,jdbcType=INTEGER}, + + sub = #{sub,jdbcType=VARCHAR}, + where user_id = #{userId,jdbcType=BIGINT} @@ -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} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java index d082a0faea..2b1355256f 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java +++ b/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java @@ -25,6 +25,8 @@ public interface AuthMapper { SysUserEntity findUserByName(@Param("username") String username); + SysUserEntity findUserBySub(@Param("sub") String sub); + List roles(@Param("userId") Long userId); diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml index 981dfc5c93..3492d7ec10 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml @@ -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 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 @@ - * - - @@ -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;*/ diff --git a/frontend/src/components/canvas/custom-component/UserView.vue b/frontend/src/components/canvas/custom-component/UserView.vue index 4367d89d25..4aa962993b 100644 --- a/frontend/src/components/canvas/custom-component/UserView.vue +++ b/frontend/src/components/canvas/custom-component/UserView.vue @@ -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) } }, diff --git a/frontend/src/components/canvas/custom-component/component-list.js b/frontend/src/components/canvas/custom-component/component-list.js index 9a3ecfd7fc..391d1590ba 100644 --- a/frontend/src/components/canvas/custom-component/component-list.js +++ b/frontend/src/components/canvas/custom-component/component-list.js @@ -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 diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index c447c28717..17846bd595 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -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', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 79382167c3..f41f8df150 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -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: '頂層組織' }, diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index a36a7ef9f0..d952758531 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -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: '请输入密码打开链接', diff --git a/frontend/src/settings.js b/frontend/src/settings.js index cb801dc20c..10faf444f4 100644 --- a/frontend/src/settings.js +++ b/frontend/src/settings.js @@ -3,6 +3,9 @@ module.exports = { RefreshTokenKey: 'refreshauthorization', LinkTokenKey: 'LINK-PWD-TOKEN', title: 'DataEase', + /* for sso */ + IdTokenKey: 'IdToken', + AccessTokenKey: 'AccessToken', /** * @type {boolean} true | false diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index 46370c74d9..850cbfe545 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -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: { diff --git a/frontend/src/utils/auth.js b/frontend/src/utils/auth.js index fc3495d957..dbefb1bcb2 100644 --- a/frontend/src/utils/auth.js +++ b/frontend/src/utils/auth.js @@ -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) } diff --git a/frontend/src/utils/request.js b/frontend/src/utils/request.js index d71460fee2..7495787389 100644 --- a/frontend/src/utils/request.js +++ b/frontend/src/utils/request.js @@ -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 diff --git a/frontend/src/views/chart/components/drag-item/ChartDragItem.vue b/frontend/src/views/chart/components/drag-item/ChartDragItem.vue index 0b5ba92f6f..400fadab32 100644 --- a/frontend/src/views/chart/components/drag-item/ChartDragItem.vue +++ b/frontend/src/views/chart/components/drag-item/ChartDragItem.vue @@ -49,7 +49,45 @@ - + + + + + + + {{ $t('chart.dateStyle') }} + ({{ $t('chart.'+item.dateStyle) }}) + + + + + {{ $t('chart.y') }} + {{ $t('chart.y_M') }} + {{ $t('chart.y_M_d') }} + {{ $t('chart.H_m_s') }} + {{ $t('chart.y_M_d_H_m') }} + {{ $t('chart.y_M_d_H_m_s') }} + + + + + + + + + {{ $t('chart.datePattern') }} + ({{ $t('chart.'+item.datePattern) }}) + + + + + {{ $t('chart.date_sub') }}(1990-01-01) + {{ $t('chart.date_split') }}(1990/01/01) + + + + + @@ -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 + } } } } diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 07c8dbd807..37773650d7 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -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 => { diff --git a/frontend/src/views/dataset/add/AddDB.vue b/frontend/src/views/dataset/add/AddDB.vue index 22dd735f3d..8ec4f651c0 100644 --- a/frontend/src/views/dataset/add/AddDB.vue +++ b/frontend/src/views/dataset/add/AddDB.vue @@ -28,8 +28,8 @@ - - + + @@ -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) { diff --git a/frontend/src/views/dataset/add/AddSQL.vue b/frontend/src/views/dataset/add/AddSQL.vue index d6b19279a7..dea8838916 100644 --- a/frontend/src/views/dataset/add/AddSQL.vue +++ b/frontend/src/views/dataset/add/AddSQL.vue @@ -18,7 +18,7 @@ - + - - + + @@ -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() { diff --git a/frontend/src/views/dataset/common/DatasetCustomField.vue b/frontend/src/views/dataset/common/DatasetCustomField.vue index 3ec843512f..1de987d639 100644 --- a/frontend/src/views/dataset/common/DatasetCustomField.vue +++ b/frontend/src/views/dataset/common/DatasetCustomField.vue @@ -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) }) } }, diff --git a/frontend/src/views/dataset/data/UnionView.vue b/frontend/src/views/dataset/data/UnionView.vue index 466556fcf3..fcc08d37e2 100644 --- a/frontend/src/views/dataset/data/UnionView.vue +++ b/frontend/src/views/dataset/data/UnionView.vue @@ -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() } diff --git a/frontend/src/views/panel/ViewSelect/index.vue b/frontend/src/views/panel/ViewSelect/index.vue index 696f36b242..d12896fd44 100644 --- a/frontend/src/views/panel/ViewSelect/index.vue +++ b/frontend/src/views/panel/ViewSelect/index.vue @@ -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)) }, diff --git a/frontend/src/views/panel/edit/index.vue b/frontend/src/views/panel/edit/index.vue index 683ee0bef9..4812dda47d 100644 --- a/frontend/src/views/panel/edit/index.vue +++ b/frontend/src/views/panel/edit/index.vue @@ -96,7 +96,6 @@
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; } diff --git a/frontend/src/views/panel/list/PanelViewShow.vue b/frontend/src/views/panel/list/PanelViewShow.vue index f6490ca8dc..e3f5385e06 100644 --- a/frontend/src/views/panel/list/PanelViewShow.vue +++ b/frontend/src/views/panel/list/PanelViewShow.vue @@ -56,7 +56,7 @@
- +
diff --git a/frontend/src/views/system/datasource/DsTree.vue b/frontend/src/views/system/datasource/DsTree.vue index b6e13d60c7..f1b5e482fc 100644 --- a/frontend/src/views/system/datasource/DsTree.vue +++ b/frontend/src/views/system/datasource/DsTree.vue @@ -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' } }, diff --git a/frontend/src/views/system/datasource/form.vue b/frontend/src/views/system/datasource/form.vue index f706fbded0..a135f68ed5 100644 --- a/frontend/src/views/system/datasource/form.vue +++ b/frontend/src/views/system/datasource/form.vue @@ -24,11 +24,22 @@ + + + + + + - - + + @@ -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', { })