管理系统列表和详情配置

简介: 通过配置json文件,直接生成列表和列表详情

  • 配置文件是json格式
  • 配置完成后可以生成预览
  • 需要后端支持按一定的格式返回数据

config.json


{
    "filterBar": {
        "isShow": true,
        "items": [{
            "type": 1,
            "label": "",
            "field": "farmerName",
            "placeholder": "农户姓名",
            "defaultValue": ""
        }, {
            "type": 1,
            "label": "",
            "field": "farmerPhone",
            "placeholder": "农户手机号",
            "defaultValue": ""
        }, {
            "type": 2,
            "label": "作物",
            "field": "crops",
            "placeholder": "请选择",
            "defaultValue": "-1",
            "selectOptions": [{
                "label": "全部",
                "value": "-1"
            }, {
                "label": "白菜",
                "value": "0"
            }, {
                "label": "黄瓜",
                "value": "1"
            }]
        }, {
            "type": 2,
            "label": "远程作物",
            "field": "remoteCrops",
            "url": "/management/tool/getAllCrops",
            "placeholder": "请选择",
            "defaultValue": "-1",
            "selectOptions": []
        }, {
            "type": 3,
            "label": "拜访时间",
            "field": "visitTime",
            "placeholder": "请选择时间",
            "defaultValue": "2017-01-01"
        }, {
            "type": 3,
            "label": "拜访时间",
            "field": "visitTime",
            "placeholder": "请选择时间",
            "defaultValue": ["2017-01-01", "2017-01-05"]
        }, {
            "type": 3,
            "label": "拜访时间",
            "field": "visitTime",
            "placeholder": "请选择时间",
            "defaultValue": ["2017-01-01", "now"]
        }],
        "typeConfig": {
            "输入框": 1,
            "下拉选择": 2,
            "时间选择": 3
        }
    },
    "table": {
        "url": "/management/visit/getVisitList",
        "queryParams": {
            "farmerName": "",
            "farmerPhone": "",
            "storeName": "",
            "belongUserPhone": ""
        },
        "columns": [{
            "title": "门店名称",
            "field": "storeName"
        }, {
            "title": "地址",
            "field": "detailAddress"
        }]
    },
    "detail": {
        "isShow": true,
        "tip": "提示信息",
        "url": "/management/visit/getVisitList",
        "queryParams": {
            "farmerName": "",
            "farmerPhone": "",
            "storeName": "",
            "belongUserPhone": ""
        },
        "columns": [{
            "type": 1,
            "label": "作物",
            "field": "cropsName"
        }, {
            "type": 2,
            "label": "门店照片",
            "field": "storeUrl"
        }],
        "operatioins": [{
            "btnText": "审核通过",
            "url": "/management/visit/getVisitList",
            "queryParams": {
                "farmerName": "",
                "farmerPhone": "",
                "storeName": "",
                "belongUserPhone": ""
            }
        }],
        "typeConfig": {
            "文本": 1,
            "图片": 2
        }
    }
}

list.vue


<template>
  <section class="p-list margin-15">
    <v-filterbar v-if="pageConfig.filterBar.isShow" :filter-bar-config="pageConfig.filterBar" class="filterbar-box"  v-sticky="{stickyTop: 50, zIndex: 100}" ref="filterBar" v-on:on-search="onSearch" v-on:on-replace="onReplace"></v-filterbar>

    <v-table ref="listTable" :url="pageConfig.table.url" :query-params="queryParams" :load-filter="loadFilter" :columns="pageConfig.table.columns" :autoRequest="false">

    </v-table>

  </section>
</template>

