From 1175e15be36fc364efdabb84d08f2ccee5c5aada Mon Sep 17 00:00:00 2001 From: xlsea Date: Tue, 25 Jun 2024 17:28:51 +0800 Subject: [PATCH] =?UTF-8?q?refactor(sj=5Fmap=5Freduce):=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E6=89=93=E5=8C=85=E6=97=B6=E5=89=8D=E7=AB=AF=E7=9A=84?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + snail-job-server/.gitignore | 3 + snail-job-server/pom.xml | 6 + .../allocate/client/ClientLoadBalanceLRU.java | 15 +- .../snail-job-server-starter/pom.xml | 4 + .../src/main/resources/admin/aizuda.png | Bin 21962 -> 0 bytes .../src/main/resources/admin/logo.png | Bin 8394 -> 0 bytes .../src/main/resources/admin/ryp.png | Bin 53687 -> 0 bytes .../snail-job-server-ui/README.md | 33 ++++ snail-job-server/snail-job-server-ui/pom.xml | 144 ++++++++++++++++++ ...nailJobAdminServerUiAutoConfiguration.java | 21 +++ .../server/ui/controller/WebController.java | 20 +++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../src/main/resources/admin/aizuda.png | 0 .../admin/assets/DescriptionsItem-LhWljJnV.js | 0 .../resources/admin/assets/Grid-CRDcRyPk.js | 0 .../admin/assets/Progress-BRSG0yYs.js | 0 .../resources/admin/assets/_url_-rMAKsN2P.js | 0 .../resources/admin/assets/auth-C5d9H5Pz.js | 0 ...ue_type_script_setup_true_lang-CLSflgjt.js | 0 .../admin/assets/dashboard-dvIvAY5p.js | 0 ...ue_type_script_setup_true_lang-LaVXNa0e.js | 0 .../admin/assets/detail-drawer-6eZaB4pC.css | 0 .../admin/assets/detail-drawer-CeEIcqT0.js | 0 .../admin/assets/download-ip38Mwxm.js | 0 ...ue_type_script_setup_true_lang-CgitO2V0.js | 0 .../resources/admin/assets/group-frwXGSCG.js | 0 .../resources/admin/assets/index--naHqliG.js | 0 .../resources/admin/assets/index-2ay5PpNs.js | 0 .../resources/admin/assets/index-BJEHbRVM.js | 0 .../resources/admin/assets/index-BQrXbjze.js | 0 .../resources/admin/assets/index-BZQfv1PK.js | 0 .../resources/admin/assets/index-BideD3ow.css | 0 .../resources/admin/assets/index-BkhNq40I.js | 0 .../resources/admin/assets/index-BxR_p-ch.js | 0 .../resources/admin/assets/index-C6cEahYO.js | 0 .../resources/admin/assets/index-CUXEi-rX.js | 0 .../resources/admin/assets/index-CUZ-ZGC7.js | 0 .../resources/admin/assets/index-C_Yl51GR.css | 0 .../resources/admin/assets/index-CdrPBtCH.js | 0 .../resources/admin/assets/index-CgPArJSH.js | 0 .../resources/admin/assets/index-Cm2e7Lv-.js | 0 .../resources/admin/assets/index-CoKgXZDN.js | 0 .../resources/admin/assets/index-CrVQ8ETu.js | 0 .../resources/admin/assets/index-D2gKOuoY.js | 0 .../resources/admin/assets/index-D3rICic-.js | 0 .../resources/admin/assets/index-DGSV_nw-.js | 0 .../resources/admin/assets/index-DGuwZRaA.js | 0 .../resources/admin/assets/index-DHVgWJ-0.js | 0 .../resources/admin/assets/index-DWyLBvsm.js | 0 .../resources/admin/assets/index-DpGIIkG6.js | 0 .../resources/admin/assets/index-FxD56JQl.js | 0 .../resources/admin/assets/index-fyfyZBK4.js | 0 .../resources/admin/assets/index-jlqTxuuS.js | 0 .../resources/admin/assets/index-kEpqoCjH.css | 0 .../resources/admin/assets/index-luHl0WMJ.js | 0 .../resources/admin/assets/index-wQfBWnrg.js | 0 .../resources/admin/assets/job-8-wbHxv4.js | 0 .../resources/admin/assets/log-BdmE3tAM.css | 0 .../resources/admin/assets/log-CNFmopnc.js | 0 .../resources/admin/assets/notify-BmtrPduQ.js | 0 ...ue_type_script_setup_true_lang-Cls4SKv2.js | 0 ...ue_type_script_setup_true_lang-xYfW9G7N.js | 0 ...ue_type_script_setup_true_lang-Bk3YnuuX.js | 0 ...ue_type_script_setup_true_lang-DxzzLcAX.js | 0 ...ue_type_script_setup_true_lang-DuU56cot.js | 0 ...ue_type_script_setup_true_lang-jyvTK0pm.js | 0 .../resources/admin/assets/text-CH5rbrd1.js | 0 .../admin/assets/workflow-DX1Amij-.js | 0 ...ue_type_script_setup_true_lang-CDR_Hxib.js | 0 .../src/main/resources/admin/favicon.svg | 0 .../resources/admin/iconify/ant-design.json | 0 .../main/resources/admin/iconify/carbon.json | 0 .../src/main/resources/admin/iconify/cbi.json | 0 .../resources/admin/iconify/eos-icons.json | 0 .../main/resources/admin/iconify/fluent.json | 0 .../resources/admin/iconify/heroicons.json | 0 .../main/resources/admin/iconify/line-md.json | 0 .../main/resources/admin/iconify/lucide.json | 0 .../resources/admin/iconify/majesticons.json | 0 .../admin/iconify/material-symbols.json | 0 .../src/main/resources/admin/iconify/mdi.json | 0 .../main/resources/admin/iconify/octicon.json | 0 .../src/main/resources/admin/iconify/oui.json | 0 .../src/main/resources/admin/iconify/ph.json | 0 .../resources/admin/iconify/simple-icons.json | 0 .../resources/admin/iconify/streamline.json | 0 .../main/resources/admin/iconify/tabler.json | 0 .../main/resources/admin/iconify/typcn.json | 0 .../src/main/resources/admin/index.html | 0 .../src/main/resources/admin/logo.png | 0 .../src/main/resources/admin/ryp.png | 0 92 files changed, 243 insertions(+), 5 deletions(-) delete mode 100644 snail-job-server/snail-job-server-starter/src/main/resources/admin/aizuda.png delete mode 100644 snail-job-server/snail-job-server-starter/src/main/resources/admin/logo.png delete mode 100644 snail-job-server/snail-job-server-starter/src/main/resources/admin/ryp.png create mode 100644 snail-job-server/snail-job-server-ui/README.md create mode 100644 snail-job-server/snail-job-server-ui/pom.xml create mode 100644 snail-job-server/snail-job-server-ui/src/main/java/com/aizuda/snailjob/server/ui/config/SnailJobAdminServerUiAutoConfiguration.java create mode 100644 snail-job-server/snail-job-server-ui/src/main/java/com/aizuda/snailjob/server/ui/controller/WebController.java create mode 100644 snail-job-server/snail-job-server-ui/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 snail-job-server/snail-job-server-ui/src/main/resources/admin/aizuda.png rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/DescriptionsItem-LhWljJnV.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/Grid-CRDcRyPk.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/Progress-BRSG0yYs.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/_url_-rMAKsN2P.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/auth-C5d9H5Pz.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/code-mirror.vue_vue_type_script_setup_true_lang-CLSflgjt.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/dashboard-dvIvAY5p.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/datetime-range.vue_vue_type_script_setup_true_lang-LaVXNa0e.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/detail-drawer-6eZaB4pC.css (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/detail-drawer-CeEIcqT0.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/download-ip38Mwxm.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/exception-base.vue_vue_type_script_setup_true_lang-CgitO2V0.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/group-frwXGSCG.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index--naHqliG.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-2ay5PpNs.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-BJEHbRVM.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-BQrXbjze.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-BZQfv1PK.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-BideD3ow.css (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-BkhNq40I.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-BxR_p-ch.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-C6cEahYO.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-CUXEi-rX.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-CUZ-ZGC7.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-C_Yl51GR.css (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-CdrPBtCH.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-CgPArJSH.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-Cm2e7Lv-.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-CoKgXZDN.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-CrVQ8ETu.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-D2gKOuoY.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-D3rICic-.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-DGSV_nw-.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-DGuwZRaA.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-DHVgWJ-0.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-DWyLBvsm.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-DpGIIkG6.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-FxD56JQl.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-fyfyZBK4.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-jlqTxuuS.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-kEpqoCjH.css (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-luHl0WMJ.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/index-wQfBWnrg.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/job-8-wbHxv4.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/log-BdmE3tAM.css (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/log-CNFmopnc.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/notify-BmtrPduQ.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/route-key.vue_vue_type_script_setup_true_lang-Cls4SKv2.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/search-form.vue_vue_type_script_setup_true_lang-xYfW9G7N.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/select-group.vue_vue_type_script_setup_true_lang-Bk3YnuuX.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/select-scene.vue_vue_type_script_setup_true_lang-DxzzLcAX.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/status-switch.vue_vue_type_script_setup_true_lang-DuU56cot.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/task-batch-status.vue_vue_type_script_setup_true_lang-jyvTK0pm.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/text-CH5rbrd1.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/workflow-DX1Amij-.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/assets/workflow.vue_vue_type_script_setup_true_lang-CDR_Hxib.js (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/favicon.svg (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/ant-design.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/carbon.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/cbi.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/eos-icons.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/fluent.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/heroicons.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/line-md.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/lucide.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/majesticons.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/material-symbols.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/mdi.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/octicon.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/oui.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/ph.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/simple-icons.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/streamline.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/tabler.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/iconify/typcn.json (100%) rename snail-job-server/{snail-job-server-starter => snail-job-server-ui}/src/main/resources/admin/index.html (100%) create mode 100644 snail-job-server/snail-job-server-ui/src/main/resources/admin/logo.png create mode 100644 snail-job-server/snail-job-server-ui/src/main/resources/admin/ryp.png diff --git a/.gitignore b/.gitignore index 0f1422b0b..dd60221b7 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ target/ .flattened-pom.xml data/ +rebel.xml \ No newline at end of file diff --git a/snail-job-server/.gitignore b/snail-job-server/.gitignore index d4847f3cf..b973dbb3d 100644 --- a/snail-job-server/.gitignore +++ b/snail-job-server/.gitignore @@ -30,3 +30,6 @@ target/ # Maven ignore .flattened-pom.xml + +# Frontend +/snail-job-server-ui/src/main/frontend/ \ No newline at end of file diff --git a/snail-job-server/pom.xml b/snail-job-server/pom.xml index 0a61fe16b..e9a1213ec 100644 --- a/snail-job-server/pom.xml +++ b/snail-job-server/pom.xml @@ -20,6 +20,7 @@ snail-job-server-retry-task snail-job-server-job-task snail-job-server-starter + snail-job-server-ui @@ -53,6 +54,11 @@ snail-job-server-job-task ${revision} + + com.aizuda + snail-job-server-ui + ${revision} + com.typesafe.akka akka-actor-typed_2.13 diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/allocate/client/ClientLoadBalanceLRU.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/allocate/client/ClientLoadBalanceLRU.java index 99025c071..9c8014360 100644 --- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/allocate/client/ClientLoadBalanceLRU.java +++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/allocate/client/ClientLoadBalanceLRU.java @@ -1,12 +1,11 @@ package com.aizuda.snailjob.server.common.allocate.client; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; import com.aizuda.snailjob.server.common.ClientLoadBalance; import com.aizuda.snailjob.server.common.allocate.client.ClientLoadBalanceManager.AllocationAlgorithmEnum; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Objects; -import java.util.TreeSet; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; /** @@ -43,9 +42,15 @@ public class ClientLoadBalanceLRU implements ClientLoadBalance { } // 删除已经下线的节点 + List delKeys = new ArrayList<>(); for (String address : lruItem.keySet()) { if (!clientAllAddressSet.contains(address)) { - lruItem.remove(address); + delKeys.add(address); + } + } + if (CollectionUtil.isNotEmpty(delKeys)) { + for (String delKey : delKeys) { + lruItem.remove(delKey); } } diff --git a/snail-job-server/snail-job-server-starter/pom.xml b/snail-job-server/snail-job-server-starter/pom.xml index 8687c4c1a..7736583a6 100644 --- a/snail-job-server/snail-job-server-starter/pom.xml +++ b/snail-job-server/snail-job-server-starter/pom.xml @@ -50,6 +50,10 @@ com.aizuda snail-job-server-common + + com.aizuda + snail-job-server-ui + org.springframework.boot spring-boot-starter-web diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/aizuda.png b/snail-job-server/snail-job-server-starter/src/main/resources/admin/aizuda.png deleted file mode 100644 index bfbfc0da90d17fa6ecf427bcafbb063d5d2ef728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21962 zcmb@tWmJ^k7dA{YLo<~04BaRoNW)M=m(r~WNOwpx2nfO;L$?ed(p}OZ-3roO4kg{b z{Ql4T{rU2InRV8hd!4h-z4t!%xvqWf7#%GYVgfn>3=9lnRhXh41_mbTahw9cd;Cp| zx#PsZc$KKCDF4#W;vhR@KS;%RXJ-+muHeZ33f9Qd)`AS}oZ{nuS!-UOc%(+b+dx>( zkL95BQIDFgFthuE_AkAv-vS*ceP05NRU^twlD+QV@!0M$SE*7oezY>|zWJ4*{L*Gg zjm~_k_42v!(XIdCqWDfu^X200_1|nx|D9l&o&J$5apCdzId(be8)nHoufDx3(JNH@ ze>51XIyvqk4Vk9txazYb#hg-`c1?nuYED=DZwY)Im)3&@-?m*P!J8A$oYO2>OBxyr zzqN?|1m=H-A_*^>wg(bfbG45I`)YH}%Q}kor4%w${%4xFoX0*Zb2CHavdHKguJ3<8 zx!&!*GBo$r%1GVZoh%q%%{XiKo=63h{-4jn zfsx8y5E{b~=%IP~?f;mh$On-=M}|DRZWIh0+x%g8e>>HKeMN2T3?i5tloqHi!{1}ypSC6a_0L2tH&+Z|34 zea$5OPr3?{`enUOH;-fky*VFFA}X`*j!5sWHZNDM1GGs>K_Hyd;>$&$>wfJO(d*WP zhfS!ALr#cCKbj-tVv=4u>=pEXb}F!>AgVlq4~j~qAes-iAsHIM=lvW>uV-}ZzJOD{HAaqcJ1r6kb^#12ST169} zgBpoUCz$x{Qyrb2`wqV)EJ*d$^HKHgW+Y-eoX$g@a&==i;CJ4K|9^5hTp>C42+6~y z4R%@2Y0XB{)TIO0=J_OS>t9AJ=HM0*q3~Xdz{AEdK#VyBEH|6NV|8)Z^5I1A(FG$> z%iHBBkpzaSfq~3=br!aqu!9IE8TQ*huS%vM<5}ywb=g5KH}9t@1z+rBdFEu8>DziY z+nY3AYWyv^TELSMY}9_Hb!e&NGJwim*DsjdJ>09ODHf~b8qY4el*wUDnqBnNs%-t` z?UzpSJuj>J1DNmtyFW!fG48?P<6s>q=S?Ed3<=IO%_4SsqH^yF!iT14R;mcye0jYS z)DLZO2FnIl?{ax+>;MlOIgiVvJlTtaSc}<0BJ@XBxV3WE`67xr^Lji+i?#^nMGl;9 zE@z87NVON1p2chbJyX+iBs^DVe)s`$BaR5)DFRXsaZh_4j-q6vzM8ggcfV(X#%oN! ze<9Nk4aUog3Zw-vYIX61!Pk3oL_$$o-O`6;>*GK+H)RMIM*{ZoFXfKXt}Epa!lD-| zcT**mnd{HVXIrhDH;-qoVqb-?TWu1#oyu4pubyRO7QdKw)*4IWDQe9yS6U-areZsn zV;Hqq$C4K)z2%AZNT)Rt=pln|W=!Nv)p>>@1k{f#b@?FtJ;jUG>}-5EW}fL$GTd&n zQL=%6$WjqNu~ov z*Dz`Dq#c1r-|TV}Kp^K55a?9-@!&Wg-?L8loeXx{lX1rw35K6J-VGo6ou!_CC_ zS7Nx^XK*6hgo+%b>Hg(#--|Yx+ggU#_3YCS?dhdcn7Jd|^)K$Uo8)eSHoeM9ImQ?@ z{yl64tMH-Q1dOVTMimAcfWXux3o^ZW1ewH)y5-H(!dcZw8(E#)%Y~%NrM)$p?%+EU zX7N;;h9Cs4Bk}??Eu~byza!>?l(b2GF^@np$^0b%CET=Zjwgm7w=aNV^h#@9Ls^UB{P{{9h%MIf6wkb6J}?&UziN4EVYH9ysmrJ=lE_%aoG+8UIbgl>}2=CWfrI;|8c{?z85)O0!-BivuAD8A@P&@$j$V)3oaHY9%{*XL2+~93 z14`IF9#n<;4=Xr9FabS0!4z|%_>7IS9t_YPx`0*bhti7qK1`c+^*Ui*?zTp@+#V&E z;zD&iyR%bap8m$iU0fQ-c*2_pcsuDOQ3N-cS#U{M> znL2C+w^%&iO91x9y1d|ad5`tFZtvU0;D%oc0-2EgUQcGGFO_T>0znlgK!1{cBvT^Q zITNosrYsyI!LypdEZ&o%OO`q;D6qP@H2*7RzDwY<`2Dk;GjM1{ySt?-iYEUXB8oju z&~5SHu)7ngGlP11`6Zii{&84FHhP%_HO`2Gt{X49sZ}OaMJSbc*Np`vs=?%WAm#B% zp@_6g`L)<+%Ct^*d3k~qBnZ9Bder3emQh|KBw(Ds6^?A#S5!9lw~gLIkb$6_5g2aw z7|6EBhPCR2%`9eqB5B@4ahmi~Gyq2-M@%GEjRNiP^{XgAP;&+Aq=(Mr)m|#VQ-$4= zj0?N0?$v+ZQiGLlkWqY|VUx#Tp}}RBW7BtIP9gDBAjBjfQ>%-=g5wHEoV@lLEoOOZ z`Q;ZUhaQ^C#E^_&_EzXepdBXp4+%*&>y^TAZ%pf@MI5oYEJ=P7mBJ)6fO_~h?iYx2 znV^}k13uZICprlS?RK-z{UJ8dTd--%DD&A%k!-3m){8OqQx|MPkLuMKcM1b2fu0)7 z*;JVPr&|sA6e6PM044~{csTHNnqUBtk!zMSmeKPuB@%fmQ$a`fe38zNy`?C<*+sV7KDjgi@Wta-=#B`5zLFHj9~idLe` zZ-AsBWjD*%m(Z2W-c5 zb4r^vJJ7LTsc94+VU)SHbNacM0&guOfT}5p5LR`?3-u}l&cE?R2ah>!GKh&v;Hvfv zIqEF45wKXIFkq8-^kVr@(;620)=p%d}hMWH6L zpE@nqwtIjitsb5W8MXc)!i*|C8O=&60mNjH%=0eKOZN8@&((?rmI=C=t6DlrzZb$4 z6<2s>j)cU8P1GEM&36@GWcc3hXi7gny@)xjx0&i-ZENHl#0j&!|) z`HGS~S*_L&VlE|GX9-%i&CmjZiOtp!unZLvK6b0whl)VbH7#NwB!5-+rfIGzMHdI< zHhF2en=sBtX{^G+Mllk4{zjoqGJ>`&8HGXcIzNU|RhyNLoWiyq&c*L;6yeDctp~Nt|E>qc+VAKgT=FSe?-A;K0_$kJylSHaa47gz?$y3BC_>aNQczYNnb$LKB&zyY(4eq+U&o~7F`yo zx@J*}(=kRAWrmMwTsaLc;^kpa%J*{!hKZ!R31}v*5_xaeWpR(iQk(@T=>`XtKOYDc zFB9!rN;hB4#Pt92qPi%6^l8)hE2zl_O$yMd^T_+X(t$ex>@HbUwbN*JpQ;vY+OpwX zzIg+$wigR%b>KFF&m~7)^EvK0w!3{rl+}kwog-0SMpzl^&=(IxBg+NMa;x)3ZEzO@ z1p0L5M-lx2)*|}!^IIXtOYO-!bqb_Kh6Ozrp$lpX{IP!{XffA?3g;%Ch~MpU_n|I} zIyY9Jy5XE#TweaHVJ2g1rQO&$`w7p*L#2O+rGS#yFDC8Z5w_CGkxn~k63vbNvw}ApSoNTLbkRdI_g1My7Y5;ExCAMOO_45>?@5zXi0vbrO zRklqzYDR-#+nVZUX9as-5LGPCvUbpfRtq2R&{?uB;KQ6G6l%Tfv*3IraVx3Nbk@?j z^npbt;A~g8XfSt54Q3LB%8Tf={jeT|1IEUc!dP^Fp!3X@mZkZ#L^T424)Mj|5(xLt zho6Ohs-U3tE>~zl_b|6dN)!ozKU49=@wMMu2HhrouYF!F$f2RG{D;av@5PM~tZBxr z`ONzl`9PJ^WvpWcmeSV9*H&)U8a3GPWGX`EqA9I4ul&1PDTQ(KJ6U!RRcuxs&EhaB zb31u^*xTsMdsg2?_kQ(w2Jw^Yk)E=+)Q-C?OTY6{%ljZy2NJPqK=I7#*Ap8o#kH8U zw{XfGe=xXk{5svcjxPiC|;N7&TQgw0K7q6E_doqsYDLE&qw>{r3w^+wQP~ zbUF4i?UBo&ZHj6M`YQ|RcIIyHFb)e>iR(;+m$5~m^~Ogv_-a*|S~w36gdczFj{=N6 z+}mvGtw(1#Gf!aPX}Dg59G4WUA0>~=wCEDk!GR7Eva5i3!#z_aSQOxMU z*8Mo|HxUrGC5N>?dT1CNC63xVM@g&8f)WLLDxd3lS@Q{*AxH~Q2sbnTr_ z3X$Jja9P;joaom(WHk~AEG_eLsUj}j&#MvpAD?3ehj*WnzmdJBV7lzMo6@>F?4!|M z4tcm{s(ggy>D^}O2tHMNX9PQE7d&7gFJf-lGpLL;GuJ%ojr{Ut!0Uf45I~HFMeu=b zQbCB@&SuK{ea>BWcP zDEr>e;^4&)$!ClxuVTCg5{W<1Oj?4bxJsv??VobY&@W>^Cb`OIWcCV!AZ#pxsun<= z>a=yP?6$=ZRdEAy=FSO9WI1P=B*Vw2Vw^L!Q6B$F)CJO{{4Z}glYBeg3pGEq3~ts} zy7co}iu>=rZ?`*1O|_8lKdsG`CW6$HC$SgrLVG@`v~W3WhrFGctg-rFdp!_2@YhJx z`D+Gfk_V16c=vZBH#=}US62G^mr983N&dgvE`!Bum80zM2MV&n&0D`0IRD+S3uYPT zCnGM1TL7x9A1{HY^?vr07iF#4{%lCbigI0}tx8wjWYpm9QcIE=5ct$EIhfVaoGj9q z^3~iKD{9)j3Xn#lI=elBp=vkfiY@SRvEn;ggn!#Y=K?*}R(1F(FKYQTJhG|(z*n7H z1%{YRYFrdz%@)1u;k9^neWz}*uDVyhlOxFoG43XdV~=qBbj@_q+qWyLo*&(2o4?HM z#Kb-FJmlY6DNVFJ74+tBqa}K9x8wei#OgTSIm-Ed`){!UgE8c`ctys4IQ!pZk{&xM zD8?54a{U_xn7*NH%@9_(hf70ET71~>3gFO@M+!No`a*m=<2<|lO<};FNFw7wUa&OO zu1_!g>t%770?e{)zlIjlwkFx`DGWz~RI*-Axh!-Rms~TIeQlr71s3gj8>^O*O}Rdd zF5$-@>__6>(zgA5|0LfIU5b*UfjrZ*>oxtnjIg=|n>jn6EZ9-tCYjsz%nH)8a$XaP z-;I1&voyx(x*^AWx55+F?9i5zS4=4g(YKGOZWTfH)>GYQ%#PyC8w_r1?)$m-l`rN1 zG4_nqJLK0r@Ef70Jc3FYKSbppr08*`S|h}k;Be&3DZ*+vf6>0_5h_fPo)K%ph$tS*B}GN1-WRwEjqFgX-*?0P^mwPjv3G^@}HLO-xMR~0|gB6cV{1KkL5d_AFbIRE1PT}JYX-IRy!m{_%?fA@h zV4LgJ`h_?db~6}_$Rd4hoQtWq@M;n-I8sS50WbTSKDL-S;h0&L%F zm8M>6(7wSNVdh-YSDS!|`QNdtD*0TepBqAM>wCu>?0TY}5IB*fM-N7sA(zPDKat!P zi?VG!$|{hNG#z8;hwA}zYR$A>+lq*U%maLAx3gi5-IMd0GU0;I4<`Ck_+=AEHyL)1 z(XqgRswQL}Hg%YE!KYOfa53=whlyvtSW2tT>95spvbO@N$m-O?T=c=D65cBT z%`5f103gnUqy8u+qC$K~^}ijmu$8gg&64JDbIw-HVPkX>0X!NZ@04~5IeZA~4Q0d`k;ks8+u)!S}k6i_25V7dA$PJbwFabBn z+H>lx^6p~I3igc8)KLTwP;7qX>g3YiKFRp;!igDoh<%wFDZtGXk(It?2R8HGi=kv+hC(qUfs zPIZXsENzIRY*PfucAnmEyDi4zqa^?_;U(x3AL9WjW*Kfn1ozww9<*B%?8vHlnincj zc(<3q45W_{(kn`$n0uozHis!!daoOBGh|2ZfM_>$DTh3QTzGaJ8vKbKQ0p zeBCFQ6ZS8Cda72)u4mbudY{#I!*#_kuXEW49w&T>b47m~ScLgZ&4r>}B1Z4$9l!++ z2@8jKRQ`Of)PH{2zY+oXLt#5tB&G8bKAO99N?2RC(%CgSW#~XjK1KPDa;Nagh+M{9 z1>sclSMFOPyx+XgZYl|_LrycgSW3c`5OY6DmKn7#h6~5Pxty5m5A_JQ6=&0|rGwZ_IC3#wLmYvJDT3?DV23}g3j*B7nX%BFy> z%+^1W7)@cVGL%ib!+OmODx>hB-~#~}wMIa)SWUDeYFIU)n{(GMb|@5`H`KA9V5 z@yfwMj;D^&%>rkPYd^9<50*Rb8MPHVPJgZZ4XG_Dq0T*NWwxdne5VOg>}_EK>+yiu z_)xFYKNvhC(lJ4Urkc3x=+?h}f5X;B069<3ErT{2e~v4y?Dur_j3o~Ra>+Uq`( zvHWq>O7O`3aW64iGs@BVW;IC@stc5ci|{}W-j}Jvir0!9sFTfUjPU#J^kW`Vpj&Fm zO0g!FT-9amDkIPQDSk_a$YX9Nl2g;TbkZ-Ab*?Z_JS$gI8+xro=wJ^8(FUyw9-a}J z<32EdMDjow0gsawS|%$&%0T&kLKGkujzudYq?qkg279l zGo=ytSgij=BMGEWDyQl0WH2?JVNUFpGWL?l($e>>RLnq8IqG7#@i;QDVy5=t2NP^oA$8?><}7;uy{SV z``S`M!vDd4Wi2;Z8P6J_O%Ew_*g2`1C3$2fFxn+DM5{hpA0tdF`1Gx5qNYX-nLVvh z9p4zgXl zRXGtvbYwQ+ls7|^+wy7rVCwSwT29DG1oC%d{6;yvjxU#+%W_PJ?ju6yF5@x`246HI z`zLIuXwq>zz$vZDr5zn}u9dZsfkddC&>|3Hd8`w88C4V***=U<|DYhLT>5#@>|a8s zL`ZpLqCC8}sHYyGRN3@Ej)mnL9Mnvuu%RtrKlJu`BJ55LKemzcP2j?M8% z1IFC!Nb0alHdGQ)kDeS>kJJz>;g&{67S7c8x#+)5CnEO34HE%*MU*w{gDFU3O*s)= z1h_ig&TzKI-wfp3Pp#EBniiRY7l@N&n-Bk7W8f}Ploxc|{ys=T2k+hnS|C6nvXA&c zK|&lVbe$;b?{~?BQxqEQFyDlJ*kNBeqUk7l^HL4QLanYypwWrTDaPO_FZyn5xu^c} zVYJfU5q4eOH(nY1AP{2a37c6bPrugIzMFg>bhB9?H603gIw66|x25u>AVeEv-@ed* zk}2#&OJJMvDe&o-MVwhD5>)!eP+G~-I80xY=#(A2ClbIJccZr=PVG**Vy_<>k#1OT!4Gz_`Mo%7ac zh_=j(+DA_nv)kLFz_yO~?^pLDQQ^Nf$I+7NdyCT|zd?p!BWuw+ z1)=zMQWe2F5^ z@MDYV+c0;FPJTto<=>;T*F134xH&0ss39hs4*b3$U+rj#GEMSjFRejk8B@blw~1pd zmmlZ8pWG7kitE-n?9S-t{43Fm?$_=WmNZf79p zp`d0tjzk?WF&|_=kum-V#~%$lRhf}^2SFKOYD3?qq*Y~9<;lgT-H?Go3XTi+`N`!0 zH)bzV7;QtJg0UUzjnDu`Kq>6nnm_2~D3}*rF--os-BYnm&mcPHR^R3e5n@vYf~s}M z<5-cgf_K~u9ri$+Y68l*YkA~bQZtYeAF+KCFVb3VG9E}$N(t9SjjR>_k)QB!v$I{) z+`iH9CDRyoJLNK(E%f9H0_@>x&dsPRrKQ}e(wK$sAAKMsY^?7-@@Eb#Ale$eBRbjz z6Pl7$Tf{aCMmxQ5kN^x~hsR91v#^*sBf_`C{bCSC$phhrfaru~i4L)XQ1ve}d6*XVu@pGCA4~*5bN8Fqpr*-X=tEo)tVnBp3ut9GV~BZuEpmJ!nc;Ae^3e|zJbz@T*vL)mrkWDY2Iw2Jk-f_ESRbF&f#;To*Xixh+b@Rbao zQ6vI@VZ*f6%JY=oc8%!k6uvHU1ohsjIqAOp8koAf_DvG~M1@97v{#ED1) zfU{W@^4GN~02aTKc1d60pb6}Q+>3-*O~C-_KiQ`5k+ld#7$OzmkRgbI(N_K3Uj&6z zD!>?K7oQjam|OKxrt}bFtThwz55(s#gl~=BLShh`84>$$*c02!8l~A#uNs=fHNY?O zkO%}}#+u50P?-9Wftc*L`)^>(xn{o!AnL1*Ea^|2S@(c;;u|Ktn5x}$rCpQg;0d{A z|HDxnmgnjKpx9hx+rv9;HXnhWv4y9N8#@u}EqTU%S7*U2YhKK~c7$}DHgS6@&l>QSoGk6c6e{)wzJ!U>fh7YaFt0x!lE0?XR`^>rc=r1kFVB< z^v$eTb>swgK~=*CE1WOn)fPsTKgGU&`3h#;f5&wKkSJ=$W@ zM5a13I^TuY1zIV@4b|o^>+PH2%Rky~1QnVgXHzh7Kr#OFWcc#AP&v)d0h!H-deU5E z73L)alp|_d17k+_C~wIdu#g;vv9&PX=)0TrPb)j!grY8(?3O;X|-G+-v0 zvUROM8UnQa;WC!n$|{BSu+GO@vumkvste%4c8cgck?dv-)D?q2Dw1+R` zF?{JRp_DTcpcsT`?=Rjo`KJPs0M$KS?c8{FmH}QD!@4n=*AP7VgA@=&2Lcn04Kc3K zgEOVPo^AIQ|1G7;>8bMUN^XXn8v9f`INr|qYa=^bD~YN1^q1C zRNg04o8Mu|yg`g2?RI9~BMN1_h`G^KUK&`80BS$RFJ#e9rzF1 ztHXN(Se54-uo>yN(pX(~omIny+G~t^UeP2Ex;Nf@*VXzuE6%>}Q_c__#fZoBB(iPe z_ZPfw2p1+4hit6d=XvBKG#^nY3?p|`ud{N;FMcctfTnz^69C-oM2R1aJ3kVRSD0rs zpOksm#UZAokO>dlSymOy83+%!H9zfPb!&j*N(%@*u${R5I%dG4-;T5Dv)h4l3}Va` z&x8NGOQb`^yoy0h)+LpK@*G!R>A3x^v>|J5O8Wv8Pd?KZZ2_wTxho?HNdY5qCrt%P z%RS#@HCrm^eD4mY=wE3Rs03ceaEm~A^jgCls0AvTnFe5JBJ~3404A=Mr1na!Uk@9JO~e)`*9m7PGw2~AG6HKXUyShj5g_2 z2DTL8$vvKW%OaHi^fd$!MkMK3@<1>P+xE|@ELzmDi+xWf#@@zC8?H_)91_1<6-d%HL)OlY<444w|T9Q-IWhejU4<)OivGp4yqG(&9wX zSH`B@*%hd)Q4paw*`HeW;!l&b{>P=|0%F3*;MK(3#+&VrP)rKqFjg!ml8aObIGBj` zuOd-3#S0T;6knHheZU^~`%$K+`#bk~NBg~;8b<2EBU!v5hdC92*biU}=fMM`lG~># zy3B^-O}%Q@4qKY{WI@ASD!z&FguN(#Dq}@H5k?zx(p>LOB}0@ON!5SruK-FMkDsHC z7lR748WmuCPVC?==nAz2>}n}iFz4JeeiMV)aWD6rE6Lbzz@`tNLk zlrp-3wJOY8m)a<_2s0T3ni=`_Mv;w<;-9l8zhcB1)9%96LZ{Z8(}L&w{Y|)}Y(}#S zRi1s-p;j*Mbr(&U3Kp9j-NU1n4EEo_Mgk$HjhcG9gS*x`CN<5xaS2{qESB-cyRUre zmA6E#N7fKD(HT#|y&r|^-@o_%i0sRx5n;`rVsbZk{)J|Y;k}O>fuvtucU*hE#d3Rg z@<{yI=C6!k`N@46)Z}*s;yboX#4V^gBtZWSdtn7Lmw(ily@Z;?ACT$wNPh9NwBLbj6C3t@`t|j1}*QemZO841XTlr}qV+C$(vi zdDrjl6*SUX$?}9?^D=tDv~>69leQ>cikdJkE<$frI2F7no)9N>QJA2MZhxo~N5s<| z$K{wINXAqEl`E(MW`l-KJ1*z|Oa9XaM-X~SqsR8_wHv+Rk&R{ECJxKrD0R8>(&qN8 zG8N&D#Jr!MtIR6ldOPA&=q;uhy(p6na{`d**g}E^IZO1)^$O~`-|VN7-`Jt7hb-=SN-6Y zp6!Mf(}E=?{w;TDt3hHEMzFlDhzyX+FVqdoB>T5D#bG373Rxl2L7l}`6H?QTkJC7* z`>e0BI*(|(AL+<73rEFJr9G~TM@`e(cP=qfk~|b#i_n|>Q-s5^d|P$&s&MZrK6U|H z?_FJW9!@pT*Yu+qbTXOv(CzGr{3EX_g@x`QqJ%M=1KQ>zb<)!~hy0`}=0OayMl zn10gD5on%0VqfH5)F}gTEHy#xk2k+wBuC#-B;H9qHAlH`nsY+QtT+1QXNX@PFUNm{ zhxX3*d3WP%mS1))+{eU|F25f~Cglb_oJvQNy~K9=rKc8YUO87)>x!S=71_28PHGQ7 z|9BgwR4S?YWFl{(K~pZ<&01f7(e~1Mu*pi^258T!5Azy1Eo<`ZaVQ}B+b|}V_XU6b zmX}s1Z&nSDke;25<~weaVZsR?J&vaj!f$0@K1c<&ueI+hV>Magqh@tKZtsfx7YBwY z1+_EC=@4A{^c*n-J=y$H~3s9 zDwB}aJvtN$kU&a2f}muf-&~M` z*G|cZO|7nCb-VS*HOv0GB(lVRaqyOwbNzEjZXuAKJQ z=tke(pm`18?5Gkc=>~OYj*NB4YzHZziKf4{abAH3LIn%7cGwn<>kgODHo8kt3V%<; z3v}EZ9S^?fmLBee2}{r5Di>BajYy7U7f9_7SONElSN>)TLwWq#S@Ja;OjKJ+2u~?b z)GEXpV6zo7HT->H!{cD~pL6Np2PRTf&E>MWJL*Zl6ehmDf#b@C2Hvz}RX z(;ESaTz;ko*~Qc8)Ou*x#mMZQpTU$tLs!3uhY|GBt;?5g1ca7RB*hj z{wGxkuj^D@g&OQBzn}71VpCRR&rtBp=+jHx8~;5`jL4y#T3<7rtJJvgf6S$?SGX1& znq6FhfjU+SgMmuGJLnw8$n0K3NFAnVgRT34ykT_PQxi5eXipT~_rRXWQQz1{Ij%=n z(5i4aU_T3iyNTmqWcyfHXZiJ<%V(@0Ej36X#!)v7qtCfAN)b#yHTeu#zEm!m-GRlT z^nL`SH+#Ald>UA$y9c87xN(G#o03v9G`c8s)+QPTl=I`W6`-4GK5JKEBhv6l9oiA~ zbRn@e8j%Yh&Zwo}Z_F z{*5VC1^qY3qpD++dm=R=;oJIV>vOgXbjn% z>d7pc-UJHZu)ndTG#5avD0yIb=*+1~vaeERC7t(3BPz>x&gRe3w>0H9>&OY}!EOhw8!l@Q1xl@8oXA9Zt11q1%H!5;NI zi5ws9iU`_?xs*RGF92dz&SVIqm8lghq0l|`lH%EgJAJ|!p+7n8ZUdZ(?kIW#rJSO6D_WAz9p zL+F}wCA)8`X2{2t0~n$dMT&9#IOuFlWQLT2KHEufO-Lbv@PAU+?qs#4c(`Sk3-bw| z6qFS#?e^M+*Yvc&SbNIsQEe9tFgA#pA!$LJxts0UJC?GbSA7c{QWWDKKHK>^m6?(M zY*ACQN}4u(-vr|(Oo`7)6_-eXxMe-P$%6BA zgDq<=?F&GDQ^IlsJx=?@ogO7)E_y>o3MHlL1}gCgod+)6`!7=E>x!xi*GN$)%L)S| zv0{{>u(SsHp`_a|6dr_k*m#K==RBzrgj}zf;+I6i{GC^$ut;#m3gP)n{BmkSQiPXs z`xi_DId#t2y5m0+*ej`kC6%i!ugfRP?rZU39Lc$a6PZqH-1mLYB2#a>=(9^sNvAk_^uu`Js3<8@va?d zH%Dn-Is5z`JEcJ##$}uszYX8_H-5nldDh)XAYKm^QHk)_&f?2qfNb%xnfZuA^^BW2 z*=foWkX~iUDWBmdG!7m)XWXo|jbT)Kr>_qNmWly##<0+x20~x|w-w}Jr;h-6)UFVY zv$u~8g;t>4zsX31+Hjg>4ZIi%o66G{9@6MAYccGG1?>CKTrFF{2pSuFRk^eXgCC){Vxn z6vWrFpAze?6>Bf{hE1R`MMJOhcO;Z$xV)w`&3y<`wR{~gSlWKt&YlO(6sDQTqYA`D zg7v%E`I~v1GtBT~Py*0+1u5{SpGk!&pW|TC<-!2THlH52;#WVHE`cK10v$eZ_a_M0 zxukZ8WaK^jh-{oWn42sY3W_dnvsm;cw&b->Xk(jW6$+`OMK`KF_kD$Z%oA z4DA+DrE(%TjO1$)r9oLie8CO{$EoI|;7Hp`H%)qoyX(!qM5XRnO|-atMf1;hPT1b8 zj>F0%KF#|Vp$M{z=ZcV9aWG}Q>Eg57r@$G~2^zC>bh!O<{Fmhg_xw%oXwC9;Xt#J3 znYz~)dEO;nO8Dg8lU!@LvwxXL7wdDJz>BV_y!8dF)zXtayDqX#@9Oht)v==|XU6*| zq^=5#oGq+^u&GP1uuasDakRG`{jFfTXVQox(uk7U|DLuOXau`3R)lf;(?YwKs(|^mP$>*_@f+VQo>y9;T|?o= zp)8!9WZXsaw3#40qaiVVbrXRqal`i%K~Wiv@`?FZS4wkVkk_VF)S!=+{kDmDPrO5D z%9Pmq#@s3S!Ndd6x*bS=icx1=>91uiDtq7J$om&^wBc`tZ3h!NUU3{koSXM?qASby zQMnf5!lxQp+QSt)RJ7JHgW1KWHHa(Iet$e;*u^}*(f@iLg~~+SYgIJY3sx}*wALmu zZ0$J@X$R3+;h1jfdqy-)#~5<%uOGi8+lgh#8&JRfkx`g2H~nmk5zKHa_Of$(aYJ^z zY-b~j*kCqn8>@C{Dni?v(5uinTuhqs?D)z(mRB@)REU1V1r%xR}oi zg0QbmZHwZN5Z_0^vTzdOzy8Y_po2s^R%Vw~E0u77YYLo9xY>SqC{QUt6N@8FnpQQV zX6MwU;>@VmP-EaQT{CS_t1>-8IM!+7RKV;tIX@l1b#0Mg^;QX=J1y_O?$z(BoZm}; zYZZazh(6odV|6$zt8V7fO@Ov9y1*|hdF!!-iRf}K2eGfVas}Lo0uQ1A`oNSFAX#P zO_;Eg$*RO!+*iNq^v;4~R z{=e?h|7*80cXG;V;yurTNvF})Ce^%=v)!v1>ITBWgZthOADnE*=^zav+*DtHF$Qcc z&z6?q$+J!o(4Q79_%xT*9Sr2jx5jtz>jh-a&E@Kw6@54;@(XYOpQNyD8 zY9E^g)!u0o_q(~4>zWiME{)x5Ue!1T$mTk}eRiyH=Nx~UDB9gSr(NnL%L5&~et8kU zFh(s;1{!~C^xZhyl%YsbvyUxm_9dqpeC_f#X;wSoC|WdBNNXiOxz<1R@BE@3)*pf| zem|Xk$m?7^1&C@sfQH73sqK@R?a-`s{a&l}ACZArk-fKwIU+E45-Z#bOh)B-~5mkGWL9tgG;uf%H*J@j$)p<_d{P{Luhip9o>LR zzaK|%?i1YMX3ang0VL^`)(zIVe6HNwmsMYriod!4qIdN2WvUhHl~QFW*2xnlQ?z>R zvLt0cw${XTuV20dtN+^DlPIJ&&EzZ<^q|)&L%ei+#-_*&Uw; zngtDCR4?ubZId1Ci0#amdw>Y3i9ThK2&|p%h%hLJI~2SzjI5j%HJ z!h%@y7ahr0$l_tv;TCctWRH;lUjSYdq3iiXI|9Ebrs>;<3w4c^!r$!faduRsyk8Wr zb{3&s9n~@ZHqYKB5VGH=(S`Pxes0_=`v{cn+&dLUm00lB~c z`sKnFWl^XLybwGu0}n_OGP0rp1Mep{U_h{xzY_bm`kEEyiKu@Dgw!kbNuGVd`|;!& z^WeQ#sp5qZ6AcssK*^v)#;xM=-+Jg-*n;6|P75OTp0rQ5gJB zM`ScP=9(saqevYLl2Av5D6n{xH%h9_|4v6^g~dC;Qs!RX1G$AS2Fw zA^uOtWyFeKdL}5Nc%65pp+NZCMXSd&X73`39p^0aU?YY_CE{>kLHeN4fiy}f{ZA+LldZ-ES4XA#3Xa0D6 zw{q8@gsCTplV^b7u|nmJVs7GAw>zpO@{D)qT{AAe-&hBFb_Ny9E64>4NidkPt}ek_ zt1*w9FleIe54+F?ARg5_M2HoIiu+u4CZ9aapj(bzMdXOo5PiueobfN8WA7yW)SIsR{1@D>wxM zA#@9W^B!mmm6WQ?2@Q*ms?LdGrX%BeQm0@v3F!Eqtm3tddUYHHG)G7-M7r@=W&Hk- znkH58k<-voatQM;{Ew2JDSsCf7N$M--!leG>VbFQt-yeO; zr?x9tA3l&F_9yx!&+#DrfoG0&0iiJm458EK(g6X`JERVBR@xjPxiDwu^No4a$Lagt zB^Qt1)y#i-ylsA}%1J5&1u#t<>V#YDcuYt$3Z5f~*w9i!vVyYevQQ8@ z3h6+QC_)*yJ zb+MO1C_Rdr_q~&zOr$R%rGiDq0L4ZeGKa^zz%7gtLaCx~ArMCHRv4(zR#1$oV8OSQ zNu;k&(qs8!p_0eg1=1B6bF58pVYjwto*|}@BQwq`V8PCHTG3pmZ?`c$&7D#|YPSq- zWbs*erH+D6(q(=QtB3nfBtc}anx)Z`jU1ybZ%%D^>DeAD3RM2y%`O1^w9jB2rvxIQORR7Hf;1VYCm z!tF@j)Bz)W(#k2+RHzHecGM!0g{;3$K!%z7842e`=;Ow?vfTWD!xM$utux*cRx&P7 zSvu4o`L>O0XN2cMeQOO6`Jm`X^VBAOQ!JiO71xzbXe+XSB#;q=ulJ-f@_T^>C-J=I zsQlkeXrFQ$%ffFH2#IUy4_F;Mvkflr@3#p-AF0p|AQ;+l+u&zLNc=)9)L8^p1OpmB zsG|Rwa~@5wZgPYKvC|J|`~1>}aEInIE)zy^ z{5^BIG`pitl(WQ#2RET%w}mKM!PUa`lr<$5%^~s2NZEo&BkwA7i}!U2ijxixA&>_3 zbdMpv32naji+yiWXPT z%7GG%0~}58a}8~@XHPEhfPViBZ8A3{h=cm3H zP%LYQrP4LeMj0>TT&xTF1?>jQsBIuqW;m(}DE z8)nxU6_kJ`yEQ_^!of1ZvY_EI@=ir_G`>NPg5{7KVNq^%K(9n&nbZMLTI8<@Zj0Fj zxLb5lwh6%(kPga9b2M~3lq{mPHo0d?h38Q{TWIcO74R<7ku5GAJ+oKTl(z}WpK|gH z>sm-6Jb)G8Eulnt`fJ>-GABJdhm|EH7v_a_Tr5i@g{}Y*M)wRtsE-n{77~LT+8^)P zM#O2r#-KxehUm59v_03|7nViY(H=B^o4PX*`b1i%sbC4)`5OAI>X`S=APCTg{otty zgVOXE&j-1t?_1AL8A+D`ia`0tF4O`2TLUii%h~a~y}qlis+@#E<4p-k!f1yPG|D#T zPxhJCAP z;Fj?t!gw!#Gs>hBFgnI{17T>wRd`<$ed?p2@F@2(@#N=rExMGDP&(v|C0MEuHzg<* zED98o2!VI;_$bUDTDKIUI^{X~)QQ|xyi0y*PbhSv_)ya1CnA?3M`3B9s`Bv1+#(^( zm0=VtQ=SI`<$Y)_M(>|@N_%-A{_ow*@jBXao0a4Vso8Zw%Ti}fNs1ZQqz}|_yYo@F zw6*T3tG@aY67`a3KjAGYuB^l-w_L zI64N(MbUG%gP$H7I*pJ{;mKlp{7UX`c1KNg07h82I>-x>vfw%?MCPjKBq;r{$%_t1 zr|`-%ra6uZLnMO|M#({Bq?H03J0NGP^Szca*8n(Z~0K))I$?S&(sg3$DjrR!uqk6E^^QjE!wyLi^$UGH<291@($j z<#`AoAes}BXiHZDA!$C0`eo4K=X2xVvh*3u>9~bIAM;9u$XQ&a%uo5bI+cmv*yk1` z9;Xkrxj$3!WbAf>R@wyJqQRRLEaww0^rdA3z$z!1h>#Rj1mVybAsV9bq*RFrk}J$x zPEp~vbwDXC$3?&Jc$O$KpB4V@IbF=D$$3CtOf?ZCeK+bXLyM ziFAJKf=i;$D2)zIUOY!Sde0J)3jq#Z`MA96W7ERBv6I_~pM!9_^~of;pWADKr3`5R z+5{thzc@A?(=XSO28tRh$47p-80y>vvap0i8}pH6Q9&}&=N%IzxZ|Q*XZrhs(JmpS zZAF$mgCGtWCx1u-N$Jy`>@xGF7(T)fvktLSxiFcELJ? z1lk5?R;-0YJ37w=>(EBPX&n;jGtZ*)z*`;hxl-}&#n@j6n1PV!qgKd+cdz=olxw)w zh4)8aP+eg$PxN&*Y7-8|B(2xF@~k z=<=b;ZG?nCl-@njggV})`;Gwy&yCv+5w7Z#l?F91u)unH%th;+=gjmQ zAK)W!4Zl2dyr2G#wZu98PWuIIUoP<6JF=1`q^YoIo&l(>$0}94&}i_t({TNFgy<}> z(K7Ji1u`+?v!XMutzJ=~-I zy}3XvYER_Hb>M=`mwpwjkW<76b%s@A-yMYC*E&KpK%x9OLZTia1KLTB;20d`2#Nkc z0ML$$7F@GChh&BHDJugMk2nZ`gs3a(UFW!N&O(XB_zrVAz@vW`1x_+r4~{j z;XTqGu)?uI#>sh!-w9$Ate6~WNC-Z`LSQ7`S9p&KMCmhN@YYf6JAFlc28%LhEw4&Q z2<}VOc^e@uNbG-o=a6udn~7}@%f5*<7q zlQNJSg%Ka_tenr;`^8;`kWeflLl@Gtz_sSncZ(KMDi9L$HI|U*5V^H5shrC5$Lnkd zzJ#*TVV8716bnjZSqLl9i##jD*hk@QLNp=0NkW2nA>Ew9?Gmg9tWgLlcP|4b&0(Ez z!Q!ROjpwd%AzCj!CvCT{Xrp1;0BfDthf&yZ;l0h!?9PkPcd-2U%=_$~cwH(Gs^+3{ zE;$hrgr2j;{rekrw`U|rNNw+tzLoPHAhc6^pWTdknTU|O25MER%!w2f?kGA7^BlOJ z)X}V2&gh8IBaPQCXq(Lun1(7B3A;h>jCR+eSWzUGB8t2Z+`>iwwp+B2Qekw<$Q;)j z)(7)bQeJ(c+)#$NjZ#YrrLc@VN=AaYQSUazkFZ@CA>|Zfn~0EjcjNS=5!w}P4#K#J zw$|)Mcw&vGb)L@S(RPUD<9Z*I6G;P0%ZD7h@E)=BAvf=OjzIC!o>0WHdWo*noT(?H zn6?E2G`X&QV2|6K2V)L2z5YZ@TSDC^$R!<|Nqm$a>A5^9dslT&LQ<5S|K9~q00T72 z;O7A&cpjgpImUUedtkIX--8?1_fyv%-cG$U7q}DCNe6jVs&tA*Tr?Wo2`F_)2@3^F zgP;W_xsSyLEAmQ}6yMz;4NqXvq9DQxQb4hB9|UCuB?B4Zo}vUNP`%Z_Egt z7v+F5qug>ewoP8=gwD>Wvc%1Uln~Nhi(Ia`(YqB9Qk!e3O|VoUB$V|yJ!u5xMq5jj zI0QI1x5E1%JEfo2tzq!WVV+V7HZ(ro)+Uo{_ged8EGneNm%xyuy)@#uzO?0ire|aVaBk=sZ zBax3HXtDT2MtB;yj{2g%μ-CZ?AYAEju({cYr1rOJXpNPb6b7aAEI!deqr2&%>f zQM6ebbEE$_O5#2ysTq-`jhMM5lt32&oFA{rZRBVLQlPV+a6u999E{d-6US{r`9#De zB0{3`m)^T=@$+Im2%f$IbwdJ#8=N=AzCi zFNA<1$ND4mTc1EUmciXFC`z?S!k=kl3eFf>s26XsyXAv{w4XpOA_I|jI=D+kmevV# zjD9M>C-=^(RLKgB|E!KV5*jCN z5KWjabe0aGAu3ufcb^~Oy6(;;l5F#TTj|PclY+HK9YJRMz4MJ-P{dtI1@Y}7qNF}c z?&Cc5wd^{ikLxrQ($2!{RA42w`iB(qg6wGTN|h>As#K|RSmgf$x0wx7ep4WM00000NkvXXu0mjf5n`LP diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/logo.png b/snail-job-server/snail-job-server-starter/src/main/resources/admin/logo.png deleted file mode 100644 index adbf832aaa1301810606f071e90dccf990241f20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8394 zcmcIqcQjo4x7S-n?<6uxl;~xY(R(imks-tsqhv73=yec+goqMuw5Y+5kswMigb+lO zAbLp<{*6*J;Yt5Q-zO(mdfA-#=v(KD!Cc(#IH9E6>%jvJlUW4LF;W~=SMbE)o(dn7a)G12H!PBha2wFlRIz zDHY`DO|&Km%b0uXBHi4LLVS_dAr>}> z5EMeiSwK?*s1^h!0(c@ZFkq0UhnF8XNL}DhTrhF_*Rr$#@J|yAN?kzvS3n@d+zP0R z_C*3gQi_rYSp^VKNkvLlQC>ksMFJ=%BdaVeqbw~eFDa`CR*(V9$pL@A1c=dmon64! z^$dQ;BJQaRxM48fU}@>Vz(A=$c`3B7tF)|&ii)(1oV1*rB+)|BFW3tM3zGEm6Z{)N z59x>Sb@#@&qrHH?5Mgk%KSo`E$n>uiJiY&c_44~&CSt*)gJ9m$vQjd?Qu^D_-27jg zdV2n2?T671AV&Gk_kRWUvkCS_N?%9%q5XXkNc{k$7e?^!VBT(M4BF2P{eN)#=j;E* z&>8VhKyQCvk3Y-fjF3ipAU%oLeneZ@Klyosb$yXA4BFQQjrRDvQC5FP1nTPkYK#g{ z^rpL)Gdj>u>=&uuK1e+n2B|I}CnKjIDWf1MCu1Wg1C~_)E69nH!A_;zl!n8|1ae_qY*@me+mkgb&*q$ms3!XM9Qlm zB|&luE|My67m%b35)P74gd=3+WRZWPS^ByY4<4Aue?|Sp%9)4=Ln4UIAcUm6vz(%& ziZT%qt_UaMz(6n=6(tv07ziN%{Li?$Xb-fnIog?6U3meZGXm^__Vt7jCFJf2b45yf zd%6A+G!dPcg^{}-v3tS44-spm&+jb{ci^A81H%x%m00P2M_pwNo_*+sg&a$#d6=xMmkh47T z*!v|-WoP2dlaU1>;Ybhy373KW71zW4Zw7w>N&oAJe{%gVbMkLz;_&^o`OnlR?)-D! zKzb2V^(CGad}QLTk&y5(8tZA>1Wj(t1Ww=9o$cP?WgdFR#B!zZv1m;S3xB0h&sxH0 zXo6!4^*XG^NNrLe%I=hC*{KRIl$3JhT=m$A$o3ds=Y$9#H(&$&(nFqrcw<4noA;px$@q`svreN z;#u&kR{CenU8h&*%k0BkS9+?MniEU9B=-2pE=;Tm95CsA<7I=T-?uo>6tH0Cy%)TC zi-KbsGHUTKg(II;F?(>k&CKHpAUv6%6K-3>+QXP0#8)ATPC|7m28dCfr4n>lIXEM0 zP^qQN7jFkSIyh^()E1?%KqNkW(=1BKO*_eo+Wtc-S6LgU)piBn>tg4V6BGxe8MwK~ z(R>uZa3Y6gue9rmJMdhyrix$_o@5lr{W?csYbHM6Uw0h7C_)vSj!9VxE)+k@CD4uP zEJ7m=G7=*sxbJZ8$x+eZfD!^!c>K$cd*&g*3 zCJj!air))CXlItB#S}Z9bQ}rbbL=2F?my+^2Iv3CjF^q~F@QD}BxyLotoW(NCp>T6 zS0$_T63;d%hf%S7-%C~Qu^P@MRHO!^zcF7r5~E^DEG*-$dKV;ww|`=DxetmJX~id{ zPRS|K;<8s81LCuL`JV#Vj$Cri5GGJ&NSm2&va=PzFMs0w-b*IP61~J3*^yKXDe2H6 zHkTIXJM)@v9mAY^89Qvh8%~4!ZiY)K8xi!@yqBiWOD2B1xyFGswNY0>8`|}%eoex< z+)_`((Bm9oV%1bCfvwAGNV0g)W6plc3W1$U>$Y4?@0$=F{@e{`#BF3h*DDHLPMB(m$~Zzp$=A0C0){zPSt+_VRb)62A7-d?G{fS(l6G8B#`o^gT?W$6Z;y zJ|-Be`NLM`Qzl5nS5dwaYqBanPyiS922Ki2mdpHXf|kNoHk0$i5Gl4P*95xcgg(;; z^F92OO<}8H%O*Xt5aoN<_8zumRNJYbh;->Rn9ClzS~HvW6&mFy!UFMHZGBd@3ej>& z2I8mPr1^?d1?*^~!R2MpYx%L(eV60u zp9ZSbE4QuZv*R@=#;z+it^y(^_~TvYCZw(xx4iMSwIereQ=8GH-X3tS@wNz$iqY-Z zE&6)vEdiVzzg2QgD|r3K#nbls+CaR4szd&YKXf&u@^R4o zELf_$707zP4qekZcgn!PaY2Vx5FVV1jbuk^j2_w3^A3 z!3KK`)CgO5@2Q8G#2!R?+)%^3z_BRM-U#c@z}Qba!@ixv1;08f$x!EK8q=j4K&!(y z{`5kGVCX{@=WlTKipk%^Iv)K|0YCcnW^Tv2t zpxep)l}yG<%H1F0O+Fp$Tj{-0@t4BrB<}c$C`rbg-2}UCLk13Ig%;{=TV575f7%wH zL1D{VKVSU4;N9}zFsaI1H(N8bVRqf&Zus4jnj%JQ9Xq2yhBo)c_|&tgP-Adoh{{<3 z+g??hXDYVDiK=@Cc>UPa09%K1l+QS{I1?J5?5e(Bs@aL25+Fyt$q@-e)cO&>HcGw~ z=yE>Ui0N2Y&u+D%JG_!h=EDqm^_}FpD)5aGPN0==>Ctw`%B$udtE@h!@4Qs{)bY0R zY%6{+r~!80(7HeM4#L{O&*?;03?MFmmnvS!ZO|+tfJ+Nbhep>;OB*()R#}He$`dno z0XTg>9FtXC{HsSkZ4B$FWLxfs>6%E*A}75qoErH$4bOD>?nP=_X=|}-)*sIR=D}z2 z!y<);dF46JGJ>J*RRLEGnj-sr?KIEUqPJGeWdnP=dJadV3tu_$Ve9O)(;90+O=<(# zAWEEJ(kEBka?=m-0;rdThxf`q$L1De{RQcBS2-0quegLkMle}1r$^%90(UgCdap%g zQ)Wh-9p}Uiyte715~B`zMP}Q0v$<<%YSH_IBE#en)fh~{TME-&HkN2VC8U}D;;Vj( z{aUaEHFk8!%0k6uYYfbO9SvR86J2??^t1N|+FE7oj7!zHG57)b8RNlEr;l~(g^S3G zEy#Vbqe>CAPkFXzD7!kzc4g(A=@fs*_VLEMZ>00Tf$ooQ*imrAQyrCLKKE{-*{vjd zzGKv#1T);3F4`-B^dh0F4xPISxSIpzJ_Y&L=Rvo>1!;ST?0`RLm{2zXaC!awK`V7U zoUUu!QPOOf2ZC~+1j|>Z%|9O-HWs^b+{F4T(yx`gUxR$Rr8o0pN37Mi-Z?Ta9D^D8 z;VVT}c}bJH#XtB`%#YX6nTq|e7v%;%QXkqJG%uj&ar=N9`r)%$;K&E$4j;sGvUc}d zQhhC9D8s%P^UL>oMLDtlbo8rrA$Obu`+_59Lls4N-N!Ysy1(VCv}47j&%tV)MD z3uT1Np*tX9KsYPlJ60vU!mH;ULw}vY!v1n8^Br1T=(t2k# z$?`4L$mM87VPohe(>Ih$iRm#8DM^8Lx+pho*eLYoxRYT%&6r_n0{K<@3%FDT2P+53 z;U6!{ZPd;EB<-W{C@gjq+GcURN?|$}H@i>4v3nCX**OFqU%S|x5NdwbJ%jSzyx|Q2 z{gE`f-43qFBdmETbBioLlHVWHy?sjjr8jcGIMKameY#eCLvYWiT04NxQ^T_3&a!6f z;jmK2TkLuVUW{@~z z%U(P6C=xN9P#y7xU|b!F7H79nsri7TRF|gAWtF4UXD=1{&Dsq0ROHFhwa(_0zFO+Uyf*SLB`aEdkO*ZF4MNY`g5vz7y zE#RnLpOTYhoS4;6HcWBM|y{*z_0 zbuJ!Jy15`d9`B|}r@c~<#M zB{_=X0ZWcL?FIDLCz~aE@4mIh-lXOzONezoK3107 zP4~}NrwMC>kT?U{#Oj7k9p#`~0mnQi ZsX0m%I!=9G02byYCBaJR5o`T7MzQ-G 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]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 Dg-Lb= diff --git a/snail-job-server/snail-job-server-ui/README.md b/snail-job-server/snail-job-server-ui/README.md new file mode 100644 index 000000000..975908cea --- /dev/null +++ b/snail-job-server/snail-job-server-ui/README.md @@ -0,0 +1,33 @@ +## 自定义前端指南 + +为了在项目中集成自定义前端界面,请按照以下步骤操作: + +### 1. 创建前端目录 + +首先,在 [`snail-job-server-ui`]() 的 [`src/main`](src/main) 目录下创建一个名为 [`frontend`](src/main/frontend) 的新目录: + +``` +snail-job-server-ui/ +└─ src/ + └─ main/ + └─ frontend/ # 新建的前端目录 +``` + +### 2. 拉取前端代码 + +使用 Git 命令拉取前端代码库到 frontend 目录中: + +```bash +cd src/main/frontend +git clone https://gitee.com/opensnail/snail-job-admin.git +``` + +> 注意:确保你在 [`frontend`](src/main/frontend) 目录中执行 `git clone` 命令,这样代码会被克隆到当前目录而不是创建一个新的子目录。 + +### 3. 自定义前端 + +在 [`frontend`](src/main/frontend) 目录中对前端代码进行必要的修改。你可以编辑文件、添加新文件或删除不必要的文件来满足你的自定义需求。 + +### 4. 打包程序 + +在 `Maven` 配置中找到 `skipFrontend` 选项,并确保其未被勾选,以便在打包时包含前端代码的修改,然后运行 `Maven` 打包命令来构建项目。 diff --git a/snail-job-server/snail-job-server-ui/pom.xml b/snail-job-server/snail-job-server-ui/pom.xml new file mode 100644 index 000000000..45a80435c --- /dev/null +++ b/snail-job-server/snail-job-server-ui/pom.xml @@ -0,0 +1,144 @@ + + + 4.0.0 + + com.aizuda + snail-job-server + ${revision} + ../pom.xml + + + snail-job-server-ui + snail-job-server-ui + snail-job-server-ui + jar + + + 17 + 17 + 17 + UTF-8 + v18.20.2 + 9.4.0 + + + + + org.springframework.boot + spring-boot-starter-web + true + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + none + execute + + + + + repackage + + + + + + org.apache.maven.plugins + maven-clean-plugin + ${maven-clean-plugin.version} + + + + src/main/frontend/ + false + + dist/** + + + + + + + com.github.eirslett + frontend-maven-plugin + + target + src/main/frontend + + + + install node and pnpm + + install-node-and-pnpm + + + ${node.version} + ${pnpm.version} + + + + pnpm install + + pnpm + + generate-resources + + install + https://registry.npmmirror.com + true + + + + pnpm build + + pnpm + + generate-resources + + build + + + + + + + + src/main/frontend/dist + admin + + + src/main/resources + + **/* + + + + + + + skipFrontend + + true + + + + + com.github.eirslett + frontend-maven-plugin + + true + + + + + + + + \ No newline at end of file diff --git a/snail-job-server/snail-job-server-ui/src/main/java/com/aizuda/snailjob/server/ui/config/SnailJobAdminServerUiAutoConfiguration.java b/snail-job-server/snail-job-server-ui/src/main/java/com/aizuda/snailjob/server/ui/config/SnailJobAdminServerUiAutoConfiguration.java new file mode 100644 index 000000000..044e7006d --- /dev/null +++ b/snail-job-server/snail-job-server-ui/src/main/java/com/aizuda/snailjob/server/ui/config/SnailJobAdminServerUiAutoConfiguration.java @@ -0,0 +1,21 @@ +package com.aizuda.snailjob.server.ui.config; + +import org.springframework.boot.autoconfigure.web.WebProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class SnailJobAdminServerUiAutoConfiguration { + + @Bean + public WebProperties webProperties() { + WebProperties properties = new WebProperties(); + WebProperties.Resources resources = properties.getResources(); + resources.setStaticLocations(new String[]{"classpath:admin/"}); + return properties; + } + +} \ No newline at end of file diff --git a/snail-job-server/snail-job-server-ui/src/main/java/com/aizuda/snailjob/server/ui/controller/WebController.java b/snail-job-server/snail-job-server-ui/src/main/java/com/aizuda/snailjob/server/ui/controller/WebController.java new file mode 100644 index 000000000..258b7d0a5 --- /dev/null +++ b/snail-job-server/snail-job-server-ui/src/main/java/com/aizuda/snailjob/server/ui/controller/WebController.java @@ -0,0 +1,20 @@ +package com.aizuda.snailjob.server.ui.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * 默认接口 + * + * @author: opensnail + * @date : 2022-03-28 22:17 + */ +@Controller +public class WebController { + + @GetMapping + public String forwardIndex() { + return "index"; + } + +} diff --git a/snail-job-server/snail-job-server-ui/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/snail-job-server/snail-job-server-ui/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 000000000..447b48a4d --- /dev/null +++ b/snail-job-server/snail-job-server-ui/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.aizuda.snailjob.server.ui.config.SnailJobAdminServerUiAutoConfiguration \ No newline at end of file diff --git a/snail-job-server/snail-job-server-ui/src/main/resources/admin/aizuda.png b/snail-job-server/snail-job-server-ui/src/main/resources/admin/aizuda.png new file mode 100644 index 000000000..e69de29bb diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/DescriptionsItem-LhWljJnV.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/DescriptionsItem-LhWljJnV.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/DescriptionsItem-LhWljJnV.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/DescriptionsItem-LhWljJnV.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/Grid-CRDcRyPk.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/Grid-CRDcRyPk.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/Grid-CRDcRyPk.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/Grid-CRDcRyPk.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/Progress-BRSG0yYs.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/Progress-BRSG0yYs.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/Progress-BRSG0yYs.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/Progress-BRSG0yYs.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/_url_-rMAKsN2P.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/_url_-rMAKsN2P.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/_url_-rMAKsN2P.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/_url_-rMAKsN2P.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/auth-C5d9H5Pz.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/auth-C5d9H5Pz.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/auth-C5d9H5Pz.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/auth-C5d9H5Pz.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/code-mirror.vue_vue_type_script_setup_true_lang-CLSflgjt.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/code-mirror.vue_vue_type_script_setup_true_lang-CLSflgjt.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/code-mirror.vue_vue_type_script_setup_true_lang-CLSflgjt.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/code-mirror.vue_vue_type_script_setup_true_lang-CLSflgjt.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/dashboard-dvIvAY5p.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/dashboard-dvIvAY5p.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/dashboard-dvIvAY5p.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/dashboard-dvIvAY5p.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/datetime-range.vue_vue_type_script_setup_true_lang-LaVXNa0e.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/datetime-range.vue_vue_type_script_setup_true_lang-LaVXNa0e.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/datetime-range.vue_vue_type_script_setup_true_lang-LaVXNa0e.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/datetime-range.vue_vue_type_script_setup_true_lang-LaVXNa0e.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/detail-drawer-6eZaB4pC.css b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/detail-drawer-6eZaB4pC.css similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/detail-drawer-6eZaB4pC.css rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/detail-drawer-6eZaB4pC.css diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/detail-drawer-CeEIcqT0.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/detail-drawer-CeEIcqT0.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/detail-drawer-CeEIcqT0.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/detail-drawer-CeEIcqT0.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/download-ip38Mwxm.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/download-ip38Mwxm.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/download-ip38Mwxm.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/download-ip38Mwxm.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/exception-base.vue_vue_type_script_setup_true_lang-CgitO2V0.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/exception-base.vue_vue_type_script_setup_true_lang-CgitO2V0.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/exception-base.vue_vue_type_script_setup_true_lang-CgitO2V0.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/exception-base.vue_vue_type_script_setup_true_lang-CgitO2V0.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/group-frwXGSCG.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/group-frwXGSCG.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/group-frwXGSCG.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/group-frwXGSCG.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index--naHqliG.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index--naHqliG.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index--naHqliG.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index--naHqliG.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-2ay5PpNs.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-2ay5PpNs.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-2ay5PpNs.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-2ay5PpNs.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-BJEHbRVM.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-BJEHbRVM.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-BJEHbRVM.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-BJEHbRVM.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-BQrXbjze.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-BQrXbjze.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-BQrXbjze.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-BQrXbjze.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-BZQfv1PK.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-BZQfv1PK.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-BZQfv1PK.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-BZQfv1PK.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-BideD3ow.css b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-BideD3ow.css similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-BideD3ow.css rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-BideD3ow.css diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-BkhNq40I.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-BkhNq40I.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-BkhNq40I.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-BkhNq40I.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-BxR_p-ch.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-BxR_p-ch.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-BxR_p-ch.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-BxR_p-ch.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-C6cEahYO.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-C6cEahYO.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-C6cEahYO.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-C6cEahYO.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-CUXEi-rX.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-CUXEi-rX.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-CUXEi-rX.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-CUXEi-rX.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-CUZ-ZGC7.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-CUZ-ZGC7.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-CUZ-ZGC7.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-CUZ-ZGC7.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-C_Yl51GR.css b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-C_Yl51GR.css similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-C_Yl51GR.css rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-C_Yl51GR.css diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-CdrPBtCH.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-CdrPBtCH.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-CdrPBtCH.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-CdrPBtCH.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-CgPArJSH.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-CgPArJSH.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-CgPArJSH.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-CgPArJSH.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-Cm2e7Lv-.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-Cm2e7Lv-.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-Cm2e7Lv-.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-Cm2e7Lv-.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-CoKgXZDN.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-CoKgXZDN.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-CoKgXZDN.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-CoKgXZDN.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-CrVQ8ETu.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-CrVQ8ETu.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-CrVQ8ETu.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-CrVQ8ETu.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-D2gKOuoY.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-D2gKOuoY.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-D2gKOuoY.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-D2gKOuoY.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-D3rICic-.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-D3rICic-.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-D3rICic-.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-D3rICic-.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-DGSV_nw-.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-DGSV_nw-.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-DGSV_nw-.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-DGSV_nw-.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-DGuwZRaA.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-DGuwZRaA.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-DGuwZRaA.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-DGuwZRaA.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-DHVgWJ-0.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-DHVgWJ-0.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-DHVgWJ-0.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-DHVgWJ-0.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-DWyLBvsm.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-DWyLBvsm.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-DWyLBvsm.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-DWyLBvsm.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-DpGIIkG6.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-DpGIIkG6.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-DpGIIkG6.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-DpGIIkG6.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-FxD56JQl.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-FxD56JQl.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-FxD56JQl.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-FxD56JQl.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-fyfyZBK4.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-fyfyZBK4.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-fyfyZBK4.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-fyfyZBK4.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-jlqTxuuS.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-jlqTxuuS.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-jlqTxuuS.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-jlqTxuuS.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-kEpqoCjH.css b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-kEpqoCjH.css similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-kEpqoCjH.css rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-kEpqoCjH.css diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-luHl0WMJ.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-luHl0WMJ.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-luHl0WMJ.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-luHl0WMJ.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-wQfBWnrg.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-wQfBWnrg.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/index-wQfBWnrg.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/index-wQfBWnrg.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/job-8-wbHxv4.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/job-8-wbHxv4.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/job-8-wbHxv4.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/job-8-wbHxv4.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/log-BdmE3tAM.css b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/log-BdmE3tAM.css similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/log-BdmE3tAM.css rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/log-BdmE3tAM.css diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/log-CNFmopnc.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/log-CNFmopnc.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/log-CNFmopnc.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/log-CNFmopnc.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/notify-BmtrPduQ.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/notify-BmtrPduQ.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/notify-BmtrPduQ.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/notify-BmtrPduQ.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/route-key.vue_vue_type_script_setup_true_lang-Cls4SKv2.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/route-key.vue_vue_type_script_setup_true_lang-Cls4SKv2.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/route-key.vue_vue_type_script_setup_true_lang-Cls4SKv2.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/route-key.vue_vue_type_script_setup_true_lang-Cls4SKv2.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/search-form.vue_vue_type_script_setup_true_lang-xYfW9G7N.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/search-form.vue_vue_type_script_setup_true_lang-xYfW9G7N.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/search-form.vue_vue_type_script_setup_true_lang-xYfW9G7N.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/search-form.vue_vue_type_script_setup_true_lang-xYfW9G7N.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/select-group.vue_vue_type_script_setup_true_lang-Bk3YnuuX.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/select-group.vue_vue_type_script_setup_true_lang-Bk3YnuuX.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/select-group.vue_vue_type_script_setup_true_lang-Bk3YnuuX.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/select-group.vue_vue_type_script_setup_true_lang-Bk3YnuuX.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/select-scene.vue_vue_type_script_setup_true_lang-DxzzLcAX.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/select-scene.vue_vue_type_script_setup_true_lang-DxzzLcAX.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/select-scene.vue_vue_type_script_setup_true_lang-DxzzLcAX.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/select-scene.vue_vue_type_script_setup_true_lang-DxzzLcAX.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/status-switch.vue_vue_type_script_setup_true_lang-DuU56cot.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/status-switch.vue_vue_type_script_setup_true_lang-DuU56cot.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/status-switch.vue_vue_type_script_setup_true_lang-DuU56cot.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/status-switch.vue_vue_type_script_setup_true_lang-DuU56cot.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/task-batch-status.vue_vue_type_script_setup_true_lang-jyvTK0pm.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/task-batch-status.vue_vue_type_script_setup_true_lang-jyvTK0pm.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/task-batch-status.vue_vue_type_script_setup_true_lang-jyvTK0pm.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/task-batch-status.vue_vue_type_script_setup_true_lang-jyvTK0pm.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/text-CH5rbrd1.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/text-CH5rbrd1.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/text-CH5rbrd1.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/text-CH5rbrd1.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/workflow-DX1Amij-.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/workflow-DX1Amij-.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/workflow-DX1Amij-.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/workflow-DX1Amij-.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/workflow.vue_vue_type_script_setup_true_lang-CDR_Hxib.js b/snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/workflow.vue_vue_type_script_setup_true_lang-CDR_Hxib.js similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/assets/workflow.vue_vue_type_script_setup_true_lang-CDR_Hxib.js rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/assets/workflow.vue_vue_type_script_setup_true_lang-CDR_Hxib.js diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/favicon.svg b/snail-job-server/snail-job-server-ui/src/main/resources/admin/favicon.svg similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/favicon.svg rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/favicon.svg diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/ant-design.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/ant-design.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/ant-design.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/ant-design.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/carbon.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/carbon.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/carbon.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/carbon.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/cbi.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/cbi.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/cbi.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/cbi.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/eos-icons.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/eos-icons.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/eos-icons.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/eos-icons.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/fluent.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/fluent.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/fluent.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/fluent.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/heroicons.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/heroicons.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/heroicons.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/heroicons.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/line-md.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/line-md.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/line-md.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/line-md.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/lucide.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/lucide.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/lucide.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/lucide.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/majesticons.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/majesticons.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/majesticons.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/majesticons.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/material-symbols.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/material-symbols.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/material-symbols.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/material-symbols.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/mdi.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/mdi.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/mdi.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/mdi.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/octicon.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/octicon.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/octicon.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/octicon.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/oui.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/oui.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/oui.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/oui.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/ph.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/ph.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/ph.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/ph.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/simple-icons.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/simple-icons.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/simple-icons.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/simple-icons.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/streamline.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/streamline.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/streamline.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/streamline.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/tabler.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/tabler.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/tabler.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/tabler.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/typcn.json b/snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/typcn.json similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/iconify/typcn.json rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/iconify/typcn.json diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/admin/index.html b/snail-job-server/snail-job-server-ui/src/main/resources/admin/index.html similarity index 100% rename from snail-job-server/snail-job-server-starter/src/main/resources/admin/index.html rename to snail-job-server/snail-job-server-ui/src/main/resources/admin/index.html diff --git a/snail-job-server/snail-job-server-ui/src/main/resources/admin/logo.png b/snail-job-server/snail-job-server-ui/src/main/resources/admin/logo.png new file mode 100644 index 000000000..e69de29bb diff --git a/snail-job-server/snail-job-server-ui/src/main/resources/admin/ryp.png b/snail-job-server/snail-job-server-ui/src/main/resources/admin/ryp.png new file mode 100644 index 000000000..e69de29bb