From ff8aab671342b4133f5d6b847eea3a40819f5952 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期一, 26 二月 2024 16:54:29 +0800
Subject: [PATCH] #
---
zy-asrs-flow/src/pages/User/Login/index2.jsx | 222 ++++++++++++++++++++
/dev/null | 397 ------------------------------------
zy-asrs-flow/src/pages/User/Login/logo.png | 0
zy-asrs-flow/config/routes.ts | 2
zy-asrs-flow/src/global.less | 6
zy-asrs-flow/public/login-bg.mp4 | 0
6 files changed, 229 insertions(+), 398 deletions(-)
diff --git a/zy-asrs-flow/config/routes.ts b/zy-asrs-flow/config/routes.ts
index 6807bab..3197a0d 100644
--- a/zy-asrs-flow/config/routes.ts
+++ b/zy-asrs-flow/config/routes.ts
@@ -22,7 +22,7 @@
{
name: 'login',
path: '/user/login',
- component: './User/Login',
+ component: './User/Login/index2',
},
],
},
diff --git a/zy-asrs-flow/public/login-bg.mp4 b/zy-asrs-flow/public/login-bg.mp4
new file mode 100644
index 0000000..dc982dc
--- /dev/null
+++ b/zy-asrs-flow/public/login-bg.mp4
Binary files differ
diff --git a/zy-asrs-flow/src/global.less b/zy-asrs-flow/src/global.less
index e508cbe..555c608 100644
--- a/zy-asrs-flow/src/global.less
+++ b/zy-asrs-flow/src/global.less
@@ -86,4 +86,10 @@
.header-title {
font-size: xx-large;
color: #eee;
+}
+
+.ant-pro-form-login-page-logo {
+ width: 200px;
+ height: 100%;
+ margin: 30px 0;
}
\ No newline at end of file
diff --git a/zy-asrs-flow/src/pages/TableList/components/UpdateForm.tsx b/zy-asrs-flow/src/pages/TableList/components/UpdateForm.tsx
deleted file mode 100644
index 5cd603e..0000000
--- a/zy-asrs-flow/src/pages/TableList/components/UpdateForm.tsx
+++ /dev/null
@@ -1,209 +0,0 @@
-import {
- ProFormDateTimePicker,
- ProFormRadio,
- ProFormSelect,
- ProFormText,
- ProFormTextArea,
- StepsForm,
-} from '@ant-design/pro-components';
-import { FormattedMessage, useIntl } from '@umijs/max';
-import { Modal } from 'antd';
-import React from 'react';
-
-export type FormValueType = {
- target?: string;
- template?: string;
- type?: string;
- time?: string;
- frequency?: string;
-} & Partial<API.RuleListItem>;
-
-export type UpdateFormProps = {
- onCancel: (flag?: boolean, formVals?: FormValueType) => void;
- onSubmit: (values: FormValueType) => Promise<void>;
- updateModalOpen: boolean;
- values: Partial<API.RuleListItem>;
-};
-
-const UpdateForm: React.FC<UpdateFormProps> = (props) => {
- const intl = useIntl();
- return (
- <StepsForm
- stepsProps={{
- size: 'small',
- }}
- stepsFormRender={(dom, submitter) => {
- return (
- <Modal
- width={640}
- bodyStyle={{ padding: '32px 40px 48px' }}
- destroyOnClose
- title={intl.formatMessage({
- id: 'pages.searchTable.updateForm.ruleConfig',
- defaultMessage: '瑙勫垯閰嶇疆',
- })}
- open={props.updateModalOpen}
- footer={submitter}
- onCancel={() => {
- props.onCancel();
- }}
- >
- {dom}
- </Modal>
- );
- }}
- onFinish={props.onSubmit}
- >
- <StepsForm.StepForm
- initialValues={{
- name: props.values.name,
- desc: props.values.desc,
- }}
- title={intl.formatMessage({
- id: 'pages.searchTable.updateForm.basicConfig',
- defaultMessage: '鍩烘湰淇℃伅',
- })}
- >
- <ProFormText
- name="name"
- label={intl.formatMessage({
- id: 'pages.searchTable.updateForm.ruleName.nameLabel',
- defaultMessage: '瑙勫垯鍚嶇О',
- })}
- width="md"
- rules={[
- {
- required: true,
- message: (
- <FormattedMessage
- id="pages.searchTable.updateForm.ruleName.nameRules"
- defaultMessage="璇疯緭鍏ヨ鍒欏悕绉帮紒"
- />
- ),
- },
- ]}
- />
- <ProFormTextArea
- name="desc"
- width="md"
- label={intl.formatMessage({
- id: 'pages.searchTable.updateForm.ruleDesc.descLabel',
- defaultMessage: '瑙勫垯鎻忚堪',
- })}
- placeholder={intl.formatMessage({
- id: 'pages.searchTable.updateForm.ruleDesc.descPlaceholder',
- defaultMessage: '璇疯緭鍏ヨ嚦灏戜簲涓瓧绗�',
- })}
- rules={[
- {
- required: true,
- message: (
- <FormattedMessage
- id="pages.searchTable.updateForm.ruleDesc.descRules"
- defaultMessage="璇疯緭鍏ヨ嚦灏戜簲涓瓧绗︾殑瑙勫垯鎻忚堪锛�"
- />
- ),
- min: 5,
- },
- ]}
- />
- </StepsForm.StepForm>
- <StepsForm.StepForm
- initialValues={{
- target: '0',
- template: '0',
- }}
- title={intl.formatMessage({
- id: 'pages.searchTable.updateForm.ruleProps.title',
- defaultMessage: '閰嶇疆瑙勫垯灞炴��',
- })}
- >
- <ProFormSelect
- name="target"
- width="md"
- label={intl.formatMessage({
- id: 'pages.searchTable.updateForm.object',
- defaultMessage: '鐩戞帶瀵硅薄',
- })}
- valueEnum={{
- 0: '琛ㄤ竴',
- 1: '琛ㄤ簩',
- }}
- />
- <ProFormSelect
- name="template"
- width="md"
- label={intl.formatMessage({
- id: 'pages.searchTable.updateForm.ruleProps.templateLabel',
- defaultMessage: '瑙勫垯妯℃澘',
- })}
- valueEnum={{
- 0: '瑙勫垯妯℃澘涓�',
- 1: '瑙勫垯妯℃澘浜�',
- }}
- />
- <ProFormRadio.Group
- name="type"
- label={intl.formatMessage({
- id: 'pages.searchTable.updateForm.ruleProps.typeLabel',
- defaultMessage: '瑙勫垯绫诲瀷',
- })}
- options={[
- {
- value: '0',
- label: '寮�',
- },
- {
- value: '1',
- label: '寮�',
- },
- ]}
- />
- </StepsForm.StepForm>
- <StepsForm.StepForm
- initialValues={{
- type: '1',
- frequency: 'month',
- }}
- title={intl.formatMessage({
- id: 'pages.searchTable.updateForm.schedulingPeriod.title',
- defaultMessage: '璁惧畾璋冨害鍛ㄦ湡',
- })}
- >
- <ProFormDateTimePicker
- name="time"
- width="md"
- label={intl.formatMessage({
- id: 'pages.searchTable.updateForm.schedulingPeriod.timeLabel',
- defaultMessage: '寮�濮嬫椂闂�',
- })}
- rules={[
- {
- required: true,
- message: (
- <FormattedMessage
- id="pages.searchTable.updateForm.schedulingPeriod.timeRules"
- defaultMessage="璇烽�夋嫨寮�濮嬫椂闂达紒"
- />
- ),
- },
- ]}
- />
- <ProFormSelect
- name="frequency"
- label={intl.formatMessage({
- id: 'pages.searchTable.updateForm.object',
- defaultMessage: '鐩戞帶瀵硅薄',
- })}
- width="md"
- valueEnum={{
- month: '鏈�',
- week: '鍛�',
- }}
- />
- </StepsForm.StepForm>
- </StepsForm>
- );
-};
-
-export default UpdateForm;
diff --git a/zy-asrs-flow/src/pages/TableList/index.tsx b/zy-asrs-flow/src/pages/TableList/index.tsx
deleted file mode 100644
index c201007..0000000
--- a/zy-asrs-flow/src/pages/TableList/index.tsx
+++ /dev/null
@@ -1,397 +0,0 @@
-import { addRule, removeRule, rule, updateRule } from '@/services/ant-design-pro/api';
-import { PlusOutlined } from '@ant-design/icons';
-import type { ActionType, ProColumns, ProDescriptionsItemProps } from '@ant-design/pro-components';
-import {
- FooterToolbar,
- ModalForm,
- PageContainer,
- ProDescriptions,
- ProFormText,
- ProFormTextArea,
- ProTable,
-} from '@ant-design/pro-components';
-import { FormattedMessage, useIntl } from '@umijs/max';
-import { Button, Drawer, Input, message } from 'antd';
-import React, { useRef, useState } from 'react';
-import type { FormValueType } from './components/UpdateForm';
-import UpdateForm from './components/UpdateForm';
-
-/**
- * @en-US Add node
- * @zh-CN 娣诲姞鑺傜偣
- * @param fields
- */
-const handleAdd = async (fields: API.RuleListItem) => {
- const hide = message.loading('姝e湪娣诲姞');
- try {
- await addRule({ ...fields });
- hide();
- message.success('Added successfully');
- return true;
- } catch (error) {
- hide();
- message.error('Adding failed, please try again!');
- return false;
- }
-};
-
-/**
- * @en-US Update node
- * @zh-CN 鏇存柊鑺傜偣
- *
- * @param fields
- */
-const handleUpdate = async (fields: FormValueType) => {
- const hide = message.loading('Configuring');
- try {
- await updateRule({
- name: fields.name,
- desc: fields.desc,
- key: fields.key,
- });
- hide();
-
- message.success('Configuration is successful');
- return true;
- } catch (error) {
- hide();
- message.error('Configuration failed, please try again!');
- return false;
- }
-};
-
-/**
- * Delete node
- * @zh-CN 鍒犻櫎鑺傜偣
- *
- * @param selectedRows
- */
-const handleRemove = async (selectedRows: API.RuleListItem[]) => {
- const hide = message.loading('姝e湪鍒犻櫎');
- if (!selectedRows) return true;
- try {
- await removeRule({
- key: selectedRows.map((row) => row.key),
- });
- hide();
- message.success('Deleted successfully and will refresh soon');
- return true;
- } catch (error) {
- hide();
- message.error('Delete failed, please try again');
- return false;
- }
-};
-
-const TableList: React.FC = () => {
- /**
- * @en-US Pop-up window of new window
- * @zh-CN 鏂板缓绐楀彛鐨勫脊绐�
- * */
- const [createModalOpen, handleModalOpen] = useState<boolean>(false);
- /**
- * @en-US The pop-up window of the distribution update window
- * @zh-CN 鍒嗗竷鏇存柊绐楀彛鐨勫脊绐�
- * */
- const [updateModalOpen, handleUpdateModalOpen] = useState<boolean>(false);
-
- const [showDetail, setShowDetail] = useState<boolean>(false);
-
- const actionRef = useRef<ActionType>();
- const [currentRow, setCurrentRow] = useState<API.RuleListItem>();
- const [selectedRowsState, setSelectedRows] = useState<API.RuleListItem[]>([]);
-
- /**
- * @en-US International configuration
- * @zh-CN 鍥介檯鍖栭厤缃�
- * */
- const intl = useIntl();
-
- const columns: ProColumns<API.RuleListItem>[] = [
- {
- title: (
- <FormattedMessage
- id="pages.searchTable.updateForm.ruleName.nameLabel"
- defaultMessage="Rule name"
- />
- ),
- dataIndex: 'name',
- tip: 'The rule name is the unique key',
- render: (dom, entity) => {
- return (
- <a
- onClick={() => {
- setCurrentRow(entity);
- setShowDetail(true);
- }}
- >
- {dom}
- </a>
- );
- },
- },
- {
- title: <FormattedMessage id="pages.searchTable.titleDesc" defaultMessage="Description" />,
- dataIndex: 'desc',
- valueType: 'textarea',
- },
- {
- title: (
- <FormattedMessage
- id="pages.searchTable.titleCallNo"
- defaultMessage="Number of service calls"
- />
- ),
- dataIndex: 'callNo',
- sorter: true,
- hideInForm: true,
- renderText: (val: string) =>
- `${val}${intl.formatMessage({
- id: 'pages.searchTable.tenThousand',
- defaultMessage: ' 涓� ',
- })}`,
- },
- {
- title: <FormattedMessage id="pages.searchTable.titleStatus" defaultMessage="Status" />,
- dataIndex: 'status',
- hideInForm: true,
- valueEnum: {
- 0: {
- text: (
- <FormattedMessage
- id="pages.searchTable.nameStatus.default"
- defaultMessage="Shut down"
- />
- ),
- status: 'Default',
- },
- 1: {
- text: (
- <FormattedMessage id="pages.searchTable.nameStatus.running" defaultMessage="Running" />
- ),
- status: 'Processing',
- },
- 2: {
- text: (
- <FormattedMessage id="pages.searchTable.nameStatus.online" defaultMessage="Online" />
- ),
- status: 'Success',
- },
- 3: {
- text: (
- <FormattedMessage
- id="pages.searchTable.nameStatus.abnormal"
- defaultMessage="Abnormal"
- />
- ),
- status: 'Error',
- },
- },
- },
- {
- title: (
- <FormattedMessage
- id="pages.searchTable.titleUpdatedAt"
- defaultMessage="Last scheduled time"
- />
- ),
- sorter: true,
- dataIndex: 'updatedAt',
- valueType: 'dateTime',
- renderFormItem: (item, { defaultRender, ...rest }, form) => {
- const status = form.getFieldValue('status');
- if (`${status}` === '0') {
- return false;
- }
- if (`${status}` === '3') {
- return (
- <Input
- {...rest}
- placeholder={intl.formatMessage({
- id: 'pages.searchTable.exception',
- defaultMessage: 'Please enter the reason for the exception!',
- })}
- />
- );
- }
- return defaultRender(item);
- },
- },
- {
- title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="Operating" />,
- dataIndex: 'option',
- valueType: 'option',
- render: (_, record) => [
- <a
- key="config"
- onClick={() => {
- handleUpdateModalOpen(true);
- setCurrentRow(record);
- }}
- >
- <FormattedMessage id="pages.searchTable.config" defaultMessage="Configuration" />
- </a>,
- <a key="subscribeAlert" href="https://procomponents.ant.design/">
- <FormattedMessage
- id="pages.searchTable.subscribeAlert"
- defaultMessage="Subscribe to alerts"
- />
- </a>,
- ],
- },
- ];
-
- return (
- <PageContainer>
- <ProTable<API.RuleListItem, API.PageParams>
- headerTitle={intl.formatMessage({
- id: 'pages.searchTable.title',
- defaultMessage: 'Enquiry form',
- })}
- actionRef={actionRef}
- rowKey="key"
- search={{
- labelWidth: 120,
- }}
- toolBarRender={() => [
- <Button
- type="primary"
- key="primary"
- onClick={() => {
- handleModalOpen(true);
- }}
- >
- <PlusOutlined /> <FormattedMessage id="pages.searchTable.new" defaultMessage="New" />
- </Button>,
- ]}
- request={rule}
- columns={columns}
- rowSelection={{
- onChange: (_, selectedRows) => {
- setSelectedRows(selectedRows);
- },
- }}
- />
- {selectedRowsState?.length > 0 && (
- <FooterToolbar
- extra={
- <div>
- <FormattedMessage id="pages.searchTable.chosen" defaultMessage="Chosen" />{' '}
- <a style={{ fontWeight: 600 }}>{selectedRowsState.length}</a>{' '}
- <FormattedMessage id="pages.searchTable.item" defaultMessage="椤�" />
-
- <span>
- <FormattedMessage
- id="pages.searchTable.totalServiceCalls"
- defaultMessage="Total number of service calls"
- />{' '}
- {selectedRowsState.reduce((pre, item) => pre + item.callNo!, 0)}{' '}
- <FormattedMessage id="pages.searchTable.tenThousand" defaultMessage="涓�" />
- </span>
- </div>
- }
- >
- <Button
- onClick={async () => {
- await handleRemove(selectedRowsState);
- setSelectedRows([]);
- actionRef.current?.reloadAndRest?.();
- }}
- >
- <FormattedMessage
- id="pages.searchTable.batchDeletion"
- defaultMessage="Batch deletion"
- />
- </Button>
- <Button type="primary">
- <FormattedMessage
- id="pages.searchTable.batchApproval"
- defaultMessage="Batch approval"
- />
- </Button>
- </FooterToolbar>
- )}
- <ModalForm
- title={intl.formatMessage({
- id: 'pages.searchTable.createForm.newRule',
- defaultMessage: 'New rule',
- })}
- width="400px"
- open={createModalOpen}
- onOpenChange={handleModalOpen}
- onFinish={async (value) => {
- const success = await handleAdd(value as API.RuleListItem);
- if (success) {
- handleModalOpen(false);
- if (actionRef.current) {
- actionRef.current.reload();
- }
- }
- }}
- >
- <ProFormText
- rules={[
- {
- required: true,
- message: (
- <FormattedMessage
- id="pages.searchTable.ruleName"
- defaultMessage="Rule name is required"
- />
- ),
- },
- ]}
- width="md"
- name="name"
- />
- <ProFormTextArea width="md" name="desc" />
- </ModalForm>
- <UpdateForm
- onSubmit={async (value) => {
- const success = await handleUpdate(value);
- if (success) {
- handleUpdateModalOpen(false);
- setCurrentRow(undefined);
- if (actionRef.current) {
- actionRef.current.reload();
- }
- }
- }}
- onCancel={() => {
- handleUpdateModalOpen(false);
- if (!showDetail) {
- setCurrentRow(undefined);
- }
- }}
- updateModalOpen={updateModalOpen}
- values={currentRow || {}}
- />
-
- <Drawer
- width={600}
- open={showDetail}
- onClose={() => {
- setCurrentRow(undefined);
- setShowDetail(false);
- }}
- closable={false}
- >
- {currentRow?.name && (
- <ProDescriptions<API.RuleListItem>
- column={2}
- title={currentRow?.name}
- request={async () => ({
- data: currentRow || {},
- })}
- params={{
- id: currentRow?.name,
- }}
- columns={columns as ProDescriptionsItemProps<API.RuleListItem>[]}
- />
- )}
- </Drawer>
- </PageContainer>
- );
-};
-
-export default TableList;
diff --git a/zy-asrs-flow/src/pages/User/Login/index2.jsx b/zy-asrs-flow/src/pages/User/Login/index2.jsx
new file mode 100644
index 0000000..0f0ed65
--- /dev/null
+++ b/zy-asrs-flow/src/pages/User/Login/index2.jsx
@@ -0,0 +1,222 @@
+import {
+ LockOutlined,
+ MobileOutlined,
+ UserOutlined,
+} from '@ant-design/icons';
+import {
+ LoginFormPage,
+ ProConfigProvider,
+ ProFormCaptcha,
+ ProFormCheckbox,
+ ProFormText,
+} from '@ant-design/pro-components';
+import { Button, Divider, Space, Tabs, message, theme } from 'antd';
+import { useState } from 'react';
+import { FormattedMessage, history, SelectLang, useIntl, useModel, Helmet } from '@umijs/max';
+
+import logo from './logo.png'
+
+const Page = () => {
+ const intl = useIntl();
+
+ const [loginType, setLoginType] = useState('account');
+ const { token } = theme.useToken();
+
+ const handleSubmit = async (values) => {
+ try {
+ const r = await request('/api/login', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ data: values
+ })
+
+ if (r.code === 200) {
+ message.success(intl.formatMessage({
+ id: 'pages.login.success',
+ defaultMessage: '鐧诲綍鎴愬姛锛�',
+ }));
+ setToken(r.data.accessToken, values.autoLogin);
+ await fetchUserInfo();
+ const urlParams = new URL(window.location.href).searchParams;
+ history.push(urlParams.get('redirect') || '/');
+ return;
+ }
+ setUserLoginState({
+ status: r.code,
+ type: type,
+ })
+ } catch (error) {
+ console.log(error);
+ message.error(intl.formatMessage({
+ id: 'pages.login.failure',
+ defaultMessage: '鐧诲綍澶辫触锛岃閲嶈瘯锛�',
+ }));
+ }
+ }
+
+ return (
+ <div
+ style={{
+ backgroundColor: 'white',
+ height: '100vh',
+ }}
+ >
+ <LoginFormPage
+ backgroundImageUrl="https://mdn.alipayobjects.com/huamei_gcee1x/afts/img/A*y0ZTS6WLwvgAAAAAAAAAAAAADml6AQ/fmt.webp"
+ logo={logo}
+ backgroundVideoUrl="https://gw.alipayobjects.com/v/huamei_gcee1x/afts/video/jXRBRK_VAwoAAAAAAAAAAAAAK4eUAQBr"
+ // title="闄嗘檽娑�"
+ // subTitle="闄嗘檽娑�..."
+ containerStyle={{
+ backgroundColor: 'rgba(0, 0, 0,0.65)',
+ backdropFilter: 'blur(4px)',
+ }}
+ initialValues={{
+ username: 'root',
+ password: '123456',
+ autoLogin: true,
+ }}
+ onFinish={async (values) => {
+ await handleSubmit(values);
+ }}
+ >
+ <Tabs
+ centered
+ activeKey={loginType}
+ onChange={(activeKey) => setLoginType(activeKey)}
+ >
+ <Tabs.TabPane key={'account'} tab={'璐﹀彿瀵嗙爜鐧诲綍'} />
+ <Tabs.TabPane key={'phone'} tab={'鎵嬫満鍙风櫥褰�'} />
+ </Tabs>
+ {loginType === 'account' && (
+ <>
+ <ProFormText
+ name="username"
+ fieldProps={{
+ size: 'large',
+ prefix: (
+ <UserOutlined
+ style={{
+ color: token.colorText,
+ }}
+ className={'prefixIcon'}
+ />
+ ),
+ }}
+ placeholder={'鐢ㄦ埛鍚�: root'}
+ rules={[
+ {
+ required: true,
+ message: '璇疯緭鍏ョ敤鎴峰悕!',
+ },
+ ]}
+ />
+ <ProFormText.Password
+ name="password"
+ fieldProps={{
+ size: 'large',
+ prefix: (
+ <LockOutlined
+ style={{
+ color: token.colorText,
+ }}
+ className={'prefixIcon'}
+ />
+ ),
+ }}
+ placeholder={'瀵嗙爜: 123456'}
+ rules={[
+ {
+ required: true,
+ message: '璇疯緭鍏ュ瘑鐮侊紒',
+ },
+ ]}
+ />
+ </>
+ )}
+ {loginType === 'phone' && (
+ <>
+ <ProFormText
+ fieldProps={{
+ size: 'large',
+ prefix: (
+ <MobileOutlined
+ style={{
+ color: token.colorText,
+ }}
+ className={'prefixIcon'}
+ />
+ ),
+ }}
+ name="mobile"
+ placeholder={'鎵嬫満鍙�'}
+ rules={[
+ {
+ required: true,
+ message: '璇疯緭鍏ユ墜鏈哄彿锛�',
+ },
+ {
+ pattern: /^1\d{10}$/,
+ message: '鎵嬫満鍙锋牸寮忛敊璇紒',
+ },
+ ]}
+ />
+ <ProFormCaptcha
+ fieldProps={{
+ size: 'large',
+ prefix: (
+ <LockOutlined
+ style={{
+ color: token.colorText,
+ }}
+ className={'prefixIcon'}
+ />
+ ),
+ }}
+ captchaProps={{
+ size: 'large',
+ }}
+ placeholder={'璇疯緭鍏ラ獙璇佺爜'}
+ captchaTextRender={(timing, count) => {
+ if (timing) {
+ return `${count} ${'鑾峰彇楠岃瘉鐮�'}`;
+ }
+ return '鑾峰彇楠岃瘉鐮�';
+ }}
+ name="captcha"
+ rules={[
+ {
+ required: true,
+ message: '璇疯緭鍏ラ獙璇佺爜锛�',
+ },
+ ]}
+ onGetCaptcha={async () => {
+ // message.success('鑾峰彇楠岃瘉鐮佹垚鍔燂紒楠岃瘉鐮佷负锛�1234');
+ message.warning('鏈紑鍚墜鏈哄彿鐧诲綍! ');
+ }}
+ />
+ </>
+ )}
+ <div
+ style={{
+ marginBlockEnd: 24,
+ }}
+ >
+ <ProFormCheckbox noStyle name="autoLogin">
+ 鑷姩鐧诲綍
+ </ProFormCheckbox>
+ </div>
+ </LoginFormPage>
+ </div>
+ );
+};
+
+export default () => {
+ return (
+ <ProConfigProvider dark>
+ <Page />
+ </ProConfigProvider>
+ );
+};
\ No newline at end of file
diff --git a/zy-asrs-flow/src/pages/User/Login/logo.png b/zy-asrs-flow/src/pages/User/Login/logo.png
new file mode 100644
index 0000000..21a19b9
--- /dev/null
+++ b/zy-asrs-flow/src/pages/User/Login/logo.png
Binary files differ
--
Gitblit v1.9.1