后台管理系统经常用到表单查询,因此做了个封装

myorder.js

import React from 'react';
import { Card, Button, Table, Form, Select, Modal, DatePicker, message} from 'antd'
import axios from './axios'
import Utils from './utils'
import BaseForm from './BaseForm'
const FormItem = Form.Item;
const Option = Select.Option;
export default class MyOrder extends React.Component{
state = {
orderInfo:{},
orderConfirmVisble:false
}
params = {
page: 1
}
formList = [
{
type:'SELECT',
label:'城市',
field:'city',
placeholder:'全部',
initialValue:'1',
width:80,
list: [{ id: '0', name: '全部' }, { id: '1', name: '北京' }, { id: '2', name: '天津' }, { id: '3', name: '上海' }]
},
{
type: '时间查询'
},
{
type: 'SELECT',
label: '订单状态',
field:'order_status',
placeholder: '全部',
initialValue: '1',
width: 80,
list: [{ id: '0', name: '全部' }, { id: '1', name: '进行中' }, { id: '2', name: '结束行程' }]
}
]
componentDidMount(){
this.requestList()
} handleFilter = (params)=>{
this.params = params;
this.requestList();
}
requestList = ()=>{
let _this = this;
axios.ajax({
url:'/order/list',
data:{
params: this.params
}
}).then((res)=>{
let list = res.result.item_list.map((item, index) => {
item.key = index;
return item;
});
this.setState({
list,
pagination: Utils.pagination(res, (current) => {
_this.params.page = current;
_this.requestList();
})
},function(){
console.log(this.state.pagination)
})
})
}
// 订单结束确认
handleConfirm = ()=>{
let item = this.state.selectedItem;
if (!item) {
Modal.info({
title: '信息',
content: '请选择一条订单进行结束'
})
return;
}
axios.ajax({
url:'/order/ebike_info',
data:{
params:{
orderId: item.id
}
}
}).then((res)=>{
if(res.code ==0 ){
this.setState({
orderInfo:res.result,
orderConfirmVisble: true
})
}
})
} // 结束订单
handleFinishOrder = ()=>{
let item = this.state.selectedItem;
axios.ajax({
url: '/order/finish_order',
data: {
params: {
orderId: item.id
}
}
}).then((res) => {
if (res.code == 0) {
message.success('订单结束成功')
this.setState({
orderConfirmVisble: false
})
this.requestList();
}
})
}
onRowClick = (record, index) => { let selectKey = [index];
this.setState({
selectedRowKeys: selectKey,
selectedItem: record
})
} openOrderDetail = ()=>{
let item = this.state.selectedItem;
if (!item) {
Modal.info({
title: '信息',
content: '请先选择一条订单'
})
return;
}
window.open(`/#/common/order/detail/${item.id}`,'_blank')
}
render(){
const columns = [
{
title:'订单编号',
dataIndex:'order_sn'
},
{
title: '车辆编号',
dataIndex: 'bike_sn'
},
{
title: '用户名',
dataIndex: 'user_name'
},
{
title: '手机号',
dataIndex: 'mobile'
},
{
title: '里程',
dataIndex: 'distance',
render(distance){
return distance/1000 + 'Km';
}
},
{
title: '行驶时长',
dataIndex: 'total_time'
},
{
title: '状态',
dataIndex: 'status'
},
{
title: '开始时间',
dataIndex: 'start_time'
},
{
title: '结束时间',
dataIndex: 'end_time'
},
{
title: '订单金额',
dataIndex: 'total_fee'
},
{
title: '实付金额',
dataIndex: 'user_pay'
}
]
const formItemLayout = {
labelCol:{span:5},
wrapperCol:{span:19}
}
const selectedRowKeys = this.state.selectedRowKeys;
const rowSelection = {
type: 'radio',
selectedRowKeys
}
return (
<div>
<Card>
<BaseForm formList={this.formList} filterSubmit={this.handleFilter}/>
</Card>
<Card style={{marginTop:10}}>
<Button type="primary" onClick={this.openOrderDetail}>订单详情</Button>
<Button type="primary" style={{marginLeft:10}} onClick={this.handleConfirm}>结束订单</Button>
</Card>
<div className="content-wrap">
<Table
bordered
columns={columns}
dataSource={this.state.list}
pagination={this.state.pagination}
rowSelection={rowSelection}
onRow={(record, index) => {
return {
onClick: () => {
this.onRowClick(record, index);
}
};
}}
/>
</div>
<Modal
title="结束订单"
visible={this.state.orderConfirmVisble}
onCancel={()=>{
this.setState({
orderConfirmVisble:false
})
}}
onOk={this.handleFinishOrder}
width={600}
>
<Form layout="horizontal">
<FormItem label="车辆编号" {...formItemLayout}>
{this.state.orderInfo.bike_sn}
</FormItem>
<FormItem label="剩余电量" {...formItemLayout}>
{this.state.orderInfo.battery + '%'}
</FormItem>
<FormItem label="行程开始时间" {...formItemLayout}>
{this.state.orderInfo.start_time}
</FormItem>
<FormItem label="当前位置" {...formItemLayout}>
{this.state.orderInfo.location}
</FormItem>
</Form>
</Modal>
</div>
);
}
}