<script>
import vFilterbar from './filter-bar'
import vTable from 'pages/home/common/c-table'
export default {
  name: 'p-list',
  data() {
    const pageConfig = require('./config.json')
    console.log('pageConfig:', pageConfig)
    let queryParams = Object.assign({}, pageConfig.table.queryParams)

    return {
      pageConfig,
      queryParams,
      loadFilter(res) {
        if (res.errno == 0) {
          return {
            total: res.data.total,
            datas: res.data.visitList
          }
        }
        return {
          total: 0,
          datas: []
        }
      }
    }
  },
  components: {
    vFilterbar,
    vTable
  },
  beforeRouteEnter(to, from, next) {
    next(vm => {
      console.log('=============beforeRouteEnter', vm.queryParams)

      vm.$refs.filterBar.onSearch()
    })
  },
  beforeRouteUpdate(to, from, next) {
    this.$nextTick(() => {
      console.log('=============beforeRouteUpdate', this.queryParams)
      this.$refs.filterBar.onSearch()
            // this.addOtherQueryParams();
    })
    next()
  },
  methods: {
    onSearch(params) {
      const queryParams = Object.assign(this.queryParams, params, this.$route.query)

      this.queryParams = queryParams
      this.$refs.filterBar.changeQueryParams(queryParams)
      console.log('sdhagd', queryParams)
      this.$nextTick(() => {
        this.getListData()
      })
    },
        // 点击查询,替换当前页面URL
    onReplace(params) {
      this.queryParams = Object.assign(this.queryParams, this.$route.query, params, {
        visitId: ''
      })
      this.$nextTick(() => {
        this.$router.replace({ path: this.$route.path, query: this.queryParams })
      })
    },
    onDeleteFilters(params) {
      this.queryParams = Object.assign({}, params)
      this.$nextTick(() => {
        this.$router.replace({ path: this.$route.path, query: this.queryParams })
      })
    },
    getListData() {
      this.$nextTick(() => {
        console.log('参数:', this.queryParams)
        this.$refs.listTable.getListData()
      })
    }
  }
}
</script>

<style lang="scss" scoped>

</style>

filter-bar.vue


<template>
<el-form :inline="true" :model="queryParams" class="form-inline sticky-filter-bar-box">
  <template v-for="item in localFilterBarConfig.items">

    <el-form-item v-if="item.type == 1" :key="item.field" :label="item.label">
        <el-input size="small" v-model="queryParams[item.field]" style="width: 150px" :placeholder="item.placeholder"></el-input>
    </el-form-item>

    <el-form-item v-if="item.type == 2" :key="item.field" :label="item.label">
        <el-select  size="small" v-model="queryParams[item.field]" style="width:140px;" :placeholder="item.placeholder">
          <el-option v-for="option in item.selectOptions" :key="option.value" :label="option.label" :value="option.value"></el-option>
        </el-select>
    </el-form-item>

  </template>

    <el-form-item>
        <el-button size="small" type="primary" @click="onReplace" icon="search">查询</el-button>
    </el-form-item>
</el-form>
</template>

<script>
import { getRequest } from 'utils'
const DEFAULT_SELECT_OPTIONS = [{
  label: '全部',
  value: '-1'
}]
export default {
  name: 'list-filterbar',
  data() {
    const defaultQueryParams = {}
    this.filterBarConfig.items.forEach(item => {
      defaultQueryParams[item.field] = item.defaultValue
    })
    return {
      queryParams: Object.assign({}, defaultQueryParams),
      defaultQueryParams,
      localFilterBarConfig: this.filterBarConfig
    }
  },
  props: {
    filterBarConfig: {
      type: Object,
      require: true
    }
  },
  created() {
    this.localFilterBarConfig.items.forEach((item, i) => {
      if (item.type == 2 && item.url) {
        this.getRemoteSelectOptions(item.url, i)
      }
    })
  },
  methods: {
    getRemoteSelectOptions(url, index) {
      getRequest(url).then(res => {
        if (res.errno == 0 || res.resCode == 0) {
          const remoteData = res.data || res.datas || []
          this.localFilterBarConfig.items[index].selectOptions = DEFAULT_SELECT_OPTIONS.concat(remoteData.map(item => {
            return {
              label: item.name,
              value: item.name
            }
          }))
        } else {
          throw new Error('errno:' + res.errno + ',出错了')
        }
      }).catch(error => {
        console.error(error.message)
      })
    },
    onSearch() {
      this.$emit('on-search', this.defaultQueryParams)
    },
    onReplace() {
      this.$emit('on-replace', this.queryParams)
    },
    changeQueryParams(params) {
      this.queryParams = Object.assign(this.queryParams, params)
    }
  }
}
</script>

持续完善中...

原文地址:https://segmentfault.com/a/1190000012669693

原文地址:https://www.cnblogs.com/lalalagq/p/9960274.html

时间: 2024-10-30 01:34:01

管理系统列表和详情配置的相关文章

桂电在线_微信公众平台开发之-运用angularjs显示学校公告新闻列表和详情页面

折腾angularjs的感悟 几天折腾,总的来说看了很多博客,要么不是最新的技术文档,要么写得不够完整,因为别人是基于他们的理解写的技术博客代码不一定会贴完整,所以一旦你用的是最新的想要看完整的实例就只能去官网查阅文档,现在通过实现下面的两个功能才真正了解什么是前端的MVVM框架. 另外,总结下我理解中的MVVM框架:后台php是MVC框架,一直做法是php处理数据,然后把数据渲染到模板,然后后台返回html页面给浏览器, 现在前端mvvm(model-view-viewmodel)就是:mod

