common/global.scss | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
environments/index.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/user/supplier-user.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
sub_pages/customer/self/feedback-detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
sub_pages/customer/self/feedback.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
sub_pages/partner/delivery/delivery-detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
common/global.scss
@@ -153,6 +153,52 @@ padding-right: 0rpx; line-height: 40rpx; } .component-buttons{ display: flex; margin-left: auto; width: fit-content; .button { // width: 216rpx; padding: 10rpx 20rpx; line-height: 34rpx; font-size: 24rpx; height: 34rpx; background: #20613D; text-align: center; border-radius: 30rpx; min-width: 80rpx; } .button-1 { padding: 10rpx 20rpx; line-height: 34rpx; font-size: 24rpx; height: 34rpx; background: #20613D; text-align: center; border-radius: 30rpx; min-width: 80rpx; background: #fff; color: #333; border: 2rpx solid #333; } .button-0 { padding: 10rpx 20rpx; line-height: 34rpx; font-size: 24rpx; height: 34rpx; background: #20613D; text-align: center; border-radius: 30rpx; min-width: 80rpx; color: #fff; border: 2rpx solid #20613D; } } .component-button-contact::after{ display: none !important; } environments/index.js
@@ -8,4 +8,3 @@ tenantId: '', type: 'dev' } pages.json
@@ -410,14 +410,19 @@ "navigationBarTitleText": "我的收藏", "enablePullDownRefresh": true } }, , { "path": "self/feedback", "style": { "navigationBarTitleText": "投诉反馈", "enablePullDownRefresh": true } }, { "path": "self/feedback", "style": { "navigationBarTitleText": "投诉反馈", "enablePullDownRefresh": true } }, { "path": "self/feedback-detail", "style": { "navigationBarTitleText": "投诉反馈" } } // #endif ] pages/user/supplier-user.vue
@@ -100,14 +100,16 @@ <view>待付款</view> </view> <view class="order-icons" @click="goto('/pages/order/order?status=SEND',true)"> <image src="../../static/images/customer/order/order-type-2.png" class="order-icon dfh" style="position: relative;"> <image src="../../static/images/customer/order/order-type-2.png" class="order-icon dfh" style="position: relative;"> <view class="image-shop-number" v-if="tj_order.sendCount">{{tj_order.sendCount||''}}</view> </image> <view>待发货</view> </view> <view class="order-icons" @click="goto('/pages/order/order?status=RECEIVE',true)"> <image src="../../static/images/customer/order/order-type-3.png" class="order-icon dsh" style="position: relative;"> <image src="../../static/images/customer/order/order-type-3.png" class="order-icon dsh" style="position: relative;"> <view class="image-shop-number" v-if="tj_order.receiveCount">{{tj_order.receiveCount||''}} </view> @@ -115,7 +117,8 @@ <view>待收货</view> </view> <view class="order-icons" @click="goto('/pages/order/order?status=EVALUATE',true)"> <image src="../../static/images/customer/order/order-type-4.png" class="order-icon dpj" style="position: relative;"> <image src="../../static/images/customer/order/order-type-4.png" class="order-icon dpj" style="position: relative;"> <view class="image-shop-number" v-if="tj_order.evaluateCount">{{tj_order.evaluateCount||''}} </view> @@ -123,9 +126,11 @@ <view>待评价</view> </view> <view class="order-icons" @click="goto('/pages/order/order-sale/order-sale',true)"> <image src="../../static/images/customer/order/order-type-5.png" class="order-icon sh" style="position: relative;"> <image src="../../static/images/customer/order/order-type-5.png" class="order-icon sh" style="position: relative;"> <view class="image-shop-number" v-if="tj_order.salesPendingCount"> {{tj_order.salesPendingCount||''}}</view> {{tj_order.salesPendingCount||''}} </view> </image> <view>售后</view> @@ -251,6 +256,13 @@ <uni-icons type="right"></uni-icons> </view> </view> <view class="user-util m-t-12 flex" @click="goto('/sub_pages/customer/self/feedback',true)"> <view class="title">投诉反馈</view> <view class="right-icon"> <uni-icons type="right"></uni-icons> </view> </view> <!-- v-if="selftype==='customer'" --> <view class="user-util m-t-12 flex" @click="clearlogout"> <view class="title">退出登录</view> @@ -259,6 +271,10 @@ </view> </view> <view class="user-util m-t-12 " v-if="selftype==='supplier'||selftype==='customer' || !selftype"> <view class="title">我的客服</view> <view class="flex flex-wrap-normal"> sub_pages/customer/self/feedback-detail.vue
对比新文件 @@ -0,0 +1,251 @@ <script> export default { data() { return { dto: { id: '', feedBack: '', createTime: '', reply: '', replyTime: '', type: '', pictures: [], }, id: '', }; }, async onLoad(options) { this.id = options.id || '' await this.init() }, methods: { async init() { this.$message.showLoading() const { data } = await this.$http.request('get', '/api/feedback/page/view?id=' + this.id, {}) this.$message.hideLoading() if (data) { var t = data || {} if (!t.pictures) { t.pictures = [] } else { try { t.pictures = JSON.parse(t.pictures) || [] } catch (e) { console.log('parse arriveImages', e) } } this.dto = { ...this.dto, ...t } } }, } } </script> <template> <view class="delivery-detail-page bg-white p20"> <view v-if="dto.id"> <view class="delivery-info flex"> <view class="flex1 desc"> <view class="name">投诉反馈类型:{{ dto.typeStr || dto.type || '-'}}</view> <view class="name">投诉反馈内容:{{ dto.feedBack || '-'}}</view> <view class="name">提交时间:{{ dto.createTime || '-' }}</view> <view class="line-gray"></view> <view class="name">回复内容:{{ dto.reply || '-'}}</view> <view class="name">回复时间:{{ dto.replyTime || '-' }}</view> </view> </view> </view> <view class="m-t-12 flex" v-if="dto.pictures&&dto.pictures.length>0"> <view class="m-l-15 m-r-0 station"> <view>投诉反馈图片</view> </view> <view class="m-t-12 m-r-10 " v-for="(timg,index) of dto.pictures" :key="index"> <image class="arrive-img" :src="timg" @click.stop="previewImg(timg)"> </image> </view> </view> </view> </view> </template> <style lang="scss" scoped> .delivery-detail-page { .arrive-img { width: 96rpx; height: 96rpx; border-radius: 4rpx; border: 2rpx dashed #CECECE; } .delivery-order-item { .title { font-weight: 600; font-size: 28rpx; color: #000000; line-height: 40rpx; .level { font-weight: 400; font-size: 28rpx; color: #20613D; line-height: 40rpx; margin-left: 20rpx; } } .buttons { display: flex; .button { margin: 0 auto; width: 98rpx; line-height: 48rpx; border-radius: 24rpx; border: 2rpx solid #CECECE; text-align: center; font-size: 24rpx; color: #666666; line-height: 34rpx; } .button-0 { color: #fff; border: 2rpx solid #20613D; background: #20613D; } } .flower-img { width: 128rpx; height: 118rpx; min-width: 128rpx; min-height: 118rpx; } .each-list { display: flex; flex-wrap: wrap; margin-top: 6rpx; .each-item { min-width: 30%; max-width: 40%; text-align: center; margin-left: 0rpx; margin-right: auto; display: flex; .label { font-weight: 400; font-size: 24rpx; color: #666666; text-align: left; padding-right: 10rpx; } .label::after { content: ": " } .value { font-weight: 400; font-size: 24rpx; color: #666666; } } } } .popup-check-form { background: #FFFFFF; border-radius: 16rpx; // width: 690rpx; height: 882rpx; margin-top: 120rpx; margin-left: 30rpx; margin-right: 30rpx; padding: 24rpx 36rpx; .check-img { width: 96rpx; height: 96rpx; border-radius: 4rpx; border: 2rpx dashed #CECECE; } .submit { margin-top: 30rpx; .form-input { height: 36rpx; line-height: 36rpx; } .value-item { min-width: 152rpx; width: fit-content; text-align: center; height: 58rpx; background: #F1F5F2; border-radius: 36rpx; margin-bottom: 18rpx; font-weight: 400; font-size: 28rpx; line-height: 58rpx; padding: 8rpx 24rpx; color: #33a868; margin-left: 16rpx; margin-right: 16rpx; border: 2rpx solid #F1F5F2; } .value-item.cur { background: #E1F0E7; border-radius: 36rpx; border: 2rpx solid #20613D; color: #20613D; } } } .delivery-info { padding: 20rpx; .desc { font-weight: 400; font-size: 28rpx; color: #666666; line-height: 40rpx; } .station { height: 50rpx; background: #C6E8D4; border-radius: 4rpx; padding-left: 20rpx; padding-right: 20rpx; min-width: 110rpx; line-height: 50rpx; } } } </style> sub_pages/customer/self/feedback.vue
@@ -13,6 +13,10 @@ <view class="name">回复内容:{{ item.reply || '-'}}</view> <view class="name">回复时间:{{ item.replyTime || '-' }}</view> </view> <view class="line-gray"></view> <view class="component-buttons"> <view class="button-1" @click="toDetail(item)">查看详情</view> </view> </view> </view> <footer-msg :more="page.total>0&&page.total>page.current*page.size&&list.length>0"></footer-msg> @@ -25,30 +29,65 @@ </view> <!-- <uni-popup ref="popup" type="bottom"> <uni-popup ref="popup" type="bottom"> <view class="component-popup_input_all"> <view class="text-center m-b-40" style="font-size: 48rpx;font-weight: 600;">填写投诉/反馈内容</view> <view v-for="(item,i) in level_columns" :key="i" class="m-t-20"> <view class="m-t-12 flex value-items"> <view class="value-item" @click="()=>{ if(each.value!==query.value){ query.level = each.value query.levelStr = each.label refreshList() $refs.popup.close() } }" :class="[query.level==each.value?'cur':'']" v-for="(each, j) in item" :key="j"> {{ each.label || '-' }} <view class="close-parent"> 填写投诉/反馈内容 <uni-icons class="close" type="closeempty" @click="$refs.popup.close()"></uni-icons> </view> <view class="submit form"> <view class="form-item" style="height: unset;"> <view class="form-item-label require" style="min-width: 120rpx;margin-right: 10rpx;"> 类型 </view> <view class="form-item-value flex value-items"> <view class="value-item" @click="()=>{ if(submitForm.type!==each.value){ submitForm.type = each.value } }" :class="[submitForm.type==each.value?'cur':'']" v-for="(each, j) in type_columns" :key="j"> {{ each.label || '-' }} </view> </view> </view> <view class="form-item"> <view class="form-item-label require"> 内容 </view> <view class="form-item-value"> <input v-model="submitForm.feedBack" placeholder="填写投诉/反馈内容" class="form-input"></input> </view> </view> <view class="form-item"> <view class="form-item-label require"> 图片 </view> <view class="form-item-value m-l-a m-r-0"> <view class="t-red" @click="uploadCheckImage()">上传</view> </view> </view> <view class="flex p20" v-if="submitForm.pictures&&submitForm.pictures.length>0"> <view class="m-t-12 m-r-10 " v-for="(timg,index) of submitForm.pictures" :key="index"> <image class="check-img" :src="timg" @click.stop="previewImg(timg)"> </image> <view class="t-red text-center" @click.stop="deleteCheckImage(index)">删除</view> </view> </view> </view> <view class="button-space"></view> <view> <view class="button-green" @click="$refs.popup.close()">关闭 </view> <!-- <view class="line-gray"></view> --> <view class="component-buttons m-t-20" style="width: unset;"> <view class="button-1 m-auto" @click="$refs.popup.close()">关闭</view> <view class="button-0 m-auto" @click="submit">提交</view> </view> </view> </uni-popup> --> </uni-popup> </view> </template> @@ -56,7 +95,10 @@ <script> export default { data() { return {} return { submitForm: {}, type_columns: [], } }, async onPullDownRefresh() { await this.refreshList() @@ -68,36 +110,120 @@ async onLoad() { this.listApi = '/api/feedback/my/feedback/list' this.getList() this.$http.request('get', '/api/code/value', { params: { type: 'feedback_type' } }).then(res => { var data = res.data this.type_columns = data || [] }) }, methods: { async addFeedback() { const res = await this.$message.confirm('', { editable: true, title: '请填写投诉/反馈内容' toDetail(item) { uni.navigateTo({ url: `/sub_pages/customer/self/feedback-detail?id=${item.id}` }) if (res.content && res.confirm) { // 发送请求 if (!res.content) { this.$message.showToast('未填写内容') } else { this.$message.showLoading() const { code } = await this.$http.request('post', '', { data: { feedBack: res.content }, async deleteCheckImage(index) { await this.$message.confirm('确定删除吗') this.submitForm.pictures.splice(index, 1) }, uploadCheckImage() { let that = this uni.chooseImage({ count: 1, // 最多可以选择的图片张数,默认9 sizeType: ['compressed'], //original 原图,compressed 压缩图,默认二者都有 sourceType: ['camera', 'album'], //album 从相册选图,camera 使用相机,默认二者都有。如需直接开相机或直接选相册,请只使用一个选项 success: function(res) { let errMsg = res.errMsg let tempFiles = res.tempFiles if (errMsg === 'chooseImage:ok') { if (tempFiles[0].size > 1024 * 1024 * 5) { that.$message.confirm('图片最多支持5M大小,超出大小限制') return } }) this.$message.hideLoading() if (code == 0) { await this.refreshList() this.$message.showToast('提交成功') that.$message.showLoading() that.$http.upload(tempFiles[0].path).then(async res => { console.log('res1', res) var pic = res.data && res.data.length > 0 && res.data[ 0] .url || '' that.$message.hideLoading() that.submitForm.pictures.push(pic) that.$forceUpdate() }).catch(res => { that.$message.hideLoading() console.error(res) }) } } }) }, async addFeedback() { this.submitForm = { feedBack: '', type: '', pictures: [], } this.$refs.popup.open() // const res = await this.$message.confirm('', { // editable: true, // title: '请填写投诉/反馈内容' // }) // if (res.content && res.confirm) { // // 发送请求 // if (!res.content) { // this.$message.showToast('未填写内容') // } else { // this.$message.showLoading() // const { // code // } = await this.$http.request('post', '', { // data: { // feedBack: res.content // } // }) // this.$message.hideLoading() // if (code == 0) { // await this.refreshList() // this.$message.showToast('提交成功') // } // } } else { // } else { // } }, async submit() { console.log('submitForm',this.submitForm) if (!this.submitForm.type) { this.$message.showToast('未选择类型') return } if (!this.submitForm.feedBack) { this.$message.showToast('未填写内容') return } this.$message.showLoading() const { code } = await this.$http.request('post', '/api/feedback/page/new', { data: { feedBack: this.submitForm.feedBack, type: this.submitForm.type, pictures: JSON.stringify(this.submitForm.pictures) } }) this.$message.hideLoading() if (code == 0) { this.$refs.popup.close() await this.refreshList() this.$message.showToast('提交成功') } } @@ -163,4 +289,12 @@ } } } .component-popup_input_all{ .check-img { width: 96rpx; height: 96rpx; border-radius: 4rpx; border: 2rpx dashed #CECECE; } } </style> sub_pages/partner/delivery/delivery-detail.vue
@@ -337,7 +337,7 @@ <view class="form-item-label require" style="min-width: 120rpx;margin-right: 10rpx;"> 降级等级 </view> <view class="form-item-value flex"> <view class="form-item-value flex "> <view class="value-item" @click="()=>{ if(form.targetLevel!==query.value){ form.targetLevel = each.value