|
@@ -5,38 +5,96 @@
|
|
|
<view class="header-title" :style="{height:menuButtonH+'px',lineHeight:menuButtonH+'px'}">投诉反馈</view>
|
|
|
</view>
|
|
|
<view class="container" :style="{paddingTop: `calc(88rpx + ${statusBarHeight}px)`}">
|
|
|
- <view class="list-item title">{{pageIndex==0 ? '请选择反馈类型':'请选择'}}</view>
|
|
|
- <view class="list-item" v-for="(item, index) in feedbackItems" :key="index" @click="handleClick(item,index)">
|
|
|
- {{ item.complaintTypeName }}
|
|
|
+ <view class="formbox" v-if="isLastChild==1">
|
|
|
+ <view class="formbox-title">{{ text }}</view>
|
|
|
+ <view class="form">
|
|
|
+ <u-form labelPosition="top" labelWidth='auto' :model="formdata" :rules="rules" ref="uForm" errorType="toast">
|
|
|
+ <u-form-item label="" prop="complaintContent">
|
|
|
+ <u--textarea v-model="formdata.complaintContent" border="none" :clearable="true" placeholder="请填写反馈内容" count maxlength='200'></u--textarea>
|
|
|
+ </u-form-item>
|
|
|
+ <view class="box">
|
|
|
+ <u-form-item label="图片(最多9张)">
|
|
|
+ <view class="imgitem">
|
|
|
+ <u-upload
|
|
|
+ :fileList="fileList1"
|
|
|
+ @afterRead="afterRead"
|
|
|
+ @delete="deletePic"
|
|
|
+ name="1"
|
|
|
+ :maxCount="9"
|
|
|
+ ></u-upload>
|
|
|
+ </view>
|
|
|
+ </u-form-item>
|
|
|
+ </view>
|
|
|
+ </u-form>
|
|
|
+ </view>
|
|
|
+ <view class="footer-btn">
|
|
|
+ <button class="submit-btn" @click="submit">提交</button>
|
|
|
+ <!-- <button class="submit-btn back-btn" @click="goBack">返回</button> -->
|
|
|
+ </view>
|
|
|
</view>
|
|
|
- <view class="list-item" @click="goBack">
|
|
|
- 返回上一层
|
|
|
+ <view class="container" v-else>
|
|
|
+ <view class="list-item title">请选择反馈类型</view>
|
|
|
+ <view class="list-item" v-for="(item, index) in feedbackItems" :key="index"
|
|
|
+ @click="handleClick(item,index)">
|
|
|
+ <view>{{ item.complaintTypeName }}</view>
|
|
|
+ <uni-icons type="right" size="20" color="rgba(0,0,0,.3)" v-if="isLastChild==0"></uni-icons>
|
|
|
+ </view>
|
|
|
+ <view class="list-item" v-if="pageIndex!=0&&isLastChild==0" @click="goBack">
|
|
|
+ 返回上一层
|
|
|
+ </view>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
- import{ getTypeTree, complaintRecord } from "@/api/course.js"
|
|
|
+ import{ getTypeTree, complaintRecord,loginByMp } from "@/api/course.js"
|
|
|
export default {
|
|
|
data() {
|
|
|
return {
|
|
|
statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
|
|
|
menuButtonH: 45,
|
|
|
pageIndex: 0,
|
|
|
- list:[],
|
|
|
+ list: [],
|
|
|
feedbackItems: [],
|
|
|
- userId:'',
|
|
|
+ userId: '',
|
|
|
courseId: '',
|
|
|
- videoId:''
|
|
|
+ videoId: '',
|
|
|
+ formdata: {
|
|
|
+ complaintContent: ""
|
|
|
+ },
|
|
|
+ rules: {
|
|
|
+ complaintContent:[{
|
|
|
+ required: true,
|
|
|
+ message: '投诉反馈内容不能为空',
|
|
|
+ trigger: ["change", "blur"]
|
|
|
+ }]
|
|
|
+ },
|
|
|
+ text: '',
|
|
|
+ templateId: 0,
|
|
|
+ user: {},
|
|
|
+ isLastChild: 0,
|
|
|
+ isLogin: false,
|
|
|
+ fileList1: [],
|
|
|
};
|
|
|
},
|
|
|
onLoad(option) {
|
|
|
this.userId = option.userId || ''
|
|
|
this.courseId = option.courseId || ''
|
|
|
this.videoId = option.videoId || ''
|
|
|
- this.getMenuButton()
|
|
|
- this.getList()
|
|
|
+ this.$isLoginCourse().then(
|
|
|
+ res => {
|
|
|
+ if(res){
|
|
|
+ this.isLogin = true
|
|
|
+ this.getMenuButton()
|
|
|
+ this.getList()
|
|
|
+ } else{
|
|
|
+ this.isLogin = false
|
|
|
+ this.goLogin()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ rej => {}
|
|
|
+ );
|
|
|
},
|
|
|
methods: {
|
|
|
getMenuButton(){
|
|
@@ -45,32 +103,83 @@
|
|
|
},
|
|
|
goBack() {
|
|
|
// 返回上一层逻辑
|
|
|
- if(this.pageIndex == 0){
|
|
|
+ if (this.pageIndex == 0) {
|
|
|
uni.navigateBack();
|
|
|
- }else {
|
|
|
- this.pageIndex = 0
|
|
|
- this.feedbackItems = this.list
|
|
|
+ } else {
|
|
|
+ this.pageIndex--;
|
|
|
+ this.formdata = {
|
|
|
+ complaintContent: ""
|
|
|
+ }
|
|
|
+ if (this.isLastChild == 1) {
|
|
|
+ this.isLastChild = 0
|
|
|
+ } else {
|
|
|
+ if (this.pageIndex == 0) {
|
|
|
+ this.feedbackItems = this.list
|
|
|
+ this.templateId = 0
|
|
|
+ } else {
|
|
|
+ const list = this.findGrandparentOrAllData(this.list, this.templateId)
|
|
|
+ this.feedbackItems = list.childrenType
|
|
|
+ this.templateId = list.complaintTypeId
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ },
|
|
|
+ findGrandparentOrAllData(data, targetId) {
|
|
|
+ // 递归函数,用于查找目标节点的父级节点
|
|
|
+ function findParent(node, targetId) {
|
|
|
+ if (!node || !node.childrenType) return null;
|
|
|
+
|
|
|
+ for (let child of node.childrenType) {
|
|
|
+ if (child.complaintTypeId === targetId) {
|
|
|
+ return node; // 找到目标节点的父级节点
|
|
|
+ }
|
|
|
+
|
|
|
+ const result = findParent(child, targetId); // 递归查找子节点
|
|
|
+ if (result) return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
}
|
|
|
+
|
|
|
+ // 遍历顶层节点,查找目标节点的父级和祖父级节点
|
|
|
+ for (let root of data) {
|
|
|
+ if (root.complaintTypeId === targetId) {
|
|
|
+ return data; // 如果目标节点是顶层节点,返回所有数据
|
|
|
+ }
|
|
|
+
|
|
|
+ const parent = findParent(root, targetId); // 查找目标节点的父级节点
|
|
|
+ if (parent) {
|
|
|
+ const grandparent = findParent(root, parent.complaintTypeId); // 查找父级节点的父级节点
|
|
|
+ return grandparent || data; // 如果找到祖父节点返回祖父节点,否则返回所有数据
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return data; // 如果没有找到目标节点,返回所有数据
|
|
|
},
|
|
|
handleClick(item,index) {
|
|
|
- if(this.pageIndex ==0) {
|
|
|
- this.feedbackItems = this.list[index].childrenType || [];
|
|
|
- this.pageIndex = 1;
|
|
|
- } else if(this.pageIndex ==1){
|
|
|
- const param = {
|
|
|
- userId: this.userId,
|
|
|
- complaintTypeId: item.complaintTypeId,
|
|
|
- complaintContent: item.complaintContent,
|
|
|
- courseId: this.courseId,
|
|
|
- videoId: this.videoId,
|
|
|
+ if (this.isLastChild == 1) return
|
|
|
+ if (this.pageIndex >= 0) {
|
|
|
+ this.pageIndex++
|
|
|
+ let children = this.feedbackItems[index].childrenType || [];
|
|
|
+ this.templateId = this.feedbackItems[index].complaintTypeId
|
|
|
+ this.formdata = {
|
|
|
+ complaintContent: ""
|
|
|
+ }
|
|
|
+ this.text = this.feedbackItems[index].complaintTypeName
|
|
|
+ if (children.length > 0) {
|
|
|
+ this.isLastChild = 0
|
|
|
+ this.feedbackItems = children
|
|
|
+ this.templateId = this.feedbackItems[0].complaintTypeId
|
|
|
+ } else {
|
|
|
+ this.isLastChild = 1
|
|
|
+ this.formdata = {
|
|
|
+ complaintContent: ""
|
|
|
+ }
|
|
|
+ setTimeout(() => {
|
|
|
+ this.$refs.uForm.setRules(this.rules)
|
|
|
+ }, 200)
|
|
|
}
|
|
|
- complaintRecord(param).then(res=>{
|
|
|
- uni.showModal({
|
|
|
- title: '',
|
|
|
- content: '我们已收到您的反馈,谢谢',
|
|
|
- showCancel: false
|
|
|
- });
|
|
|
- })
|
|
|
}
|
|
|
},
|
|
|
getList(){
|
|
@@ -81,12 +190,172 @@
|
|
|
this.feedbackItems = this.list
|
|
|
}
|
|
|
})
|
|
|
- }
|
|
|
+ },
|
|
|
+ submit() {
|
|
|
+ if(this.fileList1.some(item=>item.status == 'uploading')) {
|
|
|
+ uni.showToast({
|
|
|
+ title: '等待图片上传中',
|
|
|
+ icon: 'none'
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var images=[];
|
|
|
+ this.fileList1.forEach(function(element) {
|
|
|
+ images.push(element.url)
|
|
|
+ });
|
|
|
+ this.$refs.uForm.validate().then(res => {
|
|
|
+ if (res) {
|
|
|
+ const param = {
|
|
|
+ userId: this.userId,
|
|
|
+ complaintTypeId: this.templateId,
|
|
|
+ complaintContent: this.formdata.complaintContent,
|
|
|
+ courseId: this.courseId,
|
|
|
+ videoId: this.videoId,
|
|
|
+ complaintUrl: images.toString()
|
|
|
+ }
|
|
|
+ complaintRecord(param).then(res=>{
|
|
|
+ uni.showModal({
|
|
|
+ title: '',
|
|
|
+ content: '我们已收到您的反馈,谢谢',
|
|
|
+ showCancel: false
|
|
|
+ });
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ deletePic(event) {
|
|
|
+ this[`fileList${event.name}`].splice(event.index, 1)
|
|
|
+ },
|
|
|
+ async afterRead(event) {
|
|
|
+ // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
|
|
|
+ let lists = [].concat(event.file)
|
|
|
+ let fileListLen = this[`fileList${event.name}`].length
|
|
|
+ lists.map((item) => {
|
|
|
+ this[`fileList${event.name}`].push({
|
|
|
+ ...item,
|
|
|
+ status: 'uploading',
|
|
|
+ message: '上传中'
|
|
|
+ })
|
|
|
+ })
|
|
|
+ for (let i = 0; i < lists.length; i++) {
|
|
|
+ const result = await this.uploadFilePromise(lists[i].url)
|
|
|
+ let item = this[`fileList${event.name}`][fileListLen]
|
|
|
+ this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
|
|
|
+ status: 'success',
|
|
|
+ message: '',
|
|
|
+ url: result
|
|
|
+ }))
|
|
|
+ fileListLen++
|
|
|
+ }
|
|
|
+ },
|
|
|
+ uploadFilePromise(url) {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ let a = uni.uploadFile({
|
|
|
+ url: 'https://h5api.his.cdwjyyh.com/app/common/uploadOSS', // 仅为示例,非真实的接口地址
|
|
|
+ filePath: url,
|
|
|
+ name: 'file',
|
|
|
+ success: (res) => {
|
|
|
+ setTimeout(() => {
|
|
|
+ console.log(JSON.parse(res.data).url)
|
|
|
+ resolve(JSON.parse(res.data).url)
|
|
|
+ }, 1000)
|
|
|
+ }
|
|
|
+ });
|
|
|
+ })
|
|
|
+ },
|
|
|
+ goLogin() {
|
|
|
+ this.$getProvider().then(provider=>{
|
|
|
+ console.log('当前的环境商',provider)
|
|
|
+ if (!provider) {
|
|
|
+ reject()
|
|
|
+ }
|
|
|
+ uni.login({
|
|
|
+ provider: provider,
|
|
|
+ success: async loginRes => {
|
|
|
+ console.log(loginRes)
|
|
|
+ uni.getUserInfo({
|
|
|
+ provider: provider,
|
|
|
+ success: (infoRes)=> {
|
|
|
+ uni.showToast({
|
|
|
+ title: '处理中...',
|
|
|
+ icon: 'loading'
|
|
|
+ });
|
|
|
+ loginByMp({code: loginRes.code,encryptedData:infoRes.encryptedData,iv:infoRes.iv}).then(res=>{
|
|
|
+ uni.hideLoading();
|
|
|
+ if (res.code == 200) {
|
|
|
+ uni.setStorageSync('AppTokenmini_RTCourse', res.token);
|
|
|
+ uni.setStorageSync('userInfo', JSON.stringify(res.user));
|
|
|
+ this.userId = res.user.userId || ''
|
|
|
+ this.isLogin = true
|
|
|
+ this.getMenuButton()
|
|
|
+ this.getList()
|
|
|
+ } else {
|
|
|
+ uni.showToast({
|
|
|
+ title: res.msg,
|
|
|
+ icon: 'none'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }).catch(err=>{
|
|
|
+ uni.hideLoading();
|
|
|
+ uni.showToast({
|
|
|
+ icon:'none',
|
|
|
+ title: "登录失败,请重新登录",
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }).catch(err => {})
|
|
|
+ },
|
|
|
}
|
|
|
};
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
+ .container {
|
|
|
+ background-color: #fff;
|
|
|
+ }
|
|
|
+ .formbox-title {
|
|
|
+ padding-bottom: 30rpx;
|
|
|
+ border-bottom: 1px solid #f4f4f4;
|
|
|
+ }
|
|
|
+ .formbox {
|
|
|
+ border-top: 1px solid #f4f4f4;
|
|
|
+ padding: 30rpx;
|
|
|
+ }
|
|
|
+ .box {
|
|
|
+ padding-bottom: 24rpx;
|
|
|
+ border-top: 1px solid #f4f4f4;
|
|
|
+ .imgitem {
|
|
|
+ padding-top: 20rpx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .footer-btn {
|
|
|
+ margin-top: 50rpx;
|
|
|
+ }
|
|
|
+ .submit-btn {
|
|
|
+ width: 50%;
|
|
|
+ height: 88rpx;
|
|
|
+ line-height: 88rpx;
|
|
|
+ text-align: center;
|
|
|
+ font-size: 30rpx;
|
|
|
+ font-family: PingFang SC;
|
|
|
+ color: #FFFFFF;
|
|
|
+ background: rgb(0,178,106);
|
|
|
+ border-radius: 16rpx;
|
|
|
+ border: 1rpx solid ;
|
|
|
+ margin-bottom: 30rpx;
|
|
|
+ &::after {
|
|
|
+ border: none;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .back-btn {
|
|
|
+ color: #bbb;
|
|
|
+ background: transparent;
|
|
|
+ border-radius: 16rpx;
|
|
|
+ border: 1rpx solid #999;
|
|
|
+ }
|
|
|
.header-nav {
|
|
|
height: 88rpx;
|
|
|
display: flex;
|