Commit 056e5e55 authored by 张子雨's avatar 张子雨

Feat/password

parent eeae264d
......@@ -182,6 +182,12 @@ export default {
icon: 'smile',
component: './PaymentMange',
},
{
path: '/password',
name: 'password',
icon: 'smile',
component: './password',
},
// {
// path: '/GoodsManage-new',
// name: 'GoodsManageNew',
......
......@@ -2,15 +2,16 @@ const isProduction = process.env.NODE_ENV === 'production';
const isPre = process.env.PRE_ENV === 'pre';
const envAPi = {
api: '//backstms-test9.liangkebang.net',
kdspOpApi: 'https://kdsp-operation-test9.liangkebang.net',
kdspApi: 'https://sc-op-api-test9.liangkebang.net',
goodsApi: 'https://sc-op-api-test9.liangkebang.net',
querysApi: 'https://sc-settlement-api-test9.liangkebang.net',
api: '//backstms-vcc3.liangkebang.net',
kdspOpApi: 'https://kdsp-operation-vcc3.liangkebang.net',
kdspApi: 'https://sc-op-api-vcc3.liangkebang.net',
goodsApi: 'https://sc-op-api-vcc3.liangkebang.net',
querysApi: 'https://sc-settlement-api-vcc3.liangkebang.net',
// goodsApi: '//192.168.188.111:7000',
prologueDomain: 'https://mall-test9.liangkebang.net',
qiniuHost: 'https://appsync.lkbang.net',
opapiHost: 'https://opapi-test9.liangkebang.net',
prologueDomain: 'https://mall-vcc3.liangkebang.net',
// qiniuHost: 'https://appsync.lkbang.net',
qiniuHost: 'https://kdspstatic.q-gp.com/',
opapiHost: 'https://opapi-vcc3.liangkebang.net',
};
const prodApi = {
......@@ -20,7 +21,8 @@ const prodApi = {
kdspApi: '//sc-op-api.q-gp.com',
// goodsApi: 'https://sc-op-api.q-gp.com', // 测试环境打包域名,
goodsApi: 'https://sc-merchant-api.q-gp.com', // 线上环境打包域名
qiniuHost: 'https://appsync.lkbang.net',
qiniuHost: 'https://kdspstatic.q-gp.com/',
// talos 后面要下线
opapiHost: '//talos.xyqb.com',
// opapiHost: 'https://opapi.q-gp.com',
// querysApi: 'https://sc-settlement-api.q-gp.com',
......@@ -33,7 +35,7 @@ const preProdApi = {
prologueDomain: '//mall.q-gp.com',
kdspApi: '//sc-op-api-pre.q-gp.com',
goodsApi: 'https://sc-merchant-api-pre.q-gp.com',
qiniuHost: 'https://appsync.lkbang.net',
qiniuHost: 'https://kdspstatic.q-gp.com/',
opapiHost: 'https://opapi-pre.q-gp.com',
querysApi: 'https://sc-settlement-api.q-gp.com',
};
......
import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons';
import { LogoutOutlined, SettingOutlined, UserOutlined, EditOutlined } from '@ant-design/icons';
import { Avatar, Menu, Spin } from 'antd';
import React from 'react';
import { connect } from 'dva';
......@@ -21,6 +21,10 @@ class AvatarDropdown extends React.Component {
return;
}
if (key === 'password') {
history.push('/password');
return;
}
history.push(`/account/${key}`);
};
......@@ -48,7 +52,10 @@ class AvatarDropdown extends React.Component {
</Menu.Item>
)}
{menu && <Menu.Divider />}
<Menu.Item key="password">
<EditOutlined />
修改密码
</Menu.Item>
<Menu.Item key="logout">
<LogoutOutlined />
退出登录
......
import React, { useRef, useState } from 'react';
import { Form, Input, Button, Checkbox, Card, notification, Popover } from 'antd';
import { history } from 'umi';
import { da } from 'date-fns/locale';
import styles from './style.less';
import { passwordRule, resetPassword } from './service';
const Password = props => {
const formRef = useRef();
const [loading, setLoading] = useState(false);
const goHome = () => {
formRef.current.resetFields();
history.push('/');
};
const submit = async record => {
const data = await resetPassword({
password: record.password,
newPassword: record.newPassword,
});
if (data.code === 2000) {
notification.success({
message: '修改成功',
});
setTimeout(() => {
goHome();
}, 1000);
setLoading(false);
} else {
setLoading(false);
notification.error({
message: data.detail || data.msg,
});
}
};
const rule = async record => {
const data = await passwordRule({ password: record.newPassword });
if (data.code === 2000) {
submit(record);
} else {
setLoading(false);
notification.warning({
message: data.detail || data.msg,
});
}
};
const onFinish = values => {
setLoading(true);
rule(values);
};
return (
<div className={styles.div}>
<Card className={styles.card}>
<p>修改密码</p>
<Form
initialValues={{ remember: true }}
onFinish={onFinish}
autoComplete="off"
className={styles.form}
ref={formRef}
// labelCol={{
// span: 16,
// }}
// wrapperCol={{
// span: 16,
// }}
>
<Form.Item name="password" rules={[{ required: true, message: '请输入原密码!' }]}>
<Input.Password placeholder="输入原密码" />
</Form.Item>
<Popover
content="限13-18字符,包含大小写字母、数字和特殊字符"
placement="right"
trigger="hover"
>
<Form.Item
name="newPassword"
validateFirst
rules={[
{ required: true, message: '请输入新密码!' },
{ min: 13, message: '密码最少13位' },
{ max: 18, message: '密码最多18位' },
{
message: '至少13位且必须包含大小写字母、数字和特殊字符',
pattern: /(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{13,18}/,
},
]}
>
<Input.Password placeholder="输入新密码" />
</Form.Item>
</Popover>
<Form.Item
name="newPasswordAgain"
validateFirst
rules={[
{ required: true, message: '请输入新密码!' },
{ min: 13, message: '密码最少13位' },
{ max: 18, message: '密码最多18位' },
{
message: '至少13位且必须包含大小写字母、数字和特殊字符',
pattern: /(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{13,18}/,
},
({ getFieldValue }) => ({
validator(val, value) {
if (value && getFieldValue('newPassword') !== value) {
// eslint-disable-next-line prefer-promise-reject-errors
return Promise.reject('两次密码输入不一致');
}
return Promise.resolve();
},
}),
]}
>
<Input.Password placeholder="输入新密码" />
</Form.Item>
<Form.Item className={styles.btn}>
<Button type="primary" htmlType="submit" loading={loading}>
确认修改
</Button>
<Button type="primary" ghost onClick={goHome}>
返回首页
</Button>
</Form.Item>
</Form>
</Card>
</div>
);
};
export default Password;
import request from '@/utils/request';
import config from '../../../config/env.config';
const { api } = config;
// 商户后台密码修改-校验
export async function passwordRule(params) {
const data = await request.post('/user/ex/validate-password-rule', {
prefix: api,
data: params,
});
return data;
}
// 商户后台密码修改
export async function resetPassword(params) {
const data = await request.post('/user/ex/supply/reset-password', {
prefix: api,
data: params,
});
return data;
}
.div {
width: 100%;
}
.card {
width: 70%;
margin: 0 auto;
padding: 30px 0;
.form {
width: 40%;
margin: 0 auto;
}
p {
margin-bottom: 30px;
font-weight: bold;
font-size: 18px;
text-align: center;
}
.btn {
margin: 0 auto;
text-align: center;
button {
&:first-child {
width: 200px;
margin-right: 10px;
margin-bottom: 10px;
}
}
}
}
......@@ -14,3 +14,15 @@ export async function getFakeCaptcha(mobile) {
export async function getResFreshToen(token) {
return request(`/oauth/refreshtoken?refreshtoken=${token}`);
}
// 商户后台密码修改-校验
export async function passwordRule(params) {
return request.post('/user/ex/validate-password-rule', {
data: params,
});
}
// 商户后台密码修改
export async function resetPassword(params) {
const data = await request.post('/user/ex/supply/reset-password', { data: params });
return data;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment