feat: user auth

This commit is contained in:
chenos 2021-08-23 20:50:55 +08:00
parent 7394e0aa8a
commit 589fca05d0
9 changed files with 84 additions and 45 deletions

View File

@ -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,
},
},
};

View File

@ -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,

View 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>
);
}

View File

@ -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');
}}

View File

@ -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>
);
}

View File

@ -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);
},
};
}

View File

@ -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 = () => {}

View File

@ -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) {

View File

@ -89,4 +89,5 @@
.nb-kanban-column-header {
margin-bottom: 12px;
line-height: 32px;
padding: 0 12px;
}