From f09d9ec905b6247b36a394158662fe90d02197a5 Mon Sep 17 00:00:00 2001 From: xuxueyang <xuxy@fengyuntec.com> Date: 星期一, 15 七月 2024 14:59:36 +0800 Subject: [PATCH] fix bug --- sub_pages/supplier/supplier-info/supplier-info.vue | 1193 +++++++++++++++++++----------------- uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue | 5 sub_pages/supplier/flower-manage/flower-add.vue | 62 + common/global.scss | 6 mixin/mixin.js | 3 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue | 677 ++++++++++--------- uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js | 4 7 files changed, 1,046 insertions(+), 904 deletions(-) diff --git a/common/global.scss b/common/global.scss index ca95a4d..0523aa9 100644 --- a/common/global.scss +++ b/common/global.scss @@ -99,10 +99,10 @@ font-weight: 400; font-size: 28rpx; line-height: 58rpx; - padding: 8rpx 30rpx; + padding: 8rpx 24rpx; color: #33a868; - margin-left: 13rpx; - margin-right: 13rpx; + margin-left: 6rpx; + margin-right: 6rpx; border: 2rpx solid #F1F5F2; } .value-item.cur{ diff --git a/mixin/mixin.js b/mixin/mixin.js index 0435a8b..a2ac9ad 100644 --- a/mixin/mixin.js +++ b/mixin/mixin.js @@ -24,6 +24,9 @@ cache_user: state => { return state.currentInfo || {} }, + sign: state => { + return state.sign || {} + }, // currentEnId: state=>{ // // console.log('currentEnId',state.currentInfo.enId,state.currentInfo) // return state.currentInfo.enId || '' diff --git a/sub_pages/supplier/flower-manage/flower-add.vue b/sub_pages/supplier/flower-manage/flower-add.vue index e9dee4a..2aff894 100644 --- a/sub_pages/supplier/flower-manage/flower-add.vue +++ b/sub_pages/supplier/flower-manage/flower-add.vue @@ -27,7 +27,7 @@ </view> </view> <view class="form-item before-line"> - <view class="label required">商品名称</view> + <view class="label">商品名称</view> <view class="m-l-a m-r-0 flex"> <input v-model="dto.name" placeholder="请选择分类" disabled style="margin-top: 16px;text-align: right;"></input> @@ -35,7 +35,7 @@ </view> </view> <view class="form-item before-line"> - <view class="label required">商品单位</view> + <view class="label">商品单位</view> <view class="m-l-a m-r-0 flex"> <input v-model="dto.unit" placeholder="请选择分类" disabled style="margin-top: 16px;text-align: right;"></input> @@ -44,7 +44,7 @@ </view> <view class="form-item before-line"> - <view class="label required">商品颜色</view> + <view class="label">商品颜色</view> <!-- <view class="m-l-a m-r-0 flex " :class="[!dto.color?'desc-gray':'']" @click="()=>{ show_select_color=true }"> @@ -77,7 +77,7 @@ </view> <view class="form-item before-line bottom-border-no"> - <view class="label required" style="width: 400rpx;">商品轮播图(300*160px)</view> + <view class="label " style="width: 400rpx;">商品轮播图(300*160px)</view> <view class="m-l-a m-r-0 flex"> <!-- :style="{'background-image':dto.icon&&`url('${dto.icon}')`||''}" --> <view class="component-button-upload" @click="uploadIcon('bannerList')"> @@ -147,7 +147,7 @@ <view class="form-item before-line"> - <view class="label required">商品视频</view> + <view class="label">商品视频</view> <view class="m-l-a m-r-0 flex"> <!-- :style="{'background-image':dto.icon&&`url('${dto.icon}')`||''}" --> <view class="component-button-upload m-r-15" @click="uploadIcon('video')"> @@ -229,6 +229,16 @@ stock: 0, params: [], //id,value }, + requireFields: [{ + name: '商品分类', + key: 'category' + },{ + name: '列表封面图', + key: 'cover' + },{ + name: '商品等级', + key: 'level' + }], show_select_category: false, show_select_level: false, columns_categorys: [], @@ -276,10 +286,10 @@ }).then(res => { var data = res.data this.columns_levels = [data || []] - this.columns_levels[0].unshift({ - label: '全部', - value: '' - }) + // this.columns_levels[0].unshift({ + // label: '全部', + // value: '' + // }) }) if (options.id) { @@ -500,6 +510,16 @@ }, async submit() { + for (var field of this.requireFields) { + if (!this.dto[field.key]) { + this.$message.showToast(`${field.name}信息未填写`) + return + } + } + if(this.dto.params.length<1){ + this.$message.showToast('商品参数详情未设置') + return + } // if (!this.dto.applicationType) { // this.$message.showToast('未选择类型') // return @@ -532,6 +552,12 @@ this.$store.dispatch('sign_add', 'flower'); this.backpage() + } else { + console.log('error re', re) + if (re.code === 30000 && Array.isArray(re.msg)) { + this.$message.showToast('字段未填写完整') + + } } }, async deleteBanner(index) { @@ -544,8 +570,15 @@ const that = this if (key == 'video') { uni.chooseVideo({ + maxDuration: 30, sourceType: ['camera', 'album'], success: function(res) { + // console.log('res',res) + // size: 11082508 + if (res.size > 1024 * 1024 * 50) { + that.$message.confirm('视频最多支持50M大小,超出大小限制') + return + } if (res.tempFilePath) { console.log('res.tempFilePath', res.tempFilePath) that.$message.showLoading() @@ -572,12 +605,15 @@ count: 1, // 最多可以选择的图片张数,默认9 sizeType: ['compressed'], //original 原图,compressed 压缩图,默认二者都有 sourceType: ['camera', 'album'], //album 从相册选图,camera 使用相机,默认二者都有。如需直接开相机或直接选相册,请只使用一个选项 - success: function({ - errMsg, - tempFiles - }) { + success: function(res) { + let errMsg = res.errMsg + let tempFiles = res.tempFiles if (errMsg === 'chooseImage:ok') { // console.log(tempFiles[0]) + if (tempFiles[0].size > 1024 * 1024 * 5) { + that.$message.confirm('图片最多支持5M大小,超出大小限制') + return + } that.$message.showLoading() that.$http.upload(tempFiles[0].path).then(async res => { console.log('res1', res) diff --git a/sub_pages/supplier/supplier-info/supplier-info.vue b/sub_pages/supplier/supplier-info/supplier-info.vue index 5199068..c4a3c95 100644 --- a/sub_pages/supplier/supplier-info/supplier-info.vue +++ b/sub_pages/supplier/supplier-info/supplier-info.vue @@ -1,566 +1,631 @@ -<template> - <view class="container-page"> - <view> - <view class="form-item"> - <view class="label required">店铺类型</view> - <view class="m-l-a m-r-0 flex " :class="[!dto.typeId?'desc-gray':'']" @click="()=>{ - if(!id){ - show_select_type=true - } - }"> - <view>{{dto.typeName || '请选择'}}</view> - <u-icon class="m-l-a" name="arrow-right"></u-icon> - </view> - <!-- <view class="m-l-a m-r-0 flex " :class="[!dto.typeId?'desc-gray':'']"> - <uni-data-picker @change="(e)=>{PickData('typeId','typeStr',e)}" placeholder="请选择" - :localdata="columns_types"> - {{dto.typeStr || '请选择'}} - </uni-data-picker> - <u-icon class="m-l-a" name="arrow-right"></u-icon> - </view> --> - </view> - <view class="form-item before-line"> - <view class="label required">店铺名称</view> - <view class="m-l-a m-r-0 flex"> - <input v-model="dto.name" placeholder="请输入店铺名称" style="margin-top: 16px;text-align: right;"></input> - - </view> - </view> - <view class="form-item bottom-border-no"> - <view class="label required" style="width: 360rpx;">店铺头像(750*750px)</view> - <view class="m-l-a m-r-0 flex m-t-20 m-b-20"> - <view class="component-button-upload" @click="uploadIcon('cover')"> - - </view> - </view> - </view> - <view v-if="dto.cover"> - <view class="flex p20 form-item bottom-border-no" style="padding-top: 0rpx;padding-bottom: 10rpx"> - <view class="m-r-10 "> - <image class="banner-img" :src="dto.cover" @click.stop="previewImg(dto.cover)"> - - </image> - <view class="t-red text-center" @click.stop="deleteImg('cover','')">删除</view> - </view> - </view> - </view> - <u-divider></u-divider> - - <view class="form-item before-line"> - <view class="label required">联系人姓名</view> - <view class="m-l-a m-r-0 flex"> - <input v-model="dto.contactName" placeholder="请输入联系人姓名" - style="margin-top: 16px;text-align: right;"></input> - - </view> - </view> - <view class="form-item before-line"> - <view class="label required">联系方式</view> - <view class="m-l-a m-r-0 flex"> - <input v-model="dto.contactTel" placeholder="请输入联系方式" - style="margin-top: 16px;text-align: right;"></input> - - </view> - </view> - <view class="form-item before-line"> - <view class="label required">集货站</view> - <view class="m-l-a m-r-0 flex " :class="[!dto.stationId?'desc-gray':'']" @click="()=>{ - if(!id){ - show_select_station=true - } - }"> - <view>{{dto.stationName || '请选择'}}</view> - <u-icon class="m-l-a" name="arrow-right"></u-icon> - </view> - <!-- <view class="m-l-a m-r-0 flex " :class="[!dto.stationId?'desc-gray':'']"> - <uni-data-picker @change="(e)=>{PickData('stationId','stationStr',e)}" placeholder="请选择" - :localdata="columns_station"> - {{dto.typeStr || '请选择'}} - </uni-data-picker> - <u-icon class="m-l-a" name="arrow-right"></u-icon> - </view> --> - - </view> - <view class="form-item before-line"> - <view class="label required">地区</view> - <!-- <view class="m-l-a m-r-0 flex " :class="[!dto.applicationType?'desc-gray':'']" @click="()=>{ - if(!id){ - show_select_type=true - } - }"> - <view>{{dto.applicationTypeStr||dto.applicationType || '请选择'}}</view> - - - <u-icon class="m-l-a" name="arrow-right"></u-icon> - </view> --> - <view class="m-l-a m-r-0 flex " :class="[!dto['province']?'desc-gray':'']"> - <uni-data-picker @change="(e)=>{PickArea(dto,e)}" placeholder="" :localdata="regionDataPlus"> - {{ dto['province'] || '请选择' }}{{ dto['city'] && ('/' + dto['city']) || '' }}{{ - dto['region'] && ('/' + dto['region']) || '' - }} - </uni-data-picker> - <u-icon class="m-l-a" name="arrow-right"></u-icon> - </view> - - </view> - <view class="form-item before-line"> - <view class="label required">地址</view> - <view class="m-l-a m-r-0 flex"> - <input v-model="dto.address" placeholder="请输入地址" - style="margin-top: 16px;text-align: right;"></input> - - </view> - </view> - <view class="form-item before-line"> - <view class="label required">店铺简介</view> - </view> - <view class="flex"> - <u--textarea v-model="dto.description" placeholder="请输入店铺简介"></u--textarea> - </view> - <view class="form-item before-line m-t-20"> - <view class="label required">选择审核方式</view> - <view class="m-l-a m-r-0 flex"> - - <u-radio-group v-model="dto.idcardType" placement="row"> - <u-radio :customStyle="{'margin-bottom': '8px','margin-right': '8px','font-size':'28rpx'}" - v-for="(item, index) in shTypeList" :key="index" :label="item.name" :name="item.name"> - </u-radio> - </u-radio-group> - </view> - </view> - <view class="form-item bottom-border-no before-line m-t-20 p-b-20" v-if="dto.idcardType=='身份证'"> - <view class="label required">身份证正反面</view> - <view class="m-l-a m-r-0 flex"> - <!-- <view class="component-button-upload m-r-15" @click="uploadIcon('idCards')"> - - </view> --> - <view class="component-button-upload" @click="uploadIcon('idCards')"> - - </view> - </view> - </view> - <view class="flex p20" style="padding-top: 0rpx;padding-bottom: 10rpx" - v-if="dto.idcardType=='身份证'&&dto.idCards&&dto.idCards.length>0"> - <view class="m-t-12 m-r-10 " v-for="(tBanner,index) of dto.idCards" :key="index"> - <image class="banner-img" :src="tBanner.url" @click.stop="previewImg(tBanner.url)"> - - </image> - <view class="t-red text-center" @click.stop="deleteImg('idCards',index)">删除</view> - </view> - </view> - <view class="form-item bottom-border-no before-line m-t-20 p-b-20" v-if="dto.idcardType=='营业执照'"> - <view class="label required">营业执照</view> - <view class="m-l-a m-r-0 flex"> - <view class="component-button-upload m-r-15" @click="uploadIcon('pictures')"> - - </view> - - </view> - </view> - <view class="flex p20" style="padding-top: 0rpx;padding-bottom: 10rpx" - v-if="dto.idcardType=='营业执照'&&dto.pictures&&dto.pictures.length>0"> - <view class="m-t-12 m-r-10 " v-for="(tBanner,index) of dto.pictures" :key="index"> - <image class="banner-img" :src="tBanner.url" @click.stop="previewImg(tBanner.url)"> - - </image> - <view class="t-red text-center" @click.stop="deleteImg('pictures',index)">删除</view> - </view> - </view> - - - - <view class="button-green-1 m-t-20 button-fixed-bottom before-line " @click="submit"> - 提交审核 - </view> - - </view> - - <view style="min-height: 200rpx;"> - - </view> - <u-picker @confirm="select_type" keyName="name" @cancel="show_select_type=false" :show="show_select_type" - :columns="columns_types"></u-picker> - - <u-picker @confirm="select_station" keyName="name" @cancel="show_select_station=false" - :show="show_select_station" :columns="columns_station"></u-picker> - - - </view> -</template> - -<script> - import environments from '@/environments' - - import { - mapState - } from 'vuex' - - export default { - - data() { - return { - id: '', - refresh: false, - api: '', - dto: { - id: '', - pictures: [], - idCards: [], - cover: '', - idcardType: '身份证', - description: '', - address: '', - stationId: '', - stationName: '', - id: '', - userId: '', - name: '', - typeId: '', - typeName: '', - contactName: '', - contactTel: '', - province: '', - city: '', - region: '', - }, - show_select_type: false, - show_select_station: false, - columns_types: [], - columns_station: [], - - //审核方式 - shTypeList: [{ - name: '身份证', - disabled: false - }, - { - name: '营业执照', - disabled: false - } - ], - regionDataPlus: [], - } - }, - onLoad(options) { - if (options.id) { - this.id = options.id - this.getDetail() - } else { - this.getCurrentInfo() - //类型和集火站 - this.$http.request('get', '/api/station/list', { - params: {} - }).then(res => { - var data = res.data - this.columns_station = [data || []] - // this.columns_station = (data || []).map(item => { - // return { - // ...item, - // code: item.id, - // text: item.name, - // } - // }) - }) - //类型和集火站 - this.$http.request('get', '/api/supplier/type/list', { - params: {} - }).then(res => { - var data = res.data - this.columns_types = [data || []] - // this.columns_types = (data || []).map(item => { - // return { - // ...item, - // code: item.id, - // text: item.name, - // } - // }) - // console.log('columns_types', this.columns_types) - }) - this.init_area() - } - - }, - - methods: { - PickArea(item, e) { - console.log('PickArea', item, e) - if (e.detail.value) { - this.dto.province = '' - this.dto.city = '' - this.dto.region = '' - if(e.detail.value.length<=3){ - if (!!e.detail.value[0]) - this.dto.province = e.detail.value[0].value - if (!!e.detail.value[1]) - this.dto.city = e.detail.value[1].value - if (!!e.detail.value[2]) - this.dto.region = e.detail.value[2].value - }else{ - //说明有重复的 - var plusnum = e.detail.value.length - 3 - if (!!e.detail.value[plusnum+0]) - this.dto.province = e.detail.value[plusnum+0].value - if (!!e.detail.value[plusnum+1]) - this.dto.city = e.detail.value[plusnum+1].value - if (!!e.detail.value[plusnum+2]) - this.dto.region = e.detail.value[plusnum+2].value - } - - this.$forceUpdate() - - } - }, - PickData(valueKey, nameKey, e) { - // console.log('PickArea', item, e) - if (e.detail.value) { - if (!!e.detail.value[0]) - this.dto[valueKey] = e.detail.value[0].value || e.detail.value[0].id - if (nameKey) { - this.dto[nameKey] = e.detail.value[0].label || e.detail.value[0].name || e.detail.value[0].value - } - this.$forceUpdate() - - } - }, - async init_area() { - const res = await this.$http.request('get', '/api/pub/china/area/json') - // console.log('area', JSON.parse(res.data)) - this.regionDataPlus = res.data && JSON.parse(res.data.replaceAll('code', 'value').replaceAll('name', - 'text')) || [] - - console.log('area', this.regionDataPlus) - - - }, - - select_type(e) { - this.show_select_type = false - this.dto.typeName = e.value[0].name - this.dto.typeId = e.value[0].id - }, - select_station(e) { - this.show_select_station = false - this.dto.stationName = e.value[0].name - this.dto.stationId = e.value[0].id - }, - async getCurrentInfo() { - this.$message.showLoading() - const { - code, - data - } = await this.$http.request('get', "/api/current/supplier", {}) - if (code == 0) { - this.dto = { - ...data, - - } - if (!this.dto.pictures) { - this.dto.pictures = [] - } else if (typeof this.dto.pictures == 'string') { - this.dto.pictures = JSON.parse(this.dto.pictures) - } - if (!this.dto.idCards) { - this.dto.idCards = [] - } else if (typeof this.dto.idCards == 'string') { - this.dto.idCards = JSON.parse(this.dto.idCards) - } - - if (this.dto.idcardType == '1') { - this.dto.idcardType = '身份证' - } - this.dto.userId = this.currentInfo.id - - } - - this.$message.hideLoading() - }, - async getDetail() { - this.$message.showLoading() - const { - code, - data - } = await this.$http.request('get', "/api/supplier/addOrUpdate/detail/" + this.id, {}) - if (code == 0) { - this.dto = { - ...data, - - } - if (!this.dto.pictures) { - this.dto.pictures = [] - } else if (typeof this.dto.pictures == 'string') { - this.dto.pictures = JSON.parse(this.dto.pictures) - } - if (!this.dto.idCards) { - this.dto.idCards = [] - } else if (typeof this.dto.idCards == 'string') { - this.dto.idCards = JSON.parse(this.dto.idCards) - } - if (this.dto.idcardType == '1') { - this.dto.idcardType = '身份证' - } - } - - this.$message.hideLoading() - - }, - async submit() { - - await this.$message.confirm(`是否确定提交/修改店铺信息`) - - - var dto = { - ...this.dto, - idcardType: this.dto.idcardType === '身份证' ? "1" : '2' - } - this.$message.showLoading() - const re = await this.$http.request('post', '/api/supplier/addOrUpdate', { - data: dto - }) - this.$message.hideLoading() - if (re.code == 2000 || re.code == 0) { - this.$message.showToast('操作成功') - //需要标记加一下 - this.$store.dispatch('sign_add', 'info'); - this.$store.dispatch('getCurrentInfo') - - this.backpage() - } - }, - - async deleteImg(key, index) { - await this.$message.confirm('是否确认删除此图片') - if (Array.isArray(this.dto[key])) { - this.dto[key].splice(index, 1) - - } else { - this.dto[key] = '' - } - this.$forceUpdate() - }, - uploadIcon(key) { - const that = this - uni.chooseImage({ - count: 1, // 最多可以选择的图片张数,默认9 - sizeType: ['original', 'compressed'], //original 原图,compressed 压缩图,默认二者都有 - sourceType: ['camera', 'album'], //album 从相册选图,camera 使用相机,默认二者都有。如需直接开相机或直接选相册,请只使用一个选项 - success: function({ - errMsg, - tempFiles - }) { - if (errMsg === 'chooseImage:ok') { +<template> + <view class="container-page"> + <view> + <view class="form-item"> + <view class="label required">店铺类型</view> + <view class="m-l-a m-r-0 flex " :class="[!dto.typeId?'desc-gray':'']" @click="()=>{ + if(!id){ + show_select_type=true + } + }"> + <view>{{dto.typeName || '请选择'}}</view> + <u-icon class="m-l-a" name="arrow-right"></u-icon> + </view> + <!-- <view class="m-l-a m-r-0 flex " :class="[!dto.typeId?'desc-gray':'']"> + <uni-data-picker @change="(e)=>{PickData('typeId','typeStr',e)}" placeholder="请选择" + :localdata="columns_types"> + {{dto.typeStr || '请选择'}} + </uni-data-picker> + <u-icon class="m-l-a" name="arrow-right"></u-icon> + </view> --> + </view> + <view class="form-item before-line"> + <view class="label required">店铺名称</view> + <view class="m-l-a m-r-0 flex"> + <input v-model="dto.name" placeholder="请输入店铺名称" style="margin-top: 16px;text-align: right;"></input> + + </view> + </view> + <view class="form-item bottom-border-no"> + <view class="label required" style="width: 360rpx;">店铺头像(750*750px)</view> + <view class="m-l-a m-r-0 flex m-t-20 m-b-20"> + <view class="component-button-upload" @click="uploadIcon('cover')"> + + </view> + </view> + </view> + <view v-if="dto.cover"> + <view class="flex p20 form-item bottom-border-no" style="padding-top: 0rpx;padding-bottom: 10rpx"> + <view class="m-r-10 "> + <image class="banner-img" :src="dto.cover" @click.stop="previewImg(dto.cover)"> + + </image> + <view class="t-red text-center" @click.stop="deleteImg('cover','')">删除</view> + </view> + </view> + </view> + <u-divider></u-divider> + + <view class="form-item before-line"> + <view class="label required">联系人姓名</view> + <view class="m-l-a m-r-0 flex"> + <input v-model="dto.contactName" placeholder="请输入联系人姓名" + style="margin-top: 16px;text-align: right;"></input> + + </view> + </view> + <view class="form-item before-line"> + <view class="label required">联系方式</view> + <view class="m-l-a m-r-0 flex"> + <input v-model="dto.contactTel" placeholder="请输入联系方式" + style="margin-top: 16px;text-align: right;"></input> + + </view> + </view> + <view class="form-item before-line"> + <view class="label required">集货站</view> + <view class="m-l-a m-r-0 flex " :class="[!dto.stationId?'desc-gray':'']" @click="()=>{ + if(!id){ + show_select_station=true + } + }"> + <view>{{dto.stationName || '请选择'}}</view> + <u-icon class="m-l-a" name="arrow-right"></u-icon> + </view> + <!-- <view class="m-l-a m-r-0 flex " :class="[!dto.stationId?'desc-gray':'']"> + <uni-data-picker @change="(e)=>{PickData('stationId','stationStr',e)}" placeholder="请选择" + :localdata="columns_station"> + {{dto.typeStr || '请选择'}} + </uni-data-picker> + <u-icon class="m-l-a" name="arrow-right"></u-icon> + </view> --> + + </view> + <view class="form-item before-line"> + <view class="label required">地区</view> + <!-- <view class="m-l-a m-r-0 flex " :class="[!dto.applicationType?'desc-gray':'']" @click="()=>{ + if(!id){ + show_select_type=true + } + }"> + <view>{{dto.applicationTypeStr||dto.applicationType || '请选择'}}</view> + + + <u-icon class="m-l-a" name="arrow-right"></u-icon> + </view> --> + <view class="m-l-a m-r-0 flex " :class="[!dto['province']?'desc-gray':'']"> + <uni-data-picker :area="true" @change="(e)=>{PickArea(dto,e)}" placeholder="" + :localdata="regionDataPlus"> + {{ dto['province'] || '请选择' }}{{ dto['city'] && ('/' + dto['city']) || '' }}{{ + dto['region'] && ('/' + dto['region']) || '' + }} + </uni-data-picker> + <u-icon class="m-l-a" name="arrow-right"></u-icon> + </view> + + </view> + <view class="form-item before-line"> + <view class="label required">地址</view> + <view class="m-l-a m-r-0 flex"> + <input v-model="dto.address" placeholder="请输入地址" + style="margin-top: 16px;text-align: right;"></input> + + </view> + </view> + <view class="form-item before-line"> + <view class="label required">店铺简介</view> + </view> + <view class="flex"> + <u--textarea v-model="dto.description" placeholder="请输入店铺简介"></u--textarea> + </view> + <view class="form-item before-line m-t-20"> + <view class="label required">选择审核方式</view> + <view class="m-l-a m-r-0 flex"> + + <u-radio-group v-model="dto.idcardType" placement="row"> + <u-radio :customStyle="{'margin-bottom': '8px','margin-right': '8px','font-size':'28rpx'}" + v-for="(item, index) in shTypeList" :key="index" :label="item.name" :name="item.name"> + </u-radio> + </u-radio-group> + </view> + </view> + <view class="form-item bottom-border-no before-line m-t-20 p-b-20" v-if="dto.idcardType=='身份证'"> + <view class="label required">身份证正反面</view> + <view class="m-l-a m-r-0 flex"> + <!-- <view class="component-button-upload m-r-15" @click="uploadIcon('idCards')"> + + </view> --> + <view class="component-button-upload" @click="uploadIcon('idCards')"> + + </view> + </view> + </view> + <view class="flex p20" style="padding-top: 0rpx;padding-bottom: 10rpx" + v-if="dto.idcardType=='身份证'&&dto.idCards&&dto.idCards.length>0"> + <view class="m-t-12 m-r-10 " v-for="(tBanner,index) of dto.idCards" :key="index"> + <image class="banner-img" :src="tBanner.url" @click.stop="previewImg(tBanner.url)"> + + </image> + <view class="t-red text-center" @click.stop="deleteImg('idCards',index)">删除</view> + </view> + </view> + <view class="form-item bottom-border-no before-line m-t-20 p-b-20" v-if="dto.idcardType=='营业执照'"> + <view class="label required">营业执照</view> + <view class="m-l-a m-r-0 flex"> + <view class="component-button-upload m-r-15" @click="uploadIcon('pictures')"> + + </view> + + </view> + </view> + <view class="flex p20" style="padding-top: 0rpx;padding-bottom: 10rpx" + v-if="dto.idcardType=='营业执照'&&dto.pictures&&dto.pictures.length>0"> + <view class="m-t-12 m-r-10 " v-for="(tBanner,index) of dto.pictures" :key="index"> + <image class="banner-img" :src="tBanner.url" @click.stop="previewImg(tBanner.url)"> + + </image> + <view class="t-red text-center" @click.stop="deleteImg('pictures',index)">删除</view> + </view> + </view> + + + + <view class="button-green-1 m-t-20 button-fixed-bottom before-line " @click="submit"> + 提交审核 + </view> + + </view> + + <view style="min-height: 200rpx;"> + + </view> + <u-picker @confirm="select_type" keyName="name" @cancel="show_select_type=false" :show="show_select_type" + :columns="columns_types"></u-picker> + + <u-picker @confirm="select_station" keyName="name" @cancel="show_select_station=false" + :show="show_select_station" :columns="columns_station"></u-picker> + + + </view> +</template> + +<script> + import environments from '@/environments' + + import { + mapState + } from 'vuex' + + export default { + + data() { + return { + id: '', + refresh: false, + api: '', + dto: { + id: '', + pictures: [], + idCards: [], + cover: '', + idcardType: '身份证', + description: '', + address: '', + stationId: '', + stationName: '', + id: '', + userId: '', + name: '', + typeId: '', + typeName: '', + contactName: '', + contactTel: '', + province: '', + city: '', + region: '', + }, + requireFields: [{ + name: '店铺类型', + key: 'typeId' + }, + { + name: '店铺名称', + key: 'name' + }, + { + name: '店铺头像', + key: 'cover' + }, + { + name: '联系人姓名', + key: 'contactName' + }, + { + name: '联系方式', + key: 'contactTel' + }, + { + name: '集货站', + key: 'stationId' + }, + { + name: '地区', + key: 'province' + }, + { + name: '地址', + key: 'address' + }, + { + name: '店铺简介', + key: 'description' + }, + ], + show_select_type: false, + show_select_station: false, + columns_types: [], + columns_station: [], + + //审核方式 + shTypeList: [{ + name: '身份证', + disabled: false + }, + { + name: '营业执照', + disabled: false + } + ], + regionDataPlus: [], + } + }, + onLoad(options) { + if (options.id) { + this.id = options.id + this.getDetail() + } else { + this.getCurrentInfo() + //类型和集火站 + this.$http.request('get', '/api/station/list', { + params: {} + }).then(res => { + var data = res.data + this.columns_station = [data || []] + // this.columns_station = (data || []).map(item => { + // return { + // ...item, + // code: item.id, + // text: item.name, + // } + // }) + }) + //类型和集火站 + this.$http.request('get', '/api/supplier/type/list', { + params: {} + }).then(res => { + var data = res.data + this.columns_types = [data || []] + // this.columns_types = (data || []).map(item => { + // return { + // ...item, + // code: item.id, + // text: item.name, + // } + // }) + // console.log('columns_types', this.columns_types) + }) + this.init_area() + } + + }, + + methods: { + PickArea(item, e) { + console.log('PickArea', item, e) + if (e.detail.value) { + this.dto.province = '' + this.dto.city = '' + this.dto.region = '' + if (e.detail.value.length <= 3) { + if (!!e.detail.value[0]) + this.dto.province = e.detail.value[0].value + if (!!e.detail.value[1]) + this.dto.city = e.detail.value[1].value + if (!!e.detail.value[2]) + this.dto.region = e.detail.value[2].value + } else { + //说明有重复的 + var plusnum = e.detail.value.length - 3 + if (!!e.detail.value[plusnum + 0]) + this.dto.province = e.detail.value[plusnum + 0].value + if (!!e.detail.value[plusnum + 1]) + this.dto.city = e.detail.value[plusnum + 1].value + if (!!e.detail.value[plusnum + 2]) + this.dto.region = e.detail.value[plusnum + 2].value + } + + this.$forceUpdate() + + } + }, + PickData(valueKey, nameKey, e) { + // console.log('PickArea', item, e) + if (e.detail.value) { + if (!!e.detail.value[0]) + this.dto[valueKey] = e.detail.value[0].value || e.detail.value[0].id + if (nameKey) { + this.dto[nameKey] = e.detail.value[0].label || e.detail.value[0].name || e.detail.value[0].value + } + this.$forceUpdate() + + } + }, + async init_area() { + const res = await this.$http.request('get', '/api/pub/china/area/json') + // console.log('area', JSON.parse(res.data)) + this.regionDataPlus = res.data && JSON.parse(res.data.replaceAll('code', 'value').replaceAll('name', + 'text')) || [] + + // console.log('area', this.regionDataPlus) + + + }, + + select_type(e) { + this.show_select_type = false + this.dto.typeName = e.value[0].name + this.dto.typeId = e.value[0].id + }, + select_station(e) { + this.show_select_station = false + this.dto.stationName = e.value[0].name + this.dto.stationId = e.value[0].id + }, + async getCurrentInfo() { + this.$message.showLoading() + const { + code, + data + } = await this.$http.request('get', "/api/current/supplier", {}) + if (code == 0) { + this.dto = { + ...data, + + } + if (!this.dto.pictures) { + this.dto.pictures = [] + } else if (typeof this.dto.pictures == 'string') { + this.dto.pictures = JSON.parse(this.dto.pictures) + } + if (!this.dto.idCards) { + this.dto.idCards = [] + } else if (typeof this.dto.idCards == 'string') { + this.dto.idCards = JSON.parse(this.dto.idCards) + } + + if (this.dto.idcardType == '1') { + this.dto.idcardType = '身份证' + } else { + this.dto.idcardType = '营业执照' + } + this.dto.userId = this.currentInfo.id + + } + + this.$message.hideLoading() + }, + async getDetail() { + this.$message.showLoading() + const { + code, + data + } = await this.$http.request('get', "/api/supplier/addOrUpdate/detail/" + this.id, {}) + if (code == 0) { + this.dto = { + ...data, + + } + if (!this.dto.pictures) { + this.dto.pictures = [] + } else if (typeof this.dto.pictures == 'string') { + this.dto.pictures = JSON.parse(this.dto.pictures) + } + if (!this.dto.idCards) { + this.dto.idCards = [] + } else if (typeof this.dto.idCards == 'string') { + this.dto.idCards = JSON.parse(this.dto.idCards) + } + if (this.dto.idcardType == '1') { + this.dto.idcardType = '身份证' + } else { + this.dto.idcardType = '营业执照' + } + } + + this.$message.hideLoading() + + }, + async submit() { + for (var field of this.requireFields) { + if (!this.dto[field.key]) { + this.$message.showToast(`${field.name}信息未填写`) + return + } + } + if (this.dto.idcardType == '身份证' && this.dto.idCards.length == 0) { + this.$message.showToast(`${this.dto.idcardType}信息未填写`) + return + } + if (this.dto.idcardType !== '身份证' && this.dto.pictures.length == 0) { + this.$message.showToast(`${this.dto.idcardType}信息未填写`) + return + } + await this.$message.confirm(`是否确定提交/修改店铺信息`) + + + var dto = { + ...this.dto, + idcardType: this.dto.idcardType === '身份证' ? "1" : '2' + } + this.$message.showLoading() + const re = await this.$http.request('post', '/api/supplier/addOrUpdate', { + data: dto + }) + this.$message.hideLoading() + if (re.code == 2000 || re.code == 0) { + this.$message.showToast('操作成功') + //需要标记加一下 + this.$store.dispatch('sign_add', 'info'); + this.$store.dispatch('getCurrentInfo') + + this.backpage() + } else { + console.log('error re', re) + if (re.code === 30000 && Array.isArray(re.msg)) { + this.$message.showToast('字段未填写完整') + + } + } + }, + + async deleteImg(key, index) { + await this.$message.confirm('是否确认删除此图片') + if (Array.isArray(this.dto[key])) { + this.dto[key].splice(index, 1) + + } else { + this.dto[key] = '' + } + this.$forceUpdate() + }, + uploadIcon(key) { + const that = this + uni.chooseImage({ + count: 1, // 最多可以选择的图片张数,默认9 + sizeType: ['original', 'compressed'], //original 原图,compressed 压缩图,默认二者都有 + sourceType: ['camera', 'album'], //album 从相册选图,camera 使用相机,默认二者都有。如需直接开相机或直接选相册,请只使用一个选项 + success: function({ + errMsg, + tempFiles + }) { + if (errMsg === 'chooseImage:ok') { // console.log(tempFiles[0]) - that.$message.showLoading() - that.$http.upload(tempFiles[0].path).then(async res => { - var pic = res.data && res.data.length > 0 && res.data[ - 0] || {} - that.$message.hideLoading() - if (Array.isArray(that.dto[key])) { - that.dto[key].push(pic || '') - - } else { - that.dto[key] = (pic || {}).url || '' - - } - that.$forceUpdate() - }).catch(res => { - that.$message.hideLoading() - - }) - } - } - }) - }, - - }, - computed: { - ...mapState(['currentInfo']) - }, - components: {} - } -</script> - -<style lang="scss" scoped> - .banner-img { - width: 96rpx; - height: 96rpx; - border-radius: 4rpx; - border: 2rpx dashed #CECECE; - } - - .form-item { - // padding: 40rpx; - border-bottom: 2rpx solid #F3F3F3; - display: flex; - // height: 100px; - - .label { - width: 300rpx; - line-height: 60px; - - } - - .flex { - line-height: 60px; - - .flex1 { - flex: 1; - text-align: center; - color: var(--selfblue) - } - - - } - } - - .form-item.bottom-border-no { - border-bottom: none; - } - - .container-page { - padding: 40rpx; - background-color: #FFFFFF; - // min-height: calc(100vh - 80rpx); - min-height: 100vh; - } - - .style { - width: fit-content; - margin: 0 auto; - line-height: 64rpx; - border-radius: 8rpx; - padding-left: 20rpx; - padding-right: 20rpx; - // padding-top: 5rpx; - // padding-bottom: 5rpx; - border: 2rpx solid var(--selfblue); - background-color: var(--selfbluebg); - min-width: 100rpx; - } - - - .style-1 { - border: 1px solid rgb(122, 187, 255); - border: 1px solid #409EFF; - color: #409EFF; - background-color: rgb(240, 247, 255); - } - - .style-2 { - border: 1px solid rgb(255, 184, 78); - border: 1px solid #FE9044; - color: #FE9044; - background-color: rgb(255, 247, 235); - } - - .style-3 { - border: 1px solid #19be6b; - color: #19be6b; - background-color: rgb(231, 244, 238); - } - - .style-4 { - border: 1px solid #F56c6c; - color: #F56c6c; - background-color: rgb(254, 243, 243); - } + if (tempFiles[0].size > 1024 * 1024 * 5) { + that.$message.confirm('图片最多支持5M大小,超出大小限制') + return + } + that.$message.showLoading() + that.$http.upload(tempFiles[0].path).then(async res => { + var pic = res.data && res.data.length > 0 && res.data[ + 0] || {} + that.$message.hideLoading() + if (Array.isArray(that.dto[key])) { + that.dto[key].push(pic || '') + + } else { + that.dto[key] = (pic || {}).url || '' + + } + that.$forceUpdate() + }).catch(res => { + that.$message.hideLoading() + + }) + } + } + }) + }, + + }, + computed: { + ...mapState(['currentInfo']) + }, + components: {} + } +</script> + +<style lang="scss" scoped> + .banner-img { + width: 96rpx; + height: 96rpx; + border-radius: 4rpx; + border: 2rpx dashed #CECECE; + } + + .form-item { + // padding: 40rpx; + border-bottom: 2rpx solid #F3F3F3; + display: flex; + // height: 100px; + + .label { + width: 300rpx; + line-height: 60px; + + } + + .flex { + line-height: 60px; + + .flex1 { + flex: 1; + text-align: center; + color: var(--selfblue) + } + + + } + } + + .form-item.bottom-border-no { + border-bottom: none; + } + + .container-page { + padding: 40rpx; + background-color: #FFFFFF; + // min-height: calc(100vh - 80rpx); + min-height: 100vh; + } + + .style { + width: fit-content; + margin: 0 auto; + line-height: 64rpx; + border-radius: 8rpx; + padding-left: 20rpx; + padding-right: 20rpx; + // padding-top: 5rpx; + // padding-bottom: 5rpx; + border: 2rpx solid var(--selfblue); + background-color: var(--selfbluebg); + min-width: 100rpx; + } + + + .style-1 { + border: 1px solid rgb(122, 187, 255); + border: 1px solid #409EFF; + color: #409EFF; + background-color: rgb(240, 247, 255); + } + + .style-2 { + border: 1px solid rgb(255, 184, 78); + border: 1px solid #FE9044; + color: #FE9044; + background-color: rgb(255, 247, 235); + } + + .style-3 { + border: 1px solid #19be6b; + color: #19be6b; + background-color: rgb(231, 244, 238); + } + + .style-4 { + border: 1px solid #F56c6c; + color: #F56c6c; + background-color: rgb(254, 243, 243); + } </style> \ No newline at end of file diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue index e0aa39f..be4efe9 100644 --- a/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue +++ b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue @@ -49,6 +49,7 @@ <data-picker-view class="picker-view" ref="pickerView" v-model="dataValue" :localdata="localdata" :preload="preload" :collection="collection" :field="field" :orderby="orderby" :where="where" :key="showpicker" + :area="area" :step-searh="stepSearh" :self-field="selfField" :parent-field="parentField" :managed-mode="true" :map="map" :ellipsis="ellipsis" @change="onchange" @datachange="ondatachange" @nodeclick="onnodeclick"> </data-picker-view> @@ -132,6 +133,10 @@ ellipsis: { type: Boolean, default: true + }, + area:{ + type: Boolean, + default: false } }, data() { diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js index 328a3db..40ded6b 100644 --- a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js @@ -92,6 +92,10 @@ type: Boolean, default: false }, + area:{ + type: Boolean, + default: false + }, map: { type: Object, default () { diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue index 10d3e29..49454b5 100644 --- a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue @@ -1,324 +1,353 @@ -<template> - <view class="uni-data-pickerview"> - <scroll-view v-if="!isCloudDataList" class="selected-area" scroll-x="true"> - <view class="selected-list"> - <view - class="selected-item" - v-for="(item,index) in selected" - :key="index" - :class="{ - 'selected-item-active':index == selectedIndex - }" - @click="handleSelect(index)" - > - <text>{{item.text || ''}}</text> - </view> - </view> - </scroll-view> - <view class="tab-c"> - <scroll-view class="list" :scroll-y="true"> - <view class="item" :class="{'is-disabled': !!item.disable}" v-for="(item, j) in dataList[selectedIndex]" :key="j" - @click="handleNodeClick(item, selectedIndex, j)"> - <text class="item-text">{{item[map.text]}}</text> - <view class="check" v-if="selected.length > selectedIndex && item[map.value] == selected[selectedIndex].value"></view> - </view> - </scroll-view> - - <view class="loading-cover" v-if="loading"> - <uni-load-more class="load-more" :contentText="loadMore" status="loading"></uni-load-more> - </view> - <view class="error-message" v-if="errorMessage"> - <text class="error-text">{{errorMessage}}</text> - </view> - </view> - </view> -</template> - -<script> - import dataPicker from "./uni-data-picker.js" - - /** - * DataPickerview - * @description uni-data-pickerview - * @tutorial https://ext.dcloud.net.cn/plugin?id=3796 - * @property {Array} localdata 本地数据,参考 - * @property {Boolean} step-searh = [true|false] 是否分布查询 - * @value true 启用分布查询,仅查询当前选中节点 - * @value false 关闭分布查询,一次查询出所有数据 - * @property {String|DBFieldString} self-field 分布查询当前字段名称 - * @property {String|DBFieldString} parent-field 分布查询父字段名称 - * @property {String|DBCollectionString} collection 表名 - * @property {String|DBFieldString} field 查询字段,多个字段用 `,` 分割 - * @property {String} orderby 排序字段及正序倒叙设置 - * @property {String|JQLString} where 查询条件 - */ - export default { - name: 'UniDataPickerView', - emits: ['nodeclick', 'change', 'datachange', 'update:modelValue'], - mixins: [dataPicker], - props: { - managedMode: { - type: Boolean, - default: false - }, - ellipsis: { - type: Boolean, - default: true - } - }, - created() { - console.log('created picker') - if (!this.managedMode) { - this.$nextTick(() => { - this.loadData(); - }) - } - }, - methods: { - onPropsChange() { - this._treeData = []; - this.selectedIndex = 0; - this.$nextTick(() => { - this.loadData(); - }) - }, - handleSelect(index) { - this.selectedIndex = index; - }, - handleNodeClick(item, i, j) { - if (item.disable) { - return; - } - - const node = this.dataList[i][j]; - const text = node[this.map.text]; - const value = node[this.map.value]; - - if (i < this.selected.length - 1) { - this.selected.splice(i, this.selected.length - i) - this.selected.push({ - text, - value - }) - } else if (i === this.selected.length - 1) { - this.selected.splice(i, 1, { - text, - value - }) - } - - if (node.isleaf) { - this.onSelectedChange(node, node.isleaf) - return - } - - const { - isleaf, - hasNodes - } = this._updateBindData() - - // 本地数据 - if (this.isLocalData) { - this.onSelectedChange(node, (!hasNodes || isleaf)) - } else if (this.isCloudDataList) { // Cloud 数据 (单列) - this.onSelectedChange(node, true) - } else if (this.isCloudDataTree) { // Cloud 数据 (树形) - if (isleaf) { - this.onSelectedChange(node, node.isleaf) - } else if (!hasNodes) { // 请求一次服务器以确定是否为叶子节点 - this.loadCloudDataNode((data) => { - if (!data.length) { - node.isleaf = true - } else { - this._treeData.push(...data) - this._updateBindData(node) - } - this.onSelectedChange(node, node.isleaf) - }) - } - } - }, - updateData(data) { - this._treeData = data.treeData - this.selected = data.selected - if (!this._treeData.length) { - this.loadData() - } else { - //this.selected = data.selected - this._updateBindData() - } - }, - onDataChange() { - this.$emit('datachange'); - }, - onSelectedChange(node, isleaf) { - if (isleaf) { - this._dispatchEvent() - } - - if (node) { - this.$emit('nodeclick', node) - } - }, - _dispatchEvent() { - this.$emit('change', this.selected.slice(0)) - } - } - } -</script> - -<style lang="scss"> - $uni-primary: #007aff !default; - - .uni-data-pickerview { - flex: 1; - /* #ifndef APP-NVUE */ - display: flex; - /* #endif */ - flex-direction: column; - overflow: hidden; - height: 100%; - } - - .error-text { - color: #DD524D; - } - - .loading-cover { - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - background-color: rgba(255, 255, 255, .5); - /* #ifndef APP-NVUE */ - display: flex; - /* #endif */ - flex-direction: column; - align-items: center; - z-index: 1001; - } - - .load-more { - /* #ifndef APP-NVUE */ - margin: auto; - /* #endif */ - } - - .error-message { - background-color: #fff; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - padding: 15px; - opacity: .9; - z-index: 102; - } - - /* #ifdef APP-NVUE */ - .selected-area { - width: 750rpx; - } - /* #endif */ - - .selected-list { - /* #ifndef APP-NVUE */ - display: flex; - flex-wrap: nowrap; - /* #endif */ - flex-direction: row; - padding: 0 5px; - border-bottom: 1px solid #f8f8f8; - } - - .selected-item { - margin-left: 10px; - margin-right: 10px; - padding: 12px 0; - text-align: center; - /* #ifndef APP-NVUE */ - white-space: nowrap; - /* #endif */ - } - - .selected-item-text-overflow { - width: 168px; - /* fix nvue */ - overflow: hidden; - /* #ifndef APP-NVUE */ - width: 6em; - white-space: nowrap; - text-overflow: ellipsis; - -o-text-overflow: ellipsis; - /* #endif */ - } - - .selected-item-active { - border-bottom: 2px solid $uni-primary; - } - - .selected-item-text { - color: $uni-primary; - } - - .tab-c { - position: relative; - flex: 1; - /* #ifndef APP-NVUE */ - display: flex; - /* #endif */ - flex-direction: row; - overflow: hidden; - } - - .list { - flex: 1; - } - - .item { - padding: 12px 15px; - /* border-bottom: 1px solid #f0f0f0; */ - /* #ifndef APP-NVUE */ - display: flex; - /* #endif */ - flex-direction: row; - justify-content: space-between; - } - - .is-disabled { - opacity: .5; - } - - .item-text { - /* flex: 1; */ - color: #333333; - } - - .item-text-overflow { - width: 280px; - /* fix nvue */ - overflow: hidden; - /* #ifndef APP-NVUE */ - width: 20em; - white-space: nowrap; - text-overflow: ellipsis; - -o-text-overflow: ellipsis; - /* #endif */ - } - - .check { - margin-right: 5px; - border: 2px solid $uni-primary; - border-left: 0; - border-top: 0; - height: 12px; - width: 6px; - transform-origin: center; - /* #ifndef APP-NVUE */ - transition: all 0.3s; - /* #endif */ - transform: rotate(45deg); - } -</style> +<template> + <view class="uni-data-pickerview"> + <scroll-view v-if="!isCloudDataList" class="selected-area" scroll-x="true"> + <view class="selected-list"> + <view class="selected-item" v-for="(item,index) in selected" :key="index" :class="{ + 'selected-item-active':index == selectedIndex + }" @click="handleSelect(index)"> + <text>{{item.text || ''}}</text> + </view> + </view> + </scroll-view> + <view class="tab-c"> + <!-- <view> + selected:{{JSON.stringify(selected)}} + </view> --> + <!-- v-if="!area||!selected|| selected.length==0||area&&selected&&selected.length>0&&(item[map.text]!==selected[selected.length-1].text)" --> + <scroll-view class="list" :scroll-y="true"> + <view v-for="(item, j) in dynamicList" :key="j"> + <view class="item" :class="{'is-disabled': !!item.disable}" v-show="!item.hide" + @click="handleNodeClick(item, selectedIndex, j)"> + <text class="item-text">{{item[map.text]}}</text> + <view class="check" + v-if="selected.length > selectedIndex && item[map.value] == selected[selectedIndex].value"> + </view> + </view> + </view> + + </scroll-view> + + <view class="loading-cover" v-if="loading"> + <uni-load-more class="load-more" :contentText="loadMore" status="loading"></uni-load-more> + </view> + <view class="error-message" v-if="errorMessage"> + <text class="error-text">{{errorMessage}}</text> + </view> + </view> + </view> +</template> + +<script> + import dataPicker from "./uni-data-picker.js" + + /** + * DataPickerview + * @description uni-data-pickerview + * @tutorial https://ext.dcloud.net.cn/plugin?id=3796 + * @property {Array} localdata 本地数据,参考 + * @property {Boolean} step-searh = [true|false] 是否分布查询 + * @value true 启用分布查询,仅查询当前选中节点 + * @value false 关闭分布查询,一次查询出所有数据 + * @property {String|DBFieldString} self-field 分布查询当前字段名称 + * @property {String|DBFieldString} parent-field 分布查询父字段名称 + * @property {String|DBCollectionString} collection 表名 + * @property {String|DBFieldString} field 查询字段,多个字段用 `,` 分割 + * @property {String} orderby 排序字段及正序倒叙设置 + * @property {String|JQLString} where 查询条件 + */ + export default { + name: 'UniDataPickerView', + emits: ['nodeclick', 'change', 'datachange', 'update:modelValue'], + mixins: [dataPicker], + props: { + managedMode: { + type: Boolean, + default: false + }, + ellipsis: { + type: Boolean, + default: true + } + }, + computed: { + dynamicList() { + var lastnodes = [] + if (this.selected && this.selected.length > 0) { + for (var name of this.selected) { + lastnodes.push(name.text) + } + // lastnode = this.selected[this.selectedIndex].text + } + var arr = [] + console.log('lastnodes', lastnodes) + if (this.dataList && this.dataList[this.selectedIndex]) { + for (var item of this.dataList[this.selectedIndex]) { + if (lastnodes.indexOf(item[this.map.text]) >= 0) { + item.hide = true + arr.push(item) + } else { + item.hide = false + arr.push(item) + } + } + } + return arr + } + }, + created() { + console.log('created picker') + if (!this.managedMode) { + this.$nextTick(() => { + this.loadData(); + }) + } + }, + methods: { + onPropsChange() { + this._treeData = []; + this.selectedIndex = 0; + this.$nextTick(() => { + this.loadData(); + }) + }, + handleSelect(index) { + this.selectedIndex = index; + }, + handleNodeClick(item, i, j) { + if (item.disable) { + return; + } + + const node = this.dataList[i][j]; + const text = node[this.map.text]; + const value = node[this.map.value]; + + if (i < this.selected.length - 1) { + this.selected.splice(i, this.selected.length - i) + this.selected.push({ + text, + value + }) + } else if (i === this.selected.length - 1) { + this.selected.splice(i, 1, { + text, + value + }) + } + + if (node.isleaf) { + this.onSelectedChange(node, node.isleaf) + return + } + + const { + isleaf, + hasNodes + } = this._updateBindData() + + // 本地数据 + if (this.isLocalData) { + this.onSelectedChange(node, (!hasNodes || isleaf)) + } else if (this.isCloudDataList) { // Cloud 数据 (单列) + this.onSelectedChange(node, true) + } else if (this.isCloudDataTree) { // Cloud 数据 (树形) + if (isleaf) { + this.onSelectedChange(node, node.isleaf) + } else if (!hasNodes) { // 请求一次服务器以确定是否为叶子节点 + this.loadCloudDataNode((data) => { + if (!data.length) { + node.isleaf = true + } else { + this._treeData.push(...data) + this._updateBindData(node) + } + this.onSelectedChange(node, node.isleaf) + }) + } + } + }, + updateData(data) { + this._treeData = data.treeData + this.selected = data.selected + if (!this._treeData.length) { + this.loadData() + } else { + //this.selected = data.selected + this._updateBindData() + } + }, + onDataChange() { + this.$emit('datachange'); + }, + onSelectedChange(node, isleaf) { + if (isleaf) { + this._dispatchEvent() + } + + if (node) { + this.$emit('nodeclick', node) + } + }, + _dispatchEvent() { + this.$emit('change', this.selected.slice(0)) + } + } + } +</script> + +<style lang="scss"> + $uni-primary: #007aff !default; + + .uni-data-pickerview { + flex: 1; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: column; + overflow: hidden; + height: 100%; + } + + .error-text { + color: #DD524D; + } + + .loading-cover { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + background-color: rgba(255, 255, 255, .5); + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: column; + align-items: center; + z-index: 1001; + } + + .load-more { + /* #ifndef APP-NVUE */ + margin: auto; + /* #endif */ + } + + .error-message { + background-color: #fff; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + padding: 15px; + opacity: .9; + z-index: 102; + } + + /* #ifdef APP-NVUE */ + .selected-area { + width: 750rpx; + } + + /* #endif */ + + .selected-list { + /* #ifndef APP-NVUE */ + display: flex; + flex-wrap: nowrap; + /* #endif */ + flex-direction: row; + padding: 0 5px; + border-bottom: 1px solid #f8f8f8; + } + + .selected-item { + margin-left: 10px; + margin-right: 10px; + padding: 12px 0; + text-align: center; + /* #ifndef APP-NVUE */ + white-space: nowrap; + /* #endif */ + } + + .selected-item-text-overflow { + width: 168px; + /* fix nvue */ + overflow: hidden; + /* #ifndef APP-NVUE */ + width: 6em; + white-space: nowrap; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + /* #endif */ + } + + .selected-item-active { + border-bottom: 2px solid $uni-primary; + } + + .selected-item-text { + color: $uni-primary; + } + + .tab-c { + position: relative; + flex: 1; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + overflow: hidden; + } + + .list { + flex: 1; + } + + .item { + padding: 12px 15px; + /* border-bottom: 1px solid #f0f0f0; */ + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + justify-content: space-between; + } + + .is-disabled { + opacity: .5; + } + + .item-text { + /* flex: 1; */ + color: #333333; + } + + .item-text-overflow { + width: 280px; + /* fix nvue */ + overflow: hidden; + /* #ifndef APP-NVUE */ + width: 20em; + white-space: nowrap; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + /* #endif */ + } + + .check { + margin-right: 5px; + border: 2px solid $uni-primary; + border-left: 0; + border-top: 0; + height: 12px; + width: 6px; + transform-origin: center; + /* #ifndef APP-NVUE */ + transition: all 0.3s; + /* #endif */ + transform: rotate(45deg); + } +</style> \ No newline at end of file -- Gitblit v1.9.3