feat: user auth
This commit is contained in:
		
							parent
							
								
									7394e0aa8a
								
							
						
					
					
						commit
						589fca05d0
					
				@ -108,39 +108,17 @@ import * as uiSchema from './ui-schema';
 | 
			
		||||
        extname: '.png',
 | 
			
		||||
        mimetype: 'image/png',
 | 
			
		||||
        url: 'https://nocobase.oss-cn-beijing.aliyuncs.com/682e5ad037dd02a0fe4800a3e91c283b.png',
 | 
			
		||||
        created_at: '2021-08-16T06:31:53.214Z',
 | 
			
		||||
        updated_at: '2021-08-16T06:31:53.214Z',
 | 
			
		||||
        storage_id: 2,
 | 
			
		||||
      },
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const User = database.getModel('users');
 | 
			
		||||
  const user = await User.create({
 | 
			
		||||
    email: process.env.ADMIN_EMAIL,
 | 
			
		||||
    password: process.env.ADMIN_PASSWORD,
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  await database.close();
 | 
			
		||||
})();
 | 
			
		||||
 | 
			
		||||
const a = {
 | 
			
		||||
  data: {
 | 
			
		||||
    id: 1,
 | 
			
		||||
    title: 'NocoBase',
 | 
			
		||||
    created_at: '2021-08-16T05:37:50.751Z',
 | 
			
		||||
    updated_at: '2021-08-16T06:31:55.069Z',
 | 
			
		||||
    logo_id: 3,
 | 
			
		||||
    created_by_id: null,
 | 
			
		||||
    updated_by_id: null,
 | 
			
		||||
    logo: {
 | 
			
		||||
      id: 3,
 | 
			
		||||
      title: 'logo-white (1)',
 | 
			
		||||
      filename: '682e5ad037dd02a0fe4800a3e91c283b.png',
 | 
			
		||||
      extname: '.png',
 | 
			
		||||
      size: null,
 | 
			
		||||
      mimetype: 'image/png',
 | 
			
		||||
      path: '',
 | 
			
		||||
      meta: {},
 | 
			
		||||
      url: 'https://nocobase.oss-cn-beijing.aliyuncs.com/682e5ad037dd02a0fe4800a3e91c283b.png',
 | 
			
		||||
      created_at: '2021-08-16T06:31:53.214Z',
 | 
			
		||||
      updated_at: '2021-08-16T06:31:53.214Z',
 | 
			
		||||
      created_by_id: null,
 | 
			
		||||
      updated_by_id: null,
 | 
			
		||||
      storage_id: 2,
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,15 @@ const request = extend({
 | 
			
		||||
  timeout: 30000,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
request.use(async (ctx, next) => {
 | 
			
		||||
  const { headers } = ctx.req.options as any;
 | 
			
		||||
  const token = localStorage.getItem('NOCOBASE_TOKEN');
 | 
			
		||||
  if (token) {
 | 
			
		||||
    headers['Authorization'] = `Bearer ${token}`;
 | 
			
		||||
  }
 | 
			
		||||
  await next();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const RouteSwitch = createRouteSwitch({
 | 
			
		||||
  components: {
 | 
			
		||||
    AdminLayout,
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										24
									
								
								packages/client/src/components/admin-layout/Auth.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								packages/client/src/components/admin-layout/Auth.tsx
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
			
		||||
import { useRequest } from 'ahooks';
 | 
			
		||||
import { Spin } from 'antd';
 | 
			
		||||
import React, { createContext } from 'react';
 | 
			
		||||
import { Redirect } from 'react-router';
 | 
			
		||||
import { useLocation } from 'react-router-dom';
 | 
			
		||||
 | 
			
		||||
export const AuthContext = createContext(null);
 | 
			
		||||
 | 
			
		||||
export function AuthProvider(props) {
 | 
			
		||||
  const service = useRequest('users:check', {
 | 
			
		||||
    formatResult: (result) => result?.data,
 | 
			
		||||
  });
 | 
			
		||||
  const location = useLocation();
 | 
			
		||||
  const { pathname, search } = location;
 | 
			
		||||
  let redirect = `?redirect=${pathname}${search}`;
 | 
			
		||||
  if (service.error) {
 | 
			
		||||
    return <Redirect to={'/login' + redirect} />;
 | 
			
		||||
  }
 | 
			
		||||
  return (
 | 
			
		||||
    <AuthContext.Provider value={{ service, currentUser: service.data }}>
 | 
			
		||||
      {service.loading ? <Spin /> : props.children}
 | 
			
		||||
    </AuthContext.Provider>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
@ -13,7 +13,7 @@ export const UserInfo = () => {
 | 
			
		||||
          <Menu.Divider />
 | 
			
		||||
          <Menu.Item
 | 
			
		||||
            onClick={async () => {
 | 
			
		||||
              await request('/users:logout');
 | 
			
		||||
              await request('users:logout');
 | 
			
		||||
              localStorage.removeItem('NOCOBASE_TOKEN');
 | 
			
		||||
              history.push('/login');
 | 
			
		||||
            }}
 | 
			
		||||
 | 
			
		||||
@ -38,6 +38,7 @@ import { Permissions } from './Permissions';
 | 
			
		||||
import { More } from './More';
 | 
			
		||||
import { UserInfo } from './UserInfo';
 | 
			
		||||
import { SiteTitle, SystemSettingsProvider } from './SiteTitle';
 | 
			
		||||
import { AuthProvider } from './Auth';
 | 
			
		||||
 | 
			
		||||
function DesignableToggle() {
 | 
			
		||||
  const { designable, setDesignable } = useDesignableSwitchContext();
 | 
			
		||||
@ -177,19 +178,21 @@ export function AdminLayout({ route, ...others }: any) {
 | 
			
		||||
  console.log('current?.title', current, current?.title, defaultSelectedKeys);
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <SystemSettingsProvider>
 | 
			
		||||
      <DesignableSwitchProvider>
 | 
			
		||||
        <CollectionsProvider>
 | 
			
		||||
          <PageTitleProvider defaultPageTitle={current?.title}>
 | 
			
		||||
            <LayoutWithMenu
 | 
			
		||||
              defaultSelectedKeys={defaultSelectedKeys}
 | 
			
		||||
              current={current}
 | 
			
		||||
              schema={data}
 | 
			
		||||
            />
 | 
			
		||||
          </PageTitleProvider>
 | 
			
		||||
        </CollectionsProvider>
 | 
			
		||||
      </DesignableSwitchProvider>
 | 
			
		||||
    </SystemSettingsProvider>
 | 
			
		||||
    <AuthProvider>
 | 
			
		||||
      <SystemSettingsProvider>
 | 
			
		||||
        <DesignableSwitchProvider>
 | 
			
		||||
          <CollectionsProvider>
 | 
			
		||||
            <PageTitleProvider defaultPageTitle={current?.title}>
 | 
			
		||||
              <LayoutWithMenu
 | 
			
		||||
                defaultSelectedKeys={defaultSelectedKeys}
 | 
			
		||||
                current={current}
 | 
			
		||||
                schema={data}
 | 
			
		||||
              />
 | 
			
		||||
            </PageTitleProvider>
 | 
			
		||||
          </CollectionsProvider>
 | 
			
		||||
        </DesignableSwitchProvider>
 | 
			
		||||
      </SystemSettingsProvider>
 | 
			
		||||
    </AuthProvider>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@ import React, { useContext, useEffect, useState } from 'react';
 | 
			
		||||
import { Spin } from 'antd';
 | 
			
		||||
import { Helmet } from 'react-helmet';
 | 
			
		||||
import { useRequest } from 'ahooks';
 | 
			
		||||
import { SchemaRenderer } from '../../schemas';
 | 
			
		||||
import { request, SchemaRenderer } from '../../schemas';
 | 
			
		||||
import { useForm } from '@formily/react';
 | 
			
		||||
import { useHistory } from 'react-router-dom';
 | 
			
		||||
 | 
			
		||||
@ -16,8 +16,13 @@ export function useLogin() {
 | 
			
		||||
  return {
 | 
			
		||||
    async run() {
 | 
			
		||||
      await form.submit();
 | 
			
		||||
      const { data } = await request('users:login', {
 | 
			
		||||
        method: 'post',
 | 
			
		||||
        data: form.values,
 | 
			
		||||
      });
 | 
			
		||||
      history.push('/admin');
 | 
			
		||||
      console.log(form.values);
 | 
			
		||||
      localStorage.setItem('NOCOBASE_TOKEN', data?.data?.token);
 | 
			
		||||
      console.log('NOCOBASE_TOKEN', data?.data?.token);
 | 
			
		||||
    },
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,15 @@ const request = extend({
 | 
			
		||||
  timeout: 30000,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
request.use(async (ctx, next) => {
 | 
			
		||||
  const { headers } = ctx.req.options as any;
 | 
			
		||||
  const token = localStorage.getItem('NOCOBASE_TOKEN');
 | 
			
		||||
  if (token) {
 | 
			
		||||
    headers['Authorization'] = `Bearer ${token}`;
 | 
			
		||||
  }
 | 
			
		||||
  await next();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
console.log('process.env.API_URL', process.env.API_URL);
 | 
			
		||||
 | 
			
		||||
// console.log = () => {}
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,16 @@ export const request = extend({
 | 
			
		||||
  prefix: process.env.API_URL,
 | 
			
		||||
  timeout: 30000,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
request.use(async (ctx, next) => {
 | 
			
		||||
  const { headers } = ctx.req.options as any;
 | 
			
		||||
  const token = localStorage.getItem('NOCOBASE_TOKEN');
 | 
			
		||||
  if (token) {
 | 
			
		||||
    headers['Authorization'] = `Bearer ${token}`;
 | 
			
		||||
  }
 | 
			
		||||
  await next();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
console.log('process.env.API_URL', process.env.API_URL);
 | 
			
		||||
 | 
			
		||||
export async function createOrUpdateCollection(data: any) {
 | 
			
		||||
 | 
			
		||||
@ -89,4 +89,5 @@
 | 
			
		||||
.nb-kanban-column-header {
 | 
			
		||||
  margin-bottom: 12px;
 | 
			
		||||
  line-height: 32px;
 | 
			
		||||
  padding: 0 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user