Introduction et utilisation d'ant-design-pro (comprendre la structure du framework)

page d'accueil

Si vous accédez au projet sans vous connecter, la page initiale passera directement à  la page Bienvenue*. À partir de la configuration du routage, nous pouvons voir que si nous accédons à  http://localhost:8000/ , les seules routes correspondantes seront * redirigées  vers le composant * Bienvenue* .

Disposition du framework et composants principaux

Le routage passe par  les composants SecurityLayout **, BasicLayout  et BlankLayout ** en haut . Alors quelles sont les fonctions de ces trois composants ?

Composant BlankLayout

Emplacement du composant :  src/layouts/BlankLayout , ce composant est le composant de niveau supérieur du projet et peut mieux afficher les invites d'erreur en mode développement. Le composant actuel peut être compris comme un composant vide.

import React from 'react';
import { Inspector } from 'react-dev-inspector';

const InspectorWrapper = process.env.NODE_ENV === 'development' ? Inspector : React.Fragment;

const Layout: React.FC = ({ children }) => {
  // {children} 是dom内容,可以理解为 vue中的插槽 
  // dom的内容会直接被解析到这里
  // InspectorWrapper 是根据是否为开发模式而替换为 Inspector 或正常的React虚拟组件
  // Inspector 可以使我们在开发阶段 代码报错 提示的更友好
  return <InspectorWrapper>{children}</InspectorWrapper>;
};

export default Layout;

Composant SecurityLayout

Emplacement du composant :  src/layouts/SecurityLayout , comme son nom l'indique, ce composant doit avoir un certain contrôle sur l'accès sécurisé.
Ici, le jugement logique de savoir s'il faut ou non se connecter est mis en œuvre : si vous êtes connecté,  <PageLoading /> le composant sera affiché ; si vous n'êtes pas connecté , redirigez vers  /user/login ; si la connexion réussit, renvoyez le composant enfant.

render() {
  // 组件是否渲染完毕
    const { isReady } = this.state;
  // loading为获取user用户信息的网络请求状态 由dva-loading管控
    const { children, loading, currentUser } = this.props;

    // You can replace it to your authentication rule (such as check token exists)
    // 你可以把它替换成你自己的登录认证规则(比如判断 token 是否存在)
    const isLogin = currentUser && currentUser.userid;
    const queryString = stringify({
      redirect: window.location.href,
    });
     // 未登录 且在loading状态 或者组件未渲染完毕
    if ((!isLogin && loading) || !isReady) {
      return <PageLoading />;
    }
      // 未登录 且跳转未非登录页
    if (!isLogin && window.location.pathname !== '/user/login') {
      return <Redirect to={`/user/login?${queryString}`} />;
    }
    return children;
  }

Composant BasicLayout

 Le composant actuel est le composant principal de la mise en page backend et est implémenté à l'aide de  ProLayout .
ProLayout  est un composant avancé packagé sur la base de la conception ant. ProLayout peut fournir une mise en page standard standard mais flexible au milieu et au backend, et en même temps le temps fournit des formulaires de mise en page Switch en un clic, génère automatiquement des menus et d'autres fonctions. Utilisé conjointement avec PageContainer, il peut générer automatiquement des fils d'Ariane, des titres de page et fournir une solution peu coûteuse pour accéder à la barre d'outils de pied de page. Les fonctions liées aux 
autorisations de pageAuthorized  sont contrôlées par une combinaison de configuration de composant et d'itinéraire. L'idée générale est   de comparer le  rôle de l'utilisateur actuel * avec les autorisations de l' Authorized attribut du composant * l'autoriténoMatch pour contrôler si le contenu du composant est rendu ou rendu dans  le composant correspondant. Cette idée d'implémentation est à peu près la même que l'idée que nous avons dans le modèle vue-element-admin, mais elle est différente de l'idée des autorisations dynamiques dans notre cours. La partie autorisations sera expliquée en détail plus tard, donc vous pouvez l'ignorer pour l'instant.

/**
 * Ant Design Pro v4 use `@ant-design/pro-layout` to handle Layout.
 * @see You can view component api by: https://github.com/ant-design/ant-design-pro-layout
 */
