Compare commits

...

2 Commits

Author SHA1 Message Date
1378012178@qq.com 8b04e2471c Merge branch 'master' of http://47.115.223.229:8888/yangjun/sadjv3_user
# Conflicts:
#	pages/my/index.vue
2025-02-08 16:42:36 +08:00
1378012178@qq.com 004efb5469 1、我的盛安-我要投诉-功能重做
2、我的盛安-帮助中心-新增反馈历史功能
2025-02-08 16:41:02 +08:00
10 changed files with 2178 additions and 13 deletions

View File

@ -1,16 +1,16 @@
// const ROOTPATH3 = "wss://192.168.2.222:8187/wss/chatSocket/";
// const ROOTPATH = "http://192.168.2.222:8187/sqx_fast";
// const ROOTPATH1 = "http://192.168.2.222:8187/sqx_fast";
const ROOTPATH3 = "wss://192.168.2.22:8187/wss/chatSocket/";
const ROOTPATH = "http://192.168.2.22:8187/sqx_fast";
const ROOTPATH1 = "http://192.168.2.22:8187/sqx_fast";
// const ROOTPATH3 = "wss://sausers.blxinchuang.com/wss/chatSocket/";
// const ROOTPATH = "https://sausers.blxinchuang.com/sqx_fast";
// const ROOTPATH1 = "https://sausers.blxinchuang.com/sqx_fast";
//生产环境
const ROOTPATH = "https://admin.sjajk.com/sqx_fast";//生产需替换
const ROOTPATH1 = "https://admin.sjajk.com/sqx_fast";//生产需替换
const ROOTPATH3 = "wss://admin.sjajk.com/wss/chatSocket/"; //联系客服//生产需替换
// const ROOTPATH = "https://admin.sjajk.com/sqx_fast";//生产需替换
// const ROOTPATH1 = "https://admin.sjajk.com/sqx_fast";//生产需替换
// const ROOTPATH3 = "wss://admin.sjajk.com/wss/chatSocket/"; //联系客服//生产需替换
//上传地址
const UPLOAD_PATH = ROOTPATH1 + '/alioss/upload';

View File

