@ -1,201 +1,211 @@ |
|||||
|
/*********************************************************************** |
||||
|
* 统一定义依赖的版本,解决同一个库出现不同版本的问题 |
||||
|
**********************************************************************/ |
||||
|
ext['PlatformDependencyVersions'] =[ |
||||
|
"commons-io:commons-io" : "${commons_io_version}", |
||||
|
"org.ow2.asm:asm" : "${asm_version}", |
||||
|
"org.checkerframework:checker-qual" : "${checker_version}", |
||||
|
"com.google.guava:guava" : "${guava_version}", |
||||
|
"com.nimbusds:nimbus-jose-jwt" : "9.22", |
||||
|
]; |
||||
|
|
||||
/*********************************************************************** |
/*********************************************************************** |
||||
* 覆盖 springboot 默认包版本 |
* 覆盖 springboot 默认包版本 |
||||
**********************************************************************/ |
**********************************************************************/ |
||||
subprojects { |
// ext['groovy.version'] ='3.0.17' |
||||
// ext['activemq.version'] = |
// ext['activemq.version'] = |
||||
// ext['antlr2.version'] = |
// ext['antlr2.version'] = |
||||
// ext['appengine-sdk.version'] = |
// ext['appengine-sdk.version'] = |
||||
// ext['artemis.version'] = |
// ext['artemis.version'] = |
||||
// ext['aspectj.version'] = |
// ext['aspectj.version'] = |
||||
// ext['assertj.version'] = |
// ext['assertj.version'] = |
||||
// ext['atomikos.version'] = |
// ext['atomikos.version'] = |
||||
// ext['awaitility.version'] = |
// ext['awaitility.version'] = |
||||
// ext['bitronix.version'] = |
// ext['bitronix.version'] = |
||||
// ext['build-helper-maven-plugin.version'] = |
// ext['build-helper-maven-plugin.version'] = |
||||
// ext['byte-buddy.version'] = |
// ext['byte-buddy.version'] = |
||||
// ext['caffeine.version'] = |
// ext['caffeine.version'] = |
||||
// ext['cassandra-driver.version'] = |
// ext['cassandra-driver.version'] = |
||||
// ext['classmate.version'] = |
// ext['classmate.version'] = |
||||
// ext['commons-codec.version'] = |
// ext['commons-codec.version'] = |
||||
// ext['commons-dbcp2.version'] = |
// ext['commons-dbcp2.version'] = |
||||
// ext['commons-lang3.version'] = |
// ext['commons-lang3.version'] = |
||||
// ext['commons-pool.version'] = |
// ext['commons-pool.version'] = |
||||
// ext['commons-pool2.version'] = |
// ext['commons-pool2.version'] = |
||||
// ext['couchbase-client.version'] = |
// ext['couchbase-client.version'] = |
||||
// ext['db2-jdbc.version'] = |
// ext['db2-jdbc.version'] = |
||||
// ext['dependency-management-plugin.version'] = |
// ext['dependency-management-plugin.version'] = |
||||
// ext['derby.version'] = |
// ext['derby.version'] = |
||||
// ext['dropwizard-metrics.version'] = |
// ext['dropwizard-metrics.version'] = |
||||
// ext['ehcache.version'] = |
// ext['ehcache.version'] = |
||||
// ext['ehcache3.version'] = |
// ext['ehcache3.version'] = |
||||
// ext['elasticsearch.version'] = |
// ext['elasticsearch.version'] = |
||||
// ext['embedded-mongo.version'] = |
// ext['embedded-mongo.version'] = |
||||
// ext['flyway.version'] = |
// ext['flyway.version'] = |
||||
// ext['freemarker.version'] = |
// ext['freemarker.version'] = |
||||
// ext['git-commit-id-plugin.version'] = |
// ext['git-commit-id-plugin.version'] = |
||||
// ext['glassfish-el.version'] = |
// ext['glassfish-el.version'] = |
||||
// ext['glassfish-jaxb.version'] = |
// ext['glassfish-jaxb.version'] = |
||||
// ext['groovy.version'] = |
// ext['groovy.version'] = |
||||
// ext['gson.version'] = |
// ext['gson.version'] = |
||||
// ext['h2.version'] = |
// ext['h2.version'] = |
||||
// ext['hamcrest.version'] = |
// ext['hamcrest.version'] = |
||||
// ext['hazelcast.version'] = |
// ext['hazelcast.version'] = |
||||
// ext['hazelcast-hibernate5.version'] = |
// ext['hazelcast-hibernate5.version'] = |
||||
// ext['hibernate.version'] = |
// ext['hibernate.version'] = |
||||
// ext['hibernate-validator.version'] = |
// ext['hibernate-validator.version'] = |
||||
// ext['hikaricp.version'] = |
// ext['hikaricp.version'] = |
||||
// ext['hsqldb.version'] = |
// ext['hsqldb.version'] = |
||||
// ext['htmlunit.version'] = |
// ext['htmlunit.version'] = |
||||
// ext['httpasyncclient.version'] = |
// ext['httpasyncclient.version'] = |
||||
// ext['httpclient.version'] = |
// ext['httpclient.version'] = |
||||
// ext['httpcore.version'] = |
// ext['httpcore.version'] = |
||||
// ext['infinispan.version'] = |
// ext['infinispan.version'] = |
||||
// ext['influxdb-java.version'] = |
// ext['influxdb-java.version'] = |
||||
// ext['jackson-bom.version'] = |
// ext['jackson-bom.version'] = |
||||
// ext['jakarta-activation.version'] = |
// ext['jakarta-activation.version'] = |
||||
// ext['jakarta-annotation.version'] = |
// ext['jakarta-annotation.version'] = |
||||
// ext['jakarta-jms.version'] = |
// ext['jakarta-jms.version'] = |
||||
// ext['jakarta-json.version'] = |
// ext['jakarta-json.version'] = |
||||
// ext['jakarta-json-bind.version'] = |
// ext['jakarta-json-bind.version'] = |
||||
// ext['jakarta-mail.version'] = |
// ext['jakarta-mail.version'] = |
||||
// ext['jakarta-persistence.version'] = |
// ext['jakarta-persistence.version'] = |
||||
// ext['jakarta-servlet.version'] = |
// ext['jakarta-servlet.version'] = |
||||
// ext['jakarta-servlet-jsp-jstl.version'] = |
// ext['jakarta-servlet-jsp-jstl.version'] = |
||||
// ext['jakarta-transaction.version'] = |
// ext['jakarta-transaction.version'] = |
||||
// ext['jakarta-validation.version'] = |
// ext['jakarta-validation.version'] = |
||||
// ext['jakarta-websocket.version'] = |
// ext['jakarta-websocket.version'] = |
||||
// ext['jakarta-ws-rs.version'] = |
// ext['jakarta-ws-rs.version'] = |
||||
// ext['jakarta-xml-bind.version'] = |
// ext['jakarta-xml-bind.version'] = |
||||
// ext['jakarta-xml-soap.version'] = |
// ext['jakarta-xml-soap.version'] = |
||||
// ext['jakarta-xml-ws.version'] = |
// ext['jakarta-xml-ws.version'] = |
||||
// ext['janino.version'] = |
// ext['janino.version'] = |
||||
// ext['javax-activation.version'] = |
// ext['javax-activation.version'] = |
||||
// ext['javax-annotation.version'] = |
// ext['javax-annotation.version'] = |
||||
// ext['javax-cache.version'] = |
// ext['javax-cache.version'] = |
||||
// ext['javax-jaxb.version'] = |
// ext['javax-jaxb.version'] = |
||||
// ext['javax-jaxws.version'] = |
// ext['javax-jaxws.version'] = |
||||
// ext['javax-jms.version'] = |
// ext['javax-jms.version'] = |
||||
// ext['javax-json.version'] = |
// ext['javax-json.version'] = |
||||
// ext['javax-jsonb.version'] = |
// ext['javax-jsonb.version'] = |
||||
// ext['javax-mail.version'] = |
// ext['javax-mail.version'] = |
||||
// ext['javax-money.version'] = |
// ext['javax-money.version'] = |
||||
// ext['javax-persistence.version'] = |
// ext['javax-persistence.version'] = |
||||
// ext['javax-transaction.version'] = |
// ext['javax-transaction.version'] = |
||||
// ext['javax-validation.version'] = |
// ext['javax-validation.version'] = |
||||
// ext['javax-websocket.version'] = |
// ext['javax-websocket.version'] = |
||||
// ext['jaxen.version'] = |
// ext['jaxen.version'] = |
||||
// ext['jaybird.version'] = |
// ext['jaybird.version'] = |
||||
// ext['jboss-logging.version'] = |
// ext['jboss-logging.version'] = |
||||
// ext['jboss-transaction-spi.version'] = |
// ext['jboss-transaction-spi.version'] = |
||||
// ext['jdom2.version'] = |
// ext['jdom2.version'] = |
||||
// ext['jedis.version'] = |
// ext['jedis.version'] = |
||||
// ext['jersey.version'] = |
// ext['jersey.version'] = |
||||
// ext['jetty.version'] = |
// ext['jetty.version'] = |
||||
// ext['jetty-el.version'] = |
// ext['jetty-el.version'] = |
||||
// ext['jetty-jsp.version'] = |
// ext['jetty-jsp.version'] = |
||||
// ext['jetty-reactive-httpclient.version'] = |
// ext['jetty-reactive-httpclient.version'] = |
||||
// ext['jmustache.version'] = |
// ext['jmustache.version'] = |
||||
// ext['johnzon.version'] = |
// ext['johnzon.version'] = |
||||
// ext['jolokia.version'] = |
// ext['jolokia.version'] = |
||||
// ext['jooq.version'] = |
// ext['jooq.version'] = |
||||
// ext['json-path.version'] = |
// ext['json-path.version'] = |
||||
// ext['json-smart.version'] = |
// ext['json-smart.version'] = |
||||
// ext['jsonassert.version'] = |
// ext['jsonassert.version'] = |
||||
// ext['jstl.version'] = |
// ext['jstl.version'] = |
||||
// ext['jtds.version'] = |
// ext['jtds.version'] = |
||||
// ext['junit.version'] = |
// ext['junit.version'] = |
||||
// ext['junit-jupiter.version'] = |
// ext['junit-jupiter.version'] = |
||||
// ext['kafka.version'] = |
// ext['kafka.version'] = |
||||
// ext['kotlin.version'] = |
// ext['kotlin.version'] = |
||||
// ext['kotlin-coroutines.version'] = |
// ext['kotlin-coroutines.version'] = |
||||
// ext['lettuce.version'] = |
// ext['lettuce.version'] = |
||||
// ext['liquibase.version'] = |
// ext['liquibase.version'] = |
||||
// ext['log4j2.version'] = |
// ext['log4j2.version'] = |
||||
// ext['logback.version'] = |
// ext['logback.version'] = |
||||
// ext['lombok.version'] = |
// ext['lombok.version'] = |
||||
// ext['mariadb.version'] = |
// ext['mariadb.version'] = |
||||
// ext['maven-antrun-plugin.version'] = |
// ext['maven-antrun-plugin.version'] = |
||||
// ext['maven-assembly-plugin.version'] = |
// ext['maven-assembly-plugin.version'] = |
||||
// ext['maven-clean-plugin.version'] = |
// ext['maven-clean-plugin.version'] = |
||||
// ext['maven-compiler-plugin.version'] = |
// ext['maven-compiler-plugin.version'] = |
||||
// ext['maven-dependency-plugin.version'] = |
// ext['maven-dependency-plugin.version'] = |
||||
// ext['maven-deploy-plugin.version'] = |
// ext['maven-deploy-plugin.version'] = |
||||
// ext['maven-enforcer-plugin.version'] = |
// ext['maven-enforcer-plugin.version'] = |
||||
// ext['maven-failsafe-plugin.version'] = |
// ext['maven-failsafe-plugin.version'] = |
||||
// ext['maven-help-plugin.version'] = |
// ext['maven-help-plugin.version'] = |
||||
// ext['maven-install-plugin.version'] = |
// ext['maven-install-plugin.version'] = |
||||
// ext['maven-invoker-plugin.version'] = |
// ext['maven-invoker-plugin.version'] = |
||||
// ext['maven-jar-plugin.version'] = |
// ext['maven-jar-plugin.version'] = |
||||
// ext['maven-javadoc-plugin.version'] = |
// ext['maven-javadoc-plugin.version'] = |
||||
// ext['maven-resources-plugin.version'] = |
// ext['maven-resources-plugin.version'] = |
||||
// ext['maven-shade-plugin.version'] = |
// ext['maven-shade-plugin.version'] = |
||||
// ext['maven-source-plugin.version'] = |
// ext['maven-source-plugin.version'] = |
||||
// ext['maven-surefire-plugin.version'] = |
// ext['maven-surefire-plugin.version'] = |
||||
// ext['maven-war-plugin.version'] = |
// ext['maven-war-plugin.version'] = |
||||
// ext['micrometer.version'] = |
// ext['micrometer.version'] = |
||||
// ext['mimepull.version'] = |
// ext['mimepull.version'] = |
||||
// ext['mockito.version'] = |
// ext['mockito.version'] = |
||||
// ext['mongodb.version'] = |
// ext['mongodb.version'] = |
||||
// ext['mssql-jdbc.version'] = |
// ext['mssql-jdbc.version'] = |
||||
// ext['mysql.version'] = |
// ext['mysql.version'] = |
||||
// ext['nekohtml.version'] = |
// ext['nekohtml.version'] = |
||||
// ext['neo4j-java-driver.version'] = |
// ext['neo4j-java-driver.version'] = |
||||
// ext['netty.version'] = |
// ext['netty.version'] = |
||||
// ext['netty-tcnative.version'] = |
// ext['netty-tcnative.version'] = |
||||
// ext['nimbus-jose-jwt.version'] = |
// ext['nimbus-jose-jwt.version'] = |
||||
// ext['oauth2-oidc-sdk.version'] = |
// ext['oauth2-oidc-sdk.version'] = |
||||
// ext['ojdbc.version'] = |
// ext['ojdbc.version'] = |
||||
// ext['okhttp3.version'] = |
// ext['okhttp3.version'] = |
||||
// ext['oracle-database.version'] ='12.2.0.1' |
// ext['oracle-database.version'] ='12.2.0.1' |
||||
// ext['pooled-jms.version'] = |
// ext['pooled-jms.version'] = |
||||
// ext['postgresql.version'] = |
// ext['postgresql.version'] = |
||||
// ext['prometheus-pushgateway.version'] = |
// ext['prometheus-pushgateway.version'] = |
||||
// ext['quartz.version'] = |
// ext['quartz.version'] = |
||||
// ext['querydsl.version'] = |
// ext['querydsl.version'] = |
||||
// ext['r2dbc-bom.version'] = |
// ext['r2dbc-bom.version'] = |
||||
// ext['rabbit-amqp-client.version'] = |
// ext['rabbit-amqp-client.version'] = |
||||
// ext['reactive-streams.version'] = |
// ext['reactive-streams.version'] = |
||||
// ext['reactor-bom.version'] = |
// ext['reactor-bom.version'] = |
||||
// ext['rest-assured.version'] = |
// ext['rest-assured.version'] = |
||||
// ext['rsocket.version'] = |
// ext['rsocket.version'] = |
||||
// ext['rxjava.version'] = |
// ext['rxjava.version'] = |
||||
// ext['rxjava-adapter.version'] = |
// ext['rxjava-adapter.version'] = |
||||
// ext['rxjava2.version'] = |
// ext['rxjava2.version'] = |
||||
// ext['saaj-impl.version'] = |
// ext['saaj-impl.version'] = |
||||
// ext['selenium.version'] = |
// ext['selenium.version'] = |
||||
// ext['selenium-htmlunit.version'] = |
// ext['selenium-htmlunit.version'] = |
||||
// ext['sendgrid.version'] = |
// ext['sendgrid.version'] = |
||||
// ext['servlet-api.version'] = |
// ext['servlet-api.version'] = |
||||
// ext['slf4j.version'] = |
// ext['slf4j.version'] = |
||||
// ext['snakeyaml.version'] = |
// ext['snakeyaml.version'] = |
||||
// ext['solr.version'] = |
// ext['solr.version'] = |
||||
// ext['spring-amqp.version'] = |
// ext['spring-amqp.version'] = |
||||
// ext['spring-batch.version'] = |
// ext['spring-batch.version'] = |
||||
// ext['spring-data-bom.version'] = |
// ext['spring-data-bom.version'] = |
||||
// ext['spring-framework.version'] = |
// ext['spring-framework.version'] = |
||||
// ext['spring-hateoas.version'] = |
// ext['spring-hateoas.version'] = |
||||
// ext['spring-integration.version'] = |
// ext['spring-integration.version'] = |
||||
// ext['spring-kafka.version'] = |
// ext['spring-kafka.version'] = |
||||
// ext['spring-ldap.version'] = |
// ext['spring-ldap.version'] = |
||||
// ext['spring-restdocs.version'] = |
// ext['spring-restdocs.version'] = |
||||
// ext['spring-retry.version'] = |
// ext['spring-retry.version'] = |
||||
// ext['spring-security.version'] = |
// ext['spring-security.version'] = |
||||
// ext['spring-session-bom.version'] = |
// ext['spring-session-bom.version'] = |
||||
// ext['spring-ws.version'] = |
// ext['spring-ws.version'] = |
||||
// ext['sqlite-jdbc.version'] = |
// ext['sqlite-jdbc.version'] = |
||||
// ext['sun-mail.version'] = |
// ext['sun-mail.version'] = |
||||
// ext['thymeleaf.version'] = |
// ext['thymeleaf.version'] = |
||||
// ext['thymeleaf-extras-data-attribute.version'] = |
// ext['thymeleaf-extras-data-attribute.version'] = |
||||
// ext['thymeleaf-extras-java8time.version'] = |
// ext['thymeleaf-extras-java8time.version'] = |
||||
// ext['thymeleaf-extras-springsecurity.version'] = |
// ext['thymeleaf-extras-springsecurity.version'] = |
||||
// ext['thymeleaf-layout-dialect.version'] = |
// ext['thymeleaf-layout-dialect.version'] = |
||||
// ext['tomcat.version'] = |
// ext['tomcat.version'] = |
||||
// ext['unboundid-ldapsdk.version'] = |
// ext['unboundid-ldapsdk.version'] = |
||||
// ext['undertow.version'] = |
// ext['undertow.version'] = |
||||
// ext['versions-maven-plugin.version'] = |
// ext['versions-maven-plugin.version'] = |
||||
// ext['webjars-hal-browser.version'] = |
// ext['webjars-hal-browser.version'] = |
||||
// ext['webjars-locator-core.version'] = |
// ext['webjars-locator-core.version'] = |
||||
// ext['wsdl4j.version'] = |
// ext['wsdl4j.version'] = |
||||
// ext['xml-maven-plugin.version'] = |
// ext['xml-maven-plugin.version'] = |
||||
// ext['xmlunit2.version'] = |
// ext['xmlunit2.version'] = |
||||
} |
|
||||
|
@ -1,4 +1,10 @@ |
|||||
{ |
{ |
||||
"menu.testcase": "Test Case", |
"menu.testcase": "Test Case", |
||||
"menu.testcase.formElements": "Form Elements" |
"menu.testcase.openNoMenuRoute": "Open No Menu Route", |
||||
|
"menu.testcase.mathEditor": "Math Formual Editor", |
||||
|
"menu.testcase.form":"Form Element", |
||||
|
"menu.testcase.excel": "Excel", |
||||
|
"menu.testcase.word": "Word", |
||||
|
|
||||
|
"route.testcase.noMenuRoute":"No Menu Route" |
||||
} |
} |
||||
|
@ -1,4 +1,10 @@ |
|||||
{ |
{ |
||||
"menu.testcase": "測試用例", |
"menu.testcase": "測試用例", |
||||
"menu.testcase.formElements": "表單控件" |
"menu.testcase.openNoMenuRoute": "打開無關聯菜單的路由", |
||||
|
"menu.testcase.mathEditor": "數學公式編輯器", |
||||
|
"menu.testcase.form":"表單元素", |
||||
|
"menu.testcase.excel": "Excel", |
||||
|
"menu.testcase.word": "Word", |
||||
|
|
||||
|
"route.testcase.noMenuRoute":"無關聯菜單路由" |
||||
} |
} |
||||
|
@ -1,5 +1,10 @@ |
|||||
{ |
{ |
||||
"menu.testcase": "测试用例", |
"menu.testcase": "测试用例", |
||||
"menu.testcase.tag": "Tag", |
"menu.testcase.openNoMenuRoute": "打开无关联菜单的路由示例", |
||||
"menu.testcase.formElements": "表单控件{name}", |
"menu.testcase.mathEditor": "数学公式编辑器", |
||||
|
"menu.testcase.form":"表单元素", |
||||
|
"menu.testcase.excel": "Excel", |
||||
|
"menu.testcase.word": "Word", |
||||
|
|
||||
|
"route.testcase.noMenuRoute":"无关联菜单路由" |
||||
} |
} |
||||
|
@ -0,0 +1,53 @@ |
|||||
|
<template> |
||||
|
<div ref="divRef" class="border border-gray-200" style="height: 100%"></div> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
import { ref, onMounted } from 'vue'; |
||||
|
|
||||
|
import '@univerjs/design/lib/index.css'; |
||||
|
import '@univerjs/ui/lib/index.css'; |
||||
|
import '@univerjs/docs-ui/lib/index.css'; |
||||
|
import '@univerjs/sheets-ui/lib/index.css'; |
||||
|
import '@univerjs/sheets-formula/lib/index.css'; |
||||
|
|
||||
|
import { Univer, UniverInstanceType, LocaleType } from '@univerjs/core'; |
||||
|
import { defaultTheme } from '@univerjs/design'; |
||||
|
|
||||
|
import { UniverFormulaEnginePlugin } from '@univerjs/engine-formula'; |
||||
|
import { UniverRenderEnginePlugin } from '@univerjs/engine-render'; |
||||
|
|
||||
|
import { UniverUIPlugin } from '@univerjs/ui'; |
||||
|
|
||||
|
import { UniverDocsPlugin } from '@univerjs/docs'; |
||||
|
import { UniverDocsUIPlugin } from '@univerjs/docs-ui'; |
||||
|
|
||||
|
import { UniverSheetsPlugin } from '@univerjs/sheets'; |
||||
|
import { UniverSheetsFormulaPlugin } from '@univerjs/sheets-formula'; |
||||
|
import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; |
||||
|
|
||||
|
const divRef = ref(); |
||||
|
|
||||
|
onMounted(() => { |
||||
|
const univer = new Univer({ |
||||
|
locale: LocaleType.en_US, |
||||
|
theme: defaultTheme, |
||||
|
}); |
||||
|
|
||||
|
univer.registerPlugin(UniverRenderEnginePlugin); |
||||
|
univer.registerPlugin(UniverFormulaEnginePlugin); |
||||
|
univer.registerPlugin(UniverUIPlugin, { |
||||
|
container: divRef.value, |
||||
|
}); |
||||
|
|
||||
|
univer.registerPlugin(UniverDocsPlugin, { |
||||
|
hasScroll: false, |
||||
|
}); |
||||
|
univer.registerPlugin(UniverDocsUIPlugin); |
||||
|
|
||||
|
univer.registerPlugin(UniverSheetsPlugin); |
||||
|
univer.registerPlugin(UniverSheetsUIPlugin); |
||||
|
univer.registerPlugin(UniverSheetsFormulaPlugin); |
||||
|
|
||||
|
univer.createUnit(UniverInstanceType.UNIVER_SHEET, {}); |
||||
|
}); |
||||
|
</script> |
@ -1,413 +1,10 @@ |
|||||
<template> |
<template> |
||||
<div style="height: 100%"> |
<div style="height: 100%"> |
||||
<w-grid |
<w-color-input-palette v-model="colorRef"></w-color-input-palette> |
||||
:title="$t('lcdp.scheduler.task.grid.title')" |
|
||||
:config-button="true" |
|
||||
selection="multiple" |
|
||||
:checkbox-selection="true" |
|
||||
:query-form-cols-num="12" |
|
||||
:query-form-fields="[ |
|
||||
{ colSpan: 4, name: 'name', label: $t('name'), type: 'text' }, |
|
||||
{ |
|
||||
colSpan: 4, |
|
||||
name: 'executor', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.executor'), |
|
||||
type: 'select', |
|
||||
clearable: true, |
|
||||
queryOperator: 'equals', |
|
||||
options: executorOptionsRef, |
|
||||
}, |
|
||||
{ |
|
||||
colSpan: 2, |
|
||||
name: 'status', |
|
||||
label: $t('status'), |
|
||||
type: 'select', |
|
||||
clearable: true, |
|
||||
queryOperator: 'equals', |
|
||||
options: Options.enum(Enums.TaskStatus), |
|
||||
}, |
|
||||
]" |
|
||||
:data-url="Environment.apiContextPath('/api/scheduler/manager/task')" |
|
||||
:pageable="false" |
|
||||
:toolbar-configure="{ noIcon: false }" |
|
||||
:toolbar-actions="[ |
|
||||
'query', |
|
||||
'refresh', |
|
||||
'separator', |
|
||||
'add', |
|
||||
'edit', |
|
||||
'remove', |
|
||||
'separator', |
|
||||
{ |
|
||||
name: 'execute', |
|
||||
label: $t('lcdp.scheduler.task.grid.toolbar.execute'), |
|
||||
icon: 'bi-caret-right-fill', |
|
||||
enableIf: (selecteds) => { |
|
||||
return selecteds && selecteds.length > 0; |
|
||||
}, |
|
||||
click: () => {}, |
|
||||
}, |
|
||||
{ |
|
||||
name: 'schedule', |
|
||||
label: $t('lcdp.scheduler.task.grid.toolbar.schedule'), |
|
||||
icon: 'bi-cloud-arrow-up', |
|
||||
enableIf: (selecteds) => { |
|
||||
return selecteds && selecteds.length > 0; |
|
||||
}, |
|
||||
click: () => {}, |
|
||||
}, |
|
||||
{ |
|
||||
name: 'log', |
|
||||
label: $t('lcdp.scheduler.task.grid.toolbar.log'), |
|
||||
icon: 'bi-receipt', |
|
||||
enableIf: (selecteds) => { |
|
||||
return selecteds && selecteds.length > 0; |
|
||||
}, |
|
||||
click: () => {}, |
|
||||
}, |
|
||||
'separator', |
|
||||
'view', |
|
||||
'separator', |
|
||||
'export', |
|
||||
]" |
|
||||
:columns="[ |
|
||||
{ |
|
||||
width: 80, |
|
||||
name: 'status', |
|
||||
label: $t('status'), |
|
||||
align: 'center', |
|
||||
format: (value) => { |
|
||||
return { |
|
||||
componentType: 'QChip', |
|
||||
attrs: { color: value == 'RUNNING' ? 'green' : 'gray', label: Formater.enum(Enums.TaskStatus)(value), dense: true }, |
|
||||
}; |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
width: 90, |
|
||||
name: 'type', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.type'), |
|
||||
format: Formater.enum(Enums.TaskType), |
|
||||
}, |
|
||||
{ width: 150, name: 'name', label: $t('name') }, |
|
||||
{ |
|
||||
width: 100, |
|
||||
name: 'scheduleType', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.scheduleType'), |
|
||||
format: (value, row) => { |
|
||||
console.log(row); |
|
||||
return Formater.enum(Enums.ScheduleType)(value); |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
width: 140, |
|
||||
name: 'triggerLastTime', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.triggerLastTime'), |
|
||||
}, |
|
||||
{ width: 140, name: 'triggerNextTime', label: $t('lcdp.scheduler.task.grid.entity.triggerNextTime') }, |
|
||||
{ |
|
||||
width: 400, |
|
||||
name: 'executorName', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.executorName'), |
|
||||
format: (value, row) => { |
|
||||
return { |
|
||||
componentType: 'q-btn', |
|
||||
attrs: { |
|
||||
flat: true, |
|
||||
rounded: true, |
|
||||
noCaps: true, |
|
||||
label: row.executorApplicationName + ':' + row.executorName, |
|
||||
color: 'blue', |
|
||||
onClick: () => { |
|
||||
executorRegistryDialogRef.open(row); |
|
||||
}, |
|
||||
}, |
|
||||
}; |
|
||||
}, |
|
||||
}, |
|
||||
{ width: 80, name: 'author', label: $t('lcdp.scheduler.task.grid.entity.author') }, |
|
||||
{ width: 200, name: 'alarmEmail', label: $t('lcdp.scheduler.task.grid.entity.alarmEmail') }, |
|
||||
{ |
|
||||
width: 100, |
|
||||
name: 'routeStrategy', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.routeStrategy'), |
|
||||
format: (value) => { |
|
||||
return Formater.enum(Enums.RouteStrategy)(value); |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
width: 100, |
|
||||
name: 'expirationPolicy', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.expirationPolicy'), |
|
||||
format: (value) => { |
|
||||
return Formater.enum(Enums.ExpirationPolicy)(value); |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
width: 100, |
|
||||
name: 'blockStrategy', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.blockStrategy'), |
|
||||
format: (value) => { |
|
||||
return Formater.enum(Enums.BlockStrategy)(value); |
|
||||
}, |
|
||||
}, |
|
||||
{ width: 80, name: 'timeout', label: $t('lcdp.scheduler.task.grid.entity.timeout') }, |
|
||||
{ width: 90, name: 'failRetryCount', label: $t('lcdp.scheduler.task.grid.entity.failRetryCount') }, |
|
||||
]" |
|
||||
:editor="{ |
|
||||
dialog: { |
|
||||
width: '800px', |
|
||||
}, |
|
||||
form: { |
|
||||
colsNum: 2, |
|
||||
fields: [ |
|
||||
{ |
|
||||
name: 'type', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.type'), |
|
||||
required: true, |
|
||||
type: 'select', |
|
||||
options: Options.enum(Enums.TaskType), |
|
||||
}, |
|
||||
{ |
|
||||
name: 'executor', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.executor'), |
|
||||
required: true, |
|
||||
type: 'select', |
|
||||
clearable: true, |
|
||||
options: executorOptionsRef, |
|
||||
}, |
|
||||
{ colsFirst: true, name: 'name', label: $t('name'), type: 'text', required: true }, |
|
||||
{ name: 'description', label: $t('description'), type: 'text' }, |
|
||||
{ name: 'author', label: $t('lcdp.scheduler.task.grid.entity.author'), type: 'text' }, |
|
||||
{ name: 'alarmEmail', label: $t('lcdp.scheduler.task.grid.entity.alarmEmail'), type: 'text' }, |
|
||||
{ |
|
||||
colsFirst: true, |
|
||||
name: 'scheduleType', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.scheduleType'), |
|
||||
required: true, |
|
||||
type: 'select', |
|
||||
options: Options.enum(Enums.ScheduleType), |
|
||||
defaultValue: 'FIX_RATE', |
|
||||
}, |
|
||||
{ |
|
||||
name: 'scheduleCron', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.scheduleCron'), |
|
||||
type: 'cron', |
|
||||
showIf: (arg) => { |
|
||||
return arg.form.getFieldValue('scheduleType') === 'CRON'; |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
name: 'scheduleFixRate', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.scheduleFixRate'), |
|
||||
type: 'number', |
|
||||
showIf: (arg) => { |
|
||||
return arg.form.getFieldValue('scheduleType') === 'FIX_RATE'; |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
name: 'scheduleFixDelay', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.scheduleFixDelay'), |
|
||||
type: 'number', |
|
||||
showIf: (arg) => { |
|
||||
return arg.form.getFieldValue('scheduleType') === 'FIX_DELAY'; |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
colsFirst: true, |
|
||||
colSpan: 2, |
|
||||
name: 'bean', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.type.bean'), |
|
||||
type: 'text', |
|
||||
showIf: (arg) => { |
|
||||
return arg.form.getFieldValue('type') === 'BEAN'; |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
colsFirst: true, |
|
||||
colSpan: 2, |
|
||||
name: 'groovy', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.type.groovy'), |
|
||||
type: 'code-mirror', |
|
||||
rows: 8, |
|
||||
lang: 'groovy', |
|
||||
showIf: (arg) => { |
|
||||
return arg.form.getFieldValue('type') === 'GROOVY'; |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
colsFirst: true, |
|
||||
colSpan: 2, |
|
||||
name: 'shell', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.type.shell'), |
|
||||
type: 'code-mirror', |
|
||||
rows: 8, |
|
||||
lang: 'shell', |
|
||||
showIf: (arg) => { |
|
||||
return arg.form.getFieldValue('type') === 'SHELL'; |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
colsFirst: true, |
|
||||
colSpan: 2, |
|
||||
name: 'python', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.type.python'), |
|
||||
type: 'code-mirror', |
|
||||
rows: 8, |
|
||||
lang: 'python', |
|
||||
showIf: (arg) => { |
|
||||
return arg.form.getFieldValue('type') === 'PYTHON'; |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
colsFirst: true, |
|
||||
colSpan: 2, |
|
||||
name: 'php', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.type.php'), |
|
||||
type: 'code-mirror', |
|
||||
rows: 8, |
|
||||
lang: 'php', |
|
||||
showIf: (arg) => { |
|
||||
return arg.form.getFieldValue('type') === 'PHP'; |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
colsFirst: true, |
|
||||
colSpan: 2, |
|
||||
name: 'nodejs', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.type.nodejs'), |
|
||||
type: 'code-mirror', |
|
||||
rows: 8, |
|
||||
lang: 'nodejs', |
|
||||
showIf: (arg) => { |
|
||||
return arg.form.getFieldValue('type') === 'NODEJS'; |
|
||||
}, |
|
||||
}, |
|
||||
{ |
|
||||
colsFirst: true, |
|
||||
colSpan: 2, |
|
||||
name: 'powershell', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.type.powershell'), |
|
||||
type: 'code-mirror', |
|
||||
rows: 8, |
|
||||
lang: 'powershell', |
|
||||
showIf: (arg) => { |
|
||||
return arg.form.getFieldValue('type') === 'POWERSHELL'; |
|
||||
}, |
|
||||
}, |
|
||||
{ colSpan: 2, name: 'parameter', label: $t('lcdp.scheduler.task.grid.entity.parameter'), type: 'textarea', rows: 5 }, |
|
||||
{ |
|
||||
name: 'routeStrategy', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.routeStrategy'), |
|
||||
required: true, |
|
||||
type: 'select', |
|
||||
options: Options.enum(Enums.RouteStrategy), |
|
||||
defaultValue: 'FIRST', |
|
||||
}, |
|
||||
{ |
|
||||
name: 'expirationPolicy', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.expirationPolicy'), |
|
||||
required: true, |
|
||||
type: 'select', |
|
||||
options: Options.enum(Enums.ExpirationPolicy), |
|
||||
}, |
|
||||
{ |
|
||||
name: 'blockStrategy', |
|
||||
label: $t('lcdp.scheduler.task.grid.entity.blockStrategy'), |
|
||||
required: true, |
|
||||
type: 'select', |
|
||||
options: Options.enum(Enums.BlockStrategy), |
|
||||
}, |
|
||||
{ colsFirst: true, name: 'timeout', label: $t('lcdp.scheduler.task.grid.entity.timeout.label'), type: 'number' }, |
|
||||
{ name: 'failRetryCount', label: $t('lcdp.scheduler.task.grid.entity.failRetryCount.label'), type: 'number' }, |
|
||||
], |
|
||||
}, |
|
||||
}" |
|
||||
:viewer="{ |
|
||||
panel: { |
|
||||
columnNum: 1, |
|
||||
fields: [ |
|
||||
{ name: 'id', label: $t('id') }, |
|
||||
{ name: 'parent', label: $t('parent') }, |
|
||||
{ name: 'type', label: $t('lcdp.scheduler.task.grid.entity.type') }, |
|
||||
|
|
||||
{ name: 'executor', label: $t('lcdp.scheduler.task.grid.entity.executorId') }, |
|
||||
{ name: 'executorName', label: $t('lcdp.scheduler.task.grid.entity.executorName') }, |
|
||||
|
|
||||
{ name: 'name', label: $t('name') }, |
|
||||
{ name: 'description', label: $t('description') }, |
|
||||
{ name: 'author', label: $t('lcdp.scheduler.task.grid.entity.author') }, |
|
||||
{ name: 'alarmEmail', label: $t('lcdp.scheduler.task.grid.entity.alarmEmail') }, |
|
||||
|
|
||||
{ name: 'scheduleType', label: $t('lcdp.scheduler.task.grid.entity.scheduleType') }, |
|
||||
{ name: 'scheduleConf', label: $t('lcdp.scheduler.task.grid.entity.scheduleConf') }, |
|
||||
|
|
||||
{ name: 'bean', label: $t('lcdp.scheduler.task.grid.entity.type.bean') }, |
|
||||
{ name: 'groovy', label: $t('lcdp.scheduler.task.grid.entity.type.groovy') }, |
|
||||
{ name: 'shell', label: $t('lcdp.scheduler.task.grid.entity.type.shell') }, |
|
||||
{ name: 'python', label: $t('lcdp.scheduler.task.grid.entity.type.python') }, |
|
||||
{ name: 'php', label: $t('lcdp.scheduler.task.grid.entity.type.php') }, |
|
||||
{ name: 'nodejs', label: $t('lcdp.scheduler.task.grid.entity.type.nodejs') }, |
|
||||
{ name: 'powershell', label: $t('lcdp.scheduler.task.grid.entity.type.powershell') }, |
|
||||
|
|
||||
{ name: 'parameter', label: $t('lcdp.scheduler.task.grid.entity.parameter') }, |
|
||||
{ name: 'routeStrategy', label: $t('lcdp.scheduler.task.grid.entity.routeStrategy') }, |
|
||||
{ name: 'expirationPolicy', label: $t('lcdp.scheduler.task.grid.entity.expirationPolicy') }, |
|
||||
{ name: 'blockStrategy', label: $t('lcdp.scheduler.task.grid.entity.blockStrategy') }, |
|
||||
{ name: 'timeout', label: $t('lcdp.scheduler.task.grid.entity.timeout') }, |
|
||||
{ name: 'failRetryCount', label: $t('lcdp.scheduler.task.grid.entity.failRetryCount') }, |
|
||||
|
|
||||
{ name: 'triggerStatus', label: $t('lcdp.scheduler.task.grid.entity.triggerStatus') }, |
|
||||
{ name: 'triggerLastTime', label: $t('lcdp.scheduler.task.grid.entity.triggerLastTime') }, |
|
||||
{ name: 'triggerNextTime', label: $t('lcdp.scheduler.task.grid.entity.triggerNextTime') }, |
|
||||
|
|
||||
{ name: 'dataComeFrom', label: $t('dataComeFrom') }, |
|
||||
{ name: 'creator', label: $t('creator') }, |
|
||||
{ name: 'createDate', label: $t('createDate') }, |
|
||||
{ name: 'lastModifier', label: $t('lastModifier') }, |
|
||||
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() }, |
|
||||
], |
|
||||
}, |
|
||||
}" |
|
||||
></w-grid> |
|
||||
<ExecutorRegistryDialog ref="executorRegistryDialogRef"></ExecutorRegistryDialog> |
|
||||
</div> |
</div> |
||||
</template> |
</template> |
||||
<script setup lang="ts"> |
<script setup lang="ts"> |
||||
import { ref, inject } from 'vue'; |
import { ref } from 'vue'; |
||||
import { axios, Environment, EnumTools, Formater, Options } from 'platform-core'; |
|
||||
import ExecutorRegistryDialog from './ExecutorRegistryDialog.vue'; |
|
||||
|
|
||||
const eventBus = inject('eventBus'); |
|
||||
|
|
||||
const Enums = await EnumTools.fetch([ |
|
||||
'io.sc.platform.scheduler.core.enums.RouteStrategy', |
|
||||
'io.sc.platform.scheduler.core.enums.ExpirationPolicy', |
|
||||
'io.sc.platform.scheduler.core.enums.BlockStrategy', |
|
||||
'io.sc.platform.scheduler.core.enums.TaskType', |
|
||||
'io.sc.platform.scheduler.core.enums.ScheduleType', |
|
||||
'io.sc.platform.scheduler.core.enums.TaskStatus', |
|
||||
]); |
|
||||
|
|
||||
const executorRegistryDialogRef = ref(); |
|
||||
const executorOptionsRef = ref([]); |
|
||||
|
|
||||
const reloadExecutor = () => { |
|
||||
axios.get(Environment.apiContextPath('/api/scheduler/manager/executor?pageable=false')).then((response) => { |
|
||||
executorOptionsRef.value.splice(0, executorOptionsRef.value.length); |
|
||||
const list = response?.data?.content; |
|
||||
if (list) { |
|
||||
for (const item of list) { |
|
||||
executorOptionsRef.value.push({ label: item.applicationName + ' : ' + item.name, value: item.id }); |
|
||||
} |
|
||||
} |
|
||||
}); |
|
||||
}; |
|
||||
|
|
||||
// 当执行器发生增删改查时 |
|
||||
eventBus.on('io.sc.platform.scheduler.manager.ExecutorChanged', () => { |
|
||||
reloadExecutor(); |
|
||||
}); |
|
||||
|
|
||||
reloadExecutor(); |
const colorRef = ref('#EEEEEE'); |
||||
</script> |
</script> |
||||
|
@ -0,0 +1,133 @@ |
|||||
|
<template> |
||||
|
<div> |
||||
|
<w-expression v-model="formula3"></w-expression> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
const formula = ''; |
||||
|
const formula2 = 'hello world'; |
||||
|
const formula3 = ` |
||||
|
<mrow> |
||||
|
<mi>0.12</mi> |
||||
|
<mo>×</mo> |
||||
|
<mrow> |
||||
|
<msqrt> |
||||
|
<mi>x</mi> |
||||
|
</msqrt> |
||||
|
<mo>(</mo> |
||||
|
<mrow> |
||||
|
<mfrac> |
||||
|
<mrow> |
||||
|
<mspace></mspace> |
||||
|
<mi>1</mi> |
||||
|
<mo>-</mo> |
||||
|
<mrow> |
||||
|
<mfrac> |
||||
|
<mrow><mi>1</mi></mrow> |
||||
|
<mrow> |
||||
|
<msup> |
||||
|
<mi>e</mi> |
||||
|
<mi> |
||||
|
<mrow> |
||||
|
<mo>(</mo> |
||||
|
<mi>50</mi> |
||||
|
<mo>×</mo> |
||||
|
<mi>PD</mi> |
||||
|
<mo>)</mo> |
||||
|
</mrow> |
||||
|
</mi> |
||||
|
</msup> |
||||
|
</mrow> |
||||
|
</mfrac> |
||||
|
</mrow> |
||||
|
</mrow> |
||||
|
<mrow> |
||||
|
<mi>1</mi> |
||||
|
<mo>-</mo> |
||||
|
<mrow> |
||||
|
<mfrac> |
||||
|
<mrow><mi>1</mi></mrow> |
||||
|
<mrow> |
||||
|
<msup> |
||||
|
<mi>e</mi> |
||||
|
<mi>50</mi> |
||||
|
</msup> |
||||
|
</mrow> |
||||
|
</mfrac> |
||||
|
</mrow> |
||||
|
</mrow> |
||||
|
</mfrac> |
||||
|
</mrow> |
||||
|
<mo>)</mo> |
||||
|
</mrow> |
||||
|
<mo>+</mo> |
||||
|
<mi>0.24</mi> |
||||
|
<mo>×</mo> |
||||
|
<mrow> |
||||
|
<mo>(</mo> |
||||
|
<mi>1</mi> |
||||
|
<mo>-</mo> |
||||
|
<mrow> |
||||
|
<mfrac> |
||||
|
<mrow> |
||||
|
<mi>1</mi> |
||||
|
<mo>-</mo> |
||||
|
<mrow> |
||||
|
<mfrac> |
||||
|
<mrow><mi>1</mi></mrow> |
||||
|
<mrow> |
||||
|
<msup> |
||||
|
<mi>e</mi> |
||||
|
<mi> |
||||
|
<mrow> |
||||
|
<mo>(</mo> |
||||
|
<mi>50</mi> |
||||
|
<mo>×</mo> |
||||
|
<mi>PD</mi> |
||||
|
<mo>)</mo> |
||||
|
</mrow> |
||||
|
</mi> |
||||
|
</msup> |
||||
|
</mrow> |
||||
|
</mfrac> |
||||
|
</mrow> |
||||
|
</mrow> |
||||
|
<mrow> |
||||
|
<mi>1</mi> |
||||
|
<mo>-</mo> |
||||
|
<mrow> |
||||
|
<mfrac> |
||||
|
<mrow><mi>1</mi></mrow> |
||||
|
<mrow> |
||||
|
<msup> |
||||
|
<mi>e</mi> |
||||
|
<mi>50</mi> |
||||
|
</msup> |
||||
|
</mrow> |
||||
|
</mfrac> |
||||
|
</mrow> |
||||
|
</mrow> |
||||
|
</mfrac> |
||||
|
</mrow> |
||||
|
<mo>)</mo> |
||||
|
</mrow> |
||||
|
<mo>-</mo> |
||||
|
<mi>0.04</mi> |
||||
|
<mo>×</mo> |
||||
|
<mrow> |
||||
|
<mo>(</mo> |
||||
|
<mi>1</mi> |
||||
|
<mo>-</mo> |
||||
|
<mfrac> |
||||
|
<mrow> |
||||
|
<mi>S</mi> |
||||
|
<mo>-</mo> |
||||
|
<mi>3</mi> |
||||
|
</mrow> |
||||
|
<mi>27</mi> |
||||
|
</mfrac> |
||||
|
<mo>)</mo> |
||||
|
</mrow> |
||||
|
</mrow> |
||||
|
`; |
||||
|
</script> |
@ -0,0 +1,4 @@ |
|||||
|
<template> |
||||
|
<div class="py-10">路由参数: {{ $route.params }}</div> |
||||
|
</template> |
||||
|
<script setup lang="ts"></script> |
@ -0,0 +1,12 @@ |
|||||
|
<template> |
||||
|
<div class="row justify-center py-10"> |
||||
|
<q-btn |
||||
|
label="在标签中打开非菜单路由" |
||||
|
:to="{ |
||||
|
name: 'route.testcase.noMenuRoute', |
||||
|
params: { id: 'xxx' }, |
||||
|
}" |
||||
|
></q-btn> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script setup lang="ts"></script> |
@ -1,44 +1,406 @@ |
|||||
<template> |
<template> |
||||
|
<div style="height: 100%"> |
||||
<w-grid |
<w-grid |
||||
ref="gridRef" |
:title="$t('lcdp.scheduler.task.grid.title')" |
||||
:height="300" |
:config-button="true" |
||||
:title="$t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.title')" |
|
||||
selection="multiple" |
selection="multiple" |
||||
:full-screen-button="false" |
:checkbox-selection="true" |
||||
|
:query-form-cols-num="12" |
||||
|
:query-form-fields="[ |
||||
|
{ colSpan: 4, name: 'name', label: $t('name'), type: 'text' }, |
||||
|
{ |
||||
|
colSpan: 4, |
||||
|
name: 'executor', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.executor'), |
||||
|
type: 'select', |
||||
|
clearable: true, |
||||
|
queryOperator: 'equals', |
||||
|
options: executorOptionsRef, |
||||
|
}, |
||||
|
{ |
||||
|
colSpan: 2, |
||||
|
name: 'status', |
||||
|
label: $t('status'), |
||||
|
type: 'select', |
||||
|
clearable: true, |
||||
|
queryOperator: 'equals', |
||||
|
options: Options.enum(Enums.TaskStatus), |
||||
|
}, |
||||
|
]" |
||||
|
:data-url="Environment.apiContextPath('/api/scheduler/manager/task')" |
||||
|
:pageable="false" |
||||
:toolbar-configure="{ noIcon: false }" |
:toolbar-configure="{ noIcon: false }" |
||||
:toolbar-actions="['refresh']" |
:toolbar-actions="[ |
||||
:auto-fetch-data="true" |
'query', |
||||
:pageable="true" |
'refresh', |
||||
:fetch-data-url="Environment.apiContextPath('/api/scheduler/manager/executorRegistry')" |
'separator', |
||||
|
'add', |
||||
|
'edit', |
||||
|
'remove', |
||||
|
'separator', |
||||
|
{ |
||||
|
name: 'execute', |
||||
|
label: $t('lcdp.scheduler.task.grid.toolbar.execute'), |
||||
|
icon: 'bi-caret-right-fill', |
||||
|
enableIf: (selecteds) => { |
||||
|
return selecteds && selecteds.length > 0; |
||||
|
}, |
||||
|
click: () => {}, |
||||
|
}, |
||||
|
{ |
||||
|
name: 'schedule', |
||||
|
label: $t('lcdp.scheduler.task.grid.toolbar.schedule'), |
||||
|
icon: 'bi-cloud-arrow-up', |
||||
|
enableIf: (selecteds) => { |
||||
|
return selecteds && selecteds.length > 0; |
||||
|
}, |
||||
|
click: () => {}, |
||||
|
}, |
||||
|
{ |
||||
|
name: 'log', |
||||
|
label: $t('lcdp.scheduler.task.grid.toolbar.log'), |
||||
|
icon: 'bi-receipt', |
||||
|
enableIf: (selecteds) => { |
||||
|
return selecteds && selecteds.length > 0; |
||||
|
}, |
||||
|
click: () => {}, |
||||
|
}, |
||||
|
'separator', |
||||
|
'view', |
||||
|
'separator', |
||||
|
'export', |
||||
|
]" |
||||
:columns="[ |
:columns="[ |
||||
{ |
{ |
||||
width: 150, |
width: 80, |
||||
name: 'online', |
name: 'status', |
||||
label: $t('status'), |
label: $t('status'), |
||||
|
align: 'center', |
||||
format: (value) => { |
format: (value) => { |
||||
return { |
return { |
||||
componentType: 'w-enums-tag', |
componentType: 'QChip', |
||||
|
attrs: { color: value == 'RUNNING' ? 'green' : 'gray', label: Formater.enum(Enums.TaskStatus)(value), dense: true }, |
||||
|
}; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
width: 90, |
||||
|
name: 'type', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type'), |
||||
|
format: Formater.enum(Enums.TaskType), |
||||
|
}, |
||||
|
{ width: 150, name: 'name', label: $t('name') }, |
||||
|
{ |
||||
|
width: 100, |
||||
|
name: 'scheduleType', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.scheduleType'), |
||||
|
format: (value, row) => { |
||||
|
console.log(row); |
||||
|
return Formater.enum(Enums.ScheduleType)(value); |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
width: 140, |
||||
|
name: 'triggerLastTime', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.triggerLastTime'), |
||||
|
}, |
||||
|
{ width: 140, name: 'triggerNextTime', label: $t('lcdp.scheduler.task.grid.entity.triggerNextTime') }, |
||||
|
{ |
||||
|
width: 400, |
||||
|
name: 'executorName', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.executorName'), |
||||
|
format: (value, row) => { |
||||
|
return { |
||||
|
componentType: 'q-btn', |
||||
attrs: { |
attrs: { |
||||
value: value, |
flat: true, |
||||
dense: true, |
rounded: true, |
||||
items: [ |
noCaps: true, |
||||
{ value: true, color: 'green', label: $t('online') }, |
label: row.executorApplicationName + ':' + row.executorName, |
||||
{ value: false, color: 'grey', label: $t('offline') }, |
color: 'blue', |
||||
], |
onClick: () => { |
||||
|
executorRegistryDialogRef.open(row); |
||||
|
}, |
||||
}, |
}, |
||||
}; |
}; |
||||
}, |
}, |
||||
}, |
}, |
||||
{ width: 150, name: 'applicationName', label: $t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.entity.applicationName') }, |
{ width: 80, name: 'author', label: $t('lcdp.scheduler.task.grid.entity.author') }, |
||||
{ width: 100, name: 'name', label: $t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.entity.name') }, |
{ width: 200, name: 'alarmEmail', label: $t('lcdp.scheduler.task.grid.entity.alarmEmail') }, |
||||
{ width: 150, name: 'url', label: $t('url') }, |
{ |
||||
{ width: 100, name: 'registDate', label: t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.entity.registDate') }, |
width: 100, |
||||
|
name: 'routeStrategy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.routeStrategy'), |
||||
|
format: (value) => { |
||||
|
return Formater.enum(Enums.RouteStrategy)(value); |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
width: 100, |
||||
|
name: 'expirationPolicy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.expirationPolicy'), |
||||
|
format: (value) => { |
||||
|
return Formater.enum(Enums.ExpirationPolicy)(value); |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
width: 100, |
||||
|
name: 'blockStrategy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.blockStrategy'), |
||||
|
format: (value) => { |
||||
|
return Formater.enum(Enums.BlockStrategy)(value); |
||||
|
}, |
||||
|
}, |
||||
|
{ width: 80, name: 'timeout', label: $t('lcdp.scheduler.task.grid.entity.timeout') }, |
||||
|
{ width: 90, name: 'failRetryCount', label: $t('lcdp.scheduler.task.grid.entity.failRetryCount') }, |
||||
]" |
]" |
||||
|
:editor="{ |
||||
|
dialog: { |
||||
|
width: '800px', |
||||
|
}, |
||||
|
form: { |
||||
|
colsNum: 2, |
||||
|
fields: [ |
||||
|
{ |
||||
|
name: 'type', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type'), |
||||
|
required: true, |
||||
|
type: 'select', |
||||
|
options: Options.enum(Enums.TaskType), |
||||
|
}, |
||||
|
{ |
||||
|
name: 'executor', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.executor'), |
||||
|
required: true, |
||||
|
type: 'select', |
||||
|
clearable: true, |
||||
|
options: executorOptionsRef, |
||||
|
}, |
||||
|
{ colsFirst: true, name: 'name', label: $t('name'), type: 'text', required: true }, |
||||
|
{ name: 'description', label: $t('description'), type: 'text' }, |
||||
|
{ name: 'author', label: $t('lcdp.scheduler.task.grid.entity.author'), type: 'text' }, |
||||
|
{ name: 'alarmEmail', label: $t('lcdp.scheduler.task.grid.entity.alarmEmail'), type: 'text' }, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
name: 'scheduleType', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.scheduleType'), |
||||
|
required: true, |
||||
|
type: 'select', |
||||
|
options: Options.enum(Enums.ScheduleType), |
||||
|
defaultValue: 'FIX_RATE', |
||||
|
}, |
||||
|
{ |
||||
|
name: 'scheduleCron', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.scheduleCron'), |
||||
|
type: 'text', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('scheduleType') === 'CRON'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
name: 'scheduleFixRate', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.scheduleFixRate'), |
||||
|
type: 'number', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('scheduleType') === 'FIX_RATE'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
name: 'scheduleFixDelay', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.scheduleFixDelay'), |
||||
|
type: 'number', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('scheduleType') === 'FIX_DELAY'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'bean', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.bean'), |
||||
|
type: 'text', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'BEAN'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'groovy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.groovy'), |
||||
|
type: 'code-mirror', |
||||
|
rows: 8, |
||||
|
lang: 'groovy', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'GROOVY'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'shell', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.shell'), |
||||
|
type: 'code-mirror', |
||||
|
rows: 8, |
||||
|
lang: 'shell', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'SHELL'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'python', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.python'), |
||||
|
type: 'code-mirror', |
||||
|
rows: 8, |
||||
|
lang: 'python', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'PYTHON'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'php', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.php'), |
||||
|
type: 'code-mirror', |
||||
|
rows: 8, |
||||
|
lang: 'php', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'PHP'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'nodejs', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.nodejs'), |
||||
|
type: 'code-mirror', |
||||
|
rows: 8, |
||||
|
lang: 'nodejs', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'NODEJS'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'powershell', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.powershell'), |
||||
|
type: 'code-mirror', |
||||
|
rows: 8, |
||||
|
lang: 'powershell', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'POWERSHELL'; |
||||
|
}, |
||||
|
}, |
||||
|
{ colSpan: 2, name: 'parameter', label: $t('lcdp.scheduler.task.grid.entity.parameter'), type: 'textarea', rows: 5 }, |
||||
|
{ |
||||
|
name: 'routeStrategy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.routeStrategy'), |
||||
|
required: true, |
||||
|
type: 'select', |
||||
|
options: Options.enum(Enums.RouteStrategy), |
||||
|
defaultValue: 'FIRST', |
||||
|
}, |
||||
|
{ |
||||
|
name: 'expirationPolicy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.expirationPolicy'), |
||||
|
required: true, |
||||
|
type: 'select', |
||||
|
options: Options.enum(Enums.ExpirationPolicy), |
||||
|
}, |
||||
|
{ |
||||
|
name: 'blockStrategy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.blockStrategy'), |
||||
|
required: true, |
||||
|
type: 'select', |
||||
|
options: Options.enum(Enums.BlockStrategy), |
||||
|
}, |
||||
|
{ colsFirst: true, name: 'timeout', label: $t('lcdp.scheduler.task.grid.entity.timeout.label'), type: 'number' }, |
||||
|
{ name: 'failRetryCount', label: $t('lcdp.scheduler.task.grid.entity.failRetryCount.label'), type: 'number' }, |
||||
|
], |
||||
|
}, |
||||
|
}" |
||||
|
:viewer="{ |
||||
|
panel: { |
||||
|
columnNum: 1, |
||||
|
fields: [ |
||||
|
{ name: 'id', label: $t('id') }, |
||||
|
{ name: 'parent', label: $t('parent') }, |
||||
|
{ name: 'type', label: $t('lcdp.scheduler.task.grid.entity.type') }, |
||||
|
|
||||
|
{ name: 'executor', label: $t('lcdp.scheduler.task.grid.entity.executorId') }, |
||||
|
{ name: 'executorName', label: $t('lcdp.scheduler.task.grid.entity.executorName') }, |
||||
|
|
||||
|
{ name: 'name', label: $t('name') }, |
||||
|
{ name: 'description', label: $t('description') }, |
||||
|
{ name: 'author', label: $t('lcdp.scheduler.task.grid.entity.author') }, |
||||
|
{ name: 'alarmEmail', label: $t('lcdp.scheduler.task.grid.entity.alarmEmail') }, |
||||
|
|
||||
|
{ name: 'scheduleType', label: $t('lcdp.scheduler.task.grid.entity.scheduleType') }, |
||||
|
{ name: 'scheduleConf', label: $t('lcdp.scheduler.task.grid.entity.scheduleConf') }, |
||||
|
|
||||
|
{ name: 'bean', label: $t('lcdp.scheduler.task.grid.entity.type.bean') }, |
||||
|
{ name: 'groovy', label: $t('lcdp.scheduler.task.grid.entity.type.groovy') }, |
||||
|
{ name: 'shell', label: $t('lcdp.scheduler.task.grid.entity.type.shell') }, |
||||
|
{ name: 'python', label: $t('lcdp.scheduler.task.grid.entity.type.python') }, |
||||
|
{ name: 'php', label: $t('lcdp.scheduler.task.grid.entity.type.php') }, |
||||
|
{ name: 'nodejs', label: $t('lcdp.scheduler.task.grid.entity.type.nodejs') }, |
||||
|
{ name: 'powershell', label: $t('lcdp.scheduler.task.grid.entity.type.powershell') }, |
||||
|
|
||||
|
{ name: 'parameter', label: $t('lcdp.scheduler.task.grid.entity.parameter') }, |
||||
|
{ name: 'routeStrategy', label: $t('lcdp.scheduler.task.grid.entity.routeStrategy') }, |
||||
|
{ name: 'expirationPolicy', label: $t('lcdp.scheduler.task.grid.entity.expirationPolicy') }, |
||||
|
{ name: 'blockStrategy', label: $t('lcdp.scheduler.task.grid.entity.blockStrategy') }, |
||||
|
{ name: 'timeout', label: $t('lcdp.scheduler.task.grid.entity.timeout') }, |
||||
|
{ name: 'failRetryCount', label: $t('lcdp.scheduler.task.grid.entity.failRetryCount') }, |
||||
|
|
||||
|
{ name: 'triggerStatus', label: $t('lcdp.scheduler.task.grid.entity.triggerStatus') }, |
||||
|
{ name: 'triggerLastTime', label: $t('lcdp.scheduler.task.grid.entity.triggerLastTime') }, |
||||
|
{ name: 'triggerNextTime', label: $t('lcdp.scheduler.task.grid.entity.triggerNextTime') }, |
||||
|
|
||||
|
{ name: 'dataComeFrom', label: $t('dataComeFrom') }, |
||||
|
{ name: 'creator', label: $t('creator') }, |
||||
|
{ name: 'createDate', label: $t('createDate') }, |
||||
|
{ name: 'lastModifier', label: $t('lastModifier') }, |
||||
|
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() }, |
||||
|
], |
||||
|
}, |
||||
|
}" |
||||
></w-grid> |
></w-grid> |
||||
|
</div> |
||||
</template> |
</template> |
||||
<script setup lang="ts"> |
<script setup lang="ts"> |
||||
import { Environment, $t } from '@/platform'; |
import { ref, inject } from 'vue'; |
||||
import { useI18n } from 'vue-i18n'; |
import { axios, Environment, EnumTools, Formater, Options } from '@/platform'; |
||||
const { t } = useI18n(); |
|
||||
console.log(t('menu.testcase.formElements', { name: 'xxx' }, '000')); |
const eventBus = inject('eventBus'); |
||||
|
|
||||
|
const Enums = await EnumTools.fetch([ |
||||
|
'io.sc.platform.scheduler.core.enums.RouteStrategy', |
||||
|
'io.sc.platform.scheduler.core.enums.ExpirationPolicy', |
||||
|
'io.sc.platform.scheduler.core.enums.BlockStrategy', |
||||
|
'io.sc.platform.scheduler.core.enums.TaskType', |
||||
|
'io.sc.platform.scheduler.core.enums.ScheduleType', |
||||
|
'io.sc.platform.scheduler.core.enums.TaskStatus', |
||||
|
]); |
||||
|
|
||||
|
const executorRegistryDialogRef = ref(); |
||||
|
const executorOptionsRef = ref([]); |
||||
|
|
||||
|
const reloadExecutor = () => { |
||||
|
axios.get(Environment.apiContextPath('/api/scheduler/manager/executor?pageable=false')).then((response) => { |
||||
|
executorOptionsRef.value.splice(0, executorOptionsRef.value.length); |
||||
|
const list = response?.data?.content; |
||||
|
if (list) { |
||||
|
for (const item of list) { |
||||
|
executorOptionsRef.value.push({ label: item.applicationName + ' : ' + item.name, value: item.id }); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
reloadExecutor(); |
||||
</script> |
</script> |
||||
|
@ -0,0 +1,53 @@ |
|||||
|
<template> |
||||
|
<div ref="divRef" class="border border-gray-200" style="height: 100%"></div> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
import { ref, onMounted } from 'vue'; |
||||
|
|
||||
|
import '@univerjs/design/lib/index.css'; |
||||
|
import '@univerjs/ui/lib/index.css'; |
||||
|
import '@univerjs/docs-ui/lib/index.css'; |
||||
|
import '@univerjs/sheets-ui/lib/index.css'; |
||||
|
import '@univerjs/sheets-formula/lib/index.css'; |
||||
|
|
||||
|
import { Univer, UniverInstanceType, LocaleType } from '@univerjs/core'; |
||||
|
import { defaultTheme } from '@univerjs/design'; |
||||
|
|
||||
|
import { UniverFormulaEnginePlugin } from '@univerjs/engine-formula'; |
||||
|
import { UniverRenderEnginePlugin } from '@univerjs/engine-render'; |
||||
|
|
||||
|
import { UniverUIPlugin } from '@univerjs/ui'; |
||||
|
|
||||
|
import { UniverDocsPlugin } from '@univerjs/docs'; |
||||
|
import { UniverDocsUIPlugin } from '@univerjs/docs-ui'; |
||||
|
|
||||
|
import { UniverSheetsPlugin } from '@univerjs/sheets'; |
||||
|
import { UniverSheetsFormulaPlugin } from '@univerjs/sheets-formula'; |
||||
|
import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; |
||||
|
|
||||
|
const divRef = ref(); |
||||
|
|
||||
|
onMounted(() => { |
||||
|
const univer = new Univer({ |
||||
|
locale: LocaleType.en_US, |
||||
|
theme: defaultTheme, |
||||
|
}); |
||||
|
|
||||
|
univer.registerPlugin(UniverRenderEnginePlugin); |
||||
|
univer.registerPlugin(UniverFormulaEnginePlugin); |
||||
|
univer.registerPlugin(UniverUIPlugin, { |
||||
|
container: divRef.value, |
||||
|
}); |
||||
|
|
||||
|
univer.registerPlugin(UniverDocsPlugin, { |
||||
|
hasScroll: false, |
||||
|
}); |
||||
|
univer.registerPlugin(UniverDocsUIPlugin); |
||||
|
|
||||
|
univer.registerPlugin(UniverSheetsPlugin); |
||||
|
univer.registerPlugin(UniverSheetsUIPlugin); |
||||
|
univer.registerPlugin(UniverSheetsFormulaPlugin); |
||||
|
|
||||
|
univer.createUnit(UniverInstanceType.UNIVER_DOC, {}); |
||||
|
}); |
||||
|
</script> |
@ -1,4 +1,9 @@ |
|||||
{ |
{ |
||||
"menu.testcase": "Test Case", |
"menu.testcase": "Test Case", |
||||
"menu.testcase.formElements": "Form Elements" |
"menu.testcase.openNoMenuRoute": "Open No Menu Route", |
||||
|
"menu.testcase.mathEditor": "Math Formual Editor", |
||||
|
"menu.testcase.excel": "Excel", |
||||
|
"menu.testcase.word": "Word", |
||||
|
|
||||
|
"route.testcase.noMenuRoute":"No Menu Route" |
||||
} |
} |
||||
|
@ -1,4 +1,9 @@ |
|||||
{ |
{ |
||||
"menu.testcase": "測試用例", |
"menu.testcase": "測試用例", |
||||
"menu.testcase.formElements": "表單控件" |
"menu.testcase.openNoMenuRoute": "打開無關聯菜單的路由", |
||||
|
"menu.testcase.mathEditor": "數學公式編輯器", |
||||
|
"menu.testcase.excel": "Excel", |
||||
|
"menu.testcase.word": "Word", |
||||
|
|
||||
|
"route.testcase.noMenuRoute":"無關聯菜單路由" |
||||
} |
} |
||||
|
@ -1,5 +1,9 @@ |
|||||
{ |
{ |
||||
"menu.testcase": "测试用例", |
"menu.testcase": "测试用例", |
||||
"menu.testcase.tag": "Tag", |
"menu.testcase.openNoMenuRoute": "打开无关联菜单的路由示例", |
||||
"menu.testcase.formElements": "表单控件{name}", |
"menu.testcase.mathEditor": "数学公式编辑器", |
||||
|
"menu.testcase.excel": "Excel", |
||||
|
"menu.testcase.word": "Word", |
||||
|
|
||||
|
"route.testcase.noMenuRoute":"无关联菜单路由" |
||||
} |
} |
||||
|
@ -0,0 +1,53 @@ |
|||||
|
<template> |
||||
|
<div ref="divRef" class="border border-gray-200" style="height: 100%"></div> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
import { ref, onMounted } from 'vue'; |
||||
|
|
||||
|
import '@univerjs/design/lib/index.css'; |
||||
|
import '@univerjs/ui/lib/index.css'; |
||||
|
import '@univerjs/docs-ui/lib/index.css'; |
||||
|
import '@univerjs/sheets-ui/lib/index.css'; |
||||
|
import '@univerjs/sheets-formula/lib/index.css'; |
||||
|
|
||||
|
import { Univer, UniverInstanceType, LocaleType } from '@univerjs/core'; |
||||
|
import { defaultTheme } from '@univerjs/design'; |
||||
|
|
||||
|
import { UniverFormulaEnginePlugin } from '@univerjs/engine-formula'; |
||||
|
import { UniverRenderEnginePlugin } from '@univerjs/engine-render'; |
||||
|
|
||||
|
import { UniverUIPlugin } from '@univerjs/ui'; |
||||
|
|
||||
|
import { UniverDocsPlugin } from '@univerjs/docs'; |
||||
|
import { UniverDocsUIPlugin } from '@univerjs/docs-ui'; |
||||
|
|
||||
|
import { UniverSheetsPlugin } from '@univerjs/sheets'; |
||||
|
import { UniverSheetsFormulaPlugin } from '@univerjs/sheets-formula'; |
||||
|
import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; |
||||
|
|
||||
|
const divRef = ref(); |
||||
|
|
||||
|
onMounted(() => { |
||||
|
const univer = new Univer({ |
||||
|
locale: LocaleType.en_US, |
||||
|
theme: defaultTheme, |
||||
|
}); |
||||
|
|
||||
|
univer.registerPlugin(UniverRenderEnginePlugin); |
||||
|
univer.registerPlugin(UniverFormulaEnginePlugin); |
||||
|
univer.registerPlugin(UniverUIPlugin, { |
||||
|
container: divRef.value, |
||||
|
}); |
||||
|
|
||||
|
univer.registerPlugin(UniverDocsPlugin, { |
||||
|
hasScroll: false, |
||||
|
}); |
||||
|
univer.registerPlugin(UniverDocsUIPlugin); |
||||
|
|
||||
|
univer.registerPlugin(UniverSheetsPlugin); |
||||
|
univer.registerPlugin(UniverSheetsUIPlugin); |
||||
|
univer.registerPlugin(UniverSheetsFormulaPlugin); |
||||
|
|
||||
|
univer.createUnit(UniverInstanceType.UNIVER_SHEET, {}); |
||||
|
}); |
||||
|
</script> |
@ -0,0 +1,133 @@ |
|||||
|
<template> |
||||
|
<div> |
||||
|
<w-expression v-model="formula3"></w-expression> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
const formula = ''; |
||||
|
const formula2 = 'hello world'; |
||||
|
const formula3 = ` |
||||
|
<mrow> |
||||
|
<mi>0.12</mi> |
||||
|
<mo>×</mo> |
||||
|
<mrow> |
||||
|
<msqrt> |
||||
|
<mi>x</mi> |
||||
|
</msqrt> |
||||
|
<mo>(</mo> |
||||
|
<mrow> |
||||
|
<mfrac> |
||||
|
<mrow> |
||||
|
<mspace></mspace> |
||||
|
<mi>1</mi> |
||||
|
<mo>-</mo> |
||||
|
<mrow> |
||||
|
<mfrac> |
||||
|
<mrow><mi>1</mi></mrow> |
||||
|
<mrow> |
||||
|
<msup> |
||||
|
<mi>e</mi> |
||||
|
<mi> |
||||
|
<mrow> |
||||
|
<mo>(</mo> |
||||
|
<mi>50</mi> |
||||
|
<mo>×</mo> |
||||
|
<mi>PD</mi> |
||||
|
<mo>)</mo> |
||||
|
</mrow> |
||||
|
</mi> |
||||
|
</msup> |
||||
|
</mrow> |
||||
|
</mfrac> |
||||
|
</mrow> |
||||
|
</mrow> |
||||
|
<mrow> |
||||
|
<mi>1</mi> |
||||
|
<mo>-</mo> |
||||
|
<mrow> |
||||
|
<mfrac> |
||||
|
<mrow><mi>1</mi></mrow> |
||||
|
<mrow> |
||||
|
<msup> |
||||
|
<mi>e</mi> |
||||
|
<mi>50</mi> |
||||
|
</msup> |
||||
|
</mrow> |
||||
|
</mfrac> |
||||
|
</mrow> |
||||
|
</mrow> |
||||
|
</mfrac> |
||||
|
</mrow> |
||||
|
<mo>)</mo> |
||||
|
</mrow> |
||||
|
<mo>+</mo> |
||||
|
<mi>0.24</mi> |
||||
|
<mo>×</mo> |
||||
|
<mrow> |
||||
|
<mo>(</mo> |
||||
|
<mi>1</mi> |
||||
|
<mo>-</mo> |
||||
|
<mrow> |
||||
|
<mfrac> |
||||
|
<mrow> |
||||
|
<mi>1</mi> |
||||
|
<mo>-</mo> |
||||
|
<mrow> |
||||
|
<mfrac> |
||||
|
<mrow><mi>1</mi></mrow> |
||||
|
<mrow> |
||||
|
<msup> |
||||
|
<mi>e</mi> |
||||
|
<mi> |
||||
|
<mrow> |
||||
|
<mo>(</mo> |
||||
|
<mi>50</mi> |
||||
|
<mo>×</mo> |
||||
|
<mi>PD</mi> |
||||
|
<mo>)</mo> |
||||
|
</mrow> |
||||
|
</mi> |
||||
|
</msup> |
||||
|
</mrow> |
||||
|
</mfrac> |
||||
|
</mrow> |
||||
|
</mrow> |
||||
|
<mrow> |
||||
|
<mi>1</mi> |
||||
|
<mo>-</mo> |
||||
|
<mrow> |
||||
|
<mfrac> |
||||
|
<mrow><mi>1</mi></mrow> |
||||
|
<mrow> |
||||
|
<msup> |
||||
|
<mi>e</mi> |
||||
|
<mi>50</mi> |
||||
|
</msup> |
||||
|
</mrow> |
||||
|
</mfrac> |
||||
|
</mrow> |
||||
|
</mrow> |
||||
|
</mfrac> |
||||
|
</mrow> |
||||
|
<mo>)</mo> |
||||
|
</mrow> |
||||
|
<mo>-</mo> |
||||
|
<mi>0.04</mi> |
||||
|
<mo>×</mo> |
||||
|
<mrow> |
||||
|
<mo>(</mo> |
||||
|
<mi>1</mi> |
||||
|
<mo>-</mo> |
||||
|
<mfrac> |
||||
|
<mrow> |
||||
|
<mi>S</mi> |
||||
|
<mo>-</mo> |
||||
|
<mi>3</mi> |
||||
|
</mrow> |
||||
|
<mi>27</mi> |
||||
|
</mfrac> |
||||
|
<mo>)</mo> |
||||
|
</mrow> |
||||
|
</mrow> |
||||
|
`; |
||||
|
</script> |
@ -0,0 +1,4 @@ |
|||||
|
<template> |
||||
|
<div class="py-10">路由参数: {{ $route.params }}</div> |
||||
|
</template> |
||||
|
<script setup lang="ts"></script> |
@ -0,0 +1,12 @@ |
|||||
|
<template> |
||||
|
<div class="row justify-center py-10"> |
||||
|
<q-btn |
||||
|
label="在标签中打开非菜单路由" |
||||
|
:to="{ |
||||
|
name: 'route.testcase.noMenuRoute', |
||||
|
params: { id: 'xxx' }, |
||||
|
}" |
||||
|
></q-btn> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script setup lang="ts"></script> |
@ -1,44 +1,406 @@ |
|||||
<template> |
<template> |
||||
|
<div style="height: 100%"> |
||||
<w-grid |
<w-grid |
||||
ref="gridRef" |
:title="$t('lcdp.scheduler.task.grid.title')" |
||||
:height="300" |
:config-button="true" |
||||
:title="$t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.title')" |
|
||||
selection="multiple" |
selection="multiple" |
||||
:full-screen-button="false" |
:checkbox-selection="true" |
||||
|
:query-form-cols-num="12" |
||||
|
:query-form-fields="[ |
||||
|
{ colSpan: 4, name: 'name', label: $t('name'), type: 'text' }, |
||||
|
{ |
||||
|
colSpan: 4, |
||||
|
name: 'executor', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.executor'), |
||||
|
type: 'select', |
||||
|
clearable: true, |
||||
|
queryOperator: 'equals', |
||||
|
options: executorOptionsRef, |
||||
|
}, |
||||
|
{ |
||||
|
colSpan: 2, |
||||
|
name: 'status', |
||||
|
label: $t('status'), |
||||
|
type: 'select', |
||||
|
clearable: true, |
||||
|
queryOperator: 'equals', |
||||
|
options: Options.enum(Enums.TaskStatus), |
||||
|
}, |
||||
|
]" |
||||
|
:data-url="Environment.apiContextPath('/api/scheduler/manager/task')" |
||||
|
:pageable="false" |
||||
:toolbar-configure="{ noIcon: false }" |
:toolbar-configure="{ noIcon: false }" |
||||
:toolbar-actions="['refresh']" |
:toolbar-actions="[ |
||||
:auto-fetch-data="true" |
'query', |
||||
:pageable="true" |
'refresh', |
||||
:fetch-data-url="Environment.apiContextPath('/api/scheduler/manager/executorRegistry')" |
'separator', |
||||
|
'add', |
||||
|
'edit', |
||||
|
'remove', |
||||
|
'separator', |
||||
|
{ |
||||
|
name: 'execute', |
||||
|
label: $t('lcdp.scheduler.task.grid.toolbar.execute'), |
||||
|
icon: 'bi-caret-right-fill', |
||||
|
enableIf: (selecteds) => { |
||||
|
return selecteds && selecteds.length > 0; |
||||
|
}, |
||||
|
click: () => {}, |
||||
|
}, |
||||
|
{ |
||||
|
name: 'schedule', |
||||
|
label: $t('lcdp.scheduler.task.grid.toolbar.schedule'), |
||||
|
icon: 'bi-cloud-arrow-up', |
||||
|
enableIf: (selecteds) => { |
||||
|
return selecteds && selecteds.length > 0; |
||||
|
}, |
||||
|
click: () => {}, |
||||
|
}, |
||||
|
{ |
||||
|
name: 'log', |
||||
|
label: $t('lcdp.scheduler.task.grid.toolbar.log'), |
||||
|
icon: 'bi-receipt', |
||||
|
enableIf: (selecteds) => { |
||||
|
return selecteds && selecteds.length > 0; |
||||
|
}, |
||||
|
click: () => {}, |
||||
|
}, |
||||
|
'separator', |
||||
|
'view', |
||||
|
'separator', |
||||
|
'export', |
||||
|
]" |
||||
:columns="[ |
:columns="[ |
||||
{ |
{ |
||||
width: 150, |
width: 80, |
||||
name: 'online', |
name: 'status', |
||||
label: $t('status'), |
label: $t('status'), |
||||
|
align: 'center', |
||||
format: (value) => { |
format: (value) => { |
||||
return { |
return { |
||||
componentType: 'w-enums-tag', |
componentType: 'QChip', |
||||
|
attrs: { color: value == 'RUNNING' ? 'green' : 'gray', label: Formater.enum(Enums.TaskStatus)(value), dense: true }, |
||||
|
}; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
width: 90, |
||||
|
name: 'type', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type'), |
||||
|
format: Formater.enum(Enums.TaskType), |
||||
|
}, |
||||
|
{ width: 150, name: 'name', label: $t('name') }, |
||||
|
{ |
||||
|
width: 100, |
||||
|
name: 'scheduleType', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.scheduleType'), |
||||
|
format: (value, row) => { |
||||
|
console.log(row); |
||||
|
return Formater.enum(Enums.ScheduleType)(value); |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
width: 140, |
||||
|
name: 'triggerLastTime', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.triggerLastTime'), |
||||
|
}, |
||||
|
{ width: 140, name: 'triggerNextTime', label: $t('lcdp.scheduler.task.grid.entity.triggerNextTime') }, |
||||
|
{ |
||||
|
width: 400, |
||||
|
name: 'executorName', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.executorName'), |
||||
|
format: (value, row) => { |
||||
|
return { |
||||
|
componentType: 'q-btn', |
||||
attrs: { |
attrs: { |
||||
value: value, |
flat: true, |
||||
dense: true, |
rounded: true, |
||||
items: [ |
noCaps: true, |
||||
{ value: true, color: 'green', label: $t('online') }, |
label: row.executorApplicationName + ':' + row.executorName, |
||||
{ value: false, color: 'grey', label: $t('offline') }, |
color: 'blue', |
||||
], |
onClick: () => { |
||||
|
executorRegistryDialogRef.open(row); |
||||
|
}, |
||||
}, |
}, |
||||
}; |
}; |
||||
}, |
}, |
||||
}, |
}, |
||||
{ width: 150, name: 'applicationName', label: $t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.entity.applicationName') }, |
{ width: 80, name: 'author', label: $t('lcdp.scheduler.task.grid.entity.author') }, |
||||
{ width: 100, name: 'name', label: $t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.entity.name') }, |
{ width: 200, name: 'alarmEmail', label: $t('lcdp.scheduler.task.grid.entity.alarmEmail') }, |
||||
{ width: 150, name: 'url', label: $t('url') }, |
{ |
||||
{ width: 100, name: 'registDate', label: t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.entity.registDate') }, |
width: 100, |
||||
|
name: 'routeStrategy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.routeStrategy'), |
||||
|
format: (value) => { |
||||
|
return Formater.enum(Enums.RouteStrategy)(value); |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
width: 100, |
||||
|
name: 'expirationPolicy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.expirationPolicy'), |
||||
|
format: (value) => { |
||||
|
return Formater.enum(Enums.ExpirationPolicy)(value); |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
width: 100, |
||||
|
name: 'blockStrategy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.blockStrategy'), |
||||
|
format: (value) => { |
||||
|
return Formater.enum(Enums.BlockStrategy)(value); |
||||
|
}, |
||||
|
}, |
||||
|
{ width: 80, name: 'timeout', label: $t('lcdp.scheduler.task.grid.entity.timeout') }, |
||||
|
{ width: 90, name: 'failRetryCount', label: $t('lcdp.scheduler.task.grid.entity.failRetryCount') }, |
||||
]" |
]" |
||||
|
:editor="{ |
||||
|
dialog: { |
||||
|
width: '800px', |
||||
|
}, |
||||
|
form: { |
||||
|
colsNum: 2, |
||||
|
fields: [ |
||||
|
{ |
||||
|
name: 'type', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type'), |
||||
|
required: true, |
||||
|
type: 'select', |
||||
|
options: Options.enum(Enums.TaskType), |
||||
|
}, |
||||
|
{ |
||||
|
name: 'executor', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.executor'), |
||||
|
required: true, |
||||
|
type: 'select', |
||||
|
clearable: true, |
||||
|
options: executorOptionsRef, |
||||
|
}, |
||||
|
{ colsFirst: true, name: 'name', label: $t('name'), type: 'text', required: true }, |
||||
|
{ name: 'description', label: $t('description'), type: 'text' }, |
||||
|
{ name: 'author', label: $t('lcdp.scheduler.task.grid.entity.author'), type: 'text' }, |
||||
|
{ name: 'alarmEmail', label: $t('lcdp.scheduler.task.grid.entity.alarmEmail'), type: 'text' }, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
name: 'scheduleType', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.scheduleType'), |
||||
|
required: true, |
||||
|
type: 'select', |
||||
|
options: Options.enum(Enums.ScheduleType), |
||||
|
defaultValue: 'FIX_RATE', |
||||
|
}, |
||||
|
{ |
||||
|
name: 'scheduleCron', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.scheduleCron'), |
||||
|
type: 'text', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('scheduleType') === 'CRON'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
name: 'scheduleFixRate', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.scheduleFixRate'), |
||||
|
type: 'number', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('scheduleType') === 'FIX_RATE'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
name: 'scheduleFixDelay', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.scheduleFixDelay'), |
||||
|
type: 'number', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('scheduleType') === 'FIX_DELAY'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'bean', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.bean'), |
||||
|
type: 'text', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'BEAN'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'groovy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.groovy'), |
||||
|
type: 'code-mirror', |
||||
|
rows: 8, |
||||
|
lang: 'groovy', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'GROOVY'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'shell', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.shell'), |
||||
|
type: 'code-mirror', |
||||
|
rows: 8, |
||||
|
lang: 'shell', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'SHELL'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'python', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.python'), |
||||
|
type: 'code-mirror', |
||||
|
rows: 8, |
||||
|
lang: 'python', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'PYTHON'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'php', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.php'), |
||||
|
type: 'code-mirror', |
||||
|
rows: 8, |
||||
|
lang: 'php', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'PHP'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'nodejs', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.nodejs'), |
||||
|
type: 'code-mirror', |
||||
|
rows: 8, |
||||
|
lang: 'nodejs', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'NODEJS'; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
colsFirst: true, |
||||
|
colSpan: 2, |
||||
|
name: 'powershell', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.type.powershell'), |
||||
|
type: 'code-mirror', |
||||
|
rows: 8, |
||||
|
lang: 'powershell', |
||||
|
showIf: (arg) => { |
||||
|
return arg.form.getFieldValue('type') === 'POWERSHELL'; |
||||
|
}, |
||||
|
}, |
||||
|
{ colSpan: 2, name: 'parameter', label: $t('lcdp.scheduler.task.grid.entity.parameter'), type: 'textarea', rows: 5 }, |
||||
|
{ |
||||
|
name: 'routeStrategy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.routeStrategy'), |
||||
|
required: true, |
||||
|
type: 'select', |
||||
|
options: Options.enum(Enums.RouteStrategy), |
||||
|
defaultValue: 'FIRST', |
||||
|
}, |
||||
|
{ |
||||
|
name: 'expirationPolicy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.expirationPolicy'), |
||||
|
required: true, |
||||
|
type: 'select', |
||||
|
options: Options.enum(Enums.ExpirationPolicy), |
||||
|
}, |
||||
|
{ |
||||
|
name: 'blockStrategy', |
||||
|
label: $t('lcdp.scheduler.task.grid.entity.blockStrategy'), |
||||
|
required: true, |
||||
|
type: 'select', |
||||
|
options: Options.enum(Enums.BlockStrategy), |
||||
|
}, |
||||
|
{ colsFirst: true, name: 'timeout', label: $t('lcdp.scheduler.task.grid.entity.timeout.label'), type: 'number' }, |
||||
|
{ name: 'failRetryCount', label: $t('lcdp.scheduler.task.grid.entity.failRetryCount.label'), type: 'number' }, |
||||
|
], |
||||
|
}, |
||||
|
}" |
||||
|
:viewer="{ |
||||
|
panel: { |
||||
|
columnNum: 1, |
||||
|
fields: [ |
||||
|
{ name: 'id', label: $t('id') }, |
||||
|
{ name: 'parent', label: $t('parent') }, |
||||
|
{ name: 'type', label: $t('lcdp.scheduler.task.grid.entity.type') }, |
||||
|
|
||||
|
{ name: 'executor', label: $t('lcdp.scheduler.task.grid.entity.executorId') }, |
||||
|
{ name: 'executorName', label: $t('lcdp.scheduler.task.grid.entity.executorName') }, |
||||
|
|
||||
|
{ name: 'name', label: $t('name') }, |
||||
|
{ name: 'description', label: $t('description') }, |
||||
|
{ name: 'author', label: $t('lcdp.scheduler.task.grid.entity.author') }, |
||||
|
{ name: 'alarmEmail', label: $t('lcdp.scheduler.task.grid.entity.alarmEmail') }, |
||||
|
|
||||
|
{ name: 'scheduleType', label: $t('lcdp.scheduler.task.grid.entity.scheduleType') }, |
||||
|
{ name: 'scheduleConf', label: $t('lcdp.scheduler.task.grid.entity.scheduleConf') }, |
||||
|
|
||||
|
{ name: 'bean', label: $t('lcdp.scheduler.task.grid.entity.type.bean') }, |
||||
|
{ name: 'groovy', label: $t('lcdp.scheduler.task.grid.entity.type.groovy') }, |
||||
|
{ name: 'shell', label: $t('lcdp.scheduler.task.grid.entity.type.shell') }, |
||||
|
{ name: 'python', label: $t('lcdp.scheduler.task.grid.entity.type.python') }, |
||||
|
{ name: 'php', label: $t('lcdp.scheduler.task.grid.entity.type.php') }, |
||||
|
{ name: 'nodejs', label: $t('lcdp.scheduler.task.grid.entity.type.nodejs') }, |
||||
|
{ name: 'powershell', label: $t('lcdp.scheduler.task.grid.entity.type.powershell') }, |
||||
|
|
||||
|
{ name: 'parameter', label: $t('lcdp.scheduler.task.grid.entity.parameter') }, |
||||
|
{ name: 'routeStrategy', label: $t('lcdp.scheduler.task.grid.entity.routeStrategy') }, |
||||
|
{ name: 'expirationPolicy', label: $t('lcdp.scheduler.task.grid.entity.expirationPolicy') }, |
||||
|
{ name: 'blockStrategy', label: $t('lcdp.scheduler.task.grid.entity.blockStrategy') }, |
||||
|
{ name: 'timeout', label: $t('lcdp.scheduler.task.grid.entity.timeout') }, |
||||
|
{ name: 'failRetryCount', label: $t('lcdp.scheduler.task.grid.entity.failRetryCount') }, |
||||
|
|
||||
|
{ name: 'triggerStatus', label: $t('lcdp.scheduler.task.grid.entity.triggerStatus') }, |
||||
|
{ name: 'triggerLastTime', label: $t('lcdp.scheduler.task.grid.entity.triggerLastTime') }, |
||||
|
{ name: 'triggerNextTime', label: $t('lcdp.scheduler.task.grid.entity.triggerNextTime') }, |
||||
|
|
||||
|
{ name: 'dataComeFrom', label: $t('dataComeFrom') }, |
||||
|
{ name: 'creator', label: $t('creator') }, |
||||
|
{ name: 'createDate', label: $t('createDate') }, |
||||
|
{ name: 'lastModifier', label: $t('lastModifier') }, |
||||
|
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() }, |
||||
|
], |
||||
|
}, |
||||
|
}" |
||||
></w-grid> |
></w-grid> |
||||
|
</div> |
||||
</template> |
</template> |
||||
<script setup lang="ts"> |
<script setup lang="ts"> |
||||
import { Environment, $t } from '@/platform'; |
import { ref, inject } from 'vue'; |
||||
import { useI18n } from 'vue-i18n'; |
import { axios, Environment, EnumTools, Formater, Options } from '@/platform'; |
||||
const { t } = useI18n(); |
|
||||
console.log(t('menu.testcase.formElements', { name: 'xxx' }, '000')); |
const eventBus = inject('eventBus'); |
||||
|
|
||||
|
const Enums = await EnumTools.fetch([ |
||||
|
'io.sc.platform.scheduler.core.enums.RouteStrategy', |
||||
|
'io.sc.platform.scheduler.core.enums.ExpirationPolicy', |
||||
|
'io.sc.platform.scheduler.core.enums.BlockStrategy', |
||||
|
'io.sc.platform.scheduler.core.enums.TaskType', |
||||
|
'io.sc.platform.scheduler.core.enums.ScheduleType', |
||||
|
'io.sc.platform.scheduler.core.enums.TaskStatus', |
||||
|
]); |
||||
|
|
||||
|
const executorRegistryDialogRef = ref(); |
||||
|
const executorOptionsRef = ref([]); |
||||
|
|
||||
|
const reloadExecutor = () => { |
||||
|
axios.get(Environment.apiContextPath('/api/scheduler/manager/executor?pageable=false')).then((response) => { |
||||
|
executorOptionsRef.value.splice(0, executorOptionsRef.value.length); |
||||
|
const list = response?.data?.content; |
||||
|
if (list) { |
||||
|
for (const item of list) { |
||||
|
executorOptionsRef.value.push({ label: item.applicationName + ' : ' + item.name, value: item.id }); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
reloadExecutor(); |
||||
</script> |
</script> |
||||
|
@ -0,0 +1,53 @@ |
|||||
|
<template> |
||||
|
<div ref="divRef" class="border border-gray-200" style="height: 100%"></div> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
import { ref, onMounted } from 'vue'; |
||||
|
|
||||
|
import '@univerjs/design/lib/index.css'; |
||||
|
import '@univerjs/ui/lib/index.css'; |
||||
|
import '@univerjs/docs-ui/lib/index.css'; |
||||
|
import '@univerjs/sheets-ui/lib/index.css'; |
||||
|
import '@univerjs/sheets-formula/lib/index.css'; |
||||
|
|
||||
|
import { Univer, UniverInstanceType, LocaleType } from '@univerjs/core'; |
||||
|
import { defaultTheme } from '@univerjs/design'; |
||||
|
|
||||
|
import { UniverFormulaEnginePlugin } from '@univerjs/engine-formula'; |
||||
|
import { UniverRenderEnginePlugin } from '@univerjs/engine-render'; |
||||
|
|
||||
|
import { UniverUIPlugin } from '@univerjs/ui'; |
||||
|
|
||||
|
import { UniverDocsPlugin } from '@univerjs/docs'; |
||||
|
import { UniverDocsUIPlugin } from '@univerjs/docs-ui'; |
||||
|
|
||||
|
import { UniverSheetsPlugin } from '@univerjs/sheets'; |
||||
|
import { UniverSheetsFormulaPlugin } from '@univerjs/sheets-formula'; |
||||
|
import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; |
||||
|
|
||||
|
const divRef = ref(); |
||||
|
|
||||
|
onMounted(() => { |
||||
|
const univer = new Univer({ |
||||
|
locale: LocaleType.en_US, |
||||
|
theme: defaultTheme, |
||||
|
}); |
||||
|
|
||||
|
univer.registerPlugin(UniverRenderEnginePlugin); |
||||
|
univer.registerPlugin(UniverFormulaEnginePlugin); |
||||
|
univer.registerPlugin(UniverUIPlugin, { |
||||
|
container: divRef.value, |
||||
|
}); |
||||
|
|
||||
|
univer.registerPlugin(UniverDocsPlugin, { |
||||
|
hasScroll: false, |
||||
|
}); |
||||
|
univer.registerPlugin(UniverDocsUIPlugin); |
||||
|
|
||||
|
univer.registerPlugin(UniverSheetsPlugin); |
||||
|
univer.registerPlugin(UniverSheetsUIPlugin); |
||||
|
univer.registerPlugin(UniverSheetsFormulaPlugin); |
||||
|
|
||||
|
univer.createUnit(UniverInstanceType.UNIVER_DOC, {}); |
||||
|
}); |
||||
|
</script> |
@ -0,0 +1,23 @@ |
|||||
|
package io.sc.platform.core.bean; |
||||
|
|
||||
|
import io.sc.platform.core.Environment; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.boot.ApplicationArguments; |
||||
|
import org.springframework.boot.ApplicationRunner; |
||||
|
import org.springframework.boot.context.event.ApplicationReadyEvent; |
||||
|
import org.springframework.context.ApplicationContext; |
||||
|
import org.springframework.context.ApplicationListener; |
||||
|
import org.springframework.core.annotation.Order; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
@Order(Integer.MIN_VALUE + 100) |
||||
|
public class FirstApplicationInitializer implements ApplicationRunner { |
||||
|
@Autowired |
||||
|
private ApplicationContext applicationContext; |
||||
|
|
||||
|
@Override |
||||
|
public void run(ApplicationArguments args) throws Exception { |
||||
|
Environment.getInstance().setApplicationContext(applicationContext); |
||||
|
} |
||||
|
} |
@ -0,0 +1,16 @@ |
|||||
|
package io.sc.platform.core.util; |
||||
|
|
||||
|
import org.springframework.core.io.DefaultResourceLoader; |
||||
|
import org.springframework.core.io.Resource; |
||||
|
|
||||
|
import java.io.InputStream; |
||||
|
|
||||
|
public class InputStreamUtil { |
||||
|
public static InputStream getInputStream(String url) throws Exception { |
||||
|
Resource resource =new DefaultResourceLoader().getResource(url); |
||||
|
if(resource==null || !resource.exists()){ |
||||
|
throw new RuntimeException(url + " NOT exists"); |
||||
|
} |
||||
|
return resource.getInputStream(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
package io.sc.platform.core.util; |
||||
|
|
||||
|
import org.springframework.util.StringUtils; |
||||
|
|
||||
|
public class PathUtil { |
||||
|
public static String standardized(String path){ |
||||
|
if (path!=null) { |
||||
|
String _url = path.replace('\\','/'); |
||||
|
while (_url.endsWith("/")) { |
||||
|
_url = _url.substring(0, _url.length() - 1); |
||||
|
} |
||||
|
return _url; |
||||
|
} |
||||
|
return ""; |
||||
|
} |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
System.out.println(standardized("a/b/c/")); |
||||
|
System.out.println(standardized("a/b/c")); |
||||
|
System.out.println(standardized("/a/b/c/")); |
||||
|
System.out.println(standardized("/a/b/c")); |
||||
|
} |
||||
|
} |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 404 KiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 103 KiB |
After Width: | Height: | Size: 122 KiB |
After Width: | Height: | Size: 210 KiB |
After Width: | Height: | Size: 17 KiB |
@ -0,0 +1,102 @@ |
|||||
|
<template> |
||||
|
<div> |
||||
|
<q-toolbar class="q-gutter-md py-2"> |
||||
|
<q-select |
||||
|
v-model="valueReactive.datasource" |
||||
|
:label="$t('developer.backend.sql.datasource')" |
||||
|
outlined |
||||
|
dense |
||||
|
emit-value |
||||
|
map-options |
||||
|
:options="datasourceOptionsRef" |
||||
|
style="width: 200px" |
||||
|
@update:model-value=" |
||||
|
(value) => { |
||||
|
datasourceChanged(value); |
||||
|
} |
||||
|
" |
||||
|
></q-select> |
||||
|
<q-select |
||||
|
v-model="valueReactive.schema" |
||||
|
:label="$t('developer.backend.sql.schema')" |
||||
|
outlined |
||||
|
dense |
||||
|
emit-value |
||||
|
map-options |
||||
|
:options="schemaOptionsRef" |
||||
|
style="width: 200px" |
||||
|
@update:model-value=" |
||||
|
(value) => { |
||||
|
schemaChanged(valueReactive.datasource, value); |
||||
|
} |
||||
|
" |
||||
|
></q-select> |
||||
|
<q-space /> |
||||
|
<q-btn :label="$t('developer.backend.sql.action.execute')" no-caps outline icon="bi-lightning" /> |
||||
|
<q-btn :label="$t('developer.backend.sql.action.executeAll')" no-caps outline icon="bi-play" /> |
||||
|
<q-btn |
||||
|
:label="$t('developer.backend.sql.action.import')" |
||||
|
no-caps |
||||
|
outline |
||||
|
icon="bi-filetype-xlsx" |
||||
|
@click=" |
||||
|
() => { |
||||
|
importExcelDialogRef.open(); |
||||
|
} |
||||
|
" |
||||
|
/> |
||||
|
</q-toolbar> |
||||
|
<div class="px-3"> |
||||
|
<w-code-mirror label="SQL" :rows="10" lang="sql"></w-code-mirror> |
||||
|
</div> |
||||
|
<ImportExcel ref="importExcelDialogRef"></ImportExcel> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
import { ref, reactive, onMounted, onUpdated } from 'vue'; |
||||
|
import { useI18n } from 'vue-i18n'; |
||||
|
import { axios, Environment, DialogManager, Downloader } from 'platform-core'; |
||||
|
import ImportExcel from './import-excel/ImportExcel.vue'; |
||||
|
|
||||
|
const datasourceOptionsRef = ref([]); |
||||
|
const schemaOptionsRef = ref([]); |
||||
|
const importExcelDialogRef = ref(); |
||||
|
|
||||
|
const valueReactive = reactive({ |
||||
|
datasource: undefined, |
||||
|
schema: undefined, |
||||
|
sql: undefined, |
||||
|
}); |
||||
|
|
||||
|
const loadDatasource = () => { |
||||
|
axios.get(Environment.apiContextPath('/api/system/datasource?pageable=false&sortBy=name')).then((response) => { |
||||
|
const data = response?.data.content; |
||||
|
const datasourceOptions = []; |
||||
|
if (data && data.length > 0) { |
||||
|
for (let item of data) { |
||||
|
datasourceOptions.push({ label: item.name, value: item.name }); |
||||
|
} |
||||
|
} |
||||
|
datasourceOptionsRef.value = datasourceOptions; |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
const datasourceChanged = (datasource: string) => { |
||||
|
datasource = datasource || ''; |
||||
|
axios.get(Environment.apiContextPath('/api/jdbc/metadata/getSchemas?datasource=' + datasource)).then((response) => { |
||||
|
const data = response?.data; |
||||
|
const schemaOptions = []; |
||||
|
if (data && data.length > 0) { |
||||
|
for (let item of data) { |
||||
|
schemaOptions.push({ label: item.name, value: item.name }); |
||||
|
} |
||||
|
} |
||||
|
schemaOptionsRef.value = schemaOptions; |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
onMounted(() => { |
||||
|
loadDatasource(); |
||||
|
datasourceChanged(''); |
||||
|
}); |
||||
|
</script> |
@ -0,0 +1,93 @@ |
|||||
|
<template> |
||||
|
<w-dialog ref="dialogRef" width="1024px" :can-maximize="false" :title="$t('developer.backend.sql.import.dialog.title')"> |
||||
|
<q-stepper ref="stepper" v-model="step" animated flat> |
||||
|
<q-step :done="step > 1" :name="1" :title="$t('developer.backend.sql.import.dialog.step.upload')" icon="bi-caret-right"> |
||||
|
<StepUploadFile ref="stepStepUploadFileRef"></StepUploadFile> |
||||
|
</q-step> |
||||
|
|
||||
|
<q-step :done="step > 2" :name="2" :title="$t('developer.backend.sql.import.dialog.step.dataView')" icon="bi-link"> |
||||
|
<StepDataView ref="stepDataViewRef"></StepDataView> |
||||
|
</q-step> |
||||
|
|
||||
|
<q-step :done="step > 3" :name="3" :title="$t('developer.backend.sql.import.dialog.step.mapping')" icon="bi-database-up"> |
||||
|
<StepMapping ref="stepMappingRef"></StepMapping> |
||||
|
</q-step> |
||||
|
|
||||
|
<q-step :done="step > 4" :name="4" :title="$t('developer.backend.sql.import.dialog.step.import')" icon="bi-database-up"> |
||||
|
<StepImport ref="stepImportRef"></StepImport> |
||||
|
</q-step> |
||||
|
|
||||
|
<q-step :done="step > 5" :name="5" :title="$t('developer.backend.sql.import.dialog.step.result')" icon="bi-info-lg"> </q-step> |
||||
|
|
||||
|
<template #navigation> |
||||
|
<q-stepper-navigation class="row justify-end q-gutter-sm"> |
||||
|
<q-btn v-if="step > 1" :label="$t('previousStep')" color="primary" no-caps @click="previous" /> |
||||
|
<q-btn :label="step === 5 ? $t('finish') : $t('nextStep')" color="primary" no-caps @click="next" /> |
||||
|
</q-stepper-navigation> |
||||
|
</template> |
||||
|
</q-stepper> |
||||
|
</w-dialog> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
import { ref } from 'vue'; |
||||
|
import StepUploadFile from './StepUploadFile.vue'; |
||||
|
import StepDataView from './StepDataView.vue'; |
||||
|
import StepMapping from './StepMapping.vue'; |
||||
|
import StepImport from './StepImport.vue'; |
||||
|
import { nextTick } from 'vue'; |
||||
|
|
||||
|
let datasource = undefined; |
||||
|
let schema = undefined; |
||||
|
|
||||
|
const dialogRef = ref(); |
||||
|
const stepper = ref(); |
||||
|
const step = ref(1); |
||||
|
const stepStepUploadFileRef = ref(); |
||||
|
const stepDataViewRef = ref(); |
||||
|
const stepMappingRef = ref(); |
||||
|
const stepImportRef = ref(); |
||||
|
|
||||
|
const next = () => { |
||||
|
if (step.value === 1) { |
||||
|
stepStepUploadFileRef.value.done(datasource, schema, (data) => { |
||||
|
stepper.value.next(); |
||||
|
nextTick(() => { |
||||
|
stepDataViewRef.value.setData(data); |
||||
|
}); |
||||
|
}); |
||||
|
} else if (step.value === 2) { |
||||
|
stepDataViewRef.value.done((data) => { |
||||
|
stepper.value.next(); |
||||
|
nextTick(() => { |
||||
|
stepMappingRef.value.setData(data); |
||||
|
}); |
||||
|
}); |
||||
|
} else if (step.value === 3) { |
||||
|
stepMappingRef.value.done((data) => { |
||||
|
stepper.value.next(); |
||||
|
nextTick(() => { |
||||
|
stepImportRef.value.setData(data); |
||||
|
}); |
||||
|
}); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
const previous = () => { |
||||
|
stepper.value.previous(); |
||||
|
}; |
||||
|
|
||||
|
const open = (_datasource, _schema) => { |
||||
|
datasource = _datasource; |
||||
|
schema = _schema; |
||||
|
datasource = dialogRef.value.show(); |
||||
|
}; |
||||
|
|
||||
|
const close = () => { |
||||
|
dialogRef.value.hide(); |
||||
|
}; |
||||
|
|
||||
|
defineExpose({ |
||||
|
open, |
||||
|
close, |
||||
|
}); |
||||
|
</script> |
@ -0,0 +1,99 @@ |
|||||
|
<template> |
||||
|
<q-splitter :model-value="200" unit="px" style="height: 460px"> |
||||
|
<template #before> |
||||
|
<q-list class="pr-2"> |
||||
|
<q-item |
||||
|
v-for="sheet in sheetsRef" |
||||
|
:key="sheet.name" |
||||
|
v-ripple |
||||
|
clickable |
||||
|
:active="activeSheetRef === sheet.name" |
||||
|
active-class="bg-primary text-white" |
||||
|
@click=" |
||||
|
() => { |
||||
|
activeSheetRef = sheet.name; |
||||
|
sheetChanged(); |
||||
|
} |
||||
|
" |
||||
|
> |
||||
|
<q-item-section :title="sheet.name" class="truncate ...">{{ sheet.name }}</q-item-section> |
||||
|
</q-item> |
||||
|
</q-list> |
||||
|
</template> |
||||
|
<template #after> |
||||
|
<div class="pl-2" style="height: 100%"> |
||||
|
<q-table |
||||
|
v-model:pagination="paginationRef" |
||||
|
:columns="colsRef" |
||||
|
:rows="rowsRef" |
||||
|
flat |
||||
|
bordered |
||||
|
separator="cell" |
||||
|
virtual-scroll |
||||
|
:hide-bottom="true" |
||||
|
class="sticky-header-column-table" |
||||
|
table-header-class="bg-grey-3" |
||||
|
style="height: 450px" |
||||
|
> |
||||
|
</q-table> |
||||
|
</div> |
||||
|
</template> |
||||
|
</q-splitter> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
import { ref } from 'vue'; |
||||
|
|
||||
|
const dataRef = ref(); |
||||
|
const sheetsRef = ref([]); |
||||
|
const activeSheetRef = ref(''); |
||||
|
const paginationRef = ref({ |
||||
|
rowsPerPage: 0, |
||||
|
}); |
||||
|
const colsRef = ref([]); |
||||
|
const rowsRef = ref([]); |
||||
|
|
||||
|
const setData = (data) => { |
||||
|
dataRef.value = data; |
||||
|
sheetsRef.value = data.sheets; |
||||
|
activeSheetRef.value = sheetsRef.value[0].name; |
||||
|
sheetChanged(); |
||||
|
}; |
||||
|
|
||||
|
const sheetChanged = () => { |
||||
|
for (const sheet of sheetsRef.value) { |
||||
|
if (sheet.name === activeSheetRef.value) { |
||||
|
const table = sheet.table; |
||||
|
const body = table.body; |
||||
|
const table_rows = body.rows; |
||||
|
const table_cols = table_rows[0].cols; |
||||
|
|
||||
|
// 设置内容表头 |
||||
|
const cols = []; |
||||
|
for (const table_col of table_cols) { |
||||
|
cols.push({ name: table_col.name, field: table_col.name, label: table_col.name }); |
||||
|
} |
||||
|
colsRef.value = cols; |
||||
|
|
||||
|
// 设置内容表内容 |
||||
|
const rows = []; |
||||
|
for (const table_row of table_rows) { |
||||
|
const record = {}; |
||||
|
for (const col of table_row.cols) { |
||||
|
record[col.name] = col.value; |
||||
|
} |
||||
|
rows.push(record); |
||||
|
} |
||||
|
rowsRef.value = rows; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
const done = (_function) => { |
||||
|
_function(dataRef.value); |
||||
|
}; |
||||
|
|
||||
|
defineExpose({ |
||||
|
setData, |
||||
|
done, |
||||
|
}); |
||||
|
</script> |
@ -0,0 +1,28 @@ |
|||||
|
<template> |
||||
|
<div style="padding: 10px 50px"> |
||||
|
<div class="p-1">{{ $t('developer.backend.sql.import.dialog.step.import.progress') }} {{ messageRef }}</div> |
||||
|
<div> |
||||
|
<q-linear-progress size="20px" :value="percentageRef" color="primary" rounded> </q-linear-progress> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
import { ref } from 'vue'; |
||||
|
import { axios, Environment } from 'platform-core'; |
||||
|
|
||||
|
const dataRef = ref(); |
||||
|
const percentageRef = ref(0.1); |
||||
|
const messageRef = ref('正在导入......'); |
||||
|
|
||||
|
const setData = (data) => { |
||||
|
dataRef.value = data; |
||||
|
console.log(data); |
||||
|
}; |
||||
|
|
||||
|
const done = (_function) => {}; |
||||
|
|
||||
|
defineExpose({ |
||||
|
setData, |
||||
|
done, |
||||
|
}); |
||||
|
</script> |
@ -0,0 +1,156 @@ |
|||||
|
<template> |
||||
|
<q-splitter :model-value="200" unit="px" style="height: 460px"> |
||||
|
<template #before> |
||||
|
<q-list class="pr-2"> |
||||
|
<q-item |
||||
|
v-for="sheet in sheetsRef" |
||||
|
:key="sheet.name" |
||||
|
v-ripple |
||||
|
clickable |
||||
|
:active="activeSheetRef === sheet.name" |
||||
|
active-class="bg-primary text-white" |
||||
|
@click=" |
||||
|
() => { |
||||
|
activeSheetRef = sheet.name; |
||||
|
sheetChanged(); |
||||
|
} |
||||
|
" |
||||
|
> |
||||
|
<q-item-section :title="sheet.name" class="truncate ...">{{ sheet.name }}</q-item-section> |
||||
|
</q-item> |
||||
|
</q-list> |
||||
|
</template> |
||||
|
<template #after> |
||||
|
<div class="row items-end pl-2 q-gutter-md"> |
||||
|
<q-input |
||||
|
v-model="mappingModel[activeSheetRef].tableName" |
||||
|
:label="$t('developer.backend.sql.import.dialog.step.mapping.table')" |
||||
|
dense |
||||
|
outlined |
||||
|
style="width: 300px" |
||||
|
></q-input> |
||||
|
<q-input |
||||
|
v-model="mappingModel[activeSheetRef].fieldNameRowIndex" |
||||
|
:label="$t('developer.backend.sql.import.dialog.step.mapping.fieldNameRowIndex')" |
||||
|
dense |
||||
|
outlined |
||||
|
type="number" |
||||
|
style="width: 200px" |
||||
|
@update:model-value="sheetChanged" |
||||
|
></q-input> |
||||
|
</div> |
||||
|
<div class="pl-2 pt-1" style="height: 100%"> |
||||
|
<q-table |
||||
|
v-model:pagination="paginationRef" |
||||
|
:columns="colsRef" |
||||
|
:rows="mappingModel[activeSheetRef].fields" |
||||
|
flat |
||||
|
bordered |
||||
|
separator="cell" |
||||
|
virtual-scroll |
||||
|
:hide-bottom="true" |
||||
|
class="sticky-header-column-table" |
||||
|
table-header-class="bg-grey-3" |
||||
|
style="height: 400px" |
||||
|
> |
||||
|
<template #body-cell="props"> |
||||
|
<q-td v-if="props.col.name === 'fieldName'" :props="props" class="p-0"> |
||||
|
<q-input v-model="props.row[props.col.name]" dense outlined /> |
||||
|
</q-td> |
||||
|
<q-td v-else-if="props.col.name === 'javaType'" :props="props" class="p-0"> |
||||
|
<q-select |
||||
|
v-model="props.row[props.col.name]" |
||||
|
dense |
||||
|
outlined |
||||
|
emit-value |
||||
|
map-options |
||||
|
:options="[ |
||||
|
{ value: 'java.lang.String', label: '字符串' }, |
||||
|
{ value: 'java.lang.Integer', label: '整数' }, |
||||
|
{ value: 'java.lang.Double', label: '小数' }, |
||||
|
{ value: 'java.lang.Date', label: '日期' }, |
||||
|
]" |
||||
|
/> |
||||
|
</q-td> |
||||
|
<q-td v-else class="p-0">{{ props.row[props.col.name] }}</q-td> |
||||
|
</template> |
||||
|
</q-table> |
||||
|
</div> |
||||
|
</template> |
||||
|
</q-splitter> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
import { ref, reactive, toRaw } from 'vue'; |
||||
|
import { t } from 'platform-core'; |
||||
|
|
||||
|
const dataRef = ref(); |
||||
|
const sheetsRef = ref([]); |
||||
|
const activeSheetRef = ref('sheet'); |
||||
|
const mappingModel = reactive({ |
||||
|
sheet: { |
||||
|
tableName: '', |
||||
|
fieldNameRowIndex: 1, |
||||
|
fields: [], |
||||
|
}, |
||||
|
}); |
||||
|
const paginationRef = ref({ |
||||
|
rowsPerPage: 0, |
||||
|
}); |
||||
|
const colsRef = ref([ |
||||
|
{ name: 'no', field: 'no', align: 'left', label: t('developer.backend.sql.import.dialog.step.mapping.grid.entity.no') }, |
||||
|
{ name: 'fieldName', field: 'fieldName', align: 'left', label: t('developer.backend.sql.import.dialog.step.mapping.grid.entity.fieldName') }, |
||||
|
{ name: 'javaType', field: 'javaType', align: 'left', label: t('developer.backend.sql.import.dialog.step.mapping.grid.entity.javaType') }, |
||||
|
]); |
||||
|
const rowsRef = ref([]); |
||||
|
|
||||
|
const setData = (data) => { |
||||
|
console.log(data); |
||||
|
dataRef.value = data; |
||||
|
sheetsRef.value = data.sheets; |
||||
|
activeSheetRef.value = sheetsRef.value[0].name; |
||||
|
delete mappingModel['sheet']; |
||||
|
for (const sheet of sheetsRef.value) { |
||||
|
mappingModel[sheet.name] = { |
||||
|
tableName: '', |
||||
|
fieldNameRowIndex: 1, |
||||
|
fields: [], |
||||
|
}; |
||||
|
} |
||||
|
sheetChanged(); |
||||
|
}; |
||||
|
|
||||
|
const sheetChanged = () => { |
||||
|
for (const sheet of sheetsRef.value) { |
||||
|
if (sheet.name === activeSheetRef.value) { |
||||
|
const table = sheet.table; |
||||
|
const body = table.body; |
||||
|
const table_rows = body.rows; |
||||
|
const table_cols = table_rows[mappingModel[sheet.name].fieldNameRowIndex - 1].cols; |
||||
|
const records = []; |
||||
|
for (const col of table_cols) { |
||||
|
const record = {}; |
||||
|
record.no = col.name; |
||||
|
record.fieldName = col.value; |
||||
|
record.javaType = 'String'; |
||||
|
records.push(record); |
||||
|
} |
||||
|
mappingModel[sheet.name].fields = records; |
||||
|
rowsRef.value = records; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
const done = (_function) => { |
||||
|
_function({ |
||||
|
filePath: dataRef.value.filePath, |
||||
|
datasource: dataRef.value.datasource, |
||||
|
schema: dataRef.value.schema, |
||||
|
mapping: toRaw(mappingModel), |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
defineExpose({ |
||||
|
setData, |
||||
|
done, |
||||
|
}); |
||||
|
</script> |
@ -0,0 +1,51 @@ |
|||||
|
<template> |
||||
|
<q-file |
||||
|
ref="fileRef" |
||||
|
v-model="fileNameRef" |
||||
|
:label="$t('developer.backend.sql.import.dialog.step.upload.fileTip')" |
||||
|
dense |
||||
|
outlined |
||||
|
clearable |
||||
|
counter |
||||
|
accept=".xlsx,.csv" |
||||
|
style="width: 800px" |
||||
|
> |
||||
|
<template #prepend> |
||||
|
<q-icon name="cloud_upload" /> |
||||
|
</template> |
||||
|
</q-file> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
import { ref } from 'vue'; |
||||
|
import { axios, Environment } from 'platform-core'; |
||||
|
|
||||
|
const fileRef = ref(); |
||||
|
const fileNameRef = ref(); |
||||
|
|
||||
|
const done = (datasource, schema, _function) => { |
||||
|
axios |
||||
|
.post( |
||||
|
Environment.apiContextPath('/api/developer/sql/parseFile'), |
||||
|
{ |
||||
|
datasource: datasource, |
||||
|
schema: schema, |
||||
|
file: fileRef.value.nativeEl.files[0], |
||||
|
}, |
||||
|
{ |
||||
|
headers: { |
||||
|
'Content-Type': 'multipart/form-data', |
||||
|
}, |
||||
|
}, |
||||
|
) |
||||
|
.then((response) => { |
||||
|
const data = response.data; |
||||
|
data.datasource = datasource; |
||||
|
data.schema = schema; |
||||
|
_function(response.data); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
defineExpose({ |
||||
|
done, |
||||
|
}); |
||||
|
</script> |