热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【共享单车】——React后台管理系统开发手记:城市管理和订单管理

前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录。最终成果github地址:https:github.com66Webreact-antd-manager,欢迎star。

前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录。最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star。


一、城市管理

  • pages->city->index.js:对应路由/admin/city
  • 顶部子组件一:选择表单
    class FilterForm extends React.Component{
    
        render(){
            const { getFieldDecorator } = this.props.form;
            return (
                
                    
                        {
                            getFieldDecorator('city_id')(
                                
                            )
                        }
                    
                    
                        {
                            getFieldDecorator('mode')(
                                
                            )
                        }
                    
                    
                        {
                            getFieldDecorator('op_mode')(
                                
                            )
                        }
                    
                    
                        {
                            getFieldDecorator('auth_status')(
                                
                            )
                        }
                    
                    
                        
                        
                    
                
            );
        }
    }
    FilterForm = Form.create({})(FilterForm);
  • 弹框子组件二:开通城市表单

    class OpenCityForm extends React.Component{
        render(){
            const formItemLayout = {
                labelCol:{   //label标签占据列数
                    span:5
                },
                wrapperCol:{ //Form表单占据列数
                    span:19
                }
            }
            const { getFieldDecorator }  =this.props.form;
            return (
                
                    
                        {
                            getFieldDecorator('city_id',{
                                initialValue:'1'
                            })(
                                
                            )
                        }
                    
                    
                        {
                            getFieldDecorator('op_mode', {
                                initialValue: '1'
                            })(
                                
                            )
                        }
                    
                    
                        {
                            getFieldDecorator('use_mode', {
                                initialValue: '1'
                            })(
                                
                            )
                        }
                    
                
            );
        }
    }
    OpenCityForm = Form.create({})(OpenCityForm);
  • Easy Mock城市管理的数据接口:/open_city

    {
      "code": 0,
      "msg": "",
      "list": {
        "item_list|10": [{
          "id|+1": 1,
          "name": "@city",
          "mode|1-2": 1,
          "op_mode|1-2": 1,
          "franchisee_id": 77,
          "franchisee_name": "松果自营",
          "city_admins|1-2": [{
            "user_name": "@cname",
            "user_id|+1": 10001
          }],
          "open_time": "@datetime",
          "sys_user_name": "@cname",
          "update_time": 1546580667000
        }]
      },
      page: 1,
      page_size: 10,
      total: 20
    }
  1. componentDidMount()中:调用this.requestList(),默认请求接口数据
    componentDidMount(){
            this.requestList();
        }
    
    // 默认请求我们的接口数据
    requestList = ()=>{
            let _this = this;
            axios.ajax({
                url: '/open_city',
                data:{
                    params:{
                        page:this.params.page
                    }
                }
            }).then((res)=>{
                let list = res.list.item_list.map((item, index) => {
                    item.key = index;
                    return item;
                });
                this.setState({
                    list:list,
                    pagination:Utils.pagination(res,(current)=>{
                        _this.params.page = current;
                        _this.requestList();
                    })
                })
            })
    }  
  • Easy Mock城市开通的数据接口:/city/open

    {
      "code": 0,
      "list": "开通成功"
    }
    
  1. 【开通城市】按钮:监听onClick事件,调用this.handleOpenCity()显示弹框

    state = {
        list:[],
        isShowOpenCity:false //默认隐藏弹框
    }
    
    // 开通城市
    handleOpenCity = ()=>{
        this.setState({
                isShowOpenCity:true
        })
    }
  2. Modal关键属性visible控制弹框的显示隐藏,关键事件onOk调用this.handleSubmit()提交表单信息

     {
               this.setState({
                    isShowOpenCity:false
               })
           }}
           OnOk={this.handleSubmit}
    >
           {this.cityForm = inst;}}/>
    

    wrappedComponentRef属性:拿到表单中的信息对象inst,通过this.cityForm存到state中

  3. 城市开通信息提交

    // 城市开通提交
    handleSubmit = ()=>{
            let cityInfo = this.cityForm.props.form.getFieldsValue();
            console.log(cityInfo);
            axios.ajax({
                url:'/city/open',
                data:{
                    params:cityInfo
                }
            }).then((res)=>{
                if(res.code === 0){
                    message.success('开通成功');
                    this.setState({
                        isShowOpenCity:false
                    })
                    this.requestList();
                }
            })
    }
    
  • 实例代码
    import React from 'react';
    import { Card, Button, Table, Form, Select, Modal, message } from 'antd';
    import axios from './../../axios/index';
    import Utils from './../../utils/utils';
    const FormItem = Form.Item;
    const Option = Select.Option;
    
    export default class City extends React.Component{
    
        state = {
            list:[],
            isShowOpenCity:false //默认隐藏弹框
        }
        params = {
            page:1
        }
        componentDidMount(){
            this.requestList();
        }
    
        // 默认请求我们的接口数据
        requestList = ()=>{
            let _this = this;
            axios.ajax({
                url: '/open_city',
                data:{
                    params:{
                        page:this.params.page
                    }
                }
            }).then((res)=>{
                let list = res.list.item_list.map((item, index) => {
                    item.key = index;
                    return item;
                });
                this.setState({
                    list:list,
                    pagination:Utils.pagination(res,(current)=>{
                        _this.params.page = current;
                        _this.requestList();
                    })
                })
            })
        }
    
        // 开通城市
        handleOpenCity = ()=>{
            this.setState({
                isShowOpenCity:true
            })
        }
        // 城市开通提交
        handleSubmit = ()=>{
            let cityInfo = this.cityForm.props.form.getFieldsValue();
            console.log(cityInfo);
            axios.ajax({
                url:'/city/open',
                data:{
                    params:cityInfo
                }
            }).then((res)=>{
                if(res.code === 0){
                    message.success('开通成功');
                    this.setState({
                        isShowOpenCity:false
                    })
                    this.requestList();
                }
            })
        }
        render(){
            const columns = [
                {
                    title:'城市ID',
                    dataIndex:'id'
                }, {
                    title: '城市名称',
                    dataIndex: 'name'
                }, {
                    title: '用车模式',
                    dataIndex: 'mode',
                    render(mode){
                        return mode === 1 ?'停车点':'禁停区';
                    }
                }, {
                    title: '营运模式',
                    dataIndex: 'op_mode',
                    render(op_mode) {
                        return op_mode === 1 ? '自营' : '加盟';
                    }
                }, {
                    title: '授权加盟商',
                    dataIndex: 'franchisee_name'
                }, {
                    title: '城市管理员',
                    dataIndex: 'city_admins',
                    render(arr){  //处理数组类型
                        return arr.map((item)=>{
                            return item.user_name;
                        }).join(',');
                    }
                }, {
                    title: '城市开通时间',
                    dataIndex: 'open_time'
                }, {
                    title: '操作时间',
                    dataIndex: 'update_time',
                    render: Utils.formateDate //格式化时间戳
                }, {
                    title: '操作人',
                    dataIndex: 'sys_user_name'
                }
            ]
            return (
                
    { this.setState({ isShowOpenCity:false }) }} OnOk={this.handleSubmit} > {this.cityForm = inst;}}/> ); } } //子组件一:选择表单 class FilterForm extends React.Component{ render(){ const { getFieldDecorator } = this.props.form; return ( { getFieldDecorator('city_id')( ) } { getFieldDecorator('mode')( ) } { getFieldDecorator('op_mode')( ) } { getFieldDecorator('auth_status')( ) } ); } } FilterForm = Form.create({})(FilterForm); //子组件二:开通城市 class OpenCityForm extends React.Component{ render(){ const formItemLayout = { labelCol:{ //label标签占据列数 span:5 }, wrapperCol:{ //Form表单占据列数 span:19 } } const { getFieldDecorator } =this.props.form; return ( { getFieldDecorator('city_id',{ initialValue:'1' })( ) } { getFieldDecorator('op_mode', { initialValue: '1' })( ) } { getFieldDecorator('use_mode', { initialValue: '1' })( ) } ); } } OpenCityForm = Form.create({})(OpenCityForm);

      

    二、订单管理

    •  顶部子组件:选择表单
      class FilterForm extends React.Component{
      
          render(){
              const { getFieldDecorator } = this.props.form;
              return (
                  
                      
                          {
                              getFieldDecorator('city_id')(
                                  
                              )
                          }
                      
                      
                          {
                              getFieldDecorator('start_time')(
                                 
                              )
                          }
                      
                      
                          {
                              getFieldDecorator('end_time')(
                                 
                              )
                          }
                      
                      
                          {
                              getFieldDecorator('status')(
                                  
                              )
                          }
                      
                      
                          
                          
                      
                  
              );
          }
      }
      FilterForm = Form.create({})(FilterForm);
    • Easy Mock订单数据接口:/order/list
      {
        "code": 0,
        "msg": "",
        "list": {
          "item_list|10": [{
            "id": 2959165,
            "order_sn": /T180[0-9]{6}/,
            "bike_sn": "800116090",
            "user_id": 908352,
            "user_name": "@cname",
            "mobile": /1[0-9]{10}/,
            "distance": 2000,
            "total_time": 4000,
            "status|1-2": 1,
            "start_time": "@datetime",
            "end_time": "@datetime",
            "total_fee": 1000,
            "user_pay": 300
          }]
        },
        "page|1-9": 1,
        page_size: 10,
        total: 85,
        page_count: 9
      }
      

      同城市管理:调用this.requestList(),默认请求接口数据  

    • Easy Mock结束订单信息数据接口:/order/ebike_info
      {
        "code": 0,
        "list": {
          "id": 27296,
          "bike_sn": "800116116",
          "battery": 100,
          "start_time": "@datetime",
          "location": "西虹市海淀区桃花公园"
        }
      }
    • Easy Mock结束订单成功数据接口:/order/finish_order

      {
        "code": 0,
        "list": "ok"
      }
    1. 【结束订单】按钮:监听onClick事件,调用this.handleConfirm()显示确认结束弹框

      //订单结束确认
      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.list,
                          orderConfirmVisible: true
                      })
                  }
             })
      }
    2. 确认取消:打开Modal弹框,显示要取消的订单信息

        {
                   this.setState({
                         orderConfirmVisible: false
                   })
              }}
              OnOk={this.handleFinishOrder}
              width={600}>
                    
                          
                                  {this.state.orderInfo.bike_sn}
                          
                          
                                  {this.state.orderInfo.battery + '%'}
                          
                          
                                  {this.state.orderInfo.start_time}
                          
                          
                                  {this.state.orderInfo.location}
                                         
                   
       
    3. 结束订单:onOk事件调用this.handleFinishOrder()

      //结束订单
      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({
                          orderConfirmVisible: false
                      })
                      this.requestList();
                  }
              })
      }
      
    • 实例代码:

      import React from 'react'
      import { Card, Button, Table, Form, Select, Modal, message, DatePicker } from 'antd';
      import axios from './../../axios/index';
      import Utils from './../../utils/utils';
      const FormItem = Form.Item;
      const Option = Select.Option;
      
      export default class Order extends React.Component{
      
          state = {
              orderInfo: {},
              orderConfirmVisible: false
          }
          params = {
              page:1
          }
          
          componentDidMount(){
              this.requestList();
          }
      
          requestList = () => {
              let _this = this;
              axios.ajax({
                  url: '/order/list',
                  data: {
                      params: {
                          page: this.params.page
                      }
                  }
              }).then((res) => {
                  if(res.code === 0){
                      let list = res.list.item_list.map((item, index) => {
                          item.key = index;
                          return item;
                      });
                      this.setState({
                          list:list,
                          selectedRowKeys: [],//重置
                          pagination:Utils.pagination(res,(current)=>{
                              _this.params.page = current;
                              _this.requestList();
                          })
                      })
                  }
              })
          }
      
          //订单结束确认
          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.list,
                          orderConfirmVisible: 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({
                          orderConfirmVisible: 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 (
                  
    { return { onClick: () => { this.onRowClick(record, index); } } }} /> { this.setState({ orderConfirmVisible: false }) }} OnOk={this.handleFinishOrder} width={600}> {this.state.orderInfo.bike_sn} {this.state.orderInfo.battery + '%'} {this.state.orderInfo.start_time} {this.state.orderInfo.location} ) } } //子组件一:选择表单 class FilterForm extends React.Component{ render(){ const { getFieldDecorator } = this.props.form; return ( { getFieldDecorator('city_id')( ) } { getFieldDecorator('start_time')( ) } { getFieldDecorator('end_time')( ) } { getFieldDecorator('status')( ) } ); } } FilterForm = Form.create({})(FilterForm);

      

    三、订单详情

    • 跳转详情页
    1. pages->order->index.js中:【订单详情】按钮监听onClick事件,调用this.openOrderDetail(),跳转路由
       //订单详情页
      openOrderDetail = () => {
              let item = this.state.selectedItem;
              if(!item){
                  Modal.info({
                      title: '信息',
                      content: '请先选择一条订单'
                  })
                  return;
              }
              window.open(`/#/common/order/detail/${item.id}`,'_blank')
      }
      

      关键:window.open(`/#/common/order/detail/${item.id}`,'_blank')

    2. src目录下:新建common.js,类似admin.js编写项目公共结构代码,负责路由详情页展示

      import React from 'react'
      import { Row, Col } from 'antd';
      import Header from './components/Header'
      import './style/common.less'
      
      export default class Common extends React.Component {
      
          render() {
              return (
                  
      {this.props.children}
      ); } }

      通过menuType:控制显示header组件的不同样式(components->header->index.js

      //其它代码
      render() {
              const menuType = this.props.menuType;
              return (
                  
      { menuType ?
    LJQ 通用管理系统 : '' } 欢迎,{this.state.userName}退出 { menuType ? '' : 首页 {this.state.sysTime}晴转多云 } ) }

    CSS样式:

    //style->common.less
    ul,li{
        list-style: none;
    }
    .clearfix{
        &::after{
            content:'';
            clear: both;
            display: block;
            visibility: hidden;
        }
    }
    .content{
        padding: 20px
    }
    
    //components->header->index.less
    //.common 页面简单头
    .simple-page{
        .header-top{
            background: #1890ff;
            color: @colorM;
        }
        .ant-form, .ant-col-12, .weather{
            display: none;
        }
    }
    
    //引入pages->order->detail.less
  • router.js中:引入Common组件,使用的render方法定义嵌套路由

     
           
                 
            
    }/> 
    
    • 获取订单详情基础信息

    1. Easy Mock订单详情数据接口:/order/detail 

      {
        "code": 0,
        "msg": "",
        "list": {
          "status": 2,
          "order_sn": "T1803244422704080JGJI",
          "bike_sn": '802410001',
          "mode|1-2": 1,
          "start_location": "北京市昌平区回龙观东大街",
          "end_location": "北京市海淀区奥林匹克公园",
          "city_id": 1,
          "mobile": "13597482075",
          "user_name": "@cname",
          "distance": 10000,
          "bike_gps": "116.398806,40.008637",
          "start_time": 1546580667000,
          "end_time": 1546608995000,
          "total_time": 224,
          "position_list": [{
              "lon": 116.361221,
              "lat": 40.043776
            },
            {
              "lon": 116.363736,
              "lat": 40.038086
            },
            {
              "lon": 116.364599,
              "lat": 40.036484
            },
            {
              "lon": 116.373438,
              "lat": 40.03538
            },
            {
              "lon": 116.377966,
              "lat": 40.036263
            },
            {
              "lon": 116.379762,
              "lat": 40.03654
            },
            {
              "lon": 116.38084,
              "lat": 40.033225
            },
            {
              "lon": 116.38084,
              "lat": 40.029413
            },
            {
              "lon": 116.381343,
              "lat": 40.021291
            },
            {
              "lon": 116.381846,
              "lat": 40.015821
            },
            {
              "lon": 116.382637,
              "lat": 40.008084
            },
            {
              "lon": 116.398806,
              "lat": 40.008637
            }
          ],
          "area": [{
              "lon": "116.274737",
              "lat": "40.139759",
              "ts": null
            },
            {
              "lon": "116.316562",
              "lat": "40.144943",
              "ts": null
            },
            {
              "lon": "116.351631",
              "lat": "40.129498",
              "ts": null
            },
            {
              "lon": "116.390582",
              "lat": "40.082481",
              "ts": null
            },
            {
              "lon": "116.38742",
              "lat": "40.01065",
              "ts": null
            },
            {
              "lon": "116.414297",
              "lat": "40.01181",
              "ts": null
            },
            {
              "lon": "116.696242",
              "lat": "39.964035",
              "ts": null
            },
            {
              "lon": "116.494498",
              "lat": "39.851306",
              "ts": null
            },
            {
              "lon": "116.238086",
              "lat": "39.848647",
              "ts": null
            },
            {
              "lon": "116.189454",
              "lat": "39.999418",
              "ts": null
            },
            {
              "lon": "116.244646",
              "lat": "39.990574",
              "ts": null
            },
            {
              "lon": "116.281441",
              "lat": "40.008703",
              "ts": null
            },
            {
              "lon": "116.271092",
              "lat": "40.142201",
              "ts": null
            },
            {
              "lon": "116.271092",
              "lat": "40.142201",
              "ts": null
            }
          ],
          "area_list": null,
          "npl_list": [{
            "id": 8265,
            "name": "北辰世纪中心-a座",
            "city_id": 1,
            "type": 3,
            "status": 0,
            "map_point": "116.39338796444|40.008120315215;116.39494038009002|40.008177258745;116.39496911688|40.006268094213;116.39512457763|40.004256795877;116.39360214742|40.004222412241;116.39357190147|40.005075745782;116.39351397873|40.005836165232;116.39338796444|40.008120315215",
            "map_point_array": [
              "116.39338796444|40.008120315215",
              "116.396053|40.008273",
              "116.396448|40.006338",
              "116.396915|40.004266",
              "116.39192|40.004072",
              "116.391525|40.004984",
              "116.391381|40.005924",
              "116.391166|40.007913"
            ],
            "map_status": 1,
            "creator_name": "赵程程",
            "create_time": 1507863539000
          }]
        }
      }
    2. componentDidMount()中获取url参数orderId:调用this.getDetailInfo(orderId)获取订单详情数据

      componentDidMount(){
              let orderId = this.props.match.params.orderId;
              if(orderId){
                 this.getDetailInfo(orderId);
              }
      }
      
      getDetailInfo = (orderId) => {
              axios.ajax({
                  url: '/order/detail',
                  data: {
                      params: {
                          orderId: orderId
                      }
                  }
              }).then((res) => {
                  if(res.code === 0){
                      this.setState({
                          orderInfo: res.list
                      })
                      this.renderMap(res.list);
                  }
              })
      }
      

      关键:this.props.match.params.参数 详情:【React获取url参数—this.props.match】

    • 实例代码

      import React from 'react';
      import { Card } from 'antd';
      import axios from '../../axios';
      import './detail.less';
      
      export default class Order extends React.Component{
      
          state = {}
      
          componentDidMount(){
              let orderId = this.props.match.params.orderId;
              if(orderId){
                 this.getDetailInfo(orderId);
              }
          }
      
          getDetailInfo = (orderId) => {
              axios.ajax({
                  url: '/order/detail',
                  data: {
                      params: {
                          orderId: orderId
                      }
                  }
              }).then((res) => {
                  if(res.code === 0){
                      this.setState({
                          orderInfo: res.list
                      })
                      this.renderMap(res.list);
                  }
              })
          }
      
          //初始化地图
          renderMap = (list) => {
              this.map = new window.BMap.Map('orderDetailMap');
              // this.map.centerAndZoom('北京', 11)
              //添加地图控件
              this.addMapControl();
              //调用路线图绘制方法
              this.drawBikeRoute(list.position_list);
              //调用服务区绘制方法
              this.drawServiceArea(list.area);
          }
      
          //添加地图控件
          addMapCOntrol= () => {
              let map = this.map;
              map.addControl(new window.BMap.ScaleControl({ anchor: window.BMAP_ANCHOR_TOP_RIGHT }));
              map.addControl(new window.BMap.NavigationControl({ anchor: window.BMAP_ANCHOR_TOP_RIGHT }));
          }
      
          //绘制用户行驶路线图
          drawBikeRoute = (positionList) => {
              let map = this.map;
              let startPoint = '';
              let endPoint = '';
              if(positionList.length > 0){
                 //起点
                 let first = positionList[0]; 
                 startPoint = new window.BMap.Point(first.lon, first.lat);
                 let startIcon = new window.BMap.Icon('/assets/start_point.png', new window.BMap.Size(36,42),{
                     imageSize: new window.BMap.Size(36,42),
                     anchor: new window.BMap.Size(36,42)
                 })
      
                 let startMarker = new window.BMap.Marker(startPoint, {icon: startIcon});
                 this.map.addOverlay(startMarker);
      
                 //终点
                 let last = positionList[positionList.length-1]; 
                 endPoint = new window.BMap.Point(last.lon, last.lat);
                 let endIcon = new window.BMap.Icon('/assets/end_point.png', new window.BMap.Size(36,42),{
                     imageSize: new window.BMap.Size(36,42),
                     anchor: new window.BMap.Size(36,42)
                 })
                 let endMarker = new window.BMap.Marker(endPoint, {icon: endIcon});
                 this.map.addOverlay(endMarker);
                
                 //连接路线图
                 let trackPoint = [];
                 for(let i=0; i {
              let trackPoint = [];
              for(let i=0; i
                     
                         
      基础信息
      • 用车模式
        {info.mode === 1 ? '服务器' : '停车点'}
      • 订单编号
        {info.order_sn}
      • 车辆编号
        {info.bike_sn}
      • 用户姓名
        {info.user_name}
      • 手机号码
        {info.mobile}
      行驶轨迹
      • 行驶起点
        {info.start_location}
      • 行驶终点
        {info.end_location}
      • 行驶里程
        {info.distance/1000}Km
      ); } }  

    注:项目来自慕课网


    推荐阅读
    • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
    • android listview OnItemClickListener失效原因
      最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
    • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
    • OpenMap教程4 – 图层概述
      本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
    • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
      原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
    • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
      转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
    • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
    • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
      本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
    • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
      本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
    • 先看看ElementUI里关于el-table的template数据结构:<template><el-table:datatableData><e ... [详细]
    • Gitlab接入公司内部单点登录的安装和配置教程
      本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
    • Java图形化计算器设计与实现
      本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]
    • CSS3选择器的使用方法详解,提高Web开发效率和精准度
      本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
    • javascript  – 概述在Firefox上无法正常工作
      我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
    • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
    author-avatar
    梦三国
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有