| 
						 | 
						- <template>
 - 	<view class="publishPost">
 - 		<navbar 
 - 		leftClick
 - 		@leftClick="$utils.navigateBack"
 - 		title="发布动态"/>
 - 		
 - 		
 - 		
 - 		<!-- <view class="title-input box">
 - 			<input type="text" placeholder="取个吸引人的标题吧" v-model="form.title"/>
 - 		</view> -->
 - 		
 - 		
 - 		<view class="content-input">
 - 			<uv-textarea 
 - 			v-model="form.title" 
 - 			:maxlength="200" 
 - 			autoHeight
 - 			count
 - 			style="min-height: 400rpx;"
 - 			placeholder="说点什么吧"></uv-textarea>
 - 		</view>
 - 		
 - 		
 - 		<view class="images box">
 - 			<uv-upload 
 - 			:fileList="fileList" 
 - 			:maxCount="imageMax" 
 - 			multiple 
 - 			width="150rpx" 
 - 			height="150rpx"
 - 			name="fileList"
 - 			@delete="deleteImage"
 - 			@afterRead="afterRead"
 - 			:previewFullImage="true"
 - 			accept="media"
 - 			:sizeType="['original', 'compressed']"
 - 			:sourceType="['album', 'camera']"></uv-upload>
 - 		</view>
 - 		
 - 		<view class="category">
 - 			<view class="title">
 - 				选择分类
 - 			</view>
 - 			<view class="tagList">
 - 				<view 
 - 				:class="{act : t.id == form.classId}"
 - 				@click="clickCategory(t, i)"
 - 				v-for="(t, i) in category"
 - 				:key="i">
 - 					{{ t.title }}
 - 				</view>
 - 			</view>
 - 		</view>
 - 		
 - 		<!-- <view class="category">
 - 			<view class="title">
 - 				选择地区
 - 			</view>
 - 			<view class="tagList">
 - 				<view 
 - 				:class="{act : t.name == form.address}"
 - 				@click="clickAddress(t, i)"
 - 				v-for="(t, i) in cityList"
 - 				:key="i">
 - 					{{ t.name }}
 - 				</view>
 - 			</view>
 - 		</view> -->
 - 		
 - 		<view class="category"
 - 		v-if="categoryRole.includes('code')">
 - 			<view class="title">
 - 				上传微信二维码(必填)
 - 			</view>
 - 			
 - 			<view class="images box">
 - 				<uv-upload 
 - 				:fileList="codeFileList" 
 - 				:maxCount="1" 
 - 				multiple 
 - 				width="150rpx" 
 - 				height="150rpx"
 - 				name="codeFileList"
 - 				@delete="deleteImage"
 - 				@afterRead="afterRead"
 - 				:previewFullImage="true"></uv-upload>
 - 			</view>
 - 		</view>
 - 		
 - 		<view class="title-input box"
 - 		v-if="categoryRole.includes('phone')">
 - 			<input type="text" placeholder="手机号码(选填)" v-model="form.phone"/>
 - 		</view>
 - 		
 - 		<view class="title-input box"
 - 		v-if="categoryRole.includes('address')"
 - 		@click="selectAddr">
 - 			<input type="text"
 - 			placeholder="选择位置(选填)"
 - 			disabled
 - 			v-model="form.address"/>
 - 			<uv-icon
 - 			size="40rpx"
 - 			name="map"></uv-icon>
 - 		</view>
 - 		
 - 		<view class="title-input box"
 - 		@click="$refs.pickerHospital.open()"
 - 		v-if="categoryRole.includes('shop')">
 - 			<input type="text" 
 - 			v-if="!form.shop"
 - 			placeholder="关联店铺(选填)"/>
 - 			
 - 			<view class="shop-box"
 - 			v-else>
 - 				<view class="title">
 - 					{{ form.shop.title }}
 - 				</view>
 - 				<view class="desc">
 - 					{{ form.shop.address }}
 - 				</view>
 - 			</view>
 - 		</view>
 - 		
 - 		
 - 		<view class="configBtn"
 - 		@click="$refs.configPopup.open()">
 - 			《发布须知》
 - 		</view>
 - 		
 - 		<view class="uni-color-btn"
 - 		@click="submit">
 - 			发布
 - 		</view>
 - 		
 - 
 - 		<configPopup
 - 		ref="configPopup"
 - 		:text="headInfo.save_no && headInfo.save_no.keyDetails"
 - 		/>
 - 		
 - 		<pickerHospital
 - 		mixinsListApi="getStorePage"
 - 		descKeyName="address"
 - 		keyName="title"
 - 		searchKey="title"
 - 		ref="pickerHospital"
 - 		@select="selectShop"
 - 		/>
 - 		
 - 	</view>
 - </template>
 - 
 - <script>
 - 	import { mapState } from 'vuex'
 - 	import Position from '@/utils/position.js'
 - 	import pickerHospital from '@/components/base/pickerHospital.vue'
 - 	import { subscribeBeforePublish } from '@/utils/subscribeMessage.js'
 - 	export default {
 - 		components : {
 - 			pickerHospital,
 - 		},
 - 		data() {
 - 			return {
 - 				form : {
 - 					title : '',
 - 					classId : 0,
 - 					address : '',
 - 					phone : '',
 - 					shop : '',
 - 				},
 - 				id : 0,
 - 				fileList : [],
 - 				codeFileList : [],
 - 				imageMax : 9,
 - 			};
 - 		},
 - 		computed : {
 - 			...mapState(['cityList', 'category', 'headInfo']),
 - 			categoryRole(){
 - 				if(!this.form.classId){
 - 					return []
 - 				}
 - 				for(let i = 0;i < this.category.length;i++){
 - 					let c = this.category[i]
 - 					if(c.id == this.form.classId){
 - 						return c.linkType ? c.linkType.split(',') : []
 - 						// return 'code,phone,address,shop'.split(',')
 - 					}
 - 				}
 - 				return []
 - 			},
 - 		},
 - 		onLoad(args) {
 - 			this.id = args.id
 - 			this.form.classId = this.category[0].id
 - 			// this.form.address = this.cityList[0].name
 - 			this.imageMax = args.imageMax || 9
 - 			this.getDateil()
 - 		},
 - 		onShow() {
 - 			this.$store.commit('getCategory')
 - 		},
 - 		methods : {
 - 			clickCategory(item, index){
 - 				this.form.classId = item.id
 - 			},
 - 			clickAddress(item, index){
 - 				this.form.address = item.name
 - 			},
 - 			getDateil(){
 - 				if(!this.id){
 - 					return
 - 				}
 - 				
 - 				let self = this
 - 				
 - 				this.$api('getPostDetail', {
 - 					id : this.id
 - 				}, res => {
 - 					if (res.code == 200) {
 - 						self.form.id = res.result.id
 - 						self.form.title = res.result.title
 - 						self.form.address = res.result.address || self.form.address
 - 						self.form.classId = res.result.classId || self.form.classId
 - 						self.form.latitude = res.result.latitude || self.form.latitude
 - 						self.form.longitude = res.result.longitude || self.form.longitude
 - 						self.form.shop = res.result.shop || self.form.shop
 - 						self.form.shopId = res.result.shopId || self.form.shopId
 - 						
 - 						if(res.result.wxImage){
 - 							self.codeFileList = [
 - 								{
 - 									url : res.result.wxImage
 - 								}
 - 							]
 - 						}
 - 						
 - 						if(res.result.image){
 - 							res.result.image.split(',')
 - 							.forEach(url => {
 - 								if(url.trim()){
 - 									// 根据文件扩展名判断类型
 - 									const isVideo = this.isVideoFile(url.trim())
 - 									self.fileList.push({
 - 										url: url.trim(),
 - 										type: isVideo ? 'video' : 'image'
 - 									})
 - 								}
 - 							})
 - 						}
 - 					}
 - 				})
 - 			},
 - 			deleteImage(e){
 - 				this[e.name].splice(e.index, 1)
 - 			},
 - 			afterRead(e){
 - 				let self = this
 - 				e.file.forEach(file => {
 - 					// 检测文件类型
 - 					const isVideo = this.isVideoFile(file.url || file.path)
 - 					
 - 					self.$Oss.ossUpload(file.url).then(url => {
 - 						self[e.name].push({
 - 							url,
 - 							type: isVideo ? 'video' : 'image'
 - 						})
 - 					})
 - 				})
 - 			},
 - 			
 - 			// 检测是否为视频文件
 - 			isVideoFile(filePath) {
 - 				const videoExtensions = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.webm', '.m4v', '.3gp']
 - 				const fileName = filePath.toLowerCase()
 - 				return videoExtensions.some(ext => fileName.includes(ext))
 - 			},
 - 			
 - 			// 提交
 - 			async submit(){
 - 				
 - 				// if(this.fileList.length == 0){
 - 				// 	return uni.showToast({
 - 				// 		title: '请上传图片',
 - 				// 		icon : 'none'
 - 				// 	})
 - 				// }
 - 				
 - 				if (this.$utils.verificationAll(this.form, {
 - 						title: '说点什么吧',
 - 					})) {
 - 					return
 - 				}
 - 				
 - 				if(this.categoryRole.includes('code') && this.codeFileList.length == 0){
 - 					return uni.showToast({
 - 						title: '请上传微信二维码',
 - 						icon : 'none'
 - 					})
 - 				}
 - 				
 - 				// 在发布前订阅消息通知
 - 				await subscribeBeforePublish()
 - 				
 - 				delete this.form.shop
 - 				
 - 				// 将所有文件(图片和视频)合并到 image 字段
 - 				this.form.image = this.fileList.map((item) => item.url).join(",")
 - 				this.form.wxImage = this.codeFileList.map((item) => item.url).join(",")
 - 				
 - 				this.$api('publishPost', this.form, res => {
 - 					if(res.code == 200){
 - 						uni.showToast({
 - 							title: '发布成功!',
 - 							icon: 'none'
 - 						})
 - 						
 - 						setTimeout(uni.navigateBack, 1000, -1)
 - 					}
 - 				})
 - 			},
 - 			//地图上选择地址
 - 			selectAddr() {
 - 				Position.selectAddress(success => {
 - 					this.setAddress(success)
 - 				})
 - 			},
 - 			
 - 			//提取用户选择的地址信息复制给表单数据
 - 			setAddress(res) {
 - 				
 - 				//经纬度信息
 - 				this.form.latitude = res.latitude
 - 				this.form.longitude = res.longitude
 - 			
 - 				if (res.name) { //用户直接选择城市的逻辑
 - 				// if (!res.address && res.name) { //用户直接选择城市的逻辑
 - 					return this.form.address = res.name
 - 				}
 - 				// if (res.address || res.name) {
 - 				// 	return this.form.address = res.address + res.name
 - 				// }
 - 				this.form.address = '' //用户啥都没选就点击勾选
 - 				this.form.latitude = ''
 - 				this.form.longitude = ''
 - 			},
 - 			// 选择关联的店铺
 - 			selectShop(shop){
 - 				this.form.shop = shop
 - 				this.form.shopId = shop.id
 - 				this.$refs.pickerHospital.close()
 - 			},
 - 		}
 - 	}
 - </script>
 - 
 - <style lang="scss" scoped>
 - .publishPost{
 - 	background-color: #fff;
 - 	min-height: 100vh;
 - 	font-size: 28rpx;
 - 	padding-bottom: 150rpx;
 - 	/deep/ .uv-textarea{
 - 		background-color: transparent;
 - 		border: none;
 - 	}
 - 	/deep/ .uv-textarea__count{
 - 		background-color: transparent !important;
 - 	}
 - 	.box{
 - 		padding: 0 20rpx;
 - 	}
 - 	.images{
 - 		display: flex;
 - 		flex-wrap: wrap;
 - 		padding: 20rpx;
 - 	}
 - 	.title-input{
 - 		margin: 10rpx;
 - 		border-bottom: 1px solid #00000015;
 - 		padding-bottom: 25rpx;
 - 		margin-bottom: 15rpx;
 - 		display: flex;
 - 		align-items: center;
 - 		justify-content: space-between;
 - 		input{
 - 			width: 100%;
 - 		}
 - 		.shop-box{
 - 			
 - 			.title{
 - 				font-size: 28rpx;
 - 			}
 - 			.desc{
 - 				margin-top: 10rpx;
 - 				color: #888;
 - 				font-size: 24rpx;
 - 			}
 - 		}
 - 	}
 - 	.content-input{
 - 		min-height: 400rpx;
 - 		/deep/ .uv-textarea{
 - 			min-height: 400rpx;
 - 		}
 - 	}
 - 	.upTop{
 - 		.title{
 - 			padding-top: 20rpx;
 - 			padding-left: 20rpx;
 - 			border-top: 1px solid #00000015;
 - 			display: flex;
 - 			align-items: center;
 - 		}
 - 		.list{
 - 			padding-top: 30rpx;
 - 			width: 100%;
 - 			.item{
 - 				display: flex;
 - 				padding: 20rpx;
 - 				padding-left: 80rpx;
 - 				justify-content: space-between;
 - 				width: 600rpx;
 - 				border-bottom: 1px solid #00000015;
 - 				align-items: center;
 - 			}
 - 		}
 - 	}
 - 	
 - 	.configBtn{
 - 		padding: 20rpx;
 - 		color: #777;
 - 		padding-top: 40rpx;
 - 		font-size: 28rpx;
 - 	}
 - 	
 - 	.confirmationPopup{
 - 		display: flex;
 - 		flex-direction: column;
 - 		align-items: center;
 - 		justify-content: center;
 - 		width: 100%;
 - 		height: 300rpx;
 - 		image{
 - 			margin-top: 40rpx;
 - 		}
 - 		.info{
 - 			margin-top: 40rpx;
 - 			font-size: 26rpx;
 - 		}
 - 	}
 - }
 - .category{
 - 	padding: 20rpx;
 - 	.title{
 - 		// font-weight: 900;
 - 		// font-size: 30rpx;
 - 	}
 - 	.tagList{
 - 		display: flex;
 - 		flex-wrap: wrap;
 - 		padding: 10rpx 0;
 - 		view{
 - 			background: rgba($uni-color, 0.1);
 - 			padding: 10rpx 20rpx;
 - 			margin: 10rpx;
 - 			border-radius: 10rpx;
 - 			font-size: 26rpx;
 - 		}
 - 		.act{
 - 			color: #fff;
 - 			background: $uni-color;
 - 		}
 - 	}
 - }
 - </style>
 
 
  |