utils.js

import React from 'react';
import { Select } from 'antd'
const Option = Select.Option;
export default {
pagination(data,callback){
console.log("data",data);
return {
onChange:(current)=>{
callback(current)
},
current:data.result.page,
pageSize:data.result.page_size,
total: data.result.total_count,
showTotal:()=>{
return `共${data.result.total_count}条`
},
showQuickJumper:true
}
},
getOptionList(data){
if(!data){
return [];
}
let options = [] //[<Option value="0" key="all_key">全部</Option>];
data.map((item)=>{
options.push(<Option value={item.id} key={item.id}>{item.name}</Option>)
})
return options;
}
}

axios.js

import JsonP from 'jsonp'
import axios from 'axios'
import { Modal } from 'antd'
export default class Axios { static ajax(options){
let loading;
if (options.data && options.data.isShowLoading !== false){
loading = document.getElementById('ajaxLoading');
loading.style.display = 'block';
}
let baseApi = 'https://www.easy-mock.com/mock/5a7278e28d0c633b9c4adbd7/api';
return new Promise((resolve,reject)=>{
axios({
url:options.url,
method:'get',
baseURL:baseApi,
timeout:5000,
params: (options.data && options.data.params) || ''
}).then((response)=>{
if (options.data && options.data.isShowLoading !== false) {
loading = document.getElementById('ajaxLoading');
loading.style.display = 'none';
}
if (response.status == '200'){
let res = response.data;
if (res.code == '0'){
resolve(res);
}else{
Modal.info({
title:"提示",
content:res.msg
})
}
}else{
reject(response.data);
}
})
});
}
}

BaseForm.js

import React from 'react'
import { Input, Select, Form, Button, Checkbox, Radio, DatePicker} from 'antd'
import Utils from './utils';
const FormItem = Form.Item;
const Option = Select.Option; class FilterForm extends React.Component{ handleFilterSubmit = ()=>{
let fieldsValue = this.props.form.getFieldsValue();
this.props.filterSubmit(fieldsValue);
} reset = ()=>{
this.props.form.resetFields();
} initFormList = ()=>{
const { getFieldDecorator } = this.props.form;
const formList = this.props.formList;
const formItemList = [];
if (formList && formList.length>0){
formList.forEach((item,i)=>{
let label = item.label;
let field = item.field;
let initialValue = item.initialValue || '';
let placeholder = item.placeholder;
let width = item.width;
if (item.type == '时间查询'){
const begin_time = <FormItem label="订单时间" key={field}>
{
getFieldDecorator('begin_time')(
<DatePicker showTime={true} placeholder={placeholder} format="YYYY-MM-DD HH:mm:ss"/>
)
}
</FormItem>;
formItemList.push(begin_time)
const end_time = <FormItem label="~" colon={false} key={field}>
{
getFieldDecorator('end_time')(
<DatePicker showTime={true} placeholder={placeholder} format="YYYY-MM-DD HH:mm:ss" />
)
}
</FormItem>;
formItemList.push(end_time)
}else if(item.type == 'INPUT'){
const INPUT = <FormItem label={label} key={field}>
{
getFieldDecorator([field],{
initialValue: initialValue
})(
<Input type="text" placeholder={placeholder} />
)
}
</FormItem>;
formItemList.push(INPUT)
} else if (item.type == 'SELECT') {
const SELECT = <FormItem label={label} key={field}>
{
getFieldDecorator([field], {
initialValue: initialValue
})(
<Select
style={{ width: width }}
placeholder={placeholder}
>
{Utils.getOptionList(item.list)}
</Select>
)
}
</FormItem>;
formItemList.push(SELECT)
} else if (item.type == 'CHECKBOX') {
const CHECKBOX = <FormItem label={label} key={field}>
{
getFieldDecorator([field], {
valuePropName: 'checked',
initialValue: initialValue //true | false
})(
<Checkbox>
{label}
</Checkbox>
)
}
</FormItem>;
formItemList.push(CHECKBOX)
}
})
}
return formItemList;
}
render(){
return (
<Form layout="inline">
{ this.initFormList() }
<FormItem>
<Button type="primary" style={{ margin: '0 20px' }} onClick={this.handleFilterSubmit}>查询</Button>
<Button onClick={this.reset}>重置</Button>
</FormItem>
</Form>
);
}
}
export default Form.create({})(FilterForm);