从列表到详情,没你想的那么简单

前言 本文先假设我们使用的是 vue + vuex + vue-router 的情况来展开讨论,React 全家桶的情况应该类似. 在日常的前端研发中,我们经常会遇到如题的场景:比如从商品列表进入商品详情,从订单列表进入订单详情.先看一个 demo~ 看起来是不是还算丝滑流畅,跟客户端效果较为接近~ 正文开始 很多同学应该会说,这不是很容易么,用 vue-router + transition 就好啦. <template> <transition name="custom-c

【华为HCNA】访问控制列表ACL实例配置

[华为HCNA]访问控制列表ACL实例配置 ACL的概念访问控制列表ACL(Access Control List)可以定义一系列不同的规则,设备根据这些规则对数据包进行分类,并针对不同类型的报文进行不同的处理,从而可以实现对网络访问行为的控制.限制网络流量.提高网络性能.防止网络攻击等等. 应用场景在小型企业的网络中,现要求只有经理的PC(源地址是192.168.2.1)才能访问互联 实验目的允许主机B(经理的PC)访问互联网,禁止主机A访问互联网 网络拓扑图如下: 操作步骤 一.配置端口类型

JEPLUS之列表字段项配置详解下——JEPLUS软件快速开发平台

JEPLUS之列表字段项配置详解--下 在上篇的文章中我介绍了一些列表字段项配置,在这里我接着上篇中列表配置项中的高级配置项介绍下. 一.效果展示 二.准备工作 1.JEPLUS平台5.0.0.2 2.数据库MySql 5.7 三.详解步骤 1.统计类型 :可以对表格整列进行统计 可以进行多选操作,统计描述:统计数据的文字描述,总统计描述:统计分为单页统计与全局统计 统计类型: 2.隐藏:可以控制字段的显隐,编辑:设置字段是否支持字段列表编辑,批量更新:列表数据可以进行批量更新操作.分布加载:把

访问控制列表ACL的配置与应用

访问控制列表(Access Control List,ACL)是应用在路由器接口的指令列表(即规则).这些指令列表用来告诉路由器,哪些数据包可以接收,哪些数据包需要拒绝.其基本原理如下:ACL使用包过滤技术,在路由器上读取OSI七层模型的第三层及第四层包头中的信息,如源地址.目的地址.源端口.目的端口等,根据预先定义好的规则,对包进行过滤,从而达到访问控制的目的. ACL通过在路由器接口处控制数据包的转发还是丢弃,从而过滤通信流量.路由器根据ACL中指定的条件来检测通过路由器的数据包,从而决定是

mantis缺陷管理系统的搭建与配置

mantis是一个开源的基于PHP技术的项目和缺陷管理系统,由于项目需要,搭建和配置使用mantis,遂将在自己VMware中的安装配置过程进行记录,以备查用. 系统版本:Windows 7-64位-旗舰版(实际环境Windows Server 2008 R2-64位) 软件版本:xampp-win32-1.8.3.mantisbt-1.2.8 1.安装xampp 因为mantis需要使用apache.mysql.php,若全部都单独安装,耗时耗力,好在可以使用xampp一次全部完成. 可以安装

Activity 切换动画(小米图库列表进入详情页,图片从固定位置放大进入,缩小退出)

直接上效果图 ok,来分析下如何实现的吧 分析原理 首先确定,这是两个不同的 Activity,从图片列表页跳入到图片详情页:先来看进入详情页时的动画,从列表中所在 item 的位置一直放大到详情页的显示位置,这里我可以先告诉大家,当我们点击了这个 item 的时候,就已经启动了详情页,然后在详情页做相应的动画效果.既然是在详情页做动画效果,就需要在列表页把相应的值传过去,列表页 item 在屏幕上的位置,item 的大小,当然还有图片的资源,然后在详情页计算动画执行的参数.分析了进入动画,那么

Rxjava列表跳详情

//详情 public static final String XQURL="product/getProductDetail"; @GET(Api.XQURL) Flowable<XqBean> xqbean(@Query("pid") String pid ,@Query("resource") String resource); model public class XqModel implements IXqModel { @

scrapy案例:爬取翼蜂网络新闻列表和详情页面

# -*- coding: utf-8 -*- import scrapy from Demo.items import DemoItem class AbcSpider(scrapy.Spider): name = 'abcd' allowed_domains = ['www.cnyifeng.net'] # start_urls = ['http://abc.com/'] # 拼接url baseURL = "http://www.cnyifeng.net/news/1/{}.html&qu