diff --git a/src/assets/images/bg-11.png b/src/assets/images/bg-11.png deleted file mode 100644 index 797006ad..00000000 Binary files a/src/assets/images/bg-11.png and /dev/null differ diff --git a/src/assets/images/bg-2.png b/src/assets/images/bg-2.png new file mode 100644 index 00000000..4f565469 Binary files /dev/null and b/src/assets/images/bg-2.png differ diff --git a/src/assets/images/favicon.ico b/src/assets/images/favicon.ico deleted file mode 100644 index 76597bea..00000000 Binary files a/src/assets/images/favicon.ico and /dev/null differ diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png deleted file mode 100644 index 22cccba8..00000000 Binary files a/src/assets/images/logo.png and /dev/null differ diff --git a/src/assets/images/small-logo-200x200.png b/src/assets/images/small-logo-200x200.png new file mode 100644 index 00000000..339af613 Binary files /dev/null and b/src/assets/images/small-logo-200x200.png differ diff --git a/src/components/footer/index.less b/src/components/footer/index.less new file mode 100644 index 00000000..7dadef05 --- /dev/null +++ b/src/components/footer/index.less @@ -0,0 +1,11 @@ +// footer all styles +.footer { + position: fixed; + bottom: 0; + width: 100%; + background-color: transparent; + padding: 20px 0; + text-align: center; + font-size: var(--font-size-middle); + color: var(--color-text-2); +} diff --git a/src/components/footer/index.tsx b/src/components/footer/index.tsx new file mode 100644 index 00000000..d2b04233 --- /dev/null +++ b/src/components/footer/index.tsx @@ -0,0 +1,24 @@ +import { useIntl } from '@umijs/max'; +import { Space } from 'antd'; +import './index.less'; + +const Footer: React.FC = () => { + const intl = useIntl(); + return ( +
+
+
+
+ + © + {new Date().getFullYear()} + {intl.formatMessage({ id: 'settings.company' })} + +
+
+
+
+ ); +}; + +export default Footer; diff --git a/src/components/seal-form/components/wrapper.tsx b/src/components/seal-form/components/wrapper.tsx index a86a431c..db6c350e 100644 --- a/src/components/seal-form/components/wrapper.tsx +++ b/src/components/seal-form/components/wrapper.tsx @@ -35,6 +35,7 @@ const Wrapper: React.FC = ({
{ return logo; }; +const SLogoIcon: React.FC = () => { + return logo; +}; -export default LogoIcon; +export { LogoIcon, SLogoIcon }; diff --git a/src/layouts/index.tsx b/src/layouts/index.tsx index f096a5ef..76f43a30 100644 --- a/src/layouts/index.tsx +++ b/src/layouts/index.tsx @@ -4,6 +4,7 @@ import { userAtom } from '@/atoms/user'; import { logout } from '@/pages/login/apis'; import { useAccessMarkedRoutes } from '@@/plugin-access'; import { useModel } from '@@/plugin-model'; + import { ProLayout } from '@ant-design/pro-components'; import { Link, @@ -17,13 +18,12 @@ import { type IRoute } from '@umijs/max'; import { useAtom } from 'jotai'; -import { useMemo } from 'react'; +import { useMemo, useState } from 'react'; import Exception from './Exception'; import './Layout.css'; -import Logo from './Logo'; +import { LogoIcon, SLogoIcon } from './Logo'; import { getRightRenderContent } from './rightRender'; import { patchRoutes } from './runtime'; - const loginPath = '/login'; // 过滤出需要显示的路由, 这里的filterFn 指 不希望显示的层级 @@ -84,6 +84,7 @@ export default (props: any) => { const navigate = useNavigate(); const intl = useIntl(); const { clientRoutes, pluginManager } = useAppData(); + const [collapsed, setCollapsed] = useState(false); const initialInfo = (useModel && useModel('@@initialState')) || { initialState: undefined, @@ -94,7 +95,6 @@ export default (props: any) => { const userConfig = { title: '', - layout: 'mix', locale: true }; @@ -145,12 +145,18 @@ export default (props: any) => { location={location} title={userConfig.title} navTheme="light" + layout="side" + disableMobile={true} siderWidth={220} onMenuHeaderClick={(e) => { e.stopPropagation(); e.preventDefault(); navigate('/'); }} + collapsed={collapsed} + onCollapse={(collapsed) => { + setCollapsed(collapsed); + }} onPageChange={(route) => { const { location } = history; @@ -178,9 +184,8 @@ export default (props: any) => { }} formatMessage={formatMessage} menu={{ locale: true }} - logo={Logo} + logo={collapsed ? SLogoIcon : LogoIcon} menuItemRender={(menuItemProps, defaultDom) => { - console.log('meurender=========', { defaultDom }); if (menuItemProps.isUrl || menuItemProps.children) { return defaultDom; } diff --git a/src/layouts/render-links.tsx b/src/layouts/render-links.tsx new file mode 100644 index 00000000..8fdfebd4 --- /dev/null +++ b/src/layouts/render-links.tsx @@ -0,0 +1,66 @@ +import { + AppstoreOutlined, + MailOutlined, + SettingOutlined +} from '@ant-design/icons'; +import { Menu, type MenuProps } from 'antd'; +import React from 'react'; + +type MenuItem = Required['items'][number]; +const items: MenuItem[] = [ + { + key: 'sub1', + icon: , + label: 'Navigation One', + children: [ + { + key: '1-1', + label: 'Item 1', + type: 'group', + children: [ + { key: '1', label: 'Option 1' }, + { key: '2', label: 'Option 2' } + ] + }, + { + key: '1-2', + label: 'Item 2', + type: 'group', + children: [ + { key: '3', label: 'Option 3' }, + { key: '4', label: 'Option 4' } + ] + } + ] + }, + { + key: 'sub2', + icon: , + label: 'Navigation Two', + children: [ + { key: '5', label: 'Option 5' }, + { key: '6', label: 'Option 6' }, + { + key: 'sub3', + label: 'Submenu' + } + ] + }, + { + key: 'sub4', + label: 'Navigation Three', + icon: , + children: [ + { key: '9', label: 'Option 9' }, + { key: '10', label: 'Option 10' }, + { key: '11', label: 'Option 11' }, + { key: '12', label: 'Option 12' } + ] + } +]; + +const RenderLinks: React.FC = () => { + return ; +}; + +export default React.memo(RenderLinks); diff --git a/src/layouts/rightRender.tsx b/src/layouts/rightRender.tsx index 22566152..4f285e9d 100644 --- a/src/layouts/rightRender.tsx +++ b/src/layouts/rightRender.tsx @@ -62,6 +62,7 @@ export function getRightRenderContent(opts: { @@ -113,18 +114,6 @@ export function getRightRenderContent(opts: { history.push('/profile'); } }, - // { - // key: 'theme', - // label: ( - // <> - // - // 外观 - // - // ), - // onClick: () => { - // console.log('theme'); - // } - // }, { key: 'logout', label: ( @@ -158,7 +147,9 @@ export function getRightRenderContent(opts: { }; } else { // 需要 antd 4.20.0 以上版本 - dropdownProps = { overlay: }; + dropdownProps = { + overlay: + }; } return ( diff --git a/src/locales/en-US/common.ts b/src/locales/en-US/common.ts index 4ee2639d..4d3992e8 100644 --- a/src/locales/en-US/common.ts +++ b/src/locales/en-US/common.ts @@ -186,5 +186,6 @@ export default { 'common.filter.name': 'Filter by name', 'common.form.password': 'Password', 'common.form.username': 'Username', - 'common.login.rember': 'Remember me' + 'common.login.rember': 'Remember me', + 'settings.company': 'SEAL' }; diff --git a/src/locales/zh-CN/common.ts b/src/locales/zh-CN/common.ts index 25034163..52c057ed 100644 --- a/src/locales/zh-CN/common.ts +++ b/src/locales/zh-CN/common.ts @@ -179,5 +179,6 @@ export default { 'common.filter.name': '名称查询', 'common.form.password': '密码', 'common.form.username': '用户名', - 'common.login.rember': '记住我' + 'common.login.rember': '记住我', + 'settings.company': '数澈软件' }; diff --git a/src/pages/login/components/login-form.tsx b/src/pages/login/components/login-form.tsx index 3b6c87c4..7d68acf3 100644 --- a/src/pages/login/components/login-form.tsx +++ b/src/pages/login/components/login-form.tsx @@ -155,7 +155,7 @@ const LoginForm = () => {
{renderWelCome(intl)} diff --git a/src/pages/login/components/password-form.tsx b/src/pages/login/components/password-form.tsx index 4c6b2f7c..e032b185 100644 --- a/src/pages/login/components/password-form.tsx +++ b/src/pages/login/components/password-form.tsx @@ -46,7 +46,7 @@ const PasswordForm: React.FC = () => {

diff --git a/src/pages/login/components/styles.less b/src/pages/login/components/styles.less new file mode 100644 index 00000000..25a7951a --- /dev/null +++ b/src/pages/login/components/styles.less @@ -0,0 +1,16 @@ +:local(.login-form-wrapper) { + margin: 0 auto; + border-radius: 8px; + width: max-content; + height: max-content; + padding: 32px; + background-color: rgba(255, 255, 255, 50%); + + :global(.field-wrapper) { + background-color: transparent !important; + } +} + +:local(.box) { + padding-top: 10%; +} diff --git a/src/pages/login/index.tsx b/src/pages/login/index.tsx index ef33d33c..42f55ee5 100644 --- a/src/pages/login/index.tsx +++ b/src/pages/login/index.tsx @@ -1,9 +1,11 @@ import { userAtom } from '@/atoms/user'; +import Footer from '@/components/footer'; import { history } from '@umijs/max'; import { useAtom } from 'jotai'; import { useEffect } from 'react'; import LoginForm from './components/login-form'; import PasswordForm from './components/password-form'; +import styles from './components/styles.less'; const Login = () => { const [userInfo, setUserInfo] = useAtom(userAtom); @@ -21,9 +23,15 @@ const Login = () => { }, [userInfo]); return ( -
- {userInfo?.require_password_change ? : } -
+ <> +
+
+
+ {userInfo?.require_password_change ? : } +
+
+ ); }; diff --git a/src/pages/users/index.tsx b/src/pages/users/index.tsx index 781ec888..df248af6 100644 --- a/src/pages/users/index.tsx +++ b/src/pages/users/index.tsx @@ -24,7 +24,8 @@ import AddModal from './components/add-modal'; import { FormData, ListItem } from './config/types'; const { Column } = Table; -const Models: React.FC = () => { +const Users: React.FC = () => { + console.log('users======'); const rowSelection = useTableRowSelection(); const { sortOrder, setSortOrder } = useTableSort({ defaultSortOrder: 'descend' @@ -328,4 +329,4 @@ const Models: React.FC = () => { ); }; -export default Models; +export default Users;