大理市民卡小程序1.0提交
diff --git a/weui/slideview/slideview.js b/weui/slideview/slideview.js
new file mode 100644
index 0000000..50b239e
--- /dev/null
+++ b/weui/slideview/slideview.js
@@ -0,0 +1,205 @@
+module.exports =
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// define __esModule on exports
+/******/ 	__webpack_require__.r = function(exports) {
+/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 		}
+/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 	};
+/******/
+/******/ 	// create a fake namespace object
+/******/ 	// mode & 1: value is a module id, require it
+/******/ 	// mode & 2: merge all properties of value into the ns
+/******/ 	// mode & 4: return value when already ns object
+/******/ 	// mode & 8|1: behave like require
+/******/ 	__webpack_require__.t = function(value, mode) {
+/******/ 		if(mode & 1) value = __webpack_require__(value);
+/******/ 		if(mode & 8) return value;
+/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ 		var ns = Object.create(null);
+/******/ 		__webpack_require__.r(ns);
+/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ 		return ns;
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 18);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 18:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Component({
+    options: {
+        addGlobalClass: true,
+        multipleSlots: true
+    },
+    properties: {
+        extClass: {
+            type: String,
+            value: ''
+        },
+        buttons: {
+            type: Array,
+            value: [],
+            observer: function observer(newVal) {
+                this.addClassNameForButton();
+            }
+        },
+        disable: {
+            type: Boolean,
+            value: false
+        },
+        icon: {
+            type: Boolean,
+            value: false
+        },
+        show: {
+            type: Boolean,
+            value: false
+        },
+        duration: {
+            type: Number,
+            value: 350
+        },
+        throttle: {
+            type: Number,
+            value: 40
+        },
+        rebounce: {
+            type: Number,
+            value: 0
+        }
+    },
+    data: {
+        size: null
+    },
+    ready: function ready() {
+        this.updateRight();
+        this.addClassNameForButton();
+    },
+
+    methods: {
+        updateRight: function updateRight() {
+            var _this = this;
+
+            var data = this.data;
+            var query = wx.createSelectorQuery().in(this);
+            query.select('.left').boundingClientRect(function (res) {
+                console.log('right res', res);
+                var btnQuery = wx.createSelectorQuery().in(_this);
+                btnQuery.selectAll('.btn').boundingClientRect(function (rects) {
+                    console.log('btn rects', rects);
+                    _this.setData({
+                        size: {
+                            buttons: rects,
+                            button: res,
+                            show: data.show,
+                            disable: data.disable,
+                            throttle: data.throttle,
+                            rebounce: data.rebounce
+                        }
+                    });
+                }).exec();
+            }).exec();
+        },
+        addClassNameForButton: function addClassNameForButton() {
+            var _data = this.data,
+                buttons = _data.buttons,
+                icon = _data.icon;
+
+            buttons.forEach(function (btn) {
+                if (icon) {
+                    btn.className = '';
+                } else if (btn.type === 'warn') {
+                    btn.className = 'weui-slideview__btn-group_warn';
+                } else {
+                    btn.className = 'weui-slideview__btn-group_default';
+                }
+            });
+            this.setData({
+                buttons: buttons
+            });
+        },
+        buttonTapByWxs: function buttonTapByWxs(data) {
+            this.triggerEvent('buttontap', data, {});
+        },
+        hide: function hide() {
+            this.triggerEvent('hide', {}, {});
+        },
+        show: function show() {
+            this.triggerEvent('show', {}, {});
+        },
+        transitionEnd: function transitionEnd() {
+            console.log('transitiion end');
+        }
+    }
+});
+
+/***/ })
+
+/******/ });
\ No newline at end of file
diff --git a/weui/slideview/slideview.json b/weui/slideview/slideview.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/weui/slideview/slideview.json
@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/weui/slideview/slideview.wxml b/weui/slideview/slideview.wxml
new file mode 100644
index 0000000..f906edf
--- /dev/null
+++ b/weui/slideview/slideview.wxml
@@ -0,0 +1,23 @@
+<!-- slide-view/slide-view.wxml -->
+<wxs module="handler" src="./slideview.wxs"></wxs>
+<view class="weui-slideview weui-movable-view {{icon ? 'weui-slideview_icon' : ''}} {{extClass}}" style="width: 100%;height: 100%;">
+    <view bindtransitionend="{{handler.transitionEnd}}"
+      show="{{show}}" change:show="{{handler.showChange}}" 
+      rebounce="{{rebounce}}" change:rebounce="{{handler.rebounceChange}}" 
+      duration="{{duration}}" change:duration="{{handler.durationChange}}" 
+      change:disable="{{handler.disableChange}}" disable="{{disable}}" 
+      change:prop="{{handler.sizeReady}}" prop="{{size}}" 
+      bindtouchstart="{{handler.touchstart}}" bindtouchmove="{{handler.touchmove}}" bindtouchend="{{handler.touchend}}" class="weui-slideview__left left" style="width:100%;">
+      <slot></slot>
+    </view>
+    <view class="weui-slideview__right right">
+      <view class="weui-slideview__buttons" style="height:100%;width:100%;" wx:if="{{buttons && buttons.length}}">
+        <view wx:for="{{buttons}}" class='btn weui-slideview__btn__wrp {{item.className}} {{item.extClass}}'>
+          <view bindtap="{{handler.hideButton}}" data-data="{{item.data}}" data-index="{{index}}" class='weui-slideview__btn'>
+            <text wx:if="{{!icon}}">{{item.text}}</text>
+            <image class="weui-slideview__btn__icon" wx:else src="{{item.src}}"/>
+          </view>
+        </view>
+      </view>
+    </view>
+</view>
diff --git a/weui/slideview/slideview.wxs b/weui/slideview/slideview.wxs
new file mode 100644
index 0000000..c62d085
--- /dev/null
+++ b/weui/slideview/slideview.wxs
@@ -0,0 +1,243 @@
+/* eslint-disable */
+var touchstart = function(event, ownerInstance) {
+    var ins = event.instance
+    var st = ins.getState()
+    if (st.disable) return // disable的逻辑
+    // console.log('touchstart st', JSON.stringify(st))
+    if (!st.size) return
+    // console.log('touchstart', JSON.stringify(event))
+    st.isMoving = true
+    st.startX = event.touches[0].pageX
+    st.startY = event.touches[0].pageY
+    st.firstAngle = 0
+}
+var touchmove = function(event, ownerInstance) {
+    var ins = event.instance
+    var st = ins.getState()
+    if (!st.size || !st.isMoving) return
+    // console.log('touchmove', JSON.stringify(event))
+    var pagex = event.touches[0].pageX - st.startX
+    var pagey = event.touches[0].pageY - st.startY
+    // 左侧45度角为界限,大于45度则允许水平滑动
+    if (st.firstAngle === 0) {
+        st.firstAngle = Math.abs(pagex) - Math.abs(pagey)
+    }
+    if (st.firstAngle < 0) {
+        return
+    }
+    var movex = pagex > 0 ? Math.min(st.max, pagex) : Math.max(-st.max, pagex)
+    // 往回滑动的情况
+    if (st.out) {
+        // 已经是划出来了,还要往左滑动,忽略
+        if (movex < 0) return
+        ins.setStyle({
+            'transform': 'translateX(' + (st.transformx + movex) + 'px)',
+            'transition': ''
+        })
+        var btns = ownerInstance.selectAllComponents('.btn')
+        var transformTotal = 0
+        var len = btns.length
+        var i = len - 1;
+        for (;i >= 0; i--) {
+            var transform = st.size.buttons[i].width / st.max * movex
+            var transformx = st.size.buttons[i].max - Math.min(st.size.buttons[i].max, transform + transformTotal)
+            btns[i].setStyle({
+                'transform': 'translateX(' + (-transformx) + 'px)',
+                'transition': ''
+            })
+            transformTotal += transform
+        }
+        return false
+    }
+    if (movex > 0) movex = 0
+    ins.setStyle({
+        'transform': 'translateX(' + movex + 'px)',
+        'transition': ''
+    })
+    st.transformx = movex
+    var btns = ownerInstance.selectAllComponents('.btn')
+    var transformTotal = 0
+    var len = btns.length
+    var i = len - 1;
+    for (;i >= 0; i--) {
+        var transform = st.size.buttons[i].width / st.max * movex
+        var transformx = Math.max(-st.size.buttons[i].max, transform + transformTotal)
+        btns[i].setStyle({
+            'transform': 'translateX(' + transformx + 'px)',
+            'transition': ''
+        })
+        st.size.buttons[i].transformx = transformx
+        transformTotal += transform
+    }
+    return false // 禁止垂直方向的滑动
+}
+var touchend = function(event, ownerInstance) {
+    var ins = event.instance
+    var st = ins.getState()
+    if (!st.size || !st.isMoving) return
+    // 左侧45度角为界限,大于45度则允许水平滑动
+    if (st.firstAngle < 0) {
+        return
+    }
+    var duration = st.duration / 1000
+    st.isMoving = false
+    // console.log('touchend', JSON.stringify(event))
+    var btns = ownerInstance.selectAllComponents('.btn')
+    var len = btns.length
+    var i = len - 1
+    // console.log('len size', len)
+    if (Math.abs(event.changedTouches[0].pageX - st.startX) < st.throttle || event.changedTouches[0].pageX - st.startX > 0) { // 方向也要控制
+        st.out = false
+        ins.setStyle({
+            'transform': 'translate3d(0px, 0, 0)',
+            'transition': 'transform ' + (duration) + 's'
+        })
+        for (;i >= 0; i--) {
+            btns[i].setStyle({
+                'transform': 'translate3d(0px, 0, 0)',
+                'transition': 'transform ' + (duration) + 's'
+            })
+        }
+        ownerInstance.callMethod('hide')
+        return
+    }
+    showButtons(ins, ownerInstance, duration)
+    ownerInstance.callMethod('show')
+}
+var REBOUNCE_TIME = 0.2
+var showButtons = function(ins, ownerInstance, withDuration) {
+    var st = ins.getState()
+    if (!st.size) return
+    var rebounceTime = st.rebounce ? REBOUNCE_TIME : 0
+    var movex = st.max
+    st.out = true
+    var btns = ownerInstance.selectAllComponents('.btn')
+    var rebounce = st.rebounce || 0
+    var len = btns.length
+    var i = len - 1
+    ins.setStyle({
+        'transform': 'translate3d(' + (-movex - rebounce) + 'px, 0, 0)',
+        'transition': 'transform ' + (withDuration) + 's'
+    })
+    st.transformx = -movex
+    var transformTotal = 0
+    for (;i >= 0; i--) {
+        var transform = st.size.buttons[i].width / st.max * movex
+        var transformx = (-(transform + transformTotal))
+        btns[i].setStyle({
+            'transform': 'translate3d(' + transformx + 'px, 0, 0)',
+            'transition': 'transform ' + (withDuration ? withDuration + rebounceTime : withDuration) + 's'
+        })
+        st.size.buttons[i].transformx = transformx
+        transformTotal += transform
+    }
+}
+var innerHideButton = function(ownerInstance) {
+    var ins = ownerInstance.selectComponent('.left')
+    var st = ins.getState()
+    if (!st.size) return
+    var duration = st.duration ? st.duration / 1000 : 0
+    var btns = ownerInstance.selectAllComponents('.btn')
+    var len = btns.length
+    var i = len - 1
+    ins.setStyle({
+        'transform': 'translate3d(0px, 0, 0)',
+        'transition': 'transform ' + (duration) + 's'
+    })
+    st.transformx = 0
+    for (;i >= 0; i--) {
+        btns[i].setStyle({
+            'transform': 'translate3d(0px, 0, 0)',
+            'transition': 'transform ' + (duration) + 's'
+        })
+        st.size.buttons[i].transformx = 0
+    }
+}
+var hideButton = function(event, ownerInstance) {
+    innerHideButton(ownerInstance)
+    ownerInstance.callMethod('buttonTapByWxs', {index: event.currentTarget.dataset.index, data: event.currentTarget.dataset.data})
+    return false
+}
+var sizeReady = function(newVal, oldVal, ownerInstance, ins) {
+    var st = ins.getState()
+    // st.disable = newVal && newVal.disable
+    if (newVal && newVal.button && newVal.buttons) {
+        st.size = newVal
+        st.transformx = 0
+        // var min = newVal.button.width
+        var max = 0
+        var len = newVal.buttons.length
+        var i = newVal.buttons.length - 1;
+        var total = 0
+        for (; i >= 0; i--) {
+            max += newVal.buttons[i].width
+            // if (min > newVal.buttons[i]) {
+            //     min = newVal.buttons[i].width
+            // }
+            total += newVal.buttons[i].width
+            newVal.buttons[i].max = total
+            newVal.buttons[i].transformx = 0
+        }
+        st.throttle = st.size.throttle || 40 // 固定值
+        st.rebounce = st.size.rebounce
+        st.max = max
+        ownerInstance.selectComponent('.right').setStyle({
+            'line-height': newVal.button.height + 'px',
+            left: (newVal.button.width) + 'px',
+            width: max + 'px'
+        })
+        // console.log('st size', JSON.stringify(newVal))
+        if (!st.size.disable && st.size.show) {
+            showButtons(ins, ownerInstance)
+        }
+    }
+}
+var disableChange = function(newVal, oldVal, ownerInstance, ins) {
+    var st = ins.getState()
+    st.disable = newVal
+}
+var durationChange = function(newVal, oldVal, ownerInstance, ins) {
+    var st = ins.getState()
+    st.duration = newVal || 400
+}
+var showChange = function(newVal, oldVal, ownerInstance, ins) {
+    var st = ins.getState()
+    st.show = newVal
+    if (st.disable) return
+    // console.log('show change')
+    if (st.show) {
+        showButtons(ins, ownerInstance, st.duration)
+    } else {
+        innerHideButton(ownerInstance)
+    }
+}
+var rebounceChange = function(newVal, oldVal, ownerInstance, ins) {
+    var st = ins.getState()
+    // console.log('rebounce', st.rebounce)
+    st.rebounce = newVal
+}
+var transitionEnd = function(event, ownerInstance) {
+    // console.log('transition')
+    var ins = event.instance
+    var st = ins.getState()
+    // 回弹效果
+    if (st.out && st.rebounce) {
+        console.log('transition rebounce', st.rebounce)
+        ins.setStyle({
+            'transform': 'translate3d(' + (-st.max) + 'px, 0, 0)',
+            'transition': 'transform ' + REBOUNCE_TIME +'s'
+        })
+    }
+}
+module.exports = {
+    touchstart: touchstart,
+    touchmove: touchmove,
+    touchend: touchend,
+    hideButton: hideButton,
+    sizeReady: sizeReady,
+    disableChange: disableChange,
+    durationChange: durationChange,
+    showChange: showChange,
+    rebounceChange: rebounceChange,
+    transitionEnd: transitionEnd
+}
\ No newline at end of file
diff --git a/weui/slideview/slideview.wxss b/weui/slideview/slideview.wxss
new file mode 100644
index 0000000..0129c65
--- /dev/null
+++ b/weui/slideview/slideview.wxss
@@ -0,0 +1 @@
+:host{width:100%}.weui-slideview{overflow:hidden;position:relative}.weui-slideview{position:relative}.weui-slideview__left{position:relative;z-index:10}.weui-slideview__right{position:absolute;z-index:1;left:100%;top:0;height:100%}.weui-slideview__btn__wrp{position:absolute;left:0;bottom:0;text-align:center;min-width:69px;height:100%;white-space:nowrap}.weui-slideview__btn{color:#FFFFFF;padding:0 17px}.weui-slideview__btn-group_default .weui-slideview__btn{background:#C7C7CC}.weui-slideview__btn-group_default~.weui-slideview__btn-group_default:before{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1rpx solid #FFFFFF;color:#FFFFFF}.weui-slideview__btn-group_default:first-child:before{display:none}.weui-slideview__btn-group_warn .weui-slideview__btn{background:#FE3B30}.weui-slideview__btn-group_warn~.weui-slideview__btn-group_warn:before{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1rpx solid #FFFFFF;color:#FFFFFF}.weui-slideview__btn-group_warn:first-child:before{display:none}.weui-slideview_icon .weui-slideview__btn__wrp{background:transparent;font-size:0}.weui-slideview_icon .weui-slideview__btn__wrp:after{content:"";width:0;height:100%;vertical-align:middle;display:inline-block}.weui-slideview_icon .weui-slideview__btn__wrp:first-child{padding-left:16px}.weui-slideview_icon .weui-slideview__btn__wrp:last-child{padding-right:8px}.weui-slideview_icon .weui-slideview__btn{width:48px;height:48px;line-height:48px;padding:0;display:inline-block;vertical-align:middle;border-radius:50%;background-color:#FFFFFF}.weui-slideview_icon .weui-slideview__btn__icon{display:inline-block;vertical-align:middle;width:22px;height:22px}
\ No newline at end of file