feat: 完善整体交互细节

develop2
donghao
parent 8a56fb2946
commit 8bc9c4ff8e

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 67 KiB

File diff suppressed because one or more lines are too long

@ -3,7 +3,7 @@
"meta": { "g": "LottieFiles AE 3.5.3", "a": "", "k": "", "d": "", "tc": "" },
"fr": 25,
"ip": 0,
"op": 35,
"op": 20,
"w": 400,
"h": 400,
"nm": "合成 1",
@ -30,23 +30,23 @@
"a": 1,
"k": [
{
"i": { "x": [0.667], "y": [1] },
"o": { "x": [0.333], "y": [0] },
"t": 10,
"i": { "x": [0.659], "y": [0.843] },
"o": { "x": [0.391], "y": [0] },
"t": 0,
"s": [100]
},
{
"i": { "x": [0.614], "y": [0.991] },
"o": { "x": [0.333], "y": [0] },
"t": 20,
"s": [60]
"i": { "x": [0.6], "y": [0.927] },
"o": { "x": [0.283], "y": [-0.13] },
"t": 10,
"s": [0]
},
{ "t": 35, "s": [10] }
{ "t": 20, "s": [100] }
],
"ix": 11
},
"r": { "a": 0, "k": 0, "ix": 10 },
"p": { "a": 0, "k": [72.25, 242.625, 0], "ix": 2 },
"p": { "a": 0, "k": [72.25, 240.125, 0], "ix": 2 },
"a": { "a": 0, "k": [-178.25, 16.625, 0], "ix": 1 },
"s": { "a": 0, "k": [100, 100, 100], "ix": 6 }
},
@ -68,7 +68,7 @@
"ty": "fl",
"c": {
"a": 0,
"k": [0.321568627451, 0.76862745098, 0.101960784314, 1],
"k": [0.909803921569, 0.050980392157, 0.050980392157, 1],
"ix": 4
},
"o": { "a": 0, "k": 100, "ix": 5 },
@ -99,9 +99,9 @@
"hd": false
}
],
"ip": 10,
"op": 35,
"st": 0,
"ip": 5,
"op": 20,
"st": -10,
"bm": 0
},
{
@ -115,23 +115,23 @@
"a": 1,
"k": [
{
"i": { "x": [0.667], "y": [1] },
"o": { "x": [0.333], "y": [0] },
"t": 5,
"i": { "x": [0.659], "y": [0.843] },
"o": { "x": [0.391], "y": [0] },
"t": 0,
"s": [100]
},
{
"i": { "x": [0.584], "y": [1.02] },
"o": { "x": [0.333], "y": [0] },
"t": 15,
"s": [60]
"i": { "x": [0.6], "y": [0.927] },
"o": { "x": [0.283], "y": [-0.13] },
"t": 10,
"s": [0]
},
{ "t": 30, "s": [10] }
{ "t": 20, "s": [100] }
],
"ix": 11
},
"r": { "a": 0, "k": 0, "ix": 10 },
"p": { "a": 0, "k": [46.75, 229.125, 0], "ix": 2 },
"p": { "a": 0, "k": [46.75, 226.625, 0], "ix": 2 },
"a": { "a": 0, "k": [-178.25, 16.625, 0], "ix": 1 },
"s": { "a": 0, "k": [100, 100, 100], "ix": 6 }
},
@ -153,7 +153,7 @@
"ty": "fl",
"c": {
"a": 0,
"k": [0.321568627451, 0.76862745098, 0.101960784314, 1],
"k": [0.909803921569, 0.050980392157, 0.050980392157, 1],
"ix": 4
},
"o": { "a": 0, "k": 100, "ix": 5 },
@ -184,9 +184,9 @@
"hd": false
}
],
"ip": 5,
"op": 35,
"st": 0,
"ip": 2,
"op": 20,
"st": -5,
"bm": 0
},
{
@ -200,23 +200,23 @@
"a": 1,
"k": [
{
"i": { "x": [0.667], "y": [1] },
"o": { "x": [0.333], "y": [0] },
"i": { "x": [0.659], "y": [0.843] },
"o": { "x": [0.391], "y": [0] },
"t": 0,
"s": [100]
},
{
"i": { "x": [0.556], "y": [0.988] },
"o": { "x": [0.333], "y": [0] },
"i": { "x": [0.6], "y": [0.927] },
"o": { "x": [0.283], "y": [-0.13] },
"t": 10,
"s": [60]
"s": [0]
},
{ "t": 25, "s": [10] }
{ "t": 20, "s": [100] }
],
"ix": 11
},
"r": { "a": 0, "k": 0, "ix": 10 },
"p": { "a": 0, "k": [21.75, 214.125, 0], "ix": 2 },
"p": { "a": 0, "k": [21.75, 211.625, 0], "ix": 2 },
"a": { "a": 0, "k": [-178.25, 16.625, 0], "ix": 1 },
"s": { "a": 0, "k": [100, 100, 100], "ix": 6 }
},
@ -238,7 +238,7 @@
"ty": "fl",
"c": {
"a": 0,
"k": [0.321568627451, 0.76862745098, 0.101960784314, 1],
"k": [0.909803921569, 0.050980392157, 0.050980392157, 1],
"ix": 4
},
"o": { "a": 0, "k": 100, "ix": 5 },
@ -270,13 +270,13 @@
}
],
"ip": 0,
"op": 35,
"op": 20,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 4,
"ind": 5,
"ty": 2,
"nm": "Group 427319515.png",
"cl": "png",
@ -291,7 +291,7 @@
},
"ao": 0,
"ip": 0,
"op": 75,
"op": 21,
"st": 0,
"bm": 0
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 KiB

@ -22,9 +22,8 @@
z-index: 999;
width: calc(100vw - 200px);
min-width: 100px;
height: 50px;
padding: 0 24px 0 20px;
background-color: #f8fafd;
height: 64px;
padding: 0 24px;
}
.app_page_wrap .page_body .body_nav_bar .avatar_box > img {
width: 40px;
@ -32,7 +31,7 @@
border-radius: 50%;
}
.app_page_wrap .page_body .body_content {
padding-top: 50px;
padding-top: 64px;
}
.ant-pro-layout .ant-pro-layout-content {
position: relative;

@ -21,10 +21,9 @@
z-index: 999;
width: calc(100vw - 200px);
min-width: 100px;
height: 50px;
padding: 0 24px 0 20px;
background-color: #f8fafd;
height: 64px;
padding: 0 24px;
// background-color: #f8fafd;
.avatar_box {
& > img {
width: 40px;
@ -34,7 +33,7 @@
}
}
.body_content {
padding-top: 50px;
padding-top: 64px;
}
}
}

