React From 表單

import React, { PureComponent } from 'react';
import './styles.less';
import { connect } from 'react-redux'
import { Table, Divider, Tag, Button, message, Popconfirm } from 'antd';
import _ from 'loadsh'
import qs from 'qs'
import defaultImg from '@/static/error.png'
import { get } from '@/utils'
import request from '@/utils'
import ModalGo from './model'
// import { requestx } from '@/utils'
// import Loding from './loding'


export default @connect(state => ({
    table_Data: state.table_Data
}), {
    getTableData: items => ({
        type: 'TBALE_DATA',
        payload: items
    })
})
class extends PureComponent {
    constructor(props) {
        super(props)
        this.state = {
            data: [],
            visible: false,
            title: '', // 編輯 添加 標題
            btnName: '', // 按鈕 提示文字
            editData: [], // 點擊編輯的回顯 數據
        }
        this.datas()
    }

    // 圖片報錯  顯示 默認圖片
    errorImg = e => {
        e.target.setAttribute('src', defaultImg)
    }

    // 獲取全部數據
    datas = () => {
        const { getTableData } = this.props
        get('/api/banner/list')
            .then(res => {
                getTableData(res)
            })
    }

    // 刪除 確定
    confirm = items => {
        request('/api/banner/delete', qs.stringify({ id: items.id }))
            .then(res => {
                // if (res.data.code === 200) {
                message.success('刪除成功')
                // }
                this.datas()
            })
    }

    // 點擊編輯按鈕
    edit = items => {
        this.setState({
            visible: true,
            title: '編輯',
            btnName: '保存',
            editData: items
        })

    }

    // 點擊添加按鈕 顯示
    addData = () => {
        this.setState({
            visible: true,
            title: '添加',
            btnName: '點擊添加',
            editData: []
        })
    }

    // 接受回調函數 關閉model
    visStatus = v => {
        this.setState({
            visible: v
        })
    }

    // 點擊下載
    download = () => {
        const { table_Data } = this.props
        const blob = new Blob([JSON.stringify(table_Data)], { type: 'text/plain' }) //{type : 'application/json'}
        let a = document.createElement('a')
        let url = URL.createObjectURL(blob)
        a.href = url
        a.download = '表格數據'
        a.click()
        setTimeout(() => {
            //刪除創建的URL
            window.URL.revokeObjectURL(url)
        }, 0)

    }



    render() {
        // const { table_Data } = this.props
        const table_Data = _.get(this.props, 'table_Data', '暫無數據...')

        const { visible, title, btnName, editData } = this.state
        const columns = [
            {
                title: 'ID',
                dataIndex: 'id',
                key: 'id',
                width: '130px',
                ellipsis: true,
            },
            {
                title: '名稱',
                dataIndex: 'title',
                key: 'Title',
                ellipsis: true,
            },
            {
                title: '圖片',
                dataIndex: 'bannerUrl',
                key: 'bannerUrl',
                render: (tags, items) => (
                    <img src={items.bannerUrl} onError={this.errorImg} />
                ),
            }, {
                title: '描述',
                dataIndex: 'mark',
                key: 'mark',
                width: '150px',
                ellipsis: true,
            }, {
                title: '排序',
                dataIndex: 'sort',
                key: 'sort',
                width: '100px',
                ellipsis: true,
                sorter: (a, b) => a.sort - b.sort,
            },
            {
                title: '狀態',
                key: 'status',
                dataIndex: 'status',
                render: (tags, items) => (
                    <span>
                        {items.status == 0 ? <Tag color="red">禁用</Tag> : <Tag color="green">啓用</Tag>}
                    </span>
                ),
            },
            {
                title: '操作',
                key: 'action',
                width: '230px',
                render: (text, record) => (
                    <span>
                        <Button type="primary" onClick={() => this.edit(record)}>編輯</Button>
                        <Divider type="vertical" />
                        <Popconfirm title="確定刪除 ?" okText="Yes" cancelText="No" onConfirm={() => this.confirm(record)}>
                            <Button type="danger" >刪除</Button>
                        </Popconfirm>
                    </span>
                ),
            },
        ];
        return (
            <div className='homeRightTable'>
                {/* 添加 */}
                <Button type="primary" onClick={this.addData}>
                    添加
                </Button>

                <Button type="danger" onClick={() => this.download()} style={{ marginLeft: '20px' }}>
                    下載
                </Button>

                {/* 對話框 */}
                <ModalGo
                    visible={visible}  // 控制 開關
                    title={title}     //標題
                    visibleStatus={this.visStatus}    //關閉 model
                    btnName={btnName}  //btn 文字提示
                    editData={editData}
                />

                <Table columns={columns} dataSource={table_Data} rowKey={v => v.id} />
            </div>
        );
    }
}

// Model
import React from 'react';
import rquest from '@/utils'
import { connect } from 'react-redux'
import qs from 'qs'
import {
    Modal,
    Form,
    Input,
    Icon,
    Button,
    Upload,
    Radio,
    InputNumber,
    message,

} from 'antd';
import { get } from '../../utils';

