From ed5d47ad987f2a20f33fbd5cc64dbcdb208f5e15 Mon Sep 17 00:00:00 2001
From: xuxueyang <xuxy@fengyuntec.com>
Date: 星期一, 26 八月 2024 11:31:53 +0800
Subject: [PATCH] add 意见反馈
---
environments/index.js | 1
common/global.scss | 46 ++++
sub_pages/partner/delivery/delivery-detail.vue | 2
pages.json | 21 +
sub_pages/customer/self/feedback-detail.vue | 251 +++++++++++++++++++++++++
sub_pages/customer/self/feedback.vue | 214 +++++++++++++++++----
pages/user/supplier-user.vue | 26 ++
7 files changed, 506 insertions(+), 55 deletions(-)
diff --git a/common/global.scss b/common/global.scss
index 13ee8b7..2409439 100644
--- a/common/global.scss
+++ b/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;
}
diff --git a/environments/index.js b/environments/index.js
index 7a40f75..a6f20e1 100644
--- a/environments/index.js
+++ b/environments/index.js
@@ -8,4 +8,3 @@
tenantId: '',
type: 'dev'
}
-
diff --git a/pages.json b/pages.json
index 296e138..9757ba3 100644
--- a/pages.json
+++ b/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
]
diff --git a/pages/user/supplier-user.vue b/pages/user/supplier-user.vue
index aab37ab..56b3ddb 100644
--- a/pages/user/supplier-user.vue
+++ b/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">
diff --git a/sub_pages/customer/self/feedback-detail.vue b/sub_pages/customer/self/feedback-detail.vue
new file mode 100644
index 0000000..0c75326
--- /dev/null
+++ b/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>
\ No newline at end of file
diff --git a/sub_pages/customer/self/feedback.vue b/sub_pages/customer/self/feedback.vue
index 87060aa..ee79494 100644
--- a/sub_pages/customer/self/feedback.vue
+++ b/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>
\ No newline at end of file
diff --git a/sub_pages/partner/delivery/delivery-detail.vue b/sub_pages/partner/delivery/delivery-detail.vue
index e148c37..df13f1b 100644
--- a/sub_pages/partner/delivery/delivery-detail.vue
+++ b/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
--
Gitblit v1.9.3