@ -48,6 +48,9 @@
.primary_border {
border: 1px solid #154ddd;
}
.box_shadow_1 {
box-shadow: 0px 4px 8px 0px rgba(0, 79, 178, 0.15);
}
/* 特殊字体 */
@font-face {
font-weight: normal;
@ -175,6 +178,27 @@
background: #f5f5f5;
border: none;
}
/* 表单组件 */
.ant-input-outlined.ant-input-disabled:hover:not([disabled]),
.ant-input-outlined[disabled]:hover:not([disabled]),
.ant-select-outlined.ant-select-disabled:not(.ant-select-customize-input) .ant-select-selector {
background-color: #fafafa;
border-color: #d9d9d9;
}
.anticon.anticon-down.ant-dropdown-trigger.ant-transfer-list-header-dropdown.__web-inspector-hide-shortcut__,
.anticon.anticon-down.ant-dropdown-trigger.ant-transfer-list-header-dropdown {
display: none;
}
:where(.css-dev-only-do-not-override-1y19ift).ant-pro-steps-form-container {
min-width: 100%;
}
.ant-transfer {
color: #333333;
}
.ant-transfer .ant-transfer-list-header {
color: #333333;
background: rgba(21, 77, 221, 0.1);
}
.ant-tag {
height: 24px;
line-height: 22px;
@ -289,6 +313,7 @@
/* 分类更新 */
.gn_categorize_update .ant-form-item-label {
margin-top: 4px;
font-weight: bold;
}
/* Descriptions 描述展示 */
.gn_descriptions {
@ -296,7 +321,6 @@
background: #ffffff;
border: 1px solid rgba(21, 77, 221, 0.1);
border-radius: 4px;
box-shadow: 0px 4px 8px 0px rgba(0, 79, 178, 0.15);
}
.gn_descriptions .ant-descriptions-item-label {
color: #333333;
@ -323,6 +347,9 @@
.gn_tabs.ant-tabs .ant-tabs-tab {
color: #666666;
}
.gn_tabs.ant-tabs-top > .ant-tabs-nav::before {
border-bottom: 1px solid #E0E0E0;
}
/* table [ProTable ProList] */
.gn_pro_table .ant-table-wrapper .ant-table-thead > tr > th,
.gn_pro_table .ant-table-wrapper .ant-table-thead > tr > td {
@ -492,13 +519,15 @@
align-items: center;
justify-content: start;
height: 56px;
padding: 0 16px;
padding: 0;
}
.gn_model_steps_form .ant-modal-content .ant-modal-body .ant-steps .ant-steps-item .ant-steps-item-icon {
margin: 0;
font-size: 16px;
margin-inline-start: 16px;
}
.gn_model_steps_form .ant-modal-content .ant-modal-body .ant-steps .ant-steps-item .ant-steps-item-content {
width: calc(100% - 65px - 16px);
margin: 0;
margin-left: 8px;
text-align: left;
@ -582,3 +611,11 @@
margin: 0;
padding: 24px 0 !important;
}
.gn_scroll_list_wrap {
margin: 0 -8px;
padding: 4px 8px;
overflow-y: scroll;
}
.gn_scroll_list_wrap .ant-list .ant-list-pagination {
margin: 8px 0;
}

@ -65,6 +65,11 @@
border: 1px solid @primary_color;
}
// 阴影
.box_shadow_1 {
box-shadow: 0px 4px 8px 0px rgba(0, 79, 178, 0.15);
}
/* 特殊字体 */
@font-face {
font-weight: normal;
@ -202,6 +207,31 @@
}
}
/* 表单组件 */
// 表单禁用
.ant-input-outlined.ant-input-disabled:hover:not([disabled]),
.ant-input-outlined[disabled]:hover:not([disabled]),
.ant-select-outlined.ant-select-disabled:not(.ant-select-customize-input) .ant-select-selector {
background-color: #fafafa;
border-color: #d9d9d9;
}
// 穿梭框下拉隐藏
.anticon.anticon-down.ant-dropdown-trigger.ant-transfer-list-header-dropdown.__web-inspector-hide-shortcut__,
.anticon.anticon-down.ant-dropdown-trigger.ant-transfer-list-header-dropdown {
display: none;
}
:where(.css-dev-only-do-not-override-1y19ift).ant-pro-steps-form-container {
min-width: 100%;
}
.ant-transfer {
color: @text_color_1;
.ant-transfer-list-header {
color: @text_color_1;
background: rgba(21, 77, 221, 0.1);
}
}
// 标签
.ant-tag {
height: 24px;
@ -353,6 +383,7 @@
.gn_categorize_update {
.ant-form-item-label {
margin-top: 4px;
font-weight: bold;
}
}
@ -362,7 +393,6 @@
background: #ffffff;
border: 1px solid rgba(21, 77, 221, 0.1);
border-radius: 4px;
box-shadow: 0px 4px 8px 0px rgba(0, 79, 178, 0.15);
.ant-descriptions-item-label {
color: @text_color_1;
font-weight: bold;
@ -395,6 +425,9 @@
&.ant-tabs .ant-tabs-tab {
color: @text_color_2;
}
&.ant-tabs-top > .ant-tabs-nav::before {
border-bottom: 1px solid #e0e0e0;
}
}
/* table [ProTable ProList] */
@ -473,21 +506,6 @@
background-repeat: no-repeat;
background-position: top;
background-size: 100%;
// background: linear-gradient(to bottom, transparent 0%, white 100px, white 100%),
// /* 底部白色背景 */
// linear-gradient(
// to left,
// #fff 0%,
// #ccdbff 40%,
// /* 第一个从左到右的渐变 */ #fff 40%,
// #dbe6ff 45%,
// /* 第二个从左到右的渐变 */ #fff 45%,
// #e0e9ff 68%,
// /* 第三个从左到右的渐变 */ #e0e9ff 68%,
// #e0e9ff 100%
// )
// // /* 第二个从左到右的渐变 */ linear-gradient(to right, white, gray) 0 80% / 100% 20%,
// // /* 第三个从左到右的渐变 */ linear-gradient(to right, orange, brown) 0 100% / 100% 20%;;
}
.ant-pro-card {
background: transparent;
@ -614,14 +632,16 @@
align-items: center;
justify-content: start;
height: 56px;
padding: 0 16px;
padding: 0;
}
.ant-steps-item-icon {
margin: 0;
font-size: 16px;
margin-inline-start: 16px;
}
.ant-steps-item-content {
width: calc(100% - 65px - 16px);
margin: 0;
margin-left: 8px;
text-align: left;
@ -723,3 +743,13 @@
margin: 0;
padding: 24px 0 !important;
}
// 滚动区域
.gn_scroll_list_wrap {
margin: 0 -8px;
padding: 4px 8px;
overflow-y: scroll;
.ant-list .ant-list-pagination {
margin: 8px 0;
}
}

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-07 14:02:00
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-16 15:26:58
* @LastEditTime: 2024-05-21 15:22:05
* @FilePath: \general-ai-manage\src\components\CategorizeUpdate\index.tsx
* @Description:
* @
@ -27,7 +27,7 @@ type CategorizeUpdateProps = {
const tagInputStyle: React.CSSProperties = {
width: 64,
height: 22,
height: 24,
marginInlineEnd: 8,
verticalAlign: 'top',
};
@ -103,7 +103,7 @@ const CategorizeUpdate: React.FC<CategorizeUpdateProps> = (props) => {
};
const tagPlusStyle: React.CSSProperties = {
height: 22,
height: 24,
background: '#FFFFFF',
border: '1px solid #154DDD',
color: '#154DDD',

@ -79,4 +79,28 @@
.menu_bottom {
width: 96px;
}
.footer_back {
width: 168px;
height: 40px;
color: @primary_color;
font-weight: bold;
font-size: 14px;
background: #cbd9fd;
border: 1px solid @primary_color;
border-radius: 24px 24px 24px 24px;
.iconfont {
padding-top: 2px;
}
}
.business_log_box {
width: 176px;
height: 48px;
img {
width: 32px;
height: 32px;
// line-height: 48px;
}
}
}

@ -2,13 +2,13 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-03-27 16:03:20
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-15 15:41:57
* @LastEditTime: 2024-05-21 16:59:57
* @FilePath: \general-ai-manage\src\components\Header\index.tsx
* @Description: layout
*/
import { useBusinessInfo } from '@/hooks/useBusinessInfo';
import { FormattedMessage, history } from '@umijs/max';
import { ReactComponent as BusinessLogoIcon } from '/public/home/business_logo.svg';
import businessLogoIcon from '/public/home/business_logo.svg';
import type { MenuProps } from 'antd';
@ -104,16 +104,16 @@ const MenuBar: React.FC<MenuBarProps> = ({ menuData, changeMenu }) => {
<div className="flex flex-col items-center justify-between menubar_wrap">
<div>
<div
className="flex items-center justify-center menu_top"
className="flex items-center pl-[12px] menu_top"
onClick={() => {
history.replace('/');
}}
>
<BusinessBigLogo></BusinessBigLogo>
</div>
<div className="flex items-center justify-center mx-[12px] mt-[16px] mb-[12px] p-[4px] bg-[#154DDD1a] text-[#154DDD] rounded-[8px] text-[14px]">
<BusinessLogoIcon></BusinessLogoIcon>
<span className="pl-[8px]">{getStoreBusinessInfo()?.name}</span>
<div className="business_log_box flex items-center justify-center mx-[12px] mt-[16px] px-[10px] mb-[12px] font-bold bg-[#154DDD1a] text-[#154DDD] rounded-[8px] text-[14px]">
<img src={businessLogoIcon} />
<span className="pl-[8px] flex flex-1">{getStoreBusinessInfo()?.name}</span>
</div>
</div>
@ -137,6 +137,7 @@ const MenuBar: React.FC<MenuBarProps> = ({ menuData, changeMenu }) => {
</li>
))}
</ul>
{/* <Menu
mode="inline"
selectedKeys={selectedMenu}
@ -155,6 +156,15 @@ const MenuBar: React.FC<MenuBarProps> = ({ menuData, changeMenu }) => {
))}
</Menu> */}
</div>
<div
className="flex items-center justify-center footer_back mb-[24px]"
onClick={() => {
history.replace('/');
}}
>
<i className="iconfont icon-fanhui text-[16px] "></i>
<span className="pl-[8px]"></span>
</div>
</div>
);
};

