You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

519 lines
12 KiB

<template>
<view class="page1">
<view class="hero">
<view class="hero-title">店铺资料</view>
<view class="hero-subtitle">维护副标题联系方式和收款信息</view>
</view>
<view class="form-wrap">
<view class="content">
<view class="section-title">可编辑信息</view>
<view class="value">
<view class="name">副标题</view>
<view class="text">
<input type="text" v-model="shop.subtitle" maxlength="24" placeholder="请输入副标题" />
</view>
</view>
<view class="value">
<view class="name">联系方式</view>
<view class="text">
<input type="text" v-model="shop.contactPhone" maxlength="16" placeholder="请输入联系方式" />
</view>
</view>
<view class="value">
<view class="name">支付宝账号</view>
<view class="text">
<input type="text" v-model="shop.aliAccount" maxlength="32" placeholder="请输入支付宝账号" />
</view>
</view>
<view class="value">
<view class="name">支付宝实名</view>
<view class="text">
<input type="text" v-model="shop.aliName" maxlength="16" placeholder="请输入支付宝实名" />
</view>
</view>
</view>
<button :loading="submitLoading" @tap="submit">保存</button>
<view class="content">
<view class="section-title">基础信息</view>
<view class="value image-row">
<view class="name">门头图</view>
<view class="text image-cell">
<view class="upload-img" v-if="!shop.shopIcon">
<uni-icons type="image" size="28" color="#777"></uni-icons>
</view>
<image :src="shop.shopIcon" v-else mode="aspectFill" class="upload-img"></image>
</view>
</view>
<view class="value">
<view class="name">店铺名称</view>
<view class="text">{{shop.shopName || '暂无'}}</view>
</view>
<view class="value">
<view class="name">店铺分类</view>
<view class="text">{{currentShopTypeText || '暂无'}}</view>
</view>
<view class="value">
<view class="name">所属区域</view>
<view class="text">{{currentRegionText || '暂无'}}</view>
</view>
<view class="value textarea-row">
<view class="name">店铺地址</view>
<view class="text">{{shop.shopAddress || '暂无'}}</view>
</view>
</view>
<view class="content" v-if="certificateImages.length">
<view class="section-title">认证资料</view>
<view class="cert-grid">
<view class="cert-item" v-for="(item,index) in certificateImages" :key="index"
@tap="previewImage(item)">
<image :src="item" mode="aspectFill"></image>
<text>{{certificateNames[index] || '补充资料'}}</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
shop: {},
shopTypeList: [],
submitLoading: false,
certificateImages: [],
certificateNames: ['身份证正面', '身份证反面', '营业执照', '补充证照']
}
},
computed: {
currentRegionText() {
return this.shop.shopAreaTitle || this.shop.region || ''
},
currentShopTypeText() {
return this.shop.shopTypeTitle || this.getShopTypeText(this.shop.shopType) || ''
}
},
onLoad() {
this.getShopTypeList()
this.getShopMsg()
},
methods: {
getShopId() {
return this.shop.id || uni.getStorageSync('shopId') || ''
},
getShopMsg() {
const shopId = uni.getStorageSync('shopId')
if (!shopId) {
this.applyShop(this.getCachedShop())
return
}
let regionId = ''
try {
const area = uni.getStorageSync('area')
regionId = area ? JSON.parse(area).id : ''
} catch (e) {}
this.NB.sendRequest('/app/shop/getShopInfoById', {
id: shopId,
regionId: regionId
}, false, 'POST', 'application/x-www-form-urlencoded').then(res => {
if (res.code == 200) {
this.applyShop(this.normalizeShopResult(res.result))
} else {
this.applyShop(this.getCachedShop())
if (res.message) this.tui.toast(res.message)
}
})
},
normalizeShopResult(result) {
if (result.shop) {
const data = Object.assign({}, result.shop, result)
delete data.shop
return data
}
return result || {}
},
getCachedShop() {
const shopList = uni.getStorageSync('schoolShop') || []
const shopId = uni.getStorageSync('shopId')
if (Array.isArray(shopList)) {
const item = shopList.find(shop => shop.id == shopId || shop.shopName == uni.getStorageSync(
'shopName'))
if (item) return item
}
return uni.getStorageSync('shop') || {
id: shopId,
shopName: uni.getStorageSync('shopName') || '',
shopIcon: uni.getStorageSync('shopIcon') || ''
}
},
applyShop(data) {
const shop = Object.assign({
id: '',
shopName: '',
shopIcon: '',
shopType: '',
shopTypeTitle: '',
subtitle: '',
shopAddress: '',
contactPhone: '',
aliAccount: '',
aliName: '',
remark: '',
shopArea: '',
shopAreaTitle: '',
regionId: '',
region: ''
}, data || {})
Object.keys(shop).forEach(key => {
if (shop[key] === null) shop[key] = ''
})
this.shop = shop
this.parseShopImages(shop.shopImages)
},
parseShopImages(value) {
const list = []
if (!value) {
this.certificateImages = []
return
}
const parts = String(value).split('@@')
parts.forEach((item, index) => {
if (!item) return
if (index == 3) {
try {
const extra = JSON.parse(item)
if (Array.isArray(extra)) {
extra.forEach(url => {
if (url) list.push(url)
})
}
} catch (e) {}
} else {
list.push(item)
}
})
this.certificateImages = list
},
getShopTypeList() {
this.NB.sendRequest('/dictData/getByCondition', {
sort: 'sortOrder',
order: 'asc',
dictId: '1712359407444168704'
}, false, 'GET', 'application/x-www-form-urlencoded').then(res => {
if (res.code == 200) {
const content = res.result && res.result.content ? res.result.content : []
this.shopTypeList = content.map(item => {
return {
value: item.value,
text: item.title
}
})
if (this.shop.shopType && !this.shop.shopTypeTitle) {
this.shop.shopTypeTitle = this.getShopTypeText(this.shop.shopType)
}
} else {
this.applyShop(this.getCachedShop())
}
})
},
getShopTypeText(value) {
const item = this.shopTypeList.find(item => item.value == value || item.text == value)
return item ? item.text : value
},
normalizeId(value) {
return String(value || '').split(',')[0]
},
previewImage(url) {
if (!url) return
uni.previewImage({
current: url,
urls: this.certificateImages
})
},
validateShop() {
if (!this.shop.shopArea) return '店铺区域信息缺失,请重新进入页面后再保存'
if (!this.shop.contactPhone) return '请输入联系方式'
if (!this.shop.aliAccount) return '请输入支付宝账号'
if (!this.shop.aliName) return '请输入支付宝实名'
return ''
},
updateLocalShopCache() {
let shopList = uni.getStorageSync('schoolShop') || []
if (Array.isArray(shopList)) {
shopList = shopList.map(item => item.id == this.shop.id ? Object.assign({}, item, this.shop) : item)
uni.setStorageSync('schoolShop', shopList)
}
uni.setStorageSync('shop', this.shop)
uni.setStorageSync('shopName', this.shop.shopName)
uni.setStorageSync('shopIcon', this.shop.shopIcon)
},
submit() {
const error = this.validateShop()
if (error) {
this.tui.toast(error)
return
}
const shopId = this.getShopId()
const payload = {
id: this.normalizeId(shopId),
shopArea: this.normalizeId(this.shop.shopArea),
subtitle: this.shop.subtitle,
contactPhone: this.shop.contactPhone,
aliAccount: this.shop.aliAccount,
aliName: this.shop.aliName
}
const query = Object.keys(payload).map(key => {
return key + '=' + encodeURIComponent(payload[key] == null ? '' : payload[key])
}).join('&')
this.submitLoading = true
this.NB.sendRequest('/app/shop/edit?' + query, {}, false, 'PUT', 'application/x-www-form-urlencoded').then(res => {
if (res.code == 200) {
this.updateLocalShopCache()
uni.showModal({
title: '提示',
content: '店铺资料已更新',
showCancel: false,
success: (modalRes) => {
if (modalRes.confirm) uni.navigateBack()
}
})
}
uni.hideLoading()
})
}
}
}
</script>
<style>
page,
.page1 {
width: 100%;
min-height: 100%;
font-size: 24rpx;
color: #12342d;
background:
radial-gradient(circle at 92% 120rpx, rgba(166, 255, 234, 0.45) 0, rgba(166, 255, 234, 0) 240rpx),
linear-gradient(180deg, #f3fff6 0%, #f5f8f5 36%, #eef4f1 100%);
overflow: scroll;
}
.hero {
position: relative;
width: 100%;
height: 260rpx;
padding: 58rpx 42rpx 0;
box-sizing: border-box;
overflow: hidden;
background:
linear-gradient(135deg, rgba(227, 255, 150, 0.95) 0%, rgba(166, 255, 234, 0.86) 58%, rgba(255, 255, 255, 0.72) 100%),
url('https://jewel-shop.oss-cn-beijing.aliyuncs.com/8bc15960c2dc40268e295d6dd23aecce.png') center/cover no-repeat;
}
.hero::after {
content: "";
position: absolute;
right: -34rpx;
top: -44rpx;
width: 290rpx;
height: 290rpx;
border-radius: 50%;
background: rgba(255, 255, 255, 0.32);
}
.hero-title {
position: relative;
z-index: 1;
font-size: 46rpx;
line-height: 64rpx;
font-weight: 900;
letter-spacing: 2rpx;
color: #07362d;
}
.hero-subtitle {
position: relative;
z-index: 1;
margin-top: 12rpx;
font-size: 26rpx;
font-weight: 600;
color: rgba(0, 35, 28, 0.62);
}
.form-wrap {
position: relative;
z-index: 2;
width: 92%;
margin: -54rpx auto 0;
padding-bottom: 40rpx;
}
.content {
width: 100%;
margin-bottom: 24rpx;
overflow: hidden;
border: 1rpx solid rgba(255, 255, 255, 0.86);
border-radius: 28rpx;
background: rgba(255, 255, 255, 0.96);
box-shadow: 0 16rpx 36rpx rgba(0, 35, 28, 0.08);
}
.section-title {
height: 92rpx;
line-height: 92rpx;
padding: 0 28rpx;
border-bottom: 1rpx solid #edf3f0;
font-size: 30rpx;
font-weight: 900;
color: #102f28;
}
.value {
width: 100%;
min-height: 96rpx;
display: flex;
align-items: center;
border-top: 1rpx solid #edf3f0;
padding: 0 28rpx;
box-sizing: border-box;
}
.section-title+.value {
border-top: none;
}
.name {
width: 210rpx;
font-size: 28rpx;
font-weight: 800;
color: #153c34;
}
.text {
flex: 1;
min-width: 0;
text-align: right;
color: #263f39;
font-size: 28rpx;
}
.text input {
height: 96rpx;
line-height: 96rpx;
text-align: right;
font-size: 28rpx;
color: #263f39;
}
.text textarea {
width: 100%;
height: 132rpx;
line-height: 42rpx;
padding-top: 18rpx;
text-align: right;
font-size: 28rpx;
color: #263f39;
}
.textarea-row {
align-items: flex-start;
padding-top: 20rpx;
padding-bottom: 18rpx;
}
.textarea-row .name {
line-height: 60rpx;
}
.picker-text {
min-height: 96rpx;
line-height: 96rpx;
font-size: 28rpx;
color: #263f39;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.picker-text.placeholder {
color: #9aa7a3;
}
.image-row {
min-height: 212rpx;
}
.image-cell {
display: flex;
justify-content: flex-end;
}
.upload-img {
width: 172rpx;
height: 172rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 24rpx;
background: #f6faf8;
border: 1rpx dashed rgba(11, 155, 115, 0.26);
box-shadow: inset 0 0 0 1rpx rgba(255, 255, 255, 0.8);
}
.cert-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 18rpx;
padding: 24rpx;
box-sizing: border-box;
}
.cert-item {
overflow: hidden;
border-radius: 22rpx;
background: #f6faf8;
border: 1rpx solid #edf3f0;
}
.cert-item image {
width: 100%;
height: 180rpx;
display: block;
}
.cert-item text {
display: block;
height: 58rpx;
line-height: 58rpx;
text-align: center;
font-size: 24rpx;
font-weight: 800;
color: #153c34;
}
button {
width: 100%;
height: 96rpx;
line-height: 96rpx;
margin: 44rpx auto 12rpx;
border-radius: 999rpx;
background: linear-gradient(90deg, #e3ff96 0%, #a6ffea 100%);
color: #00231c;
font-size: 34rpx;
font-weight: 900;
box-shadow: 0 18rpx 36rpx rgba(0, 35, 28, 0.14);
}
button::after {
border: none;
}
</style>