Commit 7928c3ee by zhujian

Merge branch 'feature/pangguoming/20210805/wechat_audit' into 'master'

Feature/pangguoming/20210805/wechat audit

See merge request !95
parents d64efc4f 6b2a0189
......@@ -75,6 +75,19 @@ export function updateStoreMessage(params: object) {
export function getStoreDetail(params: object) {
return Service.Hades("public/hades/getStoreDetail", params);
}
export function getCustomerAuditList(params: object){
return Service.Hades('public/hades/getCustomerAuditList',params);
}
export function getCustomerAuditListCount(params: object){
return Service.Hades('public/hades/getCustomerAuditCount',params);
}
export function auditOperation(params: object){
return Service.Hades('public/hades/auditOperation',params);
}
export function getByDepartmentId(params: object) {
return Service.Hades("public/hades/getByDepartmentId", params);
}
......
......@@ -9,7 +9,7 @@
import { getEmployeeList, getUserList, getStoreDecorationList, getStoreRole, addEmployee, editEmployee, deleteEmployee, getCourseCatalogList,
getAllSonCategory, addCourseCategory, delCourseCategory, editCourseCategory, deleteStoreDecorationList, addStoreBanner, editStoreBanner,
moveBannerSequence,getStoreUserBasicPage,updateStoreMessage,getStoreDetail,getByDepartmentId,getDepartmentUser,getDepartmentUserNotPage,addDepartment,
editDepartment,delDepartment,queryDepartmentTree,getStoreCustomerAndDepNamePage,delDepartmentUser,syncWorkWeChatDepartment,getSyncCount
editDepartment,delDepartment,queryDepartmentTree,getStoreCustomerAndDepNamePage,delDepartmentUser,syncWorkWeChatDepartment,getSyncCount,getCustomerAuditList,auditOperation,getCustomerAuditListCount
} from '@/data-source/store/request-apis';
export default class StoreService {
......@@ -91,6 +91,20 @@ export default class StoreService {
static getStoreDetail(params: any) {
return getStoreDetail(params);
}
// 获取微信学员审核列表
static getCustomerAuditList(params: any){
return getCustomerAuditList(params)
}
// 获取微信学员审核列表数量
static getCustomerAuditListCount(params: any){
return getCustomerAuditListCount(params)
}
//微信学员审核操作
static auditOperation(params: any){
return auditOperation(params)
}
static getByDepartmentId(params:any){
return getByDepartmentId(params);
}
......
......@@ -13,7 +13,14 @@
font-size:14px;
}
.college-info-page-form{
margin-left:29px;
margin-left:20px;
.title{
font-size: 16px;
color: #333;
font-weight: 500;
margin-left: -20px;
margin-bottom: 20px;
}
.logo-con{
.logo-img-con{
width: 258px;
......@@ -58,10 +65,37 @@
}
}
}
.switch-box{
display: flex;
align-items: center;
.switch-desc{
color: #999;
font-size: 14px;
margin: 0 8px;
}
.switch-prew-link{
color: #2966FF;
font-size: 14px;
}
}
}
.submit-btn{
margin-left:142px;
margin-left:132px;
margin-top: 20px;
}
.label-box{
// display: flex;
// align-content: center;
.icon{
color:#BFBFBF;
margin: 0 2px;
}
}
}
.college-info-page-view-modal-box{
img{
width: 100%;
}
}
\ No newline at end of file
......@@ -8,27 +8,89 @@
*/
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import { Route,withRouter } from "react-router-dom";
import StoreService from "@/domains/store-domain/storeService";
import _ from "underscore";
import {Tabs,Input,Tree,Button} from "antd";
import User from "@/common/js/user";
import {Tabs,Badge} from "antd";
import DepartMentTabCon from './components/DepartMentTabCon';
import WechatUserAudit from './WechatUserAudit/WechatUserAudit'
import "./NewUsersManagePage.less";
const { TabPane } = Tabs;
function UserManagePage() {
function UserManagePage(props) {
const { match } = props;
const [currentTab, setCurrentTab] = useState("departMentTab");
const [courseList,setCourseList] = useState([]);
const [total, setTotal] = useState(0);
const [query, setQuery] = useState({
current: 0,
size: 10,
const [auditSwitch,setAuditSwitch] = useState('No')
const [listCount, setListCount] = useState({
"allCnt": 0,
"passedCnt": 0,
"rejectedCnt": 0,
"waitCnt": 0
});
useEffect(()=>{
//列表获取
function handleFetchAuditListCount(_query) {
const params = {
storeId: User.getStoreId(),
};
StoreService.getCustomerAuditListCount(params).then((res) => {
const {
result,
} = res;
setListCount(result)
});
}
handleFetchAuditListCount();
},[])
function getStoreDetail(){
const params= {
storeId:User.getStoreId()
}
return StoreService.getStoreDetail(params).then((res) => {
const { result = { } } = res;
const {
auditSwitch
} = result;
setAuditSwitch(auditSwitch)
return auditSwitch
})
}
function jumpWechatAudit(){
getStoreDetail().then((res)=>{
if(res === 'OPEN'){
window.RCHistory.push({
pathname: `${match.url}/wechat-user-audit`,
});
}
})
}
useEffect(()=>{
getStoreDetail()
},[])
return (
<div className="page new-user-manage-page">
<div className="content-header">学员管理</div>
<div className="content-header">
<div>学员管理</div>
<If condition={auditSwitch === 'OPEN'}>
<div className='wechat-audit' onClick={jumpWechatAudit} >
<div>
<span className='icon iconfont icon-font-weixin'>&#xe8e0;</span>
<span className='content-header-right'>学员审核列表</span>
</div>
<If condition={listCount.waitCnt!=='0'}>
<Badge status="error" text="" offset={[6,-6]} />
</If>
</div>
</If>
</div>
<div className="box">
<div className="tab-box">
<Tabs
......@@ -46,6 +108,12 @@ function UserManagePage() {
<DepartMentTabCon currentTab={currentTab}/>
</div>
</div>
<Route
path={`${match.url}/wechat-user-audit`}
render={() => {
return <WechatUserAudit/>;
}}
/>
</div>
);
}
......
......@@ -2,4 +2,23 @@
.ant-tabs-tab + .ant-tabs-tab{
margin:0;
}
.content-header{
display: flex;
justify-content: space-between;
.wechat-audit{
display: flex;
&:hover{
cursor: pointer;
}
}
.icon-font-weixin{
color: #5DD333;
margin-right:4px ;
}
.content-header-right{
font-size: 14px;
color: #2966FF;
}
}
}
\ No newline at end of file
.user-manage-page {
.content-header{
display: flex;
justify-content: space-between;
align-items: center;
.wechat-audit:hover{
cursor: pointer;
}
.icon-font-weixin{
color: #5DD333;
margin-right:4px ;
}
.content-header-right{
font-size: 14px;
color: #2966FF;
}
}
.box-header {
display: flex;
width: calc(100% - 80px);
......
......@@ -8,13 +8,14 @@
*/
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import { Route, withRouter } from 'react-router-dom';
import _ from "underscore";
import { PageControl } from "@/components";
import { Input, DatePicker, Select, Button, message } from "antd";
import StoreService from "@/domains/store-domain/storeService";
import User from "@/common/js/user";
import ChooseMembersModal from "./modal/ChooseMembersModal";
import WechatUserAudit from './WechatUserAudit/WechatUserAudit'
import LimitTip from "./LimitTip"
import { XMTable } from '@/components';
......@@ -30,9 +31,11 @@ declare var window: any;
function UserManagePage() {
function UserManagePage(props:any) {
const { match } = props;
const [userList, setUserList] = useState([]);
const [model, setModel] = useState<React.ReactNode>(null);
const [auditSwitch,setAuditSwitch] = useState('No')
const [query, setQuery] = useState({
current: 0,
size: 10,
......@@ -62,9 +65,24 @@ function UserManagePage() {
StoreService.getUserList(_query).then((res: any) => {
setRealTotal(res.result.total);
});
const params= {
storeId:User.getStoreId()
}
StoreService.getStoreDetail(params).then((res) => {
const { result = { } } = res;
const {
auditSwitch
} = result;
setAuditSwitch(auditSwitch)
})
}, [])
useEffect(()=>{
},[])
useEffect(() => {
getUserList();
}, [query]);
......@@ -137,7 +155,21 @@ function UserManagePage() {
return (
<div className=" page user-manage-page">
<div className="content-header">学员管理</div>
<div className="content-header">
<div>学员管理</div>
<If condition={auditSwitch === 'OPEN'}>
<div className='wechat-audit' onClick={()=>{
window.RCHistory.push({
pathname: `${match.url}/wechat-user-audit`,
});
}} >
<span className='icon iconfont icon-font-weixin'>&#xe8e0;</span>
<span className='content-header-right'>学员审核列表</span>
</div>
</If>
</div>
<div className="box">
<div className="box-header">
<div className="header-item">
......@@ -243,6 +275,12 @@ function UserManagePage() {
</div>
</div>
{model}
<Route
path={`${match.url}/wechat-user-audit`}
render={() => {
return <WechatUserAudit/>;
}}
/>
</div>
);
}
......
import React, { useState, useEffect } from 'react';
import Breadcrumbs from '@/components/Breadcrumbs';
import WechatUserAuditFilter from './WechatUserAuditFilter';
import WechatUserAuditOpt from './WechatUserAuditOpt'
import WechatUserAuditList from './WechatUserAuditList';
import StoreService from "@/domains/store-domain/storeService";
import User from '@/common/js/user';
import './WechatUserAudit.less';
const WechatUserAudit = function () {
const [listData, setListData] = useState([]);
const [totalCount, setTotalCount] = useState(0);
const [listCount, setListCount] = useState({
"allCnt": 0,
"passedCnt": 0,
"rejectedCnt": 0,
"waitCnt": 0
});
const [query, setQuery] = useState({
current: 1,
size: 10,
applyStatus: 'WAIT' //PASSED, WAIT, REJECTED
});
useEffect(() => {
//列表获取
function handleFetchAuditList(_query) {
const params = {
...query,
..._query,
storeId: User.getStoreId(),
};
StoreService.getCustomerAuditList(params).then((res) => {
const {
result: { records = [], total },
} = res;
setListData(records);
setTotalCount(total);
});
}
//列表获取
function handleFetchAuditListCount(_query) {
const params = {
storeId: User.getStoreId(),
};
StoreService.getCustomerAuditListCount(params).then((res) => {
const {
result,
} = res;
setListCount(result)
});
}
handleFetchAuditList();
handleFetchAuditListCount();
}, [query]);
//搜索条件改变
function queryChange(_query) {
if(_query.realName){
_query.nickName = _query.realName
}
const params = {
...query,
..._query,
};
console.log('params====>',params)
setQuery(params);
}
return (
<div className='page wechat-user-audit'>
<Breadcrumbs navList='学员审核列表' />
<div className='box'>
<WechatUserAuditFilter onChange={queryChange} />
<WechatUserAuditOpt onChange = {queryChange} listCount={listCount} defaultType={query.applyStatus}/>
<WechatUserAuditList listData={listData} query={query} totalCount={totalCount} onChange={queryChange} />
</div>
</div>
);
};
export default WechatUserAudit;
.wechat-user-audit{
}
\ No newline at end of file
/*
* @Author: 庞国铭
* @Description: 学员审核列表 筛选
*/
import React, { useState } from 'react';
import { Row, Input, Tooltip } from 'antd';
import RangePicker from '@/modules/common/DateRangePicker';
import moment from 'moment';
import './WechatUserAuditFilter.less';
const { Search } = Input;
const defaultQuery = {
realName: null,
startDate: null,
endDate: null,
nickName:null
};
const WechatUserAuditFilter = function (props) {
const { onChange = () => {} } = props;
const [query, setQuery] = useState(defaultQuery);
// 改变搜索条件
function handleChangeQuery(field, value) {
let _query = {
...query,
[field]: value,
current: 1,
};
setQuery(_query);
onChange(_query);
}
//日期选择
function handleChangeDates(dates) {
let _query = {
...query,
current: 1,
};
if (_.isEmpty(dates)) {
delete _query.startDate;
delete _query.endDate;
} else {
_query.startDate = dates[0]?.startOf('day').valueOf();
_query.endDate = dates[1]?.endOf('day').valueOf();
}
setQuery(_query);
onChange(_query);
}
//重置
function handleReset() {
setQuery({
...defaultQuery,
current: 1,
});
onChange({
...defaultQuery,
current: 1,
});
}
return (
<div className='wechat-user-audit-filter'>
<Row type='flex' justify='space-between' align='top'>
<div className='search-condition'>
<div className='search-condition__item'>
<span className='search-name'>搜索用户:</span>
<Search
value={query.realName}
placeholder='搜索用户'
onChange={(e) => {
handleChangeQuery('realName', e.target.value);
}}
onSearch={() => {
onChange(query.current);
}}
style={{ width: 'calc(100% - 81px)' }}
className='search-input'
enterButton={<span className='icon iconfont'>&#xe832;</span>}
/>
</div>
<div className='search-condition__item'>
<span className='search-date'>申请时间:</span>
<RangePicker
id='course_date_picker'
allowClear={false}
value={query.startDate ? [moment(query.startDate), moment(query.endDate)] : null}
format={'YYYY-MM-DD'}
onChange={(dates) => {
handleChangeDates(dates);
}}
style={{ width: 'calc(100% - 81px)' }}
/>
</div>
</div>
<div className='reset-fold-area'>
<Tooltip title='清空筛选'>
<span className='resetBtn iconfont icon' onClick={handleReset}>
&#xe61b;
</span>
</Tooltip>
</div>
</Row>
</div>
);
};
export default WechatUserAuditFilter;
.wechat-user-audit-filter{
position: relative;
.ant-input-search-button{
border-left:none;
}
.search-condition {
width: calc(100% - 80px);
display: flex;
align-items: center;
flex-wrap: wrap;
&__item {
width: 30%;
margin-right: 3%;
margin-bottom: 12px;
.search-name{
width: 81px;
vertical-align: middle;
display:inline-block;
height:32px;
line-height:32px;
}
}
}
.reset-fold-area {
position: absolute;
right: 12px;
}
.resetBtn {
color: #999999;
font-size: 18px;
margin-right: 8px;
}
.fold-btn {
font-size: 14px;
color: #666666;
line-height: 20px;
.fold-icon {
font-size: 12px;
margin-left:4px;
}
}
}
.data-icon {
cursor: pointer;
}
import React from 'react';
import { message, Badge } from 'antd';
import { PageControl, XMTable } from '@/components';
import WWOpenDataCom from '@/components/WWOpenDataCom';
import './WechatUserAuditList.less';
import StoreService from '@/domains/store-domain/storeService';
import User from '@/common/js/user';
function WechatUserAuditList(props) {
const { listData, totalCount, query, onChange = () => {} } = props;
function parseColumns() {
const columns = [
{
title: '微信名称',
key: 'nickName',
dataIndex: 'nickName',
width: '12%',
fixed: 'left',
render: (val, record) => {
return <div className='wechat-user-audit-name'>{val}</div>;
},
},
{
title: '真实姓名',
key: 'realName',
dataIndex: 'realName',
width: '12%',
render: (val) => {
return <div className='create-name'>{val}</div>;
},
},
{
title: '申请时间',
width: '12.5%',
key: 'applyDate',
dataIndex: 'applyDate',
render: (val) => {
return <span style={{ whiteSpace: 'nowrap' }}>{window.formatDate('YYYY-MM-DD H:i', val)}</span>;
},
},
{
title: '审批状态',
width: '10%',
key: 'applyStatus',
dataIndex: 'applyStatus',
render: (val) => {
return (
<div className='valid-state-icon'>
<Choose>
<When condition={val === 'PASSED'}>
<Badge color='#0ACCA4' text='已通过' />
</When>
<When condition={val === 'REJECTED'}>
<Badge color='#EC4B35' text='已拒绝' />
</When>
<Otherwise>
<Badge color='#FFB714' text='待审核' />
</Otherwise>
</Choose>
</div>
);
},
},
{
title: '审核人',
width: '10%',
key: 'reviewer',
dataIndex: 'reviewer',
render: (val) => {
return <div>
<WWOpenDataCom type="userName" openid={val} />
</div>;
},
},
{
title: '操作',
key: 'operate',
dataIndex: 'operate',
fixed: 'right',
width: '14.5%',
render: (val, record) => {
return (
<Choose>
<When condition={record.applyStatus === 'WAIT'}>
<div className='operate'>
<div className='operate__item' onClick={() => audit(record, true)}>
通过
</div>
<span className='operate__item split'> | </span>
<div className='operate__item' onClick={() => audit(record, false)}>
拒绝
</div>
</div>
</When>
<Otherwise>
<div className='operate'>
<div></div>
</div>
</Otherwise>
</Choose>
);
},
},
];
return columns;
}
function audit(record, isTrue) {
const { id } = record;
const params = {
applyCustomerId: id,
audit: isTrue,
operatorId: User.getStoreUserId(),
storeId: User.getStoreId(),
};
StoreService.auditOperation(params).then((res) => {
if (res.success) {
message.success('操作成功');
onChange(query)
}
}).catch(res=>{
if(res.code === 'THIS_OPERATION_INVALID'){
window.RCHistory.goBack();
}
if(res.code === 'AUDIT_HAS_OPERATION'){
onChange(query)
}
});
}
function onShowSizeChange(current, size) {
if (current === size) {
return;
}
let _query = query;
_query.size = size;
onChange(_query);
}
return (
<div className='wechat-user-audit-list'>
<XMTable
rowKey={(record) => record.id}
showSorterTooltip={false}
dataSource={listData}
columns={parseColumns()}
pagination={false}
bordered
size='middle'
scroll={{ x: 1400 }}
className='wechat-user-audit-list-table'
renderEmpty={{
description: <span style={{ display: 'block', paddingBottom: 24 }}>暂无数据</span>,
}}
/>
<div className='box-footer'>
<PageControl
current={query.current - 1}
pageSize={query.size}
total={totalCount}
toPage={(page) => {
const _query = { ...query, current: page + 1 };
onChange(_query);
}}
onShowSizeChange={onShowSizeChange}
/>
</div>
</div>
);
}
export default WechatUserAuditList;
.wechat-user-audit-list {
margin-top: 12px;
.course-number {
margin-right: 45px;
}
.wechat-user-audit-list-table {
thead.ant-table-thead {
tr {
th {
padding: 10px 12px;
}
}
}
tbody {
tr {
td.ant-table-cell {
padding: 16px 12px;
color: #333;
}
&:nth-child(even) {
background: transparent;
td {
background: #fff;
}
}
&:nth-child(odd) {
background: #fafafa;
td {
background: #fafafa;
}
}
&:hover {
td {
background: #f3f6fa;
}
}
}
}
}
.operate-text {
color: #2966ff;
cursor: pointer;
}
.operate {
display: flex;
&__item {
color: #2966ff;
cursor: pointer;
&.split {
margin: 0 8px;
color: #bfbfbf;
}
}
}
.join-number {
text-align: right;
margin-right: 12px;
}
.more-operate {
line-height: 20px;
}
.valid-state-icon{
display: flex;
align-items: center;
.ant-badge{
transform: translate(0,0) scale(1) !important;
}
}
}
\ No newline at end of file
import React from 'react';
import { Row, Radio } from 'antd';
const WechatUserAuditOpt = function (props) {
const { onChange = () => {}, listCount = {}, defaultType = '' } = props;
const { allCnt = 0, passedCnt = 0, rejectedCnt = 0, waitCnt = 0 } = listCount;
return (
<div className='wechat-user-audit-filter'>
<Row type='flex' justify='end' align='top'>
<Radio.Group onChange={(e) => onChange({ applyStatus: e.target.value==='' ? null: e.target.value })} defaultValue={defaultType}>
<Radio.Button value=''>{`全部(${allCnt})`}</Radio.Button>
<Radio.Button value='WAIT'>{`待审核(${waitCnt})`}</Radio.Button>
<Radio.Button value='PASSED'>{`已通过(${passedCnt})`}</Radio.Button>
<Radio.Button value='REJECTED'>{`已拒绝(${rejectedCnt})`}</Radio.Button>
</Radio.Group>
</Row>
</div>
);
};
export default WechatUserAuditOpt;
......@@ -124,7 +124,7 @@ function DepartMentTabCon(props) {
return (
<div className="operate">
{props.currentTab==='departMentTab'?
<span>-</span>
<div className="operate__item" onClick={()=>delUser('single',item.userId)}>删除</div>
:
(selectDep.depLevel > 0 ?
<div className="operate__item" onClick={()=>delUser('single',item.userId)}>移出</div>
......@@ -351,9 +351,9 @@ function DepartMentTabCon(props) {
添加学员
</Button>
}
{(props.currentTab === "postGrouptab" || props.currentTab === "customGroupTab") &&
<Button className="del-user-btn" onClick={()=>delUser('multiple')}>删除学员</Button>
}
{ selectDep.depId !== '10000' ?
<>
<Button className="update-user-btn" onClick={()=>{updateListData()}}>更新列表数据</Button>
......
......@@ -155,6 +155,7 @@ class GraphicsEditor extends React.Component {
message.warning(`内容过长,不能超过${maxLimit}字`);
}
Bus.trigger('editorLimit', textLength, editorType);
console.log(onChange,html, this.state.textLength)
onChange(html, this.state.textLength);
});
};
......
import React from 'react';
import { Input, Button, Modal, message, Form } from 'antd';
import { Input, Button, Switch, message, Form, Tooltip } from 'antd';
import Upload from '@/core/upload';
import Service from "@/common/js/service";
import BaseService from "@/domains/basic-domain/baseService";
import User from "@/common/js/user";
import Breadcrumbs from "@/components/Breadcrumbs";
import ImgClipModal from '@/components/ImgClipModal'
import {debounce} from 'underscore'
import { brandLogo } from '@/domains/brand/constants'
import './CreateCollege.less';
let cutFlag = false;
export default class CreateCollege extends React.Component {
constructor(props) {
......@@ -21,6 +19,7 @@ export default class CreateCollege extends React.Component {
name: '',
enterpriseId: User.getEnterpriseId(),
imageFile: null, // 需要被截取的图片
auditSwitch:'OPEN',
};
this.loginInputRef = React.createRef()
}
......@@ -71,14 +70,14 @@ export default class CreateCollege extends React.Component {
};
updateCover = () =>{
const {coverClicpPath,coverId} = this.state
const {coverClicpPath} = this.state
this.setState({
logo:coverClicpPath
})
}
submit = () => {
const { logo, collegeName, enterpriseId } = this.state;
const { logo, collegeName, enterpriseId,auditSwitch } = this.state;
if (!collegeName) {
this.setState({ showError: true })
} else {
......@@ -87,6 +86,7 @@ export default class CreateCollege extends React.Component {
userId: User.getUserId(),
logo,
storeName: collegeName,
auditSwitch
}
Service.Hades('public/customerHades/createStore', params).then((res) => {
if (res.success) {
......@@ -95,18 +95,22 @@ export default class CreateCollege extends React.Component {
})
}
}
onChangeFiledValue = (filed, value) => {
this.setState({
[filed]: value,
});
};
render() {
const {
avatar,
name,
collegeName,
logo,
visible,
hasImgReady,
cutImageBlob,
showError,
imageFile
imageFile,
auditSwitch
} = this.state;
return (
<div className="college-manage-page">
......@@ -125,7 +129,7 @@ export default class CreateCollege extends React.Component {
</div>
<div className="create-box">
<div className="image-box">
<img className="image" src={logo}/>
<img className="image" src={logo} alt=''/>
<div className="image-mask">
<span
className="icon iconfont"
......@@ -155,11 +159,29 @@ export default class CreateCollege extends React.Component {
}}
></Input>
</Form.Item>
<Form.Item label={<div className='label-box'>学员审核
<Tooltip title='学院同时支持企微和微信用户加入学院学习。学员审核开启后,微信用户需要先提出申请,学院管理员审核通过后才能成为学院的学员,保证仅可信的微信用户才能加入学院。' placement='top' arrowPointAtCenter>
<span className='icon iconfont icon-tip'>&#xe61d;</span>
</Tooltip>
</div>} name='auditSwitch' rules={[{ required: true }]}>
<div className='switch-box'>
<Switch checked={auditSwitch ==='OPEN' } onChange={(e) => this.onChangeFiledValue('auditSwitch', e ?'OPEN':'CLOSE')}/>
<Choose>
<When condition={auditSwitch ==='OPEN'}>
<div className='switch-desc'>已开启,成为学院学员需要审核</div>
</When>
<Otherwise>
<div className='switch-desc'>已关闭,成为学院学员不需要审核</div>
</Otherwise>
</Choose>
</div>
</Form.Item>
</Form>
<Button
className="button"
type="primary"
onClick={_.debounce(() => this.submit(), 3000, {
onClick={debounce(() => this.submit(), 3000, {
leading: true,
trailing: false
})}
......
......@@ -5,7 +5,7 @@
.create-box {
padding-top: 108px;
margin: 0 auto;
width: 350px;
width: 380px;
.image-box {
position: relative;
display: block;
......@@ -45,6 +45,27 @@
}
}
}
.label-box{
display: flex;
align-content: center;
.icon{
color:#BFBFBF;
margin: 0 2px;
}
}
.switch-box{
display: flex;
align-items: center;
.switch-desc{
color: #999;
font-size: 14px;
margin: 0 8px;
}
.switch-prew-link{
color: #2966FF;
font-size: 14px;
}
}
.tip {
display: block;
color: #999999;
......@@ -52,10 +73,10 @@
margin-bottom: 24px;
}
.input {
width: 350px;
width: 380px;
}
.button {
width: 350px;
width: 380px;
margin-top: 36px;
height: 32px !important;
}
......
import React, { useState, useRef, useEffect, useContext } from 'react'
import React, { useState, useRef, useEffect } from 'react'
import Breadcrumbs from "@/components/Breadcrumbs";
import { Form, Alert, Input, Button, InputNumber, DatePicker, Switch, Radio, message, Modal, Tooltip } from 'antd';
import { Route, withRouter } from 'react-router-dom';
import { Form, Input, Button, InputNumber, DatePicker, Switch, Radio, message, Modal, Tooltip } from 'antd';
import { withRouter } from 'react-router-dom';
import User from "@/common/js/user";
import moment from 'moment'
import Service from "@/common/js/service";
......
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