@ -81,7 +81,9 @@ ol {
/* 限制显示的行数 */
}
.ant-pro-layout .ant-pro-layout-bg-list {
background: #f8fafd;
background-image: url('../public/images/common/body_bg.png');
background-repeat: no-repeat;
background-size: cover;
}
::-webkit-scrollbar-track-piece {
-webkit-border-radius: 0;

@ -95,7 +95,10 @@ ol {
}
.ant-pro-layout .ant-pro-layout-bg-list {
background: #f8fafd;
// background: #f8fafd;
background-image: url('../public/images/common/body_bg.png');
background-repeat: no-repeat;
background-size: cover;
}
// 美化滚动条

@ -1,101 +1,113 @@
@font-face {
font-family: 'iconfont';
font-family: "iconfont";
/* Project id 4530966 */
src: url('//at.alicdn.com/t/c/font_4530966_zyyfefdavpo.woff2?t=1715586941725') format('woff2'), url('//at.alicdn.com/t/c/font_4530966_zyyfefdavpo.woff?t=1715586941725') format('woff'), url('//at.alicdn.com/t/c/font_4530966_zyyfefdavpo.ttf?t=1715586941725') format('truetype');
src: url('//at.alicdn.com/t/c/font_4530966_63ch463u1o5.woff2?t=1716257643893') format('woff2'), url('//at.alicdn.com/t/c/font_4530966_63ch463u1o5.woff?t=1716257643893') format('woff'), url('//at.alicdn.com/t/c/font_4530966_63ch463u1o5.ttf?t=1716257643893') format('truetype');
}
.iconfont {
font-family: 'iconfont' !important;
font-family: "iconfont" !important;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-fanhui:before {
content: "\e71f";
}
.icon-fuzhi1:before {
content: "\e71e";
}
.icon-yiwancheng-011:before {
content: "\e71d";
}
.icon-yiwancheng-01:before {
content: "\e71c";
}
.icon-moxingliebiao-weixuan:before {
content: "\e709";
}
.icon-moxingliebiao-xuanzhong:before {
content: "\e71b";
}
.icon-fuzhi:before {
content: '\e719';
content: "\e719";
}
.icon-zip:before {
content: '\e71a';
content: "\e71a";
}
.icon-shangchuanwenjian:before {
content: '\e718';
content: "\e718";
}
.icon-you:before {
content: '\e717';
content: "\e717";
}
.icon-delete:before {
content: '\e716';
content: "\e716";
}
.icon-tianjiafenlei:before {
content: '\e714';
content: "\e714";
}
.icon-shanchufenlei:before {
content: '\e715';
content: "\e715";
}
.icon-tianjiajiedian:before {
content: '\e713';
content: "\e713";
}
.icon-banbenxinxi:before {
content: '\e711';
content: "\e711";
}
.icon-shiyonghangye:before {
content: '\e712';
content: "\e712";
}
.icon-jiedianshezhi:before {
content: '\e70f';
content: "\e70f";
}
.icon-fuwuqizhuangtai:before {
content: '\e710';
content: "\e710";
}
.icon-yewumoxing:before {
content: '\e70b';
content: "\e70b";
}
.icon-shouye:before {
content: '\e70c';
content: "\e70c";
}
.icon-shebeizhuangtai:before {
content: '\e70d';
content: "\e70d";
}
.icon-qiyexinxi:before {
content: '\e70e';
}
.icon-moxingliebiao-unselected:before {
content: '\e709';
content: "\e70e";
}
.icon-moxingyunhangku-selected:before {
content: '\e70a';
content: "\e70a";
}
.icon-wen:before {
content: '\e704';
content: "\e704";
}
.icon-xia:before {
content: '\e705';
}
.icon-moxingliebiao-selected:before {
content: '\e706';
content: "\e705";
}
.icon-moxingyunhangku-unselected:before {
content: '\e707';
content: "\e707";
}
.icon-close:before {
content: '\e708';
content: "\e708";
}
.icon-moxingshuliang:before {
content: '\e6fd';
content: "\e6fd";
}
.icon-shebeishuliang:before {
content: '\e6fe';
content: "\e6fe";
}
.icon-xinjian:before {
content: '\e6ff';
content: "\e6ff";
}
.icon-gengduo:before {
content: '\e700';
content: "\e700";
}
.icon-chuangjianshijian:before {
content: '\e701';
content: "\e701";
}
.icon-search:before {
content: '\e702';
content: "\e702";
}
.icon-refresh:before {
content: '\e703';
content: "\e703";
}

@ -1,18 +1,42 @@
@font-face {
font-family: 'iconfont'; /* Project id 4530966 */
src: url('//at.alicdn.com/t/c/font_4530966_zyyfefdavpo.woff2?t=1715586941725') format('woff2'),
url('//at.alicdn.com/t/c/font_4530966_zyyfefdavpo.woff?t=1715586941725') format('woff'),
url('//at.alicdn.com/t/c/font_4530966_zyyfefdavpo.ttf?t=1715586941725') format('truetype');
src: url('//at.alicdn.com/t/c/font_4530966_63ch463u1o5.woff2?t=1716257643893') format('woff2'),
url('//at.alicdn.com/t/c/font_4530966_63ch463u1o5.woff?t=1716257643893') format('woff'),
url('//at.alicdn.com/t/c/font_4530966_63ch463u1o5.ttf?t=1716257643893') format('truetype');
}
.iconfont {
// font-size: 16px;
font-family: 'iconfont' !important;
// font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-fanhui:before {
content: '\e71f';
}
.icon-fuzhi1:before {
content: '\e71e';
}
.icon-yiwancheng-011:before {
content: '\e71d';
}
.icon-yiwancheng-01:before {
content: '\e71c';
}
.icon-moxingliebiao-weixuan:before {
content: '\e709';
}
.icon-moxingliebiao-xuanzhong:before {
content: '\e71b';
}
.icon-fuzhi:before {
content: '\e719';
}
@ -77,10 +101,6 @@
content: '\e70e';
}
.icon-moxingliebiao-unselected:before {
content: '\e709';
}
.icon-moxingyunhangku-selected:before {
content: '\e70a';
}
@ -93,10 +113,6 @@
content: '\e705';
}
.icon-moxingliebiao-selected:before {
content: '\e706';
}
.icon-moxingyunhangku-unselected:before {
content: '\e707';
}

@ -2,7 +2,7 @@
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-01 13:56:33
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-04-09 16:09:35
* @LastEditTime: 2024-05-21 14:53:14
* @FilePath: \general-ai-platform-web\src\locales\zh-CN\common.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
@ -52,4 +52,5 @@ export default {
'common.okText': '确认',
'common.cancelText': '取消',
'common.form.required': '此项为必填项',
'common.empty': '无',
};