...
return (
    <ProLayout
      logo={logo}
      formatMessage={formatMessage}
      {...props}
      {...settings}
      onCollapse={handleMenuCollapse}
      onMenuHeaderClick={() => history.push('/')}
      menuItemRender={(menuItemProps, defaultDom) => {
        if (
          menuItemProps.isUrl ||
          !menuItemProps.path ||
          location.pathname === menuItemProps.path
        ) {
          return defaultDom;
        }
        return <Link to={menuItemProps.path}>{defaultDom}</Link>;
      }}
      breadcrumbRender={(routers = []) => [
        {
          path: '/',
          breadcrumbName: formatMessage({ id: 'menu.home' }),
        },
        ...routers,
      ]}
      itemRender={(route, params, routes, paths) => {
        const first = routes.indexOf(route) === 0;
        return first ? (
          <Link to={paths.join('/')}>{route.breadcrumbName}</Link>
        ) : (
          <span>{route.breadcrumbName}</span>
        );
      }}
      footerRender={() => {
        if (settings.footerRender || settings.footerRender === undefined) {
          return defaultFooterDom;
        }
        return null;
      }}
      menuDataRender={menuDataRender}
      rightContentRender={() => <RightContent />}
      postMenuData={(menuData) => {
        menuDataRef.current = menuData || [];
        return menuData || [];
      }}
    >
      // 这里是权限控制 可以通过当前用户的角色 和authority 的角色列表做对比 
      // 当前项目不用考虑页面权限, 具体实现会在后续的教程里体现
      <Authorized authority={authorized!.authority} noMatch={noMatch}>
        {children}
      </Authorized>
    </ProLayout>
  );
};


比如 config/route.ts 路由部分权限配置
 ...
 routes: [
   {
     path: '/admin/sub-page',
     name: 'sub-page',
     icon: 'smile',
     component: './Welcome',
     authority: ['admin'],
   },
 ],

Composant UserLayout

Le composant actuel est un composant conteneur qui enveloppe la page de connexion de l'utilisateur. Vous pouvez définir le titre de la page Web, la méta, les options d'internationalisation, le logo de la page de connexion, le pied de page et d'autres fonctions via le composant actuel.

return (
    <HelmetProvider>
      <Helmet>
        <title>{title}</title>
        <meta name="description" content={title} />
      </Helmet>

      <div className={styles.container}>
        <div className={styles.lang}>
          <SelectLang />
        </div>
        <div className={styles.content}>
          <div className={styles.top}>
            <div className={styles.header}>
              <Link to="/">
                <img alt="logo" className={styles.logo} src={logo} />
                <span className={styles.title}>Ant Design</span>
              </Link>
            </div>
            <div className={styles.desc}>
              <FormattedMessage
                id="pages.layouts.userLayout.title"
                defaultMessage="Ant Design 是西湖区最具影响力的 Web 设计规范"
              />
            </div>
          </div>
                    // Login组件在这里渲染
          {children}
        </div>
        <DefaultFooter />
      </div>
    </HelmetProvider>
  );

Page de connexion

Nous pouvons accéder directement  http://localhost:8000/user/login pour accéder à la page de connexion, ou cliquer pour lancer en arrière-plan pour accéder à la page de connexion. Après vous être connecté au composant correspondant de la page de connexion, la barre latérale  a une fonction de page de gestionpages/User/login/index.tsx
supplémentaire  . Cette page ne fera que apparaît admin * est *rôle après la connexion et le 
 


 


src/layouts/BasicLayout.tsx Partie de code pour le contrôle des autorisations :

/** Use Authorized check all menu item */

const menuDataRender = (menuList: MenuDataItem[]): MenuDataItem[] =>
  menuList.map((item) => {
    const localItem = {
      ...item,
      children: item.children ? menuDataRender(item.children) : undefined,
    };
    // 使用Authorized鉴权判断当前sideItem是否被渲染
    return Authorized.check(item.authority, localItem, null) as MenuDataItem;
  });

Résumer

Nous avons essentiellement compris la structure de base du modèle de cadre backend ant design pro. Ensuite, nous devons développer en fonction de nos propres besoins. Parce que la
page de connexion du modèle par défaut est relativement complexe et ne répond pas à nos besoins, nous pouvons remplacer le login requis par nous-mêmes.Modèle.Nous commencerons le développement spécifique dans la section suivante.

Je suppose que tu aimes

Origine blog.csdn.net/m0_67388537/article/details/131955316
conseillé
Classement