@ -0,0 +1,258 @@
<!-- 帮助反馈页面 -->
<template>
<view>
<view class="xsads">
<view class="" style="font-size: 38rpx;color: #ffffff;font-weight: 600;">投诉中心</view>
<view class="" style="font-size: 28rpx;color: #ffffff;margin-top: 10rpx;">倾听您的声音保障您的权益</view>
</view>
<view class="uselist flex align-center" style="justify-content: space-evenly;">
<view class="" style="text-align: center;" @click="goHistory">
<view class="">
<image src="../../static/jdskald.png" style="width: 74rpx;height: 60rpx;"></image>
</view>
<view class="text-feedback" hover-class="hover">历史消息</view>
</view>
<view class="" style="text-align: center;" @click="showType = true">
<view class="">
<image src="../../static/bbn.png" style="width: 62rpx;height: 60rpx;"></image>
</view>
<view class="text-feedback" hover-class="hover">我要投诉</view>
</view>
</view>
<u-action-sheet :list="typeList" v-model="showType" @click="typeCallback"></u-action-sheet>
</view>
</template>
<script>
export default {
data() {
return {
helpClassifyList: [],
typeList: [{
text: '投诉技师',
label: '/my/feedback/tsjsForm'
}, {
text: '投诉平台',
label: '/my/feedback/indexts?type=7'
}],
showType: false,
newTypeList: [],
}
},
onLoad() {
this.getlist()
},
methods: {
typeCallback(index) {
uni.navigateTo({
url: this.typeList[index].label,
success: res => {},
fail: () => {},
complete: () => {}
});
},
openList(item) {
var oldhelpClassifyList = item
if (oldhelpClassifyList.parentId == 1) {
item.parentId = 0
} else {
item.parentId = 1
}
},
getlist() {
let data = {
types: 1
}
this.$Request.get("/app/helpWord/selectHelpList", data).then(res => {
if (res.code == 0) {
this.helpClassifyList = res.data
for (var i = 0; i < this.helpClassifyList.length; i++) {
this.helpClassifyList[i].parentId = 1
}
// this.helpClassifyList.isTrue = false
} else {
uni.showToast({
title: res.msg,
icon: 'none'
})
}
});
},
onClick(item) {
console.log(item.helpWordId)
// return
uni.navigateTo({
url: '/my/help/helpDetail?helpWordId=' + item.helpWordId
})
},
goChat() {
let kefu = this.$queue.getData('kefu'); // 1 2
let kefuPhone = this.$queue.getData('kefuPhone');
if (kefu == 1) {
uni.makePhoneCall({
phoneNumber: kefuPhone //
});
} else if (kefu == 3) {
uni.navigateTo({
url: '/my/setting/customer'
});
} else {
// #ifdef MP-WEIXIN
let that = this
try {
wx.openCustomerServiceChat({
extInfo: {
url: that.$queue.getData('kefuUrl')
},
corpId: that.$queue.getData('kefuAppId'),
success(res) {},
fail(res) {
console.error(res)
}
})
} catch (error) {
console.error("catchcatch" + error)
uni.showToast({
title: '请更新至微信最新版本'
});
}
// #endif
// #ifndef MP-WEIXIN
let url = that.$queue.getData('kefuUrl');
if (url.indexOf('/pages/') !== -1 || url.indexOf('/my/') !== -1) {
uni.navigateTo({
url
});
} else {
//#ifndef H5
uni.navigateTo({
url: '/pages/index/webView?url=' + url
});
//#endif
//#ifdef H5
window.location.href = url;
//#endif
}
// #endif
}
},
goHistory() {
uni.navigateTo({
url: '/my/feedback/tshistory',
success: res => {},
fail: () => {},
complete: () => {}
});
}
}
}
</script>
<style>
page {
background-color: #f7f7f7;
height: 100%;
}
.xsads {
width: 100%;
height: 380rpx;
background: url(../../static/wentias.png) center;
background-size: cover;
padding: 40rpx 30rpx;
}
.bg-box {
background-color: #FFFFFF;
position: fixed;
bottom: 0;
left: 0;
right: 0;
}
.uselist {
background-color: #FFFFFF;
padding: 50rpx 30rpx;
margin-top: -200rpx;
border-radius: 10px;
width: 92%;
margin-left: 4%;
}
.bg-list {
width: 92%;
margin-left: 4%;
margin-bottom: 100rpx;
background-color: #FFFFFF;
padding: 50rpx 30rpx;
margin-top: 20rpx;
border-radius: 10px;
}
.vertical-line {
height: 20rpx;
background-color: #cecece;
width: 2rpx;
margin-left: 30rpx;
margin-right: 30rpx;
}
.line {
width: 100%;
height: 1rpx;
background-color: #d3d3d3;
}
.text-title {
color: #000;
font-size: 32rpx;
font-weight: bold;
}
.text-item {
color: #999999;
font-size: 28rpx;
padding: 24rpx 0rpx;
}
.list-title {
margin-bottom: 30rpx;
}
.list-question {
color: #000;
font-size: 28rpx;
}
.hover {
background-color: #ffffff;
opacity: 0.6;
}
.image {
width: 40rpx;
height: 40rpx;
margin-left: 20rpx;
}
.text-feedback {
font-size: 30rpx;
font-weight: 600;
margin-top: 8rpx;
}
.text-top {
margin: 30rpx;
color: #000;
font-size: 34rpx;
}
</style>

View File

