Merge remote-tracking branch 'origin/master'

pull/59/head
shao1121353141 2023-09-26 21:23:54 +08:00
commit c0c0300082
6 changed files with 109 additions and 112 deletions

View File

@ -47,7 +47,7 @@
"@ant-design/charts": "^1.4.2", "@ant-design/charts": "^1.4.2",
"@ant-design/icons": "^5.2.6", "@ant-design/icons": "^5.2.6",
"@ant-design/maps": "^1.0.7", "@ant-design/maps": "^1.0.7",
"@ant-design/pro-components": "^2.6.25", "@ant-design/pro-components": "^2.6.27",
"ahooks": "^3.7.8", "ahooks": "^3.7.8",
"antd": "^5.9.3", "antd": "^5.9.3",
"antd-img-crop": "^4.13.0", "antd-img-crop": "^4.13.0",

View File

@ -89,11 +89,7 @@ export default () => {
loading ? ( loading ? (
<Skeleton active paragraph={{ rows: 1 }} /> <Skeleton active paragraph={{ rows: 1 }} />
) : ( ) : (
<ProDescriptions <ProDescriptions size="small" column={isMobile ? 1 : 2} dataSource={{ ...app }}>
size="small"
column={isMobile ? 1 : 2}
dataSource={{ ...app }}
>
<ProDescriptions.Item <ProDescriptions.Item
dataIndex="type" dataIndex="type"
label={intl.formatMessage({ id: 'pages.app.config.detail.config.type' })} label={intl.formatMessage({ id: 'pages.app.config.detail.config.type' })}
@ -195,7 +191,16 @@ export default () => {
</Button>, </Button>,
]} ]}
tabActiveKey={tabActiveKey} tabActiveKey={tabActiveKey}
onTabChange={setTabActiveKey} onTabChange={(key) => {
setTabActiveKey(key);
history.replace({
pathname: location.pathname,
search: queryString.stringify({
type: key,
id,
}),
});
}}
tabList={[ tabList={[
{ {
key: ConfigTabs.app_config, key: ConfigTabs.app_config,

View File

@ -45,7 +45,7 @@ export default {
'pages.app.config.detail.items.login_access.protocol_config.common.authorization_type': 'pages.app.config.detail.items.login_access.protocol_config.common.authorization_type':
'授权范围', '授权范围',
'pages.app.config.detail.items.login_access.protocol_config.common.authorization_type.extra': 'pages.app.config.detail.items.login_access.protocol_config.common.authorization_type.extra':
'若选择手动授权,需要在 访问授权 中进行权限分配。', '若选择手动授权,需要在【访问授权】中进行权限分配。',
'pages.app.config.detail.items.login_access.protocol_config.common.authorization_type.rule.0.message': 'pages.app.config.detail.items.login_access.protocol_config.common.authorization_type.rule.0.message':
'请选择授权范围', '请选择授权范围',
'pages.app.config.detail.items.login_access.protocol_config.common.authorization_type.option.0': 'pages.app.config.detail.items.login_access.protocol_config.common.authorization_type.option.0':

View File

@ -28,11 +28,9 @@ import queryString from 'query-string';
import { flushSync } from 'react-dom'; import { flushSync } from 'react-dom';
import classnames from 'classnames'; import classnames from 'classnames';
import useStyle from './style'; import useStyle from './style';
import Banner from '@/components/Banner';
import PageLoading from '@/components/PageLoading'; import PageLoading from '@/components/PageLoading';
const prefixCls = 'login'; const prefixCls = 'login';
const showBanner = process.env.PREVIEW_ENV || process.env.NODE_ENV === 'development';
/** /**
* *
@ -152,116 +150,107 @@ const Login: React.FC = () => {
<link rel="icon" href={'/favicon.ico'} /> <link rel="icon" href={'/favicon.ico'} />
</Helmet> </Helmet>
<div className={classnames(`${prefixCls}`)}> <div className={classnames(`${prefixCls}`)}>
{showBanner && <Banner />} <LoginFormPage
<div backgroundImageUrl={'/login-background.png'}
style={{ logo={'/full-logo.svg'}
backgroundColor: 'white', subTitle={intl.formatMessage({
height: 'calc(100vh - 48px)', id: 'pages.layout.title',
border: '1px solid rgb(240, 240, 240)', })}
initialValues={{
'remember-me': false,
}}
form={form}
scrollToFirstError
submitter={{
searchConfig: {
submitText: intl.formatMessage({
id: 'pages.login.submit',
}),
},
render: (_, dom) => dom.pop(),
submitButtonProps: {
loading,
size: 'large',
style: {
width: '100%',
},
},
}}
onFinish={async (values) => {
run(values);
return data;
}} }}
> >
<LoginFormPage {userLoginState?.status !== RESULT_STATE.SUCCESS && userLoginState?.message && (
backgroundImageUrl={'/login-background.png'} <>
logo={'/full-logo.svg'} <LoginMessage content={userLoginState?.message} />
subTitle={intl.formatMessage({ <br />
id: 'pages.layout.title', </>
})} )}
initialValues={{ <>
'remember-me': false, <ProFormText
}} name="username"
form={form} fieldProps={{
scrollToFirstError
submitter={{
searchConfig: {
submitText: intl.formatMessage({
id: 'pages.login.submit',
}),
},
render: (_, dom) => dom.pop(),
submitButtonProps: {
loading,
size: 'large', size: 'large',
style: { prefix: (
width: '100%', <UserOutlined className={classnames(`${prefixCls}-form-prefix-icon`)} />
),
autoComplete: 'off',
}}
placeholder={intl.formatMessage({
id: 'pages.login.username.placeholder',
})}
rules={[
{
required: true,
message: <FormattedMessage id="pages.login.username.required" />,
}, },
}, ]}
}} />
onFinish={async (values) => { <ProFormText.Password
run(values); name="password"
return data; fieldProps={{
size: 'large',
autoComplete: 'new-password',
prefix: (
<LockOutlined className={classnames(`${prefixCls}-form-prefix-icon`)} />
),
}}
placeholder={intl.formatMessage({
id: 'pages.login.password.placeholder',
})}
rules={[
{
required: true,
message: <FormattedMessage id="pages.login.password.required" />,
},
]}
/>
</>
<div
style={{
marginBottom: 24,
}} }}
> >
{userLoginState?.status !== RESULT_STATE.SUCCESS && userLoginState?.message && ( <ProFormCheckbox noStyle name="remember-me">
<> <FormattedMessage id="pages.login.remember-me" />
<LoginMessage content={userLoginState?.message} /> </ProFormCheckbox>
<br /> <a
</>
)}
<>
<ProFormText
name="username"
fieldProps={{
size: 'large',
prefix: (
<UserOutlined className={classnames(`${prefixCls}-form-prefix-icon`)} />
),
autoComplete: 'off',
}}
placeholder={intl.formatMessage({
id: 'pages.login.username.placeholder',
})}
rules={[
{
required: true,
message: <FormattedMessage id="pages.login.username.required" />,
},
]}
/>
<ProFormText.Password
name="password"
fieldProps={{
size: 'large',
autoComplete: 'new-password',
prefix: (
<LockOutlined className={classnames(`${prefixCls}-form-prefix-icon`)} />
),
}}
placeholder={intl.formatMessage({
id: 'pages.login.password.placeholder',
})}
rules={[
{
required: true,
message: <FormattedMessage id="pages.login.password.required" />,
},
]}
/>
</>
<div
style={{ style={{
marginBottom: 24, float: 'right',
}}
onClick={async () => {
message.info(
intl.formatMessage({
id: 'app.not_yet_realized',
}),
);
}} }}
> >
<ProFormCheckbox noStyle name="remember-me"> <FormattedMessage id="pages.login.forgot-password" />
<FormattedMessage id="pages.login.remember-me" /> </a>
</ProFormCheckbox> </div>
<a </LoginFormPage>
style={{
float: 'right',
}}
onClick={async () => {
message.info(
intl.formatMessage({
id: 'app.not_yet_realized',
}),
);
}}
>
<FormattedMessage id="pages.login.forgot-password" />
</a>
</div>
</LoginFormPage>
</div>
</div> </div>
</> </>
) : ( ) : (

View File

@ -23,6 +23,9 @@ const useStyle = createStyles(({ token, prefixCls }, prefix) => {
return { return {
main: { main: {
[`${prefixClassName}`]: { [`${prefixClassName}`]: {
backgroundColor: 'white',
height: '100vh',
border: '1px solid rgb(240, 240, 240)',
[`${prefixClassName}-form-prefix-icon`]: { [`${prefixClassName}-form-prefix-icon`]: {
color: token.colorPrimary, color: token.colorPrimary,
fontSize: token.fontSize, fontSize: token.fontSize,

View File

@ -48,7 +48,7 @@
"@ant-design/charts": "^1.4.2", "@ant-design/charts": "^1.4.2",
"@ant-design/icons": "^5.2.6", "@ant-design/icons": "^5.2.6",
"@ant-design/maps": "^1.0.7", "@ant-design/maps": "^1.0.7",
"@ant-design/pro-components": "^2.6.25", "@ant-design/pro-components": "^2.6.27",
"ahooks": "^3.7.8", "ahooks": "^3.7.8",
"antd": "^5.9.3", "antd": "^5.9.3",
"antd-img-crop": "^4.13.0", "antd-img-crop": "^4.13.0",