@ -309,10 +309,19 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
>
<ProFormUploadDragger
label={<span className="font-bold"></span>}
title={
<div className="gn_uploadfile_title py-[16px] text1 text-center">
<span></span>
<a></a>
</div>
}
description=""
icon={<i className="iconfont icon-shangchuanwenjian text_primary text-[32px]"></i>}
name="projectFilePath"
action="/api/v1/file/uploadFile"
max={1}
fieldProps={{
className: 'gn_proFormUploadDragger_formItem',
name: 'file',
// beforeUpload: beforeUploadFile,
data: { path: `models/${Date.now()}` },
@ -322,7 +331,9 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
},
}}
/>
<div style={{ color: '#666666' }}>zip.tar.gz</div>
<div style={{ color: '#666666', margin: '-8px 0 16px' }}>
zip.tar.gz
</div>{' '}
</StepsForm.StepForm>
{/* 参数配置 */}
<StepsForm.StepForm<{
@ -368,9 +379,18 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
width={proFormMaxItemStyleProps.width}
max={1}
label={<span className="font-bold"></span>}
title={
<div className="gn_uploadfile_title py-[16px] text1 text-center">
<span></span>
<a></a>
</div>
}
description=""
icon={<i className="iconfont icon-shangchuanwenjian text_primary text-[32px]"></i>}
value={fileList}
name="dragger"
fieldProps={{
className: 'gn_proFormUploadDragger_formItem',
onChange: handleFileChange,
onRemove: () => {
let index_ids = actionFormListRef.current?.getList()?.map((v, i) => {
@ -418,16 +438,18 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
},
}}
/>
<div style={{ color: '#666666', margin: '-8px 0 16px' }}>
zip.tar.gz
</div>
{/* // TODO label字重与上面统一, 操作按钮需要与输入框对齐 */}
<ProFormList
name="params"
label={
<div>
<span className="font-bold"></span>
<p style={{ color: '#666666' }}>
<div style={{ color: '#333333', padding: '8px 0 4px' }}>
~
</p>
</div>
</div>
}
actionRef={actionFormListRef}
@ -439,8 +461,8 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
{() => {
return (
<>
<ProFormText key="name" name="name" label="键名" />
<ProFormText key="default" name="default" label="默认值" />
<ProFormText width={408} key="name" name="name" label="键名" />
<ProFormText width={408} key="default" name="default" label="默认值" />
</>
);
}}

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-08 16:57:30
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-10 15:12:44
* @LastEditTime: 2024-05-22 16:52:38
* @FilePath: \general-ai-manage\src\pages\Project\BusinessProject\components\detailDeviceState.tsx
* @Description:
* @
@ -62,14 +62,14 @@ const DetailDeviceState: React.FC<DetailDeviceStateProps> = ({ info, detailOpen,
name: `${intl.formatMessage({
id: 'device_state.table.detail.echarts.used',
defaultMessage: '已占用',
})}`,
})}${record?.percent * 100}%`,
},
{
value: totalCount - record?.percent * totalCount,
name: `${intl.formatMessage({
id: 'device_state.table.detail.echarts.free',
defaultMessage: '未占用',
})}`,
})}${100 - record?.percent * 100}%`,
},
];
@ -94,6 +94,8 @@ const DetailDeviceState: React.FC<DetailDeviceStateProps> = ({ info, detailOpen,
legend: {
orient: 'horizontal',
top: '37%',
itemWidth: 10, // 图例标记的宽度
itemHeight: 10, // 图例标记的高度
data: currNames,
},
series: [
@ -241,7 +243,7 @@ const DetailDeviceState: React.FC<DetailDeviceStateProps> = ({ info, detailOpen,
return (
<Modal
width={proFormMaxModelWidth}
title={info?.deviceSort}
title={info?.name}
open={detailOpen}
onCancel={closeModal}
footer={null}

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-08 16:57:30
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-10 15:05:25
* @LastEditTime: 2024-05-22 16:51:39
* @FilePath: \general-ai-manage\src\pages\Project\BusinessProject\components\detailServerState.tsx
* @Description:
* @
@ -71,14 +71,14 @@ const DetailServerState: React.FC<DetailServerStateProps> = ({ info, detailOpen,
name: `${intl.formatMessage({
id: 'server_state.table.detail.echarts.used',
defaultMessage: '已占用',
})}`,
})}${record?.percent * 100}%`,
},
{
value: totalCount - record?.percent * totalCount,
name: `${intl.formatMessage({
id: 'server_state.table.detail.echarts.free',
defaultMessage: '未占用',
})}`,
})}${100 - record?.percent * 100}%`,
},
];
@ -103,6 +103,8 @@ const DetailServerState: React.FC<DetailServerStateProps> = ({ info, detailOpen,
legend: {
orient: 'horizontal',
top: '37%',
itemWidth: 10, // 图例标记的宽度
itemHeight: 10, // 图例标记的高度
data: currNames,
},
series: [
@ -280,7 +282,7 @@ const DetailServerState: React.FC<DetailServerStateProps> = ({ info, detailOpen,
defaultMessage="服务器参数"
/>
</p>
<div className="my-[8px] gn_active_descriptions gn_descriptions bg_active_4">
<div className="mb-[8px] mt-[12px] gn_active_descriptions gn_descriptions bg_active_4">
<ProDescriptions
column={5}
columns={ModelDetailColumns}
@ -295,7 +297,7 @@ const DetailServerState: React.FC<DetailServerStateProps> = ({ info, detailOpen,
defaultMessage="硬件信息"
/>
</p>
<ul className="mt-[8px] flex items-center ">
<ul className="mt-[12px] flex items-center ">
{detailOpen &&
info?.progressData?.map((item, index) => {
return (
@ -322,7 +324,7 @@ const DetailServerState: React.FC<DetailServerStateProps> = ({ info, detailOpen,
defaultMessage="当前任务"
/>
</p>
<div className="pt-[8px]">
<div className="mt-[12px]">
<ProList<{ title: string }>
className="gn_pro_list"
itemLayout="vertical"

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-08 16:57:30
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-11 09:33:08
* @LastEditTime: 2024-05-22 16:20:13
* @FilePath: \general-ai-manage\src\pages\Business\BusinessState\components\deviceStateCard.tsx
* @Description:
*/
@ -10,7 +10,10 @@ import { AnimatePic } from '@/components/Animate';
import TableActionCard, { actionsProps } from '@/components/TableActionCard';
import { deviceStateEnums } from '@/enums/device';
import { Progress } from 'antd';
import json01 from '../../../../../public/animate/device/01.json'; //引入下载的动效json
import errorAnimateJson from '../../../../../public/animate/device/error.json'; //引入下载的动效json
import onlineAnimateJson from '../../../../../public/animate/device/online.json'; //引入下载的动效json
import outlineSvg from '../../../../../public/animate/device/outline.svg';
type DeviceStateCardProps = {
info: Record<string, any>;
@ -23,57 +26,71 @@ const DeviceStateCard: React.FC<DeviceStateCardProps> = ({ info, renderActions,
return deviceStateEnums.find((item: DICTENUM.DICT_TAB_ITEM) => item.key === record);
};
// 动效类型
const fetchAnimatePicByType = () => {
switch (info?.state) {
case '1':
case '3':
return <AnimatePic value={onlineAnimateJson} />;
case '4':
return <AnimatePic value={errorAnimateJson} />;
default:
return <img src={outlineSvg}></img>;
}
};
return (
<div
onClick={() => {
console.log('服务器详情展示');
fetchDetail();
}}
className={`bs_card_box ${formatStateByVal(info?.state)?.className}`}
className={`bs_card_box`}
>
<div className="flex justify-between w-full p-[12px] bs_card_header">
<div className="flex items-center title_box">
<div className="bs_card_name single_line head4">{info?.name}</div>
<div
className={`gn_card_tag ml-[8px] text-white ${
info?.state === '1' ? 'bg_active_1' : ''
} ${info?.state === '2' ? 'bg_gray_color_1' : ''} ${
info?.state === '3' ? 'bg_active_3' : ''
} ${info?.state === '4' ? 'bg_active_2' : ''}`}
>
{formatStateByVal(info?.state)?.label}
<div className={`bs_card_body ${formatStateByVal(info?.state)?.className}`}>
<div className="flex justify-between w-full p-[12px] bs_card_header">
<div className="flex items-center title_box">
<div className="bs_card_name single_line head4">{info?.name}</div>
<div
className={`gn_card_tag ml-[8px] text-white ${
info?.state === '1' ? 'bg_active_1' : ''
} ${info?.state === '2' ? 'bg_gray_color_1' : ''} ${
info?.state === '3' ? 'bg_active_3' : ''
} ${info?.state === '4' ? 'bg_active_2' : ''}`}
>
{formatStateByVal(info?.state)?.label}
</div>
</div>
<span>
<TableActionCard renderActions={renderActions} maxActionCount={3}></TableActionCard>
</span>
</div>
<span>
<TableActionCard renderActions={renderActions} maxActionCount={3}></TableActionCard>
</span>
</div>
<div className="flex bs_card_content px-[12px] py-[6px] items-center">
<div className="device-content-left w-[100px] mr-[10px]">
<AnimatePic value={json01} />
</div>
<div className="flex-1">
<ul className="w-full">
{info?.progressData?.map((v, k) => {
return (
<li key={k}>
<div className="flex rectProgress_box my-[6px]">
<div className="pr-[4px] text3 pt-[5px]">{v.label}</div>
<div className="flex items-center flex-1">
<Progress
style={{ padding: 0, margin: 0, borderRadius: 0 }}
size={['100%', 10]}
height={46}
percent={v.percent * 100}
strokeColor={v.strokeColor}
showInfo={false}
/>
<div className="flex bs_card_content px-[12px] py-[6px] items-center">
<div className="device-content-left w-[100px] mr-[10px]">{fetchAnimatePicByType()}</div>
<div className="flex-1">
<ul className="w-full">
{info?.progressData?.map((v, k) => {
return (
<li key={k}>
<div className="flex rectProgress_box my-[6px]">
<div className="pr-[4px] text3 pt-[5px]">{v.label}</div>
<div className="flex items-center flex-1">
<Progress
style={{ padding: 0, margin: 0, borderRadius: 0 }}
size={['100%', 10]}
height={46}
percent={v.percent * 100}
strokeColor={v.strokeColor}
showInfo={false}
/>
</div>
</div>
</div>
</li>
);
})}
</ul>
</li>
);
})}
</ul>
</div>
</div>
</div>
</div>

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-08 16:57:30
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-10 14:25:55
* @LastEditTime: 2024-05-22 16:20:48
* @FilePath: \general-ai-manage\src\pages\Business\BusinessState\components\serverStateCard.tsx
* @Description:
*/
@ -10,8 +10,8 @@ import { AnimatePic } from '@/components/Animate';
import TableActionCard, { actionsProps } from '@/components/TableActionCard';
import { serverStateEnums } from '@/enums/server';
import { Progress } from 'antd';
import json01 from '../../../../../public/animate/device/01.json'; //引入下载的动效json
import onlineAnimateJson from '../../../../../public/animate/serves/online.json'; //引入下载的动效json
import outlineSvg from '../../../../../public/animate/serves/outline.svg';
type ServerStateCardProps = {
info: Record<string, any>;
renderActions: actionsProps[];
@ -23,55 +23,65 @@ const ServerStateCard: React.FC<ServerStateCardProps> = ({ info, renderActions,
return serverStateEnums.find((item: DICTENUM.DICT_TAB_ITEM) => item.key === record);
};
// 动效类型
const fetchAnimatePicByType = () => {
switch (info?.state) {
case '1':
return <AnimatePic value={onlineAnimateJson} />;
default:
return <img src={outlineSvg}></img>;
}
};
return (
<div
onClick={() => {
console.log('服务器详情展示');
fetchDetail();
}}
className={`bs_card_box ${formatStateByVal(info?.state)?.className}`}
className={`bs_card_box `}
>
<div className="flex justify-between w-full p-[12px] bs_card_header">
<div className="flex items-center title_box">
<div className="bs_card_name single_line head4">{info?.deviceSort}</div>
<div
className={`gn_card_tag ml-[8px] text-white ${
info?.state === '1' ? 'bg_active_1' : 'bg_gray_color_1'
}`}
>
{formatStateByVal(info?.state).label}
<div className={`bs_card_body ${formatStateByVal(info?.state)?.className}`}>
<div className="flex justify-between w-full p-[12px] bs_card_header">
<div className="flex items-center title_box">
<div className="bs_card_name single_line head4">{info?.deviceSort}</div>
<div
className={`gn_card_tag ml-[8px] text-white ${
info?.state === '1' ? 'bg_active_1' : 'bg_gray_color_1'
}`}
>
{formatStateByVal(info?.state).label}
</div>
</div>
<span>
<TableActionCard renderActions={renderActions} maxActionCount={3}></TableActionCard>
</span>
</div>
<span>
<TableActionCard renderActions={renderActions} maxActionCount={3}></TableActionCard>
</span>
</div>
<div className="flex bs_card_content px-[12px] py-[6px] items-center">
<div className="server-content-left w-[100px] mr-[10px]">
<AnimatePic value={json01} />
</div>
<div className="flex-1">
<ul className="w-full">
{info?.progressData?.map((v, k) => {
return (
<li key={k}>
<div className="flex rectProgress_box my-[6px]">
<div className="pr-[4px] text3 pt-[5px]">{v.label}</div>
<div className="flex items-center flex-1">
<Progress
style={{ padding: 0, margin: 0, borderRadius: 0 }}
size={['100%', 10]}
height={46}
percent={v.percent * 100}
strokeColor={v.strokeColor}
showInfo={false}
/>
<div className="flex bs_card_content px-[12px] py-[6px] items-center">
<div className="server-content-left w-[100px] mr-[10px]">{fetchAnimatePicByType()}</div>
<div className="flex-1">
<ul className="w-full">
{info?.progressData?.map((v, k) => {
return (
<li key={k}>
<div className="flex rectProgress_box my-[6px]">
<div className="pr-[4px] text3 pt-[5px]">{v.label}</div>
<div className="flex items-center flex-1">
<Progress
style={{ padding: 0, margin: 0, borderRadius: 0 }}
size={['100%', 10]}
height={46}
percent={v.percent * 100}
strokeColor={v.strokeColor}
showInfo={false}
/>
</div>
</div>
</div>
</li>
);
})}
</ul>
</li>
);
})}
</ul>
</div>
</div>
</div>
</div>

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-05-10 10:47:45
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-15 15:35:20
* @LastEditTime: 2024-05-22 11:14:05
* @FilePath: \general-ai-platform-web\src\pages\Business\BusinessState\deviceSate.tsx
* @Description:
* @
@ -33,7 +33,7 @@ const DeviceSate: React.FC = () => {
// 列表
const [serverList, setServerList] = useState<Record<string, any>[]>([]); // 列表数据
const [currentRow, setCurrentRow] = useState<Record<string, any>>();
const [currentPageSize, setCurrentPageSize] = useState<number>(12);
const [currentPageSize, setCurrentPageSize] = useState<number>(20);
const [currentPage, setCurrentPage] = useState<number>(1);
const [total, setTotal] = useState<number>(1);
@ -181,7 +181,7 @@ const DeviceSate: React.FC = () => {
layout="horizontal"
submitter={{
render: () => (
<div style={{ textAlign: 'center', marginLeft: 12 }}>
<div style={{ textAlign: 'center', marginLeft: 12, marginBottom: 16 }}>
<CommButton
type="primary"
htmlType="submit"
@ -250,7 +250,7 @@ const DeviceSate: React.FC = () => {
changeTabMode(key);
}}
></Tabs>
<div style={{ maxHeight: 'calc(100vh - 240px)', overflowY: 'auto', overflowX: 'hidden' }}>
<div className="gn_scroll_list_wrap" style={{ height: 'calc(100vh - 240px)' }}>
<ProList<any>
className="gn_pro_list"
ghost={true}

@ -1,10 +1,23 @@
/* 服务器 设备 共用 */
@import url('@/base.less');
.bs_state_page {
.ant-pro-list-row-card {
padding-inline: 0;
}
.ant-pro-checkcard {
margin-block-end: 0;
}
// bs_card_body bs_card_box
.bs_card_box {
width: 100%;
padding: 0px 4px 16px 8px;
}
.bs_card_body {
width: 100%;
overflow: hidden;
background: #f4f8fe;
border-radius: 4px;
box-shadow: inset 0px -2px 0px 0px rgba(21, 77, 221, 0.2);
.bs_card_header {
background: linear-gradient(90deg, #d5e6fe 0%, rgba(213, 230, 254, 0) 100%);
.bs_card_name {
@ -15,9 +28,6 @@
&.outline_info {
.gray_info_all();
background: #f5f5f5;
// .bs_card_header {
// background: linear-gradient(90deg, #dcdcdc 0%, rgba(245, 245, 245, 0) 100%);
// }
}
// 在线
// &.online_info {

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-05-07 13:38:03
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-15 16:30:02
* @LastEditTime: 2024-05-22 16:45:57
* @FilePath: \general-ai-platform-web\src\pages\Business\BusinessState\index.tsx
* @Description: businessStatebs
* @
@ -29,7 +29,7 @@ const BusinessState: React.FC = () => {
// 列表
const [serverList, setServerList] = useState<Record<string, any>[]>([]); // 列表数据
const [currentRow, setCurrentRow] = useState<Record<string, any>>();
const [currentPageSize, setCurrentPageSize] = useState<number>(12);
const [currentPageSize, setCurrentPageSize] = useState<number>(20);
const [currentPage, setCurrentPage] = useState<number>(1);
const [total, setTotal] = useState<number>(1);
const [createModalOpen, setCreateModalOpen] = useState<boolean>(false);
@ -176,7 +176,7 @@ const BusinessState: React.FC = () => {
changeTabMode(key);
}}
></Tabs>
<div className="flex justify-end pb-[12px]">
<div className="flex justify-end pb-[12px] ">
<CommButton
type="primary"
onClick={() => {
@ -187,7 +187,7 @@ const BusinessState: React.FC = () => {
}
></CommButton>
</div>
<div style={{ maxHeight: 'calc(100vh - 210px)', overflowY: 'auto', overflowX: 'hidden' }}>
<div className="gn_scroll_list_wrap" style={{ height: 'calc(100vh - 240px)' }}>
<ProList<any>
className="gn_pro_list"
ghost={true}

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-30 10:02:29
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-15 15:11:00
* @LastEditTime: 2024-05-21 16:12:06
* @FilePath: \general-ai-platform-web\src\pages\Business\DeviceGroup\components\alarmSetForm.tsx
* @Description:
* @
@ -34,6 +34,7 @@ const AlarmSetForm: React.FC<AlarmSetFormProps> = (props) => {
}, []);
return (
<ProForm
className="gn_form alarmSetForm_wrap"
style={{ paddingBottom: 70 }}
submitter={{
searchConfig: {
@ -58,7 +59,11 @@ const AlarmSetForm: React.FC<AlarmSetFormProps> = (props) => {
}}
>
<ProFormGroup>
<ProFormGroup title="通知方式" titleStyle={{ margin: '0 0 8px' }}>
<ProFormGroup
title="通知方式"
titleStyle={{ margin: '0 0 8px' }}
style={{ marginBottom: '4px' }}
>
<ProFormList
className="innerFormList_box"
name={['ways']}

@ -82,13 +82,22 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
label={
<FormattedMessage id="device_group.tree_node.fatherName" defaultMessage="上级节点" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'device_group.tree_node.fatherName',
defaultMessage: '$$$',
})}`}
// TODO 此处在联调时确定下上级节点数据获取来源
placeholder={
!props.parentInfo?.fatherId
? `${intl.formatMessage({
id: 'common.empty',
defaultMessage: '$$$',
})}`
: `${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'device_group.tree_node.fatherName',
defaultMessage: '$$$',
})}`
}
initialValue={props?.parentInfo?.fatherName}
disabled
/>
<ProFormText

@ -1,3 +1,4 @@
import { CommButton } from '@/components/Button';
import { getModelRuntimeLibFilesList } from '@/services/testApi/model';
import {
ProForm,
@ -11,7 +12,7 @@ import {
import { FormListActionType } from '@ant-design/pro-form/lib';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Button, Modal, UploadFile, message } from 'antd';
import { Modal, UploadFile, message } from 'antd';
import yaml from 'js-yaml';
import React, { useEffect, useRef, useState } from 'react';
import {
@ -172,14 +173,22 @@ const CreateModelParams: React.FC<CreateModelParamsProps> = (props) => {
return true;
}}
>
{/* // TODO 上传文案需要和UI稿对比 */}
<ProFormUploadDragger
width={proFormSmallItemStyleProps.width}
title={
<div className="gn_uploadfile_title py-[16px] text1 text-center">
<span></span>
<a></a>
</div>
}
description=""
icon={<i className="iconfont icon-shangchuanwenjian text_primary text-[32px]"></i>}
max={1}
label={<span className="font-bold"></span>}
value={fileList}
name="dragger"
fieldProps={{
className: 'gn_proFormUploadDragger_formItem',
onChange: handleFileChange,
onRemove: () => {
let index_ids = actionFormListRef.current?.getList()?.map((v, i) => {
@ -225,17 +234,19 @@ const CreateModelParams: React.FC<CreateModelParamsProps> = (props) => {
},
}}
/>
<div style={{ color: '#666666', margin: '-8px 0 16px' }}>
zip.tar.gz
</div>
{/* // TODO label字重与上面统一, 操作按钮需要与输入框对齐 */}
<ProFormList
name="params"
label={
<div>
{' '}
<span className="font-bold"></span>
<p style={{ color: '#666666' }}>
<div style={{ color: '#333333', padding: '8px 0 4px' }}>
~
</p>
</div>
</div>
}
actionRef={actionFormListRef}
@ -278,7 +289,7 @@ const CreateModelParams: React.FC<CreateModelParamsProps> = (props) => {
>
<ProForm.Group>
<ProFormText
width={proFormSmallItemStyleProps.column2Width - 40}
width={proFormSmallItemStyleProps.column2Width - 30}
name="ip"
initialValue={'http://127.0.0.1'}
label={
@ -305,7 +316,7 @@ const CreateModelParams: React.FC<CreateModelParamsProps> = (props) => {
]}
/>
<ProFormText
width={proFormSmallItemStyleProps.column2Width - 40}
width={proFormSmallItemStyleProps.column2Width - 30}
name="port"
initialValue={'80'}
label={
@ -331,9 +342,17 @@ const CreateModelParams: React.FC<CreateModelParamsProps> = (props) => {
},
]}
/>
<Button
className="search_ip_port_btn"
style={{ marginTop: '30px' }}
<CommButton
style={{
width: '52px',
height: '32px',
marginTop: '30px',
marginLeft: '-4px',
borderRadius: '4px',
borderColor: '#154ddd',
color: '#154ddd',
}}
onClick={() => {
const { ip, port } = formRef.current?.getFieldsValue();
if (ip && port) {
@ -342,12 +361,10 @@ const CreateModelParams: React.FC<CreateModelParamsProps> = (props) => {
} else {
message.error('请填写IP和端口');
}
console.log(formRef.current?.getFieldsValue(), 'searchIP');
}}
>
</Button>
buttonLabel={<FormattedMessage id="pages.searchTable.search" defaultMessage="查询" />}
></CommButton>
</ProForm.Group>
{openFiles ? (
<ProFormSelect
@ -430,9 +447,18 @@ const CreateModelParams: React.FC<CreateModelParamsProps> = (props) => {
width={proFormSmallItemStyleProps.width}
max={1}
label={<span className="font-bold"></span>}
title={
<div className="gn_uploadfile_title py-[16px] text1 text-center">
<span></span>
<a></a>
</div>
}
description=""
icon={<i className="iconfont icon-shangchuanwenjian text_primary text-[32px]"></i>}
value={fileList}
name="dragger"
fieldProps={{
className: 'gn_proFormUploadDragger_formItem',
onChange: handleFileChange,
onRemove: () => {
let index_ids = actionFormListRef.current?.getList()?.map((v, i) => {
@ -478,15 +504,19 @@ const CreateModelParams: React.FC<CreateModelParamsProps> = (props) => {
},
}}
/>
<div style={{ color: '#666666', margin: '-8px 0 16px' }}>
zip.tar.gz
</div>
{/* // TODO label字重与上面统一, 操作按钮需要与输入框对齐 */}
<ProFormList
name="params"
label={
<div>
{' '}
<span className="font-bold"></span>
<p style={{ color: '#666666' }}>~</p>
<div style={{ color: '#333333', padding: '8px 0 4px' }}>
~
</div>
</div>
}
actionRef={actionFormListRef}
@ -498,8 +528,8 @@ const CreateModelParams: React.FC<CreateModelParamsProps> = (props) => {
{() => {
return (
<>
<ProFormText key="name" name="name" label="键名" />
<ProFormText key="default" name="default" label="默认值" />
<ProFormText width={268} key="name" name="name" label="键名" />
<ProFormText width={268} key="default" name="default" label="默认值" />
</>
);
}}

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-22 15:23:36
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-10 15:34:31
* @LastEditTime: 2024-05-21 15:24:53
* @FilePath: \general-ai-platform-web\src\pages\Business\DeviceGroup\components\deviceList.tsx
* @Description: deviceGroupdg
* @
@ -273,7 +273,7 @@ const DeviceList: React.FC<DeviceListProps> = () => {
toBack={() => {
setIsSettingOpen(false);
}}
size={14}
size={16}
title="模型列表"
></InnerPageBack>
<ModelSetting info={currentRow}></ModelSetting>

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-08 16:57:30
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-15 15:01:35
* @LastEditTime: 2024-05-21 15:51:41
* @FilePath: \general-ai-manage\src\pages\Project\BusinessProject\components\detailServerState.tsx
* @Description:
* @
@ -157,9 +157,7 @@ const ModelDeployConfig: React.FC<ModelDeployConfigProps> = ({ info, detailOpen,
setSelectedRows(selectedRowsData);
},
}}
tableAlertOptionRender={() => {
return <>{selectedRows?.length > 0 && <></>}</>;
}}
tableAlertRender={false}
request={async () => {
let resp = await getAllDeviceList();
console.log(resp, 'getAllDeviceList_resp');

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-30 10:02:29
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-15 14:24:43
* @LastEditTime: 2024-05-21 15:26:02
* @FilePath: \general-ai-platform-web\src\pages\Business\DeviceGroup\components\modelSetting.tsx
* @Description:
* @
@ -48,6 +48,7 @@ const ModelSetting: React.FC<ModelSettingProps> = () => {
hideInSearch: true,
key: 'fixedName',
fixed: 'left',
width: '30%',
},
{
title: <FormattedMessage id="base_model.table.list.version" defaultMessage="版本" />,

@ -21,3 +21,9 @@
margin: 0;
padding: 0;
}
.alarmSetForm_wrap :where(.css-dev-only-do-not-override-1tt9zgd).ant-checkbox + span {
padding-inline-end: 0;
}
.alarmSetForm_wrap .innerFormList_box .ant-form-item {
margin-bottom: 12px;
}

@ -32,3 +32,15 @@
}
}
}
// 告警通知
.alarmSetForm_wrap {
:where(.css-dev-only-do-not-override-1tt9zgd).ant-checkbox + span {
padding-inline-end: 0;
}
.innerFormList_box {
.ant-form-item {
margin-bottom: 12px;
}
}
}

@ -73,7 +73,8 @@ const DeviceGroup: React.FC = () => {
<DeviceGroupTree
dataSource={deviceTreeList}
changeNode={(record) => {
setNodeInfo(record);
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
record?.id && setNodeInfo(record);
}}
addTreeNode={(node) => {
//TODO 判断是根节点还是子节点 调用新增接口
@ -82,7 +83,7 @@ const DeviceGroup: React.FC = () => {
}}
selectTree={(selectedKeys, info) => {
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
info?.node && setNodeInfo(info?.node);
info?.node && info?.node?.id && setNodeInfo(info?.node);
// handleSelectNode(selectedKeys, info)
console.log('selectTree_selected', selectedKeys, info);
}}

@ -97,6 +97,11 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
<StepsForm<{
name: string;
}>
onFinish={async (values) => {
console.log('All form values:', values);
// 在这里处理提交数据例如调用API
message.success('提交成功');
}}
stepsProps={proFormStepsFormProps.stepsProps}
current={current}
onCurrentChange={setCurrent}
@ -392,7 +397,7 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
{/* // TODO label字重与上面统一, 操作按钮需要与输入框对齐 */}
<ProFormList
name="params"
name="config_str"
label={
<div>
<span className="font-bold"></span>

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-08 10:36:06
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-20 11:10:22
* @LastEditTime: 2024-05-21 09:17:25
* @FilePath: \general-ai-manage\src\pages\Model\ModelDetail\index.tsx
* @Description:
* @
@ -221,7 +221,7 @@ const ModelDetail: React.FC = () => {
bodyStyle={{ padding: 0, margin: 0, backgroundColor: 'transparent' }}
>
<InnerPageBack title="模型列表"></InnerPageBack>
<div className="gn_descriptions mb-[20px]">
<div className="gn_descriptions box_shadow_1 mb-[20px]">
<ProDescriptions
column={3}
columns={ModelDetailColumns}

@ -95,7 +95,7 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
/>
<ProForm.Group>
<ProFormText
width={proFormSmallItemStyleProps.column2Width - 40}
width={proFormSmallItemStyleProps.column2Width - 30}
name="ip"
initialValue={'http://127.0.0.1'}
label={
@ -122,7 +122,7 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
]}
/>
<ProFormText
width={proFormSmallItemStyleProps.column2Width - 40}
width={proFormSmallItemStyleProps.column2Width - 30}
name="port"
initialValue={'80'}
label={
@ -154,7 +154,10 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
width: '52px',
height: '32px',
marginTop: '30px',
marginLeft: '-4px',
borderRadius: '4px',
borderColor: '#154ddd',
color: '#154ddd',
}}
onClick={() => {
const { ip, port } = form.getFieldsValue();

@ -9,3 +9,7 @@
background: linear-gradient(180deg, #21c7ff 0%, #428cff 100%);
border-radius: 2px;
}
.businessInfo_page .baseInfo_box img {
width: 80px;
height: 80px;
}

@ -12,4 +12,11 @@
border-radius: 2px;
}
}
.baseInfo_box {
img {
width: 80px;
height: 80px;
}
}
}

@ -13,6 +13,7 @@ import { getBusinessAlgorithmList, getBusinessDetail } from '@/services/testApi/
import { isSuccessApi } from '@/utils/forApi';
import { ProCard, ProList } from '@ant-design/pro-components';
import { Button } from 'antd';
import businessLogoIcon from '/public/home/business_logo.svg';
import React, { useEffect, useState } from 'react';
import { proTablePaginationOptions } from '../../../../config/defaultTable';
@ -23,7 +24,6 @@ import BaseInfo from './components/baseInfo';
import UpdateForm from './components/updateForm';
import './index.less';
import { ReactComponent as YaxinshijueIcon } from '/public/home/yaxinshijue_icon.svg';
// eslint-disable-next-line react-hooks/rules-of-hooks
const { formatTimeByDateType } = useMoment();
@ -120,12 +120,12 @@ const BusinessInfo: React.FC = () => {
}
>
<div className="baseInfo_box">
<div className="flex pb-[12px]">
<div className="flex pb-[12px] items-center">
{/* // TODO 替换使用公司的logo字段 */}
<YaxinshijueIcon></YaxinshijueIcon>
<div>
<img src={businessLogoIcon} />
<div className="pl-[12px]">
<span className="head3 ">{detailInfo?.name}</span>
<div className="text_color_2 py-[12px]">
<div className="text_color_2 pt-[12px]">
: {formatTimeByDateType(detailInfo?.create_time)}
</div>
</div>
@ -146,12 +146,19 @@ const BusinessInfo: React.FC = () => {
className="gn_card_wrap pb-[16px]"
title={<span className="head3">({total})</span>}
>
{/* bodyStyle={{
maxHeight: 'calc(100vh - 730px)',
overflowY: 'scroll',
}} */}
<ProList<any>
className="gn_pro_list"
ghost={true}
itemCardProps={{
ghost: true,
bodyStyle: { padding: 0, margin: 0 },
bodyStyle: {
padding: 0,
margin: 0,
},
style: {
width: '100%',
border: 0,

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-07 14:02:00
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-05-17 16:25:17
* @LastEditTime: 2024-05-22 10:07:55
* @FilePath: \general-ai-manage\src\pages\BusinessProject\BusinessProject.tsx
* @Description:
* @
@ -268,7 +268,7 @@ const BusinessProject: React.FC = () => {
/>
</ProForm>
</div>
<div>
<div className="gn_scroll_list_wrap" style={{ maxHeight: 'calc(100vh - 350px)' }}>
<ProList<any>
className="gn_pro_list"
ghost={true}

@ -5,6 +5,7 @@ import { getAllRouteNameTile, replaceMenuWithRoutesData } from '@/utils/common';
import { getLocale } from '@@/exports';
import { addLocale } from '@@/plugin-locale';
import { innerMenuRoutes } from '../../../../config/routes';
import businessBigLogo from '/public/home/business_big_logo.svg';
import { LockOutlined, UserOutlined } from '@ant-design/icons';
import {
@ -244,7 +245,17 @@ const Login: React.FC = () => {
},
},
}}
title="欢迎登录"
title={
<div className="login_title_box">
<div className="login_logo">
<img src={businessBigLogo} />
{/* <BusinessBigLogo></BusinessBigLogo> */}
</div>
<div className="font-bold login_title font_f_1 text-[36px] text_color_1">
</div>
</div>
}
initialValues={
{
// autoLogin: false,
@ -345,10 +356,10 @@ const Login: React.FC = () => {
<a
style={{
float: 'right',
color: token.colorText,
color: '#154ddd',
}}
>
?
</a>
</div>
</LoginFormPage>

@ -1,3 +1,10 @@
.ant-pro-form-login-page-left {
width: 100%;
max-width: 100%;
}
.ant-pro-form-login-page-notice {
display: none;
}
.loginFrom .loginBox {
display: flex;
align-items: center;
@ -8,6 +15,12 @@
background-repeat: no-repeat;
background-size: 100% 100%;
}
.loginFrom .login_title_box .login_logo {
padding-bottom: 12px;
}
.loginFrom .login_title_box .login_logo img {
width: 160px;
}
.loginFrom .loginRight {
display: flex;
align-items: center;
@ -16,39 +29,27 @@
height: 100%;
}
.loginFrom .loginRight .ant-pro-form-login-page-container {
position: fixed;
top: 50%;
left: 50%;
margin-left: -248px;
margin-top: -283px;
height: auto !important;
padding: 48px 40px !important;
background-color: #ffffff;
border-radius: 16px;
background-color: rgba(255, 255, 255, 0.6);
}
.loginFrom .loginRight .ant-pro-form-login-page-title {
padding-bottom: 32px;
}
.loginFrom .ant-pro-form-login-container .ant-pro-form-login-title {
padding-bottom: 32px;
.loginFrom .loginRight .ant-pro-form-login-page-main {
width: 100%;
}
.loginFrom :global .ant-pro-form-login-container {
background: red;
.loginFrom .loginRight .ant-form-item:nth-of-type(2) {
margin-bottom: 16px;
}
.loginFrom :global .ant-pro-form-login-container .ant-pro-form-login-top .css-dev-only-do-not-override-1lxmgnh {
width: 400px;
margin-bottom: 32px;
font-weight: 400;
.loginFrom .loginRight .ant-form-item .ant-input-affix-wrapper {
height: 48px;
border-radius: 4px;
}
.loginFrom :global .ant-pro-form-login-container :where(.css-dev-only-do-not-override-1lxmgnh).ant-pro-form-login-main {
min-width: 400px;
max-width: 580px;
margin: 0;
.loginFrom .loginRight .ant-btn-primary {
margin-top: 16px;
}
.loginFrom :global .ant-pro-form-login-container .ant-pro-form-login-main .css-dev-only-do-not-override-1lxmgnh {
width: 400px;
.loginFrom .loginRight .ant-pro-form-login-page-title {
padding-bottom: 32px;
}
.loginFrom :global .ant-pro-form-login-container :where(.css-dev-only-do-not-override-qgg3xn).ant-input-affix-wrapper-lg {
padding: 7px 11px;
font-size: 16px;
line-height: 1.5;
border-radius: 4px;
.loginFrom .ant-pro-form-login-container .ant-pro-form-login-title {
padding-bottom: 32px;
}

@ -1,3 +1,12 @@
@import url('@/base.less');
.ant-pro-form-login-page-left {
width: 100%;
max-width: 100%;
}
.ant-pro-form-login-page-notice {
display: none;
}
.loginFrom {
.loginBox {
display: flex;
@ -36,6 +45,15 @@
// }
// }
.login_title_box {
.login_logo {
img {
width: 160px;
}
padding-bottom: 12px;
}
}
.loginRight {
display: flex;
align-items: center;
@ -43,14 +61,38 @@
width: 100%;
height: 100%;
.ant-pro-form-login-page-container {
position: fixed;
top: 50%;
left: 50%;
margin-top: -283px;
margin-left: -248px;
background-color: rgba(255, 255, 255, 0.6);
height: auto !important;
padding: 48px 40px !important;
background-color: rgba(255, 255, 255, 1);
border-radius: 16px;
}
.ant-pro-form-login-page-main {
width: 100%;
}
.ant-form-item {
&:nth-of-type(2) {
margin-bottom: 16px;
}
.ant-input-affix-wrapper {
height: 48px;
border-radius: 4px;
}
}
.ant-btn-primary {
margin-top: 16px;
background-color: @primary_color !important;
}
.ant-checkbox-wrapper:not(.ant-checkbox-wrapper-disabled):hover
.ant-checkbox-checked:not(.ant-checkbox-disabled)
.ant-checkbox-inner {
background-color: @primary_color !important;
}
.ant-input-outlined:hover {
border-color: @primary_color !important;
}
.ant-pro-form-login-page-title {
padding-bottom: 32px;
}
@ -67,28 +109,28 @@
padding-bottom: 32px;
}
}
:global {
.ant-pro-form-login-container {
background: red;
.ant-pro-form-login-top .css-dev-only-do-not-override-1lxmgnh {
width: 400px;
margin-bottom: 32px;
font-weight: 400;
}
:where(.css-dev-only-do-not-override-1lxmgnh).ant-pro-form-login-main {
min-width: 400px;
max-width: 580px;
margin: 0;
}
.ant-pro-form-login-main .css-dev-only-do-not-override-1lxmgnh {
width: 400px;
}
:where(.css-dev-only-do-not-override-qgg3xn).ant-input-affix-wrapper-lg {
padding: 7px 11px;
font-size: 16px;
line-height: 1.5;
border-radius: 4px;
}
}
}
// :global {
// .ant-pro-form-login-container {
// background: red;
// .ant-pro-form-login-top .css-dev-only-do-not-override-1lxmgnh {
// width: 400px;
// margin-bottom: 32px;
// font-weight: 400;
// }
// :where(.css-dev-only-do-not-override-1lxmgnh).ant-pro-form-login-main {
// min-width: 400px;
// max-width: 580px;
// margin: 0;
// }
// .ant-pro-form-login-main .css-dev-only-do-not-override-1lxmgnh {
// width: 400px;
// }
// :where(.css-dev-only-do-not-override-qgg3xn).ant-input-affix-wrapper-lg {
// padding: 7px 11px;
// font-size: 16px;
// line-height: 1.5;
// border-radius: 4px;
// }
// }
// }
}

Loading…
Cancel
Save