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="椤�" />
-              &nbsp;&nbsp;
-              <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