This is an automated email from the ASF dual-hosted git repository.
benjobs pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-streampark.git
The following commit(s) were added to refs/heads/dev by this push:
new c9a44e92c [Improve] Improve the effect of the login page,fix add user
select bug (#1948)
c9a44e92c is described below
commit c9a44e92c9c10e2eccba7af0b8812d084911967b
Author: Sizhu Wang <[email protected]>
AuthorDate: Wed Nov 2 18:58:52 2022 +0800
[Improve] Improve the effect of the login page,fix add user select bug
(#1948)
* [Improve] Improve the effect of the login page,synchronize the
modification of application state
* [Fix] login page add github info, fix font size bug
* [Improve] Set the version dynamically
* [Fix] fix project create bug and flinksql check bug
---
.../streampark-console-newui/index.html | 285 ++++++++++---------
.../public/resource/css/fonts.css | 97 +++++++
.../public/resource/fonts/devanagari-1.woff2 | Bin 0 -> 39564 bytes
.../public/resource/fonts/devanagari-2.woff2 | Bin 0 -> 39136 bytes
.../public/resource/fonts/devanagari-3.woff2 | Bin 0 -> 39148 bytes
.../public/resource/fonts/latin-1.woff2 | Bin 0 -> 7884 bytes
.../public/resource/fonts/latin-2.woff2 | Bin 0 -> 7748 bytes
.../public/resource/fonts/latin-3.woff2 | Bin 0 -> 7816 bytes
.../public/resource/fonts/latin-ext-1.woff2 | Bin 0 -> 5544 bytes
.../public/resource/fonts/latin-ext-2.woff2 | Bin 0 -> 5452 bytes
.../public/resource/fonts/latin-ext-3.woff2 | Bin 0 -> 5384 bytes
.../src/assets/icons/block.svg | 3 +
.../src/assets/icons/dynamic-avatar-1.svg | 1 -
.../src/assets/icons/dynamic-avatar-2.svg | 1 -
.../src/assets/icons/dynamic-avatar-3.svg | 1 -
.../src/assets/icons/dynamic-avatar-4.svg | 1 -
.../src/assets/icons/dynamic-avatar-5.svg | 1 -
.../src/assets/icons/dynamic-avatar-6.svg | 1 -
.../src/views/base/login/ForgetPasswordForm.vue | 80 ------
.../src/views/base/login/Login.vue | 234 ++++++++--------
.../src/views/base/login/LoginForm.vue | 23 +-
.../src/views/base/login/LoginFormTitle.vue | 44 ---
.../src/views/base/login/LoginSlogan.less | 312 +++++++++++++++++++++
.../src/views/base/login/LoginSlogan.tsx | 99 +++++++
.../src/views/base/login/MobileForm.vue | 79 ------
.../src/views/base/login/RegisterForm.vue | 120 --------
.../src/views/flink/app/Add.vue | 7 +-
.../src/views/flink/app/View.vue | 6 +-
.../src/views/flink/app/components/State.tsx | 1 -
.../src/views/flink/app/components/flinkSql.vue | 5 +-
.../src/views/flink/app/data/index.ts | 1 +
.../src/views/flink/app/hooks/useAppTableAction.ts | 12 +-
.../src/views/flink/app/utils/index.ts | 6 +-
.../src/views/flink/project/useProject.ts | 12 +-
.../src/views/system/user/UserAdd.vue | 1 +
35 files changed, 827 insertions(+), 606 deletions(-)
diff --git a/streampark-console/streampark-console-newui/index.html
b/streampark-console/streampark-console-newui/index.html
index 963f6caa1..9e061e6ab 100644
--- a/streampark-console/streampark-console-newui/index.html
+++ b/streampark-console/streampark-console-newui/index.html
@@ -17,160 +17,171 @@
<!DOCTYPE html>
<html lang="en" id="htmlRoot">
- <head>
- <meta charset="UTF-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
- <meta name="renderer" content="webkit" />
- <meta
- name="viewport"
-
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
- />
- <title><%= title %></title>
- <link rel="icon" href="/favicon.ico" />
- </head>
- <body>
- <script>
- (() => {
- var htmlRoot = document.getElementById('htmlRoot');
- var theme = window.localStorage.getItem('__APP__DARK__MODE__');
- if (htmlRoot && theme) {
- htmlRoot.setAttribute('data-theme', theme);
- theme = htmlRoot = null;
- }
- })();
- </script>
- <div id="app">
- <style>
- html[data-theme='dark'] .app-loading {
- background-color: #2c344a;
- }
- html[data-theme='dark'] .app-loading .app-loading-title {
- color: rgb(255 255 255 / 85%);
- }
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+ <meta name="renderer" content="webkit" />
+ <meta name="viewport"
+
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
/>
+ <title>
+ <%= title %>
+ </title>
+ <link rel="stylesheet" href="/resource/css/fonts.css" />
+ <link rel="icon" href="/favicon.ico" />
+</head>
- .app-loading {
- display: flex;
- width: 100%;
- height: 100%;
- justify-content: center;
- align-items: center;
- flex-direction: column;
- background-color: #f4f7f9;
- }
+<body>
+ <script>
+ (() => {
+ var htmlRoot = document.getElementById('htmlRoot');
+ var theme = window.localStorage.getItem('__APP__DARK__MODE__');
+ if (htmlRoot && theme) {
+ htmlRoot.setAttribute('data-theme', theme);
+ theme = htmlRoot = null;
+ }
+ })();
+ </script>
+ <div id="app">
+ <style>
+ html[data-theme='dark'] .app-loading {
+ background-color: #2c344a;
+ }
- .app-loading .app-loading-wrap {
- position: absolute;
- top: 50%;
- left: 50%;
- display: flex;
- transform: translate3d(-50%, -50%, 0);
- justify-content: center;
- align-items: center;
- flex-direction: column;
- }
+ html[data-theme='dark'] .app-loading .app-loading-title {
+ color: rgb(255 255 255 / 85%);
+ }
- .app-loading .dots {
- display: flex;
- padding: 98px;
- justify-content: center;
- align-items: center;
- }
+ .app-loading {
+ display: flex;
+ width: 100%;
+ height: 100%;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+ background-color: #f4f7f9;
+ }
- .app-loading .app-loading-title {
- display: flex;
- margin-top: 30px;
- font-size: 30px;
- color: rgb(0 0 0 / 85%);
- justify-content: center;
- align-items: center;
- }
+ .app-loading .app-loading-wrap {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ display: flex;
+ transform: translate3d(-50%, -50%, 0);
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+ }
- .app-loading .app-loading-logo {
- display: block;
- width: 90px;
- margin: 0 auto;
- margin-bottom: 20px;
- }
+ .app-loading .dots {
+ display: flex;
+ padding: 98px;
+ justify-content: center;
+ align-items: center;
+ }
- .dot {
- position: relative;
- display: inline-block;
- width: 48px;
- height: 48px;
- margin-top: 30px;
- font-size: 32px;
- transform: rotate(45deg);
- box-sizing: border-box;
- animation: antRotate 1.2s infinite linear;
- }
+ .app-loading .app-loading-title {
+ display: flex;
+ margin-top: 30px;
+ font-size: 30px;
+ color: rgb(0 0 0 / 85%);
+ justify-content: center;
+ align-items: center;
+ }
- .dot i {
- position: absolute;
- display: block;
- width: 20px;
- height: 20px;
- background-color: #0065cc;
- border-radius: 100%;
- opacity: 30%;
- transform: scale(0.75);
- animation: antSpinMove 1s infinite linear alternate;
- transform-origin: 50% 50%;
- }
+ .app-loading .app-loading-logo {
+ display: block;
+ width: 90px;
+ margin: 0 auto;
+ margin-bottom: 20px;
+ }
- .dot i:nth-child(1) {
- top: 0;
- left: 0;
- }
+ .dot {
+ position: relative;
+ display: inline-block;
+ width: 48px;
+ height: 48px;
+ margin-top: 30px;
+ font-size: 32px;
+ transform: rotate(45deg);
+ box-sizing: border-box;
+ animation: antRotate 1.2s infinite linear;
+ }
- .dot i:nth-child(2) {
- top: 0;
- right: 0;
- animation-delay: 0.4s;
- }
+ .dot i {
+ position: absolute;
+ display: block;
+ width: 20px;
+ height: 20px;
+ background-color: #0065cc;
+ border-radius: 100%;
+ opacity: 30%;
+ transform: scale(0.75);
+ animation: antSpinMove 1s infinite linear alternate;
+ transform-origin: 50% 50%;
+ }
- .dot i:nth-child(3) {
- right: 0;
- bottom: 0;
- animation-delay: 0.8s;
- }
+ .dot i:nth-child(1) {
+ top: 0;
+ left: 0;
+ }
- .dot i:nth-child(4) {
- bottom: 0;
- left: 0;
- animation-delay: 1.2s;
- }
- @keyframes antRotate {
- to {
- transform: rotate(405deg);
- }
+ .dot i:nth-child(2) {
+ top: 0;
+ right: 0;
+ animation-delay: 0.4s;
+ }
+
+ .dot i:nth-child(3) {
+ right: 0;
+ bottom: 0;
+ animation-delay: 0.8s;
+ }
+
+ .dot i:nth-child(4) {
+ bottom: 0;
+ left: 0;
+ animation-delay: 1.2s;
+ }
+
+ @keyframes antRotate {
+ to {
+ transform: rotate(405deg);
}
- @keyframes antRotate {
- to {
- transform: rotate(405deg);
- }
+ }
+
+ @keyframes antRotate {
+ to {
+ transform: rotate(405deg);
}
- @keyframes antSpinMove {
- to {
- opacity: 100%;
- }
+ }
+
+ @keyframes antSpinMove {
+ to {
+ opacity: 100%;
}
- @keyframes antSpinMove {
- to {
- opacity: 100%;
- }
+ }
+
+ @keyframes antSpinMove {
+ to {
+ opacity: 100%;
}
- </style>
- <div class="app-loading">
- <div class="app-loading-wrap">
- <img src="/resource/img/logo.svg" class="app-loading-logo"
alt="Logo" />
- <div class="app-loading-dots">
- <span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
- </div>
- <div class="app-loading-title"><%= title %></div>
+ }
+
+ </style>
+ <div class="app-loading">
+ <div class="app-loading-wrap">
+ <img src="/resource/img/logo.svg" class="app-loading-logo" alt="Logo"
/>
+ <div class="app-loading-dots">
+ <span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
+ </div>
+ <div class="app-loading-title">
+ <%= title %>
</div>
</div>
</div>
- <script type="module" src="/src/main.ts"></script>
- </body>
+ </div>
+ <script type="module" src="/src/main.ts"></script>
+</body>
+
</html>
diff --git
a/streampark-console/streampark-console-newui/public/resource/css/fonts.css
b/streampark-console/streampark-console-newui/public/resource/css/fonts.css
new file mode 100644
index 000000000..c103c0062
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/css/fonts.css
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* devanagari */
+@font-face {
+ font-family: 'Poppins';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(../fonts/devanagari-1.woff2) format('woff2');
+ unicode-range: U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200C-200D, U+20A8,
U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Poppins';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(../fonts/latin-ext-1.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB,
U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Poppins';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(../fonts/latin-1.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212,
U+2215, U+FEFF, U+FFFD;
+}
+/* devanagari */
+@font-face {
+ font-family: 'Poppins';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(../fonts/devanagari-2.woff2) format('woff2');
+ unicode-range: U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200C-200D, U+20A8,
U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Poppins';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(../fonts/latin-ext-2.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB,
U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Poppins';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(../fonts/latin-2.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212,
U+2215, U+FEFF, U+FFFD;
+}
+/* devanagari */
+@font-face {
+ font-family: 'Poppins';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(../fonts/devanagari-3.woff2) format('woff2');
+ unicode-range: U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200C-200D, U+20A8,
U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Poppins';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(../fonts/latin-ext-3.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB,
U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Poppins';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(../fonts/latin-3.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212,
U+2215, U+FEFF, U+FFFD;
+}
diff --git
a/streampark-console/streampark-console-newui/public/resource/fonts/devanagari-1.woff2
b/streampark-console/streampark-console-newui/public/resource/fonts/devanagari-1.woff2
new file mode 100644
index 000000000..3295a4cc9
Binary files /dev/null and
b/streampark-console/streampark-console-newui/public/resource/fonts/devanagari-1.woff2
differ
diff --git
a/streampark-console/streampark-console-newui/public/resource/fonts/devanagari-2.woff2
b/streampark-console/streampark-console-newui/public/resource/fonts/devanagari-2.woff2
new file mode 100644
index 000000000..7850aa30a
Binary files /dev/null and
b/streampark-console/streampark-console-newui/public/resource/fonts/devanagari-2.woff2
differ
diff --git
a/streampark-console/streampark-console-newui/public/resource/fonts/devanagari-3.woff2
b/streampark-console/streampark-console-newui/public/resource/fonts/devanagari-3.woff2
new file mode 100644
index 000000000..742e14424
Binary files /dev/null and
b/streampark-console/streampark-console-newui/public/resource/fonts/devanagari-3.woff2
differ
diff --git
a/streampark-console/streampark-console-newui/public/resource/fonts/latin-1.woff2
b/streampark-console/streampark-console-newui/public/resource/fonts/latin-1.woff2
new file mode 100644
index 000000000..b69e0091c
Binary files /dev/null and
b/streampark-console/streampark-console-newui/public/resource/fonts/latin-1.woff2
differ
diff --git
a/streampark-console/streampark-console-newui/public/resource/fonts/latin-2.woff2
b/streampark-console/streampark-console-newui/public/resource/fonts/latin-2.woff2
new file mode 100644
index 000000000..c6603368b
Binary files /dev/null and
b/streampark-console/streampark-console-newui/public/resource/fonts/latin-2.woff2
differ
diff --git
a/streampark-console/streampark-console-newui/public/resource/fonts/latin-3.woff2
b/streampark-console/streampark-console-newui/public/resource/fonts/latin-3.woff2
new file mode 100644
index 000000000..bf022fc77
Binary files /dev/null and
b/streampark-console/streampark-console-newui/public/resource/fonts/latin-3.woff2
differ
diff --git
a/streampark-console/streampark-console-newui/public/resource/fonts/latin-ext-1.woff2
b/streampark-console/streampark-console-newui/public/resource/fonts/latin-ext-1.woff2
new file mode 100644
index 000000000..c871a3e7f
Binary files /dev/null and
b/streampark-console/streampark-console-newui/public/resource/fonts/latin-ext-1.woff2
differ
diff --git
a/streampark-console/streampark-console-newui/public/resource/fonts/latin-ext-2.woff2
b/streampark-console/streampark-console-newui/public/resource/fonts/latin-ext-2.woff2
new file mode 100644
index 000000000..ba96dfd0f
Binary files /dev/null and
b/streampark-console/streampark-console-newui/public/resource/fonts/latin-ext-2.woff2
differ
diff --git
a/streampark-console/streampark-console-newui/public/resource/fonts/latin-ext-3.woff2
b/streampark-console/streampark-console-newui/public/resource/fonts/latin-ext-3.woff2
new file mode 100644
index 000000000..c1ee9a8c8
Binary files /dev/null and
b/streampark-console/streampark-console-newui/public/resource/fonts/latin-ext-3.woff2
differ
diff --git
a/streampark-console/streampark-console-newui/src/assets/icons/block.svg
b/streampark-console/streampark-console-newui/src/assets/icons/block.svg
new file mode 100644
index 000000000..64c6c4cf8
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/assets/icons/block.svg
@@ -0,0 +1,3 @@
+<svg width="200" height="200" viewBox="0 0 200 200"
xmlns="http://www.w3.org/2000/svg">
+ <path fill="currentColor"
d="M42.5,-66.2C57.1,-56.7,72.5,-48.4,81.1,-35.3C89.8,-22.2,91.8,-4.4,89.6,13C87.3,30.4,80.7,47.4,69.5,60.1C58.3,72.9,42.4,81.5,25.9,84.6C9.5,87.8,-7.4,85.4,-22.7,79.8C-37.9,74.1,-51.5,65.2,-60.9,53.3C-70.4,41.4,-75.8,26.6,-79,10.8C-82.1,-5,-83.1,-21.7,-77.7,-36.4C-72.4,-51,-60.7,-63.7,-46.7,-73.5C-32.7,-83.3,-16.4,-90.1,-1.2,-88.2C13.9,-86.3,27.8,-75.7,42.5,-66.2Z"
transform="translate(100 100)" />
+</svg>
diff --git
a/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-1.svg
b/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-1.svg
deleted file mode 100644
index e1553e50e..000000000
---
a/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-1.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 391.31
560.11"><defs><style>.cls-1{fill:#f9cdb7;}.cls-2{fill:#e2a78d;}.cls-3{fill:#213346;}.cls-4{fill:#bfe1ee;}.cls-5{fill:#dfe7ea;}.cls-6{fill:#b46078;}.cls-7{fill:#96426e;}.cls-8{fill:#fff;}.cls-9{fill:#fefdf5;}.cls-10{fill:#f4eae1;}.cls-11{fill:#f9637c;}.cls-12{fill:#ba4264;}.cls-13{fill:#b13a59;}</style></defs><title>Asset
15</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2"
data-name="Layer 1"><circle class="cls-1" cx= [...]
\ No newline at end of file
diff --git
a/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-2.svg
b/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-2.svg
deleted file mode 100644
index c4c172233..000000000
---
a/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-2.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 379.47
510.81"><defs><style>.cls-1{fill:#dfe7ea;}.cls-2{fill:#ceea57;}.cls-3{fill:#213346;}.cls-4{fill:#95bc4a;}.cls-5{fill:#bfe1ee;}.cls-11,.cls-6{fill:#fff;}.cls-7{fill:#f5a2c6;}.cls-8{fill:#d676a3;}.cls-9{fill:#f9637c;}.cls-10{fill:#cc3656;}.cls-11{opacity:0.5;}.cls-12{fill:#f6aecd;}.cls-13{fill:#86b9f8;}.cls-14{fill:#7662fa;}</style></defs><title>Asset
16</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2"
data-name="Layer [...]
\ No newline at end of file
diff --git
a/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-3.svg
b/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-3.svg
deleted file mode 100644
index 81145f9b4..000000000
---
a/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-3.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 391.79
532.35"><defs><style>.cls-1{fill:#f9cdb7;}.cls-2{fill:#e2a78d;}.cls-3{fill:#213346;}.cls-4{fill:#bfe1ee;}.cls-5{fill:#dfe7ea;}.cls-6{fill:#e99a4f;}.cls-7{fill:#ce7149;}.cls-8,.cls-9{fill:#fff;}.cls-9{opacity:0.5;}</style></defs><title>Asset
17</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2"
data-name="Layer 1"><circle class="cls-1" cx="345.9" cy="275.59"
r="41.4"/><path class="cls-2" d="M333.5,312.37a41.4,41.4,0,1,0 [...]
\ No newline at end of file
diff --git
a/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-4.svg
b/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-4.svg
deleted file mode 100644
index e586ed4e6..000000000
---
a/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-4.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 464.12
605.75"><defs><style>.cls-1{fill:#dfe7ea;}.cls-2{fill:#f0d7c2;}.cls-3{fill:#d7ad8c;}.cls-4{fill:#c4987a;}.cls-5{fill:#8376a5;}.cls-6{fill:#655a8e;}.cls-7{fill:#ebcbac;}.cls-16,.cls-8,.cls-9{fill:none;stroke:#42565e;stroke-miterlimit:10;}.cls-8{stroke-linecap:round;}.cls-8,.cls-9{stroke-width:10px;}.cls-9{stroke-linecap:square;}.cls-10{fill:#dcb79b;}.cls-11{fill:#fff;}.cls-12{fill:#40565a;}.cls-13{fill:#a699d6;}.cls-14{fill:#485d
[...]
\ No newline at end of file
diff --git
a/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-5.svg
b/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-5.svg
deleted file mode 100644
index 746e4b888..000000000
---
a/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-5.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 485.29
648.83"><defs><style>.cls-1{fill:#485d63;}.cls-2{fill:#dfe7ea;}.cls-3{fill:#f0d7c2;}.cls-4{fill:#e8bc70;}.cls-5{fill:#9e8863;}.cls-6{fill:#eace9b;}.cls-7{fill:#ebcbac;}.cls-8{fill:#d7ad8c;}.cls-9{fill:#fff;}.cls-10{fill:#ebdce8;}.cls-11,.cls-12,.cls-13,.cls-15,.cls-16{fill:none;stroke:#42565e;stroke-miterlimit:10;}.cls-11{stroke-linecap:square;}.cls-11,.cls-15,.cls-16{stroke-width:10px;}.cls-12,.cls-13{stroke-width:8px;}.cls-13,
[...]
\ No newline at end of file
diff --git
a/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-6.svg
b/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-6.svg
deleted file mode 100644
index b2432f225..000000000
---
a/streampark-console/streampark-console-newui/src/assets/icons/dynamic-avatar-6.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 586.2
682.51"><defs><style>.cls-1{fill:#dfe7ea;}.cls-2{fill:#b0d7e9;}.cls-3{fill:#54b9d3;}.cls-4{fill:#f2c7a5;}.cls-20,.cls-5{opacity:0.5;}.cls-6{fill:#ffac89;}.cls-14,.cls-7{fill:none;stroke-miterlimit:10;stroke-width:10px;}.cls-7{stroke:#274b5b;}.cls-20,.cls-8{fill:#ef997b;}.cls-9{fill:#fcdac3;}.cls-10{fill:#fff;}.cls-11{fill:#274b5b;}.cls-12{fill:#3b535c;}.cls-13{fill:#d9edf4;}.cls-14{stroke:#42565e;stroke-linecap:round;}.cls-15{fil
[...]
\ No newline at end of file
diff --git
a/streampark-console/streampark-console-newui/src/views/base/login/ForgetPasswordForm.vue
b/streampark-console/streampark-console-newui/src/views/base/login/ForgetPasswordForm.vue
deleted file mode 100644
index 5cc2698f8..000000000
---
a/streampark-console/streampark-console-newui/src/views/base/login/ForgetPasswordForm.vue
+++ /dev/null
@@ -1,80 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<template>
- <template v-if="getShow">
- <LoginFormTitle class="enter-x" />
- <Form class="p-4 enter-x" :model="formData" :rules="getFormRules"
ref="formRef">
- <FormItem name="account" class="enter-x">
- <Input
- size="large"
- v-model:value="formData.account"
- :placeholder="t('sys.login.userName')"
- />
- </FormItem>
-
- <FormItem name="mobile" class="enter-x">
- <Input size="large" v-model:value="formData.mobile"
:placeholder="t('sys.login.mobile')" />
- </FormItem>
- <FormItem name="sms" class="enter-x">
- <CountdownInput
- size="large"
- v-model:value="formData.sms"
- :placeholder="t('sys.login.smsCode')"
- />
- </FormItem>
-
- <FormItem class="enter-x">
- <Button type="primary" size="large" block @click="handleReset"
:loading="loading">
- {{ t('common.resetText') }}
- </Button>
- <Button size="large" block class="mt-4" @click="handleBackLogin">
- {{ t('sys.login.backSignIn') }}
- </Button>
- </FormItem>
- </Form>
- </template>
-</template>
-<script lang="ts" setup>
- import { reactive, ref, computed, unref } from 'vue';
- import LoginFormTitle from './LoginFormTitle.vue';
- import { Form, Input, Button } from 'ant-design-vue';
- import { CountdownInput } from '/@/components/CountDown';
- import { useI18n } from '/@/hooks/web/useI18n';
- import { useLoginState, useFormRules, LoginStateEnum } from './useLogin';
-
- const FormItem = Form.Item;
- const { t } = useI18n();
- const { handleBackLogin, getLoginState } = useLoginState();
- const { getFormRules } = useFormRules();
-
- const formRef = ref();
- const loading = ref(false);
-
- const formData = reactive({
- account: '',
- mobile: '',
- sms: '',
- });
-
- const getShow = computed(() => unref(getLoginState) ===
LoginStateEnum.RESET_PASSWORD);
-
- async function handleReset() {
- const form = unref(formRef);
- if (!form) return;
- await form.resetFields();
- }
-</script>
diff --git
a/streampark-console/streampark-console-newui/src/views/base/login/Login.vue
b/streampark-console/streampark-console-newui/src/views/base/login/Login.vue
index 0b2ad2e3e..bb8ad3bbe 100644
--- a/streampark-console/streampark-console-newui/src/views/base/login/Login.vue
+++ b/streampark-console/streampark-console-newui/src/views/base/login/Login.vue
@@ -15,25 +15,73 @@
limitations under the License.
-->
<template>
- <div :class="prefixCls" class="relative w-full h-full px-4">
- <div class="relative h-full">
- <div class="flex h-full">
- <div class="flex w-full h-full py-5 xl:h-auto xl:py-0 xl:my-0">
+ <div
+ class="w-full bg-light-200 relative section bg-gradient-primary pb-260px
md:pt-130px px-50px overflow-hidden"
+ >
+ <div class="overlay bg-gradient-primary !opacity-90 -z-1"></div>
+
+ <figure class="scribble scale-4 !opacity-10 top-50 left-0">
+ <SvgIcon name="block" class="text-secondary" :size="200" />
+ </figure>
+
+ <figure class="scribble scale-5 !opacity-10 top-50 left-0">
+ <SvgIcon name="block" class="text-secondary" :size="200" />
+ </figure>
+
+ <figure class="scribble scale-6 !opacity-10 top-50 left-0">
+ <SvgIcon name="block" class="text-secondary" :size="200" />
+ </figure>
+
+ <figure class="scribble scale-7 !opacity-10 top-50 left-0">
+ <SvgIcon name="block" class="text-secondary" :size="200" />
+ </figure>
+ <div class="container px-7 pb-2">
+ <Row :gutter="24">
+ <Col :md="12" :span="24" class="self-center pr-5 z-100 -enter-x">
+ <LoginSlogan />
+ </Col>
+ <Col :md="12" :span="24">
<div
:class="`${prefixCls}-form`"
- class="relative w-auto px-12 bg-[rgba(0,0,0,0.4)] py-5 mx-auto
my-auto shadow-md enter-y"
+ class="relative w-auto m-auto max-w-460px px-12
bg-[rgba(0,0,0,0.5)] rounded-5px py-5 shadow-2xl shadow-blue-500 enter-x z-100"
>
<LoginForm />
</div>
- </div>
- </div>
+ </Col>
+ </Row>
</div>
+
+ <figure class="absolute -bottom-1 left-0 right-0 top-auto text-light-200
mb-0 z-8">
+ <svg
+ class="waves"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ viewBox="0 24 150 28"
+ preserveAspectRatio="none"
+ shape-rendering="auto"
+ >
+ <defs>
+ <path
+ id="gentle-wave"
+ d="M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18
v44h-352z"
+ />
+ </defs>
+ <g class="parallax">
+ <use xlink:href="#gentle-wave" x="48" y="0"
fill="rgba(255,255,255,0.7" />
+ <use xlink:href="#gentle-wave" x="48" y="3"
fill="rgba(255,255,255,0.5)" />
+ <use xlink:href="#gentle-wave" x="48" y="5"
fill="rgba(255,255,255,0.3)" />
+ <use xlink:href="#gentle-wave" x="48" y="7" fill="#fff" />
+ </g>
+ </svg>
+ </figure>
</div>
</template>
<script lang="ts" setup>
import LoginForm from './LoginForm.vue';
+ import LoginSlogan from './LoginSlogan';
import { useDesign } from '/@/hooks/web/useDesign';
-
+ import { Row, Col } from 'ant-design-vue';
+ import { SvgIcon } from '/@/components/Icon';
defineProps({
sessionTimeout: {
type: Boolean,
@@ -55,122 +103,80 @@
box-shadow: inherit !important;
}
- .@{prefix-cls} {
- min-height: 100%;
- overflow: hidden;
- background: url('/@/assets/images/sign-bg.jpg') no-repeat 50%;
- background-size: cover;
-
- .ant-input-affix-wrapper {
- border: 1px solid rgba(@active-color, 0.55);
- border-radius: 1px;
- color: rgba(@active-color, 0.65);
- margin-top: 10px;
- background-color: rgba(@active-color, 0.05) !important;
- }
-
- .signin-title {
- padding-top: 20px;
- font-size: 16px;
- color: rgba(255, 255, 255, 0.65);
- margin-top: 12px;
- margin-bottom: 20px;
- }
-
- .logo {
- padding-top: 20px;
- height: 130px;
- margin: auto;
- }
-
- .signin-form {
- .ant-form-item-has-error
:not(.ant-input-disabled):not(.ant-input-borderless).ant-input {
- background-color: transparent !important;
- }
+ .bg-gradient-primary {
+ background-image: linear-gradient(
+ 130deg,
+ #0e18d2 15%,
+ #3172f5 40%,
+ #3172f5 60%,
+ #60cff2 100%
+ ) !important;
+ }
- .ant-input {
- padding-top: 3px;
- padding-bottom: 3px;
- color: @white;
+ .overlay {
+ border-radius: inherit;
+ height: 100%;
+ left: 0;
+ opacity: 0.5;
+ position: absolute;
+ top: 0;
+ width: 100%;
+ }
- .ant-input-affix-wrapper:hover,
- .ant-input:not(.ant-input-disabled) {
- border-color: rgba(@active-color, 0.95);
- }
- }
- .ant-input-password-icon {
- color: @content-bg !important;
- }
- .signin-btn {
- .ant-btn {
- margin-top: 30px;
- height: 40px;
- background: rgba(@active-color, 0.4);
- border: unset;
- }
- }
+ .@{prefix-cls}-form {
+ .ant-input {
+ padding-top: 3px;
+ padding-bottom: 3px;
- .text-left {
- .ant-btn {
- padding: 0px;
- }
+ .ant-input-affix-wrapper:hover,
+ .ant-input:not(.ant-input-disabled) {
+ border-color: rgba(@active-color, 0.95);
}
}
-
- &::after {
- content: '';
- width: 100%;
- position: absolute;
- left: 0;
- top: 0;
- bottom: -20px;
- background: inherit;
- z-index: 2;
- filter: blur(1px);
- }
-
- &-sign-in-way {
- .anticon {
- font-size: 22px;
- color: #888;
- cursor: pointer;
-
- &:hover {
- color: @primary-color;
- }
- }
+ .form-title {
+ font-family: Poppins, sans-serif !important;
}
-
- input {
- min-width: 300px;
- background: transparent;
- &:autofill {
- background: transparent;
- }
- @media (max-width: @screen-xl) {
- min-width: 260px;
- }
-
- @media (max-width: @screen-lg) {
- min-width: 200px;
- }
-
- @media (max-width: @screen-md) {
- min-width: 180px;
- }
-
- @media (max-width: @screen-sm) {
- min-width: 100px;
+ .text-left {
+ .ant-btn {
+ padding: 0px;
}
}
+ }
- .@{countdown-prefix-cls} input {
- min-width: unset;
+ .waves {
+ position: relative;
+ width: 100%;
+ height: 24vh;
+ margin-bottom: -7px; /* 修复 Safari 等浏览器下方空隙 */
+ min-height: 150px;
+ max-height: 280px;
+ width: 100%;
+ }
+ .parallax > use {
+ animation: move-forever 25s cubic-bezier(0.55, 0.5, 0.45, 0.5) infinite;
+ }
+ .parallax > use:nth-child(1) {
+ animation-delay: -2s;
+ animation-duration: 7s;
+ }
+ .parallax > use:nth-child(2) {
+ animation-delay: -3s;
+ animation-duration: 8s;
+ }
+ .parallax > use:nth-child(3) {
+ animation-delay: -4s;
+ animation-duration: 9s;
+ }
+ .parallax > use:nth-child(4) {
+ animation-delay: -5s;
+ animation-duration: 10s;
+ }
+ @keyframes move-forever {
+ 0% {
+ transform: translate3d(-90px, 0, 0);
}
-
- .ant-divider-inner-text {
- font-size: 12px;
- color: @text-color-secondary;
+ 100% {
+ transform: translate3d(85px, 0, 0);
}
}
</style>
diff --git
a/streampark-console/streampark-console-newui/src/views/base/login/LoginForm.vue
b/streampark-console/streampark-console-newui/src/views/base/login/LoginForm.vue
index e8b9b5a12..2e7866465 100644
---
a/streampark-console/streampark-console-newui/src/views/base/login/LoginForm.vue
+++
b/streampark-console/streampark-console-newui/src/views/base/login/LoginForm.vue
@@ -15,7 +15,12 @@
limitations under the License.
-->
<template>
- <LoginFormTitle v-show="getShow" class="enter-x mb-40px text-light-50" />
+ <div class="enter-x mb-20px text-light-50">
+ <div class="text-center enter-x">
+ <img class="logo w-140px mx-auto my-30px"
src="/@/assets/images/logo.png" />
+ <div class="text-4xl form-title">{{ title }}</div>
+ </div>
+ </div>
<Form
class="p-4 enter-x signin-form"
:model="formData"
@@ -28,6 +33,7 @@
<FormItem name="account" class="enter-x">
<Input
v-model:value="formData.account"
+ size="large"
:placeholder="t('sys.login.userName')"
class="fix-auto-fill"
>
@@ -39,6 +45,7 @@
<FormItem name="password" class="enter-x">
<InputPassword
visibilityToggle
+ size="large"
v-model:value="formData.password"
:placeholder="t('sys.login.password')"
>
@@ -47,8 +54,15 @@
</template>
</InputPassword>
</FormItem>
- <FormItem class="enter-x signin-btn">
- <Button type="primary" block @click="handleLogin" :loading="loading">
+ <FormItem class="enter-x">
+ <Button
+ type="primary"
+ class="my-10px"
+ size="large"
+ block
+ @click="handleLogin"
+ :loading="loading"
+ >
{{ loginText.buttonText }}
</Button>
</FormItem>
@@ -63,10 +77,10 @@
import { UserOutlined, LockOutlined } from '@ant-design/icons-vue';
import { Form, Input, Button } from 'ant-design-vue';
- import LoginFormTitle from './LoginFormTitle.vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { useMessage } from '/@/hooks/web/useMessage';
+ import { useGlobSetting } from '/@/hooks/setting';
import { useUserStore } from '/@/store/modules/user';
import {
@@ -86,6 +100,7 @@
const FormItem = Form.Item;
const InputPassword = Input.Password;
+ const { title } = useGlobSetting();
const { t } = useI18n();
const { createErrorModal, createMessage } = useMessage();
const { prefixCls } = useDesign('login');
diff --git
a/streampark-console/streampark-console-newui/src/views/base/login/LoginFormTitle.vue
b/streampark-console/streampark-console-newui/src/views/base/login/LoginFormTitle.vue
deleted file mode 100644
index e7c2dd61e..000000000
---
a/streampark-console/streampark-console-newui/src/views/base/login/LoginFormTitle.vue
+++ /dev/null
@@ -1,44 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<template>
- <div class="text-center enter-x">
- <img class="logo" src="/@/assets/images/logo.png">
- <div class="signin-title">
- StreamPark ── Make stream processing easier!
- </div>
- </div>
-</template>
-<script lang="ts" setup>
- import { computed, unref } from 'vue';
- import { useI18n } from '/@/hooks/web/useI18n';
- import { LoginStateEnum, useLoginState } from './useLogin';
-
- const { t } = useI18n();
-
- const { getLoginState } = useLoginState();
-
- const getFormTitle = computed(() => {
- const titleObj = {
- [LoginStateEnum.RESET_PASSWORD]: t('sys.login.forgetFormTitle'),
- [LoginStateEnum.LOGIN]: t('sys.login.signInFormTitle'),
- [LoginStateEnum.REGISTER]: t('sys.login.signUpFormTitle'),
- [LoginStateEnum.MOBILE]: t('sys.login.mobileSignInFormTitle'),
- [LoginStateEnum.QR_CODE]: t('sys.login.qrSignInFormTitle'),
- };
- return titleObj[unref(getLoginState)];
- });
-</script>
diff --git
a/streampark-console/streampark-console-newui/src/views/base/login/LoginSlogan.less
b/streampark-console/streampark-console-newui/src/views/base/login/LoginSlogan.less
new file mode 100644
index 000000000..d298fd386
--- /dev/null
+++
b/streampark-console/streampark-console-newui/src/views/base/login/LoginSlogan.less
@@ -0,0 +1,312 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+.scribble:not(.position-relative) {
+ position: absolute;
+}
+
+.scribble svg {
+ background: none !important;
+}
+
+.scale-2 svg {
+ transform: scale(2);
+}
+
+.scale-3 svg {
+ transform: scale(3);
+}
+
+.scale-4 svg {
+ transform: scale(4);
+}
+
+.scale-5 svg {
+ transform: scale(5);
+}
+
+.scale-6 svg {
+ transform: scale(6);
+}
+
+.scale-7 svg {
+ transform: scale(7);
+}
+
+.text-secondary {
+ color: #1d253d !important;
+}
+
+.animated-gradient-text_background {
+ position: relative;
+ display: block;
+ user-select: none;
+}
+
+.animated-gradient-text_background-1::before {
+ animation: animated-gradient-text_fade-background-1 8s infinite;
+}
+
+.animated-gradient-text_foreground-1 {
+ animation: animated-gradient-text_fade-foreground-1 8s infinite;
+}
+
+.animated-gradient-text_background-2::before {
+ animation: animated-gradient-text_fade-background-2 8s infinite;
+}
+
+.animated-gradient-text_foreground-2 {
+ animation: animated-gradient-text_fade-foreground-2 8s infinite;
+}
+
+.animated-gradient-text_foreground {
+ background-clip: text;
+ -webkit-text-fill-color: transparent;
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+ background-image: linear-gradient(90deg, var(--start-color),
var(--end-color));
+ position: relative;
+ z-index: 1;
+}
+
+.animated-gradient-text_background::before {
+ content: var(--content);
+ position: absolute;
+ display: block;
+ width: 100%;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 0;
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+@keyframes animated-gradient-text_fade-foreground-1 {
+
+ 0%,
+ 16.667%,
+ to {
+ opacity: 1;
+ }
+
+ 50% {
+ opacity: 0;
+ }
+}
+
+@keyframes animated-gradient-text_fade-background-1 {
+
+ 0%,
+ 16.667%,
+ to {
+ opacity: 0;
+ }
+
+ 50% {
+ opacity: 1;
+ }
+}
+
+@keyframes animated-gradient-text_fade-foreground-2 {
+
+ 0%,
+ to {
+ opacity: 0;
+ }
+
+ 50% {
+ opacity: 1;
+ }
+
+ 16.667%,
+ 66.667% {
+ opacity: 0;
+ }
+}
+
+@keyframes animated-gradient-text_fade-background-2 {
+
+ 0%,
+ to {
+ opacity: 1;
+ }
+
+ 50% {
+ opacity: 0;
+ }
+
+ 25%,
+ 58.333% {
+ opacity: 1;
+ }
+}
+
+.system_info {
+ font-family: Poppins, sans-serif !important;
+}
+
+@media only screen and (min-width: 576px) and (max-width: 767px) {
+ .system_info {
+ padding-top: 40px;
+ margin-bottom: 0;
+ }
+}
+
+@media only screen and (max-width: 575px) {
+ .system_info {
+ padding-top: 30px;
+ margin-bottom: 0;
+ }
+}
+
+.system_info .project_title {
+ font-size: 4.5875rem;
+ margin-bottom: 15px;
+ font-weight: bolder;
+ line-height: 6.5rem;
+}
+
+.system_info h5 {
+ font-weight: 500;
+ font-size: 1.1rem;
+ line-height: 2;
+ color: #333;
+}
+
+.text-bg {
+ background-clip: text;
+ -webkit-text-fill-color: transparent;
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+ background-image: linear-gradient(90deg, #007cf0, #00dfd8);
+}
+
+.streamx-btn {
+ color: #fff;
+ position: relative;
+ z-index: 1;
+ border: 2px solid transparent;
+ display: inline-block;
+ font-size: 0.875rem;
+ font-weight: 600;
+ padding: 1rem 1.5rem;
+ border-radius: 6px;
+ line-height: 1;
+ text-transform: uppercase;
+
+ &::before {
+ content: "";
+ position: absolute;
+ z-index: -1;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ display: inline-block;
+ transform: scaleX(0);
+ transform-origin: 51%;
+ transition-property: transform;
+ transition-duration: 0.3s;
+ border-radius: 6px;
+ border: none;
+ }
+
+ &.btn {
+ background-color: #2872ff; //
+ color: #fff;
+ border: 0;
+ max-width: 220px;
+ height: 45px;
+ position: relative;
+
+ &::before {
+ background: #0d6efd;
+ }
+
+ &:hover,
+ &:focus {
+ background-color: #588af2;
+ border: 0;
+ color: #fff;
+ }
+ }
+}
+
+.streamx-btn.btn-green:hover::before,
+.streamx-btn.btn:hover::before {
+ transform: scaleX(1);
+}
+
+.streamx-btn.btn-green {
+ background-color: #24a35a;
+}
+
+.streamx-btn.btn-green::before {
+ background: green;
+}
+
+.streamx-btn.btn-green:hover,
+.streamx-btn.btn-green:focus {
+ background-color: green;
+ border: 0;
+ color: #fff;
+}
+
+.streamx-btn.btn-purple::before {
+ background: #5e2ced;
+}
+
+.streamx-btn.btn-purple:hover,
+.streamx-btn.btn-purple:focus {
+ background: linear-gradient(-45deg, #5e2ced, #a485fd);
+ border: none;
+ color: #fff;
+}
+
+.shields img {
+ margin-right: 5px;
+}
+
+.badge {
+ border-radius: 30px 30px 30px 0;
+ display: inline-block;
+ font-size: 1rem;
+ line-height: 1;
+ padding: 0.25em 0.4em;
+ text-align: center;
+ vertical-align: initial;
+}
+
+.bg-secondary-home {
+ background-color: #1d253d !important;
+}
+
+.translate-top-1 {
+ transform: translate(0, -1rem);
+}
+
+.translate-bottom-1 {
+ transform: translate(0, 1rem);
+}
+
+.translate-top-2 {
+ transform: translate(0, -2rem);
+}
+
+.translate-bottom-2 {
+ transform: translate(0, 2rem);
+}
diff --git
a/streampark-console/streampark-console-newui/src/views/base/login/LoginSlogan.tsx
b/streampark-console/streampark-console-newui/src/views/base/login/LoginSlogan.tsx
new file mode 100644
index 000000000..e9e6060e4
--- /dev/null
+++
b/streampark-console/streampark-console-newui/src/views/base/login/LoginSlogan.tsx
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Tag } from 'ant-design-vue';
+import { defineComponent } from 'vue';
+import './LoginSlogan.less';
+import Icon from '/@/components/Icon';
+import { version } from '../../../../package.json';
+export default defineComponent({
+ name: 'LoginSlogan',
+ setup() {
+ return () => {
+ return (
+ <div className="!text-left mt-0">
+ <div className="mb-5 system_info pt-0">
+ <div className="project_title fw-bold text-white mb-3">
+ <div
+ className="animated-gradient-text_background
animated-gradient-text_background-1"
+ style={{
+ '--content': '"Apache"',
+ '--start-color': '#00DFD8',
+ '--end-color': '#FFF',
+ }}
+ >
+ <span className="animated-gradient-text_foreground
animated-gradient-text_foreground-1">
+ Apache
+ </span>
+ </div>
+ <div className="flex items-start">
+ <div
+ className="animated-gradient-text_background
animated-gradient-text_background-2"
+ style={{
+ '--content': '"StreamPark"',
+ '--start-color': '#FFF',
+ '--end-color': '#00DFD8',
+ }}
+ >
+ <span className="animated-gradient-text_foreground
animated-gradient-text_foreground-2">
+ StreamPark
+ </span>
+ </div>
+ <span className="badge bg-secondary-home text-xl
tag">Incubating</span>
+ </div>
+ </div>
+ <p className=" text-light-200 leading-40px" style={{ fontSize:
'20px' }}>
+ Make stream processing easier! easy-to-use streaming application
development framework
+ and operation platform
+ </p>
+ </div>
+ <div className="flex items-center mt-10">
+ <a
+ className="btn streamx-btn btn !flex items-center"
+ href="https://github.com/apache/incubator-streampark"
+ target="_blank"
+ >
+ <Icon icon="ant-design:github-filled"></Icon>
+ <div> GitHub</div>
+ </a>
+ <a
+ className="btn streamx-btn btn-green !flex items-center ml-10px"
+ href="https://streampark.apache.org/docs/intro"
+ target="_blank"
+ >
+ <Icon icon="carbon:document"></Icon>
+ <div> Document</div>
+ </a>
+ </div>
+
+ <div className="mt-20px shields z-3 flex items-center">
+ <img
+
src="https://img.shields.io/github/stars/apache/incubator-streampark.svg?sanitize=true"
+ className="wow fadeInUp"
+ ></img>
+ <img
+
src="https://img.shields.io/github/forks/apache/incubator-streampark.svg?sanitize=true"
+ className="wow fadeInUp"
+ ></img>
+ </div>
+ <div className="mt-20px shields z-3 flex items-center">
+ <Tag color="#477de9">Version: v{version}</Tag>
+ </div>
+ </div>
+ );
+ };
+ },
+});
diff --git
a/streampark-console/streampark-console-newui/src/views/base/login/MobileForm.vue
b/streampark-console/streampark-console-newui/src/views/base/login/MobileForm.vue
deleted file mode 100644
index 62820e0c1..000000000
---
a/streampark-console/streampark-console-newui/src/views/base/login/MobileForm.vue
+++ /dev/null
@@ -1,79 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<template>
- <template v-if="getShow">
- <LoginFormTitle class="enter-x" />
- <Form class="p-4 enter-x" :model="formData" :rules="getFormRules"
ref="formRef">
- <FormItem name="mobile" class="enter-x">
- <Input
- size="large"
- v-model:value="formData.mobile"
- :placeholder="t('sys.login.mobile')"
- class="fix-auto-fill"
- />
- </FormItem>
- <FormItem name="sms" class="enter-x">
- <CountdownInput
- size="large"
- class="fix-auto-fill"
- v-model:value="formData.sms"
- :placeholder="t('sys.login.smsCode')"
- />
- </FormItem>
-
- <FormItem class="enter-x">
- <Button type="primary" size="large" block @click="handleLogin"
:loading="loading">
- {{ t('sys.login.loginButton') }}
- </Button>
- <Button size="large" block class="mt-4" @click="handleBackLogin">
- {{ t('sys.login.backSignIn') }}
- </Button>
- </FormItem>
- </Form>
- </template>
-</template>
-<script lang="ts" setup>
- import { reactive, ref, computed, unref } from 'vue';
- import { Form, Input, Button } from 'ant-design-vue';
- import { CountdownInput } from '/@/components/CountDown';
- import LoginFormTitle from './LoginFormTitle.vue';
- import { useI18n } from '/@/hooks/web/useI18n';
- import { useLoginState, useFormRules, useFormValid, LoginStateEnum } from
'./useLogin';
-
- const FormItem = Form.Item;
- const { t } = useI18n();
- const { handleBackLogin, getLoginState } = useLoginState();
- const { getFormRules } = useFormRules();
-
- const formRef = ref();
- const loading = ref(false);
-
- const formData = reactive({
- mobile: '',
- sms: '',
- });
-
- const { validForm } = useFormValid(formRef);
-
- const getShow = computed(() => unref(getLoginState) ===
LoginStateEnum.MOBILE);
-
- async function handleLogin() {
- const data = await validForm();
- if (!data) return;
- console.log(data);
- }
-</script>
diff --git
a/streampark-console/streampark-console-newui/src/views/base/login/RegisterForm.vue
b/streampark-console/streampark-console-newui/src/views/base/login/RegisterForm.vue
deleted file mode 100644
index 7ea635ede..000000000
---
a/streampark-console/streampark-console-newui/src/views/base/login/RegisterForm.vue
+++ /dev/null
@@ -1,120 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<template>
- <template v-if="getShow">
- <LoginFormTitle class="enter-x" />
- <Form class="p-4 enter-x" :model="formData" :rules="getFormRules"
ref="formRef">
- <FormItem name="account" class="enter-x">
- <Input
- class="fix-auto-fill"
- size="large"
- v-model:value="formData.account"
- :placeholder="t('sys.login.userName')"
- />
- </FormItem>
- <FormItem name="mobile" class="enter-x">
- <Input
- size="large"
- v-model:value="formData.mobile"
- :placeholder="t('sys.login.mobile')"
- class="fix-auto-fill"
- />
- </FormItem>
- <FormItem name="sms" class="enter-x">
- <CountdownInput
- size="large"
- class="fix-auto-fill"
- v-model:value="formData.sms"
- :placeholder="t('sys.login.smsCode')"
- />
- </FormItem>
- <FormItem name="password" class="enter-x">
- <StrengthMeter
- size="large"
- v-model:value="formData.password"
- :placeholder="t('sys.login.password')"
- />
- </FormItem>
- <FormItem name="confirmPassword" class="enter-x">
- <InputPassword
- size="large"
- visibilityToggle
- v-model:value="formData.confirmPassword"
- :placeholder="t('sys.login.confirmPassword')"
- />
- </FormItem>
-
- <FormItem class="enter-x" name="policy">
- <!-- No logic, you need to deal with it yourself -->
- <Checkbox v-model:checked="formData.policy" size="small">
- {{ t('sys.login.policy') }}
- </Checkbox>
- </FormItem>
-
- <Button
- type="primary"
- class="enter-x"
- size="large"
- block
- @click="handleRegister"
- :loading="loading"
- >
- {{ t('sys.login.registerButton') }}
- </Button>
- <Button size="large" block class="mt-4 enter-x" @click="handleBackLogin">
- {{ t('sys.login.backSignIn') }}
- </Button>
- </Form>
- </template>
-</template>
-<script lang="ts" setup>
- import { reactive, ref, unref, computed } from 'vue';
- import LoginFormTitle from './LoginFormTitle.vue';
- import { Form, Input, Button, Checkbox } from 'ant-design-vue';
- import { StrengthMeter } from '/@/components/StrengthMeter';
- import { CountdownInput } from '/@/components/CountDown';
- import { useI18n } from '/@/hooks/web/useI18n';
- import { useLoginState, useFormRules, useFormValid, LoginStateEnum } from
'./useLogin';
-
- const FormItem = Form.Item;
- const InputPassword = Input.Password;
- const { t } = useI18n();
- const { handleBackLogin, getLoginState } = useLoginState();
-
- const formRef = ref();
- const loading = ref(false);
-
- const formData = reactive({
- account: '',
- password: '',
- confirmPassword: '',
- mobile: '',
- sms: '',
- policy: false,
- });
-
- const { getFormRules } = useFormRules(formData);
- const { validForm } = useFormValid(formRef);
-
- const getShow = computed(() => unref(getLoginState) ===
LoginStateEnum.REGISTER);
-
- async function handleRegister() {
- const data = await validForm();
- if (!data) return;
- console.log(data);
- }
-</script>
diff --git
a/streampark-console/streampark-console-newui/src/views/flink/app/Add.vue
b/streampark-console/streampark-console-newui/src/views/flink/app/Add.vue
index 07aa19f2f..97f058ba9 100644
--- a/streampark-console/streampark-console-newui/src/views/flink/app/Add.vue
+++ b/streampark-console/streampark-console-newui/src/views/flink/app/Add.vue
@@ -271,7 +271,10 @@
createMessage.warning('Flink Sql is required');
} else {
const access = await flinkSql?.value?.handleVerifySql();
- if (!access) return;
+ if (!access) {
+ createMessage.warning('SQL check error');
+ throw new Error(access);
+ }
}
}
if (formValue.jobType === 'customcode') {
@@ -295,8 +298,8 @@
const socketId = buildUUID();
ls.set('DOWN_SOCKET_ID', socketId);
Object.assign(param, { socketId });
- console.log('param', param);
const { data } = await fetchCreate(param as CreateParams);
+ submitLoading.value = false;
if (data.data) {
go('/flink/app');
} else {
diff --git
a/streampark-console/streampark-console-newui/src/views/flink/app/View.vue
b/streampark-console/streampark-console-newui/src/views/flink/app/View.vue
index f9bcf7028..4ea1855dc 100644
--- a/streampark-console/streampark-console-newui/src/views/flink/app/View.vue
+++ b/streampark-console/streampark-console-newui/src/views/flink/app/View.vue
@@ -145,15 +145,15 @@
optionApps[data.type].set(data.key, data.value);
}
- function handlePageDataReload() {
+ function handlePageDataReload(polling = false) {
nextTick(() => {
appDashboardRef.value?.handleDashboard(false);
- reload();
+ reload({ polling });
});
}
const { start, stop } = useTimeoutFn(() => {
if (!getLoading()) {
- handlePageDataReload();
+ handlePageDataReload(true);
}
start();
}, 2000);
diff --git
a/streampark-console/streampark-console-newui/src/views/flink/app/components/State.tsx
b/streampark-console/streampark-console-newui/src/views/flink/app/components/State.tsx
index 936586606..e61c6f487 100644
---
a/streampark-console/streampark-console-newui/src/views/flink/app/components/State.tsx
+++
b/streampark-console/streampark-console-newui/src/views/flink/app/components/State.tsx
@@ -32,7 +32,6 @@ const stateMap = {
8: { color: '#faad14', title: 'CANCELLING' },
9: { color: '#fa8c16', title: 'CANCELED' },
10: { color: '#1890ff', title: 'FINISHED' },
- 19: { color: '#1890ff', title: 'FINISHED' },
11: { color: '#722ed1', title: 'SUSPENDED' },
12: { color: '#eb2f96', title: 'RECONCILING', class:
'status-processing-reconciling' },
13: { color: '#000000', title: 'LOST' },
diff --git
a/streampark-console/streampark-console-newui/src/views/flink/app/components/flinkSql.vue
b/streampark-console/streampark-console-newui/src/views/flink/app/components/flinkSql.vue
index 5fe73489e..27d4afcba 100644
---
a/streampark-console/streampark-console-newui/src/views/flink/app/components/flinkSql.vue
+++
b/streampark-console/streampark-console-newui/src/views/flink/app/components/flinkSql.vue
@@ -79,6 +79,7 @@
});
const success = data.data === true || data.data === 'true';
if (success) {
+ vertifyRes.verified = true;
vertifyRes.errorMsg = '';
syntaxError();
return true;
@@ -93,7 +94,7 @@
vertifyRes.errorMsg = "SQL is not endWith ';'";
break;
default:
- vertifyRes.errorMsg = data.data.message;
+ vertifyRes.errorMsg = data.message;
break;
}
syntaxError();
@@ -104,7 +105,6 @@
return false;
}
}
- vertifyRes.verified = true;
}
async function syntaxError() {
@@ -112,7 +112,6 @@
if (editor) {
const model = editor.getModel();
const monaco = await getMonacoInstance();
-
if (vertifyRes.errorMsg) {
try {
monaco.editor.setModelMarkers(model, 'sql', [
diff --git
a/streampark-console/streampark-console-newui/src/views/flink/app/data/index.ts
b/streampark-console/streampark-console-newui/src/views/flink/app/data/index.ts
index 28bfd8897..17272eb5c 100644
---
a/streampark-console/streampark-console-newui/src/views/flink/app/data/index.ts
+++
b/streampark-console/streampark-console-newui/src/views/flink/app/data/index.ts
@@ -48,6 +48,7 @@ export const getAppColumns = (): BasicColumn[] => [
{ text: 'FAILED', value: '7' },
{ text: 'CANCELED', value: '9' },
{ text: 'FINISHED', value: '10' },
+ { text: 'SUSPENDED', value: '11' },
{ text: 'LOST', value: '13' },
{ text: 'SILENT', value: '17' },
{ text: 'TERMINATED', value: '18' },
diff --git
a/streampark-console/streampark-console-newui/src/views/flink/app/hooks/useAppTableAction.ts
b/streampark-console/streampark-console-newui/src/views/flink/app/hooks/useAppTableAction.ts
index e4d87a998..7616ad140 100644
---
a/streampark-console/streampark-console-newui/src/views/flink/app/hooks/useAppTableAction.ts
+++
b/streampark-console/streampark-console-newui/src/views/flink/app/hooks/useAppTableAction.ts
@@ -198,7 +198,7 @@ export const useAppTableAction = (
try {
await fetchAppRemove(app.id);
createMessage.success('delete successful');
- handlePageDataReload();
+ handlePageDataReload(false);
} catch (error) {
console.error(error);
} finally {
@@ -229,7 +229,7 @@ export const useAppTableAction = (
placeholder: 'Tags',
showSearch: true,
options: tagsOptions.value.map((t: Recordable) => ({ label: t,
value: t })),
- onChange: handlePageDataReload,
+ onChange: handlePageDataReload.bind(null, false),
},
},
{
@@ -242,7 +242,7 @@ export const useAppTableAction = (
options: users.value.map((u: Recordable) => {
return { label: u.nickName || u.username, value: u.userId };
}),
- onChange: handlePageDataReload,
+ onChange: handlePageDataReload.bind(null, false),
},
},
{
@@ -256,7 +256,7 @@ export const useAppTableAction = (
{ label: 'JAR', value: JobTypeEnum.JAR },
{ label: 'SQL', value: JobTypeEnum.SQL },
],
- onChange: handlePageDataReload,
+ onChange: handlePageDataReload.bind(null, false),
},
},
{
@@ -265,8 +265,8 @@ export const useAppTableAction = (
component: 'InputSearch',
componentProps: {
placeholder: 'Search',
- onChange: handlePageDataReload,
- onSearch: handlePageDataReload,
+ onChange: handlePageDataReload.bind(null, false),
+ onSearch: handlePageDataReload.bind(null, false),
},
},
],
diff --git
a/streampark-console/streampark-console-newui/src/views/flink/app/utils/index.ts
b/streampark-console/streampark-console-newui/src/views/flink/app/utils/index.ts
index ef09cfc85..cc2bd0e13 100644
---
a/streampark-console/streampark-console-newui/src/views/flink/app/utils/index.ts
+++
b/streampark-console/streampark-console-newui/src/views/flink/app/utils/index.ts
@@ -278,6 +278,6 @@ export function handleSubmitParams(
}
}
-export function filterOption(input, option) {
- return
option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase())
>= 0;
-}
+export const filterOption = (input: string, options: Recordable) => {
+ return options.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
+};
diff --git
a/streampark-console/streampark-console-newui/src/views/flink/project/useProject.ts
b/streampark-console/streampark-console-newui/src/views/flink/project/useProject.ts
index 7b5e45ae7..dec8b043a 100644
---
a/streampark-console/streampark-console-newui/src/views/flink/project/useProject.ts
+++
b/streampark-console/streampark-console-newui/src/views/flink/project/useProject.ts
@@ -20,9 +20,9 @@ import { computed, nextTick, reactive, ref, unref } from
'vue';
import { fetchBranches, getDetail, gitCheck, isExist } from
'/@/api/flink/project';
import { useForm } from '/@/components/Form';
import { useMessage } from '/@/hooks/web/useMessage';
-import { filterOption } from '../app/utils';
import { useRoute } from 'vue-router';
import { ProjectRecord } from '/@/api/flink/project/model/projectModel';
+import { filterOption } from '../app/utils';
export const useProject = () => {
const route = useRoute();
@@ -110,11 +110,15 @@ export const useProject = () => {
componentProps: ({ formModel }) => {
return {
showSearch: true,
- optionFilterProp: 'children',
filterOption,
placeholder: 'Select a branch',
options: unref(branchList),
- onClick: () => handleBranches(formModel),
+ onDropdownVisibleChange: (open: boolean) => {
+ console.log('open', open);
+ if (open) {
+ handleBranches(formModel);
+ }
+ },
};
},
},
@@ -193,7 +197,7 @@ export const useProject = () => {
if (branchList.value.length === 0) {
handleBranches(values);
}
- if (branchList.value.indexOf(values.branches) === -1) {
+ if (!branchList.value.find((v) => v.value == values.branches)) {
createErrorSwal(
'branch [' +
values.branches +
diff --git
a/streampark-console/streampark-console-webapp/src/views/system/user/UserAdd.vue
b/streampark-console/streampark-console-webapp/src/views/system/user/UserAdd.vue
index b40feb13c..9af83c04f 100644
---
a/streampark-console/streampark-console-webapp/src/views/system/user/UserAdd.vue
+++
b/streampark-console/streampark-console-webapp/src/views/system/user/UserAdd.vue
@@ -83,6 +83,7 @@
v-bind="formItemLayout">
<a-select
mode="single"
+ :getPopupContainer="(triggerNode) => triggerNode.parentNode"
:allow-clear="false"
style="width: 100%"
v-decorator="['userType',{rules: [{ required: true, message: 'please
select user type' }]}]">