登录、注册联调

This commit is contained in:
zhaofengchao 2024-01-11 16:43:26 +08:00
parent e0b6261596
commit bb74e26115
12 changed files with 180 additions and 110 deletions

View file

@ -13,6 +13,13 @@ export default defineConfig({
type: 'hash', type: 'hash',
}, },
plugins: ['@umijs/plugins/dist/dva'], plugins: ['@umijs/plugins/dist/dva'],
dva: {} dva: {},
proxy: {
'/v1': {
'target': 'http://54.80.112.79:9380/',
'changeOrigin': true,
'pathRewrite': { '^/v1': '/v1' },
},
},
}); });

View file

@ -12,6 +12,8 @@
"axios": "^1.6.3", "axios": "^1.6.3",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"i18next": "^23.7.16", "i18next": "^23.7.16",
"js-base64": "^3.7.5",
"jsencrypt": "^3.3.2",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"react-i18next": "^14.0.0", "react-i18next": "^14.0.0",
"react-infinite-scroll-component": "^6.1.0", "react-infinite-scroll-component": "^6.1.0",
@ -8772,6 +8774,11 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/js-base64": {
"version": "3.7.5",
"resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.5.tgz",
"integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA=="
},
"node_modules/js-tokens": { "node_modules/js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
@ -8789,6 +8796,11 @@
"js-yaml": "bin/js-yaml.js" "js-yaml": "bin/js-yaml.js"
} }
}, },
"node_modules/jsencrypt": {
"version": "3.3.2",
"resolved": "https://registry.npmmirror.com/jsencrypt/-/jsencrypt-3.3.2.tgz",
"integrity": "sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A=="
},
"node_modules/jsesc": { "node_modules/jsesc": {
"version": "2.5.2", "version": "2.5.2",
"resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz",

View file

@ -15,6 +15,8 @@
"axios": "^1.6.3", "axios": "^1.6.3",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"i18next": "^23.7.16", "i18next": "^23.7.16",
"js-base64": "^3.7.5",
"jsencrypt": "^3.3.2",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"react-i18next": "^14.0.0", "react-i18next": "^14.0.0",
"react-infinite-scroll-component": "^6.1.0", "react-infinite-scroll-component": "^6.1.0",

View file

@ -68,6 +68,15 @@ const routes = [
component: '@/pages/setting', component: '@/pages/setting',
pathname: "setting" pathname: "setting"
}, },
{
id: 1,
name: '文件',
icon: 'file',
auth: [3, 4, 100],
path: '/file',
component: '@/pages/file',
pathname: 'file'
},
{ {
path: '/*', path: '/*',
component: '@/pages/404', component: '@/pages/404',

View file

@ -35,7 +35,7 @@ const App: React.FC = (props) => {
setCurrent(path) setCurrent(path)
navigate(path); navigate(path);
}; };
const tagsData = [{ path: '/knowledge', name: 'knowledge' }, { path: '/chat', name: 'chat' }]; const tagsData = [{ path: '/knowledge', name: 'knowledge' }, { path: '/chat', name: 'chat' }, { path: '/file', name: 'file' }];
return ( return (
<Layout className={styles.layout} > <Layout className={styles.layout} >

View file

@ -40,6 +40,7 @@ const App: React.FC = () => {
action="https://run.mocky.io/v3/435e224c-44fb-4773-9faf-380c5e6a2188" action="https://run.mocky.io/v3/435e224c-44fb-4773-9faf-380c5e6a2188"
listType="picture" listType="picture"
fileList={[...fileList]} fileList={[...fileList]}
multiple
> >
<Button icon={<UploadOutlined />}>Upload</Button> <Button icon={<UploadOutlined />}>Upload</Button>
</Upload> </Upload>

View file

@ -2,83 +2,110 @@ import { connect } from 'umi';
import { Input, Form, Button, Checkbox } from 'antd'; import { Input, Form, Button, Checkbox } from 'antd';
// import md5 from 'md5'; // import md5 from 'md5';
import styles from './index.less'; import styles from './index.less';
import JSEncrypt from 'jsencrypt';
import { Base64 } from 'js-base64';
import Title from 'antd/es/skeleton/Title';
import { useState, useEffect } from 'react';
// import Base64 from 'crypto-js/enc-base64';
const View = ({ const View = ({
loginModel, loginModel,
dispatch, dispatch,
location, location,
}) => { }) => {
const onFinish = (params: any) => { const [title, setTitle] = useState('login')
console.log('Success:', params); const pub = "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArq9XTUSeYr2+N1h3Afl/z8Dse/2yD0ZGrKwx+EEEcdsBLca9Ynmx3nIB5obmLlSfmskLpBo0UACBmB5rEjBp2Q2f3AG3Hjd4B+gNCG6BDaawuDlgANIhGnaTLrIqWrrcm4EMzJOnAOI1fgzJRsOOUEfaS318Eq9OVO3apEyCCt0lOQK6PuksduOjVxtltDav+guVAA068NrPYmRNabVKRNLJpL8w4D44sfth5RvZ3q9t+6RTArpEtc5sh5ChzvqPOzKGMXW83C95TxmXqpbK6olN4RevSfVjEAgCydH6HN6OhtOQEcnrU97r9H0iZOWwbw3pVrZiUkuRD1R56Wzs2wIDAQAB-----END PUBLIC KEY-----"
params.mail = params.username.replace(/^\s+|\s+$/g, ''); const changeTitle = () => {
params.passwordMd5 = params.password.replace(/^\s+|\s+$/g, ''); setTitle((title) => title === 'login' ? 'register' : 'login')
}
const [form] = Form.useForm();
const [checkNick, setCheckNick] = useState(false);
dispatch({ useEffect(() => {
type: 'loginModel/login', form.validateFields(['nickname']);
payload: { }, [checkNick, form]);
mail: params.mail,
authority: 1, const onCheck = async () => {
passwordMd5: params.passwordMd5 try {
// passwordMd5: md5(params.passwordMd5).toLocaleUpperCase() const params = await form.validateFields();
console.log('Success:', params);
const encryptor = new JSEncrypt()
encryptor.setPublicKey(pub)
var rsaPassWord = encryptor.encrypt(Base64.encode(params.password))
if (title === 'login') {
dispatch({
type: 'loginModel/login',
payload: {
email: params.email,
password: rsaPassWord
}
});
} else {
dispatch({
type: 'loginModel/register',
payload: {
nickname: params.nickname,
email: params.email,
password: rsaPassWord
}
});
} }
}); } catch (errorInfo) {
console.log('Failed:', errorInfo);
}
};
const formItemLayout = {
labelCol: { span: 4 },
wrapperCol: { span: 8 },
}; };
const onFinishFailed = (errorInfo: any) => { const formTailLayout = {
console.log('Failed:', errorInfo); labelCol: { span: 4 },
wrapperCol: { span: 8, offset: 4 },
}; };
type FieldType = {
username?: string;
password?: string;
remember?: string;
};
const onJump = () => {
window.location.href = 'http://www.martechlab.cn/';
};
return ( return (
<div className={styles.loginContainer}> <div className={styles.loginContainer}>
{title === 'login' ? '登录' : '注册'}
<div className={styles.modal}> <div className={styles.modal}>
<Form <Form form={form} name="dynamic_rule" style={{ maxWidth: 600 }}>
name="basic" <Form.Item
labelCol={{ span: 8 }} {...formItemLayout}
wrapperCol={{ span: 16 }} name="email"
style={{ maxWidth: 600 }} label="Email"
initialValues={{ remember: true }} rules={[{ required: true, message: 'Please input your name' }]}
onFinish={onFinish}
onFinishFailed={onFinishFailed}
autoComplete="off"
>
<Form.Item<FieldType>
label="mail"
name="username"
rules={[{ required: true, message: 'Please input your mail!' }]}
> >
<Input /> <Input placeholder="Please input your name" />
</Form.Item> </Form.Item>
{
<Form.Item<FieldType> title === 'register' && <Form.Item
label="Password" {...formItemLayout}
name="nickname"
label="Nickname"
rules={[{ required: checkNick, message: 'Please input your nickname' }]}
>
<Input placeholder="Please input your nickname" />
</Form.Item>
}
<Form.Item
{...formItemLayout}
name="password" name="password"
rules={[{ required: true, message: 'Please input your password!' }]} label="Password"
rules={[{ required: true, message: 'Please input your name' }]}
> >
<Input.Password /> <Input placeholder="Please input your name" />
</Form.Item> </Form.Item>
<div> {
{/* <Form.Item<FieldType> title === 'login' && (<div>
name="remember" ?<a onClick={changeTitle}></a>
valuePropName="checked" </div>)
wrapperCol={{ offset: 8, span: 16 }} }
> {
<Checkbox>Remember me</Checkbox> title === 'register' && (<div>
</Form.Item> */} ?<a onClick={changeTitle}></a>
</div>)
<Form.Item wrapperCol={{ offset: 8, span: 16 }}> }</div>
<Button type="primary" htmlType="submit" > <Form.Item {...formTailLayout}>
Submit <Button type="primary" onClick={onCheck}>
Check
</Button> </Button>
</Form.Item> </Form.Item>
</Form> </Form>

View file

@ -1,6 +1,6 @@
import { message } from 'antd'; import { message } from 'antd';
import { addParam } from '@/utils'; import { addParam } from '@/utils';
import loginService from '@/services/loginService'; import userService from '@/services/userService';
const Model = { const Model = {
namespace: 'loginModel', namespace: 'loginModel',
@ -18,11 +18,32 @@ const Model = {
}, },
effects: { effects: {
*login({ payload = {} }, { call, put }) { *login({ payload = {} }, { call, put }) {
console.log(111, payload)
const { retcode, data, retmsg } = yield call(userService.login, payload);
if (retcode === 0) {
message.success('登录成功!');
const name = data.name;
const token = data.access_token;
const role = data.role;
const title = data.title;
const userInfo = {
role: data.avatar,
title: data.title,
name: data.nickname,
};
localStorage.setItem('token', token)
localStorage.setItem('userInfo', JSON.stringify(userInfo))
// setTimeout(() => {
// window.location.href = '/file';
// }, 300);
}
},
*register({ payload = {} }, { call, put }) {
console.log(111) console.log(111)
const { code, data, errorMessage } = yield call(loginService.login, payload); const { retcode, data, retmsg } = yield call(userService.register, payload);
setTimeout(() => { // setTimeout(() => {
window.location.href = '/'; // window.location.href = '/';
}, 300); // }, 300);
// if (code === 0) { // if (code === 0) {
// message.success('登录成功!'); // message.success('登录成功!');
// const name = data.name; // const name = data.name;

View file

@ -1,18 +0,0 @@
import api from '@/utils/api';
import registerServer from '@/utils/registerServer';
import request from '@/utils/request';
const {
login, } = api;
const chatService = registerServer(
{
login: {
url: login,
method: 'post'
}
},
request
);
export default chatService;

View file

@ -0,0 +1,24 @@
import api from '@/utils/api';
import registerServer from '@/utils/registerServer';
import request from '@/utils/request';
const {
login, register } = api;
interface userServiceType {
login: (params: any) => void
}
const userService = registerServer(
{
login: {
url: login,
method: 'post'
},
register: {
url: register,
method: 'post'
}
},
request
);
export default userService;

View file

@ -1,14 +1,9 @@
import config from '@/utils/config'; import config from '@/utils/config';
const host = window.location.host;
let api_host = `//mp.test.amnetapi.com/mp/v1`; let api_host = `/v1`;
// api_host = '//mpcompany3.test.amnetapi.com/mp/v1';
let login = '//mp41.test.amnetapi.com/mp/v1/user/ssoLogin';
// sso_host = `//test120-sso.amnetapi.com`;
export { api_host }; export { api_host };
export default { export default {
@ -19,7 +14,8 @@ export default {
segment_upload: `${api_host}/uploadPopulation`, segment_upload: `${api_host}/uploadPopulation`,
// 用户 // 用户
login: login, login: `${api_host}/user/login`,
register: `${api_host}/user/register`,
user: `${api_host}/user/validate`, user: `${api_host}/user/validate`,
getUrl: `${api_host}/requestGetUrl`, getUrl: `${api_host}/requestGetUrl`,
getAdPermits: `${api_host}/adServer/getAdPermits`, getAdPermits: `${api_host}/adServer/getAdPermits`,

View file

@ -15,7 +15,7 @@ const ABORT_REQUEST_ERR_MESSAGE = 'The user aborted a request.'; // 手动中断
const codeMessage = { const retcodeMessage = {
200: '服务器成功返回请求的数据。', 200: '服务器成功返回请求的数据。',
201: '新建或修改数据成功。', 201: '新建或修改数据成功。',
202: '一个请求已经进入后台排队(异步任务)。', 202: '一个请求已经进入后台排队(异步任务)。',
@ -43,7 +43,7 @@ const errorHandler = (error: any) => {
console.log('user abort request'); console.log('user abort request');
} else { } else {
if (response && response.status) { if (response && response.status) {
const errorText = codeMessage[response.status] || response.statusText; const errorText = retcodeMessage[response.status] || response.statusText;
const { status, url } = response; const { status, url } = response;
notification.error({ notification.error({
message: `请求错误 ${status}: ${url}`, message: `请求错误 ${status}: ${url}`,
@ -91,37 +91,26 @@ request.interceptors.request.use((url, options) => {
* */ * */
request.interceptors.response.use(async (response, request) => { request.interceptors.response.use(async (response, request) => {
const data = await response.clone().json(); const data = await response.clone().json();
if (data.code && data.code !== 0) {
const payload = {
token: request.headers.Authorization,
res: data,
body: request.data,
url: response.url
};
}
// response 拦截 // response 拦截
if (data.code === 401 || data.Code === 401) { if (data.retcode === 401 || data.retcode === 401) {
notification.error({ notification.error({
message: data.errorMessage, message: data.errorMessage,
description: data.errorMessage, description: data.errorMessage,
duration: 3, duration: 3,
top: 65
}); });
store.domainPrefix = ''; } else if (data.retcode !== 0) {
} else if (data.code !== 0) { if (data.retcode === 100) {
if (data.code === 100) { //retcode为100 时账户名或者密码错误, 为了跟之前弹窗一样所以用message
//code为100 时账户名或者密码错误, 为了跟之前弹窗一样所以用message
message.error(data.errorMessage); message.error(data.errorMessage);
} else { } else {
notification.error({ notification.error({
message: `提示 : ${data.code}`, message: `提示 : ${data.retcode}`,
description: data.errorMessage, description: data.errorMessage,
duration: 3, duration: 3,
top: 65
}); });
} }
return response; //这里return response, 是为了避免modal里面报code undefined return response; //这里return response, 是为了避免modal里面报retcode undefined
} else { } else {
return response; return response;
} }