效果

getFieldDecorator用法(二)——封装表单模块的更多相关文章

  1. 框架学习之Struts2(二)---基本配置和封装表单数据

    一.结果页面配置 1.局部结果页面配置 <!-- 局部结果页面配置--> <package name = "demo" extends = "strut ...

  2. 利用BeanUtils工具类封装表单数据

    一.BeanUtils工具类的使用 1.首先导入BeanUtils工具类的jar包 commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar 2.se ...

  3. httpclient模拟post请求json封装表单数据

    好长时间不更博了,主要肚子里没什么好墨水,哈哈.废话不说上代码. public static String httpPostWithJSON(String url) throws Exception ...

  4. JavaWeb - 模仿SpringMVC抽取 BaseServlet + 封装表单参数

    模仿SpringMVC抽取一个BaseServlet,接收所有请求,然后自动封装表单参数和分发到对应的servlet执行,下面用一个页面表单提交,转发显示的项目做示例. 1)首先准备一个Entity, ...

  5. ng2 学习笔记(二)表单及表单验证

    在上一篇文章中提到了表单,只说了表单的数据绑定,这一篇文章主要讲一下表单验证,为什么把表单单独拿出来学习,主要是因为,表单是商业应用的支柱,我们用它来执行登录.求助.下单.预订机票.安排会议,以及不计 ...

  6. php开发面试题---2、php常用面试题二(表单提交方式中的get和post有什么区别)

    php开发面试题---2.php常用面试题二(表单提交方式中的get和post有什么区别) 一.总结 一句话总结: 数据位置:get参数在url里面,post在主体里面 数据大小:get几kb,pos ...

  7. Struts2学习(二)———— 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  8. HTML基础(二)——表单,图片热点,网页划区和拼接

    一.表单 <form id="" name="" method="post/get" action="负责处理的服务端&qu ...

  9. .Net Core使用视图组件(ViewComponent)封装表单文本框控件

    实例程序的界面效果如下图所示: 在表单中的搜索条件有姓名,学号,成绩.他们在一行中按照水平三等分排列. 在cshtml中用html实现上述表单效果的的代码如下: <form class=&quo ...

随机推荐

  1. 通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?

    原文:通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了? 问题就是,一个很简单的语句,在不同的服务器上执行,所需要的时间相差很大,特别提到在性能差的服务器上反而快,在性能 ...

  2. 【web】使用ionic搭建移动端项目 icon-radio 标签在ios下全部选中的问题

    这块css 导致的问题 .disable-pointer-events { pointer-events: none; }

  3. Vue路由参数

    vue路由参数 1.参数router-link vue.prototype.xxx = {add:fn}`所有组件中,使用this.xxx就能拿到这个对象2.查询字符串 (1)配置: :to=&quo ...

  4. FlowPortal BPM流程中调用封装好的API如何调试

    遇到复杂一点的业务,我们常常都会将业务逻辑封装到一个dll中,在流程中调用封装好的API. 业务逻辑库封装到企业库后,是可以在Visual Studio中调试库的哦. [附加到进程] [流程中调用AP ...

  5. 【数字图像处理】目标检测的图像特征提取之HOG特征

    1.HOG特征 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯 ...

  6. 对WAF的一些认知

    WAF分为非嵌入型与嵌入型, 非嵌入型指的是硬WAF.云WAF.虚拟机WAF之类的:嵌入型指的是web容器模块类型WAF.代码层WAF.非嵌入型对WEB流量的解析完全是靠自身的,而嵌入型的WAF拿到的 ...

  7. linux cenos开放端口

    问题:8080端口不能访问 解决方案: 第1步 查看阿里云端口是否开放 网络安全>安全组>配置规则>添加入方向 第二步 查看防火墙是否开启(只说开启了防火墙的情况) 查看防火墙状态: ...

  8. c#创建目录和文件夹,数据写入并生成txt文件

    c#创建目录: // 获取程序的基目录.System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径.System.Diagnostics.Pro ...

  9. Grassfire算法- 运动规划(Motion planning)

     Grassfire算法: 一.概念 这个算法是做图像处理的抽骨架处理,目的是求出图像的骨架,可以想象一片与物体形状相同的草,沿其外围各点同时点火.当火势向内蔓延,向前推进的火线相遇处各点的轨迹就是中 ...

  10. httpd源码编译安装

    什么是编译安装——编译:将源代码变为机器可执行的代码文件.安装:将可执行文件安装到操作系统里,才可以使用. 一.下载httpd源码包 在官网上下载httpd源码包http://httpd.apache ...