// 對話框
export default @connect(state => ({

}), {
    getData: () => ({
        type: 'TBALE_DATA',
        payload: get('/api/banner/list')
    })
})
@Form.create({
    name: 'register',
    mapPropsToFields(props) {
        
        return Object.entries(props.editData).reduce((v0, [k, v]) => {
            v0[k] = Form.createFormField({
                value: v,
            })
            return v0
        }, {})
		// return {
       //     name: Form.createFormField({
       //         value: props.data.name,
        //    }),
       // }
    }

})
class extends React.Component {

    state = {
        visible: false,
        confirmDirty: false,
        autoCompleteResult: [],
        value: 1,
        bannerUrl: '',
        disalblex: false, // 點擊確定按鈕  loding
    };

    showModal = () => {
        this.setState({
            visible: true,
        });
    };

    // 關閉model
    handleCancel = () => {
        this.props.visibleStatus(false)
    };

    // 點擊 提交
    handleSubmit = e => {
        e.preventDefault();
        this.props.form.validateFieldsAndScroll((err, values) => {
            if (!err) {
                const { bannerUrl } = this.state
                const { getData, btnName, editData } = this.props
                if (btnName === '點擊添加') {
                    this.setState({
                        disalblex: true,
                    });

                    setTimeout(() => {
                        this.setState({
                            disalblex: false,
                        });
                    }, 2000);


                    rquest('/api/banner/add', qs.stringify({
                        ...values,
                        bannerUrl
                    }))
                        .then(res => {
                            console.log(res);

                            if (res) {
                                message.success('添加成功')
                                this.handleCancel()  //關閉
                                getData()  //獲取數據
                            }

                        })
                } else {
                    rquest('/api/banner/update', qs.stringify({
                        ...values,
                        bannerUrl,
                        id: editData.id
                    }))
                        .then(res => {
                            // if (res.data.code === 200) {
                            message.success('編輯成功')
                            this.handleCancel()  //關閉
                            getData()  //獲取數據
                            // }
                        })
                }


            }
        });
    };

    // 自定義 校驗
    validatorFun = (rule, value, callback) => {
    	// 	數字和字母組合
    	//  /^[0-9]+[a-zA-Z]+[0-9a-zA-Z]*|[a-zA-Z]+[0-9]+[0-9a-zA-Z]*$/ 
        const reg = /^(?![A-Za-z0-9]+$)[\u4e00-\u9fa5A-Za-z0-9]*$/
        if (value && !value.match(reg)) {
            callback('請輸入至少一個漢字');
        }
        callback()
    }
    // 圖片上傳
    normFile = e => {
        // console.log('Upload event:', e.file.response);
        if (e.file.response) {
            this.setState({
                bannerUrl: e.file.response.data.url
            })
        }
        return e && e.fileList;
    };


    // 狀態
    onChange = e => {
        this.setState({
            value: e.target.value,
        });
    };


    render() {
        
        const { visible, title, btnName } = this.props
        const { getFieldDecorator } = this.props.form;
        const { disalblex } = this.state

        const formItemLayout = {
            labelCol: {
                xs: { span: 9 },
                sm: { span: 6 },
            },
            wrapperCol: {
                xs: { span: 24 },
                sm: { span: 16 },
            },
        };
        const tailFormItemLayout = {
            wrapperCol: {
                xs: {
                    span: 24,
                    offset: 0,
                },
                sm: {
                    span: 14,
                    offset: 6,
                },
            },
        };




        return (
            <div>

                <Modal
                    title={title}
                    visible={visible}
                    footer={null}
                    onCancel={this.handleCancel}
                >
                    <Form {...formItemLayout} onSubmit={this.handleSubmit}>
                        <Form.Item label="標題">
                            {getFieldDecorator('title', {
                                rules: [
                                    {
                                        validator: this.validatorFun
                                    },
                                    {
                                        required: true,
                                        message: '請輸入標題 !',
                                    },
                                ],
                            })(<Input />)}
                        </Form.Item>

                        <Form.Item label="上傳圖片" extra="">
                            {getFieldDecorator('upload', {
                                valuePropName: 'fileList',
                                getValueFromEvent: this.normFile,
                            })(
                                <Upload name="file" action="http://49.235.147.95:3001/api/uploadFile" listType='picture'>
                                    <Button>
                                        <Icon type="upload" /> 上傳圖片
                                     </Button>
                                </Upload>,
                            )}
                        </Form.Item>

                        <Form.Item label="狀態" >
                            {getFieldDecorator('status', {

                            })(
                                <Radio.Group >
                                    <Radio value={1}>啓用</Radio>
                                    <Radio value={0}>禁用</Radio>
                                </Radio.Group>
                            )}
                        </Form.Item>

                        <Form.Item label="排序">
                            {getFieldDecorator('sort', { initialValue: 3 })(<InputNumber />)}
                        </Form.Item>

                        <Form.Item label="描述信息">
                            {getFieldDecorator('mark', {})(<Input.TextArea rows={4} />)}
                        </Form.Item>

                        <Form.Item {...tailFormItemLayout}>
                            <Button type="primary" htmlType="submit" disabled={disalblex}>
                                {btnName}
                            </Button>

                            <Button className='resetBtn' style={{ marginLeft: '30px' }}>
                                重置
                            </Button>
                        </Form.Item>
                    </Form>
                </Modal>
            </div>
        );
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章