Commit 082b57f9 authored by nature's avatar nature

预览原图

parent 3cd28181
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
<span>{{ label }}</span> <span>{{ label }}</span>
</div> </div>
<div :style="{'flex':proportion[1] }" class="field-value"> <div :style="{'flex':proportion[1] }" class="field-value">
<div class="field-body"> <div :class="{'field-control-error':hasError}" class="field-body">
<input <input
v-bind="$attrs" v-bind="$attrs"
v-model="value" v-model="value"
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
</template> </template>
<script> <script>
import {isDef} from '../../../packages/common/utils'
export default { export default {
name: 'DateField', name: 'DateField',
inheritAttrs: false, inheritAttrs: false,
...@@ -99,10 +100,14 @@ export default { ...@@ -99,10 +100,14 @@ export default {
type: String, type: String,
default: require('./right-gray@2x.png'), default: require('./right-gray@2x.png'),
}, },
error: {
type: Boolean,
default: false,
},
}, },
data () { data () {
return { return {
hasError: false,
} }
}, },
computed: { computed: {
...@@ -139,8 +144,12 @@ export default { ...@@ -139,8 +144,12 @@ export default {
}, },
methods: { methods: {
cleanValue () { cleanValue () {
let vm = this
this.$emit('input', null) this.$emit('input', null)
this.$emit('clean', null) this.$emit('clean', null)
if (isDef(vm.value) && vm.error) {
vm.hasError = true
}
}, },
showDate () { showDate () {
let vm = this let vm = this
...@@ -159,6 +168,12 @@ export default { ...@@ -159,6 +168,12 @@ export default {
onConfirm (val) { onConfirm (val) {
vm.$emit('input', val) vm.$emit('input', val)
vm.$emit('onSelect', val) vm.$emit('onSelect', val)
vm.hasError = false
},
onHide () {
if (!isDef(vm.value) && vm.error) {
vm.hasError = true
}
}, },
}) })
} }
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
</template> </template>
<script> <script>
import { formatNumber, isDef, isObject } from '../../../packages/common/utils' import { formatNumber, isDef, isObject, isString } from '../../../packages/common/utils'
export default { export default {
name: 'Field', name: 'Field',
...@@ -134,7 +134,7 @@ export default { ...@@ -134,7 +134,7 @@ export default {
}, },
error: { error: {
type: Boolean, type: Boolean,
default: false, default: true,
}, },
autosize: { autosize: {
type: Boolean | Object, type: Boolean | Object,
...@@ -272,6 +272,9 @@ export default { ...@@ -272,6 +272,9 @@ export default {
const { required, error } = this const { required, error } = this
if (required && error) { if (required && error) {
this.hasError = !isDef(fieldInput.value) this.hasError = !isDef(fieldInput.value)
/* if (isString(error)) {
this.placehold = error
} */
} }
}, },
......
...@@ -13,13 +13,14 @@ ...@@ -13,13 +13,14 @@
<span>{{ label }}</span> <span>{{ label }}</span>
</div> </div>
<div :style="{'flex':proportion[1] }" class="field-value"> <div :style="{'flex':proportion[1] }" class="field-value">
<div class="field-body"> <div :class="{'field-control-error':hasError}" class="field-body">
<input <input
v-bind="$attrs" v-bind="$attrs"
v-model="codeName" :disabled="disabled" :placeholder="selectPlaceholder" :class="('field-control-'+inputAlign)" v-model="codeName" :disabled="disabled" :placeholder="selectPlaceholder" :class="('field-control-'+inputAlign)"
type="text" class="field-control" type="text" class="field-control"
readonly readonly
@click="showSelect"> @click="showSelect"
@blur="onBlur">
<input v-model="value" type="text" hidden> <input v-model="value" type="text" hidden>
<i v-if="showClean" class="field-icon field-right-icon icon ion-close-circled" @click="cleanValue"/> <i v-if="showClean" class="field-icon field-right-icon icon ion-close-circled" @click="cleanValue"/>
<!--<slot name="icon"/>--> <!--<slot name="icon"/>-->
...@@ -31,6 +32,7 @@ ...@@ -31,6 +32,7 @@
</template> </template>
<script> <script>
import {isDef} from '../../../packages/common/utils'
import VueSelect from './index' import VueSelect from './index'
export default { export default {
name: 'SelectField', name: 'SelectField',
...@@ -109,9 +111,14 @@ export default { ...@@ -109,9 +111,14 @@ export default {
type: String, type: String,
default: require('./right-gray@2x.png'), default: require('./right-gray@2x.png'),
}, },
error: {
type: Boolean,
default: false,
},
}, },
data () { data () {
return { return {
hasError: false,
} }
}, },
computed: { computed: {
...@@ -179,10 +186,16 @@ export default { ...@@ -179,10 +186,16 @@ export default {
this.$emit('input', v1) this.$emit('input', v1)
this.$emit('onSelect', v1, v2) this.$emit('onSelect', v1, v2)
} }
vm.hasError = false
}, },
cleanValue () { cleanValue () {
let vm = this
this.$emit('input', null) this.$emit('input', null)
this.$emit('clean', null) this.$emit('clean', null)
const { required, error } = this
if (required && error) {
this.hasError = !isDef(vm.value)
}
}, },
showSelect () { showSelect () {
let vm = this let vm = this
...@@ -204,6 +217,23 @@ export default { ...@@ -204,6 +217,23 @@ export default {
}) })
} }
}, },
// 检验输入的合法性
validate () {
const { fieldInput } = this.$refs
const { required, error } = this
if (required && error) {
this.hasError = !isDef(fieldInput.value)
/* if (isString(error)) {
this.placehold = error
} */
}
},
onBlur (event) {
this.focused = false
this.$emit('blur', event)
this.validate()
},
}, },
} }
</script> </script>
......
...@@ -12,7 +12,8 @@ ...@@ -12,7 +12,8 @@
v-if="!imgList.length" v-if="!imgList.length"
:alt="imgTitle"> :alt="imgTitle">
<swipe <swipe
v-if="imgList.length" :index.sync="startPosition" :auto="false" :show-indicators="false"> v-if="imgList.length" :index.sync="startPosition" :auto="false" :show-indicators="false"
@change="swipeChange">
<swipe-item <swipe-item
v-for="(item,index) in imgList" :key="index"> v-for="(item,index) in imgList" :key="index">
<img <img
...@@ -25,6 +26,10 @@ ...@@ -25,6 +26,10 @@
</swipe> </swipe>
</div> </div>
<div v-if="imgList.length" class="indicators">{{ startPosition + 1 }}/{{ imgList.length }}</div> <div v-if="imgList.length" class="indicators">{{ startPosition + 1 }}/{{ imgList.length }}</div>
<div v-show="imgOriginalUrl && percent!=100" class="img-origin" @click="showOriginPic(imgOriginalUrl,startPosition)">
<div class="word">{{ word }}</div>
<div v-show="percent" :style="{width:percent+'%'}" class="progress"/>
</div>
</div> </div>
</div> </div>
</template> </template>
...@@ -45,7 +50,7 @@ ...@@ -45,7 +50,7 @@
} }
&.active { &.active {
background-color: rgba(0, 0, 0, 0.6); background-color: rgba(0, 0, 0, 0.9);
} }
.show-picture-wrapper { .show-picture-wrapper {
...@@ -80,7 +85,7 @@ ...@@ -80,7 +85,7 @@
justify-content: center; justify-content: center;
align-items: center; align-items: center;
object-fit: cover; object-fit: cover;
// width: fit-content; // width: fit-content;
} }
} }
...@@ -102,30 +107,66 @@ ...@@ -102,30 +107,66 @@
} }
} }
} }
.indicators{
top:20px; .indicators {
top: 20px;
position: absolute; position: absolute;
color: #fff; color: #fff;
font-size: 16px; font-size: 16px;
} }
.img-origin {
position: absolute;
bottom: 40px;
left: 20px;
background-color: #666;
color: #fff;
font-weight: bold;
font-size: 12px;
border-radius: 12px;
min-height: 24px;
min-width: 100px;
.word {
position: absolute;
padding: 6px 10px;
width: 100%;
text-align: center;
}
.progress{
position: absolute;
height: 100%;
background-color: rgba(255,255,255,.4);
border-radius: 12px;
}
}
} }
.modal-open [vum-show-picture] { .modal-open [vum-show-picture] {
pointer-events: auto; pointer-events: auto;
} }
.platform-ios{
.platform-ios {
.show-picture-backdrop { .show-picture-backdrop {
.indicators{ .indicators {
top:40px; top: 40px;
}
.img-origin {
bottom: 40px;
} }
} }
} }
// iPhoneX适配 // iPhoneX适配
@media (device-width: 375px) and (device-height: 812px) and (-webkit-min-device-pixel-ratio: 3) { @media (device-width: 375px) and (device-height: 812px) and (-webkit-min-device-pixel-ratio: 3) {
.platform-ios { .platform-ios {
.show-picture-backdrop { .show-picture-backdrop {
.indicators{ .indicators {
top:60px; top: 60px;
}
.img-origin {
bottom: 70px;
} }
} }
} }
...@@ -135,8 +176,12 @@ ...@@ -135,8 +176,12 @@
@media (device-width: 414px) and (device-height: 896px) { @media (device-width: 414px) and (device-height: 896px) {
.platform-ios { .platform-ios {
.show-picture-backdrop { .show-picture-backdrop {
.indicators{ .indicators {
top:60px; top: 60px;
}
.img-origin {
bottom: 70px;
} }
} }
} }
...@@ -144,6 +189,7 @@ ...@@ -144,6 +189,7 @@
</style> </style>
<script> <script>
import {isFunction} from '../../common/utils'
import assign from 'object-assign' import assign from 'object-assign'
import SwipeItem from '../Swipe/SwipeItem' import SwipeItem from '../Swipe/SwipeItem'
import Swipe from '../Swipe/index' import Swipe from '../Swipe/index'
...@@ -157,17 +203,25 @@ export default { ...@@ -157,17 +203,25 @@ export default {
return { return {
defaultOptions: { defaultOptions: {
imgUrl: '', imgUrl: '',
imgOriginalUrl: '',
imgList: [], imgList: [],
startPosition: 0, startPosition: 0,
imgTitle: '', imgTitle: '',
width: '100', width: '100',
imgSize: 0,
}, },
imgUrl: '', imgUrl: '',
imgOriginalUrl: '',
imgList: [], imgList: [],
startPosition: 0, startPosition: 0,
imgTitle: '', imgTitle: '',
state: 0, state: 0,
width: '100', width: '100',
imgSize: null,
loadSuccess: null,
percent: 0,
original: '查看原图',
word: '',
} }
}, },
...@@ -191,12 +245,28 @@ export default { ...@@ -191,12 +245,28 @@ export default {
this.imgTitle = _options.imgTitle this.imgTitle = _options.imgTitle
this.width = _options.width this.width = _options.width
this.imgList = _options.imgList || [] this.imgList = _options.imgList || []
this.startPosition = _options.startPosition this.startPosition = _options.startPosition || 0
this.percent = _options.percent
this.imgOriginalUrl = _options.imgOriginalUrl
this.loadSuccess = _options.loadSuccess
this.state = 1 this.state = 1
if (!this.width) { if (!this.width) {
this.width = 100 this.width = 100
} }
vm.$refs.pad.style.width = this.width + '%' vm.$refs.pad.style.width = this.width + '%'
if (_options.imgSize) {
vm.imgSize = vm.formatSize(_options.imgSize)
vm.word = vm.original + vm.imgSize
}
vm.imgList.forEach((item, index, array) => {
item.word = vm.original + vm.formatSize(array[index].imgSize)
item.percent = item.percent | 0
})
if (vm.imgList.length) {
vm.word = vm.imgList[vm.startPosition].word
vm.imgOriginalUrl = vm.imgList[vm.startPosition].imgOriginalUrl
vm.percent = vm.imgList[vm.startPosition].percent
}
}, },
hide () { hide () {
...@@ -207,9 +277,80 @@ export default { ...@@ -207,9 +277,80 @@ export default {
}, false) }, false)
}, },
formatSize (size = 0, pointLength = 1, units) {
var unit
units = units || ['B', 'K', 'M', 'G', 'TB']
while ((unit = units.shift()) && size > 1024) {
size = size / 1024
}
return (unit === 'B' ? size : size.toFixed(pointLength === undefined ? 2 : pointLength)) + unit
},
getState () { getState () {
return this.state return this.state
}, },
showOriginPic (originalUrl, startPosition = 0) {
let vm = this
function getHttpObj () {
var httpobj = null
try {
httpobj = new ActiveXObject('Msxml2.XMLHTTP')
} catch (e) {
try {
httpobj = new ActiveXObject('Microsoft.XMLHTTP')
} catch (e1) {
httpobj = new XMLHttpRequest()
}
}
return httpobj
}
// eslint-disable-next-line new-cap
var xhr = new getHttpObj()
xhr.responseType = 'blob'
xhr.open('GET', originalUrl, true)
xhr.onprogress = function (event) {
if (event.lengthComputable) {
// console.log(event.loaded)
// console.log(event.total)
vm.percent = event.loaded / event.total * 100
vm.word = '下载' + vm.percent.toFixed(2) + '%'
}
}
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
// 使用URL.createObjectURL将Blob对象转换为可访问的url地址
let src = URL.createObjectURL(xhr.response)
vm.imgOriginalUrl = src
vm.imgUrl = src
if (vm.imgList.length) {
vm.imgList[startPosition].imgUrl = src
vm.imgList[startPosition].imgOriginalUrl = src
vm.imgList[startPosition].percent = 100
}
if (isFunction(vm.loadSuccess)) {
vm.loadSuccess({
index: startPosition,
percent: 100,
localUrl: src,
})
}
}
}
xhr.send()
},
swipeChange (index) {
let vm = this
vm.imgOriginalUrl = vm.imgList[index].imgOriginalUrl
vm.percent = vm.imgList[index].percent
vm.word = vm.imgList[index].word
},
sharePicture () { sharePicture () {
// var reg = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/ // var reg = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/
// window.plugins.socialsharing.share(null, null, this.imgUrl, null) // window.plugins.socialsharing.share(null, null, this.imgUrl, null)
......
...@@ -295,6 +295,24 @@ export default { ...@@ -295,6 +295,24 @@ export default {
modal: '', modal: '',
showModalValue: false, showModalValue: false,
radioValue: true, radioValue: true,
imgList: [
{imgUrl: 'http://hlsapp.hand-china.com/hls_file/2018/05/F1B6D85E409A4714A8540504B2D133AD',
imgOriginalUrl: 'http://hlsapp.hand-china.com/file/orign.png',
imgSize: 2982604,
percent: 0,
},
{imgUrl: 'http://hlsapp.hand-china.com/hls_file/2018/05/F1B6D85E409A4714A8540504B2D133AD',
imgOriginalUrl: 'http://hlsapp.hand-china.com/file/orign.png',
imgSize: 2282604,
percent: 0,
},
{imgUrl: 'http://hlsapp.hand-china.com/hls_file/2018/05/F1B6D85E409A4714A8540504B2D133AD',
imgOriginalUrl: 'http://hlsapp.hand-china.com/file/orign.png',
imgSize: 3282604,
percent: 0,
},
],
} }
}, },
watch: { watch: {
...@@ -434,8 +452,16 @@ export default { ...@@ -434,8 +452,16 @@ export default {
}) })
}, },
showBigPicture () { showBigPicture () {
this.hlsPopup.showBigPicture({ let vm = this
imgUrl: 'http://hlsapp.hand-china.com/hls_file/2018/05/F1B6D85E409A4714A8540504B2D133AD', vm.hlsPopup.showBigPicture({
/* imgUrl: 'http://hlsapp.hand-china.com/hls_file/2018/05/F1B6D85E409A4714A8540504B2D133AD',
imgOriginalUrl: 'http://hlsapp.hand-china.com/file/orign.png',
imgSize: 2882604, */
imgList: vm.imgList,
loadSuccess: (src) => {
vm.imgList[src.index]['percent'] = src.percent
vm.imgList[src.index]['imgOriginalUrl'] = src.localUrl
},
}) })
}, },
selectListMultiple () { selectListMultiple () {
...@@ -469,7 +495,7 @@ export default { ...@@ -469,7 +495,7 @@ export default {
}, { }, {
'code': 'NP2', 'code': 'NP2',
'code_name': '个人2', 'code_name': '个人2',
},{ }, {
'code': 'NP', 'code': 'NP',
'code_name': '个人', 'code_name': '个人',
}, { }, {
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
<tab-item>Vue</tab-item> <tab-item>Vue</tab-item>
<tab-item>APP</tab-item> <tab-item>APP</tab-item>
</s-tab> </s-tab>
<div style="backgroundColor:red;height:50px"/>
<h-content> <h-content>
<list-item> <list-item>
<item> <item>
...@@ -48,7 +47,7 @@ ...@@ -48,7 +47,7 @@
<currency-input v-model="number"/> <currency-input v-model="number"/>
<DateField <DateField
v-model="nowDate" required label="时间" v-model="nowDate" required label="时间"
@onSelect="select"/> @onSelect="select" error/>
<h-field <h-field
v-model="number" format type="number" v-model="number" format type="number"
...@@ -88,6 +87,7 @@ ...@@ -88,6 +87,7 @@
inputAlign="left" inputAlign="left"
clearable error clearable error
required label="家庭地址"/> required label="家庭地址"/>
<!--<img src="@/assets/image/logo.png" @click="imgclick()" alt="img">-->
</h-content> </h-content>
<bottom-tab/> <bottom-tab/>
</h-view> </h-view>
...@@ -140,6 +140,9 @@ export default { ...@@ -140,6 +140,9 @@ export default {
// this.height = this.$refs.textarea.clientHeight // this.height = this.$refs.textarea.clientHeight
}, },
methods: { methods: {
/* imgclick(){
console.log('img click')
}, */
scrollBottom () { scrollBottom () {
let div = document.getElementById('home-content') let div = document.getElementById('home-content')
div.scrollTop = div.scrollHeight div.scrollTop = div.scrollHeight
......
...@@ -251,9 +251,13 @@ export default { ...@@ -251,9 +251,13 @@ export default {
if (typeof imgObject === 'object') { if (typeof imgObject === 'object') {
ShowPicturePlugin.show({ ShowPicturePlugin.show({
imgUrl: imgObject.imgUrl, imgUrl: imgObject.imgUrl,
imgOriginalUrl: imgObject.imgOriginalUrl,
percent: imgObject.imgOriginalUrl || 0,
imgSize: imgObject.imgSize,
width: imgObject.width, width: imgObject.width,
imgList: imgObject.imgList || [], imgList: imgObject.imgList || [],
startPosition: imgObject.startPosition, startPosition: imgObject.startPosition,
loadSuccess: imgObject.loadSuccess,
}) })
} }
}, },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment