| import { defineConfig } from "umi"; | |||||
| import routes from './routes' | |||||
| import { defineConfig } from 'umi'; | |||||
| import routes from './src/routes'; | |||||
| export default defineConfig({ | export default defineConfig({ | ||||
| outputPath: 'dist', | outputPath: 'dist', | ||||
| // alias: { '@': './src' }, | // alias: { '@': './src' }, | ||||
| routes, | |||||
| npmClient: 'npm', | npmClient: 'npm', | ||||
| base: '/', | base: '/', | ||||
| routes, | |||||
| publicPath: '/web/dist/', | publicPath: '/web/dist/', | ||||
| esbuildMinifyIIFE: true, | esbuildMinifyIIFE: true, | ||||
| icons: { | |||||
| }, | |||||
| icons: {}, | |||||
| hash: true, | hash: true, | ||||
| history: { | history: { | ||||
| type: 'browser', | type: 'browser', | ||||
| }, | }, | ||||
| plugins: ['@react-dev-inspector/umi4-plugin','@umijs/plugins/dist/dva',], | |||||
| plugins: ['@react-dev-inspector/umi4-plugin', '@umijs/plugins/dist/dva'], | |||||
| dva: {}, | dva: {}, | ||||
| // proxy: { | // proxy: { | ||||
| // '/v1': { | // '/v1': { | ||||
| // }, | // }, | ||||
| // }, | // }, | ||||
| }); | }); | ||||
| const routes = [ | |||||
| { | |||||
| path: '/login', | |||||
| component: '@/pages/login', | |||||
| layout: false | |||||
| }, | |||||
| { | |||||
| path: '/', | |||||
| component: '@/layouts', // 默认页面 | |||||
| redirect: '/knowledge', | |||||
| // wrappers: [ | |||||
| // '@/wrappers/auth', | |||||
| // ] | |||||
| }, | |||||
| { | |||||
| id: 2, | |||||
| name: '知识库', | |||||
| icon: 'home', | |||||
| auth: [3, 4, 100], | |||||
| path: '/knowledge', | |||||
| component: '@/pages/knowledge', | |||||
| pathname: 'knowledge' | |||||
| }, | |||||
| { | |||||
| id: 2, | |||||
| name: '知识库', | |||||
| icon: 'home', | |||||
| auth: [3, 4, 100], | |||||
| path: '/knowledge/add/*', | |||||
| component: '@/pages/add-knowledge', | |||||
| pathname: 'knowledge', | |||||
| // routes: [{ | |||||
| // id: 3, | |||||
| // name: '设置', | |||||
| // icon: 'home', | |||||
| // auth: [3, 4, 100], | |||||
| // path: '/knowledge/add/setting', | |||||
| // component: '@/pages/setting', | |||||
| // pathname: "setting" | |||||
| // }, { | |||||
| // id: 1, | |||||
| // name: '文件', | |||||
| // icon: 'file', | |||||
| // auth: [3, 4, 100], | |||||
| // path: '/knowledge/add/file', | |||||
| // component: '@/pages/file', | |||||
| // pathname: 'file' | |||||
| // },] | |||||
| }, | |||||
| { | |||||
| id: 3, | |||||
| name: '聊天', | |||||
| icon: 'home', | |||||
| auth: [3, 4, 100], | |||||
| path: '/chat', | |||||
| component: '@/pages/chat', | |||||
| pathname: "chat" | |||||
| }, | |||||
| { | |||||
| id: 3, | |||||
| name: '设置', | |||||
| icon: 'home', | |||||
| auth: [3, 4, 100], | |||||
| path: '/setting', | |||||
| component: '@/pages/setting', | |||||
| pathname: "setting" | |||||
| }, | |||||
| { | |||||
| id: 1, | |||||
| name: '文件', | |||||
| icon: 'file', | |||||
| auth: [3, 4, 100], | |||||
| path: '/file', | |||||
| component: '@/pages/file', | |||||
| pathname: 'file' | |||||
| }, | |||||
| { | |||||
| path: '/*', | |||||
| component: '@/pages/404', | |||||
| layout: false | |||||
| } | |||||
| ]; | |||||
| module.exports = routes; |
| export const Authorization = 'Authorization'; | |||||
| export const Token = 'token'; | |||||
| export const UserInfo = 'userInfo'; |
| import authorizationUtil from '@/utils/authorizationUtil'; | |||||
| import { useState } from 'react'; | |||||
| export const useAuth = () => { | |||||
| const [isLogin, setIsLogin] = useState( | |||||
| () => !!authorizationUtil.getAuthorization(), | |||||
| ); | |||||
| return { isLogin }; | |||||
| }; |
| import React, { useMemo } from 'react'; | |||||
| import authorizationUtil from '@/utils/authorizationUtil'; | |||||
| import type { MenuProps } from 'antd'; | import type { MenuProps } from 'antd'; | ||||
| import { Button, Dropdown, } from 'antd'; | |||||
| import { history } from 'umi' | |||||
| import { useTranslation, Trans } from 'react-i18next' | |||||
| import { Button, Dropdown } from 'antd'; | |||||
| import React, { useMemo } from 'react'; | |||||
| import { useTranslation } from 'react-i18next'; | |||||
| import { history } from 'umi'; | |||||
| const App: React.FC = () => { | const App: React.FC = () => { | ||||
| const { t } = useTranslation() | |||||
| const logout = () => { history.push('/login') } | |||||
| const toSetting = () => { history.push('/setting') } | |||||
| const items: MenuProps['items'] = useMemo(() => { | |||||
| return [ | |||||
| { | |||||
| key: '1', | |||||
| label: ( | |||||
| <Button type="text" onClick={logout}>{t('header.logout')}</Button> | |||||
| ), | |||||
| }, | |||||
| { | |||||
| key: '2', | |||||
| label: ( | |||||
| <Button type="text" onClick={toSetting}>{t('header.setting')}</Button> | |||||
| ), | |||||
| }, | |||||
| ] | |||||
| }, []); | |||||
| const { t } = useTranslation(); | |||||
| const logout = () => { | |||||
| authorizationUtil.removeAll(); | |||||
| history.push('/login'); | |||||
| }; | |||||
| const toSetting = () => { | |||||
| history.push('/setting'); | |||||
| }; | |||||
| const items: MenuProps['items'] = useMemo(() => { | |||||
| return [ | |||||
| { | |||||
| key: '1', | |||||
| label: ( | |||||
| <Button type="text" onClick={logout}> | |||||
| {t('header.logout')} | |||||
| </Button> | |||||
| ), | |||||
| }, | |||||
| { | |||||
| key: '2', | |||||
| label: ( | |||||
| <Button type="text" onClick={toSetting}> | |||||
| {t('header.setting')} | |||||
| </Button> | |||||
| ), | |||||
| }, | |||||
| ]; | |||||
| }, []); | |||||
| return (<> | |||||
| <Dropdown menu={{ items }} placement="bottomLeft" arrow> | |||||
| <img | |||||
| style={{ width: '50px', height: '50px', borderRadius: '25px' }} | |||||
| src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png" | |||||
| /> | |||||
| </Dropdown> | |||||
| </>) | |||||
| } | |||||
| return ( | |||||
| <> | |||||
| <Dropdown menu={{ items }} placement="bottomLeft" arrow> | |||||
| <img | |||||
| style={{ width: '50px', height: '50px', borderRadius: '25px' }} | |||||
| src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png" | |||||
| /> | |||||
| </Dropdown> | |||||
| </> | |||||
| ); | |||||
| }; | |||||
| export default App; | |||||
| export default App; |
| import logo from '@/assets/logo.png'; | |||||
| import { Layout, Space, theme } from 'antd'; | |||||
| import classnames from 'classnames'; | |||||
| import React, { useEffect, useState } from 'react'; | import React, { useEffect, useState } from 'react'; | ||||
| import { history, Outlet, useLocation, useNavigate } from 'umi'; | |||||
| import { useTranslation, Trans } from 'react-i18next' | |||||
| import classnames from 'classnames' | |||||
| import { useTranslation } from 'react-i18next'; | |||||
| import { Outlet, useLocation, useNavigate } from 'umi'; | |||||
| import '../locales/config'; | import '../locales/config'; | ||||
| import logo from '@/assets/logo.png' | |||||
| import { | |||||
| RedditOutlined | |||||
| } from '@ant-design/icons'; | |||||
| import { Layout, Button, theme, Space, } from 'antd'; | |||||
| import styles from './index.less' | |||||
| import User from './components/user' | |||||
| import { head } from 'lodash'; | |||||
| import User from './components/user'; | |||||
| import styles from './index.less'; | |||||
| const { Header, Content } = Layout; | const { Header, Content } = Layout; | ||||
| const App: React.FC = (props) => { | const App: React.FC = (props) => { | ||||
| const { t } = useTranslation() | |||||
| const navigate = useNavigate() | |||||
| const { t } = useTranslation(); | |||||
| const navigate = useNavigate(); | |||||
| const { | const { | ||||
| token: { colorBgContainer, borderRadiusLG }, | token: { colorBgContainer, borderRadiusLG }, | ||||
| } = theme.useToken(); | } = theme.useToken(); | ||||
| const location = useLocation(); | const location = useLocation(); | ||||
| useEffect(() => { | useEffect(() => { | ||||
| if (location.pathname !== '/') { | if (location.pathname !== '/') { | ||||
| const path = location.pathname.split('/') | |||||
| setCurrent(path[1]); | |||||
| const path = location.pathname.split('/'); | |||||
| // setCurrent(path[1]); | |||||
| } | } | ||||
| console.log(location.pathname.split('/')) | |||||
| }, [location.pathname]) | |||||
| console.log(location.pathname.split('/')); | |||||
| }, [location.pathname]); | |||||
| const handleChange = (path: string) => { | const handleChange = (path: string) => { | ||||
| setCurrent(path) | |||||
| // setCurrent(path) | |||||
| navigate(path); | navigate(path); | ||||
| }; | }; | ||||
| const tagsData = [{ path: '/knowledge', name: 'knowledge' }, { path: '/chat', name: 'chat' }, { path: '/file', name: 'file' }]; | |||||
| const tagsData = [ | |||||
| { path: '/knowledge', name: 'knowledge' }, | |||||
| { path: '/chat', name: 'chat' }, | |||||
| { path: '/file', name: 'file' }, | |||||
| ]; | |||||
| return ( | return ( | ||||
| <Layout className={styles.layout} > | |||||
| <Layout className={styles.layout}> | |||||
| <Layout> | <Layout> | ||||
| <Header style={{ padding: '0 8px', background: colorBgContainer, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}> | |||||
| <Header | |||||
| style={{ | |||||
| padding: '0 8px', | |||||
| background: colorBgContainer, | |||||
| display: 'flex', | |||||
| justifyContent: 'space-between', | |||||
| alignItems: 'center', | |||||
| }} | |||||
| > | |||||
| <img src={logo} alt="" style={{ height: 30, width: 30 }} /> | <img src={logo} alt="" style={{ height: 30, width: 30 }} /> | ||||
| <Space size={[0, 8]} wrap> | <Space size={[0, 8]} wrap> | ||||
| {tagsData.map((item) => | |||||
| (<span key={item.name} className={classnames(styles['tag'], { | |||||
| [styles['checked']]: current === item.name | |||||
| })} onClick={() => handleChange(item.path)}> | |||||
| {item.name} | |||||
| </span>) | |||||
| )} | |||||
| {tagsData.map((item) => ( | |||||
| <span | |||||
| key={item.name} | |||||
| className={classnames(styles['tag'], { | |||||
| [styles['checked']]: current === item.name, | |||||
| })} | |||||
| onClick={() => handleChange(item.path)} | |||||
| > | |||||
| {item.name} | |||||
| </span> | |||||
| ))} | |||||
| </Space> | </Space> | ||||
| <User ></User> | |||||
| <User></User> | |||||
| </Header> | </Header> | ||||
| <Content | <Content | ||||
| style={{ | style={{ | ||||
| minHeight: 280, | minHeight: 280, | ||||
| background: colorBgContainer, | background: colorBgContainer, | ||||
| borderRadius: borderRadiusLG, | borderRadius: borderRadiusLG, | ||||
| overflow: 'auto' | |||||
| overflow: 'auto', | |||||
| }} | }} | ||||
| > | > | ||||
| <Outlet /> | <Outlet /> | ||||
| </Content> | </Content> | ||||
| </Layout> | </Layout> | ||||
| </Layout > | |||||
| </Layout> | |||||
| ); | ); | ||||
| }; | }; | ||||
| export default App; | |||||
| export default App; |
| import { Effect, Reducer, Subscription } from 'umi' | |||||
| import { message } from 'antd'; | |||||
| import kbService from '@/services/kbService'; | import kbService from '@/services/kbService'; | ||||
| import { Effect, Reducer } from 'umi'; | |||||
| export interface chunkModelState { | export interface chunkModelState { | ||||
| loading: boolean; | loading: boolean; | ||||
| isShowCreateModal: boolean; | isShowCreateModal: boolean; | ||||
| chunk_id: string; | chunk_id: string; | ||||
| doc_id: string; | doc_id: string; | ||||
| chunkInfo: any | |||||
| chunkInfo: any; | |||||
| } | } | ||||
| export interface chunkgModelType { | export interface chunkgModelType { | ||||
| namespace: 'chunkModel'; | namespace: 'chunkModel'; | ||||
| reducers: { | reducers: { | ||||
| updateState: Reducer<chunkModelState>; | updateState: Reducer<chunkModelState>; | ||||
| }; | }; | ||||
| subscriptions: { setup: Subscription }; | |||||
| // subscriptions: { setup: Subscription }; | |||||
| } | } | ||||
| const Model: chunkgModelType = { | const Model: chunkgModelType = { | ||||
| namespace: 'chunkModel', | namespace: 'chunkModel', | ||||
| isShowCreateModal: false, | isShowCreateModal: false, | ||||
| chunk_id: '', | chunk_id: '', | ||||
| doc_id: '', | doc_id: '', | ||||
| chunkInfo: {} | |||||
| }, | |||||
| subscriptions: { | |||||
| setup({ dispatch, history }) { | |||||
| history.listen(location => { | |||||
| console.log(location) | |||||
| }); | |||||
| } | |||||
| chunkInfo: {}, | |||||
| }, | }, | ||||
| // subscriptions: { | |||||
| // setup({ dispatch, history }) { | |||||
| // history.listen(location => { | |||||
| // console.log(location) | |||||
| // }); | |||||
| // } | |||||
| // }, | |||||
| effects: { | effects: { | ||||
| * chunk_list({ payload = {}, callback }, { call, put }) { | |||||
| *chunk_list({ payload = {}, callback }, { call, put }) { | |||||
| const { data, response } = yield call(kbService.chunk_list, payload); | const { data, response } = yield call(kbService.chunk_list, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| console.log(res) | |||||
| console.log(res); | |||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| data: res.chunks, | data: res.chunks, | ||||
| total: res.total, | total: res.total, | ||||
| loading: false | |||||
| } | |||||
| loading: false, | |||||
| }, | |||||
| }); | }); | ||||
| callback && callback() | |||||
| callback && callback(); | |||||
| } | } | ||||
| }, | }, | ||||
| *switch_chunk({ payload = {}, callback }, { call, put }) { | *switch_chunk({ payload = {}, callback }, { call, put }) { | ||||
| const { data, response } = yield call(kbService.switch_chunk, payload); | const { data, response } = yield call(kbService.switch_chunk, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| callback && callback() | |||||
| callback && callback(); | |||||
| } | } | ||||
| }, | }, | ||||
| *rm_chunk({ payload = {}, callback }, { call, put }) { | *rm_chunk({ payload = {}, callback }, { call, put }) { | ||||
| console.log('shanchu') | |||||
| console.log('shanchu'); | |||||
| const { data, response } = yield call(kbService.rm_chunk, payload); | const { data, response } = yield call(kbService.rm_chunk, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| callback && callback() | |||||
| callback && callback(); | |||||
| } | } | ||||
| }, | }, | ||||
| * get_chunk({ payload = {}, callback }, { call, put }) { | |||||
| *get_chunk({ payload = {}, callback }, { call, put }) { | |||||
| const { data, response } = yield call(kbService.get_chunk, payload); | const { data, response } = yield call(kbService.get_chunk, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| chunkInfo: res | |||||
| } | |||||
| chunkInfo: res, | |||||
| }, | |||||
| }); | }); | ||||
| callback && callback(res) | |||||
| callback && callback(res); | |||||
| } | } | ||||
| }, | }, | ||||
| *create_hunk({ payload = {} }, { call, put }) { | *create_hunk({ payload = {} }, { call, put }) { | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| loading: true | |||||
| } | |||||
| loading: true, | |||||
| }, | |||||
| }); | }); | ||||
| let service = kbService.create_chunk | |||||
| let service = kbService.create_chunk; | |||||
| if (payload.chunk_id) { | if (payload.chunk_id) { | ||||
| service = kbService.set_chunk | |||||
| service = kbService.set_chunk; | |||||
| } | } | ||||
| const { data, response } = yield call(service, payload); | const { data, response } = yield call(service, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| loading: false | |||||
| } | |||||
| loading: false, | |||||
| }, | |||||
| }); | }); | ||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| isShowCreateModal: false | |||||
| } | |||||
| isShowCreateModal: false, | |||||
| }, | |||||
| }); | }); | ||||
| } | } | ||||
| }, | }, | ||||
| updateState(state, { payload }) { | updateState(state, { payload }) { | ||||
| return { | return { | ||||
| ...state, | ...state, | ||||
| ...payload | |||||
| ...payload, | |||||
| }; | }; | ||||
| } | |||||
| } | |||||
| }, | |||||
| }, | |||||
| }; | }; | ||||
| export default Model; | export default Model; |
| import { message } from 'antd'; | |||||
| import { Effect, Reducer, Subscription } from 'umi' | |||||
| import kbService from '@/services/kbService'; | import kbService from '@/services/kbService'; | ||||
| import { message } from 'antd'; | |||||
| import { Effect, Reducer, Subscription } from 'umi'; | |||||
| export interface kFModelState { | export interface kFModelState { | ||||
| isShowCEFwModal: boolean; | isShowCEFwModal: boolean; | ||||
| isShowSegmentSetModal: boolean; | isShowSegmentSetModal: boolean; | ||||
| loading: boolean; | loading: boolean; | ||||
| tenantIfo: any; | tenantIfo: any; | ||||
| data: any[] | |||||
| data: any[]; | |||||
| } | } | ||||
| export interface kFModelType { | export interface kFModelType { | ||||
| namespace: 'kFModel'; | namespace: 'kFModel'; | ||||
| isShowSegmentSetModal: false, | isShowSegmentSetModal: false, | ||||
| loading: false, | loading: false, | ||||
| tenantIfo: {}, | tenantIfo: {}, | ||||
| data: [] | |||||
| data: [], | |||||
| }, | }, | ||||
| subscriptions: { | subscriptions: { | ||||
| setup({ dispatch, history }) { | setup({ dispatch, history }) { | ||||
| history.listen(location => { | |||||
| }); | |||||
| } | |||||
| history.listen((location) => {}); | |||||
| }, | |||||
| }, | }, | ||||
| effects: { | effects: { | ||||
| * createKf({ payload = {}, callback }, { call, put }) { | |||||
| *createKf({ payload = {}, callback }, { call, put }) { | |||||
| const { data, response } = yield call(kbService.createKb, payload); | const { data, response } = yield call(kbService.createKb, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| message.success('创建成功!'); | message.success('创建成功!'); | ||||
| } | } | ||||
| }, | }, | ||||
| * updateKf({ payload = {}, callback }, { call, put }) { | |||||
| *updateKf({ payload = {}, callback }, { call, put }) { | |||||
| const { data, response } = yield call(kbService.updateKb, payload); | const { data, response } = yield call(kbService.updateKb, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| message.success('修改成功!'); | message.success('修改成功!'); | ||||
| } | } | ||||
| }, | }, | ||||
| *getKfDetail({ payload = {}, callback }, { call, put }) { | *getKfDetail({ payload = {}, callback }, { call, put }) { | ||||
| const { data, response } = yield call(kbService.get_kb_detail, payload); | const { data, response } = yield call(kbService.get_kb_detail, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| // localStorage.setItem('userInfo',res.) | // localStorage.setItem('userInfo',res.) | ||||
| callback && callback(res) | |||||
| callback && callback(res); | |||||
| } | } | ||||
| }, | }, | ||||
| *getKfList({ payload = {} }, { call, put }) { | *getKfList({ payload = {} }, { call, put }) { | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| loading: true | |||||
| } | |||||
| loading: true, | |||||
| }, | |||||
| }); | }); | ||||
| const { data, response } = yield call(kbService.get_document_list, payload); | |||||
| const { retcode, data: res, retmsg } = data | |||||
| const { data, response } = yield call( | |||||
| kbService.get_document_list, | |||||
| payload, | |||||
| ); | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| loading: false | |||||
| } | |||||
| loading: false, | |||||
| }, | |||||
| }); | }); | ||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| data: res | |||||
| } | |||||
| data: res, | |||||
| }, | |||||
| }); | }); | ||||
| } | } | ||||
| }, | }, | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| loading: true | |||||
| } | |||||
| loading: true, | |||||
| }, | |||||
| }); | }); | ||||
| const { data, response } = yield call(kbService.document_change_status, payload); | |||||
| const { retcode, data: res, retmsg } = data | |||||
| const { data, response } = yield call( | |||||
| kbService.document_change_status, | |||||
| payload, | |||||
| ); | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| message.success('修改成功!'); | message.success('修改成功!'); | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| loading: false | |||||
| } | |||||
| loading: false, | |||||
| }, | |||||
| }); | }); | ||||
| callback && callback() | |||||
| callback && callback(); | |||||
| } | } | ||||
| }, | }, | ||||
| *document_rm({ payload = {}, callback }, { call, put }) { | *document_rm({ payload = {}, callback }, { call, put }) { | ||||
| const { data, response } = yield call(kbService.document_rm, payload); | const { data, response } = yield call(kbService.document_rm, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| message.success('删除成功!'); | message.success('删除成功!'); | ||||
| callback && callback() | |||||
| callback && callback(); | |||||
| } | } | ||||
| }, | }, | ||||
| *document_create({ payload = {}, callback }, { call, put }) { | *document_create({ payload = {}, callback }, { call, put }) { | ||||
| const { data, response } = yield call(kbService.document_create, payload); | const { data, response } = yield call(kbService.document_create, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| message.success('创建成功!'); | message.success('创建成功!'); | ||||
| callback && callback() | |||||
| callback && callback(); | |||||
| } | } | ||||
| }, | }, | ||||
| *document_change_parser({ payload = {}, callback }, { call, put }) { | *document_change_parser({ payload = {}, callback }, { call, put }) { | ||||
| const { data, response } = yield call(kbService.document_change_parser, payload); | |||||
| const { retcode, data: res, retmsg } = data | |||||
| const { data, response } = yield call( | |||||
| kbService.document_change_parser, | |||||
| payload, | |||||
| ); | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| message.success('修改成功!'); | message.success('修改成功!'); | ||||
| callback && callback() | |||||
| callback && callback(); | |||||
| } | } | ||||
| }, | }, | ||||
| }, | }, | ||||
| reducers: { | reducers: { | ||||
| updateState(state, { payload }) { | updateState(state, { payload }) { | ||||
| return { | return { | ||||
| ...state, | ...state, | ||||
| ...payload | |||||
| ...payload, | |||||
| }; | }; | ||||
| } | |||||
| } | |||||
| }, | |||||
| }, | |||||
| }; | }; | ||||
| export default Model; | export default Model; |
| import React, { useEffect, useState, } from 'react'; | |||||
| import { useNavigate, connect, Dispatch } from 'umi' | |||||
| import { Card, List, Popconfirm, message, FloatButton, Row, Col } from 'antd'; | |||||
| import { MinusSquareOutlined, DeleteOutlined, PlusOutlined } from '@ant-design/icons'; | |||||
| import styles from './index.less' | |||||
| import { formatDate } from '@/utils/date' | |||||
| import type { knowledgeModelState } from './model' | |||||
| import { formatDate } from '@/utils/date'; | |||||
| import { | |||||
| DeleteOutlined, | |||||
| MinusSquareOutlined, | |||||
| PlusOutlined, | |||||
| } from '@ant-design/icons'; | |||||
| import { Card, Col, FloatButton, Popconfirm, Row } from 'antd'; | |||||
| import React, { useEffect } from 'react'; | |||||
| import { Dispatch, connect, useNavigate } from 'umi'; | |||||
| import styles from './index.less'; | |||||
| import type { knowledgeModelState } from './model'; | |||||
| interface KnowledgeProps { | interface KnowledgeProps { | ||||
| dispatch: Dispatch; | dispatch: Dispatch; | ||||
| knowledgeModel: knowledgeModelState | |||||
| knowledgeModel: knowledgeModelState; | |||||
| } | } | ||||
| const Index: React.FC<KnowledgeProps> = ({ knowledgeModel, dispatch }) => { | const Index: React.FC<KnowledgeProps> = ({ knowledgeModel, dispatch }) => { | ||||
| const navigate = useNavigate() | |||||
| const navigate = useNavigate(); | |||||
| // const [datas, setDatas] = useState(data) | // const [datas, setDatas] = useState(data) | ||||
| const { data = [] } = knowledgeModel | |||||
| console.log(knowledgeModel) | |||||
| const { data = [] } = knowledgeModel; | |||||
| console.log(knowledgeModel); | |||||
| // const x = useSelector((state) => state.knowledgeModel); | |||||
| const confirm = (id: string) => { | const confirm = (id: string) => { | ||||
| dispatch({ | dispatch({ | ||||
| type: 'knowledgeModel/rmKb', | type: 'knowledgeModel/rmKb', | ||||
| payload: { | payload: { | ||||
| kb_id: id | |||||
| kb_id: id, | |||||
| }, | }, | ||||
| callback: () => { | callback: () => { | ||||
| dispatch({ | dispatch({ | ||||
| type: 'knowledgeModel/getList', | type: 'knowledgeModel/getList', | ||||
| payload: { | |||||
| } | |||||
| payload: {}, | |||||
| }); | }); | ||||
| } | |||||
| }, | |||||
| }); | }); | ||||
| }; | }; | ||||
| const handleAddKnowledge = () => { | const handleAddKnowledge = () => { | ||||
| navigate(`add/setting?activeKey=setting`); | navigate(`add/setting?activeKey=setting`); | ||||
| } | |||||
| }; | |||||
| const handleEditKnowledge = (id: string) => { | const handleEditKnowledge = (id: string) => { | ||||
| navigate(`add/setting?activeKey=file&id=${id}`); | navigate(`add/setting?activeKey=file&id=${id}`); | ||||
| } | |||||
| }; | |||||
| useEffect(() => { | useEffect(() => { | ||||
| dispatch({ | dispatch({ | ||||
| type: 'knowledgeModel/getList', | type: 'knowledgeModel/getList', | ||||
| payload: { | |||||
| } | |||||
| payload: {}, | |||||
| }); | }); | ||||
| }, []) | |||||
| return (<> | |||||
| <div className={styles.knowledge}> | |||||
| <FloatButton onClick={handleAddKnowledge} icon={<PlusOutlined />} type="primary" style={{ right: 24, top: 100 }} /> | |||||
| <Row gutter={{ xs: 8, sm: 16, md: 24, lg: 32 }}> | |||||
| { | |||||
| data.map((item: any) => { | |||||
| return (<Col className="gutter-row" key={item.name} xs={24} sm={12} md={8} lg={6}> | |||||
| <Card className={styles.card} | |||||
| onClick={() => { handleEditKnowledge(item.id) }} | |||||
| }, []); | |||||
| return ( | |||||
| <> | |||||
| <div className={styles.knowledge}> | |||||
| <FloatButton | |||||
| onClick={handleAddKnowledge} | |||||
| icon={<PlusOutlined />} | |||||
| type="primary" | |||||
| style={{ right: 24, top: 100 }} | |||||
| /> | |||||
| <Row gutter={{ xs: 8, sm: 16, md: 24, lg: 32 }}> | |||||
| {data.map((item: any) => { | |||||
| return ( | |||||
| <Col | |||||
| className="gutter-row" | |||||
| key={item.name} | |||||
| xs={24} | |||||
| sm={12} | |||||
| md={8} | |||||
| lg={6} | |||||
| > | > | ||||
| <div className={styles.container}> | |||||
| <div className={styles.content}> | |||||
| <span className={styles.context}> | |||||
| {item.name} | |||||
| </span> | |||||
| <span className={styles.delete}> | |||||
| <Popconfirm | |||||
| title="Delete the task" | |||||
| description="Are you sure to delete this task?" | |||||
| onConfirm={(e: any) => { | |||||
| e.stopPropagation(); | |||||
| e.nativeEvent.stopImmediatePropagation() | |||||
| confirm(item.id) | |||||
| }} | |||||
| okText="Yes" | |||||
| cancelText="No" | |||||
| > | |||||
| <DeleteOutlined onClick={(e) => { | |||||
| e.stopPropagation(); | |||||
| e.nativeEvent.stopImmediatePropagation() | |||||
| }} /> | |||||
| </Popconfirm> | |||||
| </span> | |||||
| </div> | |||||
| <div className={styles.footer}> | |||||
| <span className={styles.text}> | |||||
| <MinusSquareOutlined />{item.doc_num}文档 | |||||
| </span> | |||||
| <span className={styles.text}> | |||||
| <MinusSquareOutlined />{item.chunk_num}个 | |||||
| </span> | |||||
| <span className={styles.text}> | |||||
| <MinusSquareOutlined />{item.token_num}千字符 | |||||
| </span> | |||||
| <span style={{ float: 'right' }}> | |||||
| {formatDate(item.update_date)} | |||||
| </span> | |||||
| <Card | |||||
| className={styles.card} | |||||
| onClick={() => { | |||||
| handleEditKnowledge(item.id); | |||||
| }} | |||||
| > | |||||
| <div className={styles.container}> | |||||
| <div className={styles.content}> | |||||
| <span className={styles.context}>{item.name}</span> | |||||
| <span className={styles.delete}> | |||||
| <Popconfirm | |||||
| title="Delete the task" | |||||
| description="Are you sure to delete this task?" | |||||
| onConfirm={(e: any) => { | |||||
| e.stopPropagation(); | |||||
| e.nativeEvent.stopImmediatePropagation(); | |||||
| confirm(item.id); | |||||
| }} | |||||
| okText="Yes" | |||||
| cancelText="No" | |||||
| > | |||||
| <DeleteOutlined | |||||
| onClick={(e) => { | |||||
| e.stopPropagation(); | |||||
| e.nativeEvent.stopImmediatePropagation(); | |||||
| }} | |||||
| /> | |||||
| </Popconfirm> | |||||
| </span> | |||||
| </div> | |||||
| <div className={styles.footer}> | |||||
| <span className={styles.text}> | |||||
| <MinusSquareOutlined /> | |||||
| {item.doc_num}文档 | |||||
| </span> | |||||
| <span className={styles.text}> | |||||
| <MinusSquareOutlined /> | |||||
| {item.chunk_num}个 | |||||
| </span> | |||||
| <span className={styles.text}> | |||||
| <MinusSquareOutlined /> | |||||
| {item.token_num}千字符 | |||||
| </span> | |||||
| <span style={{ float: 'right' }}> | |||||
| {formatDate(item.update_date)} | |||||
| </span> | |||||
| </div> | |||||
| </div> | </div> | ||||
| </div> | |||||
| </Card> | |||||
| </Col>) | |||||
| }) | |||||
| } | |||||
| </Row> | |||||
| </div> | |||||
| </> | |||||
| ) | |||||
| </Card> | |||||
| </Col> | |||||
| ); | |||||
| })} | |||||
| </Row> | |||||
| </div> | |||||
| </> | |||||
| ); | |||||
| }; | }; | ||||
| export default connect(({ knowledgeModel, loading }) => ({ knowledgeModel, loading }))(Index); | |||||
| export default connect(({ knowledgeModel, loading }) => ({ | |||||
| knowledgeModel, | |||||
| loading, | |||||
| }))(Index); |
| import kbService from '@/services/kbService'; | import kbService from '@/services/kbService'; | ||||
| import { Effect, Reducer, Subscription } from 'umi'; | |||||
| import { Effect, Reducer } from 'umi'; | |||||
| export interface knowledgeModelState { | export interface knowledgeModelState { | ||||
| loading: boolean; | loading: boolean; | ||||
| reducers: { | reducers: { | ||||
| updateState: Reducer<knowledgeModelState>; | updateState: Reducer<knowledgeModelState>; | ||||
| }; | }; | ||||
| subscriptions: { setup: Subscription }; | |||||
| // subscriptions: { setup: Subscription }; | |||||
| } | } | ||||
| const Model: knowledgegModelType = { | const Model: knowledgegModelType = { | ||||
| namespace: 'knowledgeModel', | namespace: 'knowledgeModel', | ||||
| loading: false, | loading: false, | ||||
| data: [], | data: [], | ||||
| }, | }, | ||||
| subscriptions: { | |||||
| setup({ dispatch, history }) { | |||||
| history.listen((location) => { | |||||
| console.log(location); | |||||
| }); | |||||
| }, | |||||
| }, | |||||
| // subscriptions: { | |||||
| // setup({ dispatch, history }) { | |||||
| // history.listen((location) => { | |||||
| // console.log(location); | |||||
| // }); | |||||
| // }, | |||||
| // }, | |||||
| effects: { | effects: { | ||||
| *rmKb({ payload = {}, callback }, { call, put }) { | *rmKb({ payload = {}, callback }, { call, put }) { | ||||
| const { data, response } = yield call(kbService.rmKb, payload); | const { data, response } = yield call(kbService.rmKb, payload); |
| import { connect, Icon, Dispatch } from 'umi'; | |||||
| import { Input, Form, Button, Checkbox } from 'antd'; | |||||
| import { rsaPsw } from '@/utils'; | |||||
| import { Button, Checkbox, Form, Input } from 'antd'; | |||||
| import { FC, useEffect, useState } from 'react'; | |||||
| import { Dispatch, Icon, connect, useNavigate } from 'umi'; | |||||
| import styles from './index.less'; | import styles from './index.less'; | ||||
| import { rsaPsw } from '@/utils' | |||||
| import { useState, useEffect, FC } from 'react'; | |||||
| interface LoginProps { | interface LoginProps { | ||||
| dispatch: Dispatch; | dispatch: Dispatch; | ||||
| } | } | ||||
| const View: FC<LoginProps> = ({ | |||||
| dispatch, | |||||
| }) => { | |||||
| const [title, setTitle] = useState('login') | |||||
| const View: FC<LoginProps> = ({ dispatch }) => { | |||||
| let navigate = useNavigate(); | |||||
| const [title, setTitle] = useState('login'); | |||||
| const changeTitle = () => { | const changeTitle = () => { | ||||
| setTitle((title) => title === 'login' ? 'register' : 'login') | |||||
| } | |||||
| setTitle((title) => (title === 'login' ? 'register' : 'login')); | |||||
| }; | |||||
| const [form] = Form.useForm(); | const [form] = Form.useForm(); | ||||
| const [checkNick, setCheckNick] = useState(false); | const [checkNick, setCheckNick] = useState(false); | ||||
| try { | try { | ||||
| const params = await form.validateFields(); | const params = await form.validateFields(); | ||||
| var rsaPassWord = rsaPsw(params.password) | |||||
| var rsaPassWord = rsaPsw(params.password); | |||||
| if (title === 'login') { | if (title === 'login') { | ||||
| dispatch({ | |||||
| const ret = await dispatch({ | |||||
| type: 'loginModel/login', | type: 'loginModel/login', | ||||
| payload: { | payload: { | ||||
| email: params.email, | email: params.email, | ||||
| password: rsaPassWord | |||||
| } | |||||
| password: rsaPassWord, | |||||
| }, | |||||
| }); | }); | ||||
| console.info(ret); | |||||
| navigate('/knowledge'); | |||||
| } else { | } else { | ||||
| dispatch({ | dispatch({ | ||||
| type: 'loginModel/register', | type: 'loginModel/register', | ||||
| password: rsaPassWord, | password: rsaPassWord, | ||||
| }, | }, | ||||
| callback() { | callback() { | ||||
| setTitle('login') | |||||
| } | |||||
| setTitle('login'); | |||||
| }, | |||||
| }); | }); | ||||
| } | } | ||||
| } catch (errorInfo) { | } catch (errorInfo) { | ||||
| // wrapperCol: { span: 8 }, | // wrapperCol: { span: 8 }, | ||||
| }; | }; | ||||
| const toGoogle = () => { | const toGoogle = () => { | ||||
| window.location.href = "https://github.com/login/oauth/authorize?scope=user:email&client_id=302129228f0d96055bee" | |||||
| } | |||||
| window.location.href = | |||||
| 'https://github.com/login/oauth/authorize?scope=user:email&client_id=302129228f0d96055bee'; | |||||
| }; | |||||
| return ( | return ( | ||||
| <div className={styles.loginPage}> | <div className={styles.loginPage}> | ||||
| <div className={styles.loginLeft}> | <div className={styles.loginLeft}> | ||||
| <div className={styles.modal}> | <div className={styles.modal}> | ||||
| <div className={styles.loginTitle}> | <div className={styles.loginTitle}> | ||||
| <div> | |||||
| {title === 'login' ? 'Sign in' : 'Create an account'} | |||||
| </div> | |||||
| <span > | |||||
| {title === 'login' ? 'We’re so excited to see you again!' : 'Glad to have you on board!'} | |||||
| <div>{title === 'login' ? 'Sign in' : 'Create an account'}</div> | |||||
| <span> | |||||
| {title === 'login' | |||||
| ? 'We’re so excited to see you again!' | |||||
| : 'Glad to have you on board!'} | |||||
| </span> | </span> | ||||
| </div> | </div> | ||||
| <Form form={form} layout="vertical" name="dynamic_rule" style={{ maxWidth: 600 }}> | |||||
| <Form | |||||
| form={form} | |||||
| layout="vertical" | |||||
| name="dynamic_rule" | |||||
| style={{ maxWidth: 600 }} | |||||
| > | |||||
| <Form.Item | <Form.Item | ||||
| {...formItemLayout} | {...formItemLayout} | ||||
| name="email" | name="email" | ||||
| label="Email" | label="Email" | ||||
| rules={[{ required: true, message: 'Please input value' }]} | rules={[{ required: true, message: 'Please input value' }]} | ||||
| > | > | ||||
| <Input size='large' placeholder="Please input value" /> | |||||
| <Input size="large" placeholder="Please input value" /> | |||||
| </Form.Item> | </Form.Item> | ||||
| { | |||||
| title === 'register' && <Form.Item | |||||
| {title === 'register' && ( | |||||
| <Form.Item | |||||
| {...formItemLayout} | {...formItemLayout} | ||||
| name="nickname" | name="nickname" | ||||
| label="Nickname" | label="Nickname" | ||||
| rules={[{ required: true, message: 'Please input your nickname' }]} | |||||
| rules={[ | |||||
| { required: true, message: 'Please input your nickname' }, | |||||
| ]} | |||||
| > | > | ||||
| <Input size='large' placeholder="Please input your nickname" /> | |||||
| <Input size="large" placeholder="Please input your nickname" /> | |||||
| </Form.Item> | </Form.Item> | ||||
| } | |||||
| )} | |||||
| <Form.Item | <Form.Item | ||||
| {...formItemLayout} | {...formItemLayout} | ||||
| name="password" | name="password" | ||||
| label="Password" | label="Password" | ||||
| rules={[{ required: true, message: 'Please input value' }]} | rules={[{ required: true, message: 'Please input value' }]} | ||||
| > | > | ||||
| <Input size='large' placeholder="Please input value" /> | |||||
| <Input size="large" placeholder="Please input value" /> | |||||
| </Form.Item> | </Form.Item> | ||||
| { | |||||
| title === 'login' && <Form.Item | |||||
| name="remember" | |||||
| valuePropName="checked" | |||||
| > | |||||
| {title === 'login' && ( | |||||
| <Form.Item name="remember" valuePropName="checked"> | |||||
| <Checkbox> Remember me</Checkbox> | <Checkbox> Remember me</Checkbox> | ||||
| </Form.Item> | </Form.Item> | ||||
| } | |||||
| <div> { | |||||
| title === 'login' && (<div> | |||||
| Don’t have an account? | |||||
| <Button type="link" onClick={changeTitle}> | |||||
| Sign up | |||||
| </Button> | |||||
| </div>) | |||||
| } | |||||
| { | |||||
| title === 'register' && (<div> | |||||
| )} | |||||
| <div> | |||||
| {' '} | |||||
| {title === 'login' && ( | |||||
| <div> | |||||
| Don’t have an account? | |||||
| <Button type="link" onClick={changeTitle}> | |||||
| Sign up | |||||
| </Button> | |||||
| </div> | |||||
| )} | |||||
| {title === 'register' && ( | |||||
| <div> | |||||
| Already have an account? | Already have an account? | ||||
| <Button type="link" onClick={changeTitle}> | <Button type="link" onClick={changeTitle}> | ||||
| Sign in | Sign in | ||||
| </Button> | </Button> | ||||
| </div>) | |||||
| } | |||||
| </div> | |||||
| )} | |||||
| </div> | </div> | ||||
| <Button type="primary" block size='large' onClick={onCheck}> | |||||
| <Button type="primary" block size="large" onClick={onCheck}> | |||||
| {title === 'login' ? 'Sign in' : 'Continue'} | {title === 'login' ? 'Sign in' : 'Continue'} | ||||
| </Button> | </Button> | ||||
| { | |||||
| title === 'login' && (<><Button block size='large' onClick={toGoogle} style={{ marginTop: 15 }}> | |||||
| <div > | |||||
| <Icon icon="local:google" style={{ verticalAlign: 'middle', marginRight: 5 }} /> | |||||
| Sign in with Google | |||||
| </div> | |||||
| </Button> | |||||
| <Button block size='large' onClick={toGoogle} style={{ marginTop: 15 }}> | |||||
| <div > | |||||
| <Icon icon="local:github" style={{ verticalAlign: 'middle', marginRight: 5 }} /> | |||||
| {title === 'login' && ( | |||||
| <> | |||||
| <Button | |||||
| block | |||||
| size="large" | |||||
| onClick={toGoogle} | |||||
| style={{ marginTop: 15 }} | |||||
| > | |||||
| <div> | |||||
| <Icon | |||||
| icon="local:google" | |||||
| style={{ verticalAlign: 'middle', marginRight: 5 }} | |||||
| /> | |||||
| Sign in with Google | |||||
| </div> | |||||
| </Button> | |||||
| <Button | |||||
| block | |||||
| size="large" | |||||
| onClick={toGoogle} | |||||
| style={{ marginTop: 15 }} | |||||
| > | |||||
| <div> | |||||
| <Icon | |||||
| icon="local:github" | |||||
| style={{ verticalAlign: 'middle', marginRight: 5 }} | |||||
| /> | |||||
| Sign in with Github | Sign in with Github | ||||
| </div> | </div> | ||||
| </Button></>) | |||||
| } | |||||
| </Button> | |||||
| </> | |||||
| )} | |||||
| </Form> | </Form> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div className={styles.loginRight}> | |||||
| </div> | |||||
| <div className={styles.loginRight}></div> | |||||
| </div> | </div> | ||||
| ); | ); | ||||
| }; | }; | ||||
| export default connect(({ loginModel, loading }) => ({ loginModel, loading }))(View); | |||||
| export default connect(({ loginModel, loading }) => ({ loginModel, loading }))( | |||||
| View, | |||||
| ); |
| import { Effect, Reducer, Subscription } from 'umi' | |||||
| import { message } from 'antd'; | |||||
| import { Authorization } from '@/constants/authorization'; | |||||
| import userService from '@/services/userService'; | import userService from '@/services/userService'; | ||||
| import authorizationUtil from '@/utils/authorizationUtil'; | |||||
| import { message } from 'antd'; | |||||
| import { Effect, Reducer, Subscription } from 'umi'; | |||||
| export interface loginModelState { | export interface loginModelState { | ||||
| list: any[]; | list: any[]; | ||||
| }, | }, | ||||
| subscriptions: { | subscriptions: { | ||||
| setup({ dispatch, history }) { | setup({ dispatch, history }) { | ||||
| history.listen(location => { }); | |||||
| } | |||||
| history.listen((location) => {}); | |||||
| }, | |||||
| }, | }, | ||||
| effects: { | effects: { | ||||
| *login({ payload = {} }, { call, put }) { | *login({ payload = {} }, { call, put }) { | ||||
| console.log(111, payload) | |||||
| console.log(111, payload); | |||||
| const { data, response } = yield call(userService.login, payload); | const { data, response } = yield call(userService.login, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| console.log() | |||||
| const Authorization = response.headers.get('Authorization') | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| console.log(); | |||||
| const authorization = response.headers.get(Authorization); | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| message.success('登录成功!'); | message.success('登录成功!'); | ||||
| const token = res.access_token; | const token = res.access_token; | ||||
| const userInfo = { | const userInfo = { | ||||
| avatar: res.avatar, | avatar: res.avatar, | ||||
| name: res.nickname, | name: res.nickname, | ||||
| email: res.email | |||||
| email: res.email, | |||||
| }; | }; | ||||
| localStorage.setItem('token', token) | |||||
| localStorage.setItem('userInfo', JSON.stringify(userInfo)) | |||||
| localStorage.setItem('Authorization', Authorization) | |||||
| setTimeout(() => { | |||||
| window.location.href = '/file'; | |||||
| }, 300); | |||||
| authorizationUtil.setItems({ | |||||
| Authorization: authorization, | |||||
| userInfo: JSON.stringify(userInfo), | |||||
| Token: token, | |||||
| }); | |||||
| // setTimeout(() => { | |||||
| // window.location.href = '/file'; | |||||
| // }, 300); | |||||
| } | } | ||||
| return data; | |||||
| }, | }, | ||||
| *register({ payload = {}, callback }, { call, put }) { | *register({ payload = {}, callback }, { call, put }) { | ||||
| const { data, response } = yield call(userService.register, payload); | const { data, response } = yield call(userService.register, payload); | ||||
| console.log() | |||||
| const { retcode, data: res, retmsg } = data | |||||
| console.log(); | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| message.success('注册成功!'); | message.success('注册成功!'); | ||||
| callback && callback() | |||||
| callback && callback(); | |||||
| } | } | ||||
| } | |||||
| }, | |||||
| }, | }, | ||||
| reducers: { | reducers: { | ||||
| updateState(state, { payload }) { | updateState(state, { payload }) { | ||||
| return { | return { | ||||
| ...state, | ...state, | ||||
| ...payload | |||||
| ...payload, | |||||
| }; | }; | ||||
| } | |||||
| } | |||||
| }, | |||||
| }, | |||||
| }; | }; | ||||
| export default Model; | export default Model; |
| import { connect, Dispatch } from 'umi'; | |||||
| import { Button, FloatButton } from 'antd'; | |||||
| import i18n from 'i18next'; | import i18n from 'i18next'; | ||||
| import { useTranslation, Trans } from 'react-i18next' | |||||
| import { Button, FloatButton } from 'antd' | |||||
| import { useTranslation } from 'react-i18next'; | |||||
| import { Dispatch, connect } from 'umi'; | |||||
| import authorizationUtil from '@/utils/authorizationUtil'; | |||||
| import { FC, useEffect } from 'react'; | |||||
| import CPwModal from './CPwModal'; | |||||
| import List from './List'; | |||||
| import SAKModal from './SAKModal'; | |||||
| import SSModal from './SSModal'; | |||||
| import TntModal from './TntModal'; | |||||
| import styles from './index.less'; | import styles from './index.less'; | ||||
| import CPwModal from './CPwModal' | |||||
| import SAKModal from './SAKModal' | |||||
| import TntModal from './TntModal' | |||||
| import SSModal from './SSModal' | |||||
| import List from './List' | |||||
| import { useEffect, useState, FC } from 'react'; | |||||
| interface CPwModalProps { | interface CPwModalProps { | ||||
| dispatch: Dispatch; | |||||
| settingModel: any | |||||
| dispatch: Dispatch; | |||||
| settingModel: any; | |||||
| } | } | ||||
| const Index: FC<CPwModalProps> = ({ settingModel, dispatch }) => { | const Index: FC<CPwModalProps> = ({ settingModel, dispatch }) => { | ||||
| // const [llm_factory, set_llm_factory] = useState('') | |||||
| const { t } = useTranslation() | |||||
| const userInfo = JSON.parse(localStorage.getItem('userInfo') || '') | |||||
| const changeLang = (val: string) => { // 改变状态里的 语言 进行切换 | |||||
| i18n.changeLanguage(val); | |||||
| } | |||||
| useEffect(() => { | |||||
| dispatch({ | |||||
| type: 'settingModel/getTenantInfo', | |||||
| payload: { | |||||
| } | |||||
| }); | |||||
| }, []) | |||||
| const showCPwModal = () => { | |||||
| dispatch({ | |||||
| type: 'settingModel/updateState', | |||||
| payload: { | |||||
| isShowPSwModal: true | |||||
| } | |||||
| }); | |||||
| }; | |||||
| const showTntModal = () => { | |||||
| dispatch({ | |||||
| type: 'settingModel/updateState', | |||||
| payload: { | |||||
| isShowTntModal: true | |||||
| } | |||||
| }); | |||||
| }; | |||||
| const showSSModal = () => { | |||||
| dispatch({ | |||||
| type: 'settingModel/updateState', | |||||
| payload: { | |||||
| isShowSSModal: true | |||||
| } | |||||
| }); | |||||
| // dispatch({ | |||||
| // type: 'settingModel/getTenantInfo', | |||||
| // payload: { | |||||
| // } | |||||
| // }); | |||||
| }; | |||||
| return ( | |||||
| <div className={styles.settingPage}> | |||||
| <div className={styles.avatar}> | |||||
| <img style={{ width: 50, marginRight: 5 }} src="https://os.alipayobjects.com/rmsportal/QBnOOoLaAfKPirc.png" alt="" /> | |||||
| <div> | |||||
| <div>账号:{userInfo.name}</div> | |||||
| <div><span>密码:******</span><Button type='link' onClick={showCPwModal}>修改密码</Button></div> | |||||
| </div> | |||||
| </div > | |||||
| <div> | |||||
| <Button type="link" onClick={showTntModal}> | |||||
| 租户 | |||||
| </Button> | |||||
| <Button type="link" onClick={showSSModal}> | |||||
| 系统模型设置 | |||||
| </Button> | |||||
| <List /> | |||||
| </div> | |||||
| <CPwModal /> | |||||
| <SAKModal /> | |||||
| <SSModal /> | |||||
| <TntModal /> | |||||
| <FloatButton shape='square' description={t('setting.btn')} onClick={() => i18n.changeLanguage(i18n.language == 'en' ? 'zh' : 'en')} type="default" style={{ right: 94, fontSize: 14 }} /> | |||||
| </div > | |||||
| ); | |||||
| } | |||||
| export default connect(({ settingModel, loading }) => ({ settingModel, loading }))(Index); | |||||
| // const [llm_factory, set_llm_factory] = useState('') | |||||
| const { t } = useTranslation(); | |||||
| const userInfo = authorizationUtil.getUserInfoObject(); | |||||
| const changeLang = (val: string) => { | |||||
| // 改变状态里的 语言 进行切换 | |||||
| i18n.changeLanguage(val); | |||||
| }; | |||||
| useEffect(() => { | |||||
| dispatch({ | |||||
| type: 'settingModel/getTenantInfo', | |||||
| payload: {}, | |||||
| }); | |||||
| }, []); | |||||
| const showCPwModal = () => { | |||||
| dispatch({ | |||||
| type: 'settingModel/updateState', | |||||
| payload: { | |||||
| isShowPSwModal: true, | |||||
| }, | |||||
| }); | |||||
| }; | |||||
| const showTntModal = () => { | |||||
| dispatch({ | |||||
| type: 'settingModel/updateState', | |||||
| payload: { | |||||
| isShowTntModal: true, | |||||
| }, | |||||
| }); | |||||
| }; | |||||
| const showSSModal = () => { | |||||
| dispatch({ | |||||
| type: 'settingModel/updateState', | |||||
| payload: { | |||||
| isShowSSModal: true, | |||||
| }, | |||||
| }); | |||||
| // dispatch({ | |||||
| // type: 'settingModel/getTenantInfo', | |||||
| // payload: { | |||||
| // } | |||||
| // }); | |||||
| }; | |||||
| return ( | |||||
| <div className={styles.settingPage}> | |||||
| <div className={styles.avatar}> | |||||
| <img | |||||
| style={{ width: 50, marginRight: 5 }} | |||||
| src="https://os.alipayobjects.com/rmsportal/QBnOOoLaAfKPirc.png" | |||||
| alt="" | |||||
| /> | |||||
| <div> | |||||
| <div>账号:{userInfo.name}</div> | |||||
| <div> | |||||
| <span>密码:******</span> | |||||
| <Button type="link" onClick={showCPwModal}> | |||||
| 修改密码 | |||||
| </Button> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| <div> | |||||
| <Button type="link" onClick={showTntModal}> | |||||
| 租户 | |||||
| </Button> | |||||
| <Button type="link" onClick={showSSModal}> | |||||
| 系统模型设置 | |||||
| </Button> | |||||
| <List /> | |||||
| </div> | |||||
| <CPwModal /> | |||||
| <SAKModal /> | |||||
| <SSModal /> | |||||
| <TntModal /> | |||||
| <FloatButton | |||||
| shape="square" | |||||
| description={t('setting.btn')} | |||||
| onClick={() => i18n.changeLanguage(i18n.language == 'en' ? 'zh' : 'en')} | |||||
| type="default" | |||||
| style={{ right: 94, fontSize: 14 }} | |||||
| /> | |||||
| </div> | |||||
| ); | |||||
| }; | |||||
| export default connect(({ settingModel, loading }) => ({ | |||||
| settingModel, | |||||
| loading, | |||||
| }))(Index); |
| import { Effect, Reducer, Subscription } from 'umi'; | |||||
| import { message } from 'antd'; | |||||
| import userService from '@/services/userService'; | import userService from '@/services/userService'; | ||||
| import authorizationUtil from '@/utils/authorizationUtil'; | |||||
| import { message } from 'antd'; | |||||
| import { Effect, Reducer, Subscription } from 'umi'; | |||||
| export interface settingModelState { | export interface settingModelState { | ||||
| isShowPSwModal: boolean; | isShowPSwModal: boolean; | ||||
| isShowSSModal: boolean; | isShowSSModal: boolean; | ||||
| llm_factory: string; | llm_factory: string; | ||||
| loading: boolean; | loading: boolean; | ||||
| tenantIfo: any, | |||||
| llmInfo: any, | |||||
| myLlm: any[], | |||||
| factoriesList: any[] | |||||
| tenantIfo: any; | |||||
| llmInfo: any; | |||||
| myLlm: any[]; | |||||
| factoriesList: any[]; | |||||
| } | } | ||||
| export interface settingModelType { | export interface settingModelType { | ||||
| tenantIfo: {}, | tenantIfo: {}, | ||||
| llmInfo: {}, | llmInfo: {}, | ||||
| myLlm: [], | myLlm: [], | ||||
| factoriesList: [] | |||||
| factoriesList: [], | |||||
| }, | }, | ||||
| subscriptions: { | subscriptions: { | ||||
| setup({ dispatch, history }) { | setup({ dispatch, history }) { | ||||
| history.listen(location => { | |||||
| }); | |||||
| } | |||||
| history.listen((location) => {}); | |||||
| }, | |||||
| }, | }, | ||||
| effects: { | effects: { | ||||
| *setting({ payload = {}, callback }, { call, put }) { | *setting({ payload = {}, callback }, { call, put }) { | ||||
| const { data, response } = yield call(userService.setting, payload); | const { data, response } = yield call(userService.setting, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| message.success('密码修改成功!'); | message.success('密码修改成功!'); | ||||
| callback && callback() | |||||
| callback && callback(); | |||||
| } | } | ||||
| }, | }, | ||||
| *getUserInfo({ payload = {} }, { call, put }) { | *getUserInfo({ payload = {} }, { call, put }) { | ||||
| const { data, response } = yield call(userService.user_info, payload); | const { data, response } = yield call(userService.user_info, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| const userInfo = { | const userInfo = { | ||||
| avatar: res.avatar, | avatar: res.avatar, | ||||
| name: res.nickname, | name: res.nickname, | ||||
| email: res.email | |||||
| email: res.email, | |||||
| }; | }; | ||||
| localStorage.setItem('userInfo', JSON.stringify(userInfo)) | |||||
| authorizationUtil.setUserInfo(userInfo); | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| // localStorage.setItem('userInfo',res.) | // localStorage.setItem('userInfo',res.) | ||||
| } | } | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| loading: true | |||||
| } | |||||
| loading: true, | |||||
| }, | |||||
| }); | }); | ||||
| const { data, response } = yield call(userService.get_tenant_info, payload); | |||||
| const { retcode, data: res, retmsg } = data | |||||
| const { data, response } = yield call( | |||||
| userService.get_tenant_info, | |||||
| payload, | |||||
| ); | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| // llm_id 对应chat_id | // llm_id 对应chat_id | ||||
| // asr_id 对应speech2txt | // asr_id 对应speech2txt | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| loading: false | |||||
| } | |||||
| loading: false, | |||||
| }, | |||||
| }); | }); | ||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| res.chat_id = res.llm_id | |||||
| res.speech2text_id = res.asr_id | |||||
| res.chat_id = res.llm_id; | |||||
| res.speech2text_id = res.asr_id; | |||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| tenantIfo: res | |||||
| } | |||||
| tenantIfo: res, | |||||
| }, | |||||
| }); | }); | ||||
| } | } | ||||
| }, | }, | ||||
| *set_tenant_info({ payload = {} }, { call, put }) { | *set_tenant_info({ payload = {} }, { call, put }) { | ||||
| const { data, response } = yield call(userService.set_tenant_info, payload); | |||||
| const { retcode, data: res, retmsg } = data | |||||
| const { data, response } = yield call( | |||||
| userService.set_tenant_info, | |||||
| payload, | |||||
| ); | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| // llm_id 对应chat_id | // llm_id 对应chat_id | ||||
| // asr_id 对应speech2txt | // asr_id 对应speech2txt | ||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| isShowSSModal: false | |||||
| } | |||||
| isShowSSModal: false, | |||||
| }, | |||||
| }); | }); | ||||
| yield put({ | yield put({ | ||||
| type: 'getTenantInfo' | |||||
| }) | |||||
| type: 'getTenantInfo', | |||||
| }); | |||||
| } | } | ||||
| }, | }, | ||||
| *factories_list({ payload = {} }, { call, put }) { | *factories_list({ payload = {} }, { call, put }) { | ||||
| const { data, response } = yield call(userService.factories_list, payload); | |||||
| const { retcode, data: res, retmsg } = data | |||||
| const { data, response } = yield call( | |||||
| userService.factories_list, | |||||
| payload, | |||||
| ); | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| factoriesList: res | |||||
| } | |||||
| factoriesList: res, | |||||
| }, | |||||
| }); | }); | ||||
| } | } | ||||
| }, | }, | ||||
| *llm_list({ payload = {} }, { call, put }) { | *llm_list({ payload = {} }, { call, put }) { | ||||
| const { data, response } = yield call(userService.llm_list, payload); | const { data, response } = yield call(userService.llm_list, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| llmInfo: res | |||||
| } | |||||
| llmInfo: res, | |||||
| }, | |||||
| }); | }); | ||||
| } | } | ||||
| }, | }, | ||||
| *my_llm({ payload = {} }, { call, put }) { | *my_llm({ payload = {} }, { call, put }) { | ||||
| const { data, response } = yield call(userService.my_llm, payload); | const { data, response } = yield call(userService.my_llm, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| yield put({ | yield put({ | ||||
| type: 'updateState', | type: 'updateState', | ||||
| payload: { | payload: { | ||||
| myLlm: res | |||||
| } | |||||
| myLlm: res, | |||||
| }, | |||||
| }); | }); | ||||
| } | } | ||||
| }, | }, | ||||
| *set_api_key({ payload = {}, callback }, { call, put }) { | *set_api_key({ payload = {}, callback }, { call, put }) { | ||||
| const { data, response } = yield call(userService.set_api_key, payload); | const { data, response } = yield call(userService.set_api_key, payload); | ||||
| const { retcode, data: res, retmsg } = data | |||||
| const { retcode, data: res, retmsg } = data; | |||||
| if (retcode === 0) { | if (retcode === 0) { | ||||
| message.success('设置API KEY成功!'); | message.success('设置API KEY成功!'); | ||||
| callback && callback() | |||||
| callback && callback(); | |||||
| } | } | ||||
| }, | }, | ||||
| }, | }, | ||||
| updateState(state, { payload }) { | updateState(state, { payload }) { | ||||
| return { | return { | ||||
| ...state, | ...state, | ||||
| ...payload | |||||
| ...payload, | |||||
| }; | }; | ||||
| } | |||||
| } | |||||
| }, | |||||
| }, | |||||
| }; | }; | ||||
| export default Model; | export default Model; |
| const routes = [ | |||||
| { | |||||
| path: '/login', | |||||
| component: '@/pages/login', | |||||
| layout: false, | |||||
| }, | |||||
| { | |||||
| path: '/', | |||||
| component: '@/layouts', | |||||
| layout: false, | |||||
| wrappers: ['@/wrappers/auth'], | |||||
| routes: [ | |||||
| { path: '/', redirect: '/knowledge' }, | |||||
| { | |||||
| path: '/knowledge', | |||||
| component: '@/pages/knowledge', | |||||
| }, | |||||
| { | |||||
| path: '/knowledge/add/*', | |||||
| component: '@/pages/add-knowledge', | |||||
| }, | |||||
| { | |||||
| path: '/chat', | |||||
| component: '@/pages/chat', | |||||
| }, | |||||
| { | |||||
| path: '/setting', | |||||
| component: '@/pages/setting', | |||||
| }, | |||||
| { | |||||
| path: '/file', | |||||
| component: '@/pages/file', | |||||
| }, | |||||
| ], | |||||
| }, | |||||
| { | |||||
| path: '/*', | |||||
| component: '@/pages/404', | |||||
| layout: false, | |||||
| }, | |||||
| ]; | |||||
| export default routes; |
| import { Authorization, Token, UserInfo } from '@/constants/authorization'; | |||||
| const KeySet = [Authorization, Token, UserInfo]; | |||||
| const storage = { | |||||
| getAuthorization: () => { | |||||
| return localStorage.getItem(Authorization); | |||||
| }, | |||||
| getToken: () => { | |||||
| return localStorage.getItem(Token); | |||||
| }, | |||||
| getUserInfo: () => { | |||||
| return localStorage.getItem(UserInfo); | |||||
| }, | |||||
| getUserInfoObject: () => { | |||||
| return JSON.parse(localStorage.getItem('userInfo') || ''); | |||||
| }, | |||||
| setAuthorization: (value: string) => { | |||||
| localStorage.setItem(Authorization, value); | |||||
| }, | |||||
| setToken: (value: string) => { | |||||
| localStorage.setItem(Token, value); | |||||
| }, | |||||
| setUserInfo: (value: string | Object) => { | |||||
| let valueStr = typeof value !== 'string' ? JSON.stringify(value) : value; | |||||
| localStorage.setItem(UserInfo, valueStr); | |||||
| }, | |||||
| setItems: (pairs: Record<string, string>) => { | |||||
| Object.entries(pairs).forEach(([key, value]) => { | |||||
| localStorage.setItem(key, value); | |||||
| }); | |||||
| }, | |||||
| removeAuthorization: () => { | |||||
| localStorage.removeItem(Authorization); | |||||
| }, | |||||
| removeAll: () => { | |||||
| KeySet.forEach((x) => { | |||||
| localStorage.removeItem(x); | |||||
| }); | |||||
| }, | |||||
| }; | |||||
| export default storage; |
| import { createBrowserHistory } from 'history'; | |||||
| export const history = createBrowserHistory(); |
| import { message, notification } from 'antd'; | |||||
| import { extend } from 'umi-request'; | import { extend } from 'umi-request'; | ||||
| import { notification, message } from 'antd'; | |||||
| import { Authorization } from '@/constants/authorization'; | |||||
| import api from '@/utils/api'; | import api from '@/utils/api'; | ||||
| import authorizationUtil from '@/utils/authorizationUtil'; | |||||
| const { login } = api; | const { login } = api; | ||||
| const ABORT_REQUEST_ERR_MESSAGE = 'The user aborted a request.'; // 手动中断请求。errorHandler 抛出的error message | const ABORT_REQUEST_ERR_MESSAGE = 'The user aborted a request.'; // 手动中断请求。errorHandler 抛出的error message | ||||
| const retcodeMessage = { | const retcodeMessage = { | ||||
| 200: '服务器成功返回请求的数据。', | 200: '服务器成功返回请求的数据。', | ||||
| 201: '新建或修改数据成功。', | 201: '新建或修改数据成功。', | ||||
| 500: '服务器发生错误,请检查服务器。', | 500: '服务器发生错误,请检查服务器。', | ||||
| 502: '网关错误。', | 502: '网关错误。', | ||||
| 503: '服务不可用,服务器暂时过载或维护。', | 503: '服务不可用,服务器暂时过载或维护。', | ||||
| 504: '网关超时。' | |||||
| 504: '网关超时。', | |||||
| }; | }; | ||||
| type retcode = | type retcode = | ||||
| | 200 | | 200 | ||||
| retcode: number; | retcode: number; | ||||
| data: any; | data: any; | ||||
| retmsg: string; | retmsg: string; | ||||
| status: number | |||||
| status: number; | |||||
| } | } | ||||
| const errorHandler = (error: { response: Response, message: string }): Response => { | |||||
| const errorHandler = (error: { | |||||
| response: Response; | |||||
| message: string; | |||||
| }): Response => { | |||||
| const { response } = error; | const { response } = error; | ||||
| // 手动中断请求 abort | // 手动中断请求 abort | ||||
| if (error.message === ABORT_REQUEST_ERR_MESSAGE) { | if (error.message === ABORT_REQUEST_ERR_MESSAGE) { | ||||
| console.log('user abort request'); | console.log('user abort request'); | ||||
| } else { | } else { | ||||
| if (response && response.status) { | if (response && response.status) { | ||||
| const errorText = retcodeMessage[response.status as retcode] || response.statusText; | |||||
| const errorText = | |||||
| retcodeMessage[response.status as retcode] || response.statusText; | |||||
| const { status, url } = response; | const { status, url } = response; | ||||
| notification.error({ | notification.error({ | ||||
| message: `请求错误 ${status}: ${url}`, | message: `请求错误 ${status}: ${url}`, | ||||
| const request = extend({ | const request = extend({ | ||||
| errorHandler, // 默认错误处理 | errorHandler, // 默认错误处理 | ||||
| timeout: 3000000, | timeout: 3000000, | ||||
| getResponse: true | |||||
| getResponse: true, | |||||
| }); | }); | ||||
| request.interceptors.request.use((url: string, options: any) => { | request.interceptors.request.use((url: string, options: any) => { | ||||
| const Authorization = localStorage.getItem('Authorization') | |||||
| const authorization = authorizationUtil.getAuthorization(); | |||||
| return { | return { | ||||
| url, | url, | ||||
| options: { | options: { | ||||
| ...options, | ...options, | ||||
| headers: { | headers: { | ||||
| ...(options.skipToken ? undefined : { Authorization }), | |||||
| ...options.headers | |||||
| ...(options.skipToken ? undefined : { [Authorization]: authorization }), | |||||
| ...options.headers, | |||||
| }, | }, | ||||
| interceptors: true | |||||
| } | |||||
| interceptors: true, | |||||
| }, | |||||
| }; | }; | ||||
| }); | }); | ||||
| * */ | * */ | ||||
| request.interceptors.response.use(async (response: any, request) => { | request.interceptors.response.use(async (response: any, request) => { | ||||
| console.log(response, request) | |||||
| console.log(response, request); | |||||
| const data: responseType = await response.clone().json(); | const data: responseType = await response.clone().json(); | ||||
| // response 拦截 | // response 拦截 | ||||
| description: data.retmsg, | description: data.retmsg, | ||||
| duration: 3, | duration: 3, | ||||
| }); | }); | ||||
| authorizationUtil.removeAll(); | |||||
| // history.push('/login'); // Will not jump to the login page | |||||
| } else if (data.retcode !== 0) { | } else if (data.retcode !== 0) { | ||||
| if (data.retcode === 100) { | if (data.retcode === 100) { | ||||
| message.error(data.retmsg); | message.error(data.retmsg); | ||||
| return response; | return response; | ||||
| } else { | } else { | ||||
| return response; | return response; | ||||
| } | } | ||||
| }); | }); |
| import { Navigate, Outlet } from 'umi' | |||||
| import { useAuth } from '@/hooks/authHook'; | |||||
| import { Navigate, Outlet } from 'umi'; | |||||
| export default (props) => { | |||||
| // const { isLogin } = useAuth(); | |||||
| console.log(props) | |||||
| const isLogin = false | |||||
| if (isLogin) { | |||||
| return <Outlet />; | |||||
| } else { | |||||
| return <Navigate to="/login" />; | |||||
| } | |||||
| } | |||||
| export default () => { | |||||
| const { isLogin } = useAuth(); | |||||
| if (isLogin) { | |||||
| return <Outlet />; | |||||
| } else { | |||||
| return <Navigate to="/login" />; | |||||
| } | |||||
| }; |