commit 7e87c8e5b5f86e03ce6a29dfa32ed07343d031ea
Author: root <13910913995@163.com>
Date: Thu Feb 27 14:44:08 2025 +0800
第一次提交并推送给代码
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..3a472a6
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,7 @@
+*.sql linguist-language=java
+*.yml linguist-language=Java
+*.html linguist-language=Java
+*.js linguist-language=Java
+*.xml linguist-language=Java
+*.css linguist-language=Java
+*.ts linguist-language=Java
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5948770
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,51 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+.idea/
+target/
+.vscode/
+.lh/
+*.iml
+hs_err_pid*
+node_modules/
+dist/
+package-lock.json
+.DS_Store
+.stylelintcache
+core/core-frontend/release/
+plugins/vite-test
+core/core-frontend/.stylelintcache
+/core/core-backend/src/main/resources/static/
+/core/core-backend/src/test
+/core/core-frontend/node/
+/core/core-frontend/lib/
+/core/core-frontend/components.d.ts
+core/core-frontend/src/assets/fsSvg.js
+core/core-frontend/src/assets/fsSvg.html
+.flattened-pom.xml
+/sdk/dataease-plugin-common/
+/sdk/dataease-plugin-datasource/
+/sdk/dataease-plugin-filter/
+/sdk/dataease-plugin-interface/
+/sdk/dataease-plugin-view/
+/extensions/
+.vite/
+/core/backend/
+/classpath:substitule.json
diff --git a/.typos.toml b/.typos.toml
new file mode 100644
index 0000000..8996703
--- /dev/null
+++ b/.typos.toml
@@ -0,0 +1,12 @@
+[default.extend-words]
+ser = "ser"
+Referer = "Referer"
+Encryp = "Encryp"
+OT = "OT"
+Wheres = "Wheres"
+ws = "ws"
+guid = "guid"
+yoy = "yoy"
+Ein = "Ein"
+[files]
+extend-exclude = ["mapFiles/**", "docs"]
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..64402f6
--- /dev/null
+++ b/README.md
@@ -0,0 +1,36 @@
+
+## 什么是 GIS-BI开发平台?
+
+基于GIS的BI(商业智能)低代码开发平台是一个集成地理信息系统(GIS)和商业智能(BI)功能的应用配置开发平台,
+旨在通过低代码或无代码的方式快速构建具备地理空间数据可视化、分析与业务洞察能力的应用。
+该平台支持用户通过直观的界面和可配置组件,将空间数据与业务数据相结合,
+进行可视化展示、动态交互、空间分析与多维数据探索,帮助决策者高效地获取空间相关的商业洞察,
+同时降低开发复杂度和技术门槛。
+
+**GIS-BI 的价值:**
+
+- 提升开发效率:平台提供GIS、BI功能模块和可视化组件库,通过拖拽式操作和模板复用,显著减少从零开发的时间和成本。
+- 缩短开发周期:低代码特性让开发团队专注于核心功能的实现,大幅缩短项目的研发周期,提升整体开发效率。
+- 减少技术门槛:非专业开发人员也可以参与平台应用的配置和开发,优化技术资源配置。
+- 一致的用户体验:统一的开发框架和组件库确保项目交付的界面美观性和功能一致性,增强客户满意度。
+
+
+**GIS-BI 支持的数据源:**
+
+- OLTP 数据库: MySQL、Oracle、SQL Server、PostgreSQL、MariaDB、Db2、TiDB、MongoDB-BI 等;
+- OLAP 数据库: ClickHouse、Apache Doris、Apache Impala、StarRocks 等;
+- 数据仓库/数据湖: Amazon RedShift 等;
+- 数据文件: Excel、CSV 等;
+- API 数据源。
+
+## 平台技术架构
+综合考虑技术生态、团队能力和平台功能需求,初步考虑以下的技术组合:
+
+- 前端:Vue + ElementUI + Mapbox GL(可结合已有GIS资源选择) + ECharts/AntV
+- 后端:Spring Boot3.0 + PostgreSQL + PostGIS
+- 低代码支持:DataEase 开源二次开发
+- DevOps:Docker + Kubernetes
+
+
+## 平台功能框架
+
\ No newline at end of file
diff --git a/core/core-backend/.gitkeep b/core/core-backend/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/core/core-backend/pom.xml b/core/core-backend/pom.xml
new file mode 100644
index 0000000..a1917fc
--- /dev/null
+++ b/core/core-backend/pom.xml
@@ -0,0 +1,325 @@
+
+
+
+ core
+ io.dataease
+ ${dataease.version}
+
+
+ 4.0.0
+ jar
+ core-backend
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+ io.dataease
+ api-base
+ ${dataease.version}
+
+
+ io.dataease
+ api-permissions
+ ${dataease.version}
+
+
+ io.dataease
+ api-sync
+ ${dataease.version}
+
+
+ com.mysql
+ mysql-connector-j
+
+
+ org.apache.commons
+ commons-dbcp2
+ ${commons-dbcp2.version}
+
+
+
+ org.antlr
+ antlr
+ ${antlr.version}
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ com.jayway.jsonpath
+ json-path
+ [2.9.0, )
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
+
+ com.fit2cloud
+ quartz-spring-boot-starter
+ 1.0.8
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+
+
+
+
+
+ standalone
+
+ true
+
+
+ standalone
+
+
+
+
+ com.h2database
+ h2
+
+
+ org.seleniumhq.selenium
+ selenium-java
+ ${selenium-java.version}
+
+
+ org.eclipse.angus
+ angus-mail
+ ${angus-mail.version}
+
+
+ org.eclipse.angus
+ angus-activation
+
+
+
+
+ com.itextpdf
+ itext7-core
+ ${itextpdf.version}
+ pom
+
+
+ com.vladsch.flexmark
+ flexmark-all
+ ${flexmark.version}
+
+
+
+
+
+
+ maven-clean-plugin
+
+
+
+ src/main/resources/static
+
+ **
+
+ false
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+
+
+ copy-front-2-back
+ generate-resources
+
+
+
+
+
+
+
+
+
+
+ run
+
+
+
+
+
+
+
+
+
+
+ desktop
+
+ desktop
+
+
+
+ com.h2database
+ h2
+
+
+
+
+
+ maven-clean-plugin
+
+
+
+ src/main/resources/static
+
+ **
+
+ false
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+
+
+ copy-front-2-back
+ generate-resources
+
+
+
+
+
+
+
+
+
+
+ run
+
+
+
+
+
+
+
+
+
+ distributed
+
+ distributed
+
+
+
+
+ io.dataease
+ distributed
+ ${project.version}
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+ io/dataease/substitute/**
+
+
+
+
+
+
+
+
+
+
+
+
+ src/main/resources
+ true
+
+ **/*.properties
+ **/*.xml
+ **/*.yml
+ **/*.sql
+ **/*.xlsx
+
+
+ static/**/*.*
+
+
+
+ src/main/resources
+ false
+
+ static/**/*.*
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ CoreApplication
+ ZIP
+
+
+
+
+ repackage
+
+
+
+
+
+
+
+
+
+ fit2cloud-public
+ Fit2cloud Public
+ https://repository.fit2cloud.com/repository/fit2cloud-public/
+
+
+
+
diff --git a/core/core-backend/src/main/resources/application-distributed.yml b/core/core-backend/src/main/resources/application-distributed.yml
new file mode 100644
index 0000000..ed0fc3b
--- /dev/null
+++ b/core/core-backend/src/main/resources/application-distributed.yml
@@ -0,0 +1,28 @@
+
+spring:
+
+ cloud:
+ nacos:
+ discovery:
+ enabled: true
+ server-addr: 127.0.0.1:8848
+ datasource:
+ url: jdbc:mysql://localhost:3306/de_manage?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false
+ username: root
+ password: 1qaz@WSX
+ flyway:
+ enabled: false
+ messages:
+ basename: i18n/core
+
+
+dynamic:
+ datasource:
+ official-ds:
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/de_official?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false
+ username: root
+ password: 1qaz@WSX
+
+mybatis-plus:
+ mapper-locations: classpath:mybatis/*.xml
diff --git a/core/core-backend/src/main/resources/application-standalone.yml b/core/core-backend/src/main/resources/application-standalone.yml
new file mode 100644
index 0000000..dc736ca
--- /dev/null
+++ b/core/core-backend/src/main/resources/application-standalone.yml
@@ -0,0 +1,19 @@
+spring:
+ datasource:
+ url: jdbc:mysql://localhost:3306/dataease?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
+ username: root
+ password: 123456
+ messages:
+ basename: i18n/lic,i18n/core,i18n/permissions,i18n/xpack,i18n/sync
+ flyway:
+ enabled: true
+ table: de_standalone_version
+ validate-on-migrate: false
+ locations: classpath:db/migration
+ baseline-on-migrate: true
+ out-of-order: true
+
+mybatis-plus:
+ mapper-locations: classpath:mybatis/*.xml
+
+
diff --git a/core/core-backend/src/main/resources/application.yml b/core/core-backend/src/main/resources/application.yml
new file mode 100644
index 0000000..498dc93
--- /dev/null
+++ b/core/core-backend/src/main/resources/application.yml
@@ -0,0 +1,69 @@
+server:
+ port: 8100
+ max-http-request-header-size: 500KB
+ tomcat:
+ connection-timeout: 70000
+spring:
+ profiles:
+ active: '@profiles.active@'
+ application:
+ name: core-backend
+ messages:
+ encoding: UTF-8
+ main:
+ allow-circular-references: true
+ cache:
+ type: jcache
+ jcache:
+ config: classpath:ehcache/ehcache.xml
+ data:
+ redis:
+ host: 127.0.0.1
+ port: 6379
+ password: 123456
+ database: 0
+ jackson:
+ parser:
+ allow-numeric-leading-zeros: true
+management:
+ health:
+ redis:
+ enabled: false
+mybatis:
+ configuration:
+ map-underscore-to-camel-case: true
+logging:
+ file:
+ path: /opt/dataease2.0/logs/dataease
+# sql日志生产环境注释掉
+#mybatis-plus:
+# configuration:
+# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+quartz:
+ enabled: true
+ scheduler-name: deSyncJob
+
+dataease:
+ version: '@project.version@'
+ login_timeout: 2880
+ xpack-front-distributed: true
+ origin-list: http://localhost:8080
+ apisix-api:
+ domain: http://127.0.0.1:9180
+ key: edd1c9f034335f136f87ad84b625c8f1
+
+# springdoc-openapi项目配置
+springdoc:
+ swagger-ui:
+ path: /swagger-ui.html
+ tags-sorter: alpha
+ #operations-sorter: alpha
+ api-docs:
+ path: /v3/api-docs
+# knife4j的增强配置,不需要增强可以不配
+knife4j:
+ enable: true
+ setting:
+ language: zh_cn
+ enable-swagger-models: false
diff --git a/core/core-backend/src/main/resources/ehcache/ehcache.xml b/core/core-backend/src/main/resources/ehcache/ehcache.xml
new file mode 100644
index 0000000..e4226dd
--- /dev/null
+++ b/core/core-backend/src/main/resources/ehcache/ehcache.xml
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 1000
+ 10
+
+
+
+
+
+ java.lang.String
+ io.dataease.rsa.dao.entity.CoreRsa
+
+
+
+
+
+ java.lang.String
+ java.util.List
+
+
+
+
+ java.lang.String
+ java.util.List
+
+
+
+ java.lang.String
+ java.util.List
+
+
+
+ java.lang.String
+ java.util.List
+
+
+
+ java.lang.String
+ java.util.List
+
+
+ java.lang.String
+ java.util.List
+
+
+
+ java.lang.String
+ java.lang.Integer
+
+
+
+ java.lang.String
+ java.util.List
+
+
+
+ java.lang.String
+ java.util.List
+
+
+
+ java.lang.String
+ java.util.List
+
+
+
+ java.lang.String
+ io.dataease.license.bo.F2CLicResult
+
+
+ java.lang.String
+ io.dataease.api.map.vo.AreaNode
+
+
+ java.lang.String
+ java.lang.Object
+
+
+ java.lang.String
+ java.util.List
+
+
+ java.lang.String
+ java.lang.Object
+
+
+ java.lang.String
+ java.lang.Object
+
+
+
+ java.lang.String
+ java.lang.Integer
+
+ ${dataease.login_timeout}
+
+
+
+ io.dataease.listener.MyCacheListener
+ ASYNCHRONOUS
+ ORDERED
+ CREATED
+ UPDATED
+ EXPIRED
+ REMOVED
+
+
+
+ 100
+ 10
+ 200
+
+
+
+
+
+
+
diff --git a/core/core-backend/src/main/resources/i18n/core.properties b/core/core-backend/src/main/resources/i18n/core.properties
new file mode 100644
index 0000000..c7d3485
--- /dev/null
+++ b/core/core-backend/src/main/resources/i18n/core.properties
@@ -0,0 +1,2 @@
+login.validator.name1=
+login.validator.pwd1=
\ No newline at end of file
diff --git a/core/core-backend/src/main/resources/i18n/core_en_US.properties b/core/core-backend/src/main/resources/i18n/core_en_US.properties
new file mode 100644
index 0000000..13c7b02
--- /dev/null
+++ b/core/core-backend/src/main/resources/i18n/core_en_US.properties
@@ -0,0 +1,205 @@
+
+login.validator.name1=Username/Email/Phone number cannot be empty
+login.validator.pwd1=Password cannot be empty
+
+i18n_menu.home=Home
+i18n_menu.workbranch=Workbench
+i18n_menu.visualized=Visualization
+i18n_menu.template=Template
+i18n_menu.application=Application
+i18n_menu.system=System Management
+i18n_menu.template-market=Template Market
+i18n_menu.template-setting=Template Management
+i18n_menu.view=Data Display
+i18n_menu.data=Data Preparation
+i18n_menu.panel=Dashboard
+i18n_menu.data-filling-manage=Data Reporting
+i18n_menu.screen=Data Screen
+i18n_menu.dataset=Dataset
+i18n_menu.datasource=Data Source
+i18n_menu.user=User Management
+i18n_menu.org=Organization Management
+i18n_menu.auth=Permission Configuration
+i18n_menu.report=Scheduled Report
+i18n_menu.sync=Synchronization Management
+i18n_menu.association=Bloodline Analysis
+i18n_menu.threshold=Alert Management
+i18n_menu.webhook=Webhook Management
+i18n_menu.summary=Overview
+i18n_menu.ds=Data Connection Management
+i18n_menu.task=Task Management
+i18n_menu.embedded=Embedded Management
+i18n_menu.plugin=Plugin Management
+i18n_menu.platform=Platform Integration
+i18n_menu.appearance=Appearance Configuration
+i18n_menu.sysVariable=System Variables
+i18n_menu.sysTypeface=Font Management
+i18n_menu.font=Font Management
+i18n_menu.msg-fill=Reporting Task
+i18n_field_name_repeat=Duplicate field name:
+i18n_pid_not_eq_id=The target for moving cannot be itself or its subdirectory
+i18n_ds_name_exists=Name is duplicated under this group
+i18n_table_id_can_not_empty=Query node cannot be empty
+i18n_no_fields=Fields cannot be empty
+i18n_no_field=The field does not exist
+i18n_union_ds_no_checked=No fields are selected
+i18n_field_name_duplicated=Field name is duplicated
+i18n_can_not_cross_ds=Cross dataset operations are not supported
+i18n_dataset_ds_error=The data source used by the current dataset has been deleted
+i18n_union_field_can_not_empty=Association field cannot be empty
+i18n_table_duplicate=The same node needs to be dragged in again to continue creating a new dataset
+i18n_no_column_permission=No column permissions
+i18n_fetch_error=SQL execution failed, please check if the table, fields, association relationships, etc., are correct and edit again.
+i18n_no_datasource_permission=No data source access permissions
+i18n_no_dataset_permission=No dataset access permissions
+i18n_not_full=The current data source does not support full join
+
+i18n_field_circular_ref=Fields have circular references
+
+i18n_chart_not_handler=Unable to handle this chart type
+i18n_chart_delete=Chart does not exist
+i18n_no_ds=Dataset does not exist or no permissions
+i18n_datasource_delete=Data source does not exist
+i18n_gauge_field_change=The field used has changed, please edit again
+i18n_gauge_field_delete=The field used has been deleted, please edit again
+i18n_no_id=ID cannot be empty
+i18n_name_limit_100=Name cannot exceed 100 characters
+i18n_field_circular_error=Field parsing error, possible reasons: field has been deleted, calculation field reference level is too deep, circular references exist, etc., please check the table nodes and fields and edit again.
+
+i18n_invalid_ds=Data source is invalid
+
+i18n_user_disable=User has been disabled and cannot log in
+i18n_login_name_pwd_err=Username or password is incorrect
+i18n_error_login_type=Login type error
+i18n_schema_is_empty=Schema is empty!
+i18n_table_name_repeat=Name is duplicated:
+i18n_sql_not_empty=SQL cannot be empty
+i18n_menu.parameter=System Parameters
+i18n_user_old_pwd_error=Original password is incorrect
+i18n_menu.toolbox-log=Operation Logs
+
+i18n_year=Year
+i18n_month=Month
+i18n_day=Day
+i18n_hour=Hour
+i18n_minute=Minute
+i18n_second=Second
+
+i18n_no_datasource_permission_to_create_column=No data source access permissions, unable to create table fields
+i18n_df_folder_cannot_to_search=Folders cannot query data
+i18n_df_no_primary_key=No primary key
+i18n_df_cannot_operate_folder=Cannot operate on folders
+i18n_df_cannot_be_none=[%s] cannot be empty
+i18n_df_value_cannot_be_none=[%s] value: %s cannot be empty
+i18n_df_value_exists_in_database=[%s] value: %s already exists in the database, cannot be duplicated
+i18n_df_data=Data
+i18n_df_start=Start
+i18n_df_end=End
+i18n_df_datasource_not_found=No data source found
+i18n_df_datasource_does_not_enable_data_filling=This data source has not enabled data reporting configuration
+i18n_df_builtin_datasource=Built-in database
+i18n_df_folder_required=Folder is required
+i18n_df_form_not_exists=Form does not exist
+i18n_df_name_can_not_empty=Name cannot be empty
+i18n_df_template=Template
+i18n_df_task_status_is_null_or_finished=Task status is null or completed
+i18n_df_task_need_task_id=Task ID must be specified
+i18n_df_not_current_task_user=Not the target user for the current task
+i18n_df_miss_parameter=Missing parameter
+i18n_df_no_running_instance=No running instances for the current task
+i18n_df_value=Value
+i18n_df_format_error=Format parsing error
+i18n_df_cannot_earlier_than=Cannot be earlier than
+i18n_df_cannot_be_all_null=Cannot have only one empty
+i18n_df_value_not_in_range=Value is not within the range
+i18n_df_value_value_not_in_range=Value: %s is not within the range
+i18n_df_required=Required
+i18n_df_must_unique=Duplicate values are not allowed
+i18n_df_excel_parsing_error=Excel parsing error
+i18n_df_excel_is_empty=This Excel has no data
+i18n_df_excel_template_column_not_fit=Template field count does not match
+i18n_df_selection=Option value is
+i18n_df_date_format=Date format
+i18n_df_integer=Integer
+i18n_df_decimal=Decimal
+i18n_df_multiple_value_split=Multiple values are separated by semicolon "; "
+i18n_df_email_type=Email format
+i18n_df_phone_type=Phone number format
+i18n_df_lt_check=Value needs to be less than %s: %s
+i18n_df_gt_check=Value needs to be greater than %s: %s
+i18n_df_le_check=Value needs to be less than or equal to %s: %s
+i18n_df_ge_check=Value needs to be greater than or equal to %s: %s
+i18n_df_column_exists=The column: %s exists
+
+i18n_wrong_email=Email format is incorrect
+i18n_wrong_tel=Phone number format is incorrect
+
+
+i18n_copilot_cross_ds_error=Cross-source datasets do not support this feature
+
+i18n_template_recommend=Recommended
+i18n_template_recent=Recently Used
+
+i18n_default_org=Default Organization
+i18n_org_admin=Organization Admin
+i18n_ordinary_role=Ordinary User
+i18n_sys_admin=System Admin
+
+i18n_threshold_logic_eq=Equal to
+i18n_threshold_logic_not_eq=Not equal to
+i18n_threshold_logic_lt=Less than
+i18n_threshold_logic_le=Less than or equal to
+i18n_threshold_logic_gt=Greater than
+i18n_threshold_logic_ge=Greater than or equal to
+i18n_threshold_logic_in=Belong to
+i18n_threshold_logic_not_in=Do not belong to
+i18n_threshold_logic_like=Contains
+i18n_threshold_logic_not_like=Does not contain
+i18n_threshold_logic_null=Empty
+i18n_threshold_logic_not_null=Not empty
+i18n_threshold_logic_empty=Empty string
+i18n_threshold_logic_not_empty=Non-empty string
+i18n_threshold_logic_between=Range is
+i18n_threshold_logic_and=And
+i18n_threshold_logic_or=Or
+i18n_threshold_max=Maximum value
+i18n_threshold_min=Minimum value
+i18n_threshold_average=Average value
+i18n_time_year=Year
+i18n_time_month=Month
+i18n_time_date=Day
+i18n_time_hour=Hour
+i18n_time_minute=Minute
+i18n_time_second=Second
+i18n_time_ago=Ago
+i18n_time_later=Later
+i18n_time_year_current=Current year
+i18n_time_year_last=Last year
+i18n_time_year_next=Next year
+i18n_time_month_current=Current month
+i18n_time_month_last=Last month
+i18n_time_month_next=Next month
+i18n_time_month_start=Beginning of the year
+i18n_time_month_end=End of the year
+i18n_time_date_current=Today
+i18n_time_date_last=Yesterday
+i18n_time_date_next=Tomorrow
+i18n_time_date_start=Beginning of the month
+i18n_time_date_end=End of the month
+
+i18n_dataset_create_error=Create error,please try again
+i18n_dataset_ds_delete=Datasource deleted,this dataset can not be show
+i18n_dataset_plugin_error=Datasource plugin is not exist
+i18n_dataset_cross_error=Dataset with more than two data sources is not supported
+i18n_board=Board
+i18n_invalid_connection=Invalid connection.
+i18n_check_datasource_connection=Please check the validity of the datasource.
+
+i18n_datasource_not_exists=Datasource not exists!
+
+i18n_geo_exists=An area with the same name already exists\uFF01
+i18n_geo_sub_exists=A sub-area with the same name already exists\uFF01
+i18n_user_new_pwd_error=Password format: 8-20 characters and must include at least one uppercase letter, one lowercase letter, one number, and one special character.
+i18n_user_pwd_same_error=Old and new passwords cannot be the same
+
+i18n_copilot_ds=Only supports MySQL datasource
diff --git a/core/core-backend/src/main/resources/i18n/core_zh_CN.properties b/core/core-backend/src/main/resources/i18n/core_zh_CN.properties
new file mode 100644
index 0000000..e7122b8
--- /dev/null
+++ b/core/core-backend/src/main/resources/i18n/core_zh_CN.properties
@@ -0,0 +1,204 @@
+login.validator.name1=\u8D26\u53F7/\u90AE\u7BB1/\u624B\u673A\u53F7\u4E0D\u80FD\u4E3A\u7A7A
+login.validator.pwd1=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A
+
+i18n_menu.home=\u9996\u9875
+i18n_menu.workbranch=\u5DE5\u4F5C\u53F0
+i18n_menu.visualized=\u53EF\u89C6\u5316
+i18n_menu.template=\u6A21\u7248
+i18n_menu.application=\u5E94\u7528
+i18n_menu.system=\u7CFB\u7EDF\u7BA1\u7406
+i18n_menu.template-market=\u6A21\u677F\u5E02\u573A
+i18n_menu.template-setting=\u6A21\u677F\u7BA1\u7406
+i18n_menu.view=\u6570\u636E\u5C55\u793A
+i18n_menu.data=\u6570\u636E\u51C6\u5907
+i18n_menu.panel=\u4EEA\u8868\u677F
+i18n_menu.data-filling-manage=\u6570\u636E\u586B\u62A5
+i18n_menu.screen=\u6570\u636E\u5927\u5C4F
+i18n_menu.dataset=\u6570\u636E\u96C6
+i18n_menu.datasource=\u6570\u636E\u6E90
+i18n_menu.user=\u7528\u6237\u7BA1\u7406
+i18n_menu.org=\u7EC4\u7EC7\u7BA1\u7406
+i18n_menu.auth=\u6743\u9650\u914D\u7F6E
+i18n_menu.report=\u5B9A\u65F6\u62A5\u544A
+i18n_menu.sync=\u540C\u6B65\u7BA1\u7406
+i18n_menu.association=\u8840\u7F18\u5206\u6790
+i18n_menu.threshold=\u544A\u8B66\u7BA1\u7406
+i18n_menu.webhook=Webhook \u7BA1\u7406
+i18n_menu.summary=\u6982\u89C8
+i18n_menu.ds=\u6570\u636E\u8FDE\u63A5\u7BA1\u7406
+i18n_menu.task=\u4EFB\u52A1\u7BA1\u7406
+i18n_menu.embedded=\u5D4C\u5165\u5F0F\u7BA1\u7406
+i18n_menu.plugin=\u63D2\u4EF6\u7BA1\u7406
+i18n_menu.platform=\u5E73\u53F0\u5BF9\u63A5
+i18n_menu.appearance=\u5916\u89C2\u914D\u7F6E
+i18n_menu.sysVariable=\u7CFB\u7EDF\u53D8\u91CF
+i18n_menu.sysTypeface=\u5B57\u4F53\u7BA1\u7406
+i18n_menu.font=\u5B57\u4F53\u7BA1\u7406
+i18n_menu.msg-fill=\u586B\u62A5\u4EFB\u52A1
+i18n_field_name_repeat=\u6709\u91CD\u590D\u5B57\u6BB5\u540D\uFF1A
+i18n_pid_not_eq_id=\u79FB\u52A8\u76EE\u6807\u4E0D\u80FD\u662F\u81EA\u5DF1\u6216\u5B50\u76EE\u5F55
+i18n_ds_name_exists=\u8BE5\u5206\u7EC4\u4E0B\u540D\u79F0\u91CD\u590D
+i18n_table_id_can_not_empty=\u67E5\u8BE2\u8282\u70B9\u4E0D\u80FD\u4E3A\u7A7A
+i18n_no_fields=\u5B57\u6BB5\u4E0D\u80FD\u4E3A\u7A7A
+i18n_no_field=\u8BE5\u5B57\u6BB5\u4E0D\u5B58\u5728
+i18n_union_ds_no_checked=\u6CA1\u6709\u5B57\u6BB5\u9009\u4E2D
+i18n_field_name_duplicated=\u5B57\u6BB5\u540D\u91CD\u590D
+i18n_can_not_cross_ds=\u4E0D\u652F\u6301\u8DE8\u6570\u636E\u96C6\u64CD\u4F5C
+i18n_dataset_ds_error=\u5F53\u524D\u6570\u636E\u96C6\u7528\u5230\u7684\u6570\u636E\u6E90\u5DF2\u88AB\u5220\u9664
+i18n_union_field_can_not_empty=\u5173\u8054\u5B57\u6BB5\u4E0D\u80FD\u4E3A\u7A7A
+i18n_table_duplicate=\u76F8\u540C\u8282\u70B9\u9700\u91CD\u65B0\u62D6\u5165\u624D\u80FD\u7EE7\u7EED\u65B0\u5EFA\u6570\u636E\u96C6
+i18n_no_column_permission=\u6CA1\u6709\u5217\u6743\u9650
+i18n_fetch_error=SQL\u6267\u884C\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u8868\u3001\u5B57\u6BB5\u3001\u5173\u8054\u5173\u7CFB\u7B49\u4FE1\u606F\u662F\u5426\u6B63\u786E\u5E76\u91CD\u65B0\u7F16\u8F91\u3002
+i18n_no_datasource_permission=\u65E0\u6570\u636E\u6E90\u8BBF\u95EE\u6743\u9650
+i18n_no_dataset_permission=\u65E0\u6570\u636E\u96C6\u8BBF\u95EE\u6743\u9650
+i18n_not_full=\u5F53\u524D\u6570\u636E\u6E90\u4E0D\u652F\u6301\u5168\u8FDE\u63A5
+
+i18n_field_circular_ref=\u5B57\u6BB5\u5B58\u5728\u5FAA\u73AF\u5F15\u7528
+
+i18n_chart_not_handler=\u65E0\u6CD5\u5904\u7406\u8BE5\u56FE\u8868\u7C7B\u578B
+i18n_chart_delete=\u56FE\u8868\u4E0D\u5B58\u5728
+i18n_no_ds=\u6570\u636E\u96C6\u4E0D\u5B58\u5728\u6216\u6CA1\u6709\u6743\u9650
+i18n_datasource_delete=\u6570\u636E\u6E90\u4E0D\u5B58\u5728
+i18n_gauge_field_change=\u6240\u7528\u5B57\u6BB5\u53D1\u751F\u53D8\u66F4\uFF0C\u8BF7\u91CD\u65B0\u7F16\u8F91
+i18n_gauge_field_delete=\u6240\u7528\u5B57\u6BB5\u5DF2\u5220\u9664\uFF0C\u8BF7\u91CD\u65B0\u7F16\u8F91
+i18n_no_id=id\u4E0D\u80FD\u4E3A\u7A7A
+i18n_name_limit_100=\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7100\u5B57\u7B26
+i18n_field_circular_error=\u5B57\u6BB5\u89E3\u6790\u9519\u8BEF\uFF0C\u53EF\u80FD\u539F\u56E0\uFF1A\u5B57\u6BB5\u5DF2\u5220\u9664\u3001\u8BA1\u7B97\u5B57\u6BB5\u5F15\u7528\u5C42\u7EA7\u8FC7\u6DF1\u3001\u5B58\u5728\u5FAA\u73AF\u5F15\u7528\u7B49\uFF0C\u8BF7\u68C0\u67E5\u8868\u8282\u70B9\u548C\u5B57\u6BB5\u5E76\u91CD\u65B0\u7F16\u8F91\u3002
+
+i18n_invalid_ds=\u6570\u636E\u6E90\u65E0\u6548
+
+i18n_user_disable=\u7528\u6237\u5DF2\u88AB\u7981\u7528\uFF0C\u65E0\u6CD5\u767B\u5F55
+i18n_login_name_pwd_err=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF
+i18n_error_login_type=\u767B\u5F55\u7C7B\u578B\u9519\u8BEF
+i18n_schema_is_empty=schema \u4E3A\u7A7A\uFF01
+i18n_table_name_repeat=\u540D\u79F0\u91CD\u590D:
+i18n_sql_not_empty=sql \u4E0D\u80FD\u4E3A\u7A7A
+i18n_menu.parameter=\u7CFB\u7EDF\u53C2\u6570
+i18n_user_old_pwd_error=\u539F\u59CB\u5BC6\u7801\u9519\u8BEF
+i18n_menu.toolbox-log=\u64CD\u4F5C\u65E5\u5FD7
+
+i18n_year=\u5E74
+i18n_month=\u6708
+i18n_day=\u5929
+i18n_hour=\u5C0F\u65F6
+i18n_minute=\u5206\u949F
+i18n_second=\u79D2
+
+i18n_no_datasource_permission_to_create_column=\u65E0\u6570\u636E\u6E90\u8BBF\u95EE\u6743\u9650\uFF0C\u65E0\u6CD5\u521B\u5EFA\u8868\u5B57\u6BB5
+i18n_df_folder_cannot_to_search=\u6587\u4EF6\u5939\u4E0D\u80FD\u67E5\u8BE2\u6570\u636E
+i18n_df_no_primary_key=\u6CA1\u6709\u4E3B\u952E
+i18n_df_cannot_operate_folder=\u4E0D\u80FD\u64CD\u4F5C\u6587\u4EF6\u5939
+i18n_df_cannot_be_none=[%s] \u4E0D\u80FD\u4E3A\u7A7A
+i18n_df_value_cannot_be_none=[%s] \u503C: %s \u4E0D\u80FD\u4E3A\u7A7A
+i18n_df_value_exists_in_database=[%s] \u503C: %s \u5728\u6570\u636E\u5E93\u4E2D\u5DF2\u5B58\u5728, \u4E0D\u80FD\u91CD\u590D
+i18n_df_data=\u6570\u636E
+i18n_df_start=\u5F00\u59CB
+i18n_df_end=\u7ED3\u675F
+i18n_df_datasource_not_found=\u6CA1\u6709\u627E\u5230\u6570\u636E\u6E90
+i18n_df_datasource_does_not_enable_data_filling=\u8BE5\u6570\u636E\u6E90\u6CA1\u6709\u542F\u7528\u6570\u636E\u586B\u62A5\u914D\u7F6E
+i18n_df_builtin_datasource=\u5185\u5EFA\u6570\u636E\u5E93
+i18n_df_folder_required=\u76EE\u5F55\u5FC5\u9009
+i18n_df_form_not_exists=\u8868\u5355\u4E0D\u5B58\u5728
+i18n_df_name_can_not_empty=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+i18n_df_template=\u6A21\u677F
+i18n_df_task_status_is_null_or_finished=\u4EFB\u52A1\u72B6\u6001\u4E3A\u7A7A\u6216\u5DF2\u5B8C\u6210
+i18n_df_task_need_task_id=\u9700\u6307\u5B9A\u4EFB\u52A1ID
+i18n_df_not_current_task_user=\u4E0D\u662F\u5F53\u524D\u4EFB\u52A1\u7684\u76EE\u6807\u7528\u6237
+i18n_df_miss_parameter=\u7F3A\u5931\u53C2\u6570
+i18n_df_no_running_instance=\u5F53\u524D\u4EFB\u52A1\u6682\u65F6\u65E0\u8FD0\u884C\u5B9E\u4F8B
+i18n_df_value=\u503C
+i18n_df_format_error=\u683C\u5F0F\u89E3\u6790\u9519\u8BEF
+i18n_df_cannot_earlier_than=\u4E0D\u80FD\u65E9\u4E8E
+i18n_df_cannot_be_all_null=\u4E0D\u80FD\u53EA\u6709\u4E00\u4E2A\u4E3A\u7A7A
+i18n_df_value_not_in_range=\u503C\u4E0D\u5728\u8303\u56F4\u5185
+i18n_df_value_value_not_in_range=\u503C: %s \u4E0D\u5728\u8303\u56F4\u5185
+i18n_df_required=\u5FC5\u586B
+i18n_df_must_unique=\u4E0D\u5141\u8BB8\u91CD\u590D\u503C
+i18n_df_excel_parsing_error=Excel\u89E3\u6790\u9519\u8BEF
+i18n_df_excel_is_empty=\u8BE5Excel\u6CA1\u6709\u6570\u636E
+i18n_df_excel_template_column_not_fit=\u6A21\u677F\u5B57\u6BB5\u4E2A\u6570\u4E0D\u5339\u914D
+i18n_df_selection=\u9009\u9879\u503C\u4E3A
+i18n_df_date_format=\u65E5\u671F\u683C\u5F0F
+i18n_df_integer=\u6574\u5F62\u6570\u5B57
+i18n_df_decimal=\u5C0F\u6570\u6570\u5B57
+i18n_df_multiple_value_split=\u591A\u4E2A\u503C\u4F7F\u7528\u5206\u53F7";"\u5206\u5272
+i18n_df_email_type=\u90AE\u7BB1\u683C\u5F0F
+i18n_df_phone_type=\u624B\u673A\u53F7\u683C\u5F0F
+i18n_df_lt_check=\u503C\u9700\u8981\u5C0F\u4E8E %s: %s
+i18n_df_gt_check=\u503C\u9700\u8981\u5927\u4E8E %s: %s
+i18n_df_le_check=\u503C\u9700\u8981\u5C0F\u4E8E\u7B49\u4E8E %s: %s
+i18n_df_ge_check=\u503C\u9700\u8981\u5927\u4E8E\u7B49\u4E8E %s: %s
+i18n_df_column_exists=\u5B57\u6BB5: %s \u5DF2\u5B58\u5728
+
+i18n_wrong_email=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF
+i18n_wrong_tel=\u624B\u673A\u53F7\u7801\u683C\u5F0F\u9519\u8BEF
+
+
+i18n_copilot_cross_ds_error=\u8DE8\u6E90\u6570\u636E\u96C6\u4E0D\u652F\u6301\u8BE5\u529F\u80FD
+
+i18n_template_recommend=\u63A8\u8350
+i18n_template_recent=\u6700\u8FD1\u4F7F\u7528
+
+i18n_default_org=\u9ED8\u8BA4\u7EC4\u7EC7
+i18n_org_admin=\u7EC4\u7EC7\u7BA1\u7406\u5458
+i18n_ordinary_role=\u666E\u901A\u7528\u6237
+i18n_sys_admin=\u7CFB\u7EDF\u7BA1\u7406\u5458
+
+i18n_threshold_logic_eq=\u7B49\u4E8E
+i18n_threshold_logic_not_eq=\u4E0D\u7B49\u4E8E
+i18n_threshold_logic_lt=\u5C0F\u4E8E
+i18n_threshold_logic_le=\u5C0F\u4E8E\u7B49\u4E8E
+i18n_threshold_logic_gt=\u5927\u4E8E
+i18n_threshold_logic_ge=\u5927\u4E8E\u7B49\u4E8E
+i18n_threshold_logic_in=\u5C5E\u4E8E
+i18n_threshold_logic_not_in=\u4E0D\u5C5E\u4E8E
+i18n_threshold_logic_like=\u5305\u542B
+i18n_threshold_logic_not_like=\u4E0D\u5305\u542B
+i18n_threshold_logic_null=\u7A7A
+i18n_threshold_logic_not_null=\u4E0D\u7A7A
+i18n_threshold_logic_empty=\u7A7A\u5B57\u7B26\u4E32
+i18n_threshold_logic_not_empty=\u975E\u7A7A\u5B57\u7B26\u4E32
+i18n_threshold_logic_between=\u8303\u56F4\u662F
+i18n_threshold_logic_and=\u4E14
+i18n_threshold_logic_or=\u6216
+i18n_threshold_max=\u6700\u5927\u503C
+i18n_threshold_min=\u6700\u5C0F\u503C
+i18n_threshold_average=\u5E73\u5747\u503C
+i18n_time_year=\u5E74
+i18n_time_month=\u6708
+i18n_time_date=\u65E5
+i18n_time_hour=\u65F6
+i18n_time_minute=\u5206
+i18n_time_second=\u79D2
+i18n_time_ago=\u524D
+i18n_time_later=\u540E
+i18n_time_year_current=\u5F53\u5E74
+i18n_time_year_last=\u53BB\u5E74
+i18n_time_year_next=\u660E\u5E74
+i18n_time_month_current=\u5F53\u6708
+i18n_time_month_last=\u4E0A\u4E2A\u6708
+i18n_time_month_next=\u4E0B\u4E2A\u6708
+i18n_time_month_start=\u5E74\u521D
+i18n_time_month_end=\u5E74\u672B
+i18n_time_date_current=\u4ECA\u5929
+i18n_time_date_last=\u6628\u5929
+i18n_time_date_next=\u660E\u5929
+i18n_time_date_start=\u6708\u521D
+i18n_time_date_end=\u6708\u672B
+
+i18n_dataset_create_error=\u6570\u636E\u96C6\u56E0\u5F02\u5E38\u5BFC\u81F4\u65E0\u6CD5\u4F7F\u7528\uFF0C\u8BF7\u91CD\u65B0\u521B\u5EFA
+i18n_dataset_ds_delete=\u7531\u4E8E\u6570\u636E\u96C6\u6240\u7528\u7684\u6570\u636E\u6E90\u5DF2\u88AB\u5220\u9664,\u65E0\u6CD5\u663E\u793A\u6570\u636E\u96C6
+i18n_dataset_plugin_error=\u5F53\u524D\u6570\u636E\u6E90\u63D2\u4EF6\u4E0D\u5B58\u5728
+i18n_dataset_cross_error=\u8DE8\u6E90\u6570\u636E\u96C6\u4E0D\u652F\u6301\u8BE5\u529F\u80FD
+i18n_board=\u8FB9\u6846
+i18n_invalid_connection=\u8FDE\u63A5\u65E0\u6548,
+i18n_check_datasource_connection=\u8BF7\u68C0\u67E5\u6570\u636E\u6E90\u7684\u6709\u6548\u6027
+
+i18n_datasource_not_exists=\u6570\u636E\u6E90\u4E0D\u5B58\u5728\uFF01
+
+i18n_geo_exists=\u5DF2\u5B58\u5728\u540C\u540D\u533A\u57DF\uFF01
+i18n_geo_sub_exists=\u5DF2\u5B58\u5728\u540C\u540D\u5B50\u533A\u57DF\uFF01
+i18n_user_new_pwd_error=\u5BC6\u7801\u683C\u5F0F\uFF1A8-20\u4F4D\u4E14\u81F3\u5C11\u4E00\u4F4D\u5927\u5199\u5B57\u6BCD\u3001\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u7279\u6B8A\u5B57\u7B26
+i18n_user_pwd_same_error=\u65B0\u65E7\u5BC6\u7801\u4E0D\u80FD\u76F8\u540C
+
+i18n_copilot_ds=\u5F53\u524D\u4EC5\u652F\u6301MySQL\u6570\u636E\u6E90
diff --git a/core/core-backend/src/main/resources/logback-spring.xml b/core/core-backend/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..128e7f8
--- /dev/null
+++ b/core/core-backend/src/main/resources/logback-spring.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+ true
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n
+ UTF-8
+
+
+
+
+ ${logPath}/info.log
+ true
+
+ ERROR
+ DENY
+ ACCEPT
+
+
+ ${logPath}/info.%d.%i.log
+ 30
+
+ 10GB
+ 10MB
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n
+ UTF-8
+
+
+
+
+ ${logPath}/error.log
+ true
+
+ ERROR
+
+
+ ${logPath}/error.%d.%i.log
+ 30
+
+ 10GB
+ 10MB
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n
+ UTF-8
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core/core-backend/src/main/resources/mybatis/ExtDataVisualizationMapper.xml b/core/core-backend/src/main/resources/mybatis/ExtDataVisualizationMapper.xml
new file mode 100644
index 0000000..908a835
--- /dev/null
+++ b/core/core-backend/src/main/resources/mybatis/ExtDataVisualizationMapper.xml
@@ -0,0 +1,457 @@
+
+
+
+
+ INSERT INTO `core_chart_view` (`id`,
+ `title`,
+ `scene_id`,
+ `table_id`,
+ `type`,
+ `render`,
+ `result_count`,
+ `result_mode`,
+ `x_axis`,
+ `x_axis_ext`,
+ `y_axis`,
+ `y_axis_ext`,
+ `ext_stack`,
+ `ext_bubble`,
+ `ext_label`,
+ `ext_tooltip`,
+ `custom_attr`,
+ `custom_attr_mobile`,
+ `custom_style`,
+ `custom_style_mobile`,
+ `custom_filter`,
+ `drill_fields`,
+ `senior`,
+ `create_by`,
+ `create_time`,
+ `update_time`,
+ `snapshot`,
+ `style_priority`,
+ `chart_type`,
+ `is_plugin`,
+ `data_from`,
+ `view_fields`,
+ `refresh_view_enable`,
+ `refresh_unit`,
+ `refresh_time`,
+ `linkage_active`,
+ `jump_active`,
+ `copy_from`,
+ `copy_id`,
+ `flow_map_start_name`,
+ `flow_map_end_name`,
+ `ext_color`)
+ SELECT core_chart_view.`id` + #{copyId} as id,
+ `title`,
+ #{newDvId} as scene_id,
+ `table_id`,
+ `type`,
+ `render`,
+ `result_count`,
+ `result_mode`,
+ `x_axis`,
+ `x_axis_ext`,
+ `y_axis`,
+ `y_axis_ext`,
+ `ext_stack`,
+ `ext_bubble`,
+ `ext_label`,
+ `ext_tooltip`,
+ `custom_attr`,
+ `custom_attr_mobile`,
+ `custom_style`,
+ `custom_style_mobile`,
+ `custom_filter`,
+ `drill_fields`,
+ `senior`,
+ `create_by`,
+ `create_time`,
+ `update_time`,
+ `snapshot`,
+ `style_priority`,
+ `chart_type`,
+ `is_plugin`,
+ `data_from`,
+ `view_fields`,
+ `refresh_view_enable`,
+ `refresh_unit`,
+ `refresh_time`,
+ `linkage_active`,
+ `jump_active`,
+ core_chart_view.`id` as copy_from,
+ #{copyId} as copy_id,
+ `flow_map_start_name`,
+ `flow_map_end_name`,
+ `ext_color`
+ FROM core_chart_view
+ WHERE core_chart_view.scene_id = #{sourceDvId}
+
+
+ INSERT INTO `data_visualization_info` (`id`,
+ `name`,
+ `pid`,
+ `org_id`,
+ `level`,
+ `node_type`,
+ `type`,
+ `canvas_style_data`,
+ `component_data`,
+ `mobile_layout`,
+ `status`,
+ `self_watermark_status`,
+ `sort`,
+ `create_time`,
+ `create_by`,
+ `update_time`,
+ `update_by`,
+ `remark`,
+ `source`,
+ `delete_flag`,
+ `delete_time`,
+ `delete_by`)
+ select #{newDvId},
+ `name`,
+ `pid`,
+ `org_id`,
+ `level`,
+ `node_type`,
+ `type`,
+ `canvas_style_data`,
+ `component_data`,
+ `mobile_layout`,
+ `status`,
+ `self_watermark_status`,
+ `sort`,
+ `create_time`,
+ `create_by`,
+ `update_time`,
+ `update_by`,
+ `remark`,
+ `source`,
+ `delete_flag`,
+ `delete_time`,
+ `delete_by`
+ from data_visualization_info dvInfo
+ where dvInfo.id = #{sourceDvId}
+
+
+
+
+
+
+
+ INSERT INTO visualization_link_jump (`id`,
+ `source_dv_id`,
+ `source_view_id`,
+ `link_jump_info`,
+ `checked`,
+ `copy_from`,
+ `copy_id`)
+ SELECT visualization_link_jump.`id` + #{copyId} as id,
+ dv_view_copy.t_dv_id as source_dv_id,
+ dv_view_copy.t_chart_view_id as source_view_id,
+ visualization_link_jump.`link_jump_info`,
+ visualization_link_jump.`checked`,
+ visualization_link_jump.`id` as copy_from,
+ #{copyId} as copy_id
+ FROM visualization_link_jump
+ INNER JOIN (SELECT pvs.scene_id AS s_dv_id,
+ pvs.id AS s_chart_view_id,
+ pvt.scene_id AS t_dv_id,
+ pvt.id AS t_chart_view_id
+ FROM core_chart_view pvt
+ INNER JOIN core_chart_view pvs ON pvt.copy_from = pvs.id
+ WHERE pvt.copy_id = #{copyId}) dv_view_copy
+ ON visualization_link_jump.source_dv_id = dv_view_copy.s_dv_id
+ AND visualization_link_jump.source_view_id = dv_view_copy.s_chart_view_id
+
+
+
+ INSERT INTO visualization_link_jump_info (id,
+ link_jump_id,
+ link_type,
+ jump_type,
+ target_dv_id,
+ source_field_id,
+ content,
+ `checked`,
+ `attach_params`,
+ copy_from,
+ copy_id)
+ SELECT visualization_link_jump_info.`id` + #{copyId} as id,
+ plj_copy.t_id as link_jump_id,
+ visualization_link_jump_info.`link_type`,
+ visualization_link_jump_info.`jump_type`,
+ visualization_link_jump_info.`target_dv_id`,
+ visualization_link_jump_info.`source_field_id`,
+ visualization_link_jump_info.`content`,
+ visualization_link_jump_info.`checked`,
+ visualization_link_jump_info.`attach_params`,
+ visualization_link_jump_info.`id` AS copy_from,
+ #{copyId} AS copy_id
+ FROM visualization_link_jump_info
+ INNER JOIN (SELECT id AS t_id,
+ copy_from AS s_id
+ FROM visualization_link_jump
+ WHERE copy_id = #{copyId}) plj_copy
+ ON visualization_link_jump_info.link_jump_id = plj_copy.s_id
+
+
+
+
+ INSERT INTO visualization_link_jump_target_view_info (`target_id`,
+ `link_jump_info_id`,
+ `source_field_active_id`,
+ `target_view_id`,
+ `target_field_id`,
+ `copy_from`,
+ `copy_id`)
+ SELECT visualization_link_jump_target_view_info.`target_id` + #{copyId} as target_id,
+ plji_copy.t_id as link_jump_info_id,
+ visualization_link_jump_target_view_info.`source_field_active_id`,
+ visualization_link_jump_target_view_info.`target_view_id`,
+ visualization_link_jump_target_view_info.`target_field_id`,
+ visualization_link_jump_target_view_info.`target_id` AS copy_from,
+ #{copyId} AS copy_id
+ FROM visualization_link_jump_target_view_info
+ INNER JOIN (SELECT id AS t_id,
+ copy_from AS s_id
+ FROM visualization_link_jump_info
+ WHERE copy_id = #{copyId}) plji_copy
+ ON visualization_link_jump_target_view_info.link_jump_info_id = plji_copy.s_id
+
+
+
+ INSERT INTO visualization_linkage (`id`,
+ dv_id,
+ source_view_id,
+ target_view_id,
+ `update_time`,
+ `update_people`,
+ `linkage_active`,
+ `ext1`,
+ `ext2`,
+ `copy_from`,
+ `copy_id`)
+ SELECT visualization_linkage.`id` + #{copyId} as `id`,
+ pv_source_copy.t_dv_id AS dv_id,
+ pv_source_copy.t_chart_view_id AS source_view_id,
+ pv_target_copy.t_chart_view_id AS target_view_id,
+ `update_time`,
+ `update_people`,
+ `linkage_active`,
+ `ext1`,
+ `ext2`,
+ visualization_linkage.`id` as copy_from,
+ #{copyId} as copy_id
+ FROM visualization_linkage
+ INNER JOIN (SELECT pvs.scene_id AS s_dv_id,
+ pvs.id AS s_chart_view_id,
+ pvt.scene_id AS t_dv_id,
+ pvt.id AS t_chart_view_id
+ FROM core_chart_view pvt
+ INNER JOIN core_chart_view pvs ON pvt.copy_from = pvs.id
+ WHERE pvt.copy_id = #{copyId}) pv_source_copy
+ ON visualization_linkage.dv_id = pv_source_copy.s_dv_id
+ AND visualization_linkage.source_view_id = pv_source_copy.s_chart_view_id
+ INNER JOIN (SELECT pvs.scene_id AS s_dv_id,
+ pvs.id AS s_chart_view_id,
+ pvt.scene_id AS t_dv_id,
+ pvt.id AS t_chart_view_id
+ FROM core_chart_view pvt
+ INNER JOIN core_chart_view pvs ON pvt.copy_from = pvs.id
+ WHERE pvt.copy_id = #{copyId}) pv_target_copy
+ ON visualization_linkage.dv_id = pv_target_copy.s_dv_id
+ AND visualization_linkage.target_view_id = pv_target_copy.s_chart_view_id
+
+
+
+
+ INSERT INTO visualization_linkage_field (id,
+ `linkage_id`,
+ `source_field`,
+ `target_field`,
+ `update_time`,
+ `copy_from`,
+ `copy_id`)
+ SELECT visualization_linkage_field.`id` + #{copyId} as `id`,
+ pvlf_copy.t_id as `linkage_id`,
+ `source_field`,
+ `target_field`,
+ `update_time`,
+ id AS copy_from,
+ #{copyId} as copy_id
+ FROM visualization_linkage_field
+ INNER JOIN (SELECT id AS t_id,
+ copy_from AS s_id
+ FROM visualization_linkage
+ WHERE copy_id = #{copyId}) pvlf_copy
+ ON visualization_linkage_field.linkage_id = pvlf_copy.s_id
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DELETE
+ FROM
+ data_visualization_info dvi
+ WHERE
+ dvi.id IN
+
+ #{id}
+
+
+
+ DELETE
+ FROM
+ core_chart_view ccv
+ WHERE
+ ccv.scene_id IN
+
+ #{id}
+
+
+
+
+
diff --git a/core/core-backend/src/main/resources/mybatis/ExtVisualizationLinkJumpMapper.xml b/core/core-backend/src/main/resources/mybatis/ExtVisualizationLinkJumpMapper.xml
new file mode 100644
index 0000000..e1be07a
--- /dev/null
+++ b/core/core-backend/src/main/resources/mybatis/ExtVisualizationLinkJumpMapper.xml
@@ -0,0 +1,353 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DELETE FROM visualization_link_jump_target_view_info
+ WHERE link_jump_info_id IN (
+ SELECT lji.id
+ FROM visualization_link_jump_info lji
+ JOIN visualization_link_jump lj ON lji.link_jump_id = lj.id
+ WHERE lj.source_dv_id = #{dvId}
+ AND lj.source_view_id = #{viewId}
+ );
+
+
+
+ DELETE FROM visualization_link_jump_info
+ WHERE link_jump_id IN (
+ SELECT lj.id
+ FROM visualization_link_jump lj
+ WHERE lj.source_dv_id = #{dvId}
+ AND lj.source_view_id = #{viewId}
+ );
+
+
+
+ DELETE FROM visualization_link_jump
+ WHERE source_dv_id = #{dvId}
+ AND source_view_id = #{viewId}
+
+
+
+
+ DELETE FROM visualization_link_jump_target_view_info
+ WHERE link_jump_info_id IN (
+ SELECT lji.id
+ FROM visualization_link_jump_info lji
+ JOIN visualization_link_jump lj ON lji.link_jump_id = lj.id
+ WHERE lj.source_dv_id = #{dvId}
+ OR lji.target_dv_id = #{dvId}
+ )
+
+
+
+ DELETE FROM visualization_link_jump_info
+ WHERE link_jump_id IN (
+ SELECT lj.id
+ FROM visualization_link_jump lj
+ WHERE lj.source_dv_id = #{dvId}
+ OR lj.target_dv_id = #{dvId}
+ )
+
+
+
+ DELETE FROM visualization_link_jump
+ WHERE source_dv_id = #{dvId}
+
+
+
+
+
+ insert into visualization_link_jump (id, source_dv_id, source_view_id, link_jump_info, `checked`, copy_from,
+ copy_id)
+ select UUID() as id,
+ visualization_view_copy.t_dv_id as source_dv_id,
+ visualization_view_copy.t_core_chart_view_id as source_view_id,
+ visualization_link_jump.link_jump_info,
+ visualization_link_jump.checked,
+ visualization_link_jump.id as copy_from,
+ #{copyId} as copy_id
+ from visualization_link_jump
+ inner join
+ (SELECT pvs.dv_id as s_dv_id,
+ pvs.core_chart_view_id as s_core_chart_view_id,
+ pvt.dv_id as t_dv_id,
+ pvt.core_chart_view_id as t_core_chart_view_id
+ FROM visualization_view pvt
+ inner JOIN visualization_view pvs ON pvt.copy_from = pvs.id
+ WHERE pvt.copy_id = #{copyId}) visualization_view_copy
+ on visualization_link_jump.source_dv_id = visualization_view_copy.s_dv_id
+ and visualization_link_jump.source_view_id = visualization_view_copy.s_core_chart_view_id
+
+
+
+ INSERT INTO visualization_link_jump_info (id,
+ link_jump_id,
+ link_type,
+ jump_type,
+ window_size,
+ target_dv_id,
+ source_field_id,
+ content,
+ `checked`,
+ `attach_params`,
+ copy_from,
+ copy_id)
+ SELECT uuid() AS id,
+ plj_copy.t_id,
+ link_type,
+ jump_type,
+ window_size,
+ target_dv_id,
+ source_field_id,
+ content,
+ `checked`,
+ `attach_params`,
+ id AS copy_from,
+ #{copyId}
+ FROM visualization_link_jump_info
+ inner JOIN (SELECT id AS t_id,
+ copy_from AS s_id
+ FROM visualization_link_jump
+ WHERE copy_id = #{copyId}) plj_copy
+ ON visualization_link_jump_info.link_jump_id = plj_copy.s_id
+
+
+
+ INSERT INTO visualization_link_jump_target_view_info (target_id,
+ link_jump_info_id,
+ target_view_id,
+ target_field_id,
+ copy_from,
+ copy_id)
+ SELECT uuid() AS id,
+ plji_copy.t_id AS link_jump_info_id,
+ target_view_id,
+ target_field_id,
+ copy_from,
+ #{copyId} AS copy_id
+ FROM visualization_link_jump_target_view_info
+ inner JOIN (SELECT id AS t_id,
+ copy_from AS s_id
+ FROM visualization_link_jump_info
+ WHERE copy_id = #{copyId}) plji_copy
+ ON visualization_link_jump_target_view_info.link_jump_info_id = plji_copy.s_id
+
+
+
+
+
+
diff --git a/core/core-backend/src/main/resources/mybatis/ExtVisualizationLinkageMapper.xml b/core/core-backend/src/main/resources/mybatis/ExtVisualizationLinkageMapper.xml
new file mode 100644
index 0000000..8639441
--- /dev/null
+++ b/core/core-backend/src/main/resources/mybatis/ExtVisualizationLinkageMapper.xml
@@ -0,0 +1,216 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ delete from visualization_linkage where visualization_linkage.dv_id = #{dvId}
+ AND visualization_linkage.source_view_id = #{sourceViewId}
+
+
+
+
+ DELETE FROM visualization_linkage
+ WHERE id IN (
+ SELECT id FROM (
+ SELECT pvl.id
+ FROM visualization_linkage pvl
+ JOIN visualization_linkage_field pvlf
+ ON pvl.id = pvlf.linkage_id
+ WHERE pvl.source_view_id = #{sourceViewId}
+ AND pvl.dv_id = #{dvId}
+ ) AS temp_table
+ )
+
+
+
+
+
+ INSERT INTO visualization_linkage (
+ id,
+ dv_id,
+ source_view_id,
+ target_view_id,
+ update_time,
+ update_people,
+ linkage_active,
+ ext1,
+ ext2,
+ copy_from,
+ copy_id
+ ) SELECT
+ UUID() AS id,
+ pv_source_copy.t_dv_id AS dv_id,
+ pv_source_copy.t_core_chart_view_id AS source_view_id,
+ pv_target_copy.t_core_chart_view_id target_view_id,
+ update_time,
+ update_people,
+ linkage_active,
+ ext1,
+ ext2,
+ id as copy_from,
+ #{copyId} as copy_id
+ FROM
+ visualization_linkage
+ INNER JOIN (
+ SELECT
+ pvs.dv_id AS s_dv_id,
+ pvs.core_chart_view_id AS s_core_chart_view_id,
+ pvt.dv_id AS t_dv_id,
+ pvt.core_chart_view_id AS t_core_chart_view_id
+ FROM
+ panel_view pvt
+ inner JOIN panel_view pvs ON pvt.copy_from = pvs.id
+ WHERE
+ pvt.copy_id = #{copyId}
+ ) pv_source_copy ON visualization_linkage.dv_id = pv_source_copy.s_dv_id
+ AND visualization_linkage.source_view_id = pv_source_copy.s_core_chart_view_id
+ INNER JOIN (
+ SELECT
+ pvs.dv_id AS s_dv_id,
+ pvs.core_chart_view_id AS s_core_chart_view_id,
+ pvt.dv_id AS t_dv_id,
+ pvt.core_chart_view_id AS t_core_chart_view_id
+ FROM
+ panel_view pvt
+ inner JOIN panel_view pvs ON pvt.copy_from = pvs.id
+ WHERE
+ pvt.copy_id = #{copyId}
+ ) pv_target_copy ON visualization_linkage.dv_id = pv_target_copy.s_dv_id
+ AND visualization_linkage.target_view_id = pv_target_copy.s_core_chart_view_id
+
+
+
+
+ INSERT INTO visualization_linkage_field (
+ id,
+ linkage_id,
+ source_field,
+ target_field,
+ update_time,
+ copy_from,
+ copy_id
+ ) SELECT
+ uuid() AS id,
+ pvlf_copy.t_id,
+ source_field,
+ target_field,
+ update_time,
+ id AS copy_from,
+ #{copyId} AS copy_id
+ FROM
+ visualization_linkage_field
+ INNER JOIN (
+ SELECT
+ id AS t_id,
+ copy_from AS s_id
+ FROM
+ visualization_linkage
+ WHERE
+ copy_id = #{copyId}
+ ) pvlf_copy ON visualization_linkage_field.linkage_id = pvlf_copy.s_id
+
+
+
+
+
+
+
+
diff --git a/core/core-backend/src/main/resources/mybatis/ExtVisualizationOuterParamsMapper.xml b/core/core-backend/src/main/resources/mybatis/ExtVisualizationOuterParamsMapper.xml
new file mode 100644
index 0000000..bdbe373
--- /dev/null
+++ b/core/core-backend/src/main/resources/mybatis/ExtVisualizationOuterParamsMapper.xml
@@ -0,0 +1,192 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DELETE FROM
+ visualization_outer_params_target_view_info poptvi
+ WHERE
+ poptvi.params_info_id IN (
+ SELECT params_info_id FROM
+ (
+ SELECT poptvi.params_info_id FROM
+ visualization_outer_params_target_view_info poptvi
+ INNER JOIN visualization_outer_params_info popi ON poptvi.params_info_id = popi.params_info_id
+ INNER JOIN visualization_outer_params pop ON popi.params_id = pop.params_id
+ WHERE pop.visualization_id = #{visualizationId}
+ ) tmp
+ )
+
+
+
+ DELETE FROM
+ visualization_outer_params_info popi
+ WHERE
+ popi.params_id IN (
+ SELECT params_id FROM
+ (
+ SELECT popi.params_id FROM
+ visualization_outer_params_info popi
+ INNER JOIN visualization_outer_params pop ON popi.params_id = pop.params_id
+ WHERE pop.visualization_id = #{visualizationId}
+ ) tmp
+ )
+
+
+
+ DELETE pop
+ FROM
+ visualization_outer_params pop
+ WHERE
+ pop.visualization_id = #{visualizationId}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/core-backend/src/main/resources/mybatis/ExtVisualizationTemplateMapper.xml b/core/core-backend/src/main/resources/mybatis/ExtVisualizationTemplateMapper.xml
new file mode 100644
index 0000000..16536f9
--- /dev/null
+++ b/core/core-backend/src/main/resources/mybatis/ExtVisualizationTemplateMapper.xml
@@ -0,0 +1,290 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ vt
+ .
+ id
+ , vt.`name`, vt.pid, vt.`level`,vt.`dv_type`, vt.node_type, vt.create_by, vt.create_time, vt.template_type, vt.snapshot
+
+
+ ,vt.template_style, vt.template_data, vt.dynamic_data
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ delete from visualization_template_category_map tcm
+
+
+ tcm.template_id in (
+ select id from visualization_template vt where vt.name = #{templateName})
+
+
+
+ and tcm.template_id = #{templateId}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/core-backend/src/main/resources/saffron.properties b/core/core-backend/src/main/resources/saffron.properties
new file mode 100644
index 0000000..68baf63
--- /dev/null
+++ b/core/core-backend/src/main/resources/saffron.properties
@@ -0,0 +1 @@
+calcite.default.charset = utf8
diff --git a/core/core-backend/src/main/resources/sql/sqlTemplate.stg b/core/core-backend/src/main/resources/sql/sqlTemplate.stg
new file mode 100644
index 0000000..a7b9877
--- /dev/null
+++ b/core/core-backend/src/main/resources/sql/sqlTemplate.stg
@@ -0,0 +1,78 @@
+querySql(limitFiled, groups, aggregators, filters, orders, table, notUseAs, useAliasForGroup)
+::=<<
+SELECT
+
+
+
+
+ *
+
+
+ }; separator=",\n">
+
+
+ AS }; separator=",\n">
+
+ ,
+
+ AS }; separator=",\n">
+
+FROM
+
+
+WHERE
+ }; separator="\nAND ">
+
+
+GROUP BY
+ }; separator=",\n">
+
+
+GROUP BY
+ }; separator=",\n">
+
+
+ORDER BY
+ }; separator=",\n">
+
+>>
+
+
+previewSql(limitFiled, groups, aggregators, filters, orders, table, isGroup, notUseAs, useAliasForGroup)
+::=<<
+SELECT
+
+
+
+
+ *
+
+
+ }; separator=",\n">
+
+
+ AS }; separator=",\n">
+
+ ,
+
+ AS }; separator=",\n">
+
+FROM
+
+
+WHERE
+ }; separator="\nAND ">
+
+
+GROUP BY
+ }; separator=",\n">
+
+
+GROUP BY
+ }; separator=",\n">
+
+
+ORDER BY
+ }; separator=",\n">
+
+>>
diff --git a/core/core-frontend/.editorconfig b/core/core-frontend/.editorconfig
new file mode 100644
index 0000000..ea6e20f
--- /dev/null
+++ b/core/core-frontend/.editorconfig
@@ -0,0 +1,14 @@
+# http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/core/core-frontend/.env.base b/core/core-frontend/.env.base
new file mode 100644
index 0000000..8a93b1c
--- /dev/null
+++ b/core/core-frontend/.env.base
@@ -0,0 +1,3 @@
+# 接口前缀
+VITE_API_BASEPATH="./de2api"
+VITE_VERSION="0.0.0"
diff --git a/core/core-frontend/.env.desktop b/core/core-frontend/.env.desktop
new file mode 100644
index 0000000..d6c82f4
--- /dev/null
+++ b/core/core-frontend/.env.desktop
@@ -0,0 +1,3 @@
+# 接口前缀
+VITE_API_BASEPATH=/api
+VITE_VERSION="0.0.0"
diff --git a/core/core-frontend/.env.dev b/core/core-frontend/.env.dev
new file mode 100644
index 0000000..d6c82f4
--- /dev/null
+++ b/core/core-frontend/.env.dev
@@ -0,0 +1,3 @@
+# 接口前缀
+VITE_API_BASEPATH=/api
+VITE_VERSION="0.0.0"
diff --git a/core/core-frontend/.env.distributed b/core/core-frontend/.env.distributed
new file mode 100644
index 0000000..8a93b1c
--- /dev/null
+++ b/core/core-frontend/.env.distributed
@@ -0,0 +1,3 @@
+# 接口前缀
+VITE_API_BASEPATH="./de2api"
+VITE_VERSION="0.0.0"
diff --git a/core/core-frontend/.eslintignore b/core/core-frontend/.eslintignore
new file mode 100644
index 0000000..05b381b
--- /dev/null
+++ b/core/core-frontend/.eslintignore
@@ -0,0 +1,8 @@
+/dist/
+/*.js
+/node_modules/*
+/dist*
+/src/main.ts
+/flushbonading/
+/src/assets/fsSvg.js
+
diff --git a/core/core-frontend/.eslintrc.js b/core/core-frontend/.eslintrc.js
new file mode 100644
index 0000000..1ad8e68
--- /dev/null
+++ b/core/core-frontend/.eslintrc.js
@@ -0,0 +1,40 @@
+module.exports = {
+ env: {
+ browser: true,
+ es2021: true,
+ node: true
+ },
+ extends: [
+ 'prettier',
+ 'plugin:vue/vue3-essential',
+ 'plugin:@typescript-eslint/recommended',
+ 'plugin:prettier/recommended' // 解决ESlint和Prettier冲突
+ ],
+ overrides: [],
+ // 配置解析vue文件
+ parser: 'vue-eslint-parser',
+ parserOptions: {
+ ecmaVersion: 'latest',
+ parser: '@typescript-eslint/parser',
+ sourceType: 'module',
+ jsxPragma: 'React',
+ ecmaFeatures: {
+ jsx: true
+ }
+ },
+ plugins: ['vue', '@typescript-eslint'],
+ rules: {
+ '@typescript-eslint/ban-types': [
+ 'error',
+ {
+ extendDefaults: true,
+ types: {
+ '{}': false
+ }
+ }
+ ],
+ 'vue/multi-word-component-names': 0,
+ '@typescript-eslint/no-explicit-any': ['off'],
+ 'vue/no-setup-props-destructure': ['off']
+ }
+}
diff --git a/core/core-frontend/.gitkeep b/core/core-frontend/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/core/core-frontend/.npmrc b/core/core-frontend/.npmrc
new file mode 100644
index 0000000..5e4086a
--- /dev/null
+++ b/core/core-frontend/.npmrc
@@ -0,0 +1 @@
+registry=https://registry.npmmirror.com/
diff --git a/core/core-frontend/.prettierignore b/core/core-frontend/.prettierignore
new file mode 100644
index 0000000..c531bbb
--- /dev/null
+++ b/core/core-frontend/.prettierignore
@@ -0,0 +1,6 @@
+/node_modules/**
+/dist/
+/dist*
+/public/*
+/vite.config.ts
+/src/types/env.d.ts
diff --git a/core/core-frontend/README.md b/core/core-frontend/README.md
new file mode 100644
index 0000000..ef72fd5
--- /dev/null
+++ b/core/core-frontend/README.md
@@ -0,0 +1,18 @@
+# Vue 3 + TypeScript + Vite
+
+This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `
+