Showing
110 changed files
with
198 additions
and
4498 deletions
| ... | @@ -12,11 +12,10 @@ module.exports = { | ... | @@ -12,11 +12,10 @@ module.exports = { |
| 12 | moment: true, | 12 | moment: true, |
| 13 | _: true | 13 | _: true |
| 14 | }, | 14 | }, |
| 15 | - extends: [ | 15 | + 'extends': [ |
| 16 | 'plugin:vue/essential', | 16 | 'plugin:vue/essential', |
| 17 | '@vue/standard' | 17 | '@vue/standard' |
| 18 | ], | 18 | ], |
| 19 | - // extends: 'standard', | ||
| 20 | rules: { | 19 | rules: { |
| 21 | // allow paren-less arrow functions | 20 | // allow paren-less arrow functions |
| 22 | 'arrow-parens': 0, | 21 | 'arrow-parens': 0, |
| ... | @@ -37,13 +36,10 @@ module.exports = { | ... | @@ -37,13 +36,10 @@ module.exports = { |
| 37 | 'camelcase': 0, | 36 | 'camelcase': 0, |
| 38 | 'eqeqeq': 0, | 37 | 'eqeqeq': 0, |
| 39 | 'no-undef': 0, | 38 | 'no-undef': 0, |
| 39 | + 'no-self-assign': 0, | ||
| 40 | 'no-console': ['error', { allow: ['warn', 'error'] }] | 40 | 'no-console': ['error', { allow: ['warn', 'error'] }] |
| 41 | }, | 41 | }, |
| 42 | parserOptions: { | 42 | parserOptions: { |
| 43 | parser: 'babel-eslint' | 43 | parser: 'babel-eslint' |
| 44 | - }, | ||
| 45 | - plugins: ['html', 'vue'], | ||
| 46 | - settings: { | ||
| 47 | - 'html/html-extensions': ['.html'] | ||
| 48 | } | 44 | } |
| 49 | -}; | 45 | +} | ... | ... |
This diff could not be displayed because it is too large.
| 1 | { | 1 | { |
| 2 | - "name": "test1", | 2 | + "name": "vant-test", |
| 3 | "version": "0.1.0", | 3 | "version": "0.1.0", |
| 4 | "private": true, | 4 | "private": true, |
| 5 | "scripts": { | 5 | "scripts": { |
| ... | @@ -12,32 +12,24 @@ | ... | @@ -12,32 +12,24 @@ |
| 12 | "fastclick": "^1.0.6", | 12 | "fastclick": "^1.0.6", |
| 13 | "jquery": "^3.3.1", | 13 | "jquery": "^3.3.1", |
| 14 | "lodash": "^4.17.11", | 14 | "lodash": "^4.17.11", |
| 15 | - "register-service-worker": "^1.5.2", | 15 | + "moment": "^2.23.0", |
| 16 | + "vant": "^1.5.2", | ||
| 16 | "vue": "^2.5.21", | 17 | "vue": "^2.5.21", |
| 17 | - "vue-core-image-upload": "^2.4.11", | ||
| 18 | - "vue-pull-to": "^0.1.6", | ||
| 19 | "vue-router": "^3.0.1", | 18 | "vue-router": "^3.0.1", |
| 20 | "vuex": "^3.0.1", | 19 | "vuex": "^3.0.1", |
| 21 | - "vuex-router-sync": "^5.0.0", | 20 | + "vuex-router-sync": "^5.0.0" |
| 22 | - "vux": "^2.9.2" | ||
| 23 | }, | 21 | }, |
| 24 | "devDependencies": { | 22 | "devDependencies": { |
| 25 | "@vue/cli-plugin-babel": "^3.3.0", | 23 | "@vue/cli-plugin-babel": "^3.3.0", |
| 26 | "@vue/cli-plugin-eslint": "^3.3.0", | 24 | "@vue/cli-plugin-eslint": "^3.3.0", |
| 27 | - "@vue/cli-plugin-pwa": "^3.3.0", | ||
| 28 | "@vue/cli-service": "^3.3.0", | 25 | "@vue/cli-service": "^3.3.0", |
| 29 | "@vue/eslint-config-standard": "^4.0.0", | 26 | "@vue/eslint-config-standard": "^4.0.0", |
| 30 | "babel-eslint": "^10.0.1", | 27 | "babel-eslint": "^10.0.1", |
| 28 | + "compression-webpack-plugin": "^2.0.0", | ||
| 31 | "eslint": "^5.8.0", | 29 | "eslint": "^5.8.0", |
| 32 | - "eslint-plugin-html": "^5.0.0", | ||
| 33 | "eslint-plugin-vue": "^5.0.0", | 30 | "eslint-plugin-vue": "^5.0.0", |
| 34 | - "less": "^3.0.4", | 31 | + "less": "^3.9.0", |
| 35 | "less-loader": "^4.1.0", | 32 | "less-loader": "^4.1.0", |
| 36 | - "lint-staged": "^8.1.0", | 33 | + "vue-template-compiler": "^2.5.21" |
| 37 | - "vue-loader": "^14.2.2", | ||
| 38 | - "vue-template-compiler": "^2.5.21", | ||
| 39 | - "vux-loader": "^1.2.9", | ||
| 40 | - "webpack-merge": "^4.2.1", | ||
| 41 | - "yaml-loader": "^0.5.0" | ||
| 42 | } | 34 | } |
| 43 | } | 35 | } | ... | ... |
| ... | @@ -3,15 +3,31 @@ | ... | @@ -3,15 +3,31 @@ |
| 3 | <head> | 3 | <head> |
| 4 | <meta charset="utf-8"> | 4 | <meta charset="utf-8"> |
| 5 | <meta http-equiv="X-UA-Compatible" content="IE=edge"> | 5 | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| 6 | - <meta name="viewport" content="width=device-width,initial-scale=1.0"> | 6 | + <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0"> |
| 7 | + <meta name="apple-mobile-web-app-capable" content="yes"> | ||
| 7 | <link rel="icon" href="<%= BASE_URL %>favicon.ico"> | 8 | <link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
| 9 | + <!-- 使用CDN加速的CSS文件,配置在vue.config.js下 --> | ||
| 10 | + <% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.css) { %> | ||
| 11 | + <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="preload" as="style"> | ||
| 12 | + <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet"> | ||
| 13 | + <% } %> | ||
| 14 | + | ||
| 15 | + <!-- 使用CDN加速的JS文件,配置在vue.config.js下 --> | ||
| 16 | + <% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js) { %> | ||
| 17 | + <link href="<%= htmlWebpackPlugin.options.cdn.js[i] %>" rel="preload" as="script"> | ||
| 18 | + <% } %> | ||
| 19 | + | ||
| 8 | <title><%= htmlWebpackPlugin.options.title %></title> | 20 | <title><%= htmlWebpackPlugin.options.title %></title> |
| 9 | </head> | 21 | </head> |
| 10 | <body> | 22 | <body> |
| 11 | <noscript> | 23 | <noscript> |
| 12 | - <strong>We're sorry but test1 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> | 24 | + <strong>We're sorry but vant-test doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> |
| 13 | </noscript> | 25 | </noscript> |
| 14 | <div id="app"></div> | 26 | <div id="app"></div> |
| 27 | + <!-- 使用CDN加速的JS文件,配置在vue.config.js下 --> | ||
| 28 | + <% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js) { %> | ||
| 29 | + <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script> | ||
| 30 | + <% } %> | ||
| 15 | <!-- built files will be auto injected --> | 31 | <!-- built files will be auto injected --> |
| 16 | </body> | 32 | </body> |
| 17 | </html> | 33 | </html> | ... | ... |
| ... | @@ -5,6 +5,16 @@ | ... | @@ -5,6 +5,16 @@ |
| 5 | <meta http-equiv="X-UA-Compatible" content="IE=edge"> | 5 | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| 6 | <meta name="viewport" content="width=device-width,initial-scale=1.0"> | 6 | <meta name="viewport" content="width=device-width,initial-scale=1.0"> |
| 7 | <link rel="icon" href="<%= BASE_URL %>favicon.ico"> | 7 | <link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
| 8 | + <!-- 使用CDN加速的CSS文件,配置在vue.config.js下 --> | ||
| 9 | + <% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.css) { %> | ||
| 10 | + <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="preload" as="style"> | ||
| 11 | + <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet"> | ||
| 12 | + <% } %> | ||
| 13 | + | ||
| 14 | + <!-- 使用CDN加速的JS文件,配置在vue.config.js下 --> | ||
| 15 | + <% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js) { %> | ||
| 16 | + <link href="<%= htmlWebpackPlugin.options.cdn.js[i] %>" rel="preload" as="script"> | ||
| 17 | + <% } %> | ||
| 8 | <title><%= htmlWebpackPlugin.options.title %></title> | 18 | <title><%= htmlWebpackPlugin.options.title %></title> |
| 9 | </head> | 19 | </head> |
| 10 | <body> | 20 | <body> |
| ... | @@ -12,6 +22,10 @@ | ... | @@ -12,6 +22,10 @@ |
| 12 | <strong>We're sorry but test1 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> | 22 | <strong>We're sorry but test1 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> |
| 13 | </noscript> | 23 | </noscript> |
| 14 | <div id="login"></div> | 24 | <div id="login"></div> |
| 25 | + <!-- 使用CDN加速的JS文件,配置在vue.config.js下 --> | ||
| 26 | + <% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js) { %> | ||
| 27 | + <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script> | ||
| 28 | + <% } %> | ||
| 15 | <!-- built files will be auto injected --> | 29 | <!-- built files will be auto injected --> |
| 16 | </body> | 30 | </body> |
| 17 | </html> | 31 | </html> | ... | ... |
| ... | @@ -4,11 +4,11 @@ | ... | @@ -4,11 +4,11 @@ |
| 4 | <router-link to="/">Home</router-link> | | 4 | <router-link to="/">Home</router-link> | |
| 5 | <router-link to="/about">About</router-link> | 5 | <router-link to="/about">About</router-link> |
| 6 | </div> | 6 | </div> |
| 7 | - <router-view></router-view> | 7 | + <router-view/> |
| 8 | </div> | 8 | </div> |
| 9 | </template> | 9 | </template> |
| 10 | 10 | ||
| 11 | -<style lang="less"> | 11 | +<style> |
| 12 | #app { | 12 | #app { |
| 13 | font-family: 'Avenir', Helvetica, Arial, sans-serif; | 13 | font-family: 'Avenir', Helvetica, Arial, sans-serif; |
| 14 | -webkit-font-smoothing: antialiased; | 14 | -webkit-font-smoothing: antialiased; |
| ... | @@ -18,12 +18,14 @@ | ... | @@ -18,12 +18,14 @@ |
| 18 | } | 18 | } |
| 19 | #nav { | 19 | #nav { |
| 20 | padding: 30px; | 20 | padding: 30px; |
| 21 | - a { | 21 | +} |
| 22 | - font-weight: bold; | 22 | + |
| 23 | - color: #2c3e50; | 23 | +#nav a { |
| 24 | - &.router-link-exact-active { | 24 | + font-weight: bold; |
| 25 | - color: #42b983; | 25 | + color: #2c3e50; |
| 26 | - } | 26 | +} |
| 27 | - } | 27 | + |
| 28 | +#nav a.router-link-exact-active { | ||
| 29 | + color: #42b983; | ||
| 28 | } | 30 | } |
| 29 | </style> | 31 | </style> | ... | ... |
| ... | @@ -40,7 +40,7 @@ export default { | ... | @@ -40,7 +40,7 @@ export default { |
| 40 | </script> | 40 | </script> |
| 41 | 41 | ||
| 42 | <!-- Add "scoped" attribute to limit CSS to this component only --> | 42 | <!-- Add "scoped" attribute to limit CSS to this component only --> |
| 43 | -<style scoped lang="less"> | 43 | +<style scoped> |
| 44 | h3 { | 44 | h3 { |
| 45 | margin: 40px 0 0; | 45 | margin: 40px 0 0; |
| 46 | } | 46 | } | ... | ... |
src/components/addProduct/index.vue
deleted
100644 → 0
This diff is collapsed. Click to expand it.
src/components/addProduct/test.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class="choose-material-page"> | ||
| 3 | - <div v-transfer-dom> | ||
| 4 | - <x-dialog :show.sync="show" class="dialog-demo"> | ||
| 5 | - <div class="material-title">请选择{{name}}</div> | ||
| 6 | - <div class="material-wrapper"> | ||
| 7 | - <div class="material-classify"> | ||
| 8 | - <div> | ||
| 9 | - <check-icon :value.sync="all_checked" @click.native="checkAll(all_checked)"> | ||
| 10 | - 全部{{name}} | ||
| 11 | - </check-icon> | ||
| 12 | - <div class="material-content"> | ||
| 13 | - <checker | ||
| 14 | - v-model="checkList" | ||
| 15 | - type="checkbox" | ||
| 16 | - default-item-class="item" | ||
| 17 | - selected-item-class="item-selected" | ||
| 18 | - disabled-item-class="item-disabled" | ||
| 19 | - > | ||
| 20 | - <checker-item v-for="(item, index) in list" :key="index" :disabled="item.disabled" :value="item.id" @click.native="itemCheck(item.checked, index)">{{item.name}}</checker-item> | ||
| 21 | - </checker> | ||
| 22 | - </div> | ||
| 23 | - </div> | ||
| 24 | - </div> | ||
| 25 | - </div> | ||
| 26 | - <div style="padding: 10px;"> | ||
| 27 | - <flexbox> | ||
| 28 | - <flexbox-item> | ||
| 29 | - <x-button @click.native="cancel" mini style="background-color: #ffffff; color: #8EA8CF; border: 1px solid #8EA8CF; width: 100%;">关闭</x-button> | ||
| 30 | - </flexbox-item> | ||
| 31 | - <flexbox-item> | ||
| 32 | - <x-button @click.native="comfirm" mini style="background-color: #8EA8CF; color: #ffffff; border: 1px solid #8EA8CF; width: 100%;">确定</x-button> | ||
| 33 | - </flexbox-item> | ||
| 34 | - </flexbox> | ||
| 35 | - </div> | ||
| 36 | - </x-dialog> | ||
| 37 | - </div> | ||
| 38 | - </div> | ||
| 39 | -</template> | ||
| 40 | - | ||
| 41 | -<script> | ||
| 42 | -import { XDialog, TransferDomDirective as TransferDom, Flexbox, FlexboxItem, CheckIcon, XButton, Checker, CheckerItem } from 'vux' | ||
| 43 | -export default { | ||
| 44 | - props: ['show', 'list', 'checked_list', 'span', 'name'], | ||
| 45 | - directives: { TransferDom }, | ||
| 46 | - components: { XDialog, Flexbox, FlexboxItem, CheckIcon, XButton, Checker, CheckerItem }, | ||
| 47 | - beforeRouteEnter (to, from, next) { | ||
| 48 | - next() | ||
| 49 | - }, | ||
| 50 | - mounted () { | ||
| 51 | - // console.warn(this.list) | ||
| 52 | - // console.warn(1) | ||
| 53 | - }, | ||
| 54 | - data () { | ||
| 55 | - return { | ||
| 56 | - all_checked: true, | ||
| 57 | - checkList: [] | ||
| 58 | - } | ||
| 59 | - }, | ||
| 60 | - watch: { | ||
| 61 | - show (val) { | ||
| 62 | - // console.warn(val) | ||
| 63 | - this.checkList = JSON.parse(JSON.stringify(this.checked_list)) | ||
| 64 | - if (val) { | ||
| 65 | - let check_list = _.filter(this.list, (val) => { | ||
| 66 | - let tem; | ||
| 67 | - if (val.disabled === false) { | ||
| 68 | - tem = val | ||
| 69 | - } | ||
| 70 | - return tem | ||
| 71 | - }); | ||
| 72 | - if (check_list.length > 0 && this.checked_list.length > 0 && check_list.length === this.checked_list.length) { | ||
| 73 | - this.all_checked = true | ||
| 74 | - } else { | ||
| 75 | - this.all_checked = false | ||
| 76 | - } | ||
| 77 | - } else { | ||
| 78 | - this.all_checked = false | ||
| 79 | - } | ||
| 80 | - // this.checkList = val; | ||
| 81 | - } | ||
| 82 | - | ||
| 83 | - }, | ||
| 84 | - computed: { | ||
| 85 | - // checkList () { | ||
| 86 | - // return JSON.parse(JSON.stringify(this.checked_list)); | ||
| 87 | - // } | ||
| 88 | - }, | ||
| 89 | - methods: { | ||
| 90 | - checkAll (checked) { | ||
| 91 | - let check_list = _.filter(this.list, (val) => { | ||
| 92 | - let tem; | ||
| 93 | - if (val.disabled === false) { | ||
| 94 | - tem = val | ||
| 95 | - } | ||
| 96 | - return tem | ||
| 97 | - }); | ||
| 98 | - // 勾选所有品牌 | ||
| 99 | - if (checked) { | ||
| 100 | - // 选中 | ||
| 101 | - for (let i = 0; i < check_list.length; i++) { | ||
| 102 | - check_list[i].checked = true; | ||
| 103 | - } | ||
| 104 | - this.checkList = _.map(check_list, val => val.id) | ||
| 105 | - // this.checked_list = id_list; | ||
| 106 | - } else { | ||
| 107 | - // 取消 | ||
| 108 | - this.checkList = [] | ||
| 109 | - for (let i = 0; i < check_list.length; i++) { | ||
| 110 | - check_list[i].checked = false; | ||
| 111 | - } | ||
| 112 | - } | ||
| 113 | - }, | ||
| 114 | - itemCheck (checked, index) { | ||
| 115 | - // console.warn(this.checkList) | ||
| 116 | - let list = _.filter(this.list, (val) => { | ||
| 117 | - let tem; | ||
| 118 | - if (val.disabled === false) { | ||
| 119 | - tem = val | ||
| 120 | - } | ||
| 121 | - return tem | ||
| 122 | - }); | ||
| 123 | - if (checked) { | ||
| 124 | - this.list[index].checked = false; | ||
| 125 | - } else { | ||
| 126 | - this.list[index].checked = true; | ||
| 127 | - } | ||
| 128 | - // console.warn(id_list) | ||
| 129 | - if (list.length !== this.checkList.length) { | ||
| 130 | - this.all_checked = false | ||
| 131 | - } else { | ||
| 132 | - this.all_checked = true | ||
| 133 | - } | ||
| 134 | - }, | ||
| 135 | - changeCategory () { | ||
| 136 | - }, | ||
| 137 | - cancel () { | ||
| 138 | - // 关闭选择框 | ||
| 139 | - this.$emit('cancel', !this.show) | ||
| 140 | - }, | ||
| 141 | - comfirm () { | ||
| 142 | - // 确认选择框 | ||
| 143 | - this.$emit('comfirm', this.checkList) | ||
| 144 | - } | ||
| 145 | - } | ||
| 146 | -} | ||
| 147 | -</script> | ||
| 148 | - | ||
| 149 | -<style lang="less" scoped> | ||
| 150 | -.material-classify { | ||
| 151 | - text-align: left; | ||
| 152 | - padding: 10px; | ||
| 153 | - .vux-checker-box { | ||
| 154 | - // display: -webkit-flex; | ||
| 155 | - // display: flex; | ||
| 156 | - // flex-wrap: wrap; | ||
| 157 | - // justify-content: space-between; | ||
| 158 | - } | ||
| 159 | - .vux-check-icon { | ||
| 160 | - margin-bottom: 10px; | ||
| 161 | - } | ||
| 162 | -} | ||
| 163 | -.item { | ||
| 164 | - width: 31%; | ||
| 165 | - // flex-basis: 31%; | ||
| 166 | - line-height: 26px; | ||
| 167 | - text-align: center; | ||
| 168 | - border-radius: 3px; | ||
| 169 | - border: 1px solid #ccc; | ||
| 170 | - background-color: #fff; | ||
| 171 | - margin-bottom: 10px; | ||
| 172 | - margin-right: 2%; | ||
| 173 | - &:nth-child(3n) { | ||
| 174 | - margin-right: 0; | ||
| 175 | - } | ||
| 176 | - } | ||
| 177 | - .item-selected { | ||
| 178 | - color: white; | ||
| 179 | - background-color: #8EA8CF; | ||
| 180 | - } | ||
| 181 | - .item-disabled { | ||
| 182 | - color: #cfcfcf; | ||
| 183 | - background-color: #ebeef7; | ||
| 184 | - } | ||
| 185 | - | ||
| 186 | - .weui-dialog { | ||
| 187 | - width: 90% !important; | ||
| 188 | - max-width: 400px; | ||
| 189 | - } | ||
| 190 | - | ||
| 191 | - @media screen and (min-width: 1024px) { | ||
| 192 | - .weui-dialog { | ||
| 193 | - width: 35%; | ||
| 194 | - } | ||
| 195 | - } | ||
| 196 | - | ||
| 197 | - .weui-btn:after { | ||
| 198 | - border: 0 !important; | ||
| 199 | - } | ||
| 200 | -</style> |
src/components/alert/demo.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <alert | ||
| 4 | - :title="title" | ||
| 5 | - :value="show" | ||
| 6 | - :button_text="button_text" | ||
| 7 | - @on-show="onShow" | ||
| 8 | - @on-hide="onHide"> | ||
| 9 | - 自定义插入内容 | ||
| 10 | - </alert> | ||
| 11 | - <group> | ||
| 12 | - <x-switch title="测试开关" v-model="show"></x-switch> | ||
| 13 | - </group> | ||
| 14 | - </div> | ||
| 15 | -</template> | ||
| 16 | - | ||
| 17 | -<script> | ||
| 18 | -import alert from 'components/alert/index' | ||
| 19 | -import { Group, XSwitch } from 'vux' | ||
| 20 | - | ||
| 21 | -export default { | ||
| 22 | - components: { alert, Group, XSwitch }, | ||
| 23 | - data () { | ||
| 24 | - return { | ||
| 25 | - title: '温馨提示', | ||
| 26 | - button_text: '确定', | ||
| 27 | - show: false | ||
| 28 | - } | ||
| 29 | - }, | ||
| 30 | - mounted () { | ||
| 31 | - }, | ||
| 32 | - methods: { | ||
| 33 | - onHide () { | ||
| 34 | - console.warn('on-hide'); | ||
| 35 | - }, | ||
| 36 | - onShow () { | ||
| 37 | - console.warn('on-show'); | ||
| 38 | - } | ||
| 39 | - } | ||
| 40 | -} | ||
| 41 | -</script> | ||
| 42 | - | ||
| 43 | -<style lang="less"> | ||
| 44 | -</style> |
src/components/alert/index.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div v-transfer-dom> | ||
| 3 | - <alert v-model="show" | ||
| 4 | - :title="title" | ||
| 5 | - :button-text="button_text" | ||
| 6 | - @on-show="onShow" | ||
| 7 | - @on-hide="onHide"> | ||
| 8 | - <slot></slot> | ||
| 9 | - </alert> | ||
| 10 | - </div> | ||
| 11 | -</template> | ||
| 12 | - | ||
| 13 | -<script> | ||
| 14 | -import { TransferDom, Alert } from 'vux' | ||
| 15 | - | ||
| 16 | -export default { | ||
| 17 | - components: { Alert }, | ||
| 18 | - directives: { TransferDom }, | ||
| 19 | - props: ['title', 'value', 'button_text'], | ||
| 20 | - data () { | ||
| 21 | - return { | ||
| 22 | - } | ||
| 23 | - }, | ||
| 24 | - mounted () { | ||
| 25 | - }, | ||
| 26 | - computed: { | ||
| 27 | - show: { | ||
| 28 | - get () { | ||
| 29 | - return this.value | ||
| 30 | - }, | ||
| 31 | - set (val) {} | ||
| 32 | - } | ||
| 33 | - }, | ||
| 34 | - methods: { | ||
| 35 | - onHide () { | ||
| 36 | - this.$emit('on-hide'); | ||
| 37 | - }, | ||
| 38 | - onShow () { | ||
| 39 | - this.$emit('on-show'); | ||
| 40 | - } | ||
| 41 | - } | ||
| 42 | -} | ||
| 43 | -</script> | ||
| 44 | - | ||
| 45 | -<style lang="less"> | ||
| 46 | - .weui-dialog { | ||
| 47 | - width: 90%; | ||
| 48 | - max-width: 50rem; | ||
| 49 | - } | ||
| 50 | - .weui-dialog__btn.weui-dialog__btn_primary { | ||
| 51 | - color: #353535; | ||
| 52 | - } | ||
| 53 | - .weui-dialog__hd { | ||
| 54 | - background-color: #8ea9cf; | ||
| 55 | - color: #FFFFFF; | ||
| 56 | - padding: 0.5em 1.6em 0.5em; | ||
| 57 | - } | ||
| 58 | - | ||
| 59 | -</style> |
src/components/bottomBtn/index.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div> | ||
| 3 | - <div class="btn"> | ||
| 4 | - <div> | ||
| 5 | - <x-button class="default-btn" @click.native="next">{{btnText}}</x-button> | ||
| 6 | - </div> | ||
| 7 | - </div> | ||
| 8 | - </div> | ||
| 9 | -</template> | ||
| 10 | - | ||
| 11 | -<script> | ||
| 12 | -import { XButton } from 'vux' | ||
| 13 | -export default { | ||
| 14 | - components: { XButton }, | ||
| 15 | - props: ['btnText'], | ||
| 16 | - methods: { | ||
| 17 | - next () { | ||
| 18 | - this.$emit('btnClick') | ||
| 19 | - } | ||
| 20 | - } | ||
| 21 | -} | ||
| 22 | -</script> | ||
| 23 | - | ||
| 24 | -<style lang="less" scoped> | ||
| 25 | -.btn { | ||
| 26 | - width: 100%; | ||
| 27 | - background: #fff; | ||
| 28 | - position: fixed; | ||
| 29 | - bottom: 0; | ||
| 30 | - left: 0; | ||
| 31 | - z-index: 100; | ||
| 32 | - &>div { | ||
| 33 | - padding: 6px 10px; | ||
| 34 | - .default-btn { | ||
| 35 | - width: 100%; | ||
| 36 | - height: 38px; | ||
| 37 | - background: #89a9cf!important; | ||
| 38 | - color: #fff!important; | ||
| 39 | - font-size: 16px; | ||
| 40 | - &:after { | ||
| 41 | - border: 1px solid #89a9cf!important; | ||
| 42 | - } | ||
| 43 | - } | ||
| 44 | - } | ||
| 45 | -} | ||
| 46 | -</style> |
| 1 | -<template> | ||
| 2 | - <div> | ||
| 3 | - <div class="btn"> | ||
| 4 | - <div> | ||
| 5 | - <x-button class="default-btn continue" @click.native="leftClick">{{leftText}}</x-button> | ||
| 6 | - <x-button class="default-btn" @click.native="rightClick">{{rightText}}</x-button> | ||
| 7 | - </div> | ||
| 8 | - </div> | ||
| 9 | - </div> | ||
| 10 | -</template> | ||
| 11 | -<script> | ||
| 12 | -import { XButton } from 'vux' | ||
| 13 | -export default { | ||
| 14 | - props: ['leftText', 'rightText'], | ||
| 15 | - components: {XButton}, | ||
| 16 | - methods: { | ||
| 17 | - leftClick () { | ||
| 18 | - this.$emit('leftClick') | ||
| 19 | - }, | ||
| 20 | - rightClick () { | ||
| 21 | - this.$emit('rightClick') | ||
| 22 | - } | ||
| 23 | - } | ||
| 24 | -} | ||
| 25 | -</script> | ||
| 26 | -<style lang="less" scoped> | ||
| 27 | - .btn { | ||
| 28 | - width: 100%; | ||
| 29 | - background: #fff; | ||
| 30 | - position: fixed; | ||
| 31 | - bottom: 0; | ||
| 32 | - left: 0; | ||
| 33 | - z-index: 100; | ||
| 34 | - &>div { | ||
| 35 | - display: flex; | ||
| 36 | - display: -webkit-flex; | ||
| 37 | - // align-content: center; | ||
| 38 | - justify-content: space-between; | ||
| 39 | - padding: 6px 10px; | ||
| 40 | - .default-btn { | ||
| 41 | - width: 49%; | ||
| 42 | - height: 38px; | ||
| 43 | - background: #89a9cf!important; | ||
| 44 | - margin: 0; | ||
| 45 | - color: #fff!important; | ||
| 46 | - font-size: 16px; | ||
| 47 | - &.continue { | ||
| 48 | - background-color: #fff!important; | ||
| 49 | - color: #89a9cf!important; | ||
| 50 | - &:after { | ||
| 51 | - width: 199%; | ||
| 52 | - border: 1px solid #89a9cf!important; | ||
| 53 | - } | ||
| 54 | - } | ||
| 55 | - } | ||
| 56 | - } | ||
| 57 | - } | ||
| 58 | -</style> |
src/components/button/demo.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div style="padding: 20px"> | ||
| 3 | - <x-button disabled class="disbaled-btn">确定disabled</x-button> | ||
| 4 | - <x-button class="default-btn">确定default</x-button> | ||
| 5 | - <x-button class="active-btn">确定active</x-button> | ||
| 6 | - <divider> line </divider> | ||
| 7 | - <flexbox> | ||
| 8 | - <flexbox-item><x-button plain class="line-btn">关闭</x-button></flexbox-item> | ||
| 9 | - <flexbox-item><x-button plain class="default-btn">确定</x-button></flexbox-item> | ||
| 10 | - </flexbox> | ||
| 11 | - <divider> line </divider> | ||
| 12 | - <x-button mini plain class="line-btn">选好了</x-button> | ||
| 13 | - </div> | ||
| 14 | -</template> | ||
| 15 | - | ||
| 16 | -<script> | ||
| 17 | -import { Flexbox, FlexboxItem, XButton, Divider } from 'vux' | ||
| 18 | -export default { | ||
| 19 | - components: { | ||
| 20 | - Divider, | ||
| 21 | - Flexbox, | ||
| 22 | - FlexboxItem, | ||
| 23 | - XButton | ||
| 24 | - } | ||
| 25 | -} | ||
| 26 | -</script> | ||
| 27 | - | ||
| 28 | -<style lang="less"> | ||
| 29 | -.disbaled-btn { | ||
| 30 | - border: 1px solid #dbdce0; | ||
| 31 | - background: #ebeef7; | ||
| 32 | - color: #c8cbd0 | ||
| 33 | -} | ||
| 34 | -.default-btn { | ||
| 35 | - background: #86aace!important; | ||
| 36 | - border: 1px solid #86aace!important; | ||
| 37 | - color: #fff!important; | ||
| 38 | -} | ||
| 39 | -.active-btn { | ||
| 40 | - border: 1px solid #86aace!important; | ||
| 41 | - background: #697f9f!important; | ||
| 42 | - color: #fff!important; | ||
| 43 | -} | ||
| 44 | -.line-btn { | ||
| 45 | - border: 1px solid #8aa0b4!important; | ||
| 46 | - color: #8298b4!important; | ||
| 47 | -} | ||
| 48 | -</style> |
src/components/button/inlineBtn.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - | ||
| 3 | - <div class=""> | ||
| 4 | - <div v-if="type === 'enable'" class="set-enable-btn"> | ||
| 5 | - <slot></slot> | ||
| 6 | - </div> | ||
| 7 | - <div v-if="type === 'unable'" class="un-set-btn"> | ||
| 8 | - <slot></slot> | ||
| 9 | - </div> | ||
| 10 | - </div> | ||
| 11 | -</template> | ||
| 12 | - | ||
| 13 | -<script> | ||
| 14 | -export default { | ||
| 15 | - props: ['type'] | ||
| 16 | -} | ||
| 17 | -</script> | ||
| 18 | - | ||
| 19 | -<style lang="less"> | ||
| 20 | - .set-enable-btn { | ||
| 21 | - color: #8EA8CF; | ||
| 22 | - background-color: #FFFFFF; | ||
| 23 | - text-align: center; | ||
| 24 | - margin: 0.5rem 1rem; | ||
| 25 | - padding: 0.5rem 0; | ||
| 26 | - border-radius: .2rem; | ||
| 27 | - font-size: .85rem; | ||
| 28 | - border: 1px solid #8EA8CF; | ||
| 29 | - } | ||
| 30 | - .un-set-btn { | ||
| 31 | - color: white; | ||
| 32 | - background-color: #8EA8CF; | ||
| 33 | - text-align: center; | ||
| 34 | - margin: 0.5rem 1rem; | ||
| 35 | - padding: 0.5rem 0; | ||
| 36 | - border-radius: .2rem; | ||
| 37 | - font-size: .85rem; | ||
| 38 | - } | ||
| 39 | -</style> |
src/components/cellSwiper/demo.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <cell-swiper :list="list" @clickItem="clickItem" @editItem="editItem" @deleteItem="deleteItem"></cell-swiper> | ||
| 4 | - </div> | ||
| 5 | -</template> | ||
| 6 | - | ||
| 7 | -<script> | ||
| 8 | -import cellSwiper from 'components/cellSwiper/index' | ||
| 9 | - | ||
| 10 | -export default { | ||
| 11 | - components: {cellSwiper}, | ||
| 12 | - data () { | ||
| 13 | - return { | ||
| 14 | - list: [ | ||
| 15 | - { | ||
| 16 | - id: '01', | ||
| 17 | - title: 'item1' | ||
| 18 | - }, | ||
| 19 | - { | ||
| 20 | - id: '02', | ||
| 21 | - title: 'item2' | ||
| 22 | - }, | ||
| 23 | - { | ||
| 24 | - id: '03', | ||
| 25 | - title: 'item3' | ||
| 26 | - }, | ||
| 27 | - { | ||
| 28 | - id: '04', | ||
| 29 | - title: 'item4' | ||
| 30 | - } | ||
| 31 | - ] | ||
| 32 | - } | ||
| 33 | - }, | ||
| 34 | - methods: { | ||
| 35 | - clickItem (id) { | ||
| 36 | - console.warn(id); | ||
| 37 | - }, | ||
| 38 | - editItem (id) { | ||
| 39 | - console.warn(id); | ||
| 40 | - }, | ||
| 41 | - deleteItem (id) { | ||
| 42 | - console.warn(id); | ||
| 43 | - } | ||
| 44 | - } | ||
| 45 | -} | ||
| 46 | -</script> | ||
| 47 | - | ||
| 48 | -<style lang="less"> | ||
| 49 | -</style> |
src/components/cellSwiper/index.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class="container"> | ||
| 3 | - <ul> | ||
| 4 | - <li class="list-item " v-for="(item,index) in list " data-type="0"> | ||
| 5 | - <div class="list-box" @touchstart.capture="touchStart" @touchend.capture="touchEnd" @click="clickItem($event, item)" :data-id="item.id"> | ||
| 6 | - <div class="list-content"> | ||
| 7 | - <p class="title">{{item.title}}</p> | ||
| 8 | - </div> | ||
| 9 | - </div> | ||
| 10 | - <div class="edit" @click="editItem($event, item)" :data-index="index" :data-id="item.id">修 改</div> | ||
| 11 | - <div class="delete" @click="deleteItem" :data-index="index" :data-id="item.id">删 除</div> | ||
| 12 | - </li> | ||
| 13 | - </ul> | ||
| 14 | - </div> | ||
| 15 | -</template> | ||
| 16 | - | ||
| 17 | -<script> | ||
| 18 | -/** | ||
| 19 | - * [list 左滑修改删除列表] | ||
| 20 | - * @type {Array} | ||
| 21 | - * @field {id, title} | ||
| 22 | - * | ||
| 23 | - * [clickItem 点击表单项回调, 返回 index] | ||
| 24 | - * @type {Function} | ||
| 25 | - * @callback {index} | ||
| 26 | - * | ||
| 27 | - * [editItem 左滑点击表单编辑回调, 返回 index]] | ||
| 28 | - * @type {Function} | ||
| 29 | - * @callback {index} | ||
| 30 | - * | ||
| 31 | - * [deleteItem 左滑点击表单删除回调, 返回 index]] | ||
| 32 | - * @type {Function} | ||
| 33 | - * @callback {index} | ||
| 34 | - */ | ||
| 35 | -export default{ | ||
| 36 | - name: 'index', | ||
| 37 | - props: ['list'], | ||
| 38 | - data () { | ||
| 39 | - return { | ||
| 40 | - startX: 0, | ||
| 41 | - endX: 0 | ||
| 42 | - } | ||
| 43 | - }, | ||
| 44 | - methods: { | ||
| 45 | - // 跳转 | ||
| 46 | - clickItem (e, item) { | ||
| 47 | - if (this.checkSlide()) { | ||
| 48 | - this.restSlide(); | ||
| 49 | - } else { | ||
| 50 | - // 当前ID | ||
| 51 | - let id = e.currentTarget.dataset.id; | ||
| 52 | - this.$emit('clickItem', id, item) | ||
| 53 | - } | ||
| 54 | - }, | ||
| 55 | - // 滑动开始 | ||
| 56 | - touchStart (e) { | ||
| 57 | - // 记录初始位置 | ||
| 58 | - this.startX = e.touches[0].clientX; | ||
| 59 | - }, | ||
| 60 | - // 滑动结束 | ||
| 61 | - touchEnd (e) { | ||
| 62 | - // 当前滑动的父级元素 | ||
| 63 | - let parentElement = e.currentTarget.parentElement; | ||
| 64 | - // 记录结束位置 | ||
| 65 | - this.endX = e.changedTouches[0].clientX; | ||
| 66 | - | ||
| 67 | - // 左滑 | ||
| 68 | - if (parentElement.dataset.type == 0 && this.startX - this.endX > 30) { | ||
| 69 | - this.restSlide(); | ||
| 70 | - parentElement.dataset.type = 1; | ||
| 71 | - } | ||
| 72 | - | ||
| 73 | - // 右滑 | ||
| 74 | - if (parentElement.dataset.type == 1 && this.startX - this.endX < -30) { | ||
| 75 | - this.restSlide(); | ||
| 76 | - parentElement.dataset.type = 0; | ||
| 77 | - } | ||
| 78 | - | ||
| 79 | - this.startX = 0; | ||
| 80 | - this.endX = 0; | ||
| 81 | - }, | ||
| 82 | - // 判断当前是否有滑块处于滑动状态 | ||
| 83 | - checkSlide () { | ||
| 84 | - let listItems = document.querySelectorAll('.list-item'); | ||
| 85 | - | ||
| 86 | - for (let i = 0; i < listItems.length; i++) { | ||
| 87 | - if (listItems[i].dataset.type == 1) { | ||
| 88 | - return true; | ||
| 89 | - } | ||
| 90 | - } | ||
| 91 | - return false; | ||
| 92 | - }, | ||
| 93 | - // 复位滑动状态 | ||
| 94 | - restSlide () { | ||
| 95 | - let listItems = document.querySelectorAll('.list-item'); | ||
| 96 | - // 复位 | ||
| 97 | - for (let i = 0; i < listItems.length; i++) { | ||
| 98 | - listItems[i].dataset.type = 0; | ||
| 99 | - } | ||
| 100 | - }, | ||
| 101 | - // 删除 | ||
| 102 | - deleteItem (e) { | ||
| 103 | - // 当前索引 | ||
| 104 | - let index = e.currentTarget.dataset.index; | ||
| 105 | - // 复位 | ||
| 106 | - this.restSlide(); | ||
| 107 | - // 删除 | ||
| 108 | - // this.list.splice(index, 1); | ||
| 109 | - // 当前ID | ||
| 110 | - // let id = e.currentTarget.dataset.id; | ||
| 111 | - this.$emit('deleteItem', index) | ||
| 112 | - }, | ||
| 113 | - // 修改 | ||
| 114 | - editItem (e, item) { | ||
| 115 | - // 当前索引 | ||
| 116 | - let id = e.currentTarget.dataset.id; | ||
| 117 | - // 复位 | ||
| 118 | - this.restSlide(); | ||
| 119 | - // 当前ID | ||
| 120 | - this.$emit('editItem', id, item) | ||
| 121 | - } | ||
| 122 | - } | ||
| 123 | -} | ||
| 124 | -</script> | ||
| 125 | - | ||
| 126 | -<style scoped> | ||
| 127 | -.page-title{ | ||
| 128 | - text-align: center; | ||
| 129 | - font-size: 17px; | ||
| 130 | - padding: 10px 15px; | ||
| 131 | - position: relative; | ||
| 132 | -} | ||
| 133 | -.page-title:after{ | ||
| 134 | - content: " "; | ||
| 135 | - position: absolute; | ||
| 136 | - left: 0; | ||
| 137 | - bottom: 0; | ||
| 138 | - right: 0; | ||
| 139 | - height: 1px; | ||
| 140 | - border-bottom: 1px solid #ccc; | ||
| 141 | - color: #ccc; | ||
| 142 | - -webkit-transform-origin: 0 100%; | ||
| 143 | - transform-origin: 0 100%; | ||
| 144 | - -webkit-transform: scaleY(0.5); | ||
| 145 | - transform: scaleY(0.5); | ||
| 146 | - z-index: 2; | ||
| 147 | -} | ||
| 148 | -.list-item{ | ||
| 149 | - position: relative; | ||
| 150 | - height: 3.5rem; | ||
| 151 | - -webkit-transition: all 0.2s; | ||
| 152 | - transition: all 0.2s; | ||
| 153 | -} | ||
| 154 | -.list-item[data-type="0"]{ | ||
| 155 | - transform: translate3d(0,0,0); | ||
| 156 | -} | ||
| 157 | -.list-item[data-type="1"]{ | ||
| 158 | - transform: translate3d(-12rem,0,0); | ||
| 159 | -} | ||
| 160 | -.list-item:after{ | ||
| 161 | - content: " "; | ||
| 162 | - position: absolute; | ||
| 163 | - /* left: 0.6rem; */ | ||
| 164 | - left: 0rem; | ||
| 165 | - bottom: 0; | ||
| 166 | - right: 0; | ||
| 167 | - height: 1px; | ||
| 168 | - border-bottom: 1px solid #ebeaee; | ||
| 169 | - color: #ccc; | ||
| 170 | - -webkit-transform-origin: 0 100%; | ||
| 171 | - transform-origin: 0 100%; | ||
| 172 | - -webkit-transform: scaleY(0.5); | ||
| 173 | - transform: scaleY(0.5); | ||
| 174 | - z-index: 2; | ||
| 175 | -} | ||
| 176 | -.list-box{ | ||
| 177 | - padding: 0.6rem; | ||
| 178 | - background: #fff; | ||
| 179 | - display: flex; | ||
| 180 | - align-items: center; | ||
| 181 | - -webkit-box-sizing: border-box; | ||
| 182 | - box-sizing: border-box; | ||
| 183 | - justify-content: flex-end; | ||
| 184 | - position: absolute; | ||
| 185 | - top: 0; | ||
| 186 | - right: 0; | ||
| 187 | - bottom: 0; | ||
| 188 | - left: 0; | ||
| 189 | - font-size: 0; | ||
| 190 | -} | ||
| 191 | -.list-item .list-img{ | ||
| 192 | - display: block; | ||
| 193 | - width: 3rem; | ||
| 194 | - height: 3rem; | ||
| 195 | -} | ||
| 196 | -.list-item .list-content{ | ||
| 197 | - padding: 0.3rem 0 0.3rem 0.6rem; | ||
| 198 | - position: relative; | ||
| 199 | - flex: 1; | ||
| 200 | - flex-direction: column; | ||
| 201 | - align-items: flex-start; | ||
| 202 | - justify-content: center; | ||
| 203 | - overflow: hidden; | ||
| 204 | -} | ||
| 205 | -.list-item .title{ | ||
| 206 | - display: block; | ||
| 207 | - color: #333; | ||
| 208 | - overflow: hidden; | ||
| 209 | - font-size: 15px; | ||
| 210 | - font-weight: bold; | ||
| 211 | - text-overflow: ellipsis; | ||
| 212 | - white-space: nowrap; | ||
| 213 | -} | ||
| 214 | -.list-item .tips{ | ||
| 215 | - display: block; | ||
| 216 | - overflow: hidden; | ||
| 217 | - font-size: 12px; | ||
| 218 | - color: #999; | ||
| 219 | - line-height: 20px; | ||
| 220 | - text-overflow: ellipsis; | ||
| 221 | - white-space: nowrap; | ||
| 222 | -} | ||
| 223 | -.list-item .time{ | ||
| 224 | - display: block; | ||
| 225 | - font-size: 12px; | ||
| 226 | - position: absolute; | ||
| 227 | - right: 0; | ||
| 228 | - top: 0.3rem; | ||
| 229 | - color: #666; | ||
| 230 | -} | ||
| 231 | -.list-item .delete{ | ||
| 232 | - width: 6rem; | ||
| 233 | - height: 3.5rem; | ||
| 234 | - background: #fc6621; | ||
| 235 | - font-size: 17px; | ||
| 236 | - color: #fff; | ||
| 237 | - text-align: center; | ||
| 238 | - line-height: 3.5rem; | ||
| 239 | - position: absolute; | ||
| 240 | - top:0; | ||
| 241 | - right: -12rem; | ||
| 242 | -} | ||
| 243 | -.list-item .edit{ | ||
| 244 | - width: 6rem; | ||
| 245 | - height: 3.5rem; | ||
| 246 | - background: #f0eff5; | ||
| 247 | - font-size: 17px; | ||
| 248 | - color: #000; | ||
| 249 | - text-align: center; | ||
| 250 | - line-height: 3.5rem; | ||
| 251 | - position: absolute; | ||
| 252 | - top:0; | ||
| 253 | - right: -6.1rem; | ||
| 254 | - border-left: 1px solid #ebeaee; | ||
| 255 | -} | ||
| 256 | -</style> |
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <checker type="checkbox" @on-change="checkerChange" v-model="checkedValue" default-item-class="checklist-item" selected-item-class="checklist-item-selected"> | ||
| 4 | - <checker-item :value="item" v-for="(item, index) in options" :key="index"><i></i><span>{{item.value}}</span></checker-item> | ||
| 5 | - </checker> | ||
| 6 | - </div> | ||
| 7 | -</template> | ||
| 8 | - | ||
| 9 | -<script> | ||
| 10 | -import { Checker, CheckerItem, TransferDom } from 'vux' | ||
| 11 | -export default { | ||
| 12 | - directives: { | ||
| 13 | - TransferDom | ||
| 14 | - }, | ||
| 15 | - components: { | ||
| 16 | - Checker, | ||
| 17 | - CheckerItem | ||
| 18 | - }, | ||
| 19 | - data () { | ||
| 20 | - return { | ||
| 21 | - checkedValue: [ | ||
| 22 | - { | ||
| 23 | - key: '1', | ||
| 24 | - value: '白' | ||
| 25 | - } | ||
| 26 | - ], | ||
| 27 | - options: [ | ||
| 28 | - { | ||
| 29 | - key: '1', | ||
| 30 | - value: '白' | ||
| 31 | - }, | ||
| 32 | - { | ||
| 33 | - key: '2', | ||
| 34 | - value: '富' | ||
| 35 | - }, | ||
| 36 | - { | ||
| 37 | - key: '3', | ||
| 38 | - value: '美' | ||
| 39 | - } | ||
| 40 | - ] | ||
| 41 | - } | ||
| 42 | - }, | ||
| 43 | - methods: { | ||
| 44 | - checkerChange (val) { | ||
| 45 | - console.warn(val); | ||
| 46 | - } | ||
| 47 | - } | ||
| 48 | -} | ||
| 49 | -</script> | ||
| 50 | - | ||
| 51 | -<style lang="less" scoped> | ||
| 52 | -.checklist-item { | ||
| 53 | - margin-right: 15px; | ||
| 54 | - span { | ||
| 55 | - display: inline-block; | ||
| 56 | - vertical-align: middle; | ||
| 57 | - } | ||
| 58 | - i { | ||
| 59 | - display: inline-block; | ||
| 60 | - width: 1rem; | ||
| 61 | - height: 1rem; | ||
| 62 | - background-size: cover; | ||
| 63 | - background-image: url(../../assets/unchecked.png); | ||
| 64 | - vertical-align: middle; | ||
| 65 | - margin-right: 0.5rem; | ||
| 66 | - } | ||
| 67 | -} | ||
| 68 | -.checklist-item-selected { | ||
| 69 | - i { | ||
| 70 | - background-image: url(../../assets/checked.png) | ||
| 71 | - } | ||
| 72 | -} | ||
| 73 | -</style> |
src/components/checkBox/check.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <checker type="checkbox" @on-change="checkerChange" v-model="checkValue" default-item-class="checklist-item" selected-item-class="checklist-item-selected"> | ||
| 4 | - <checker-item :value="item.key" v-for="(item, index) in options" :key="index"><i></i><span>{{item.value}}</span></checker-item> | ||
| 5 | - </checker> | ||
| 6 | - </div> | ||
| 7 | -</template> | ||
| 8 | - | ||
| 9 | -<script> | ||
| 10 | -import { Checker, CheckerItem, TransferDom } from 'vux' | ||
| 11 | -export default { | ||
| 12 | - directives: { | ||
| 13 | - TransferDom | ||
| 14 | - }, | ||
| 15 | - components: { | ||
| 16 | - Checker, | ||
| 17 | - CheckerItem | ||
| 18 | - }, | ||
| 19 | - data () { | ||
| 20 | - return { | ||
| 21 | - checkValue: '' | ||
| 22 | - } | ||
| 23 | - }, | ||
| 24 | - methods: { | ||
| 25 | - checkerChange (val) { | ||
| 26 | - this.$emit('change', val) | ||
| 27 | - } | ||
| 28 | - } | ||
| 29 | -} | ||
| 30 | -</script> | ||
| 31 | - | ||
| 32 | -<style lang="less" scoped> | ||
| 33 | -.checklist-item { | ||
| 34 | - margin-right: 15px; | ||
| 35 | - span { | ||
| 36 | - display: inline-block; | ||
| 37 | - vertical-align: middle; | ||
| 38 | - } | ||
| 39 | - i { | ||
| 40 | - display: inline-block; | ||
| 41 | - width: 1.2rem; | ||
| 42 | - height: 1.2rem; | ||
| 43 | - background-size: cover; | ||
| 44 | - background-image: url(../../assets/unchecked.png); | ||
| 45 | - vertical-align: middle; | ||
| 46 | - margin-right: 0.5rem; | ||
| 47 | - } | ||
| 48 | -} | ||
| 49 | -.checklist-item-selected { | ||
| 50 | - i { | ||
| 51 | - background-image: url(../../assets/checked.png) | ||
| 52 | - } | ||
| 53 | -} | ||
| 54 | -</style> |
src/components/checkBox/demo.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <div class="check-head" style="margin: 0 0 0 10px"> | ||
| 4 | - <check-all :value.sync="isAll" @click.native="selectAll(isAll)">全部商品</check-all> | ||
| 5 | - <p style="display: inline-block"> | ||
| 6 | - (<span style="color: #8fb5de">{{currSum}}</span>/<span>{{totalSum}}</span>) | ||
| 7 | - </p> | ||
| 8 | - </div> | ||
| 9 | - <demo | ||
| 10 | - @listChange="listCheckerChange" | ||
| 11 | - v-for="item in data" | ||
| 12 | - :id="item.id" | ||
| 13 | - :name="item.name" | ||
| 14 | - :key="item.id" | ||
| 15 | - :list="item.list" | ||
| 16 | - :isCheckAll="item.isCheck" | ||
| 17 | - :currItemCount="item.currItemCount" | ||
| 18 | - :itemTotal="item.itemTotal" | ||
| 19 | - :listCount="testCount"></demo> | ||
| 20 | - </div> | ||
| 21 | -</template> | ||
| 22 | - | ||
| 23 | -<script> | ||
| 24 | -import Demo from 'components/checkBox/index' | ||
| 25 | -import CheckAll from 'components/isCheckAll/index' | ||
| 26 | -export default { | ||
| 27 | - components: { Demo, CheckAll }, | ||
| 28 | - data () { | ||
| 29 | - return { | ||
| 30 | - testCount: null, | ||
| 31 | - isAll: false, | ||
| 32 | - currSum: 0, | ||
| 33 | - totalSum: null, | ||
| 34 | - data: [ | ||
| 35 | - { | ||
| 36 | - isCheck: true, | ||
| 37 | - id: '123a', | ||
| 38 | - name: '蔬菜类', | ||
| 39 | - currItemCount: 0, | ||
| 40 | - itemTotal: 4, | ||
| 41 | - list: [ | ||
| 42 | - { | ||
| 43 | - key: '1', | ||
| 44 | - value: '什锦冷菜' | ||
| 45 | - }, | ||
| 46 | - { | ||
| 47 | - key: '2', | ||
| 48 | - value: '经典冷盘甜小菜心太软' | ||
| 49 | - }, | ||
| 50 | - { | ||
| 51 | - key: '3', | ||
| 52 | - value: '凉拌黑木耳' | ||
| 53 | - }, | ||
| 54 | - { | ||
| 55 | - key: '4', | ||
| 56 | - value: '私房飘香酱牛肉' | ||
| 57 | - } | ||
| 58 | - ] | ||
| 59 | - }, | ||
| 60 | - { | ||
| 61 | - isCheck: false, | ||
| 62 | - id: '852a', | ||
| 63 | - name: '肉类', | ||
| 64 | - currItemCount: 0, | ||
| 65 | - itemTotal: 5, | ||
| 66 | - list: [ | ||
| 67 | - { | ||
| 68 | - key: 'b', | ||
| 69 | - value: '咸水鸭', | ||
| 70 | - isSelected: true | ||
| 71 | - }, | ||
| 72 | - { | ||
| 73 | - key: 'c', | ||
| 74 | - value: '酱香牛肉' | ||
| 75 | - }, | ||
| 76 | - { | ||
| 77 | - key: 'd', | ||
| 78 | - value: '羊肉' | ||
| 79 | - }, | ||
| 80 | - { | ||
| 81 | - key: 'e', | ||
| 82 | - value: '凉拌猪耳朵' | ||
| 83 | - }, | ||
| 84 | - { | ||
| 85 | - key: 'g', | ||
| 86 | - value: '海蜇头' | ||
| 87 | - } | ||
| 88 | - ] | ||
| 89 | - } | ||
| 90 | - ] | ||
| 91 | - } | ||
| 92 | - }, | ||
| 93 | - mounted () { | ||
| 94 | - this.totalSum = _.sum(_.map(this.data, 'itemTotal')) | ||
| 95 | - }, | ||
| 96 | - methods: { | ||
| 97 | - selectAll (val) { | ||
| 98 | - console.warn(val); | ||
| 99 | - }, | ||
| 100 | - listCheckerChange (val) { | ||
| 101 | - this.testCount = val.length | ||
| 102 | - // console.warn(this.testCount); | ||
| 103 | - } | ||
| 104 | - } | ||
| 105 | -} | ||
| 106 | -</script> | ||
| 107 | - | ||
| 108 | -<style lang="css"> | ||
| 109 | -</style> |
src/components/checkBox/index.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div> | ||
| 3 | - <div class="dash-line"> | ||
| 4 | - <span></span> | ||
| 5 | - </div> | ||
| 6 | - <div class="check-head" style="margin: 0 0 10px 15px"> | ||
| 7 | - <check-all :value.sync="checkAll" @click.native="checkAllClick(checkAll)">{{ name }}</check-all> | ||
| 8 | - <p style="display: inline-block"> | ||
| 9 | - (<span style="color: #8fb5de">{{currCount}}</span>/<span>{{currTotal}}</span>) | ||
| 10 | - </p> | ||
| 11 | - </div> | ||
| 12 | - <checker | ||
| 13 | - v-model="checkValue" | ||
| 14 | - type="checkbox" | ||
| 15 | - default-item-class="check-item" | ||
| 16 | - disabled-item-class="check-item-disabled" | ||
| 17 | - selected-item-class="check-item-selected" | ||
| 18 | - @on-change="checkerChange" | ||
| 19 | - class="check-item-wrap-self"> | ||
| 20 | - <checker-item | ||
| 21 | - v-for="(item, index) in list" | ||
| 22 | - :key="index" | ||
| 23 | - :value="item.key" | ||
| 24 | - v-if="!item.disabled" | ||
| 25 | - :disabled="item.disabled">{{item.value}}</checker-item> | ||
| 26 | - </checker> | ||
| 27 | - </div> | ||
| 28 | -</template> | ||
| 29 | - | ||
| 30 | -<script> | ||
| 31 | -import { Checker, CheckerItem, CheckIcon, TransferDom } from 'vux' | ||
| 32 | -import CheckAll from 'components/isCheckAll/index' | ||
| 33 | -export default { | ||
| 34 | - props: ['list', 'id', 'name', 'currItemCount', 'itemTotal', 'isCheckAll', 'listCount'], | ||
| 35 | - directives: { | ||
| 36 | - TransferDom | ||
| 37 | - }, | ||
| 38 | - components: { | ||
| 39 | - Checker, | ||
| 40 | - CheckerItem, | ||
| 41 | - CheckIcon, | ||
| 42 | - CheckAll | ||
| 43 | - }, | ||
| 44 | - data () { | ||
| 45 | - return { | ||
| 46 | - checkValue: '', | ||
| 47 | - currCount: this.currItemCount, | ||
| 48 | - currTotal: this.itemTotal, | ||
| 49 | - checkAll: this.isCheckAll | ||
| 50 | - } | ||
| 51 | - }, | ||
| 52 | - mounted () { | ||
| 53 | - if (this.isCheckAll) { | ||
| 54 | - this.checkValue = _.map(this.list, 'key') | ||
| 55 | - this.checkAll = true; | ||
| 56 | - this.currCount = this.checkValue.length | ||
| 57 | - } else { | ||
| 58 | - this.checkValue = this.filterKeys(this.list) | ||
| 59 | - this.checkAll = false; | ||
| 60 | - this.currCount = 0 | ||
| 61 | - } | ||
| 62 | - }, | ||
| 63 | - watch: { | ||
| 64 | - currItemCount (val) { | ||
| 65 | - this.currCount = val | ||
| 66 | - }, | ||
| 67 | - itemTotal (val) { | ||
| 68 | - this.currTotal = val | ||
| 69 | - }, | ||
| 70 | - isCheckAll (val) { | ||
| 71 | - this.checkAll = val | ||
| 72 | - } | ||
| 73 | - }, | ||
| 74 | - methods: { | ||
| 75 | - filterKeys (arr) { | ||
| 76 | - let lists = []; | ||
| 77 | - _(arr).each(function (item) { | ||
| 78 | - if (item.isSelected && item.isSelected === true) { | ||
| 79 | - lists.push(item.key) | ||
| 80 | - } | ||
| 81 | - }) | ||
| 82 | - return lists | ||
| 83 | - }, | ||
| 84 | - checkAllClick (val) { | ||
| 85 | - if (val) { | ||
| 86 | - this.checkValue = _.map(this.list, 'key') | ||
| 87 | - this.checkAll = true; | ||
| 88 | - this.currCount = this.checkValue.length | ||
| 89 | - } else { | ||
| 90 | - this.checkValue = [] | ||
| 91 | - this.checkAll = false; | ||
| 92 | - this.currCount = 0 | ||
| 93 | - } | ||
| 94 | - }, | ||
| 95 | - checkerChange (value) { | ||
| 96 | - let checkedCount = value.length; | ||
| 97 | - this.currCount = checkedCount | ||
| 98 | - this.checkAll = checkedCount === this.list.length; | ||
| 99 | - this.$emit('listChange', value) | ||
| 100 | - } | ||
| 101 | - } | ||
| 102 | -} | ||
| 103 | -</script> | ||
| 104 | - | ||
| 105 | -<style lang="less" scoped> | ||
| 106 | -.dash-line { | ||
| 107 | - padding: 0.6rem 0; | ||
| 108 | - span{ | ||
| 109 | - display: block; | ||
| 110 | - width: 100%; | ||
| 111 | - border-bottom: 1px dashed #d9d9db; | ||
| 112 | - } | ||
| 113 | -} | ||
| 114 | -.checklist-item { | ||
| 115 | - span { | ||
| 116 | - display: inline-block; | ||
| 117 | - width: 1.2rem; | ||
| 118 | - height: 1.2rem; | ||
| 119 | - background-size: cover; | ||
| 120 | - background-image: url(../../assets/unchecked.png); | ||
| 121 | - vertical-align: middle; | ||
| 122 | - margin-right: 0.5rem; | ||
| 123 | - } | ||
| 124 | -} | ||
| 125 | -.checklist-item-selected { | ||
| 126 | - span { | ||
| 127 | - background-image: url(../../assets/checked.png) | ||
| 128 | - } | ||
| 129 | -} | ||
| 130 | -.check-item { | ||
| 131 | - background: #f6f6f6; | ||
| 132 | - color: #333; | ||
| 133 | - padding: 0.4rem; | ||
| 134 | - border-radius: 0.4rem; | ||
| 135 | - margin: 0.4rem | ||
| 136 | -} | ||
| 137 | -.check-item-disabled { | ||
| 138 | - background: #eaeff7; | ||
| 139 | - color: #ccc; | ||
| 140 | -} | ||
| 141 | -.check-item-selected { | ||
| 142 | - background: #c4d4e7; | ||
| 143 | - color: #2c426b; | ||
| 144 | -} | ||
| 145 | -</style> |
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <checker radio-required @on-change="checkerChange" v-model="checkedValue" default-item-class="radio-item" selected-item-class="radio-item-selected"> | ||
| 4 | - <checker-item :value="item.key" v-for="(item, index) in options" :key="index"><i></i><span>{{item.value}}</span></checker-item> | ||
| 5 | - </checker> | ||
| 6 | - </div> | ||
| 7 | -</template> | ||
| 8 | - | ||
| 9 | -<script> | ||
| 10 | -import { Checker, CheckerItem, TransferDom } from 'vux' | ||
| 11 | -export default { | ||
| 12 | - directives: { | ||
| 13 | - TransferDom | ||
| 14 | - }, | ||
| 15 | - components: { | ||
| 16 | - Checker, | ||
| 17 | - CheckerItem | ||
| 18 | - }, | ||
| 19 | - data () { | ||
| 20 | - return { | ||
| 21 | - checkedValue: '1', | ||
| 22 | - options: [ | ||
| 23 | - { | ||
| 24 | - key: '1', | ||
| 25 | - value: '白' | ||
| 26 | - }, | ||
| 27 | - { | ||
| 28 | - key: '2', | ||
| 29 | - value: '富' | ||
| 30 | - }, | ||
| 31 | - { | ||
| 32 | - key: '3', | ||
| 33 | - value: '美' | ||
| 34 | - }, | ||
| 35 | - { | ||
| 36 | - key: '4', | ||
| 37 | - value: '潘' | ||
| 38 | - } | ||
| 39 | - ] | ||
| 40 | - } | ||
| 41 | - }, | ||
| 42 | - methods: { | ||
| 43 | - checkerChange (val) { | ||
| 44 | - console.warn(val); | ||
| 45 | - } | ||
| 46 | - } | ||
| 47 | -} | ||
| 48 | -</script> | ||
| 49 | - | ||
| 50 | -<style lang="less" scoped> | ||
| 51 | -.radio-item { | ||
| 52 | - margin-right: 15px; | ||
| 53 | - span { | ||
| 54 | - display: inline-block; | ||
| 55 | - vertical-align: middle; | ||
| 56 | - } | ||
| 57 | - i { | ||
| 58 | - display: inline-block; | ||
| 59 | - width: 1rem; | ||
| 60 | - height: 1rem; | ||
| 61 | - background-size: cover; | ||
| 62 | - background-image: url(../../assets/unradio.png); | ||
| 63 | - vertical-align: middle; | ||
| 64 | - margin-right: 0.5rem; | ||
| 65 | - } | ||
| 66 | -} | ||
| 67 | -.radio-item-selected { | ||
| 68 | - i { | ||
| 69 | - background-image: url(../../assets/radio.png) | ||
| 70 | - } | ||
| 71 | -} | ||
| 72 | -</style> |
src/components/checkBox/radio.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <checker v-model="radioValue" radio-required default-item-class="radio-item" selected-item-class="radio-item-selected"> | ||
| 4 | - <checker-item value="1">hehe</checker-item> | ||
| 5 | - <checker-item value="2">haha</checker-item> | ||
| 6 | - </checker> | ||
| 7 | - </div> | ||
| 8 | -</template> | ||
| 9 | - | ||
| 10 | -<script> | ||
| 11 | -import { Checker, CheckerItem, TransferDom } from 'vux' | ||
| 12 | -export default { | ||
| 13 | - directives: { | ||
| 14 | - TransferDom | ||
| 15 | - }, | ||
| 16 | - components: { | ||
| 17 | - Checker, | ||
| 18 | - CheckerItem | ||
| 19 | - }, | ||
| 20 | - data () { | ||
| 21 | - return { | ||
| 22 | - radioValue: '' | ||
| 23 | - } | ||
| 24 | - } | ||
| 25 | -} | ||
| 26 | -</script> | ||
| 27 | - | ||
| 28 | -<style lang="less"> | ||
| 29 | -.radio-item { | ||
| 30 | - border: 1px solid #ececec; | ||
| 31 | - padding: 5px 15px; | ||
| 32 | -} | ||
| 33 | -.radio-item-selected { | ||
| 34 | - border: 1px solid green; | ||
| 35 | -} | ||
| 36 | -</style> |
| 1 | -<template lang="html"> | ||
| 2 | - <label> | ||
| 3 | - <input type="checkbox" :checked="shouldBeChecked" :value="value" @change="updateInput"> | ||
| 4 | - {{ label }} | ||
| 5 | - </label> | ||
| 6 | -</template> | ||
| 7 | -<script> | ||
| 8 | -export default { | ||
| 9 | - model: { | ||
| 10 | - prop: 'modelValue', | ||
| 11 | - event: 'change' | ||
| 12 | - }, | ||
| 13 | - props: { | ||
| 14 | - value: { | ||
| 15 | - type: String | ||
| 16 | - }, | ||
| 17 | - modelValue: { | ||
| 18 | - default: false | ||
| 19 | - }, | ||
| 20 | - label: { | ||
| 21 | - type: String, | ||
| 22 | - required: true | ||
| 23 | - }, | ||
| 24 | - trueValue: { | ||
| 25 | - default: true | ||
| 26 | - }, | ||
| 27 | - falseValue: { | ||
| 28 | - default: false | ||
| 29 | - } | ||
| 30 | - }, | ||
| 31 | - computed: { | ||
| 32 | - shouldBeChecked () { | ||
| 33 | - if (this.modelValue instanceof Array) { | ||
| 34 | - return this.modelValue.includes(this.value) | ||
| 35 | - } | ||
| 36 | - return this.modelValue === this.trueValue | ||
| 37 | - } | ||
| 38 | - }, | ||
| 39 | - methods: { | ||
| 40 | - updateInput (event) { | ||
| 41 | - let isChecked = event.target.checked | ||
| 42 | - | ||
| 43 | - if (this.modelValue instanceof Array) { | ||
| 44 | - let newValue = [...this.modelValue] | ||
| 45 | - | ||
| 46 | - if (isChecked) { | ||
| 47 | - newValue.push(this.value) | ||
| 48 | - } else { | ||
| 49 | - newValue.splice(newValue.indexOf(this.value), 1) | ||
| 50 | - } | ||
| 51 | - | ||
| 52 | - this.$emit('change', newValue) | ||
| 53 | - } else { | ||
| 54 | - this.$emit('change', isChecked ? this.trueValue : this.falseValue) | ||
| 55 | - } | ||
| 56 | - } | ||
| 57 | - } | ||
| 58 | -} | ||
| 59 | -</script> |
| 1 | -<template> | ||
| 2 | - <div class="selectbox"> | ||
| 3 | - <div class="selectall"> | ||
| 4 | - <div class="check-head" style="margin: 0 0 0 10px"> | ||
| 5 | - <check-all :value.sync="isAll" @click.native="selectAll(isAll)">全部商品</check-all> | ||
| 6 | - <p style="display: inline-block"> | ||
| 7 | - (<span style="color: #8fb5de">{{currSum}}</span>/<span>{{totalSum}}</span>) | ||
| 8 | - </p> | ||
| 9 | - </div> | ||
| 10 | - </div> | ||
| 11 | - <div | ||
| 12 | - class="selectlist" | ||
| 13 | - v-for="(item, index) in data" | ||
| 14 | - :key="item.id"> | ||
| 15 | - <div class="dash-line"> | ||
| 16 | - <span></span> | ||
| 17 | - </div> | ||
| 18 | - <div class="check-head" style="margin: 0 0 10px 15px"> | ||
| 19 | - <check-all :value.sync="item.isCheck" @click.native="checkAllClick(item.isCheck, index)">{{ item.name }}</check-all> | ||
| 20 | - <p style="display: inline-block"> | ||
| 21 | - (<span style="color: #8fb5de">{{item.currItemCount}}</span>/<span>{{item.currTotal}}</span>) | ||
| 22 | - </p> | ||
| 23 | - </div> | ||
| 24 | - <checker | ||
| 25 | - v-model="item.selectedList" | ||
| 26 | - type="checkbox" | ||
| 27 | - default-item-class="check-item" | ||
| 28 | - disabled-item-class="check-item-disabled" | ||
| 29 | - selected-item-class="check-item-selected" | ||
| 30 | - @on-change="checkerChange(item.selectedList, index)" | ||
| 31 | - class="check-item-wrap-self"> | ||
| 32 | - <checker-item | ||
| 33 | - v-for="(item, index) in item.list" | ||
| 34 | - :key="index" | ||
| 35 | - :value="item.key" | ||
| 36 | - v-if="!item.disabled" | ||
| 37 | - :disabled="item.disabled">{{item.value}}</checker-item> | ||
| 38 | - </checker> | ||
| 39 | - </div> | ||
| 40 | - </div> | ||
| 41 | -</template> | ||
| 42 | - | ||
| 43 | -<script> | ||
| 44 | -import { Checker, CheckerItem, CheckIcon, TransferDom } from 'vux' | ||
| 45 | -import CheckAll from 'components/isCheckAll/index' | ||
| 46 | -export default { | ||
| 47 | - directives: { | ||
| 48 | - TransferDom | ||
| 49 | - }, | ||
| 50 | - components: { | ||
| 51 | - Checker, | ||
| 52 | - CheckerItem, | ||
| 53 | - CheckIcon, | ||
| 54 | - CheckAll | ||
| 55 | - }, | ||
| 56 | - data () { | ||
| 57 | - return { | ||
| 58 | - isAll: false, | ||
| 59 | - currSum: 0, | ||
| 60 | - totalSum: 0, | ||
| 61 | - source: [ | ||
| 62 | - { | ||
| 63 | - isCheck: true, | ||
| 64 | - id: '123a', | ||
| 65 | - name: '蔬菜类', | ||
| 66 | - currItemCount: 0, | ||
| 67 | - itemTotal: 4, | ||
| 68 | - list: [ | ||
| 69 | - { | ||
| 70 | - key: '1', | ||
| 71 | - value: '什锦冷菜' | ||
| 72 | - }, | ||
| 73 | - { | ||
| 74 | - key: '2', | ||
| 75 | - value: '经典冷盘甜小菜心太软' | ||
| 76 | - }, | ||
| 77 | - { | ||
| 78 | - key: '3', | ||
| 79 | - value: '凉拌黑木耳' | ||
| 80 | - }, | ||
| 81 | - { | ||
| 82 | - key: '4', | ||
| 83 | - value: '私房飘香酱牛肉' | ||
| 84 | - } | ||
| 85 | - ] | ||
| 86 | - }, | ||
| 87 | - { | ||
| 88 | - isCheck: false, | ||
| 89 | - id: '852a', | ||
| 90 | - name: '肉类', | ||
| 91 | - currItemCount: 0, | ||
| 92 | - itemTotal: 5, | ||
| 93 | - list: [ | ||
| 94 | - { | ||
| 95 | - key: 'b', | ||
| 96 | - value: '咸水鸭', | ||
| 97 | - isSelected: true | ||
| 98 | - }, | ||
| 99 | - { | ||
| 100 | - key: 'c', | ||
| 101 | - value: '酱香牛肉' | ||
| 102 | - }, | ||
| 103 | - { | ||
| 104 | - key: 'd', | ||
| 105 | - value: '羊肉' | ||
| 106 | - }, | ||
| 107 | - { | ||
| 108 | - key: 'e', | ||
| 109 | - value: '凉拌猪耳朵' | ||
| 110 | - }, | ||
| 111 | - { | ||
| 112 | - key: 'g', | ||
| 113 | - value: '海蜇头' | ||
| 114 | - } | ||
| 115 | - ] | ||
| 116 | - } | ||
| 117 | - ], | ||
| 118 | - data: [ | ||
| 119 | - { | ||
| 120 | - isCheck: false, | ||
| 121 | - id: '123a', | ||
| 122 | - name: '蔬菜类', | ||
| 123 | - currItemCount: 2, | ||
| 124 | - currTotal: 4, | ||
| 125 | - selectedList: ['1', '2'], | ||
| 126 | - list: [ | ||
| 127 | - { | ||
| 128 | - key: '1', | ||
| 129 | - value: '什锦冷菜' | ||
| 130 | - }, | ||
| 131 | - { | ||
| 132 | - key: '2', | ||
| 133 | - value: '经典冷盘甜小菜心太软' | ||
| 134 | - }, | ||
| 135 | - { | ||
| 136 | - key: '3', | ||
| 137 | - value: '凉拌黑木耳' | ||
| 138 | - }, | ||
| 139 | - { | ||
| 140 | - key: '4', | ||
| 141 | - value: '私房飘香酱牛肉' | ||
| 142 | - } | ||
| 143 | - ] | ||
| 144 | - }, | ||
| 145 | - { | ||
| 146 | - isCheck: false, | ||
| 147 | - id: '852a', | ||
| 148 | - name: '肉类', | ||
| 149 | - currItemCount: 1, | ||
| 150 | - currTotal: 5, | ||
| 151 | - selectedList: ['b'], | ||
| 152 | - list: [ | ||
| 153 | - { | ||
| 154 | - key: 'b', | ||
| 155 | - value: '咸水鸭' | ||
| 156 | - }, | ||
| 157 | - { | ||
| 158 | - key: 'c', | ||
| 159 | - value: '酱香牛肉' | ||
| 160 | - }, | ||
| 161 | - { | ||
| 162 | - key: 'd', | ||
| 163 | - value: '羊肉' | ||
| 164 | - }, | ||
| 165 | - { | ||
| 166 | - key: 'e', | ||
| 167 | - value: '凉拌猪耳朵' | ||
| 168 | - }, | ||
| 169 | - { | ||
| 170 | - key: 'g', | ||
| 171 | - value: '海蜇头' | ||
| 172 | - } | ||
| 173 | - ] | ||
| 174 | - } | ||
| 175 | - ] | ||
| 176 | - } | ||
| 177 | - }, | ||
| 178 | - mounted () { | ||
| 179 | - this.currSum = _.sum(_.map(this.data, 'currItemCount')) | ||
| 180 | - this.totalSum = _.sum(_.map(this.data, 'currTotal')) | ||
| 181 | - }, | ||
| 182 | - methods: { | ||
| 183 | - checkAllClick (val, index) { | ||
| 184 | - const selectedKey = _.map(this.data[index].list, 'key') | ||
| 185 | - if (val === true) { | ||
| 186 | - this.data[index].selectedList = selectedKey | ||
| 187 | - this.data[index].currItemCount = this.data[index].currTotal | ||
| 188 | - } else { | ||
| 189 | - this.data[index].selectedList = [] | ||
| 190 | - this.data[index].currItemCount = 0 | ||
| 191 | - } | ||
| 192 | - this.currSum = _.sum(_.map(this.data, 'currItemCount')) | ||
| 193 | - if (this.currSum === this.totalSum) { | ||
| 194 | - this.isAll = true | ||
| 195 | - } else { | ||
| 196 | - this.isAll = false | ||
| 197 | - } | ||
| 198 | - }, | ||
| 199 | - checkerChange (value, index) { | ||
| 200 | - if (value.length === this.data[index].list.length) { | ||
| 201 | - this.data[index].isCheck = true | ||
| 202 | - } else { | ||
| 203 | - this.data[index].isCheck = false | ||
| 204 | - } | ||
| 205 | - this.data[index].selectedList = value | ||
| 206 | - this.data[index].currItemCount = this.data[index].selectedList.length | ||
| 207 | - this.currSum = _.sum(_.map(this.data, 'currItemCount')) | ||
| 208 | - if (this.currSum === this.totalSum) { | ||
| 209 | - this.isAll = true | ||
| 210 | - } else { | ||
| 211 | - this.isAll = false | ||
| 212 | - } | ||
| 213 | - }, | ||
| 214 | - selectAll (val) { | ||
| 215 | - const source = this.data | ||
| 216 | - if (val === true) { | ||
| 217 | - _(source).each(function (item, index) { | ||
| 218 | - source[index].selectedList = _.map(item.list, 'key') | ||
| 219 | - source[index].isCheck = true | ||
| 220 | - }) | ||
| 221 | - this.currSum = this.totalSum | ||
| 222 | - } else { | ||
| 223 | - _(source).each(function (item, index) { | ||
| 224 | - source[index].selectedList = [] | ||
| 225 | - source[index].isCheck = false | ||
| 226 | - }) | ||
| 227 | - this.currSum = 0 | ||
| 228 | - } | ||
| 229 | - } | ||
| 230 | - } | ||
| 231 | -} | ||
| 232 | -</script> | ||
| 233 | - | ||
| 234 | -<style lang="less" scoped> | ||
| 235 | -.dash-line { | ||
| 236 | - padding: 0.6rem 0; | ||
| 237 | - span{ | ||
| 238 | - display: block; | ||
| 239 | - width: 100%; | ||
| 240 | - border-bottom: 1px dashed #d9d9db; | ||
| 241 | - } | ||
| 242 | -} | ||
| 243 | -.checklist-item { | ||
| 244 | - span { | ||
| 245 | - display: inline-block; | ||
| 246 | - width: 1.2rem; | ||
| 247 | - height: 1.2rem; | ||
| 248 | - background-size: cover; | ||
| 249 | - background-image: url(../../assets/unchecked.png); | ||
| 250 | - vertical-align: middle; | ||
| 251 | - margin-right: 0.5rem; | ||
| 252 | - } | ||
| 253 | -} | ||
| 254 | -.checklist-item-selected { | ||
| 255 | - span { | ||
| 256 | - background-image: url(../../assets/checked.png) | ||
| 257 | - } | ||
| 258 | -} | ||
| 259 | -.check-item { | ||
| 260 | - background: #f6f6f6; | ||
| 261 | - color: #333; | ||
| 262 | - padding: 0.4rem; | ||
| 263 | - border-radius: 0.4rem; | ||
| 264 | - margin: 0.4rem | ||
| 265 | -} | ||
| 266 | -.check-item-disabled { | ||
| 267 | - background: #eaeff7; | ||
| 268 | - color: #ccc; | ||
| 269 | -} | ||
| 270 | -.check-item-selected { | ||
| 271 | - background: #c4d4e7; | ||
| 272 | - color: #2c426b; | ||
| 273 | -} | ||
| 274 | -</style> |
| 1 | -<template lang="html"> | ||
| 2 | - <div class="multiSelect"> | ||
| 3 | - <div style="height: 16rem; overflow-y: scroll;"> | ||
| 4 | - <div style="border-bottom: 1px dashed #d9d9db;"> | ||
| 5 | - <div class="check-head" style="margin: 0.8rem 0 0.8rem 2px"> | ||
| 6 | - <check-icon :value.sync="checkAll" @click.native="selectAll(checkAll)">{{allName}}</check-icon> | ||
| 7 | - <p style="display: inline-block"> | ||
| 8 | - (<span style="color: #8fb5de">{{currCount}}</span>/<span>{{currTotal}}</span>) | ||
| 9 | - </p> | ||
| 10 | - </div> | ||
| 11 | - </div> | ||
| 12 | - <div | ||
| 13 | - class="list" | ||
| 14 | - v-for="(item, index) in items" | ||
| 15 | - :keys="index"> | ||
| 16 | - <div class="check-head" style="margin: 0.4rem 0 0.4rem 15px"> | ||
| 17 | - <check-icon :value.sync="item.currCheckAll" @click.native="checkItemAll(item.currCheckAll, index)">{{item.name}}</check-icon> | ||
| 18 | - <p style="display: inline-block"> | ||
| 19 | - (<span style="color: #8fb5de">{{item.currItemCount}}</span>/<span>{{item.currItemTotal}}</span>) | ||
| 20 | - </p> | ||
| 21 | - </div> | ||
| 22 | - <checker | ||
| 23 | - v-model="item.selectedList" | ||
| 24 | - type="checkbox" | ||
| 25 | - default-item-class="check-item" | ||
| 26 | - disabled-item-class="check-item-disabled" | ||
| 27 | - selected-item-class="check-item-selected" | ||
| 28 | - @on-change="checkerChange(item.selectedList, index)" | ||
| 29 | - class="check-item-wrap-self"> | ||
| 30 | - <checker-item | ||
| 31 | - v-for="(list, index) in item.lists" | ||
| 32 | - :key="index" | ||
| 33 | - :value="list.key" | ||
| 34 | - v-if="!list.disabled" | ||
| 35 | - :disabled="list.disabled">{{list.value}}</checker-item> | ||
| 36 | - </checker> | ||
| 37 | - </div> | ||
| 38 | - </div> | ||
| 39 | - <x-button mini class="default-btn" @click.native="getSelected">完成</x-button> | ||
| 40 | - </div> | ||
| 41 | -</template> | ||
| 42 | - | ||
| 43 | -<script> | ||
| 44 | -import { Checker, CheckerItem, CheckIcon, TransferDom, XButton } from 'vux' | ||
| 45 | -export default { | ||
| 46 | - name: 'multiCheck', | ||
| 47 | - props: ['items', 'allName'], | ||
| 48 | - components: { | ||
| 49 | - Checker, | ||
| 50 | - CheckerItem, | ||
| 51 | - CheckIcon, | ||
| 52 | - TransferDom, | ||
| 53 | - XButton | ||
| 54 | - }, | ||
| 55 | - data () { | ||
| 56 | - return { | ||
| 57 | - currAllSelected: [], | ||
| 58 | - checkAll: false, | ||
| 59 | - currCheckAll: false, | ||
| 60 | - currCount: null, | ||
| 61 | - currTotal: null, | ||
| 62 | - currItemCount: null, | ||
| 63 | - currItemTotal: null | ||
| 64 | - } | ||
| 65 | - }, | ||
| 66 | - mounted () { | ||
| 67 | - this.currCount = _.sum(_.map(this.items, 'currItemCount')) | ||
| 68 | - this.currTotal = _.sum(_.map(this.items, 'currItemTotal')) | ||
| 69 | - this.getSelectedF(this.items) | ||
| 70 | - }, | ||
| 71 | - methods: { | ||
| 72 | - getSelectedF (arr) { | ||
| 73 | - this.currAllSelected = _.flattenDeep(_.map(arr, 'selectedList')) | ||
| 74 | - }, | ||
| 75 | - selectAll (val) { | ||
| 76 | - const source = this.items | ||
| 77 | - if (val === true) { | ||
| 78 | - _(source).each(function (item, index) { | ||
| 79 | - source[index].selectedList = _.map(item.lists, 'key') | ||
| 80 | - source[index].currCheckAll = true | ||
| 81 | - }) | ||
| 82 | - this.currCount = this.currTotal | ||
| 83 | - } else { | ||
| 84 | - _(source).each(function (item, index) { | ||
| 85 | - source[index].selectedList = [] | ||
| 86 | - source[index].currCheckAll = false | ||
| 87 | - }) | ||
| 88 | - this.currCount = 0 | ||
| 89 | - } | ||
| 90 | - this.getSelectedF(this.items) | ||
| 91 | - }, | ||
| 92 | - checkItemAll (val, index) { | ||
| 93 | - const selectedKey = _.map(this.items[index].lists, 'key') | ||
| 94 | - if (val === true) { | ||
| 95 | - this.items[index].selectedList = selectedKey | ||
| 96 | - this.items[index].currItemCount = this.items[index].currItemTotal | ||
| 97 | - } else { | ||
| 98 | - this.items[index].selectedList = [] | ||
| 99 | - this.items[index].currItemCount = 0 | ||
| 100 | - } | ||
| 101 | - this.currCount = _.sum(_.map(this.items, 'currItemCount')) | ||
| 102 | - if (this.currCount === this.currTotal) { | ||
| 103 | - this.checkAll = true | ||
| 104 | - } else { | ||
| 105 | - this.checkAll = false | ||
| 106 | - } | ||
| 107 | - this.getSelectedF(this.items) | ||
| 108 | - }, | ||
| 109 | - checkerChange (value, index) { | ||
| 110 | - this.$emit('listChange', value) | ||
| 111 | - if (value.length === this.items[index].lists.length) { | ||
| 112 | - this.items[index].currCheckAll = true | ||
| 113 | - } else { | ||
| 114 | - this.items[index].currCheckAll = false | ||
| 115 | - } | ||
| 116 | - this.items[index].selectedList = value | ||
| 117 | - this.items[index].currItemCount = this.items[index].selectedList.length | ||
| 118 | - this.currCount = _.sum(_.map(this.items, 'currItemCount')) | ||
| 119 | - if (this.currCount === this.currTotal) { | ||
| 120 | - this.checkAll = true | ||
| 121 | - } else { | ||
| 122 | - this.checkAll = false | ||
| 123 | - } | ||
| 124 | - this.getSelectedF(this.items) | ||
| 125 | - }, | ||
| 126 | - getSelected () { | ||
| 127 | - this.$emit('getSelected', this.currAllSelected) | ||
| 128 | - } | ||
| 129 | - } | ||
| 130 | -} | ||
| 131 | -</script> | ||
| 132 | - | ||
| 133 | -<style lang="less"> | ||
| 134 | -.multiSelect { | ||
| 135 | - .dash-line { | ||
| 136 | - padding: 0.6rem 0; | ||
| 137 | - span{ | ||
| 138 | - display: block; | ||
| 139 | - width: 100%; | ||
| 140 | - border-bottom: 1px dashed #d9d9db; | ||
| 141 | - } | ||
| 142 | - } | ||
| 143 | - .list { | ||
| 144 | - border-bottom: 1px dashed #d9d9db; | ||
| 145 | - padding: 0.3rem 0 | ||
| 146 | - } | ||
| 147 | - .check-item { | ||
| 148 | - background: #f6f6f6; | ||
| 149 | - color: #333; | ||
| 150 | - padding: 0.4rem; | ||
| 151 | - border-radius: 0.4rem; | ||
| 152 | - margin: 0.4rem | ||
| 153 | - } | ||
| 154 | - .check-item-disabled { | ||
| 155 | - background: #eaeff7; | ||
| 156 | - color: #ccc; | ||
| 157 | - } | ||
| 158 | - .check-item-selected { | ||
| 159 | - background: #c4d4e7; | ||
| 160 | - color: #2c426b; | ||
| 161 | - } | ||
| 162 | - .default-btn { | ||
| 163 | - display: block; | ||
| 164 | - width: 60%; | ||
| 165 | - margin: 1rem auto 0; | ||
| 166 | - background: #86aace; | ||
| 167 | - border: 1px solid #86aace; | ||
| 168 | - color: #fff; | ||
| 169 | - } | ||
| 170 | - .vux-check-icon > .weui-icon-success:before, .vux-check-icon > .weui-icon-success-circle:before { | ||
| 171 | - color: #c4d4e7 | ||
| 172 | - } | ||
| 173 | -} | ||
| 174 | -</style> |
src/components/confirm/demo.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <confirm | ||
| 4 | - :title="title" | ||
| 5 | - :value="show" | ||
| 6 | - :left_text="left_text" | ||
| 7 | - :right_text="right_text" | ||
| 8 | - @on-cancel="onCancel" | ||
| 9 | - @on-confirm="onConfirm" | ||
| 10 | - @on-show="onShow" | ||
| 11 | - @on-hide="onHide"> | ||
| 12 | - 自定义插入内容 | ||
| 13 | - </confirm> | ||
| 14 | - <group> | ||
| 15 | - <x-switch title="测试开关" v-model="show"></x-switch> | ||
| 16 | - </group> | ||
| 17 | - </div> | ||
| 18 | -</template> | ||
| 19 | - | ||
| 20 | -<script> | ||
| 21 | -import confirm from 'components/confirm/index' | ||
| 22 | -import { Group, XSwitch } from 'vux' | ||
| 23 | - | ||
| 24 | -export default { | ||
| 25 | - components: { confirm, Group, XSwitch }, | ||
| 26 | - data () { | ||
| 27 | - return { | ||
| 28 | - title: '温馨提示', | ||
| 29 | - left_text: '下一步', | ||
| 30 | - right_text: '继续', | ||
| 31 | - show: false | ||
| 32 | - } | ||
| 33 | - }, | ||
| 34 | - mounted () { | ||
| 35 | - }, | ||
| 36 | - methods: { | ||
| 37 | - onCancel () { | ||
| 38 | - console.warn('on-cancel'); | ||
| 39 | - }, | ||
| 40 | - onConfirm (msg) { | ||
| 41 | - console.warn('on-confirm', msg); | ||
| 42 | - }, | ||
| 43 | - onHide () { | ||
| 44 | - console.warn('on-hide'); | ||
| 45 | - }, | ||
| 46 | - onShow () { | ||
| 47 | - console.warn('on-show'); | ||
| 48 | - } | ||
| 49 | - } | ||
| 50 | -} | ||
| 51 | -</script> | ||
| 52 | - | ||
| 53 | -<style lang="less"> | ||
| 54 | -</style> |
src/components/confirm/index.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div v-transfer-dom> | ||
| 3 | - <confirm v-model="show" | ||
| 4 | - :title="title" | ||
| 5 | - :confirm-text="right_text" | ||
| 6 | - :cancel-text="left_text" | ||
| 7 | - :close-on-confirm="close_confirm" | ||
| 8 | - ref="confirm" | ||
| 9 | - @on-cancel="onCancel" | ||
| 10 | - @on-confirm="onConfirm" | ||
| 11 | - @on-show="onShow" | ||
| 12 | - @on-hide="onHide"> | ||
| 13 | - <slot></slot> | ||
| 14 | - </confirm> | ||
| 15 | - </div> | ||
| 16 | -</template> | ||
| 17 | - | ||
| 18 | -<script> | ||
| 19 | -import { TransferDomDirective as TransferDom, Confirm } from 'vux' | ||
| 20 | - | ||
| 21 | -export default { | ||
| 22 | - components: { Confirm }, | ||
| 23 | - directives: { TransferDom }, | ||
| 24 | - props: { | ||
| 25 | - title: { | ||
| 26 | - required: true | ||
| 27 | - }, | ||
| 28 | - value: { | ||
| 29 | - required: true | ||
| 30 | - }, | ||
| 31 | - left_text: { | ||
| 32 | - required: true | ||
| 33 | - }, | ||
| 34 | - right_text: { | ||
| 35 | - required: true | ||
| 36 | - }, | ||
| 37 | - close_confirm: { | ||
| 38 | - default: false | ||
| 39 | - } | ||
| 40 | - }, | ||
| 41 | - data () { | ||
| 42 | - return { | ||
| 43 | - } | ||
| 44 | - }, | ||
| 45 | - mounted () { | ||
| 46 | - }, | ||
| 47 | - computed: { | ||
| 48 | - show: { | ||
| 49 | - get () { | ||
| 50 | - return this.value | ||
| 51 | - }, | ||
| 52 | - set (val) {} | ||
| 53 | - } | ||
| 54 | - }, | ||
| 55 | - methods: { | ||
| 56 | - onCancel () { | ||
| 57 | - this.$emit('on-cancel'); | ||
| 58 | - }, | ||
| 59 | - onConfirm (msg) { | ||
| 60 | - this.$emit('on-confirm', msg); | ||
| 61 | - }, | ||
| 62 | - onHide () { | ||
| 63 | - this.$emit('on-hide'); | ||
| 64 | - }, | ||
| 65 | - onShow () { | ||
| 66 | - this.$emit('on-show'); | ||
| 67 | - } | ||
| 68 | - } | ||
| 69 | -} | ||
| 70 | -</script> | ||
| 71 | - | ||
| 72 | -<style lang="less"> | ||
| 73 | - .weui-dialog__btn.weui-dialog__btn_primary { | ||
| 74 | - color: #353535; | ||
| 75 | - } | ||
| 76 | - .weui-dialog__hd { | ||
| 77 | - background-color: #8ea9cf; | ||
| 78 | - color: #FFFFFF; | ||
| 79 | - padding: 0.5em 1.6em 0.5em; | ||
| 80 | - } | ||
| 81 | -</style> |
| 1 | -<template lang="html"> | ||
| 2 | - <div class="circleBtn" @click="onClick"> | ||
| 3 | - <i>+</i> | ||
| 4 | - <slot name="text" class="text"></slot> | ||
| 5 | - </div> | ||
| 6 | -</template> | ||
| 7 | - | ||
| 8 | -<script> | ||
| 9 | -export default { | ||
| 10 | - data () { | ||
| 11 | - return { | ||
| 12 | - | ||
| 13 | - } | ||
| 14 | - }, | ||
| 15 | - methods: { | ||
| 16 | - onClick () { | ||
| 17 | - this.$emit('circleClick') | ||
| 18 | - } | ||
| 19 | - } | ||
| 20 | -} | ||
| 21 | -</script> | ||
| 22 | - | ||
| 23 | -<style lang="less"> | ||
| 24 | -.circleBtn{ | ||
| 25 | - display: inline-block; | ||
| 26 | - width: 2rem; | ||
| 27 | - height: 2rem; | ||
| 28 | - border: 1px solid #a2b8d6; | ||
| 29 | - border-radius: 50%; | ||
| 30 | - color: #a2b8d6; | ||
| 31 | - position: relative; | ||
| 32 | - i { | ||
| 33 | - height: 1rem; | ||
| 34 | - line-height: 1rem; | ||
| 35 | - font-size: 1.8rem; | ||
| 36 | - font-weight: 100; | ||
| 37 | - font-style: normal; | ||
| 38 | - position: absolute; | ||
| 39 | - left: 50%; | ||
| 40 | - top: 0; | ||
| 41 | - margin-left: -0.6rem; | ||
| 42 | - } | ||
| 43 | - span{ | ||
| 44 | - display: inline-block; | ||
| 45 | - width: 2rem; | ||
| 46 | - font-size: 0.7rem; | ||
| 47 | - text-align: center; | ||
| 48 | - position: absolute; | ||
| 49 | - left: 50%; | ||
| 50 | - bottom: 0; | ||
| 51 | - margin-left: -1rem; | ||
| 52 | - } | ||
| 53 | -} | ||
| 54 | -</style> |
src/components/customBtn/demo.vue
deleted
100644 → 0
| 1 | - | ||
| 2 | -<template lang="html"> | ||
| 3 | - <div class=""> | ||
| 4 | - <demo @circleClick="add"><span slot="text">添加</span></demo> | ||
| 5 | - <demo @circleClick="relative"><span slot="text">关联</span></demo> | ||
| 6 | - </div> | ||
| 7 | -</template> | ||
| 8 | - | ||
| 9 | -<script> | ||
| 10 | -import Demo from 'components/customBtn/circleBtn' | ||
| 11 | -export default { | ||
| 12 | - components: { | ||
| 13 | - Demo | ||
| 14 | - }, | ||
| 15 | - methods: { | ||
| 16 | - add () { | ||
| 17 | - console.warn('addd'); | ||
| 18 | - }, | ||
| 19 | - relative () { | ||
| 20 | - console.warn('relative'); | ||
| 21 | - } | ||
| 22 | - } | ||
| 23 | -} | ||
| 24 | -</script> | ||
| 25 | - | ||
| 26 | -<style lang="css"> | ||
| 27 | -</style> |
src/components/dateTime/demo.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div class=""> | ||
| 3 | - <datetime | ||
| 4 | - :title="dateTitle" | ||
| 5 | - :show="dateShow" | ||
| 6 | - :confirm_text="confirm_text" | ||
| 7 | - :cancel_text="cancel_text" | ||
| 8 | - @on-cancel="onCancel" | ||
| 9 | - @on-confirm="onConfirm" | ||
| 10 | - @on-hide="onHide" | ||
| 11 | - @on-change="onChange" | ||
| 12 | - ></datetime> | ||
| 13 | - </div> | ||
| 14 | -</template> | ||
| 15 | -<script> | ||
| 16 | - import datetime from 'components/datetime/index' | ||
| 17 | - export default { | ||
| 18 | - components: { | ||
| 19 | - datetime | ||
| 20 | - }, | ||
| 21 | - data () { | ||
| 22 | - return { | ||
| 23 | - dateTitle: '生日', | ||
| 24 | - dateShow: true, | ||
| 25 | - confirm_text: '确定', | ||
| 26 | - cancel_text: '取消' | ||
| 27 | - } | ||
| 28 | - }, | ||
| 29 | - methods: { | ||
| 30 | - onCancel () { | ||
| 31 | - console.warn('on-cancel'); | ||
| 32 | - }, | ||
| 33 | - onConfirm (msg) { | ||
| 34 | - console.warn('on-confirm', msg); | ||
| 35 | - }, | ||
| 36 | - onHide () { | ||
| 37 | - console.warn('on-hide'); | ||
| 38 | - }, | ||
| 39 | - onShow () { | ||
| 40 | - console.warn('on-show'); | ||
| 41 | - }, | ||
| 42 | - onChange () { | ||
| 43 | - console.warn('on-show'); | ||
| 44 | - } | ||
| 45 | - } | ||
| 46 | - } | ||
| 47 | -</script> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
src/components/dateTime/index.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div class=""> | ||
| 3 | - <group> | ||
| 4 | - <datetime | ||
| 5 | - v-model="value" | ||
| 6 | - @on-change="onChange" | ||
| 7 | - :title="title" | ||
| 8 | - :confirm-text="confirm_text" | ||
| 9 | - :cancel-text="cancel_text" | ||
| 10 | - :placeholder="placeholder" | ||
| 11 | - @on-cancel="onCancel" | ||
| 12 | - @on-confirm="onConfirm" | ||
| 13 | - @on-hide="onHide"></datetime> | ||
| 14 | - </group> | ||
| 15 | - </div> | ||
| 16 | -</template> | ||
| 17 | -<script> | ||
| 18 | - /* | ||
| 19 | - 参考vux文档 datetime | ||
| 20 | - */ | ||
| 21 | - import { Datetime, Group, XButton } from 'vux' | ||
| 22 | - export default { | ||
| 23 | - components: { | ||
| 24 | - Datetime, | ||
| 25 | - Group, | ||
| 26 | - XButton | ||
| 27 | - }, | ||
| 28 | - props: ['title', 'confirm_text', 'cancel_text', 'placeholder', 'value'], | ||
| 29 | - data () { | ||
| 30 | - }, | ||
| 31 | - mounted () {}, | ||
| 32 | - methods: { | ||
| 33 | - onChange (value) { | ||
| 34 | - // console.warn('on-change', value) | ||
| 35 | - }, | ||
| 36 | - log (str1, str2 = '') { | ||
| 37 | - console.warn(str1, str2) | ||
| 38 | - }, | ||
| 39 | - onConfirm (val) { | ||
| 40 | - this.$emit('on-confirm', val) | ||
| 41 | - }, | ||
| 42 | - onCancel () { | ||
| 43 | - this.$emit('on-cancel') | ||
| 44 | - }, | ||
| 45 | - onHide () { | ||
| 46 | - this.$emit('on-hide') | ||
| 47 | - } | ||
| 48 | - } | ||
| 49 | - } | ||
| 50 | -</script> | ||
| 51 | -<style lang="less"> | ||
| 52 | - .dp-header { | ||
| 53 | - background-color: #89A9CF; | ||
| 54 | - color: #fff; | ||
| 55 | - .dp-item.dp-left, .dp-item.dp-right { | ||
| 56 | - color: #fff!important; | ||
| 57 | - font-size: 14px; | ||
| 58 | - } | ||
| 59 | - } | ||
| 60 | - .dp-item { | ||
| 61 | - .scroller-item { | ||
| 62 | - font-size:14px; | ||
| 63 | - } | ||
| 64 | - .scroller-item-selected { | ||
| 65 | - font-size: 16px; | ||
| 66 | - } | ||
| 67 | - } | ||
| 68 | -</style> |
src/components/distTime/index.vue
deleted
100644 → 0
This diff is collapsed. Click to expand it.
src/components/distTime/index0.vue
deleted
100644 → 0
This diff is collapsed. Click to expand it.
| 1 | -<template lang="html"> | ||
| 2 | - <div class="distplan_detail" v-if="dialog.route_index !== null"> | ||
| 3 | - <x-dialog :show="show"> | ||
| 4 | - <div class="dbox"> | ||
| 5 | - <p class="dialog-title">相同送货线路的门店</p> | ||
| 6 | - <p style="text-align:center;"> | ||
| 7 | - 每<span v-if="dialog.dist_way === 'D'">天</span><span v-if="dialog.dist_way === 'W'">{{getWeek(dialog.order_day)}}</span><span v-if="dialog.dist_way === 'M'">{{getMonth(dialog.order_day)}}</span>订 | ||
| 8 | - </p> | ||
| 9 | - <div> | ||
| 10 | - <p class="dialog-subtitle" style="color:#89a9cf"> | ||
| 11 | - {{dialog.store_list[dialog.route_index].route_name}} | ||
| 12 | - </p> | ||
| 13 | - <div class="dialog-store-wrap"> | ||
| 14 | - <flexbox justify="space-between"> | ||
| 15 | - <flexbox-item style="padding-left:2.8rem;text-align:left;">门店名称</flexbox-item> | ||
| 16 | - <flexbox-item style="padding-right:1.2rem;text-align:right;">到货时间</flexbox-item> | ||
| 17 | - </flexbox> | ||
| 18 | - </div> | ||
| 19 | - <div class="dialog-store"> | ||
| 20 | - <flexbox justify="space-between" v-for="(ite, i) in dialog.store_list[dialog.route_index].store_list" class="dialog-store-wrap dialog-store-item" :key="i"> | ||
| 21 | - <flexbox-item style="padding-left:8px;text-align:left;">{{ite.store_name}}</flexbox-item> | ||
| 22 | - <flexbox-item style="padding-right:8px;text-align:right;" v-if="dialog.dist_way === 'D'">第{{getDay(ite.dist_day)}}天 {{ite.dist_time}} 到货</flexbox-item> | ||
| 23 | - <flexbox-item style="padding-right:8px;text-align:right;" v-if="dialog.dist_way === 'W'">{{getWeek(ite.dist_day)}} {{ite.dist_time}} 到货</flexbox-item> | ||
| 24 | - <flexbox-item style="padding-right:8px;text-align:right;" v-if="dialog.dist_way === 'M'">{{getMonth(ite.dist_day)}} {{ite.dist_time}} 到货</flexbox-item> | ||
| 25 | - </flexbox> | ||
| 26 | - </div> | ||
| 27 | - </div> | ||
| 28 | - <div v-if="type === 'view'" class="close" @click="close" style="margin-bottom:15px;">关闭</div> | ||
| 29 | - <div v-if="type === 'edit'" class="btn-box" style="margin-bottom:15px;"> | ||
| 30 | - <div @click="close">关闭</div> | ||
| 31 | - <div @click="edit">修改</div> | ||
| 32 | - </div> | ||
| 33 | - </div> | ||
| 34 | - </x-dialog> | ||
| 35 | - </div> | ||
| 36 | -</template> | ||
| 37 | - | ||
| 38 | -<script> | ||
| 39 | -import { XDialog, Flexbox, FlexboxItem } from 'vux' | ||
| 40 | -export default { | ||
| 41 | - props: ['show', 'type', 'dialog'], | ||
| 42 | - components: { | ||
| 43 | - XDialog, | ||
| 44 | - Flexbox, | ||
| 45 | - FlexboxItem | ||
| 46 | - }, | ||
| 47 | - methods: { | ||
| 48 | - getDay (str) { | ||
| 49 | - console.warn(str); | ||
| 50 | - return (Number(str.split('+')[1][0]) + 1); | ||
| 51 | - }, | ||
| 52 | - getWeek (str) { | ||
| 53 | - switch (str) { | ||
| 54 | - case 'MON': | ||
| 55 | - return '周一'; | ||
| 56 | - case 'TUE': | ||
| 57 | - return '周二'; | ||
| 58 | - case 'WED': | ||
| 59 | - return '周三'; | ||
| 60 | - case 'THU': | ||
| 61 | - return '周四'; | ||
| 62 | - case 'FRI': | ||
| 63 | - return '周五'; | ||
| 64 | - case 'SAT': | ||
| 65 | - return '周六'; | ||
| 66 | - case 'SUN': | ||
| 67 | - return '周日'; | ||
| 68 | - case 'MON+1w': | ||
| 69 | - return '下周一'; | ||
| 70 | - case 'TUE+1w': | ||
| 71 | - return '下周二'; | ||
| 72 | - case 'WED+1w': | ||
| 73 | - return '下周三'; | ||
| 74 | - case 'THU+1w': | ||
| 75 | - return '下周四'; | ||
| 76 | - case 'FRI+1w': | ||
| 77 | - return '下周五'; | ||
| 78 | - case 'SAT+1w': | ||
| 79 | - return '下周六'; | ||
| 80 | - case 'SUN+1w': | ||
| 81 | - return '下周日'; | ||
| 82 | - } | ||
| 83 | - }, | ||
| 84 | - getMonth (str) { | ||
| 85 | - if (str === 'last') { | ||
| 86 | - return '月末' | ||
| 87 | - } else { | ||
| 88 | - if (str.split('+').length > 1) { | ||
| 89 | - if (str.split('+')[0] === 'last') { | ||
| 90 | - return '次月月末' | ||
| 91 | - } else { | ||
| 92 | - return '次月' + str.split('+')[0] + '号' | ||
| 93 | - } | ||
| 94 | - } else { | ||
| 95 | - return str + '号'; | ||
| 96 | - } | ||
| 97 | - } | ||
| 98 | - }, | ||
| 99 | - close () { | ||
| 100 | - this.$emit('close', 'store') | ||
| 101 | - }, | ||
| 102 | - edit () { | ||
| 103 | - this.$emit('edit', 'store') | ||
| 104 | - } | ||
| 105 | - } | ||
| 106 | -} | ||
| 107 | -</script> | ||
| 108 | - | ||
| 109 | -<style lang="less"> | ||
| 110 | -.weui-dialog { | ||
| 111 | - max-width: 600px; | ||
| 112 | -} | ||
| 113 | -.distplan_detail { | ||
| 114 | - .dialog-title { | ||
| 115 | - text-align: center; | ||
| 116 | - padding: 0.6rem 0; | ||
| 117 | - color: #fff; | ||
| 118 | - background: #8ea8cf; | ||
| 119 | - } | ||
| 120 | - .dialog-content { | ||
| 121 | - max-height: 25rem; | ||
| 122 | - overflow-y: scroll; | ||
| 123 | - } | ||
| 124 | - .dialog-subtitle { | ||
| 125 | - padding: 0.4rem 0.8rem; | ||
| 126 | - text-align: left; | ||
| 127 | - } | ||
| 128 | - .dialog-wrap { | ||
| 129 | - &:after { | ||
| 130 | - display: block; | ||
| 131 | - content: ''; | ||
| 132 | - clear: both; | ||
| 133 | - } | ||
| 134 | - .dialog-item { | ||
| 135 | - float: left; | ||
| 136 | - width: 45%; | ||
| 137 | - padding: 0.2rem 0; | ||
| 138 | - margin: 0.2rem 0.4rem; | ||
| 139 | - text-align: center; | ||
| 140 | - background: #F0EFF5; | ||
| 141 | - border-radius: 3px; | ||
| 142 | - } | ||
| 143 | - } | ||
| 144 | - .close { | ||
| 145 | - width: 95%; | ||
| 146 | - margin: 0 auto; | ||
| 147 | - background: #8ea8cf; | ||
| 148 | - text-align: center; | ||
| 149 | - padding: 0.4rem 0; | ||
| 150 | - color: #fff; | ||
| 151 | - margin-top: 1rem; | ||
| 152 | - border-radius: 5px; | ||
| 153 | - } | ||
| 154 | - .btn-box { | ||
| 155 | - display: flex; | ||
| 156 | - justify-content: space-around; | ||
| 157 | - margin-top: 1rem; | ||
| 158 | - div { | ||
| 159 | - width: 46%; | ||
| 160 | - border-radius: 5px; | ||
| 161 | - padding: 0.4rem 0; | ||
| 162 | - &:first-of-type { | ||
| 163 | - background: #fff; | ||
| 164 | - color: #89a9cf; | ||
| 165 | - border: 1px solid #89a9cf; | ||
| 166 | - } | ||
| 167 | - &:last-of-type { | ||
| 168 | - background: #89a9cf; | ||
| 169 | - color: #fff; | ||
| 170 | - } | ||
| 171 | - } | ||
| 172 | - } | ||
| 173 | - .dialog-store { | ||
| 174 | - max-height: 25rem; | ||
| 175 | - overflow-y: auto; | ||
| 176 | - } | ||
| 177 | - .dialog-store-wrap { | ||
| 178 | - border-bottom: 1px solid #d6d7dc; | ||
| 179 | - padding-bottom: 0.6rem; | ||
| 180 | - span { | ||
| 181 | - padding: 0.3rem 0; | ||
| 182 | - } | ||
| 183 | - } | ||
| 184 | - .dialog-store-item { | ||
| 185 | - height: 3rem; | ||
| 186 | - padding: 0.4rem 0; | ||
| 187 | - } | ||
| 188 | -} | ||
| 189 | -</style> |
| 1 | -<template lang="html"> | ||
| 2 | - <div style="background-color: white;"> | ||
| 3 | - <flexbox class="inline-wraper-content"> | ||
| 4 | - <flexbox-item :span="8" class="left-wrapper"> | ||
| 5 | - {{leftText}} | ||
| 6 | - <slot name="left"></slot> | ||
| 7 | - </flexbox-item> | ||
| 8 | - <flexbox-item :span="4"> | ||
| 9 | - <slot name="right"></slot> | ||
| 10 | - </flexbox-item> | ||
| 11 | - </flexbox> | ||
| 12 | - <flexbox-item> | ||
| 13 | - <slot name="bottom"></slot> | ||
| 14 | - </flexbox-item> | ||
| 15 | - </div> | ||
| 16 | -</template> | ||
| 17 | - | ||
| 18 | -<script> | ||
| 19 | -import { Flexbox, FlexboxItem } from 'vux' | ||
| 20 | -export default { | ||
| 21 | - props: ['leftText'], | ||
| 22 | - components: { Flexbox, FlexboxItem } | ||
| 23 | -} | ||
| 24 | -</script> | ||
| 25 | - | ||
| 26 | -<style lang="less"> | ||
| 27 | - .inline-wraper-content { | ||
| 28 | - border-bottom: 1px solid #eee; | ||
| 29 | - .left-wrapper { | ||
| 30 | - text-indent: 0.5rem; | ||
| 31 | - font-size: 0.85rem; | ||
| 32 | - } | ||
| 33 | - } | ||
| 34 | -</style> |
src/components/inlineWraper/test.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <inline-wraper :leftText="v.name" v-for="(v, k) in list" :key="k"> | ||
| 3 | - <template slot="left"> | ||
| 4 | - <div v-if="!v.is_set" class="unset-name">{{v.name}}</div> | ||
| 5 | - <div v-else class="enable-set-name">{{v.name}} (已设置)</div> | ||
| 6 | - </template> | ||
| 7 | - <template slot="right"> | ||
| 8 | - <div style=""> | ||
| 9 | - <div v-if="!v.is_set" @click="setBom(v, k)" class="un-set-btn">设置BOM{{bom_code}}</div> | ||
| 10 | - <div v-else @click="editBom(v, k)" class="set-enable-btn">设置BOM{{bom_code}}</div> | ||
| 11 | - </div> | ||
| 12 | - </template> | ||
| 13 | - <template slot="bottom"> | ||
| 14 | - <div> | ||
| 15 | - <div v-if="!item.data.is_set" @click="setBom(item.data)" class="un-set-btn">设置BOM{{bom_code > 1 ? bom_code : '1'}}</div> | ||
| 16 | - <div v-else class="set-enable-btn" @click="setBom(item.data)">设置BOM{{bom_code > 1 ? bom_code : '1'}}</div> | ||
| 17 | - </div> | ||
| 18 | - </template> | ||
| 19 | - </inline-wraper> | ||
| 20 | -</template> | ||
| 21 | - | ||
| 22 | -<script> | ||
| 23 | -import inlineWraper from 'components/inlineWraper/index' | ||
| 24 | -export default { | ||
| 25 | - components: {inlineWraper} | ||
| 26 | -} | ||
| 27 | -</script> | ||
| 28 | - | ||
| 29 | -<style lang="less"> | ||
| 30 | -</style> |
src/components/isCheckAll/demo.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <demo :value.sync="demo1" type="all" @update="choose(demo1)">test</demo> | ||
| 4 | - </div> | ||
| 5 | -</template> | ||
| 6 | - | ||
| 7 | -<script> | ||
| 8 | -import Demo from 'components/isCheckAll/index' | ||
| 9 | -export default { | ||
| 10 | - components: { Demo }, | ||
| 11 | - data () { | ||
| 12 | - return { | ||
| 13 | - demo1: true | ||
| 14 | - } | ||
| 15 | - }, | ||
| 16 | - methods: { | ||
| 17 | - choose (val) { | ||
| 18 | - console.warn(val); | ||
| 19 | - } | ||
| 20 | - } | ||
| 21 | -} | ||
| 22 | -</script> | ||
| 23 | - | ||
| 24 | -<style lang="css"> | ||
| 25 | -</style> |
src/components/isCheckAll/index.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div class="checkBox" @click="updateValue"> | ||
| 3 | - <span class="checkItem allSelected" v-show="type === 'all' && value"></span> | ||
| 4 | - <span class="checkItem noSelected" v-show="!value"></span> | ||
| 5 | - <font><slot></slot></font> | ||
| 6 | - </div> | ||
| 7 | -</template> | ||
| 8 | -<script> | ||
| 9 | -export default { | ||
| 10 | - name: 'isCheckAll', | ||
| 11 | - methods: { | ||
| 12 | - updateValue () { | ||
| 13 | - this.$emit('update:value', !this.value) | ||
| 14 | - } | ||
| 15 | - }, | ||
| 16 | - props: { | ||
| 17 | - value: { | ||
| 18 | - type: Boolean, | ||
| 19 | - default: false | ||
| 20 | - }, | ||
| 21 | - type: { | ||
| 22 | - type: String, | ||
| 23 | - default: 'all' | ||
| 24 | - } | ||
| 25 | - } | ||
| 26 | -} | ||
| 27 | -</script> | ||
| 28 | - | ||
| 29 | -<style lang="less"> | ||
| 30 | -.checkBox { | ||
| 31 | - display: inline-block; | ||
| 32 | - .checkItem { | ||
| 33 | - display: inline-block; | ||
| 34 | - width: 1.3rem; | ||
| 35 | - height: 1.3rem; | ||
| 36 | - text-align: center; | ||
| 37 | - vertical-align: middle; | ||
| 38 | - background-size: cover; | ||
| 39 | - } | ||
| 40 | - .allSelected { | ||
| 41 | - background-image: url(../../assets/all.png); | ||
| 42 | - } | ||
| 43 | - .partSelected { | ||
| 44 | - background-image: url(../../assets/part.png); | ||
| 45 | - } | ||
| 46 | - .noSelected { | ||
| 47 | - background-image: url(../../assets/no.png); | ||
| 48 | - } | ||
| 49 | - font { | ||
| 50 | - font-size: 0.9rem; | ||
| 51 | - vertical-align: middle; | ||
| 52 | - } | ||
| 53 | -} | ||
| 54 | -</style> |
| 1 | -<template lang="html"> | ||
| 2 | - <div class="materiel_detail"> | ||
| 3 | - <x-dialog :show="show"> | ||
| 4 | - <div class="dbox"> | ||
| 5 | - <p class="dialog-title">同时订货的物料</p> | ||
| 6 | - <div class="dialog-content"> | ||
| 7 | - <div v-for="(item, index) in list" :key="index"> | ||
| 8 | - <p class="dialog-subtitle"> | ||
| 9 | - {{item.class_name}}{{item.sku_list.length}} | ||
| 10 | - </p> | ||
| 11 | - <div class="dialog-wrap"> | ||
| 12 | - <p class="dialog-item" v-for="(it, i) in item.sku_list">{{it.sku_name}}</p> | ||
| 13 | - </div> | ||
| 14 | - </div> | ||
| 15 | - </div> | ||
| 16 | - <div v-if="type === 'view'" class="close" @click="close" style="margin-bottom:15px;">关闭</div> | ||
| 17 | - <div v-if="type === 'edit'" class="btn-box" style="margin-bottom:15px;"> | ||
| 18 | - <div @click="close">关闭</div> | ||
| 19 | - <div @click="edit">修改</div> | ||
| 20 | - </div> | ||
| 21 | - </div> | ||
| 22 | - </x-dialog> | ||
| 23 | - </div> | ||
| 24 | -</template> | ||
| 25 | - | ||
| 26 | -<script> | ||
| 27 | -import { XDialog } from 'vux' | ||
| 28 | -import { setTimeout } from 'timers'; | ||
| 29 | -export default { | ||
| 30 | - props: ['type', 'list', 'show'], | ||
| 31 | - components: { | ||
| 32 | - XDialog | ||
| 33 | - }, | ||
| 34 | - watch: { | ||
| 35 | - list () { | ||
| 36 | - setTimeout(() => { | ||
| 37 | - let items = document.getElementsByClassName('dialog-item'); | ||
| 38 | - console.warn(items); | ||
| 39 | - let leftHeight = 0; | ||
| 40 | - let rightHeight = 0; | ||
| 41 | - for (let i = 0; i < items.length; i++) { | ||
| 42 | - if (!(i % 2)) { | ||
| 43 | - leftHeight = $(items[i]).innerHeight(); | ||
| 44 | - } else if (i % 2) { | ||
| 45 | - rightHeight = $(items[i]).innerHeight(); | ||
| 46 | - console.warn(leftHeight, rightHeight) | ||
| 47 | - if (leftHeight > rightHeight) { | ||
| 48 | - // items[i].style.height = leftHeight; | ||
| 49 | - items[i].style.paddingBottom = items[i].style.paddingTop = (leftHeight - rightHeight) / 2 + 'px'; | ||
| 50 | - } else if (rightHeight > leftHeight) { | ||
| 51 | - // items[i - 1].style.height = rightHeight; | ||
| 52 | - items[i - 1].style.paddingBottom = items[i - 1].style.paddingTop = (rightHeight - leftHeight) / 2 + 'px'; | ||
| 53 | - } | ||
| 54 | - } | ||
| 55 | - } | ||
| 56 | - }, 1) | ||
| 57 | - } | ||
| 58 | - }, | ||
| 59 | - methods: { | ||
| 60 | - close () { | ||
| 61 | - this.$emit('close', 'materiel') | ||
| 62 | - }, | ||
| 63 | - edit () { | ||
| 64 | - this.$emit('edit', 'materiel') | ||
| 65 | - } | ||
| 66 | - } | ||
| 67 | -} | ||
| 68 | -</script> | ||
| 69 | - | ||
| 70 | -<style lang="less" scoped> | ||
| 71 | -.materiel_detail { | ||
| 72 | - .dialog-title { | ||
| 73 | - text-align: center; | ||
| 74 | - padding: 0.6rem 0; | ||
| 75 | - color: #fff; | ||
| 76 | - background: #8ea8cf; | ||
| 77 | - } | ||
| 78 | - .dialog-content { | ||
| 79 | - max-height: 25rem; | ||
| 80 | - overflow-y: scroll; | ||
| 81 | - } | ||
| 82 | - .dialog-subtitle { | ||
| 83 | - padding: 0.4rem 0.8rem; | ||
| 84 | - text-align: left; | ||
| 85 | - } | ||
| 86 | - .dialog-wrap { | ||
| 87 | - display: flex; | ||
| 88 | - align-items: center; | ||
| 89 | - flex-wrap: wrap; | ||
| 90 | - justify-content: space-between; | ||
| 91 | - &:after { | ||
| 92 | - display: block; | ||
| 93 | - content: ''; | ||
| 94 | - clear: both; | ||
| 95 | - } | ||
| 96 | - .dialog-item { | ||
| 97 | - width: 45%; | ||
| 98 | - // padding: 0.2rem 0; | ||
| 99 | - margin: 0.2rem 0.4rem; | ||
| 100 | - text-align: center; | ||
| 101 | - background: #F0EFF5; | ||
| 102 | - border-radius: 3px; | ||
| 103 | - } | ||
| 104 | - } | ||
| 105 | - .close { | ||
| 106 | - width: 95%; | ||
| 107 | - margin: 0 auto; | ||
| 108 | - background: #8ea8cf; | ||
| 109 | - text-align: center; | ||
| 110 | - padding: 0.4rem 0; | ||
| 111 | - color: #fff; | ||
| 112 | - margin-top: 1rem; | ||
| 113 | - border-radius: 5px; | ||
| 114 | - } | ||
| 115 | - .btn-box { | ||
| 116 | - display: flex; | ||
| 117 | - justify-content: space-around; | ||
| 118 | - padding-top: 1rem; | ||
| 119 | - margin-top: 1rem; | ||
| 120 | - border-top: 1px solid #f0eff5; | ||
| 121 | - div { | ||
| 122 | - width: 46%; | ||
| 123 | - padding: 0.4rem 0; | ||
| 124 | - border-radius: 5px; | ||
| 125 | - &:first-of-type { | ||
| 126 | - background: #fff; | ||
| 127 | - color: #89a9cf; | ||
| 128 | - border: 1px solid #89a9cf; | ||
| 129 | - } | ||
| 130 | - &:last-of-type { | ||
| 131 | - background: #89a9cf; | ||
| 132 | - color: #fff; | ||
| 133 | - } | ||
| 134 | - } | ||
| 135 | - } | ||
| 136 | - .dialog-store-wrap { | ||
| 137 | - display: flex; | ||
| 138 | - justify-content: space-between; | ||
| 139 | - padding: 0 0.8rem; | ||
| 140 | - border-bottom: 1px solid #d6d7dc; | ||
| 141 | - span { | ||
| 142 | - padding: 0.3rem 0; | ||
| 143 | - } | ||
| 144 | - } | ||
| 145 | -} | ||
| 146 | -</style> |
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
| 1 | -<template> | ||
| 2 | - <div class="pandect_select" v-transfer-dom> | ||
| 3 | - <x-dialog v-model="show"> | ||
| 4 | - <div class="pandect_box"> | ||
| 5 | - <h4>{{title}}</h4> | ||
| 6 | - <div class="pandect_content"> | ||
| 7 | - <ul v-if="type === 'supplier'"> | ||
| 8 | - <li @click="check(index)" v-for="(item, index) in data" :key="index" :class="{'actived': item.checked}">{{item.prov_name}}</li> | ||
| 9 | - </ul> | ||
| 10 | - <ul v-if="type === 'materiel'"> | ||
| 11 | - <li @click="check(index)" v-for="(item, index) in data" :key="index" :class="{'actived': item.checked}">{{item.name}}</li> | ||
| 12 | - </ul> | ||
| 13 | - <ul v-if="type === 'route'"> | ||
| 14 | - <li @click="check(index)" v-for="(item, index) in data" :key="index" :class="{'actived': item.checked}">{{item.name}}</li> | ||
| 15 | - </ul> | ||
| 16 | - </div> | ||
| 17 | - <div class="btn-box"> | ||
| 18 | - <div class="close" @click="close">关闭</div> | ||
| 19 | - <div class="confirm" @click="confirm">确定</div> | ||
| 20 | - </div> | ||
| 21 | - </div> | ||
| 22 | - </x-dialog> | ||
| 23 | - </div> | ||
| 24 | -</template> | ||
| 25 | - | ||
| 26 | -<script> | ||
| 27 | -/** | ||
| 28 | - * 订货送货计划总览选择框组件 | ||
| 29 | - * | ||
| 30 | - * | ||
| 31 | - * @param {string} title 标题 | ||
| 32 | - * @param {array} list 可选择的内容 | ||
| 33 | - * @param {boolean} show 是否显示组件 | ||
| 34 | - * @param {string} type 类型(根据不同类型,供应商、物料、送货线路,获取到的后端数组字段不同,遍历显示的方式也不同) | ||
| 35 | - * @returns {object} | ||
| 36 | - * | ||
| 37 | - * @date 2018-08-31 | ||
| 38 | - */ | ||
| 39 | -import { XDialog, TransferDomDirective as TransferDom } from 'vux' | ||
| 40 | -export default { | ||
| 41 | - components: { XDialog, TransferDom }, | ||
| 42 | - props: ['title', 'list', 'show', 'type'], | ||
| 43 | - data () { | ||
| 44 | - return { | ||
| 45 | - data: [] | ||
| 46 | - } | ||
| 47 | - }, | ||
| 48 | - watch: { | ||
| 49 | - list: function (val) { | ||
| 50 | - /** | ||
| 51 | - * 需要使用watch方法来监听外部传入list是否改变,然后使用数组push方法触发子组件视图更新 | ||
| 52 | - * ------------------------------------------------------------------ | ||
| 53 | - */ | ||
| 54 | - this.$vux.loading.hide(); | ||
| 55 | - this.data = []; | ||
| 56 | - for (let i = 0; i < val.length; i++) { | ||
| 57 | - // 给每条内容添加一个checked属性,是否选择 | ||
| 58 | - val[i].checked = false; | ||
| 59 | - this.data.push(val[i]) | ||
| 60 | - } | ||
| 61 | - } | ||
| 62 | - }, | ||
| 63 | - methods: { | ||
| 64 | - check (index) { | ||
| 65 | - /** | ||
| 66 | - * 选择某一条内容时,将所有内容的checked设false,并将被选择的内容checked设为true,单选效果 | ||
| 67 | - * ------------------------------------------------------------------ | ||
| 68 | - */ | ||
| 69 | - let arr = [] | ||
| 70 | - this.data.forEach(v => { | ||
| 71 | - arr.push(v); | ||
| 72 | - }); | ||
| 73 | - this.data = []; | ||
| 74 | - arr.forEach((v, i) => { | ||
| 75 | - v.checked = false; | ||
| 76 | - if (i === index) { | ||
| 77 | - v.checked = true; | ||
| 78 | - } | ||
| 79 | - this.data.push(v); | ||
| 80 | - }); | ||
| 81 | - }, | ||
| 82 | - close () { | ||
| 83 | - // 关闭 | ||
| 84 | - this.$emit('close'); | ||
| 85 | - }, | ||
| 86 | - confirm () { | ||
| 87 | - /** | ||
| 88 | - * 确认时,返回选中的内容 | ||
| 89 | - * ------------------------------------------------------------------ | ||
| 90 | - */ | ||
| 91 | - let data = null; | ||
| 92 | - this.data.forEach(v => { | ||
| 93 | - if (v.checked) { | ||
| 94 | - data = v; | ||
| 95 | - } | ||
| 96 | - }); | ||
| 97 | - this.$emit('confirm', _.cloneDeep(data)); | ||
| 98 | - } | ||
| 99 | - } | ||
| 100 | -} | ||
| 101 | -</script> | ||
| 102 | - | ||
| 103 | -<style lang="less" scoped> | ||
| 104 | - .pandect_select { | ||
| 105 | - font-size: 14px; | ||
| 106 | - color: #666; | ||
| 107 | - .pandect_box { | ||
| 108 | - position: relative; | ||
| 109 | - padding-bottom: 3rem; | ||
| 110 | - .pandect_content { | ||
| 111 | - max-height: 20rem; | ||
| 112 | - overflow-y: auto; | ||
| 113 | - } | ||
| 114 | - } | ||
| 115 | - h4 { | ||
| 116 | - font-size: 18px; | ||
| 117 | - color: #333; | ||
| 118 | - padding: 0.4rem 0; | ||
| 119 | - text-align: center; | ||
| 120 | - border-bottom: 1px solid #eee; | ||
| 121 | - } | ||
| 122 | - ul { | ||
| 123 | - margin: 0; | ||
| 124 | - list-style: none; | ||
| 125 | - padding: 0 0.8rem; | ||
| 126 | - li { | ||
| 127 | - padding: 0.4rem 0.6rem; | ||
| 128 | - background: #eee; | ||
| 129 | - margin: 0.6rem 0; | ||
| 130 | - } | ||
| 131 | - .actived { | ||
| 132 | - background: #8ea8cf; | ||
| 133 | - color: #fff; | ||
| 134 | - } | ||
| 135 | - } | ||
| 136 | - .btn-box { | ||
| 137 | - position: absolute; | ||
| 138 | - bottom: 0; | ||
| 139 | - width: 100%; | ||
| 140 | - display: flex; | ||
| 141 | - justify-content: space-around; | ||
| 142 | - div { | ||
| 143 | - width: 48%; | ||
| 144 | - border-radius: 5px; | ||
| 145 | - border: 1px solid #8ea8cf; | ||
| 146 | - text-align: center; | ||
| 147 | - padding: 0.4rem 0; | ||
| 148 | - } | ||
| 149 | - .close { | ||
| 150 | - color: #8ea8cf; | ||
| 151 | - background: #fff; | ||
| 152 | - } | ||
| 153 | - .confirm { | ||
| 154 | - color: #fff; | ||
| 155 | - background: #8ea8cf; | ||
| 156 | - } | ||
| 157 | - } | ||
| 158 | - } | ||
| 159 | -</style> |
This diff is collapsed. Click to expand it.
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <select-list :show="show" :title="'请选择物料'" :caption="'所有分类的物料'" :list="list" :shortcut="shortcut_list" :span="2" @cancel="cancel" @comfirm="comfirm"></select-list> | ||
| 4 | - <div @click="showList"> | ||
| 5 | - 显示 | ||
| 6 | - </div> | ||
| 7 | - </div> | ||
| 8 | -</template> | ||
| 9 | - | ||
| 10 | -<script> | ||
| 11 | -import selectList from 'components/selectList/index' | ||
| 12 | - | ||
| 13 | -export default { | ||
| 14 | - components: { selectList }, | ||
| 15 | - data () { | ||
| 16 | - return { | ||
| 17 | - show: false, | ||
| 18 | - list: [{ | ||
| 19 | - category: '所有肉类的物料', | ||
| 20 | - sum: 2, | ||
| 21 | - material_list: [{ | ||
| 22 | - sku_id: 1, | ||
| 23 | - sku_name: 'XX物料', | ||
| 24 | - checked: false, | ||
| 25 | - disabled: true | ||
| 26 | - }, { | ||
| 27 | - sku_id: 2, | ||
| 28 | - sku_name: 'XX物料', | ||
| 29 | - checked: false, | ||
| 30 | - disabled: false | ||
| 31 | - }] | ||
| 32 | - }, { | ||
| 33 | - category: '所有蔬菜类的物料', | ||
| 34 | - sum: 2, | ||
| 35 | - material_list: [{ | ||
| 36 | - sku_id: 11, | ||
| 37 | - sku_name: 'XX物料', | ||
| 38 | - checked: false, | ||
| 39 | - disabled: false | ||
| 40 | - }, { | ||
| 41 | - sku_id: 22, | ||
| 42 | - sku_name: 'XX物料', | ||
| 43 | - checked: false, | ||
| 44 | - disabled: false | ||
| 45 | - }] | ||
| 46 | - }, { | ||
| 47 | - category: '所有蘑菇类的物料', | ||
| 48 | - sum: 2, | ||
| 49 | - material_list: [{ | ||
| 50 | - sku_id: 33, | ||
| 51 | - sku_name: 'XX物料', | ||
| 52 | - checked: false, | ||
| 53 | - disabled: false | ||
| 54 | - }, { | ||
| 55 | - sku_id: 44, | ||
| 56 | - sku_name: 'XX物料', | ||
| 57 | - checked: false, | ||
| 58 | - disabled: false | ||
| 59 | - }] | ||
| 60 | - }], | ||
| 61 | - shortcut_list: [{ | ||
| 62 | - sku_name: '蔬菜类12+水果8', | ||
| 63 | - sum: 2, | ||
| 64 | - list: [{ | ||
| 65 | - sku_id: 1, | ||
| 66 | - sku_name: 'XX物料' | ||
| 67 | - }, { | ||
| 68 | - sku_id: 2, | ||
| 69 | - sku_name: 'XX物料' | ||
| 70 | - }], | ||
| 71 | - checked: false | ||
| 72 | - }, { | ||
| 73 | - sku_name: '肉类10+小器具12', | ||
| 74 | - sum: 2, | ||
| 75 | - list: [{ | ||
| 76 | - sku_id: 11, | ||
| 77 | - sku_name: 'XX物料' | ||
| 78 | - }, { | ||
| 79 | - sku_id: 22, | ||
| 80 | - sku_name: 'XX物料' | ||
| 81 | - }], | ||
| 82 | - checked: false | ||
| 83 | - }, { | ||
| 84 | - sku_name: '肉类10+小器具12', | ||
| 85 | - sum: 4, | ||
| 86 | - list: [{ | ||
| 87 | - sku_id: 33, | ||
| 88 | - sku_name: 'XX物料' | ||
| 89 | - }, { | ||
| 90 | - sku_id: 44, | ||
| 91 | - sku_name: 'XX物料' | ||
| 92 | - }, { | ||
| 93 | - sku_id: 55, | ||
| 94 | - sku_name: 'XX物料' | ||
| 95 | - }, { | ||
| 96 | - sku_id: 66, | ||
| 97 | - sku_name: 'XXxxxxx物料' | ||
| 98 | - }, { | ||
| 99 | - sku_id: 77, | ||
| 100 | - sku_name: 'XX物料' | ||
| 101 | - }, { | ||
| 102 | - sku_id: 88, | ||
| 103 | - sku_name: 'XX物料' | ||
| 104 | - }, { | ||
| 105 | - sku_id: 99, | ||
| 106 | - sku_name: 'XX物料' | ||
| 107 | - }, { | ||
| 108 | - sku_id: 100, | ||
| 109 | - sku_name: 'XX物料' | ||
| 110 | - }], | ||
| 111 | - checked: false | ||
| 112 | - }] | ||
| 113 | - } | ||
| 114 | - }, | ||
| 115 | - methods: { | ||
| 116 | - showList () { | ||
| 117 | - this.show = true; | ||
| 118 | - }, | ||
| 119 | - cancel (v) { | ||
| 120 | - this.show = v; | ||
| 121 | - }, | ||
| 122 | - comfirm (v) { | ||
| 123 | - console.warn(v); | ||
| 124 | - } | ||
| 125 | - } | ||
| 126 | -} | ||
| 127 | -</script> | ||
| 128 | - | ||
| 129 | -<style lang="less"> | ||
| 130 | -</style> |
src/components/selectBrand/index.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class="choose-material-page"> | ||
| 3 | - <div v-transfer-dom> | ||
| 4 | - <x-dialog :show.sync="show" class="dialog-demo"> | ||
| 5 | - <div class="material-title">请选择{{name}}</div> | ||
| 6 | - <div class="material-wrapper"> | ||
| 7 | - <div class="material-classify"> | ||
| 8 | - <div> | ||
| 9 | - <check-icon :value.sync="all_checked" @click.native="checkAll(all_checked)"> | ||
| 10 | - 全部{{name}}({{checkList.length}}/{{list.length}}) | ||
| 11 | - </check-icon> | ||
| 12 | - <div class="material-content"> | ||
| 13 | - <checker | ||
| 14 | - v-model="checkList" | ||
| 15 | - type="checkbox" | ||
| 16 | - default-item-class="item" | ||
| 17 | - selected-item-class="item-selected" | ||
| 18 | - disabled-item-class="item-disabled" | ||
| 19 | - > | ||
| 20 | - <checker-item class="brand_select" v-for="(item, index) in list" :key="index" :disabled="item.disabled" :value="item.id" @click.native="itemCheck(item.checked, index)">{{item.name}}</checker-item> | ||
| 21 | - </checker> | ||
| 22 | - </div> | ||
| 23 | - </div> | ||
| 24 | - </div> | ||
| 25 | - </div> | ||
| 26 | - <div style="padding: 10px;"> | ||
| 27 | - <flexbox> | ||
| 28 | - <flexbox-item> | ||
| 29 | - <x-button @click.native="cancel" mini style="background-color: #ffffff; color: #8EA8CF; border: 1px solid #8EA8CF; width: 100%;">关闭</x-button> | ||
| 30 | - </flexbox-item> | ||
| 31 | - <flexbox-item> | ||
| 32 | - <x-button @click.native="comfirm" mini style="background-color: #8EA8CF; color: #ffffff; border: 1px solid #8EA8CF; width: 100%;">确定</x-button> | ||
| 33 | - </flexbox-item> | ||
| 34 | - </flexbox> | ||
| 35 | - </div> | ||
| 36 | - </x-dialog> | ||
| 37 | - </div> | ||
| 38 | - </div> | ||
| 39 | -</template> | ||
| 40 | - | ||
| 41 | -<script> | ||
| 42 | -import { XDialog, TransferDomDirective as TransferDom, Flexbox, FlexboxItem, CheckIcon, XButton, Checker, CheckerItem } from 'vux' | ||
| 43 | -export default { | ||
| 44 | - props: ['show', 'list', 'checked_list', 'span', 'name'], | ||
| 45 | - directives: { TransferDom }, | ||
| 46 | - components: { XDialog, Flexbox, FlexboxItem, CheckIcon, XButton, Checker, CheckerItem }, | ||
| 47 | - beforeRouteEnter (to, from, next) { | ||
| 48 | - next() | ||
| 49 | - }, | ||
| 50 | - mounted () { | ||
| 51 | - // console.warn(this.list) | ||
| 52 | - // console.warn(1) | ||
| 53 | - }, | ||
| 54 | - data () { | ||
| 55 | - return { | ||
| 56 | - all_checked: true, | ||
| 57 | - checkList: [] | ||
| 58 | - } | ||
| 59 | - }, | ||
| 60 | - watch: { | ||
| 61 | - show (val) { | ||
| 62 | - // console.warn(val) | ||
| 63 | - this.checkList = JSON.parse(JSON.stringify(this.checked_list)) | ||
| 64 | - if (val) { | ||
| 65 | - let check_list = _.filter(this.list, (val) => { | ||
| 66 | - let tem; | ||
| 67 | - if (val.disabled === false) { | ||
| 68 | - tem = val | ||
| 69 | - } | ||
| 70 | - return tem | ||
| 71 | - }); | ||
| 72 | - // console.warn(check_list, this.checked_list) | ||
| 73 | - if (check_list.length > 0 && this.checked_list.length > 0 && check_list.length === this.checked_list.length) { | ||
| 74 | - this.all_checked = true | ||
| 75 | - } else { | ||
| 76 | - this.all_checked = false | ||
| 77 | - } | ||
| 78 | - } else { | ||
| 79 | - this.all_checked = false | ||
| 80 | - } | ||
| 81 | - // this.checkList = val; | ||
| 82 | - // setTimeout(() => { | ||
| 83 | - // let arr = [] | ||
| 84 | - // for (let i = 0; i < $('.brand_select').length; i++) { | ||
| 85 | - // arr.push($('.brand_select').eq(i).height()) | ||
| 86 | - // } | ||
| 87 | - // let max = _.max(arr) | ||
| 88 | - // $('.brand_select').height(max) | ||
| 89 | - // }, 100) | ||
| 90 | - } | ||
| 91 | - }, | ||
| 92 | - computed: { | ||
| 93 | - // checkList () { | ||
| 94 | - // return JSON.parse(JSON.stringify(this.checked_list)); | ||
| 95 | - // } | ||
| 96 | - }, | ||
| 97 | - methods: { | ||
| 98 | - checkAll (checked) { | ||
| 99 | - let check_list = _.filter(this.list, (val) => { | ||
| 100 | - let tem; | ||
| 101 | - if (val.disabled === false) { | ||
| 102 | - tem = val | ||
| 103 | - } | ||
| 104 | - return tem | ||
| 105 | - }); | ||
| 106 | - // 勾选所有品牌 | ||
| 107 | - if (checked) { | ||
| 108 | - // 选中 | ||
| 109 | - for (let i = 0; i < check_list.length; i++) { | ||
| 110 | - check_list[i].checked = true; | ||
| 111 | - } | ||
| 112 | - this.checkList = _.map(check_list, val => val.id) | ||
| 113 | - // this.checked_list = id_list; | ||
| 114 | - } else { | ||
| 115 | - // 取消 | ||
| 116 | - this.checkList = [] | ||
| 117 | - for (let i = 0; i < check_list.length; i++) { | ||
| 118 | - check_list[i].checked = false; | ||
| 119 | - } | ||
| 120 | - } | ||
| 121 | - }, | ||
| 122 | - itemCheck (checked, index) { | ||
| 123 | - // console.warn(this.checkList) | ||
| 124 | - let list = _.filter(this.list, (val) => { | ||
| 125 | - let tem; | ||
| 126 | - if (val.disabled === false) { | ||
| 127 | - tem = val | ||
| 128 | - } | ||
| 129 | - return tem | ||
| 130 | - }); | ||
| 131 | - if (checked) { | ||
| 132 | - this.list[index].checked = false; | ||
| 133 | - } else { | ||
| 134 | - this.list[index].checked = true; | ||
| 135 | - } | ||
| 136 | - // console.warn(id_list) | ||
| 137 | - if (list.length !== this.checkList.length) { | ||
| 138 | - this.all_checked = false | ||
| 139 | - } else { | ||
| 140 | - this.all_checked = true | ||
| 141 | - } | ||
| 142 | - }, | ||
| 143 | - changeCategory () { | ||
| 144 | - }, | ||
| 145 | - cancel () { | ||
| 146 | - // 关闭选择框 | ||
| 147 | - this.$emit('cancel', !this.show) | ||
| 148 | - }, | ||
| 149 | - comfirm () { | ||
| 150 | - // 确认选择框 | ||
| 151 | - this.$emit('comfirm', this.checkList) | ||
| 152 | - } | ||
| 153 | - } | ||
| 154 | -} | ||
| 155 | -</script> | ||
| 156 | - | ||
| 157 | -<style lang="less"> | ||
| 158 | - .material-title { | ||
| 159 | - line-height: 48px; | ||
| 160 | - font-size: 18px; | ||
| 161 | - } | ||
| 162 | - .material-classify { | ||
| 163 | - text-align: left; | ||
| 164 | - padding: 10px; | ||
| 165 | - .vux-checker-box { | ||
| 166 | - display: flex; | ||
| 167 | - flex-wrap: wrap; | ||
| 168 | - } | ||
| 169 | - .vux-check-icon { | ||
| 170 | - margin-bottom: 10px; | ||
| 171 | - } | ||
| 172 | - | ||
| 173 | - } | ||
| 174 | - .item { | ||
| 175 | - width: 31%; | ||
| 176 | - // flex-basis: 31%; | ||
| 177 | - line-height: 26px; | ||
| 178 | - text-align: center; | ||
| 179 | - border-radius: 3px; | ||
| 180 | - border: 1px solid #ccc; | ||
| 181 | - background-color: #f6f6f6; | ||
| 182 | - margin-bottom: 10px; | ||
| 183 | - margin-right: 2.5%; | ||
| 184 | - color: #333; | ||
| 185 | - display: flex!important; | ||
| 186 | - align-items: center; | ||
| 187 | - justify-content: center; | ||
| 188 | - &:nth-child(3n) { | ||
| 189 | - margin-right: 0; | ||
| 190 | - } | ||
| 191 | - } | ||
| 192 | - .weui-icon-circle { | ||
| 193 | - font-size: 20px!important; | ||
| 194 | - } | ||
| 195 | - .weui-icon-success { | ||
| 196 | - font-size: 20px!important; | ||
| 197 | - } | ||
| 198 | - .vux-check-icon > .weui-icon-success:before, .vux-check-icon > .weui-icon-success-circle:before { | ||
| 199 | - color: #c4d4e7 !important; | ||
| 200 | - } | ||
| 201 | - .item-selected { | ||
| 202 | - color: #2c426b; | ||
| 203 | - background-color: #c4d4e7; | ||
| 204 | - } | ||
| 205 | - .item-disabled { | ||
| 206 | - color: #cfcfcf; | ||
| 207 | - background-color: #ebeef7; | ||
| 208 | - } | ||
| 209 | - | ||
| 210 | - .weui-dialog { | ||
| 211 | - width: 90% !important; | ||
| 212 | - max-width: 400px; | ||
| 213 | - } | ||
| 214 | - | ||
| 215 | - @media screen and (min-width: 1024px) { | ||
| 216 | - .weui-dialog { | ||
| 217 | - width: 35%; | ||
| 218 | - } | ||
| 219 | - } | ||
| 220 | - | ||
| 221 | - .weui-btn:after { | ||
| 222 | - border: 0 !important; | ||
| 223 | - } | ||
| 224 | -</style> |
src/components/selectList/index.vue
deleted
100644 → 0
This diff is collapsed. Click to expand it.
src/components/selectList/test.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <select-list :show="show" :title="'请选择物料'" :caption="'所有分类的物料'" :list="list" :shortcut="shortcut_list" :span="2" @cancel="cancel" @comfirm="comfirm"></select-list> | ||
| 4 | - <div @click="showList"> | ||
| 5 | - 显示 | ||
| 6 | - </div> | ||
| 7 | - </div> | ||
| 8 | -</template> | ||
| 9 | - | ||
| 10 | -<script> | ||
| 11 | -import selectList from 'components/selectList/index' | ||
| 12 | - | ||
| 13 | -export default { | ||
| 14 | - components: { selectList }, | ||
| 15 | - data () { | ||
| 16 | - return { | ||
| 17 | - show: false, | ||
| 18 | - list: [{ | ||
| 19 | - category: '所有肉类的物料', | ||
| 20 | - sum: 2, | ||
| 21 | - material_list: [{ | ||
| 22 | - sku_id: 1, | ||
| 23 | - sku_name: 'XX物料', | ||
| 24 | - checked: false, | ||
| 25 | - disabled: true | ||
| 26 | - }, { | ||
| 27 | - sku_id: 2, | ||
| 28 | - sku_name: 'XX物料', | ||
| 29 | - checked: false, | ||
| 30 | - disabled: false | ||
| 31 | - }] | ||
| 32 | - }, { | ||
| 33 | - category: '所有蔬菜类的物料', | ||
| 34 | - sum: 2, | ||
| 35 | - material_list: [{ | ||
| 36 | - sku_id: 11, | ||
| 37 | - sku_name: 'XX物料', | ||
| 38 | - checked: false, | ||
| 39 | - disabled: false | ||
| 40 | - }, { | ||
| 41 | - sku_id: 22, | ||
| 42 | - sku_name: 'XX物料', | ||
| 43 | - checked: false, | ||
| 44 | - disabled: false | ||
| 45 | - }] | ||
| 46 | - }, { | ||
| 47 | - category: '所有蘑菇类的物料', | ||
| 48 | - sum: 2, | ||
| 49 | - material_list: [{ | ||
| 50 | - sku_id: 33, | ||
| 51 | - sku_name: 'XX物料', | ||
| 52 | - checked: false, | ||
| 53 | - disabled: false | ||
| 54 | - }, { | ||
| 55 | - sku_id: 44, | ||
| 56 | - sku_name: 'XX物料', | ||
| 57 | - checked: false, | ||
| 58 | - disabled: false | ||
| 59 | - }] | ||
| 60 | - }], | ||
| 61 | - shortcut_list: [{ | ||
| 62 | - sku_name: '蔬菜类12+水果8', | ||
| 63 | - sum: 2, | ||
| 64 | - list: [{ | ||
| 65 | - sku_id: 1, | ||
| 66 | - sku_name: 'XX物料' | ||
| 67 | - }, { | ||
| 68 | - sku_id: 2, | ||
| 69 | - sku_name: 'XX物料' | ||
| 70 | - }], | ||
| 71 | - checked: false | ||
| 72 | - }, { | ||
| 73 | - sku_name: '肉类10+小器具12', | ||
| 74 | - sum: 2, | ||
| 75 | - list: [{ | ||
| 76 | - sku_id: 11, | ||
| 77 | - sku_name: 'XX物料' | ||
| 78 | - }, { | ||
| 79 | - sku_id: 22, | ||
| 80 | - sku_name: 'XX物料' | ||
| 81 | - }], | ||
| 82 | - checked: false | ||
| 83 | - }, { | ||
| 84 | - sku_name: '肉类10+小器具12', | ||
| 85 | - sum: 4, | ||
| 86 | - list: [{ | ||
| 87 | - sku_id: 33, | ||
| 88 | - sku_name: 'XX物料' | ||
| 89 | - }, { | ||
| 90 | - sku_id: 44, | ||
| 91 | - sku_name: 'XX物料' | ||
| 92 | - }, { | ||
| 93 | - sku_id: 55, | ||
| 94 | - sku_name: 'XX物料' | ||
| 95 | - }, { | ||
| 96 | - sku_id: 66, | ||
| 97 | - sku_name: 'XXxxxxx物料' | ||
| 98 | - }, { | ||
| 99 | - sku_id: 77, | ||
| 100 | - sku_name: 'XX物料' | ||
| 101 | - }, { | ||
| 102 | - sku_id: 88, | ||
| 103 | - sku_name: 'XX物料' | ||
| 104 | - }, { | ||
| 105 | - sku_id: 99, | ||
| 106 | - sku_name: 'XX物料' | ||
| 107 | - }, { | ||
| 108 | - sku_id: 100, | ||
| 109 | - sku_name: 'XX物料' | ||
| 110 | - }], | ||
| 111 | - checked: false | ||
| 112 | - }] | ||
| 113 | - } | ||
| 114 | - }, | ||
| 115 | - methods: { | ||
| 116 | - showList () { | ||
| 117 | - this.show = true; | ||
| 118 | - }, | ||
| 119 | - cancel (v) { | ||
| 120 | - this.show = v; | ||
| 121 | - }, | ||
| 122 | - comfirm (v) { | ||
| 123 | - console.warn(v); | ||
| 124 | - } | ||
| 125 | - } | ||
| 126 | -} | ||
| 127 | -</script> | ||
| 128 | - | ||
| 129 | -<style lang="less"> | ||
| 130 | -</style> |
src/components/selectPage/demo.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class="financial_manager"> | ||
| 3 | - <!-- <p>请选择</p> --> | ||
| 4 | - <selectPage :text="text" :checkedList="checked" :list="list" @change-text="changeText" @change="selected"></selectPage> | ||
| 5 | - </div> | ||
| 6 | -</template> | ||
| 7 | - | ||
| 8 | -<script> | ||
| 9 | - import selectPage from './index.vue' | ||
| 10 | - export default { | ||
| 11 | - components: { | ||
| 12 | - selectPage | ||
| 13 | - }, | ||
| 14 | - data () { | ||
| 15 | - return { | ||
| 16 | - text: '', | ||
| 17 | - checked: ['002', '003'], | ||
| 18 | - list: [ | ||
| 19 | - { | ||
| 20 | - id: '001', | ||
| 21 | - value: '肉' | ||
| 22 | - }, | ||
| 23 | - { | ||
| 24 | - id: '002', | ||
| 25 | - value: '青菜' | ||
| 26 | - }, | ||
| 27 | - { | ||
| 28 | - id: '003', | ||
| 29 | - value: '啤酒' | ||
| 30 | - }, | ||
| 31 | - { | ||
| 32 | - id: '004', | ||
| 33 | - value: '水果' | ||
| 34 | - }, | ||
| 35 | - { | ||
| 36 | - id: '005', | ||
| 37 | - value: '水果' | ||
| 38 | - }, | ||
| 39 | - { | ||
| 40 | - id: '006', | ||
| 41 | - value: '水果' | ||
| 42 | - }, | ||
| 43 | - { | ||
| 44 | - id: '007', | ||
| 45 | - value: '水果' | ||
| 46 | - }, | ||
| 47 | - { | ||
| 48 | - id: '008', | ||
| 49 | - value: '水果' | ||
| 50 | - }, | ||
| 51 | - { | ||
| 52 | - id: '009', | ||
| 53 | - value: '水果' | ||
| 54 | - }, | ||
| 55 | - { | ||
| 56 | - id: '010', | ||
| 57 | - value: '水果' | ||
| 58 | - }, | ||
| 59 | - { | ||
| 60 | - id: '011', | ||
| 61 | - value: '水果' | ||
| 62 | - } | ||
| 63 | - ] | ||
| 64 | - } | ||
| 65 | - }, | ||
| 66 | - methods: { | ||
| 67 | - selected (id) { | ||
| 68 | - console.warn(id); | ||
| 69 | - }, | ||
| 70 | - changeText (val) { | ||
| 71 | - this.text = val; | ||
| 72 | - } | ||
| 73 | - } | ||
| 74 | - } | ||
| 75 | -</script> | ||
| 76 | - | ||
| 77 | -<style lang="less"> | ||
| 78 | -</style> |
src/components/selectPage/index.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div class="select-check"> | ||
| 3 | - <p><span @touchstart.capture="open">{{text}}<icon class="Icon" type="warn"></icon></span></p> | ||
| 4 | - <transition name="component-fade" mode="out-in"> | ||
| 5 | - <div class="select-content" v-if="show"> | ||
| 6 | - <p class="select-up">请选择<icon class="Icon Icon_up" type="warn"></icon></p> | ||
| 7 | - <div> | ||
| 8 | - <checker | ||
| 9 | - class="checkbox" | ||
| 10 | - v-model="checkList" | ||
| 11 | - type="checkbox" | ||
| 12 | - default-item-class="select-item" | ||
| 13 | - selected-item-class="select-item-selected" | ||
| 14 | - @on-change="selected" | ||
| 15 | - > | ||
| 16 | - <checker-item v-for="item in list" :key="item.id" :value="item.id" >{{item.value}}</checker-item> | ||
| 17 | - </checker> | ||
| 18 | - <x-button class="select-btn" @click.native="submit">确 定</x-button> | ||
| 19 | - </div> | ||
| 20 | - </div> | ||
| 21 | - </transition> | ||
| 22 | - <!-- </transition-group> --> | ||
| 23 | - | ||
| 24 | - </div> | ||
| 25 | -</template> | ||
| 26 | -<script> | ||
| 27 | -/* | ||
| 28 | - 下拉多选 | ||
| 29 | - 数据: | ||
| 30 | - checkList: 选中列表集合; | ||
| 31 | - list: 选项列表集合; | ||
| 32 | - | ||
| 33 | - 方法: | ||
| 34 | - selected: 选项发生改变之后的回调,返回选中项的id; | ||
| 35 | - submit: 点击确定之后的回调; | ||
| 36 | -*/ | ||
| 37 | - import { XButton, Checker, CheckerItem, Icon } from 'vux' | ||
| 38 | - export default { | ||
| 39 | - components: { | ||
| 40 | - XButton, | ||
| 41 | - Checker, | ||
| 42 | - CheckerItem, | ||
| 43 | - Icon | ||
| 44 | - }, | ||
| 45 | - props: { | ||
| 46 | - text: { | ||
| 47 | - type: String, | ||
| 48 | - default: '请选择' | ||
| 49 | - }, | ||
| 50 | - list: { | ||
| 51 | - type: Array, | ||
| 52 | - default: [] | ||
| 53 | - }, | ||
| 54 | - checkedList: { | ||
| 55 | - type: Array, | ||
| 56 | - default: [] | ||
| 57 | - } | ||
| 58 | - }, | ||
| 59 | - data () { | ||
| 60 | - return { | ||
| 61 | - show: false, | ||
| 62 | - checkList: [] | ||
| 63 | - } | ||
| 64 | - }, | ||
| 65 | - created () { | ||
| 66 | - let text; | ||
| 67 | - if (this.checkedList.length != 0) { | ||
| 68 | - text = '已选择' + this.checkedList.length + '个选项'; | ||
| 69 | - } else { | ||
| 70 | - text = '请选择' | ||
| 71 | - } | ||
| 72 | - this.$emit('change-text', text) | ||
| 73 | - }, | ||
| 74 | - mounted () { | ||
| 75 | - // console.warn(this.checkedList) | ||
| 76 | - this.checkList = this.checkedList | ||
| 77 | - }, | ||
| 78 | - methods: { | ||
| 79 | - open () { | ||
| 80 | - this.show = true; | ||
| 81 | - }, | ||
| 82 | - selected () { | ||
| 83 | - let text; | ||
| 84 | - if (this.checkList.length != 0) { | ||
| 85 | - text = '已选择' + this.checkList.length + '个选项'; | ||
| 86 | - } else { | ||
| 87 | - text = '请选择' | ||
| 88 | - }; | ||
| 89 | - this.$emit('change-text', text) | ||
| 90 | - this.$emit('change', this.checkList) | ||
| 91 | - }, | ||
| 92 | - submit () { | ||
| 93 | - if (this.checkList.length > 0) { | ||
| 94 | - let text = '已选择' + this.checkList.length + '个选项'; | ||
| 95 | - this.$emit('change-text', text) | ||
| 96 | - this.show = false; | ||
| 97 | - } else { | ||
| 98 | - this.$vux.toast.show({ | ||
| 99 | - text: '请选择内容', | ||
| 100 | - type: 'text' | ||
| 101 | - }) | ||
| 102 | - } | ||
| 103 | - } | ||
| 104 | - } | ||
| 105 | - } | ||
| 106 | -</script> | ||
| 107 | -<style lang="less" scoped> | ||
| 108 | - .select-check { | ||
| 109 | - p { | ||
| 110 | - font-size: 16px; | ||
| 111 | - color: #333; | ||
| 112 | - text-align: right; | ||
| 113 | - padding: 10px 5px 10px 0; | ||
| 114 | - border-bottom: 1px solid #d6d7dc; | ||
| 115 | - .Icon { | ||
| 116 | - position: relative; | ||
| 117 | - font-size: 0; | ||
| 118 | - margin-left: 15px; | ||
| 119 | - } | ||
| 120 | - .Icon:before { | ||
| 121 | - width: 0; | ||
| 122 | - height: 0; | ||
| 123 | - } | ||
| 124 | - .Icon:after { | ||
| 125 | - content: " "; | ||
| 126 | - display: inline-block; | ||
| 127 | - height: 10px; | ||
| 128 | - width: 10px; | ||
| 129 | - border-width: 2px 2px 0 0; | ||
| 130 | - border-color: #C8C8CD; | ||
| 131 | - border-style: solid; | ||
| 132 | - transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); | ||
| 133 | - position: relative; | ||
| 134 | - top: -2px; | ||
| 135 | - position: absolute; | ||
| 136 | - top: 50%; | ||
| 137 | - margin-top: -8px; | ||
| 138 | - right: 2px; | ||
| 139 | - } | ||
| 140 | - .Icon_up { | ||
| 141 | - margin-left: 22px; | ||
| 142 | - } | ||
| 143 | - .Icon_up:after { | ||
| 144 | - border-width: 0 2px 2px 0; | ||
| 145 | - margin-top: -11px; | ||
| 146 | - } | ||
| 147 | - } | ||
| 148 | - .checkbox { | ||
| 149 | - padding: 10px 0; | ||
| 150 | - display: flex; | ||
| 151 | - flex-flow: row wrap; | ||
| 152 | - justify-content: space-between; | ||
| 153 | - .select-item { | ||
| 154 | - background-color: #f6f6f6; | ||
| 155 | - color: #999; | ||
| 156 | - font-size: 14px; | ||
| 157 | - text-align: center; | ||
| 158 | - padding: 5px 10px; | ||
| 159 | - margin-bottom: 10px; | ||
| 160 | - line-height: 18px; | ||
| 161 | - border: 1px solid #f6f6f6; | ||
| 162 | - border-radius: 5px; | ||
| 163 | - flex: 0 0 18%; | ||
| 164 | - box-sizing: border-box; | ||
| 165 | - } | ||
| 166 | - .select-item-selected { | ||
| 167 | - background-color: #c4d4e7; | ||
| 168 | - color: #999; | ||
| 169 | - border-color: #c4d4e7; | ||
| 170 | - } | ||
| 171 | - .select-item-disabled { | ||
| 172 | - color: #999; | ||
| 173 | - } | ||
| 174 | - } | ||
| 175 | - .select-btn { | ||
| 176 | - background-color: #c4d4e7; | ||
| 177 | - font-size: 16px; | ||
| 178 | - color: #fff; | ||
| 179 | - &:after{ | ||
| 180 | - border: 0; | ||
| 181 | - } | ||
| 182 | - &:not(.weui-btn_disabled):active { | ||
| 183 | - background-color: #89a9cf; | ||
| 184 | - color: #fff; | ||
| 185 | - } | ||
| 186 | - } | ||
| 187 | - } | ||
| 188 | -.component-fade-enter-active, .component-fade-leave-active { | ||
| 189 | - transition: opacity .3s ease; | ||
| 190 | -} | ||
| 191 | -.component-fade-enter, .component-fade-leave-to { | ||
| 192 | - opacity: 0; | ||
| 193 | -} | ||
| 194 | -</style> |
src/components/selectStore/index.vue
deleted
100644 → 0
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
| 1 | -<template> | ||
| 2 | - <div class="choose_store_multi"> | ||
| 3 | - <div v-transfer-dom> | ||
| 4 | - <x-dialog :show.sync="show" class="dialog-demo"> | ||
| 5 | - <div class="store-title">{{title}}</div> | ||
| 6 | - <div class="wrap-scroll"> | ||
| 7 | - <div class="store-wrapper"> | ||
| 8 | - <check-icon class="store-all-checked"> | ||
| 9 | - <!-- {{caption}}(<span style="color: #8EA8CF;">{{category_num}}</span>/{{category_sum}}) --> | ||
| 10 | - 所有品牌的门店(<span style="color: #8EA8CF;">{{category_num}}</span>/{{category_sum}}) | ||
| 11 | - </check-icon> | ||
| 12 | - </div> | ||
| 13 | - <div class="store-classify"> | ||
| 14 | - <div v-for="(b, bi) in data_list" :key="bi"> | ||
| 15 | - <div style="border-top: 1px dashed #eee; width: 100%;"></div> | ||
| 16 | - <flexbox class="brand-classify-title"> | ||
| 17 | - <flexbox-item style="text-indent:2px;" :span="10"> | ||
| 18 | - <check-icon class="brand-classify-checked" :value.sync="b.checked"> | ||
| 19 | - {{b.name}}(<span style="color: #8EA8CF;">{{b.num}}</span>/{{b.city_count}}) | ||
| 20 | - </check-icon> | ||
| 21 | - </flexbox-item> | ||
| 22 | - <flexbox-item @click.native="fold(bi, 'brand')"> | ||
| 23 | - <div style="padding-top: 0.2rem; padding-left: 0.5rem;"> | ||
| 24 | - <i class="fa fa-chevron-down" style="font-size: 0.7rem; color: #838383;"></i> | ||
| 25 | - </div> | ||
| 26 | - </flexbox-item> | ||
| 27 | - </flexbox> | ||
| 28 | - <div class="brand-content"> | ||
| 29 | - <div class="store-classify"> | ||
| 30 | - <div v-for="(c, ci) in b.city_list" :key="ci"> | ||
| 31 | - <div style="border-top: 1px dashed #eee; width: 100%;"></div> | ||
| 32 | - <flexbox class="store-classify-title"> | ||
| 33 | - <flexbox-item style="text-indent:4px;" :span="10"> | ||
| 34 | - <check-icon class="store-classify-checked" :value.sync="c.checked"> | ||
| 35 | - {{c.name}}(<span style="color: #8EA8CF;">{{c.num}}</span>/{{c.store_count}}) | ||
| 36 | - </check-icon> | ||
| 37 | - </flexbox-item> | ||
| 38 | - <flexbox-item @click.native="fold(bi, 'store', ci)"> | ||
| 39 | - <div style="padding-top: 0.2rem; padding-left: 0.5rem;"> | ||
| 40 | - <i class="fa fa-chevron-down" style="font-size: 0.7rem; color: #838383;"></i> | ||
| 41 | - </div> | ||
| 42 | - </flexbox-item> | ||
| 43 | - </flexbox> | ||
| 44 | - <div class="store-content"> | ||
| 45 | - <div class="store-list"> | ||
| 46 | - <div v-for="(s, si) in c.store_list" :key="si" @click="itemCheck(s)"> | ||
| 47 | - <div v-if="!+s.disabled" | ||
| 48 | - :class="[s.checked ? 'flex-checked' : '', 'flex-store']"> | ||
| 49 | - {{s.name}} | ||
| 50 | - </div> | ||
| 51 | - </div> | ||
| 52 | - </div> | ||
| 53 | - </div> | ||
| 54 | - </div> | ||
| 55 | - </div> | ||
| 56 | - </div> | ||
| 57 | - </div> | ||
| 58 | - </div> | ||
| 59 | - </div> | ||
| 60 | - <div class="control-wrapper"> | ||
| 61 | - <flexbox> | ||
| 62 | - <flexbox-item> | ||
| 63 | - <x-button class="close-btn" @click.native="cancel" mini>关闭</x-button> | ||
| 64 | - </flexbox-item> | ||
| 65 | - <flexbox-item> | ||
| 66 | - <x-button class="confirm-btn" @click.native="confirm" mini>确定</x-button> | ||
| 67 | - </flexbox-item> | ||
| 68 | - </flexbox> | ||
| 69 | - </div> | ||
| 70 | - </x-dialog> | ||
| 71 | - </div> | ||
| 72 | - </div> | ||
| 73 | -</template> | ||
| 74 | - | ||
| 75 | -<script> | ||
| 76 | -import { XDialog, TransferDomDirective as TransferDom, Flexbox, FlexboxItem, CheckIcon, XButton } from 'vux' | ||
| 77 | -import { Observable } from 'rxjs/Rx' | ||
| 78 | -export default { | ||
| 79 | - directives: { TransferDom }, | ||
| 80 | - components: { XDialog, Flexbox, FlexboxItem, CheckIcon, XButton }, | ||
| 81 | - props: ['show', 'list', 'title', 'checkList'], | ||
| 82 | - data () { | ||
| 83 | - return { | ||
| 84 | - data_list: [], | ||
| 85 | - category_num: 0 | ||
| 86 | - } | ||
| 87 | - }, | ||
| 88 | - watch: { | ||
| 89 | - list () { | ||
| 90 | - this.data_list = []; | ||
| 91 | - Observable.from([...this.list]) | ||
| 92 | - .map(b => { | ||
| 93 | - // 品牌 | ||
| 94 | - b.checked = false; | ||
| 95 | - b.num = 0; | ||
| 96 | - b.city_count = b.city_list.length; | ||
| 97 | - b.city_list.forEach(c => { | ||
| 98 | - // 城市 | ||
| 99 | - c.checked = false; | ||
| 100 | - c.num = 0; | ||
| 101 | - c.store_count = c.store_list.length; | ||
| 102 | - c.store_list.forEach(s => { | ||
| 103 | - // 门店 | ||
| 104 | - s.num = 0; | ||
| 105 | - s.checked = false; | ||
| 106 | - }) | ||
| 107 | - }) | ||
| 108 | - return b; | ||
| 109 | - }).subscribe(v => { | ||
| 110 | - v.city_list.forEach(c => { | ||
| 111 | - c.store_list.forEach(s => { | ||
| 112 | - this.checkList.forEach(checkStore => { | ||
| 113 | - if (checkStore.store_id === s.store_id) { | ||
| 114 | - s.checked = true; | ||
| 115 | - } | ||
| 116 | - }) | ||
| 117 | - }) | ||
| 118 | - }) | ||
| 119 | - this.data_list.push(v); | ||
| 120 | - // 分别计算已选中的 | ||
| 121 | - }).unsubscribe(); | ||
| 122 | - } | ||
| 123 | - }, | ||
| 124 | - computed: { | ||
| 125 | - category_sum () { | ||
| 126 | - // 获取门店总数 | ||
| 127 | - let sum = 0; | ||
| 128 | - this.data_list.forEach(b => { | ||
| 129 | - b.city_list.forEach(c => { | ||
| 130 | - sum += c.store_count; | ||
| 131 | - }) | ||
| 132 | - }) | ||
| 133 | - return sum; | ||
| 134 | - } | ||
| 135 | - }, | ||
| 136 | - methods: { | ||
| 137 | - fold (index, str, i) { | ||
| 138 | - let has_class = $($(`.${str}-classify-title`)[index]).siblings(`.${str}-content`).hasClass('fold-content'); | ||
| 139 | - if (i && index - 1 >= 0) { | ||
| 140 | - // 不为第一组品牌中的城市 | ||
| 141 | - index = this.data_list[index - 1].city_count + i; | ||
| 142 | - } else { | ||
| 143 | - // 不是城市或是第一组品牌中的城市 | ||
| 144 | - i ? index = i : ''; | ||
| 145 | - } | ||
| 146 | - if (has_class) { | ||
| 147 | - // 展开 | ||
| 148 | - $($(`.${str}-classify-title`)[index]).siblings(`.${str}-content`).removeClass('fold-content'); | ||
| 149 | - $($(`.${str}-classify-title`)[index]).find('i').addClass('fa-chevron-down').removeClass('fa-chevron-right'); | ||
| 150 | - } else { | ||
| 151 | - // 折叠 | ||
| 152 | - $($(`.${str}-classify-title`)[index]).siblings(`.${str}-content`).addClass('fold-content'); | ||
| 153 | - $($(`.${str}-classify-title`)[index]).find('i').addClass('fa-chevron-right').removeClass('fa-chevron-down'); | ||
| 154 | - } | ||
| 155 | - }, | ||
| 156 | - itemCheck (item, method) { | ||
| 157 | - // 选中/取消选中单条 | ||
| 158 | - item.checked = !item.checked; | ||
| 159 | - let arr = [...this.data_list]; | ||
| 160 | - this.data_list.splice(0, [...arr]); | ||
| 161 | - }, | ||
| 162 | - cancel () { | ||
| 163 | - this.$emit('cancel'); | ||
| 164 | - }, | ||
| 165 | - confirm () { | ||
| 166 | - let data = []; | ||
| 167 | - Observable.create(store$ => { | ||
| 168 | - this.data_list.forEach(b => { | ||
| 169 | - b.city_list.forEach(c => { | ||
| 170 | - c.store_list.forEach(s => { | ||
| 171 | - if (s.checked) { | ||
| 172 | - store$.next(s); | ||
| 173 | - } | ||
| 174 | - }) | ||
| 175 | - }) | ||
| 176 | - }) | ||
| 177 | - }).subscribe(v => { | ||
| 178 | - data.push(v); | ||
| 179 | - }).unsubscribe(); | ||
| 180 | - this.$emit('confirm', data); | ||
| 181 | - } | ||
| 182 | - } | ||
| 183 | -} | ||
| 184 | -</script> | ||
| 185 | - | ||
| 186 | -<style lang="less"> | ||
| 187 | -.choose_store_multi { | ||
| 188 | -} | ||
| 189 | -.store-title { | ||
| 190 | - padding: 0.5rem; | ||
| 191 | - font-size: 18px; | ||
| 192 | - border-bottom: 1px solid #eee; | ||
| 193 | -} | ||
| 194 | -.wrap-scroll { | ||
| 195 | - max-height: 30rem; | ||
| 196 | - overflow-y: auto; | ||
| 197 | -} | ||
| 198 | -.store-wrapper { | ||
| 199 | - text-align: left; | ||
| 200 | - .store-all-checked { | ||
| 201 | - font-size: 0.9rem; | ||
| 202 | - padding: 0.5rem 0.2rem; | ||
| 203 | - } | ||
| 204 | -} | ||
| 205 | - | ||
| 206 | -.store-classify { | ||
| 207 | - .store-classify-checked, | ||
| 208 | - .brand-classify-checked { | ||
| 209 | - font-size: 0.9rem; | ||
| 210 | - padding: 0.4rem 0.2rem 0.1rem 0.85rem; | ||
| 211 | - } | ||
| 212 | - .store-classify-title, | ||
| 213 | - .brand-classify-title { | ||
| 214 | - margin-bottom: 0.5rem; | ||
| 215 | - } | ||
| 216 | - .store-content, | ||
| 217 | - .brand-content { | ||
| 218 | - border-bottom: 1px dashed #eee; | ||
| 219 | - .store-list { | ||
| 220 | - &:after { | ||
| 221 | - display: block; | ||
| 222 | - content: ""; | ||
| 223 | - clear: both; | ||
| 224 | - } | ||
| 225 | - &>div { | ||
| 226 | - float: left; | ||
| 227 | - margin-left: .4rem; | ||
| 228 | - width: 48%; | ||
| 229 | - padding-bottom: 10px; | ||
| 230 | - .flex-store { | ||
| 231 | - text-align: center; | ||
| 232 | - background-color: #eee; | ||
| 233 | - } | ||
| 234 | - .flex-checked { | ||
| 235 | - color: white; | ||
| 236 | - background-color: #8EA8CF; | ||
| 237 | - } | ||
| 238 | - .flex-disabled { | ||
| 239 | - color: #cfcfcf; | ||
| 240 | - background-color: #ebeef7; | ||
| 241 | - } | ||
| 242 | - } | ||
| 243 | - } | ||
| 244 | - } | ||
| 245 | - .store-content { | ||
| 246 | - padding: 0 1rem; | ||
| 247 | - } | ||
| 248 | - .fold-content { | ||
| 249 | - height: 0; | ||
| 250 | - overflow: hidden; | ||
| 251 | - padding-bottom: 0; | ||
| 252 | - } | ||
| 253 | -} | ||
| 254 | -.control-wrapper { | ||
| 255 | - padding: 10px; | ||
| 256 | - .close-btn { | ||
| 257 | - background-color: #ffffff; | ||
| 258 | - color: #8EA8CF; | ||
| 259 | - border: 1px solid #8EA8CF; | ||
| 260 | - width: 100%; | ||
| 261 | - } | ||
| 262 | - .confirm-btn { | ||
| 263 | - background-color: #8EA8CF; | ||
| 264 | - color: #ffffff; | ||
| 265 | - border: 1px solid #8EA8CF; | ||
| 266 | - width: 100%; | ||
| 267 | - } | ||
| 268 | -} | ||
| 269 | -</style> |
src/components/sms/demo.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <demo @handle="save"></demo> | ||
| 4 | - </div> | ||
| 5 | -</template> | ||
| 6 | - | ||
| 7 | -<script> | ||
| 8 | -import demo from 'components/sms/demo' | ||
| 9 | - | ||
| 10 | -export default { | ||
| 11 | - components: { demo }, | ||
| 12 | - data () { | ||
| 13 | - return { | ||
| 14 | - } | ||
| 15 | - }, | ||
| 16 | - methods: { | ||
| 17 | - save (val) { | ||
| 18 | - console.warn(val) | ||
| 19 | - } | ||
| 20 | - } | ||
| 21 | -} | ||
| 22 | -</script> | ||
| 23 | - | ||
| 24 | -<style lang="less"> | ||
| 25 | -</style> |
src/components/sms/sms.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class="SMS"> | ||
| 3 | - <!-- 验证码 --> | ||
| 4 | - <flexbox> | ||
| 5 | - <flexbox-item> | ||
| 6 | - <div class="flex-demo" :span="6"> | ||
| 7 | - <x-input | ||
| 8 | - class="smsCodeWrap" | ||
| 9 | - v-model="smsCode" | ||
| 10 | - placeholder="请输入验证码" | ||
| 11 | - required | ||
| 12 | - :show-clear="true" | ||
| 13 | - @on-blur="onBlur" | ||
| 14 | - placeholder-align="left"></x-input> | ||
| 15 | - </div> | ||
| 16 | - </flexbox-item> | ||
| 17 | - <flexbox-item :span="6"> | ||
| 18 | - <div class="ctl-btn"> | ||
| 19 | - <span v-if="!countDownStatus" @click="getCode()">获取验证码</span> | ||
| 20 | - <span v-else :disabled="countDownStatus" @click="getCode()">{{ countDownDuring }}秒后重新获取</span> | ||
| 21 | - <x-button mini :disabled="this.smsCode === ''" @click.native="submitCode()">确定</x-button> | ||
| 22 | - </div> | ||
| 23 | - </flexbox-item> | ||
| 24 | - </flexbox> | ||
| 25 | - <toast v-model="smsCodeMsgShow" :time="1500">{{smsCodeMsg}}</toast> | ||
| 26 | - </div> | ||
| 27 | -</template> | ||
| 28 | - | ||
| 29 | -<script> | ||
| 30 | -import { Flexbox, FlexboxItem, XInput, XButton, Alert, TransferDomDirective as TransferDom, Toast } from 'vux' | ||
| 31 | -export default { | ||
| 32 | - directives: { | ||
| 33 | - TransferDom | ||
| 34 | - }, | ||
| 35 | - components: { | ||
| 36 | - Flexbox, | ||
| 37 | - FlexboxItem, | ||
| 38 | - XInput, | ||
| 39 | - XButton, | ||
| 40 | - Alert, | ||
| 41 | - Toast | ||
| 42 | - }, | ||
| 43 | - props: [ 'TYPE' ], | ||
| 44 | - data () { | ||
| 45 | - return { | ||
| 46 | - smsCode: '', | ||
| 47 | - smsCodeMsg: '验证码发送成功', | ||
| 48 | - smsCodeMsgShow: false, | ||
| 49 | - countDownDuring: 60, | ||
| 50 | - countDownStatus: false | ||
| 51 | - } | ||
| 52 | - }, | ||
| 53 | - computed: { | ||
| 54 | - }, | ||
| 55 | - methods: { | ||
| 56 | - onBlur () {}, | ||
| 57 | - countDown () { | ||
| 58 | - this.countDownStatus = true | ||
| 59 | - // 倒计时 一分钟 | ||
| 60 | - if (this.countDownDuring > 0) { | ||
| 61 | - var Timer = setInterval(() => { | ||
| 62 | - this.countDownDuring = this.countDownDuring - 1; | ||
| 63 | - }, 1000); | ||
| 64 | - } else { | ||
| 65 | - this.countDownStatus = true | ||
| 66 | - } | ||
| 67 | - setTimeout(() => { | ||
| 68 | - // 倒计时状态 | ||
| 69 | - clearInterval(Timer) | ||
| 70 | - this.countDownStatus = false | ||
| 71 | - this.countDownDuring = 60 | ||
| 72 | - }, 60000) | ||
| 73 | - }, | ||
| 74 | - getCode () { | ||
| 75 | - // 获取验证码 | ||
| 76 | - // axios.post('b/auth/pin', { type: this.TYPE }) | ||
| 77 | - // .then(res => { | ||
| 78 | - // if (res.data.ret === 'OK') { | ||
| 79 | - // this.smsCodeMsgShow = true | ||
| 80 | - // // 激活倒计时 | ||
| 81 | - // this.countDown() | ||
| 82 | - // } else { | ||
| 83 | - // this.smsCodeMsgShow = true | ||
| 84 | - // this.smsCodeMsg = '出错了' | ||
| 85 | - // console.warn(res); | ||
| 86 | - // } | ||
| 87 | - // }) | ||
| 88 | - // .catch(err => { | ||
| 89 | - // console.error(err); | ||
| 90 | - // }) | ||
| 91 | - this.countDown() | ||
| 92 | - }, | ||
| 93 | - submitCode () { | ||
| 94 | - // 验证验证码 | ||
| 95 | - this.$emit('handle', this.smsCode) | ||
| 96 | - this.smsCode = '' | ||
| 97 | - } | ||
| 98 | - } | ||
| 99 | -} | ||
| 100 | -</script> | ||
| 101 | - | ||
| 102 | -<style lang="less"> | ||
| 103 | -.smsCodeWrap { | ||
| 104 | - font-size: 0.9rem; | ||
| 105 | - /* border: 1px solid #ccc; */ | ||
| 106 | - padding: 3px 8px!important; | ||
| 107 | - /* border-radius: 5px */ | ||
| 108 | -} | ||
| 109 | -.ctl-btn { | ||
| 110 | - span { | ||
| 111 | - display: inline-block; | ||
| 112 | - padding: 3px 8px; | ||
| 113 | - background: #f2f2f2; | ||
| 114 | - font-size: 0.9rem; | ||
| 115 | - border-radius: 5px; | ||
| 116 | - color: #45547a; | ||
| 117 | - } | ||
| 118 | -} | ||
| 119 | -</style> |
src/components/tabBar/demo.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div class=""> | ||
| 3 | - <tabBar @on-change="onIndexChange" :tabList="tabList"></tabBar> | ||
| 4 | - </div> | ||
| 5 | -</template> | ||
| 6 | -<script> | ||
| 7 | - import tabBar from 'components/tabBar/index' | ||
| 8 | - export default { | ||
| 9 | - components: { | ||
| 10 | - tabBar | ||
| 11 | - }, | ||
| 12 | - data () { | ||
| 13 | - return { | ||
| 14 | - tabList: [ | ||
| 15 | - { | ||
| 16 | - name: '首页', | ||
| 17 | - imgurl: '', | ||
| 18 | - num: '2', | ||
| 19 | - selected: false, | ||
| 20 | - link: '' | ||
| 21 | - }, | ||
| 22 | - { | ||
| 23 | - name: '购物车', | ||
| 24 | - imgurl: '', | ||
| 25 | - num: '', | ||
| 26 | - selected: true, | ||
| 27 | - link: '' | ||
| 28 | - } | ||
| 29 | - ] | ||
| 30 | - } | ||
| 31 | - }, | ||
| 32 | - methods: { | ||
| 33 | - onIndexChange (index) { | ||
| 34 | - console.warn(index) | ||
| 35 | - } | ||
| 36 | - } | ||
| 37 | - } | ||
| 38 | -</script> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
src/components/tabBar/index.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div class="tabBar"> | ||
| 3 | - <tabbar @on-index-change="onChange"> | ||
| 4 | - <tabbar-item v-for="(item, index) in tabList" :key="index" :selected="item.selected" :badge="item.num" :link="item.link"> | ||
| 5 | - <img slot="icon" :src="item.imgUrl"> | ||
| 6 | - <span slot="label">{{item.name}}</span> | ||
| 7 | - </tabbar-item> | ||
| 8 | - </tabbar> | ||
| 9 | - </div> | ||
| 10 | -</template> | ||
| 11 | -<script> | ||
| 12 | - /* | ||
| 13 | - 底部导航栏组件 | ||
| 14 | - tablist: { | ||
| 15 | - num: 消息标记数量,传空值则没有标记, | ||
| 16 | - link: 跳转页面链接, | ||
| 17 | - imgUrl: 导航图标, | ||
| 18 | - name: 导航名称 | ||
| 19 | - selected: 是否选中当前项 | ||
| 20 | - } | ||
| 21 | - onChange:底部导航选中改变时的回调 | ||
| 22 | - */ | ||
| 23 | - import { Tabbar, TabbarItem } from 'vux' | ||
| 24 | - export default { | ||
| 25 | - components: { | ||
| 26 | - Tabbar, | ||
| 27 | - TabbarItem | ||
| 28 | - }, | ||
| 29 | - props: ['tabList'], | ||
| 30 | - data () { | ||
| 31 | - return {} | ||
| 32 | - }, | ||
| 33 | - methods: { | ||
| 34 | - onChange (index) { | ||
| 35 | - this.$emit('on-change', index) | ||
| 36 | - } | ||
| 37 | - } | ||
| 38 | - }; | ||
| 39 | -</script> | ||
| 40 | -<style lang="less"> | ||
| 41 | -.tabBar { | ||
| 42 | - .weui-tabbar__icon { | ||
| 43 | - position: relative; | ||
| 44 | - .vux-badge-single { | ||
| 45 | - width: auto; | ||
| 46 | - min-width: 16px; | ||
| 47 | - } | ||
| 48 | - } | ||
| 49 | - .weui-tabbar__icon > sup { | ||
| 50 | - position: absolute; | ||
| 51 | - top: 0; | ||
| 52 | - left: 35px; | ||
| 53 | - transform: translateX(-50%); | ||
| 54 | - z-index: 101; | ||
| 55 | - } | ||
| 56 | - .weui-tabbar__item.vux-tabbar-simple { | ||
| 57 | - padding: 0 10px; | ||
| 58 | - height: 50px; | ||
| 59 | - line-height: 50px; | ||
| 60 | - } | ||
| 61 | - .vux-tabbar-simple .weui-tabbar__label { | ||
| 62 | - font-size: 14px; | ||
| 63 | - line-height: 50px; | ||
| 64 | - } | ||
| 65 | - .weui-tabbar__item.weui-bar__item_on .weui-tabbar__label { | ||
| 66 | - color: #89A9CF; | ||
| 67 | - } | ||
| 68 | -} | ||
| 69 | - | ||
| 70 | -</style> |
src/components/tabSwiper/demo.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class=""> | ||
| 3 | - <tab-swiper :list="list" :default_selected="default_selected" @on-item-click="onItemClick"></tab-swiper> | ||
| 4 | - </div> | ||
| 5 | -</template> | ||
| 6 | - | ||
| 7 | -<script> | ||
| 8 | -import tabSwiper from 'components/tabSwiper/index' | ||
| 9 | - | ||
| 10 | -export default { | ||
| 11 | - components: { tabSwiper }, | ||
| 12 | - data () { | ||
| 13 | - return { | ||
| 14 | - list: ['消息', '通讯录'], | ||
| 15 | - default_selected: '消息' | ||
| 16 | - } | ||
| 17 | - }, | ||
| 18 | - methods: { | ||
| 19 | - onItemClick (index) { | ||
| 20 | - console.warn(index); | ||
| 21 | - } | ||
| 22 | - } | ||
| 23 | -} | ||
| 24 | -</script> | ||
| 25 | - | ||
| 26 | -<style lang="less" scoped> | ||
| 27 | -</style> |
src/components/tabSwiper/index.vue
deleted
100644 → 0
| 1 | -<template lang="html"> | ||
| 2 | - <div class="tab-wrapper"> | ||
| 3 | - <div class="tab-content"> | ||
| 4 | - <tab bar-active-color="#8da9cf" :custom-bar-width="getBarWidth"> | ||
| 5 | - <tab-item active-class="active" v-for="(item, index) in list" :key="index" :class="{'vux-1px-r': index+1!==list.length}" :selected="default_selected === item" @on-item-click="onItemClick">{{item}}</tab-item> | ||
| 6 | - </tab> | ||
| 7 | - </div> | ||
| 8 | - </div> | ||
| 9 | -</template> | ||
| 10 | - | ||
| 11 | -<script> | ||
| 12 | -/** | ||
| 13 | - * [参考用法 vux tab 组件] | ||
| 14 | - * | ||
| 15 | - * [list tab 显示名称] | ||
| 16 | - * @type {Array} | ||
| 17 | - * | ||
| 18 | - * [default_selected tab 默认显示名称] | ||
| 19 | - * @type {String} | ||
| 20 | - * | ||
| 21 | - * [on-item-click 点击回调返回 index] | ||
| 22 | - */ | ||
| 23 | -import { Tab, TabItem } from 'vux' | ||
| 24 | - | ||
| 25 | -export default { | ||
| 26 | - components: { Tab, TabItem }, | ||
| 27 | - props: ['list', 'default_selected'], | ||
| 28 | - data () { | ||
| 29 | - return { | ||
| 30 | - getBarWidth: function (index) { | ||
| 31 | - return (index + 1) * 40 + 'px' | ||
| 32 | - } | ||
| 33 | - } | ||
| 34 | - }, | ||
| 35 | - methods: { | ||
| 36 | - onItemClick (index) { | ||
| 37 | - this.$emit('on-item-click', index) | ||
| 38 | - } | ||
| 39 | - } | ||
| 40 | -} | ||
| 41 | -</script> | ||
| 42 | - | ||
| 43 | -<style lang="less" scoped> | ||
| 44 | -@import '~vux/src/styles/1px.less'; | ||
| 45 | -@import '~vux/src/styles/center.less'; | ||
| 46 | - | ||
| 47 | -.vux-tab .vux-tab-item { | ||
| 48 | - background: none; | ||
| 49 | -} | ||
| 50 | -.vux-1px-r:after { | ||
| 51 | - height: 50%; | ||
| 52 | - top: 30%; | ||
| 53 | -} | ||
| 54 | - | ||
| 55 | -.active { | ||
| 56 | - color: #8da9cf !important; | ||
| 57 | - border-color: #8da9cf!important; | ||
| 58 | -} | ||
| 59 | - | ||
| 60 | -.tab-wrapper { | ||
| 61 | - padding: 1rem 1rem 0 1rem; | ||
| 62 | - .tab-content { | ||
| 63 | - border-top: 1px solid #dddddf; | ||
| 64 | - border-left: 1px solid #dddddf; | ||
| 65 | - border-right: 1px solid #dddddf; | ||
| 66 | - } | ||
| 67 | -} | ||
| 68 | -</style> |
src/components/title/index.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div> | ||
| 3 | - <div class="title"> | ||
| 4 | - <p>{{text}}</p> | ||
| 5 | - <p class="rightText" v-if="pShow" @click="topClick">{{rightText}}</p> | ||
| 6 | - </div> | ||
| 7 | - </div> | ||
| 8 | -</template> | ||
| 9 | -<script> | ||
| 10 | -export default { | ||
| 11 | - props: ['text', 'pShow', 'rightText'], | ||
| 12 | - data () { | ||
| 13 | - return {} | ||
| 14 | - }, | ||
| 15 | - methods: { | ||
| 16 | - topClick () { | ||
| 17 | - this.$emit('topClick') | ||
| 18 | - } | ||
| 19 | - } | ||
| 20 | -} | ||
| 21 | -</script> | ||
| 22 | - | ||
| 23 | -<style lang="less" scoped> | ||
| 24 | - .title { | ||
| 25 | - width: 100%; | ||
| 26 | - height: 44px; | ||
| 27 | - background-color: #333; | ||
| 28 | - position: fixed; | ||
| 29 | - top: 0; | ||
| 30 | - left: 0; | ||
| 31 | - color: #fff; | ||
| 32 | - font-size: 16px; | ||
| 33 | - // line-height: 44px; | ||
| 34 | - text-align: center; | ||
| 35 | - z-index: 10; | ||
| 36 | - display: flex; | ||
| 37 | - align-items: center; | ||
| 38 | - &>p:first-child { | ||
| 39 | - line-height: 20px; | ||
| 40 | - flex: 1; | ||
| 41 | - } | ||
| 42 | - .rightText { | ||
| 43 | - position: absolute; | ||
| 44 | - top: 0; | ||
| 45 | - right: 20px; | ||
| 46 | - line-height: 44px; | ||
| 47 | - } | ||
| 48 | - } | ||
| 49 | -</style> | ||
| 50 | - |
src/components/upload/demo.vue
deleted
100644 → 0
File mode changed
src/components/upload/index.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div> | ||
| 3 | - <div v-show="multiple"> | ||
| 4 | - <label for="file">+</label> | ||
| 5 | - <img v-show="multiple && imgShow" :src="img" alt=""> | ||
| 6 | - <input id="file" type="file" multiple @change="selectImg"> | ||
| 7 | - </div> | ||
| 8 | - <div v-show="!multiple"> | ||
| 9 | - <label for="file1">+</label> | ||
| 10 | - <input id="file1" type="file" @change="selectImg"> | ||
| 11 | - </div> | ||
| 12 | - </div> | ||
| 13 | -</template> | ||
| 14 | -<script> | ||
| 15 | - export default { | ||
| 16 | - props: { | ||
| 17 | - multiple: { | ||
| 18 | - type: Boolean, | ||
| 19 | - default: false | ||
| 20 | - }, | ||
| 21 | - action: { | ||
| 22 | - type: String, | ||
| 23 | - default: '' | ||
| 24 | - }, | ||
| 25 | - img: { | ||
| 26 | - type: String, | ||
| 27 | - default: '' | ||
| 28 | - } | ||
| 29 | - }, | ||
| 30 | - data () { | ||
| 31 | - return { | ||
| 32 | - imgShow: false | ||
| 33 | - } | ||
| 34 | - }, | ||
| 35 | - mounted () { | ||
| 36 | - console.warn(this.action) | ||
| 37 | - }, | ||
| 38 | - methods: { | ||
| 39 | - selectImg (file) { | ||
| 40 | - console.warn(file) | ||
| 41 | - let formData = new FormData() | ||
| 42 | - formData.append('file', file.target.files[0]) | ||
| 43 | - formData.append('type', 'test') | ||
| 44 | - this.$vux.loading.show({ | ||
| 45 | - text: '正在上传' | ||
| 46 | - }) | ||
| 47 | - axios.post(this.action, formData) | ||
| 48 | - .then((res) => { | ||
| 49 | - console.warn(res) | ||
| 50 | - this.imgShow = true; | ||
| 51 | - this.$vux.loading.hide() | ||
| 52 | - this.$emit('success', res.data) | ||
| 53 | - }) | ||
| 54 | - } | ||
| 55 | - } | ||
| 56 | - } | ||
| 57 | -</script> | ||
| 58 | -<style lang="less" scoped> | ||
| 59 | - div { | ||
| 60 | - margin-top: 10px; | ||
| 61 | - } | ||
| 62 | - label { | ||
| 63 | - display: inline-block; | ||
| 64 | - width: 48px; | ||
| 65 | - height: 48px; | ||
| 66 | - border: 1px solid #d6d7dc; | ||
| 67 | - text-align: center; | ||
| 68 | - line-height: 46px; | ||
| 69 | - color: #d6d7dc; | ||
| 70 | - font-size: 42px; | ||
| 71 | - cursor: pointer; | ||
| 72 | - vertical-align: top; | ||
| 73 | - } | ||
| 74 | - img { | ||
| 75 | - width: 50px; | ||
| 76 | - height: 50px; | ||
| 77 | - } | ||
| 78 | - input[type="file"] { | ||
| 79 | - display: none; | ||
| 80 | - } | ||
| 81 | -</style> |
| 1 | -<template> | ||
| 2 | - <div class="vux-x-input weui-cell"> | ||
| 3 | - <div class="weui-cell__bd weui-cell__primary"> | ||
| 4 | - <input class="weui-input" style="text-align: center;" type="number" v-on="listeners" v-model="val" ref="input" :placeholder="placeholder" :disabled="disabled" @focus="onFocus"> | ||
| 5 | - </div> | ||
| 6 | - </div> | ||
| 7 | -</template> | ||
| 8 | - | ||
| 9 | -<script type="text/ecmascript-6"> | ||
| 10 | -export default { | ||
| 11 | - mounted () { | ||
| 12 | - this.updateValue(this.value) | ||
| 13 | - }, | ||
| 14 | - name: 'vue-pattern-input', | ||
| 15 | - props: { | ||
| 16 | - value: { | ||
| 17 | - required: true, | ||
| 18 | - default: '', | ||
| 19 | - type: [Number, String] | ||
| 20 | - }, | ||
| 21 | - regExp: { | ||
| 22 | - type: RegExp, | ||
| 23 | - default: null | ||
| 24 | - }, | ||
| 25 | - replacement: { | ||
| 26 | - type: String, | ||
| 27 | - default: '' | ||
| 28 | - }, | ||
| 29 | - placeholder: { | ||
| 30 | - type: String, | ||
| 31 | - default: '' | ||
| 32 | - }, | ||
| 33 | - disabled: { | ||
| 34 | - type: Boolean, | ||
| 35 | - default: false | ||
| 36 | - } | ||
| 37 | - }, | ||
| 38 | - data () { | ||
| 39 | - return { | ||
| 40 | - val: '', | ||
| 41 | - tmp: '' | ||
| 42 | - } | ||
| 43 | - }, | ||
| 44 | - computed: { | ||
| 45 | - listeners () { | ||
| 46 | - const listeners = {} | ||
| 47 | - | ||
| 48 | - Object.keys(this.$listeners).forEach(fnName => { | ||
| 49 | - listeners[fnName] = (e) => { | ||
| 50 | - let val = e.target.value !== '' ? e.target.value : e.data | ||
| 51 | - // console.warn(val); | ||
| 52 | - this.$listeners[fnName](val) | ||
| 53 | - } | ||
| 54 | - }) | ||
| 55 | - | ||
| 56 | - listeners.input = (e) => { | ||
| 57 | - let val = e.target.value !== '' ? e.target.value : e.data | ||
| 58 | - // console.warn(val); | ||
| 59 | - this.updateValue(val) | ||
| 60 | - } | ||
| 61 | - | ||
| 62 | - return listeners | ||
| 63 | - } | ||
| 64 | - }, | ||
| 65 | - methods: { | ||
| 66 | - // format the value of input | ||
| 67 | - formatValue (val) { | ||
| 68 | - let formattedValue = '' | ||
| 69 | - // const formattedValue = val.toString().replace(this.regExp, this.replacement) | ||
| 70 | - val = _.isNull(val) ? '' : val | ||
| 71 | - if (this.regExp.test(val.toString())) { | ||
| 72 | - formattedValue = val.toString(); | ||
| 73 | - this.tmp = val.toString() | ||
| 74 | - } else { | ||
| 75 | - formattedValue = this.tmp ? this.tmp : ' ' | ||
| 76 | - } | ||
| 77 | - | ||
| 78 | - return formattedValue | ||
| 79 | - }, | ||
| 80 | - | ||
| 81 | - // update the value of input | ||
| 82 | - updateValue (val) { | ||
| 83 | - const formattedValue = this.formatValue(val) | ||
| 84 | - | ||
| 85 | - this.val = formattedValue | ||
| 86 | - this.emitInput(formattedValue) | ||
| 87 | - this.emitChange(formattedValue) | ||
| 88 | - }, | ||
| 89 | - | ||
| 90 | - // emit input event | ||
| 91 | - emitInput (val) { | ||
| 92 | - this.$emit('input', val) | ||
| 93 | - }, | ||
| 94 | - | ||
| 95 | - // emit change event | ||
| 96 | - emitChange () { | ||
| 97 | - this.$emit('change', this.val) | ||
| 98 | - }, | ||
| 99 | - onFocus (e) { | ||
| 100 | - this.$emit('on-focus', e); | ||
| 101 | - } | ||
| 102 | - }, | ||
| 103 | - watch: { | ||
| 104 | - // watch value prop | ||
| 105 | - value (val) { | ||
| 106 | - if (val !== this.val) { | ||
| 107 | - this.updateValue(val) | ||
| 108 | - } | ||
| 109 | - } | ||
| 110 | - } | ||
| 111 | -} | ||
| 112 | -</script> | ||
| 113 | - | ||
| 114 | -<style lang="less"> | ||
| 115 | - .vux-x-input.weui-cell { | ||
| 116 | - border: 1px solid #eee; | ||
| 117 | - padding: 0; | ||
| 118 | - border-radius: .2rem; | ||
| 119 | - } | ||
| 120 | - | ||
| 121 | - .weui-cell__bd { | ||
| 122 | - -ms-flex: 1; | ||
| 123 | - flex: 1; | ||
| 124 | - } | ||
| 125 | - | ||
| 126 | - .weui-input { | ||
| 127 | - width: 100%; | ||
| 128 | - border: 0; | ||
| 129 | - outline: 0; | ||
| 130 | - -webkit-appearance: none; | ||
| 131 | - background-color: transparent; | ||
| 132 | - font-size: inherit; | ||
| 133 | - color: inherit; | ||
| 134 | - height: 1.41176471em; | ||
| 135 | - line-height: 1.41176471; | ||
| 136 | - } | ||
| 137 | -</style> |
| 1 | -/* jshint esversion: 6 */ | 1 | +import Vue from 'vue' |
| 2 | -import Vue from 'vue'; | 2 | +import App from './App.vue' |
| 3 | -import Vuex from 'vuex'; | 3 | +import router from './router' |
| 4 | -import VueRouter from 'vue-router'; | 4 | +import store from './store' |
| 5 | -import App from './App.vue'; | 5 | +import Vant from 'vant' |
| 6 | -import router from './router'; | 6 | +import 'vant/lib/index.css' |
| 7 | -import store from './store'; | ||
| 8 | -import axios from './http'; | ||
| 9 | 7 | ||
| 10 | -Vue.use(VueRouter); | 8 | +Vue.use(Vant) |
| 11 | -Vue.use(Vuex); | ||
| 12 | 9 | ||
| 13 | -Vue.config.productionTip = false; | 10 | +Vue.config.productionTip = false |
| 14 | 11 | ||
| 15 | new Vue({ | 12 | new Vue({ |
| 16 | router, | 13 | router, |
| 17 | store, | 14 | store, |
| 18 | - axios, | ||
| 19 | render: h => h(App) | 15 | render: h => h(App) |
| 20 | -}).$mount('#app'); | 16 | +}).$mount('#app') | ... | ... |
src/multiPages/A/A.js
0 → 100644
| 1 | +// 多页面测试入口文件 | ||
| 2 | +import Vue from 'vue' | ||
| 3 | +import Vuex from 'vuex' | ||
| 4 | +import store from './vuex/store' | ||
| 5 | +import router from './router' | ||
| 6 | +import VueRouter from 'vue-router' | ||
| 7 | +import axios from './http' | ||
| 8 | +import A from './A.vue' | ||
| 9 | +import { sync } from 'vuex-router-sync' | ||
| 10 | +import FastClick from 'fastclick' | ||
| 11 | +import Vant from 'vant' | ||
| 12 | +import 'vant/lib/index.css' | ||
| 13 | + | ||
| 14 | +sync(store, router) | ||
| 15 | +Vue.use(VueRouter) | ||
| 16 | +Vue.use(Vuex) | ||
| 17 | +Vue.use(Vant) | ||
| 18 | + | ||
| 19 | +Vue.config.productionTip = false | ||
| 20 | +Vue.prototype.method = function () {} | ||
| 21 | + | ||
| 22 | +FastClick.attach(document.body) | ||
| 23 | + | ||
| 24 | +new Vue({ | ||
| 25 | + store, | ||
| 26 | + router, | ||
| 27 | + axios, | ||
| 28 | + render: h => h(A) | ||
| 29 | +}).$mount('#A') |
src/multiPages/A/A.vue
0 → 100644
| 1 | +<template lang="html"> | ||
| 2 | + <div id="A" style="height:100%;"> | ||
| 3 | + <router-view style="margin-top: 3rem"></router-view> | ||
| 4 | + </div> | ||
| 5 | +</template> | ||
| 6 | + | ||
| 7 | +<script> | ||
| 8 | +import { mapState } from 'vuex' | ||
| 9 | +export default { | ||
| 10 | + components: {}, | ||
| 11 | + data () { | ||
| 12 | + return { | ||
| 13 | + isIndex: true, | ||
| 14 | + showMore: true | ||
| 15 | + } | ||
| 16 | + }, | ||
| 17 | + computed: { | ||
| 18 | + ...mapState({ | ||
| 19 | + title: state => state.title | ||
| 20 | + }) | ||
| 21 | + }, | ||
| 22 | + watch: { | ||
| 23 | + $route: 'fetchData' | ||
| 24 | + }, | ||
| 25 | + mounted () { | ||
| 26 | + }, | ||
| 27 | + methods: { | ||
| 28 | + fetchData () { | ||
| 29 | + if (this.$route.meta.isIndex) { | ||
| 30 | + this.isIndex = true | ||
| 31 | + } else { | ||
| 32 | + this.isIndex = false | ||
| 33 | + } | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | +} | ||
| 37 | +</script> | ||
| 38 | + | ||
| 39 | +<style lang="less"> | ||
| 40 | + html, body { | ||
| 41 | + font-family: '微软雅黑', Microsoft YaHei; | ||
| 42 | + height: 100%; | ||
| 43 | + width: 100%; | ||
| 44 | + overflow-x: hidden; | ||
| 45 | + background-color: #F0EFF5; | ||
| 46 | + #login { | ||
| 47 | + } | ||
| 48 | + } | ||
| 49 | +</style> |
| 1 | /* jshint esversion: 6 */ | 1 | /* jshint esversion: 6 */ |
| 2 | -import axios from 'axios'; | 2 | +import axios from 'axios' |
| 3 | -import router from './router'; | 3 | +import router from './router' |
| 4 | 4 | ||
| 5 | // 请求拦截器 | 5 | // 请求拦截器 |
| 6 | axios.interceptors.request.use( | 6 | axios.interceptors.request.use( |
| 7 | config => { | 7 | config => { |
| 8 | // 发送请求前 | 8 | // 发送请求前 |
| 9 | - return config; | 9 | + return config |
| 10 | }, | 10 | }, |
| 11 | error => { | 11 | error => { |
| 12 | // 请求错误处理 | 12 | // 请求错误处理 |
| 13 | - return Promise.reject(error); | 13 | + return Promise.reject(error) |
| 14 | - }); | 14 | + }) |
| 15 | 15 | ||
| 16 | // 响应拦截器 | 16 | // 响应拦截器 |
| 17 | axios.interceptors.response.use( | 17 | axios.interceptors.response.use( |
| 18 | response => { | 18 | response => { |
| 19 | - return response; | 19 | + return response |
| 20 | }, | 20 | }, |
| 21 | error => { | 21 | error => { |
| 22 | if (error.response) { | 22 | if (error.response) { |
| 23 | switch (error.response.status) { | 23 | switch (error.response.status) { |
| 24 | case 401: | 24 | case 401: |
| 25 | router.replace({ | 25 | router.replace({ |
| 26 | - path: '/login' | 26 | + path: '/' |
| 27 | - }); | 27 | + }) |
| 28 | - break; | 28 | + break |
| 29 | case 404: | 29 | case 404: |
| 30 | router.replace({ | 30 | router.replace({ |
| 31 | path: '/' | 31 | path: '/' |
| 32 | - }); | 32 | + }) |
| 33 | - break; | 33 | + break |
| 34 | } | 34 | } |
| 35 | } | 35 | } |
| 36 | - return Promise.reject(error.response.data); | 36 | + return Promise.reject(error.response.data) |
| 37 | - }); | 37 | + }) |
| 38 | 38 | ||
| 39 | -export default axios; | 39 | +export default axios | ... | ... |
src/multiPages/A/route.js
0 → 100644
src/multiPages/A/router.js
0 → 100644
| 1 | +/* jshint esversion: 6 */ | ||
| 2 | +import Vue from 'vue' | ||
| 3 | +import VueRouter from 'vue-router' | ||
| 4 | +import ConfigRouter from './route.js' | ||
| 5 | +import store from './vuex/store' | ||
| 6 | + | ||
| 7 | +Vue.use(VueRouter) | ||
| 8 | + | ||
| 9 | +const router = new VueRouter({ | ||
| 10 | + history: false, | ||
| 11 | + hashbang: true, | ||
| 12 | + base: __dirname, | ||
| 13 | + routes: ConfigRouter | ||
| 14 | +}) | ||
| 15 | + | ||
| 16 | +router.beforeEach((to, from, next) => { | ||
| 17 | + store.commit('updateLoadingStatus', true) | ||
| 18 | + next() | ||
| 19 | +}) | ||
| 20 | + | ||
| 21 | +router.afterEach((to, from, next) => { | ||
| 22 | + store.commit('updateLoadingStatus', false) | ||
| 23 | +}) | ||
| 24 | + | ||
| 25 | +export default router |
src/multiPages/A/static/js/fontSize.js
0 → 100644
| 1 | +function initFontSize (baseFontSize, baseWidth) { | ||
| 2 | + let clientWidth = document.documentElement.clientWidth || window.innerWidth() | ||
| 3 | + let size = Math.floor(clientWidth / baseWidth * baseFontSize) | ||
| 4 | + document.querySelector('html').style.fontSize = size + 'px' | ||
| 5 | +} | ||
| 6 | +initFontSize(100, 1080) | ||
| 7 | +window.onresize = function () { | ||
| 8 | + initFontSize(100, 1080) | ||
| 9 | +} |
src/multiPages/A/views/login.vue
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/A/vuex/actions.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/A/vuex/getters.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/A/vuex/store.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/B/B.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/B/B.vue
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/B/http.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/B/route.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/B/router.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/B/static/js/fontSize.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/B/views/login.vue
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/B/vuex/actions.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/B/vuex/getters.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/B/vuex/store.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/C/C.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/C/C.vue
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/C/http.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/C/route.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/C/router.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/C/static/js/fontSize.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/C/views/login.vue
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/C/vuex/actions.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/C/vuex/getters.js
0 → 100644
This diff is collapsed. Click to expand it.
src/multiPages/C/vuex/store.js
0 → 100644
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
src/route.js
deleted
100644 → 0
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
src/views/About.vue
deleted
100644 → 0
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
-
Please register or login to post a comment