@ -5,7 +5,7 @@
<text>问题和意见</text>
<text @tap="chooseMsg" style="color: #096f4b;">快速键入</text>
</view>
<view class="feedback-body"><textarea placeholder="请详细描述你的问题和意见..." v-model="sendDate.content" class="feedback-textare" /></view>
<view class="feedback-body"><textarea placeholder="请详细描述你的问题和意见" v-model="sendDate.content" class="feedback-textare" /></view>
</view>
<view class="bg" style="margin-top: 20rpx;">
<view class="feedback-title"><text>联系方式</text></view>
@ -28,10 +28,12 @@ export default {
score: 5,
content: '',
contact: ''
}
},
type:2,
};
},
onLoad() {
onLoad(e) {
if(e.type) this.type = e.type
// let deviceInfo = {
// appid: plus.runtime.appid,
// imei: plus.device.imei, //
@ -98,15 +100,24 @@ export default {
return;
}
this.$queue.showLoading('加载中...');
this.$Request.postJson('/app/message/insertMessage', {
state: 2,
let reqParams = {
state: this.type,
obj:'PT',
title: this.sendDate.contact,
content: this.sendDate.content,
userId: userId
// title: this.sendDate.contact,
// content: JSON.stringify(this.sendDate),
// state: 2
}).then(res => {
}
if(this.type == 7){
reqParams.type = 0
reqParams.userName = this.$queue.getData('userName')
reqParams.byUserId = -1
reqParams.byUserName = '平台'
}
console.log(reqParams)
this.$Request.postJson('/app/message/insertMessage',reqParams ).then(res => {
if (res.code === 0) {
uni.showToast({
title: '提交成功'

211
my/feedback/indexts.vue Normal file
View File

@ -0,0 +1,211 @@
<template>
<view class="page">
<view class="bg">
<view class="feedback-title">
<text>平台投诉</text>
<text @tap="chooseMsg" style="color: #096f4b;">快速键入</text>
</view>
<view class="feedback-body"><textarea placeholder="请输入您要投诉的内容..." v-model="sendDate.content" class="feedback-textare" /></view>
</view>
<view class="bg" style="margin-top: 20rpx;">
<view class="feedback-title"><text>联系方式</text></view>
<view class="feedback-body"><input class="feedback-input" v-model="sendDate.contact" placeholder="方便我们联系你 " /></view>
</view>
<view style="position: fixed;bottom: 0rpx;left: 0;right: 0;background: #FFFFFF;height: 110rpx;line-height: 110rpx;z-index: 999;width: 100%;padding: 0 30rpx;">
<button style="" class="feedback-submit" @tap="send">提交</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
msgContents: ['界面显示错乱', '启动缓慢,卡出翔了', 'UI无法直视丑哭了', '偶发性崩溃'],
stars: [1, 2, 3, 4, 5],
imageList: [],
sendDate: {
score: 5,
content: '',
contact: ''
},
type:2,
};
},
onLoad(e) {
if(e.type) this.type = e.type
// let deviceInfo = {
// appid: plus.runtime.appid,
// imei: plus.device.imei, //
// p: plus.os.name === 'Android' ? 'a' : 'i', //iiOSaAndroid
// md: plus.device.model, //
// app_version: plus.runtime.version,
// plus_version: plus.runtime.innerVersion, //
// os: plus.os.version,
// net: '' + plus.networkinfo.getCurrentType()
// };
// this.sendDate = Object.assign(deviceInfo, this.sendDate);
},
methods: {
close(e) {
this.imageList.splice(e, 1);
},
chooseMsg() {
//
uni.showActionSheet({
itemList: this.msgContents,
success: res => {
this.sendDate.content = this.msgContents[res.tapIndex];
}
});
},
chooseImg() {
//
uni.chooseImage({
sourceType: ['camera', 'album'],
sizeType: 'compressed',
count: 8 - this.imageList.length,
success: res => {
this.imageList = this.imageList.concat(res.tempFilePaths);
}
});
},
chooseStar(e) {
//
this.sendDate.score = e;
},
previewImage() {
//
uni.previewImage({
urls: this.imageList
});
},
send() {
//
console.log(JSON.stringify(this.sendDate));
let userId = this.$queue.getData('userId');
let phone = this.$queue.getData('phone') ? this.$queue.getData('phone') : '';
if (!this.sendDate.content) {
uni.showToast({
icon: 'none',
title: '请输入反馈内容'
});
return;
}
if (!this.sendDate.contact) {
uni.showToast({
icon: 'none',
title: '请填写联系方式'
});
return;
}
this.$queue.showLoading('加载中...');
let reqParams = {
state: this.type,
obj:'PT',
title: this.sendDate.contact,
content: this.sendDate.content,
userId: userId
// title: this.sendDate.contact,
// content: JSON.stringify(this.sendDate),
// state: 2
}
if(this.type == 7){
reqParams.type = 0
reqParams.userName = this.$queue.getData('userName')
reqParams.byUserId = -1
reqParams.byUserName = '平台'
}
console.log(reqParams)
this.$Request.postJson('/app/message/insertMessage',reqParams ).then(res => {
if (res.code === 0) {
uni.showToast({
title: '提交成功'
});
uni.switchTab({
url:'/pages/order/index'
})
// setTimeout(function() {
// uni.navigateBack();
// }, 1000);
} else {
uni.hideLoading();
uni.showModal({
showCancel: false,
title: '投诉失败',
content: res.msg
});
}
});
}
}
};
</script>
<style>
@font-face {
font-family: uniicons;
font-weight: normal;
font-style: normal;
src: url('https://img-cdn-qiniu.dcloud.net.cn/fonts/uni.ttf') format('truetype');
}
page {
background-color: #f7f7f7;
}
.bg{
background-color: #ffffff;
padding: 30rpx;
}
/*问题反馈*/
.feedback-title {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
color: #333333;
font-weight: 600;
font-size: 32rpx;
}
.feedback-star-view.feedback-title {
justify-content: flex-start;
margin: 0;
}
.feedback-body {
font-size: 28rpx;
padding: 16upx;
margin: 16upx 0;
border-radius: 16upx;
background: #F5F5F5;
/* color: #FFF; */
}
.feedback-textare {
height: 200upx;
font-size: 28rpx;
line-height: 50upx;
width: 100%;
box-sizing: border-box;
padding: 20upx 30upx 0;
}
.feedback-input {
font-size: 28rpx;
height: 60upx;
padding: 15upx 20upx;
line-height: 60upx;
}
.feedback-submit {
background: linear-gradient(90deg, #019C88, #0FA78B, #35C495);
color: #FFFFFF;
margin: 16rpx 0;
width: 100%;
border-radius: 50rpx;
height: 78rpx;
line-height: 78rpx;
font-size: 30rpx;
text-align: center;
}
</style>

172
my/feedback/tshistory.vue Normal file
View File

@ -0,0 +1,172 @@
<template>
<view>
<view class="bonus-main">
<view class="list-item " v-if="dataList.length>0" :show-arrow="false" v-for="(item, index) in dataList"
:key="index">
<view class="list-item-wrap margin-top-sm">
<view class="padding-tb-sm" v-if="item.image">
<swiper class="screen-swiper" style="height: 260rpx;" :circular="true" :autoplay="true"
duration="800">
<swiper-item v-for="(item,index) in item.image" :key="index"
@click="saveImg(item.image,index)">
<image :src="item" mode="aspectFit" class="radius"></image>
</swiper-item>
</swiper>
</view>
<view style="padding: 20rpx 30rpx;">
<view>投诉类型{{item.typeName}}</view>
<view class="list-title" style="color: #333;margin-top: 10upx;" v-if="item.title">投诉标题{{ item.title }}</view>
<view class="list-title" style="color: #333;margin-top: 10upx;" v-if="item.content">投诉内容{{ item.content }}</view>
<view class="list-title" style="margin-top: 10upx;color: #333;" v-if="item.byUserName">
被投诉人{{ item.byUserName }}</view>
<view style="display: flex;justify-content: space-between;margin-top: 10rpx;">
<view>
<text style="color: #333;" v-if="item.createAt">投诉时间{{ item.createAt }}</text>
</view>
</view>
<view class="list-title" style="margin-top: 10upx;color: #ff3437" >
处理结果{{ item.auditContent?item.auditContent:'正在处理中' }}
</view>
</view>
</view>
</view>
<empty v-if="dataList.length === 0" des="暂无记录" show="false"></empty>
</view>
</view>
</template>
<script>
import empty from '../../components/empty.vue'
export default {
components: {
empty
},
data() {
return {
page: 1,
limit: 10,
count: 0,
dataList: []
}
},
onLoad() {
this.tousuList()
},
onShow() {
},
methods: {
copyClick(copy) {
uni.setClipboardData({
data: copy,
success: function(res) {
uni.getClipboardData({
success: function(res) {
uni.showToast({
title: "复制成功",
icon: 'none',
});
},
});
},
});
},
//
saveImg(imgs, index) {
if (this.LBSelect) {
if (index == this.LBIndex - 1) {
return;
}
}
// console.log(imgs)
let that = this;
let imgArr = imgs
// imgArr.push(imgs);
// //
uni.previewImage({
urls: imgArr,
current: imgArr[index]
});
},
// get page limit state 3
tousuList() {
let data = {
page: this.page,
limit: this.limit,
state: 7
}
this.$Request.get('/app/message/selectMessageByUserId', data).then(res => {
if (res.code == 0) {
if (this.page == 1) {
this.dataList = res.data.list
for (let i = 0; i < this.dataList.length; i++) {
if (this.dataList[i].image) {
this.dataList[i].image = this.dataList[i].image.split(",");
}
}
} else {
this.dataList = [...this.dataList, ...res.data.list]
for (let i = 0; i < this.dataList.length; i++) {
if (this.dataList[i].image) {
this.dataList[i].image = this.dataList[i].image.split(",");
}
}
}
this.count = res.data.totalCount
}
})
}
},
onReachBottom: function() {
if (this.count == this.dataList.length) {
uni.showToast({
title: '已经到底了',
icon: 'none'
})
return
} else {
this.page = this.page + 1;
this.tousuList()
}
},
onPullDownRefresh: function() {
this.page = 1;
this.tousuList()
},
}
</script>
<style>
page {
background-color: #F7F7F7;
}
.bg {
background: #FFFFFF;
}
.list-item {
background: #FFFFFF;
border-radius: 16rpx;
margin: 0 20rpx 20rpx 20rpx;
}
.img1 {
width: 100%;
height: 400rpx;
}
.img2 {
width: 210rpx;
height: 210rpx;
margin-top: 15rpx;
margin-right: 5rpx;
margin-left: 15rpx;
}
</style>

1290
my/feedback/tsjsForm.vue Normal file

File diff suppressed because it is too large Load Diff

View File

@ -10,6 +10,10 @@
<view class=""><image src="../../static/jdskald.png" style="width: 74rpx;height: 60rpx;" ></image></view>
<view class="text-feedback" hover-class="hover">联系客服</view>
</view>
<view class="" style="text-align: center;" @click="goHistory">
<view class=""><image src="../../static/my-cika.png" style="width: 74rpx;height: 60rpx;" ></image></view>
<view class="text-feedback" hover-class="hover">历史反馈</view>
</view>
<view class="" style="text-align: center;" @click="toFeedback">
<view class=""><image src="../../static/bbn.png" style="width: 62rpx;height: 60rpx;" ></image></view>
<view class="text-feedback" hover-class="hover">我要反馈</view>
@ -142,6 +146,14 @@
fail: () => {},
complete: () => {}
});
},
goHistory(){
uni.navigateTo({
url: '/my/help/xxhistory',
success: res => {},
fail: () => {},
complete: () => {}
});
}
}
}

161
my/help/xxhistory.vue Normal file
View File

@ -0,0 +1,161 @@
<template>
<view>
<view class="bonus-main">
<view class="list-item " v-if="dataList.length>0" :show-arrow="false" v-for="(item, index) in dataList"
:key="index">
<view class="list-item-wrap margin-top-sm">
<view class="padding-tb-sm" v-if="item.image">
<swiper class="screen-swiper" style="height: 260rpx;" :circular="true" :autoplay="true"
duration="800">
<swiper-item v-for="(item,index) in item.image" :key="index"
@click="saveImg(item.image,index)">
<image :src="item" mode="aspectFit" class="radius"></image>
</swiper-item>
</swiper>
</view>
<view style="padding: 20rpx 30rpx;">
<view class="list-title" style="color: #333;margin-top: 10upx;" v-if="item.content">反馈时间{{ item.createAt }}</view>
<view class="list-title" style="color: #333;margin-top: 10upx;" v-if="item.content">反馈内容{{ item.content }}</view>
<view class="list-title" style="color: #333;margin-top: 10upx;" v-if="item.content">联系方式{{ item.title }}</view>
</view>
</view>
</view>
<empty v-if="dataList.length === 0" des="暂无记录" show="false"></empty>
</view>
</view>
</template>
<script>
import empty from '../../components/empty.vue'
export default {
components: {
empty
},
data() {
return {
page: 1,
limit: 10,
count: 0,
dataList: []
}
},
onLoad() {
this.tousuList()
},
onShow() {
},
methods: {
copyClick(copy) {
uni.setClipboardData({
data: copy,
success: function(res) {
uni.getClipboardData({
success: function(res) {
uni.showToast({
title: "复制成功",
icon: 'none',
});
},
});
},
});
},
//
saveImg(imgs, index) {
if (this.LBSelect) {
if (index == this.LBIndex - 1) {
return;
}
}
// console.log(imgs)
let that = this;
let imgArr = imgs
// imgArr.push(imgs);
// //
uni.previewImage({
urls: imgArr,
current: imgArr[index]
});
},
// get page limit state 3
tousuList() {
let data = {
page: this.page,
limit: this.limit,
state: 2
}
this.$Request.get('/app/message/selectMessageByUserId', data).then(res => {
if (res.code == 0) {
if (this.page == 1) {
this.dataList = res.data.list
for (let i = 0; i < this.dataList.length; i++) {
if (this.dataList[i].image) {
this.dataList[i].image = this.dataList[i].image.split(",");
}
}
} else {
this.dataList = [...this.dataList, ...res.data.list]
for (let i = 0; i < this.dataList.length; i++) {
if (this.dataList[i].image) {
this.dataList[i].image = this.dataList[i].image.split(",");
}
}
}
this.count = res.data.totalCount
}
})
}
},
onReachBottom: function() {
if (this.count == this.dataList.length) {
uni.showToast({
title: '已经到底了',
icon: 'none'
})
return
} else {
this.page = this.page + 1;
this.tousuList()
}
},
onPullDownRefresh: function() {
this.page = 1;
this.tousuList()
},
}
</script>
<style>
page {
background-color: #F7F7F7;
}
.bg {
background: #FFFFFF;
}
.list-item {
background: #FFFFFF;
border-radius: 16rpx;
margin: 0 20rpx 20rpx 20rpx;
}
.img1 {
width: 100%;
height: 400rpx;
}
.img2 {
width: 210rpx;
height: 210rpx;
margin-top: 15rpx;
margin-right: 5rpx;
margin-left: 15rpx;
}
</style>

View File

@ -1114,6 +1114,16 @@
"titleNView": false
}
}
},{
"path": "help/xxhistory",
"style": {
"navigationBarTitleText": "历史反馈",
"enablePullDownRefresh": false,
"navigationStyle": "custom",
"app-plus": {
"titleNView": false
}
}
},{
"path": "order/payModifyPt",
"style": {
@ -1667,6 +1677,26 @@
}
}
},
{
"path": "feedback/feedbackMenu",
"style": {
"navigationBarTitleText": "我要投诉",
"navigationStyle": "custom",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "feedback/tsjsForm",
"style": {
"navigationBarTitleText": "投诉技师",
"navigationStyle": "custom",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "feedback/index",
"style": {
@ -1677,6 +1707,26 @@
}
}
},
{
"path": "feedback/indexts",
"style": {
"navigationBarTitleText": "投诉平台",
"navigationStyle": "custom",
"app-plus": {
"titleNView": false
}
}
},
{
"path" : "feedback/tshistory",
"style": {
"navigationBarTitleText": "历史投诉",
"navigationStyle": "custom",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "setting/help",
"style": {

View File

@ -207,7 +207,7 @@
<image style="padding: 3rpx;" src="../../static/my-gong-9.png" mode=""></image>
<span class="my-use-list-text">我的团队</span>
</view> -->
<view class="my-use-list" @click="useToUrl('/my/feedback/index')">
<view class="my-use-list" @click="useToUrl('/my/feedback/feedbackMenu')">
<image style="padding: 3rpx;" src="../../static/shezhi4.png" mode=""></image>
<span class="my-use-list-text">我要投诉</span>
</view>