|
|
- <template>
- <view class="page">
- <view class="tips color-ffb size-22">
- 注意:这段内容将会在您的喂养员个人主页,做为"服务案例”展示,并开放给其他铲屎官查看,请认真编辑哟!
- </view>
- <view class="li bg-fff">
- <view class="title">
- 服务类型
- <text class="size-22 color-999 ml10">可多选</text>
- </view>
- <up-checkbox-group v-model="form.serviceType">
- <view class="flex-between mt40" style="width: 100%;">
- <up-checkbox shape="circle" class="mr10" :customStyle="{marginBottom: '8px'}"
- v-for="item in petTypeOptions" :key="`serviceType-${item.id}`" :label="item.title" :name="item.id" activeColor="#FFBF60">
- </up-checkbox>
- </view>
- </up-checkbox-group>
- </view>
-
- <view class="li bg-fff">
- <view class="title">
- 服务时间
- </view>
- <view class="flex-between mt16">
- <text class="size-28 color-999">选择服务时间</text>
- <view class="flex-rowr" @click="openTimePicker">
- <view class="t-r size-28 mr10" :class="[form.serviceTime ? 'highlight' : '']">{{ serveTimeDesc }}</view>
- <up-icon name="arrow-right" color="#999999" size="27rpx"></up-icon>
- </view>
- </view>
- <up-datetime-picker
- v-model="form.serviceTime"
- :show="showTimePicker"
- mode="date"
- :closeOnClickOverlay="true"
- @close="closeTimePicker"
- @cancel="closeTimePicker"
- @confirm="closeTimePicker"
- ></up-datetime-picker>
- </view>
-
- <view class="li bg-fff">
- <view class="title">
- 服务地点
- </view>
- <view class="flex-between mt16">
- <text class="size-28 color-999">选择服务地点</text>
- <view class="flex-rowr" @click="selectAddr">
- <view class="t-r size-28 mr10" :class="[form.serviceSpot ? 'highlight' : '']">{{ form.serviceSpot || '请选择' }}</view>
- <up-icon name="arrow-right" color="#999999" size="27rpx"></up-icon>
- </view>
- </view>
- </view>
-
- <view class="li bg-fff">
- <view class="title">
- 文字记录
- </view>
- <textarea class="text"
- v-model="form.text"
- placeholder="请输入文字记录,可简单描述服务过程中发生的趣事,或夸奖一下服务宠物吧,10-100字"
- ></textarea>
- </view>
-
- <view class="li bg-fff">
- <view class="title">
- 图片记录
- </view>
- <view class="size-28 color-999 mt16">
- 请选择具有代表性的2-3张服务宠物图片,服务过程图片或视频截图,让铲屎官感受到您对毛孩子的爱吧
- </view>
- <view style="margin-top: 34rpx;">
- <up-upload
- :fileList="form.fileList"
- @afterRead="afterRead"
- @delete="deletePic"
- multiple
- >
- <image src="../static/list/icon-upload.png" style="width: 144rpx;height: 144rpx;"></image>
- </up-upload>
- </view>
- </view>
-
- <view class="footer-btn">
- <view class="btn" @click="onSave">
- 立即上传
- </view>
- </view>
- </view>
- </template>
-
- <script setup>
- import { ref, reactive, computed } from 'vue';
- import { onLoad } from '@dcloudio/uni-app'
- import { useStore } from 'vuex'
- import dayjs from 'dayjs'
- import { ossUpload } from '@/utils/oss-upload/oss/index.js'
- import { insertServiceLog, udpateServiceLog } from '@/api/serviceLog'
-
- const store = useStore()
-
- const id = ref()
-
- const form = reactive({
- serviceType: [],
- serviceTime: null,
- serviceSpot: null,
- latitude: null,
- longitude: null,
- text: null,
- fileList: [],
- })
-
- const fetchServiceLogDetail = async () => {
- try {
-
- const data = (await serviceLogList({ id: id.value }))?.[0]
- // const data = uni.getStorageSync('serviceLogData')
-
- const {
- serviceType,
- serviceTime,
- serviceSpot,
- text,
- image,
- } = data
-
- form.serviceType = serviceType?.split?.(',').map(item => parseInt(item)) || []
- form.serviceTime = serviceTime
- form.serviceSpot = serviceSpot
- form.text = text
- form.fileList = image?.split?.(',').map(url => ({ url })) || []
-
- } catch (err) {
-
- }
- }
-
- const petTypeOptions = computed(() => {
- return store.getters.petTypeOptions
- })
-
- const showTimePicker = ref(false)
- const openTimePicker = () => {
- showTimePicker.value = true
- }
- const closeTimePicker = () => {
- showTimePicker.value = false
- }
- const serveTimeDesc = computed(() => {
- if (!form.serviceTime) {
- return '请选择'
- }
-
- return dayjs(form.serviceTime).format('YYYY/MM/DD')
- })
-
- const setAddress = (res) => {
- //经纬度信息
- form.latitude = res.latitude
- form.longitude = res.longitude
-
- if (!res.address && res.name) { //用户直接选择城市的逻辑
- return form.serviceSpot = res.name
- }
- if (res.address || res.name) {
- return form.serviceSpot = res.address + res.name
- }
- form.serviceSpot = '' //用户啥都没选就点击勾选
- }
-
- const selectAddr = () => {
- uni.chooseLocation({
- success: function(res) {
- setAddress(res)
- }
- })
- }
-
- const afterRead = (event) => {
- event.file.forEach(n => {
- ossUpload(n.url)
- .then(url => {
- form.fileList.push({
- url
- })
- })
- })
- };
- const deletePic = (event) => {
- form.fileList.splice(event.index, 1);
- };
-
- const onSave = async () => {
- try {
-
- const {
- serviceType,
- serviceTime,
- serviceSpot,
- text,
- fileList,
- } = form
-
- const data = {
- userId: store.getters.userInfo.userId,
- serviceType: serviceType.join(','),
- serviceTime: dayjs(serviceTime).format('YYYY-MM-DD HH:mm:ss'),
- serviceSpot,
- text,
- image: fileList.map(item => item.url).join(',')
- }
-
- if (id.value) {
- data.id = id.value
- await udpateServiceLog(data)
- } else {
- await insertServiceLog(data)
- }
-
- uni.showToast({
- title: '上传成功!',
- icon: "none"
- })
-
- setTimeout(() => {
- uni.navigateBack()
- }, 1000)
- } catch (err) {
-
- }
- }
-
- onLoad((option) => {
- store.dispatch('fetchPetTypeOptions')
-
- id.value = option.id
-
- if (id.value) {
- fetchServiceLogDetail()
- }
- })
- </script>
-
- <style lang="scss" scoped>
- .page {
- min-height: 100vh;
- padding-bottom: 144rpx;
- }
-
- .text {
- padding: 16rpx;
- background-color: #F3F3F3;
- font-size: 28rpx;
- margin-top: 16rpx;
- border-radius: 20rpx;
- }
-
- .tips {
- padding: 8rpx 16rpx;
- background-color: rgb(255, 250, 242);
- }
-
- .li {
- margin: 20rpx;
- border-radius: 20rpx;
- padding: 24rpx 36rpx;
- }
-
- .title {
- font-size: 30rpx;
- font-weight: 700;
- display: flex;
- align-items: center;
-
- &:before {
- display: block;
- content: "";
- width: 10rpx;
- border-radius: 10rpx;
- height: 34rpx;
- background-color: #FFBF60;
- margin-right: 15rpx;
- }
- }
-
- .highlight {
- color: #FFBF60;
- }
-
- .footer-btn {
- z-index: 4;
- }
- </style>
|