Commit 5b345e42 authored by 张子雨's avatar 张子雨

Merge branch 'master' into feat/aging2.0

* master:
  feat: 解决线上问题
  Feat/password
  Fix/goods
  Feat/settlement
  feat: 去掉注释
  feat: 优化线上代码
  feat: 切换域名
  feat: 添加卖点限制
  feat: 测试
parents f6940e6a 69a1c77f
...@@ -200,6 +200,12 @@ export default { ...@@ -200,6 +200,12 @@ export default {
icon: 'smile', icon: 'smile',
component: './PaymentMange', component: './PaymentMange',
}, },
{
path: '/password',
name: 'password',
icon: 'smile',
component: './password',
},
// { // {
// path: '/GoodsManage-new', // path: '/GoodsManage-new',
// name: 'GoodsManageNew', // name: 'GoodsManageNew',
......
...@@ -2,15 +2,16 @@ const isProduction = process.env.NODE_ENV === 'production'; ...@@ -2,15 +2,16 @@ const isProduction = process.env.NODE_ENV === 'production';
const isPre = process.env.PRE_ENV === 'pre'; const isPre = process.env.PRE_ENV === 'pre';
const envAPi = { const envAPi = {
api: '//backstms-qa.liangkebang.net', api: '//backstms-vcc3.liangkebang.net',
kdspOpApi: 'https://kdsp-operation-qa.liangkebang.net', kdspOpApi: 'https://kdsp-operation-vcc3.liangkebang.net',
kdspApi: 'https://sc-op-api-qa.liangkebang.net', kdspApi: 'https://sc-op-api-vcc3.liangkebang.net',
goodsApi: 'https://sc-op-api-qa.liangkebang.net', goodsApi: 'https://sc-op-api-vcc3.liangkebang.net',
querysApi: 'https://sc-settlement-api-qa.liangkebang.net', querysApi: 'https://sc-settlement-api-vcc3.liangkebang.net',
// goodsApi: '//192.168.188.111:7000', // goodsApi: '//192.168.188.111:7000',
prologueDomain: 'https://mall-qa.liangkebang.net', prologueDomain: 'https://mall-vcc3.liangkebang.net',
qiniuHost: 'https://appsync.lkbang.net', // qiniuHost: 'https://appsync.lkbang.net',
opapiHost: 'https://opapi-qa.liangkebang.net', qiniuHost: 'https://kdspstatic.q-gp.com/',
opapiHost: 'https://opapi-vcc3.liangkebang.net',
}; };
const prodApi = { const prodApi = {
...@@ -18,11 +19,14 @@ const prodApi = { ...@@ -18,11 +19,14 @@ const prodApi = {
kdspOpApi: '//kdsp-operation.q-gp.com', kdspOpApi: '//kdsp-operation.q-gp.com',
prologueDomain: '//mall.q-gp.com', prologueDomain: '//mall.q-gp.com',
kdspApi: '//sc-op-api.q-gp.com', kdspApi: '//sc-op-api.q-gp.com',
goodsApi: 'https://sc-op-api.q-gp.com', // 测试环境打包域名, // goodsApi: 'https://sc-op-api.q-gp.com', // 测试环境打包域名,
// goodsApi: 'https://sc-merchant-api.q-gp.com', // 线上环境打包域名 goodsApi: 'https://sc-merchant-api.q-gp.com', // 线上环境打包域名
qiniuHost: 'https://appsync.lkbang.net', qiniuHost: 'https://kdspstatic.q-gp.com/',
opapiHost: 'https://opapi.xyqb.com', // talos 后面要下线
querysApi: 'https://sc-settlement-api.q-gp.com', opapiHost: '//talos.xyqb.com',
// opapiHost: 'https://opapi.q-gp.com',
// querysApi: 'https://sc-settlement-api.q-gp.com',
querysApi: 'https://sc-merchant-api.q-gp.com/admin/merchant/sc-settlement',
}; };
const preProdApi = { const preProdApi = {
...@@ -31,7 +35,7 @@ const preProdApi = { ...@@ -31,7 +35,7 @@ const preProdApi = {
prologueDomain: '//mall.q-gp.com', prologueDomain: '//mall.q-gp.com',
kdspApi: '//sc-op-api-pre.q-gp.com', kdspApi: '//sc-op-api-pre.q-gp.com',
goodsApi: 'https://sc-merchant-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', opapiHost: 'https://opapi-pre.q-gp.com',
querysApi: 'https://sc-settlement-api.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 { Avatar, Menu, Spin } from 'antd';
import React from 'react'; import React from 'react';
import { connect } from 'dva'; import { connect } from 'dva';
...@@ -21,6 +21,10 @@ class AvatarDropdown extends React.Component { ...@@ -21,6 +21,10 @@ class AvatarDropdown extends React.Component {
return; return;
} }
if (key === 'password') {
history.push('/password');
return;
}
history.push(`/account/${key}`); history.push(`/account/${key}`);
}; };
...@@ -48,7 +52,10 @@ class AvatarDropdown extends React.Component { ...@@ -48,7 +52,10 @@ class AvatarDropdown extends React.Component {
</Menu.Item> </Menu.Item>
)} )}
{menu && <Menu.Divider />} {menu && <Menu.Divider />}
<Menu.Item key="password">
<EditOutlined />
修改密码
</Menu.Item>
<Menu.Item key="logout"> <Menu.Item key="logout">
<LogoutOutlined /> <LogoutOutlined />
退出登录 退出登录
......
...@@ -369,9 +369,7 @@ class goodsManage extends Component { ...@@ -369,9 +369,7 @@ class goodsManage extends Component {
if (validateSpuInfo(values, initData, editData, productType)) return; if (validateSpuInfo(values, initData, editData, productType)) return;
editData.forEach(item => { editData.forEach(item => {
item.productStockWarning = item.productStockWarning < 0 ? 0 : item.productStockWarning; item.productStockWarning = item.productStockWarning < 0 ? 0 : item.productStockWarning;
if (values?.imageList) { if (!item.imageList || !item.imageList.length) {
item.imageList = values?.imageList[item.firstSpecValue] || values.commonImageList;
} else {
item.imageList = values.commonImageList || []; item.imageList = values.commonImageList || [];
} }
if (!item.imageList || !item.imageList.length) { if (!item.imageList || !item.imageList.length) {
...@@ -429,7 +427,6 @@ class goodsManage extends Component { ...@@ -429,7 +427,6 @@ class goodsManage extends Component {
initCascader: null, initCascader: null,
}); });
this.props.form.resetFields(); this.props.form.resetFields();
console.log(this.BatchSetting);
return; return;
} }
this.onCancel(); this.onCancel();
...@@ -673,11 +670,17 @@ class goodsManage extends Component { ...@@ -673,11 +670,17 @@ class goodsManage extends Component {
<FormItem label="商品卖点:" labelCol={{ span: 2 }}> <FormItem label="商品卖点:" labelCol={{ span: 2 }}>
{getFieldDecorator('character', { {getFieldDecorator('character', {
initialValue: initData.character, initialValue: initData.character,
rules: [
{
required: true,
message: '请输入商品卖点',
},
],
})( })(
<Input <Input
style={{ width: 690 }} style={{ width: 690 }}
maxLength={50} maxLength={50}
placeholder="好的卖点信息有利于提高商品转化,限50字" placeholder="卖点最优可填写3个词,12个字。前后用空格加竖杠分隔,例: 莹莹剔透 | 粒粒优选 | 易煮易熟"
allowClear allowClear
/>, />,
)} )}
...@@ -890,7 +893,7 @@ class goodsManage extends Component { ...@@ -890,7 +893,7 @@ class goodsManage extends Component {
<Row> <Row>
<Table <Table
bordered bordered
rowKey={r => r.thirdSkuNo} // rowKey={r => r.thirdSkuNo}
pagination={false} pagination={false}
scroll={{ y: 300, x: 1200 }} scroll={{ y: 300, x: 1200 }}
dataSource={this.state.editData} dataSource={this.state.editData}
...@@ -931,7 +934,10 @@ class goodsManage extends Component { ...@@ -931,7 +934,10 @@ class goodsManage extends Component {
></Checkbox> ></Checkbox>
</Col> </Col>
<Col span={23} className={styles.imgBorder}> <Col span={23} className={styles.imgBorder}>
<p className={styles.ptop}>公共滑动图:</p> <p className={styles.ptop}>
公共滑动图:
<span className={styles.sizeTitle}>(图片最大上传2M)</span>
</p>
<FormItem> <FormItem>
{getFieldDecorator('commonImageList', { {getFieldDecorator('commonImageList', {
initialValue: this.state.initForm.commonImageList, initialValue: this.state.initForm.commonImageList,
...@@ -954,9 +960,10 @@ class goodsManage extends Component { ...@@ -954,9 +960,10 @@ class goodsManage extends Component {
></Checkbox> ></Checkbox>
</Col>, </Col>,
<Col span={23} className={styles.imgBorder}> <Col span={23} className={styles.imgBorder}>
<p className={styles.ptop}>{`滑动图${ <p className={styles.ptop}>
color === 'null' ? '' : `(${color})` {`滑动图${color === 'null' ? '' : `(${color})`}:`}
}:`}</p> <span className={styles.sizeTitle}>(图片最大上传2M)</span>
</p>
<FormItem key={color}> <FormItem key={color}>
{getFieldDecorator(`imageList[${color}]`, { {getFieldDecorator(`imageList[${color}]`, {
initialValue: initialValue:
...@@ -993,7 +1000,10 @@ class goodsManage extends Component { ...@@ -993,7 +1000,10 @@ class goodsManage extends Component {
></Checkbox> ></Checkbox>
</Col> </Col>
<Col span={23} className={styles.imgBorder}> <Col span={23} className={styles.imgBorder}>
<p className={styles.ptop}>详情图:</p> <p className={styles.ptop}>
详情图:
<span className={styles.sizeTitle}>(图片最大上传2M)</span>
</p>
<FormItem> <FormItem>
{getFieldDecorator('detailImageList', { {getFieldDecorator('detailImageList', {
initialValue: this.state.initForm.detailImageList, initialValue: this.state.initForm.detailImageList,
......
...@@ -95,3 +95,7 @@ ...@@ -95,3 +95,7 @@
.iptNumRight { .iptNumRight {
margin-right: 0 !important; margin-right: 0 !important;
} }
.sizeTitle {
font-size: 12px;
}
...@@ -141,11 +141,10 @@ export function columns(res, pages) { ...@@ -141,11 +141,10 @@ export function columns(res, pages) {
{ {
title: '操作', title: '操作',
dataIndex: 'option', dataIndex: 'option',
valueType: 'option', // valueType: 'option',
key: 'option', key: 'option',
align: 'center', align: 'center',
fixed: 'right', fixed: 'right',
width: 80,
render: (_, row) => ( render: (_, row) => (
<div> <div>
<Button <Button
......
...@@ -183,7 +183,7 @@ const PaymentMange = () => { ...@@ -183,7 +183,7 @@ const PaymentMange = () => {
}} }}
bordered bordered
toolBarRender={onToolBarRender} toolBarRender={onToolBarRender}
scroll={{ x: '1700px' }} scroll={{ x: '100%', y: 500 }}
/> />
<ToExamineModal <ToExamineModal
......
...@@ -29,10 +29,13 @@ export async function query(params) { ...@@ -29,10 +29,13 @@ export async function query(params) {
} }
export async function qiniuToken() { export async function qiniuToken() {
const data = await request.get('/upload/getToken', { // const data = await request.get('/upload/getToken', {
// prefix: config.opapiHost,
// });
const data = await request.get('/api/kdsp/common/upload/token', {
prefix: config.opapiHost, prefix: config.opapiHost,
}); });
return data?.uptoken; return data?.data?.token;
} }
// 付款单导出 // 付款单导出
export async function selfPaymentExport(params) { export async function selfPaymentExport(params) {
......
.button { .button {
display: block; display: block;
margin-bottom: 10px; margin: 0 auto 10px;
} }
.uploadButton { .uploadButton {
......
...@@ -154,7 +154,7 @@ const ReconciliationQuery = () => { ...@@ -154,7 +154,7 @@ const ReconciliationQuery = () => {
rowSelection={rowSelection} rowSelection={rowSelection}
bordered bordered
toolBarRender={onToolBarRender} toolBarRender={onToolBarRender}
scroll={{ x: '100%' }} scroll={{ x: '100%', y: 400 }}
/> />
</PageHeaderWrapper> </PageHeaderWrapper>
</Spin> </Spin>
......
...@@ -157,7 +157,7 @@ const SettlementSheet = () => { ...@@ -157,7 +157,7 @@ const SettlementSheet = () => {
rowSelection={rowSelection} rowSelection={rowSelection}
bordered bordered
toolBarRender={onToolBarRender} toolBarRender={onToolBarRender}
scroll={{ x: '100%' }} scroll={{ x: '100%', y: 400 }}
/> />
</PageHeaderWrapper> </PageHeaderWrapper>
</Spin> </Spin>
......
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) { ...@@ -14,3 +14,15 @@ export async function getFakeCaptcha(mobile) {
export async function getResFreshToen(token) { export async function getResFreshToen(token) {
return request(`/oauth/refreshtoken?refreshtoken=${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;
}
...@@ -2,8 +2,8 @@ import request from '@/utils/request'; ...@@ -2,8 +2,8 @@ import request from '@/utils/request';
import config from '../../config/env.config'; import config from '../../config/env.config';
export async function qiniuToken() { export async function qiniuToken() {
const data = await request.get('/upload/getToken', { const data = await request.get('/api/kdsp/common/upload/token', {
prefix: config.opapiHost, prefix: config.opapiHost,
}); });
return data?.uptoken; return data?.data?.token;
} }
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