1.util下新建 storage.js
//工具类 const get = (key) => { var overTime = localStorage.getItem('over_time'); var time = Date.now(); if(overTime > time){ localStorage.setItem('over_time',time+3600000) return localStorage.getItem(key) }else{ localStorage.setItem('isLogin',false) localStorage.setItem('over_time',1) localStorage.setItem('username',null) localStorage.setItem('token',null) window.location.href = "#/" } } const set = (key, value) => { localStorage.setItem(key, value) } const storage = { set, get, }; export default storage
2. server.js token 修改为通过storage获取
3.优化文章列表和新增修改
article.js
import React,{ Component } from 'react' import { Table, Space,Button,Modal,Input, Form, Row, Col, Select, Cascader, DatePicker, message,Pagination } from 'antd' import moment from 'moment' import 'moment/locale/zh-cn' import './article.less' import NavDom from 'components/NavDom/NavDom' import RequestTools from 'utils/request' import storage from "utils/storage"; import {Link} from "react-router-dom"; moment.locale('zh-cn') const { confirm } = Modal const { Option } = Select const { RangePicker } = DatePicker; const _req = new RequestTools() class ArticleList extends Component { constructor(prors){ super(prors) this.state={ page:1, //显示页 pagesize:10,//显示的条数 count:0,// 总条数 align:'center', data:[], //接收数据 keywords:'', category:'', status:'', update_time:'', options:[], selectedRowKeys:[] } this.rowSelection = { onChange: (selectedRowKeys, selectedRows) => { this.state.selectedRowKeys = selectedRowKeys console.log(this.state) }, }; this.formRef = {}; _req.axiosPostSync({}, 'getCategoryList').then(res => { console.log('getCategoryList',res.data) this.state.options = res.data storage.set('category', JSON.stringify(res.data)) }) _req.axiosPostSync({}, 'getTagsList').then(res => { storage.set('tags', JSON.stringify(res.data)) }) } componentDidMount() { // this.state.options = JSON.parse(storage.get('category')) this.getArticleList() } getArticleList = () => { const params = {} params.page = this.state.page; params.pagesize = this.state.pagesize; console.log(this.state) console.log(this.state.keywords) this.state.keywords && (params.keywords = this.state.keywords); this.state.category && (params.category = this.state.category); this.state.status && (params.status = this.state.status); this.state.update_time && (params.update_time = this.state.update_time); console.log('查询参数',params) _req.axiosPost(params, 'getArticleList').then(res => { this.setState({ data:res.data.data, count: res.data.statistic.count }) }) } // 错误提示 error = (val) => { message.error(val); }; // 成功提示 success = (val) => { message.success(val); }; searchInputChange = (e) =>{ console.log(e) this.state[e.target.id] = e.target.value } searchCascaderChange = (e) =>{ this.state.category = JSON.stringify(e) } searchStatusChange = (e) =>{ this.state.status = e } searchTimeChange = (e) =>{ console.log(e) this.state.update_time = JSON.stringify([moment(e[0]).unix(),moment(e[1]).unix()]) console.log(this.state) } // 添加 toSearch = (e) => { console.log('tosearch') this.getArticleList() } toReset = (e) => { var that = this; this.setState({ keywords : '', category : '', status : '', update_time : '' },(e) => { that.formRef.resetFields(); that.getArticleList() }) console.log(this.state) } publish(text,record,index){ let that = this; console.log(record) confirm({ title: '确定发布此条资讯?', okText: '确认', okType: 'danger', cancelText: '取消', // 点击确认触发 onOk() { _req.axiosPost({id:record.id,is_public:1}, 'doArticlePublic').then(res => { if (res.code===0){ that.success(res.data.msg) setTimeout(function (){ that.getArticleList() },800) } }) }, // 点击取消触发 onCancel() { console.log('Cancel'); }, }); } unpublish(text,record,index){ let that = this; console.log(record) confirm({ title: '确定取消发布此条资讯?', okText: '确认', okType: 'danger', cancelText: '取消', // 点击确认触发 onOk() { _req.axiosPost({id:record.id,is_public:0}, 'doArticlePublic').then(res => { if (res.code===0){ that.success(res.data.msg) setTimeout(function (){ that.getArticleList() },800) } }) }, // 点击取消触发 onCancel() { console.log('Cancel'); }, }); } // 删除 del(text,record,index){ let that = this; console.log(record) confirm({ title: '确定删除本条资讯信息吗?', okText: '确认', okType: 'danger', cancelText: '取消', // 点击确认触发 onOk() { _req.axiosPost({id:record.id}, 'doArticleDelete').then(res => { if (res.code===0){ that.success(res.data.msg) setTimeout(function (){ that.getArticleList() },800) } }) }, // 点击取消触发 onCancel() { console.log('Cancel'); }, }); } batchDel = () => { let that = this; let selected = that.state.selectedRowKeys if(selected.length <=0){ that.error('至少选择一条资讯') return false; } let ids = JSON.stringify(selected) confirm({ title: '确定下架并删除所有选中资讯信息吗?', okText: '确认', okType: 'danger', cancelText: '取消', // 点击确认触发 onOk() { _req.axiosPost({bathData:ids}, 'doArticleBatchDel').then(res => { if (res.code===0){ that.success(res.data.msg) setTimeout(function (){ that.getArticleList() },800) } }) }, // 点击取消触发 onCancel() { console.log('Cancel'); }, }); } // 分页操作 onChangePage = page => { new Promise((resolve, reject) => { this.setState({ page: page, // 改变值 }); resolve() }).then(() => { this.getArticleList() }) }; render() { const columns = [ { title: '封面', dataIndex: 'thumb', width: 150, align:this.state.align, render:(text,record,index) =>{ if(text !== ''){ return ( <img src={text} style={{width:100}} alt=""/> ) } } }, { title: '标题', dataIndex: 'title', width: 150, align:this.state.align, }, { title: '分类', dataIndex: 'category_name', width: 80, align:this.state.align, }, { title: '状态', dataIndex: 'public', align:this.state.align, width: 20, render:(text, record,index) =>{ if(record.is_public){ return ( <span>已发布</span> ) }else{ return ( <span style={{color:'red'}}>未发布</span> ) } } }, { title: '阅读量', dataIndex: 'viewnum', align:this.state.align, width: 20, }, { title: '更新时间', dataIndex: 'update_time', align:this.state.align, width: 50, }, { title: '操作', dataIndex: 'act', align:this.state.align, width: 150, render: (text, record,index) => { if (record.is_public) { return ( <Space style={{ cursor: 'pointer', color: '#2378f7', fontSize: '15px' }}> <span onClick={() => this.unpublish(text, record, index)}>下架</span> <span><Link to={"/app/articleEdit"} state={{record}}>编辑</Link></span> <span onClick={() => this.del(text, record, index)}>删除</span> </Space> ) }else{ return ( <Space style={{ cursor: 'pointer', color: '#2378f7', fontSize: '15px' }}> <span onClick={() => this.publish(text, record, index)}>发布</span> <span><Link to={"/app/articleEdit"} state={{record}}>编辑</Link></span> <span onClick={() => this.del(text, record, index)}>删除</span> </Space> ) } } } ]; return ( <div className='article_content_div'> <Row className="list_crumbs"> <NavDom breads={[{'title':'资讯管理', 'url':'/app/article'},{'title':'资讯列表', 'url':''}]}/> </Row> <Row className="list_searchBar"> <Form autoComplete="off" ref={(r)=>{this.formRef = r}} > <Form.Item label="标题" name="keywords" > <Input onChange={(e) => this.searchInputChange(e)} placeholder={`输入关键字查询`}/> </Form.Item> <Form.Item label="分类" name="category" > <Cascader options={this.state.options} onChange={(e) => this.searchCascaderChange(e)} placeholder="分类" allowClear /> </Form.Item> <Form.Item label="状态" name="status" > <Select onChange={(e) => this.searchStatusChange(e)} placeholder="是否发布" allowClear> <Option value="1">已发布</Option> <Option value="0">未发布</Option> </Select> </Form.Item> <Form.Item label="更新时间" name="update_time" > <RangePicker onChange={(e) => this.searchTimeChange(e)} placeholder={['起始时间','结束时间']} allowClear /> </Form.Item> <Form.Item wrapperCol={{ span: 24 }}> <Button type="primary" onClick={this.toSearch}> 查询 </Button> <Button htmlType="button" onClick={this.toReset}> 重置 </Button> </Form.Item> </Form> </Row> <Row className="list_content"> <Col span={24}> <div className="list_content_btndiv"> <Button type="primary" > <Link to="/app/articleAdd">新增</Link> </Button> <Button onClick={this.batchDel} htmlType="button" > 批量删除 </Button> </div> <Table rowSelection={this.rowSelection} pagination={false} columns={columns} dataSource={this.state.data} rowKey={columns => columns.id} /> <Pagination current={this.state.page} // 总条数 绑定state中的值 onChange={this.onChangePage} // 改变页面是发生的函数 pageSize={this.state.pagesize} total={this.state.count} // 页码数量 = 向上取整(总条数/每页条数)X10 showSizeChanger={false} // 总条数超过多少条显示也换条数 style={{ marginTop: '20px' }} /> </Col> </Row> </div> ) } } export default ArticleList
article.less
.article_content_div .ant-form-item{ min-width: 150px; margin-left: 15px; }
articleAdd.js
import React,{ useState } from 'react' import {Button, Input, Form, Row, Col, Select, message, Cascader, Radio, Space, Upload} from 'antd'; import ImgCrop from 'antd-img-crop'; import { UploadOutlined } from '@ant-design/icons'; import moment from 'moment'; import 'moment/locale/zh-cn' import UEditor from 'components/Editor/Editor'; import NavDom from 'components/NavDom/NavDom'; import url from 'api/api'; import storage from 'utils/storage' import RequestTools from 'utils/request' import { useNavigate } from "react-router-dom"; import './articleAdd.less' moment.locale('zh-cn') const { Option } = Select; const { TextArea } = Input; const _req = new RequestTools() function ArticleAdd() { let navigate = useNavigate(); const [editorContent, setEditorContent] = useState(''); const [cover_image, setCover_image] = useState(''); const [attach, setAttach] = useState(''); const [type, setType] = useState(1); const [status, setStatus] = useState(0); const [fileList, setFileList] = useState([]); const [visible_type, setVisible_type] = useState('block'); const [visible_type_2, setVisible_type_2] = useState('none'); const options = JSON.parse(storage.get('category')) const tags = JSON.parse(storage.get('tags')) const children = []; for (let i in tags) { children.push(<Option key={i} value={i}>{tags[i]}</Option>); } console.log('children',children) const props = { name: 'file', action: url['doUploadAttach'], headers: { authorization: 'authorization-text', }, data:{ token:storage.get('token') }, onChange(info) { if (info.file.status !== 'uploading') { console.log(info.file, info.fileList); } if (info.file.status === 'done') { console.log(info.file) setAttach(info.file.response.data.file) message.success(`${info.file.name} file uploaded successfully`); } else if (info.file.status === 'error') { message.error(`${info.file.name} file upload failed.`); } }, }; // 错误提示 const error = (val) => { message.error(val); }; // 成功提示 const success = (val) => { message.success(val); }; const onEditorChange = (editorContent) => { setEditorContent(editorContent) }; const onChangeType = (e) => { console.log('onChangeType',e) setType(e.target.value) if(e.target.value === '1' || e.target.value === 1){ setVisible_type('block') setVisible_type_2('none') }else{ setVisible_type('none') setVisible_type_2('block') } } const onChangeTags = (e) => { console.log(e); } const onFileChange = ({ file,event,fileList: newFileList }) => { console.log('上传返回的信息') console.log(file) console.log(file.status) if(file.status === 'done' && file.response.code === 0){ console.log(file.response.code) console.log(file.response.data.file) setCover_image(file.response.data.file) } setFileList(newFileList); }; const onPreview = async file => { let src = file.url; if (!src) { src = await new Promise(resolve => { const reader = new FileReader(); reader.readAsDataURL(file.originFileObj); reader.onload = () => resolve(reader.result); }); } const image = new Image(); image.src = src; const imgWindow = window.open(src); imgWindow.document.write(image.outerHTML); }; const onSubmit = (e) =>{ console.log(1122) setStatus(1) } const onSubmitTest = (e) =>{ console.log(112212) setStatus(0) } // 添加 const onAddFinish = values => { console.log('Received values of form: ', values); var params = {}; params.title=values.title; params.category=JSON.stringify(values.category); params.author=values.author; params.tags=JSON.stringify(values.tags); params.tags_2=values.tags_2; params.description=values.description; params.type=type; params.content=editorContent?editorContent:''; params.source_url=values.source_url?values.source_url:''; params.thumb=cover_image; params.attach=attach; params.status=status; console.log('Received params: ', params); if(params.type === '1' || params.type === 1){ if(editorContent === ''){ error('正文不能为空'); return false; } }else{ if(params.source_url === ''){ error('原文链接不能为空'); return false; } } if(cover_image === ''){ error('封面图必须上传'); return false; } _req.axiosPost(params, 'doArticleAdd').then(res => { console.log(res); if (res.code===0){ success(res.data.msg) setTimeout(function (){ navigate('/app/article',{replace: true}) },800) }else{ error(res.desc) } }) } return ( <div> <Row className="list_crumbs"> <NavDom breads={[{'title':'资讯管理', 'url':'/app/article'},{'title':'资讯新增', 'url':''}]}/> </Row> <Row className="list_content"> <Col span={24}> <Form style={{marginLeft:'-12px'}} labelCol={{ span: 2 }} wrapperCol={{ span: 18 }} layout="horizontal" autoComplete="off" onFinish={onAddFinish} > <Form.Item name='title' label="标题" rules={[{required:true,message:'标题必填'}]} > <Input placeholder="标题" /> </Form.Item> <Form.Item label="分类"> <Form.Item name='category' className='article_add_select_category' rules={[{required:true,message:'分类必选'}]} > <Cascader options={options} placeholder="分类" allowClear /> </Form.Item> <Form.Item name='author' label="作者" className='article_add_input_author' > <Input placeholder="作者" /> </Form.Item> </Form.Item> <Form.Item label="类型" rules={[{required:true}]} > <Radio.Group name='type' onChange={onChangeType} value={type}> <Radio value={1}>原创</Radio> <Radio value={0}>转载</Radio> </Radio.Group> </Form.Item> <Form.Item label="标签"> <Form.Item name='tags' className='article_add_select_tags' rules={[{required:true,message:'标签必选'}]} > <Select mode="multiple" allowClear placeholder="标签" onChange={onChangeTags} > {children} </Select> </Form.Item> <Form.Item name='tags_2' className='article_add_input_tags' > <Input placeholder="自定义标签,使用逗号分割" /> </Form.Item> </Form.Item> <div style={{display:visible_type}}> <Form.Item label="正文" > <UEditor content={editorContent} onChange={onEditorChange} width="600px" height="700px" /> </Form.Item> </div> <div style={{display:visible_type_2}}> <Form.Item name='source_url' label="原文链接" > <Input placeholder="原文链接" /> </Form.Item> </div> <Form.Item label="上传封面图" > <Form.Item name='cover_image' className='article_add_upload_cover' > <ImgCrop rotate> <Upload accept="image/*" action={url['doUploadImg']} data={{token : storage.get('token')}} listType="picture-card" fileList={fileList} onChange={onFileChange} onPreview={onPreview} > {fileList.length < 1 && '封面图'} </Upload> </ImgCrop> </Form.Item> <Form.Item name='description' label="摘要" className='article_add_input_description' rules={[{required:true,message:'摘要必填'}]} > <TextArea rows={4} placeholder="摘要" style={{height:104}} /> </Form.Item> <Space>提示:建议尺寸640*360像素或比例16:9,格式:jpg、png,小于5M的图片</Space> </Form.Item> <Form.Item label="附件"> <Upload {...props}> <Button icon={<UploadOutlined />}>上传附件</Button> </Upload> <Space>提示:建议格式为word、excel、ppt、pdf,小于10M以内</Space> </Form.Item> <Form.Item className='submitBtn' style={{margin:'20px 0 0 120px '}} > <Button key="submit" type="primary" htmlType="submit" onClick={onSubmit} > 提交 </Button> <Button > 预览 </Button> <Button htmlType="submit" onClick={onSubmitTest}> 保存草稿 </Button> </Form.Item> </Form> </Col> </Row> </div> ) } export default ArticleAdd
articleAdd.less
//.article_add_select_category{ // float: left; //} .article_add_select_category,.article_add_input_author{ display:inline-flex; //width:300px; margin-bottom: 0; } .article_add_select_category,.article_add_select_tags{ margin-left: 0; } .article_add_select_tags,.article_add_input_tags{ display:inline-flex; width:45%; margin-bottom: 0; } #edui1,#edui1_iframeholder{ width: 100% !important; } .article_add_input_description,.article_add_upload_cover{ display: inline-flex; margin-bottom: 0; } .article_add_upload_cover{ margin-left: 0; } .article_add_upload_cover .ant-upload-select-picture-card,.article_add_upload_cover .ant-upload-list-picture-card-container{ margin-bottom: 0; } .ant-space{ margin-top: 8px; } .article_add_input_description{ width: 60%; } .submitBtn .ant-btn{ margin-left: 15px; }
articleEdit.js
import React,{ useState } from 'react' import {Button, Input, Form, Row, Col, Select, message, Cascader, Radio, Space, Upload} from 'antd'; import ImgCrop from 'antd-img-crop'; import { UploadOutlined } from '@ant-design/icons'; import moment from 'moment'; import 'moment/locale/zh-cn' import UEditor from 'components/Editor/Editor'; import NavDom from 'components/NavDom/NavDom'; import url from 'api/api'; import storage from 'utils/storage' import RequestTools from 'utils/request' import { useNavigate, useLocation } from "react-router-dom"; import './articleAdd.less' moment.locale('zh-cn') const { Option } = Select; const { TextArea } = Input; const _req = new RequestTools() function ArticleEdit() { let navigate = useNavigate(); const stateparams = useLocation().state.record console.log('stateparams',stateparams) let is_visible_type = 'block'; let is_visible_type_2 = 'none'; if(stateparams.type !== 1 && stateparams.type !== '1'){ is_visible_type = 'none' is_visible_type_2 = 'block' } const [editorContent, setEditorContent] = useState(stateparams.content); const [type, setType] = useState(parseInt(stateparams.type)); const [status, setStatus] = useState(0); const [visible_type, setVisible_type] = useState(is_visible_type); const [visible_type_2, setVisible_type_2] = useState(is_visible_type_2); let fileListOld = [] let cover_imageOld = '' if(stateparams.thumb !== ''){ console.log(stateparams.thumb) console.log(stateparams.cover_image) fileListOld = [ { uid: '-1', name: 'image.png', status: 'done', url: stateparams.thumb, }] console.log(fileListOld) cover_imageOld = stateparams.cover_image } const [cover_image, setCover_image] = useState(cover_imageOld); const [fileList, setFileList] = useState(fileListOld); let defaultAttachList = [] let attachOld = '' if(stateparams.attach !== ''){ defaultAttachList = [ { uid: '-1', name: '附件', status: 'done', url: stateparams.attach_url, }] console.log('defaultAttachList',defaultAttachList) attachOld = stateparams.attach } const [attach, setAttach] = useState(attachOld); const options = JSON.parse(storage.get('category')) const tags = JSON.parse(storage.get('tags')) let category = [stateparams.category_id,stateparams.p_id]; const children = []; for (let i in tags) { children.push(<Option key={i} value={i}>{tags[i]}</Option>); } console.log('children',children) const props = { name: 'file', action: url['doUploadAttach'], headers: { authorization: 'authorization-text', }, data:{ token:storage.get('token') }, defaultFileList:defaultAttachList, onChange(info) { if (info.file.status !== 'uploading') { console.log(info.file, info.fileList); } if (info.file.status === 'done') { console.log(info.file) setAttach(info.file.response.data.file) message.success(`${info.file.name} 上传成功`); } else if (info.file.status === 'error') { message.error(`${info.file.name} 上传失败`); } }, }; // 错误提示 const error = (val) => { message.error(val); }; // 成功提示 const success = (val) => { message.success(val); }; const onEditorChange = (editorContent) => { setEditorContent(editorContent) }; const onChangeType = (e) => { console.log('onChangeType',e) setType(e.target.value) if(e.target.value === '1' || e.target.value === 1){ setVisible_type('block') setVisible_type_2('none') }else{ setVisible_type('none') setVisible_type_2('block') } } const onChangeTags = (e) => { console.log(e); } const onFileChange = ({ file,event,fileList: newFileList }) => { console.log('上传返回的信息') console.log(file) console.log(file.status) if(file.status === 'done' && file.response.code === 0){ console.log(file.response.code) console.log(file.response.data.file) setCover_image(file.response.data.file) } setFileList(newFileList); }; const onPreview = async file => { let src = file.url; if (!src) { src = await new Promise(resolve => { const reader = new FileReader(); reader.readAsDataURL(file.originFileObj); reader.onload = () => resolve(reader.result); }); } const image = new Image(); image.src = src; const imgWindow = window.open(src); imgWindow.document.write(image.outerHTML); }; const onSubmit = (e) =>{ console.log(1122) setStatus(1) } const onSubmitTest = (e) =>{ console.log(112212) setStatus(0) } // 添加 const onAddFinish = values => { console.log('Received values of form: ', values); var params = {}; params.id=stateparams.id; params.title=values.title; params.category=JSON.stringify(values.category); params.author=values.author; params.tags=JSON.stringify(values.tags); params.tags_2=values.tags_2; params.description=values.description; params.type=type; params.content=editorContent?editorContent:''; params.source_url=values.source_url?values.source_url:''; params.thumb=cover_image; params.attach=attach; params.status=status; console.log('Received params: ', params); if(params.type === '1' || params.type === 1){ if(editorContent === ''){ error('正文不能为空'); return false; } }else{ if(params.source_url === ''){ error('原文链接不能为空'); return false; } } if(cover_image === ''){ error('封面图必须上传'); return false; } _req.axiosPost(params, 'doArticleUpdate').then(res => { console.log(res); if (res.code===0){ success(res.data.msg) setTimeout(function (){ navigate('/app/article',{replace: true}) },800) }else{ error(res.desc) } }) } return ( <div> <Row className="list_crumbs"> <NavDom breads={[{'title':'资讯管理', 'url':'/app/article'},{'title':'资讯编辑', 'url':''}]}/> </Row> <Row className="list_content"> <Col span={24}> <Form style={{marginLeft:'-12px'}} labelCol={{ span: 2 }} wrapperCol={{ span: 18 }} layout="horizontal" autoComplete="off" onFinish={onAddFinish} initialValues={{ title:stateparams.title, category:category, author:stateparams.author, tags:stateparams.tagsSelected, description:stateparams.description, source_url:stateparams.source_url?stateparams.source_url:'' }} > <Form.Item name='title' label="标题" rules={[{required:true,message:'标题必填'}]} > <Input placeholder="标题" /> </Form.Item> <Form.Item label="分类"> <Form.Item name='category' className='article_add_select_category' rules={[{required:true,message:'分类必选'}]} > <Cascader options={options} placeholder="分类" allowClear /> </Form.Item> <Form.Item name='author' label="作者" className='article_add_input_author' > <Input placeholder="作者" /> </Form.Item> </Form.Item> <Form.Item label="类型" rules={[{required:true}]} > <Radio.Group name='type' onChange={onChangeType} value={type}> <Radio value={1}>原创</Radio> <Radio value={0}>转载</Radio> </Radio.Group> </Form.Item> <Form.Item label="标签"> <Form.Item name='tags' className='article_add_select_tags' rules={[{required:true,message:'标签必选'}]} > <Select mode="multiple" allowClear placeholder="标签" onChange={onChangeTags} > {children} </Select> </Form.Item> <Form.Item name='tags_2' className='article_add_input_tags' > <Input placeholder="自定义标签,使用逗号分割" /> </Form.Item> </Form.Item> <div style={{display:visible_type}}> <Form.Item label="正文" > <UEditor content={editorContent} onChange={onEditorChange} width="600px" height="700px" /> </Form.Item> </div> <div style={{display:visible_type_2}}> <Form.Item name='source_url' label="原文链接" > <Input placeholder="原文链接" /> </Form.Item> </div> <Form.Item label="上传封面图" > <Form.Item name='cover_image' className='article_add_upload_cover' > <ImgCrop rotate> <Upload accept="image/*" action={url['doUploadImg']} data={{token : storage.get('token')}} listType="picture-card" fileList={fileList} onChange={onFileChange} onPreview={onPreview} > {fileList.length < 1 && '封面图'} </Upload> </ImgCrop> </Form.Item> <Form.Item name='description' label="摘要" className='article_add_input_description' rules={[{required:true,message:'摘要必填'}]} > <TextArea rows={4} placeholder="摘要" style={{height:104}} /> </Form.Item> <Space>提示:建议尺寸640*360像素或比例16:9,格式:jpg、png,小于5M的图片</Space> </Form.Item> <Form.Item label="附件"> <Upload {...props}> <Button icon={<UploadOutlined />}>上传附件</Button> </Upload> <Space>提示:建议格式为word、excel、ppt、pdf,小于10M以内</Space> </Form.Item> <Form.Item className='submitBtn' style={{margin:'20px 0 0 120px '}} > <Button key="submit" type="primary" htmlType="submit" onClick={onSubmit} > 提交 </Button> <Button > 预览 </Button> <Button htmlType="submit" onClick={onSubmitTest}> 保存草稿 </Button> </Form.Item> </Form> </Col> </Row> </div> ) } export default ArticleEdit
本文为看恩吧原创文章,转载无需和我联系,但请注明来自knsay.com