antd pro v5 登录流程

涉及的主要文件

.
├── mock    
    ├── user.ts    
└── src
    ├── pages.tsx
        ├── user 
            ├── login
                ├── index.tsx
    ├── app.tsx

未登录时,路由跳转到登录界面

非登陆界面
// 非登陆界面  ======>
### src/app.tsx ###########################
// 如果不是登录页面,执行
  if (history.location.pathname !== '/user/login') {
    const currentUser = await fetchUserInfo();  // 1. 通过fetchUserInfo访问mock的api判断是否登录了(这里是通过后台access参数验证的,后面有描述)
    const menuData = await fetchMenu();

    return {
      fetchUserInfo,
      currentUser,
      menuData,
      settings: defaultSettings,
    };
  }

### src/app.tsx ###########################
// fetchUserInfo 具体请求
const fetchUserInfo = async () => {
    try {
      const currentUser = await queryCurrent();  // 2. fetchUserInfo具体请求api判断是否登录了
      return currentUser;
    } catch (error) {                           
      history.push('/user/login');               // 5. 401状态抛出异常,跳转到登录界面
    }
    return undefined;
  };

### mock/user.ts ###########################
// 请求数据返回
const { ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION } = process.env;
let access = ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION === 'site' ? 'admin' : '';

const getAccess = () => {
  return access;
};
......
if (!getAccess()) {                              // 3. 判断access是否登录,此时的 access 为''
      res.status(401).send({                     // 4. 返回401状态 
        data: {
          isLogin: false,
        },
        errorCode: '401',
        errorMessage: '请先登录!',
        success: true,
      });
      return;
    }

登录界面
// 登录界面 =======>
### src/user/login/index.tsx###########################
 // 登录
const msg = await fakeAccountLogin({ ...values, type });    // 1. 登录请求

### mock/user.ts ###########################
 // 数据请求返回
if (password === 'ant.design' && username === 'admin') {
      res.send({                                            // 2. 返回数据
        status: 'ok',
        type,
        currentAuthority: 'admin',
      });
      access = 'admin';                                     // 3. 将access参数赋值为 'adimin'
      return;
 }

### src/user/login/index.tsx###########################
if (msg.status === 'ok' && initialState) {
    message.success('登录成功!');
    const currentUser = await initialState?.fetchUserInfo();  // 4. 与非登陆界面操作一样,使用fetchUserInfo函数请求后台,判断是否为登录(即判断access参数,此时为'admin')
    setInitialState({
          ...initialState,
          currentUser,                                      // 5. 返回数据写入全局变量
    });
    replaceGoto();                                          // 6. 跳转进入后台管理界面
    return;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容