@ -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 默认包版本 |
|||
**********************************************************************/ |
|||
subprojects { |
|||
// ext['activemq.version'] = |
|||
// ext['antlr2.version'] = |
|||
// ext['appengine-sdk.version'] = |
|||
// ext['artemis.version'] = |
|||
// ext['aspectj.version'] = |
|||
// ext['assertj.version'] = |
|||
// ext['atomikos.version'] = |
|||
// ext['awaitility.version'] = |
|||
// ext['bitronix.version'] = |
|||
// ext['build-helper-maven-plugin.version'] = |
|||
// ext['byte-buddy.version'] = |
|||
// ext['caffeine.version'] = |
|||
// ext['cassandra-driver.version'] = |
|||
// ext['classmate.version'] = |
|||
// ext['commons-codec.version'] = |
|||
// ext['commons-dbcp2.version'] = |
|||
// ext['commons-lang3.version'] = |
|||
// ext['commons-pool.version'] = |
|||
// ext['commons-pool2.version'] = |
|||
// ext['couchbase-client.version'] = |
|||
// ext['db2-jdbc.version'] = |
|||
// ext['dependency-management-plugin.version'] = |
|||
// ext['derby.version'] = |
|||
// ext['dropwizard-metrics.version'] = |
|||
// ext['ehcache.version'] = |
|||
// ext['ehcache3.version'] = |
|||
// ext['elasticsearch.version'] = |
|||
// ext['embedded-mongo.version'] = |
|||
// ext['flyway.version'] = |
|||
// ext['freemarker.version'] = |
|||
// ext['git-commit-id-plugin.version'] = |
|||
// ext['glassfish-el.version'] = |
|||
// ext['glassfish-jaxb.version'] = |
|||
// ext['groovy.version'] = |
|||
// ext['gson.version'] = |
|||
// ext['h2.version'] = |
|||
// ext['hamcrest.version'] = |
|||
// ext['hazelcast.version'] = |
|||
// ext['hazelcast-hibernate5.version'] = |
|||
// ext['hibernate.version'] = |
|||
// ext['hibernate-validator.version'] = |
|||
// ext['hikaricp.version'] = |
|||
// ext['hsqldb.version'] = |
|||
// ext['htmlunit.version'] = |
|||
// ext['httpasyncclient.version'] = |
|||
// ext['httpclient.version'] = |
|||
// ext['httpcore.version'] = |
|||
// ext['infinispan.version'] = |
|||
// ext['influxdb-java.version'] = |
|||
// ext['jackson-bom.version'] = |
|||
// ext['jakarta-activation.version'] = |
|||
// ext['jakarta-annotation.version'] = |
|||
// ext['jakarta-jms.version'] = |
|||
// ext['jakarta-json.version'] = |
|||
// ext['jakarta-json-bind.version'] = |
|||
// ext['jakarta-mail.version'] = |
|||
// ext['jakarta-persistence.version'] = |
|||
// ext['jakarta-servlet.version'] = |
|||
// ext['jakarta-servlet-jsp-jstl.version'] = |
|||
// ext['jakarta-transaction.version'] = |
|||
// ext['jakarta-validation.version'] = |
|||
// ext['jakarta-websocket.version'] = |
|||
// ext['jakarta-ws-rs.version'] = |
|||
// ext['jakarta-xml-bind.version'] = |
|||
// ext['jakarta-xml-soap.version'] = |
|||
// ext['jakarta-xml-ws.version'] = |
|||
// ext['janino.version'] = |
|||
// ext['javax-activation.version'] = |
|||
// ext['javax-annotation.version'] = |
|||
// ext['javax-cache.version'] = |
|||
// ext['javax-jaxb.version'] = |
|||
// ext['javax-jaxws.version'] = |
|||
// ext['javax-jms.version'] = |
|||
// ext['javax-json.version'] = |
|||
// ext['javax-jsonb.version'] = |
|||
// ext['javax-mail.version'] = |
|||
// ext['javax-money.version'] = |
|||
// ext['javax-persistence.version'] = |
|||
// ext['javax-transaction.version'] = |
|||
// ext['javax-validation.version'] = |
|||
// ext['javax-websocket.version'] = |
|||
// ext['jaxen.version'] = |
|||
// ext['jaybird.version'] = |
|||
// ext['jboss-logging.version'] = |
|||
// ext['jboss-transaction-spi.version'] = |
|||
// ext['jdom2.version'] = |
|||
// ext['jedis.version'] = |
|||
// ext['jersey.version'] = |
|||
// ext['jetty.version'] = |
|||
// ext['jetty-el.version'] = |
|||
// ext['jetty-jsp.version'] = |
|||
// ext['jetty-reactive-httpclient.version'] = |
|||
// ext['jmustache.version'] = |
|||
// ext['johnzon.version'] = |
|||
// ext['jolokia.version'] = |
|||
// ext['jooq.version'] = |
|||
// ext['json-path.version'] = |
|||
// ext['json-smart.version'] = |
|||
// ext['jsonassert.version'] = |
|||
// ext['jstl.version'] = |
|||
// ext['jtds.version'] = |
|||
// ext['junit.version'] = |
|||
// ext['junit-jupiter.version'] = |
|||
// ext['kafka.version'] = |
|||
// ext['kotlin.version'] = |
|||
// ext['kotlin-coroutines.version'] = |
|||
// ext['lettuce.version'] = |
|||
// ext['liquibase.version'] = |
|||
// ext['log4j2.version'] = |
|||
// ext['logback.version'] = |
|||
// ext['lombok.version'] = |
|||
// ext['mariadb.version'] = |
|||
// ext['maven-antrun-plugin.version'] = |
|||
// ext['maven-assembly-plugin.version'] = |
|||
// ext['maven-clean-plugin.version'] = |
|||
// ext['maven-compiler-plugin.version'] = |
|||
// ext['maven-dependency-plugin.version'] = |
|||
// ext['maven-deploy-plugin.version'] = |
|||
// ext['maven-enforcer-plugin.version'] = |
|||
// ext['maven-failsafe-plugin.version'] = |
|||
// ext['maven-help-plugin.version'] = |
|||
// ext['maven-install-plugin.version'] = |
|||
// ext['maven-invoker-plugin.version'] = |
|||
// ext['maven-jar-plugin.version'] = |
|||
// ext['maven-javadoc-plugin.version'] = |
|||
// ext['maven-resources-plugin.version'] = |
|||
// ext['maven-shade-plugin.version'] = |
|||
// ext['maven-source-plugin.version'] = |
|||
// ext['maven-surefire-plugin.version'] = |
|||
// ext['maven-war-plugin.version'] = |
|||
// ext['micrometer.version'] = |
|||
// ext['mimepull.version'] = |
|||
// ext['mockito.version'] = |
|||
// ext['mongodb.version'] = |
|||
// ext['mssql-jdbc.version'] = |
|||
// ext['mysql.version'] = |
|||
// ext['nekohtml.version'] = |
|||
// ext['neo4j-java-driver.version'] = |
|||
// ext['netty.version'] = |
|||
// ext['netty-tcnative.version'] = |
|||
// ext['nimbus-jose-jwt.version'] = |
|||
// ext['oauth2-oidc-sdk.version'] = |
|||
// ext['ojdbc.version'] = |
|||
// ext['okhttp3.version'] = |
|||
// ext['oracle-database.version'] ='12.2.0.1' |
|||
// ext['pooled-jms.version'] = |
|||
// ext['postgresql.version'] = |
|||
// ext['prometheus-pushgateway.version'] = |
|||
// ext['quartz.version'] = |
|||
// ext['querydsl.version'] = |
|||
// ext['r2dbc-bom.version'] = |
|||
// ext['rabbit-amqp-client.version'] = |
|||
// ext['reactive-streams.version'] = |
|||
// ext['reactor-bom.version'] = |
|||
// ext['rest-assured.version'] = |
|||
// ext['rsocket.version'] = |
|||
// ext['rxjava.version'] = |
|||
// ext['rxjava-adapter.version'] = |
|||
// ext['rxjava2.version'] = |
|||
// ext['saaj-impl.version'] = |
|||
// ext['selenium.version'] = |
|||
// ext['selenium-htmlunit.version'] = |
|||
// ext['sendgrid.version'] = |
|||
// ext['servlet-api.version'] = |
|||
// ext['slf4j.version'] = |
|||
// ext['snakeyaml.version'] = |
|||
// ext['solr.version'] = |
|||
// ext['spring-amqp.version'] = |
|||
// ext['spring-batch.version'] = |
|||
// ext['spring-data-bom.version'] = |
|||
// ext['spring-framework.version'] = |
|||
// ext['spring-hateoas.version'] = |
|||
// ext['spring-integration.version'] = |
|||
// ext['spring-kafka.version'] = |
|||
// ext['spring-ldap.version'] = |
|||
// ext['spring-restdocs.version'] = |
|||
// ext['spring-retry.version'] = |
|||
// ext['spring-security.version'] = |
|||
// ext['spring-session-bom.version'] = |
|||
// ext['spring-ws.version'] = |
|||
// ext['sqlite-jdbc.version'] = |
|||
// ext['sun-mail.version'] = |
|||
// ext['thymeleaf.version'] = |
|||
// ext['thymeleaf-extras-data-attribute.version'] = |
|||
// ext['thymeleaf-extras-java8time.version'] = |
|||
// ext['thymeleaf-extras-springsecurity.version'] = |
|||
// ext['thymeleaf-layout-dialect.version'] = |
|||
// ext['tomcat.version'] = |
|||
// ext['unboundid-ldapsdk.version'] = |
|||
// ext['undertow.version'] = |
|||
// ext['versions-maven-plugin.version'] = |
|||
// ext['webjars-hal-browser.version'] = |
|||
// ext['webjars-locator-core.version'] = |
|||
// ext['wsdl4j.version'] = |
|||
// ext['xml-maven-plugin.version'] = |
|||
// ext['xmlunit2.version'] = |
|||
} |
|||
// ext['groovy.version'] ='3.0.17' |
|||
// ext['activemq.version'] = |
|||
// ext['antlr2.version'] = |
|||
// ext['appengine-sdk.version'] = |
|||
// ext['artemis.version'] = |
|||
// ext['aspectj.version'] = |
|||
// ext['assertj.version'] = |
|||
// ext['atomikos.version'] = |
|||
// ext['awaitility.version'] = |
|||
// ext['bitronix.version'] = |
|||
// ext['build-helper-maven-plugin.version'] = |
|||
// ext['byte-buddy.version'] = |
|||
// ext['caffeine.version'] = |
|||
// ext['cassandra-driver.version'] = |
|||
// ext['classmate.version'] = |
|||
// ext['commons-codec.version'] = |
|||
// ext['commons-dbcp2.version'] = |
|||
// ext['commons-lang3.version'] = |
|||
// ext['commons-pool.version'] = |
|||
// ext['commons-pool2.version'] = |
|||
// ext['couchbase-client.version'] = |
|||
// ext['db2-jdbc.version'] = |
|||
// ext['dependency-management-plugin.version'] = |
|||
// ext['derby.version'] = |
|||
// ext['dropwizard-metrics.version'] = |
|||
// ext['ehcache.version'] = |
|||
// ext['ehcache3.version'] = |
|||
// ext['elasticsearch.version'] = |
|||
// ext['embedded-mongo.version'] = |
|||
// ext['flyway.version'] = |
|||
// ext['freemarker.version'] = |
|||
// ext['git-commit-id-plugin.version'] = |
|||
// ext['glassfish-el.version'] = |
|||
// ext['glassfish-jaxb.version'] = |
|||
// ext['groovy.version'] = |
|||
// ext['gson.version'] = |
|||
// ext['h2.version'] = |
|||
// ext['hamcrest.version'] = |
|||
// ext['hazelcast.version'] = |
|||
// ext['hazelcast-hibernate5.version'] = |
|||
// ext['hibernate.version'] = |
|||
// ext['hibernate-validator.version'] = |
|||
// ext['hikaricp.version'] = |
|||
// ext['hsqldb.version'] = |
|||
// ext['htmlunit.version'] = |
|||
// ext['httpasyncclient.version'] = |
|||
// ext['httpclient.version'] = |
|||
// ext['httpcore.version'] = |
|||
// ext['infinispan.version'] = |
|||
// ext['influxdb-java.version'] = |
|||
// ext['jackson-bom.version'] = |
|||
// ext['jakarta-activation.version'] = |
|||
// ext['jakarta-annotation.version'] = |
|||
// ext['jakarta-jms.version'] = |
|||
// ext['jakarta-json.version'] = |
|||
// ext['jakarta-json-bind.version'] = |
|||
// ext['jakarta-mail.version'] = |
|||
// ext['jakarta-persistence.version'] = |
|||
// ext['jakarta-servlet.version'] = |
|||
// ext['jakarta-servlet-jsp-jstl.version'] = |
|||
// ext['jakarta-transaction.version'] = |
|||
// ext['jakarta-validation.version'] = |
|||
// ext['jakarta-websocket.version'] = |
|||
// ext['jakarta-ws-rs.version'] = |
|||
// ext['jakarta-xml-bind.version'] = |
|||
// ext['jakarta-xml-soap.version'] = |
|||
// ext['jakarta-xml-ws.version'] = |
|||
// ext['janino.version'] = |
|||
// ext['javax-activation.version'] = |
|||
// ext['javax-annotation.version'] = |
|||
// ext['javax-cache.version'] = |
|||
// ext['javax-jaxb.version'] = |
|||
// ext['javax-jaxws.version'] = |
|||
// ext['javax-jms.version'] = |
|||
// ext['javax-json.version'] = |
|||
// ext['javax-jsonb.version'] = |
|||
// ext['javax-mail.version'] = |
|||
// ext['javax-money.version'] = |
|||
// ext['javax-persistence.version'] = |
|||
// ext['javax-transaction.version'] = |
|||
// ext['javax-validation.version'] = |
|||
// ext['javax-websocket.version'] = |
|||
// ext['jaxen.version'] = |
|||
// ext['jaybird.version'] = |
|||
// ext['jboss-logging.version'] = |
|||
// ext['jboss-transaction-spi.version'] = |
|||
// ext['jdom2.version'] = |
|||
// ext['jedis.version'] = |
|||
// ext['jersey.version'] = |
|||
// ext['jetty.version'] = |
|||
// ext['jetty-el.version'] = |
|||
// ext['jetty-jsp.version'] = |
|||
// ext['jetty-reactive-httpclient.version'] = |
|||
// ext['jmustache.version'] = |
|||
// ext['johnzon.version'] = |
|||
// ext['jolokia.version'] = |
|||
// ext['jooq.version'] = |
|||
// ext['json-path.version'] = |
|||
// ext['json-smart.version'] = |
|||
// ext['jsonassert.version'] = |
|||
// ext['jstl.version'] = |
|||
// ext['jtds.version'] = |
|||
// ext['junit.version'] = |
|||
// ext['junit-jupiter.version'] = |
|||
// ext['kafka.version'] = |
|||
// ext['kotlin.version'] = |
|||
// ext['kotlin-coroutines.version'] = |
|||
// ext['lettuce.version'] = |
|||
// ext['liquibase.version'] = |
|||
// ext['log4j2.version'] = |
|||
// ext['logback.version'] = |
|||
// ext['lombok.version'] = |
|||
// ext['mariadb.version'] = |
|||
// ext['maven-antrun-plugin.version'] = |
|||
// ext['maven-assembly-plugin.version'] = |
|||
// ext['maven-clean-plugin.version'] = |
|||
// ext['maven-compiler-plugin.version'] = |
|||
// ext['maven-dependency-plugin.version'] = |
|||
// ext['maven-deploy-plugin.version'] = |
|||
// ext['maven-enforcer-plugin.version'] = |
|||
// ext['maven-failsafe-plugin.version'] = |
|||
// ext['maven-help-plugin.version'] = |
|||
// ext['maven-install-plugin.version'] = |
|||
// ext['maven-invoker-plugin.version'] = |
|||
// ext['maven-jar-plugin.version'] = |
|||
// ext['maven-javadoc-plugin.version'] = |
|||
// ext['maven-resources-plugin.version'] = |
|||
// ext['maven-shade-plugin.version'] = |
|||
// ext['maven-source-plugin.version'] = |
|||
// ext['maven-surefire-plugin.version'] = |
|||
// ext['maven-war-plugin.version'] = |
|||
// ext['micrometer.version'] = |
|||
// ext['mimepull.version'] = |
|||
// ext['mockito.version'] = |
|||
// ext['mongodb.version'] = |
|||
// ext['mssql-jdbc.version'] = |
|||
// ext['mysql.version'] = |
|||
// ext['nekohtml.version'] = |
|||
// ext['neo4j-java-driver.version'] = |
|||
// ext['netty.version'] = |
|||
// ext['netty-tcnative.version'] = |
|||
// ext['nimbus-jose-jwt.version'] = |
|||
// ext['oauth2-oidc-sdk.version'] = |
|||
// ext['ojdbc.version'] = |
|||
// ext['okhttp3.version'] = |
|||
// ext['oracle-database.version'] ='12.2.0.1' |
|||
// ext['pooled-jms.version'] = |
|||
// ext['postgresql.version'] = |
|||
// ext['prometheus-pushgateway.version'] = |
|||
// ext['quartz.version'] = |
|||
// ext['querydsl.version'] = |
|||
// ext['r2dbc-bom.version'] = |
|||
// ext['rabbit-amqp-client.version'] = |
|||
// ext['reactive-streams.version'] = |
|||
// ext['reactor-bom.version'] = |
|||
// ext['rest-assured.version'] = |
|||
// ext['rsocket.version'] = |
|||
// ext['rxjava.version'] = |
|||
// ext['rxjava-adapter.version'] = |
|||
// ext['rxjava2.version'] = |
|||
// ext['saaj-impl.version'] = |
|||
// ext['selenium.version'] = |
|||
// ext['selenium-htmlunit.version'] = |
|||
// ext['sendgrid.version'] = |
|||
// ext['servlet-api.version'] = |
|||
// ext['slf4j.version'] = |
|||
// ext['snakeyaml.version'] = |
|||
// ext['solr.version'] = |
|||
// ext['spring-amqp.version'] = |
|||
// ext['spring-batch.version'] = |
|||
// ext['spring-data-bom.version'] = |
|||
// ext['spring-framework.version'] = |
|||
// ext['spring-hateoas.version'] = |
|||
// ext['spring-integration.version'] = |
|||
// ext['spring-kafka.version'] = |
|||
// ext['spring-ldap.version'] = |
|||
// ext['spring-restdocs.version'] = |
|||
// ext['spring-retry.version'] = |
|||
// ext['spring-security.version'] = |
|||
// ext['spring-session-bom.version'] = |
|||
// ext['spring-ws.version'] = |
|||
// ext['sqlite-jdbc.version'] = |
|||
// ext['sun-mail.version'] = |
|||
// ext['thymeleaf.version'] = |
|||
// ext['thymeleaf-extras-data-attribute.version'] = |
|||
// ext['thymeleaf-extras-java8time.version'] = |
|||
// ext['thymeleaf-extras-springsecurity.version'] = |
|||
// ext['thymeleaf-layout-dialect.version'] = |
|||
// ext['tomcat.version'] = |
|||
// ext['unboundid-ldapsdk.version'] = |
|||
// ext['undertow.version'] = |
|||
// ext['versions-maven-plugin.version'] = |
|||
// ext['webjars-hal-browser.version'] = |
|||
// ext['webjars-locator-core.version'] = |
|||
// ext['wsdl4j.version'] = |
|||
// ext['xml-maven-plugin.version'] = |
|||
// ext['xmlunit2.version'] = |
|||
|
@ -1,4 +1,10 @@ |
|||
{ |
|||
"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.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.tag": "Tag", |
|||
"menu.testcase.formElements": "表单控件{name}", |
|||
"menu.testcase.openNoMenuRoute": "打开无关联菜单的路由示例", |
|||
"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> |
|||
<div style="height: 100%"> |
|||
<w-grid |
|||
: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> |
|||
<w-color-input-palette v-model="colorRef"></w-color-input-palette> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { ref, inject } 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(); |
|||
}); |
|||
import { ref } from 'vue'; |
|||
|
|||
reloadExecutor(); |
|||
const colorRef = ref('#EEEEEE'); |
|||
</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> |
|||
<w-grid |
|||
ref="gridRef" |
|||
:height="300" |
|||
:title="$t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.title')" |
|||
selection="multiple" |
|||
:full-screen-button="false" |
|||
:toolbar-configure="{ noIcon: false }" |
|||
:toolbar-actions="['refresh']" |
|||
:auto-fetch-data="true" |
|||
:pageable="true" |
|||
:fetch-data-url="Environment.apiContextPath('/api/scheduler/manager/executorRegistry')" |
|||
:columns="[ |
|||
{ |
|||
width: 150, |
|||
name: 'online', |
|||
label: $t('status'), |
|||
format: (value) => { |
|||
return { |
|||
componentType: 'w-enums-tag', |
|||
attrs: { |
|||
value: value, |
|||
dense: true, |
|||
items: [ |
|||
{ value: true, color: 'green', label: $t('online') }, |
|||
{ value: false, color: 'grey', label: $t('offline') }, |
|||
], |
|||
}, |
|||
}; |
|||
}, |
|||
}, |
|||
{ width: 150, name: 'applicationName', label: $t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.entity.applicationName') }, |
|||
{ width: 100, name: 'name', label: $t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.entity.name') }, |
|||
{ width: 150, name: 'url', label: $t('url') }, |
|||
{ width: 100, name: 'registDate', label: t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.entity.registDate') }, |
|||
]" |
|||
></w-grid> |
|||
<div style="height: 100%"> |
|||
<w-grid |
|||
: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: '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> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { Environment, $t } from '@/platform'; |
|||
import { useI18n } from 'vue-i18n'; |
|||
const { t } = useI18n(); |
|||
console.log(t('menu.testcase.formElements', { name: 'xxx' }, '000')); |
|||
import { ref, inject } from 'vue'; |
|||
import { axios, Environment, EnumTools, Formater, Options } from '@/platform'; |
|||
|
|||
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> |
|||
|
@ -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.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.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.tag": "Tag", |
|||
"menu.testcase.formElements": "表单控件{name}", |
|||
"menu.testcase.openNoMenuRoute": "打开无关联菜单的路由示例", |
|||
"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> |
|||
<w-grid |
|||
ref="gridRef" |
|||
:height="300" |
|||
:title="$t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.title')" |
|||
selection="multiple" |
|||
:full-screen-button="false" |
|||
:toolbar-configure="{ noIcon: false }" |
|||
:toolbar-actions="['refresh']" |
|||
:auto-fetch-data="true" |
|||
:pageable="true" |
|||
:fetch-data-url="Environment.apiContextPath('/api/scheduler/manager/executorRegistry')" |
|||
:columns="[ |
|||
{ |
|||
width: 150, |
|||
name: 'online', |
|||
label: $t('status'), |
|||
format: (value) => { |
|||
return { |
|||
componentType: 'w-enums-tag', |
|||
attrs: { |
|||
value: value, |
|||
dense: true, |
|||
items: [ |
|||
{ value: true, color: 'green', label: $t('online') }, |
|||
{ value: false, color: 'grey', label: $t('offline') }, |
|||
], |
|||
}, |
|||
}; |
|||
}, |
|||
}, |
|||
{ width: 150, name: 'applicationName', label: $t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.entity.applicationName') }, |
|||
{ width: 100, name: 'name', label: $t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.entity.name') }, |
|||
{ width: 150, name: 'url', label: $t('url') }, |
|||
{ width: 100, name: 'registDate', label: t('lcdp.scheduler.executor.selectOnlineExecutorDialog.grid.entity.registDate') }, |
|||
]" |
|||
></w-grid> |
|||
<div style="height: 100%"> |
|||
<w-grid |
|||
: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: '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> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { Environment, $t } from '@/platform'; |
|||
import { useI18n } from 'vue-i18n'; |
|||
const { t } = useI18n(); |
|||
console.log(t('menu.testcase.formElements', { name: 'xxx' }, '000')); |
|||
import { ref, inject } from 'vue'; |
|||
import { axios, Environment, EnumTools, Formater, Options } from '@/platform'; |
|||
|
|||
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> |
|||
|
@ -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> |