|
|
@@ -0,0 +1,371 @@
|
|
|
+<template>
|
|
|
+ <view>
|
|
|
+ <view class="title">请选择投诉原因</view>
|
|
|
+ <view class="list">
|
|
|
+ <view class="item">
|
|
|
+ <view>{{item}}</view>
|
|
|
+ <image class="w30 h30" src="/static/images/arrow_gray.png"></image>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+ import { mapGetters } from 'vuex';
|
|
|
+ // complaintRecord
|
|
|
+ import{ getTypeTree,loginByMp } from "@/api/course.js"
|
|
|
+ export default {
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
|
|
|
+ menuButtonH: 45,
|
|
|
+ pageIndex: 0,
|
|
|
+ list: [],
|
|
|
+ feedbackItems: [],
|
|
|
+ userId: '',
|
|
|
+ // courseId: '',
|
|
|
+ // videoId: '',
|
|
|
+ formdata: {
|
|
|
+ complaintContent: ""
|
|
|
+ },
|
|
|
+ rules: {
|
|
|
+ complaintContent:[{
|
|
|
+ required: true,
|
|
|
+ message: '投诉反馈内容不能为空',
|
|
|
+ trigger: ["change", "blur"]
|
|
|
+ }]
|
|
|
+ },
|
|
|
+ text: '',
|
|
|
+ templateId: 0,
|
|
|
+ user: {},
|
|
|
+ isLastChild: 0,
|
|
|
+ isLogin: false,
|
|
|
+ fileList1: [],
|
|
|
+ // projectCode:'',
|
|
|
+ code:''
|
|
|
+ };
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ ...mapGetters(['coureLogin']),
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ coureLogin: {
|
|
|
+ immediate: true, // 页面一进入就检查一次
|
|
|
+ handler(val) {
|
|
|
+ if (val == 2) {
|
|
|
+ console.log("AppToken失效,请重新登录")
|
|
|
+ this.isLogin = false
|
|
|
+ this.goLogin()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onLoad(option) {
|
|
|
+ this.userId = option.userId || ''
|
|
|
+ // this.courseId = option.courseId || ''
|
|
|
+ // this.videoId = option.videoId || ''
|
|
|
+ // this.projectCode = option.projectCode || ''
|
|
|
+ uni.$on('usercode',(data)=>{
|
|
|
+ if(data) {
|
|
|
+ this.code=data.code
|
|
|
+ this.goLogin(data)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ // this.utils.getDomain({projectCode:this.projectCode}).then(res=>{
|
|
|
+ // if(res.code == 200) {
|
|
|
+ // uni.setStorageSync('addressUrl',res.addressUrl)
|
|
|
+ // this.utils.isLoginCourseAuto().then(
|
|
|
+ // res => {
|
|
|
+ // if(res){
|
|
|
+ // this.isLogin = true
|
|
|
+ // this.getMenuButton()
|
|
|
+ // this.getList()
|
|
|
+ // } else{
|
|
|
+ // this.isLogin = false
|
|
|
+ // this.goLogin()
|
|
|
+ // }
|
|
|
+ // },
|
|
|
+ // rej => {}
|
|
|
+ // );
|
|
|
+ // }
|
|
|
+ // })
|
|
|
+ },
|
|
|
+ onUnload() {
|
|
|
+ uni.$off('usercode')
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ getMenuButton(){
|
|
|
+ const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
|
|
|
+ this.menuButtonH = menuButtonInfo.height
|
|
|
+ },
|
|
|
+ goBack() {
|
|
|
+ // 返回上一层逻辑
|
|
|
+ if (this.pageIndex == 0) {
|
|
|
+ uni.navigateBack();
|
|
|
+ } 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.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)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ getList(){
|
|
|
+ getTypeTree().then(res=>{
|
|
|
+ if(res.code == 200) {
|
|
|
+ this.list = res.data
|
|
|
+ this.pageIndex = 0
|
|
|
+ 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) {
|
|
|
+ uni.showModal({
|
|
|
+ title: '',
|
|
|
+ content: '我们已收到您的反馈,谢谢',
|
|
|
+ showCancel: false,
|
|
|
+ success: function (res) {
|
|
|
+ if (res.confirm) {
|
|
|
+ uni.navigateBack()
|
|
|
+ } else if (res.cancel) {
|
|
|
+ uni.navigateBack()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ 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) {
|
|
|
+ const projectCode = uni.getStorageSync('projectCode')
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ let a = uni.uploadFile({
|
|
|
+ url: uni.getStorageSync('addressUrl_'+projectCode)+ '/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(data) {
|
|
|
+ if(!this.projectCode){
|
|
|
+ uni.showToast({
|
|
|
+ title: '链接有误',
|
|
|
+ icon: 'none'
|
|
|
+ });
|
|
|
+ return
|
|
|
+ }
|
|
|
+ this.loginFsUserWx(data)
|
|
|
+ return
|
|
|
+ this.utils.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,appId:getApp().globalData.appId}).then(res=>{
|
|
|
+ uni.hideLoading();
|
|
|
+ if (res.code == 200) {
|
|
|
+ this.$store.commit('setCoureLogin', 1);
|
|
|
+ uni.setStorageSync(this.utils.TOKEN_KEYAuto, res.token);
|
|
|
+ uni.setStorageSync('auto_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 => {})
|
|
|
+ },
|
|
|
+ // H5授权绑定关系
|
|
|
+ async loginFsUserWx(data){
|
|
|
+ if(data){
|
|
|
+ let token = uni.getStorageSync('TOKEN_WEXIN');
|
|
|
+ let user = uni.getStorageSync('userInfo')
|
|
|
+
|
|
|
+ uni.setStorageSync(this.utils.TOKEN_KEYAuto, token);
|
|
|
+ uni.setStorageSync('auto_userInfo', JSON.stringify(user));
|
|
|
+ this.userId = user.userId || ''
|
|
|
+ this.isLogin = true
|
|
|
+ this.getMenuButton()
|
|
|
+ this.getList()
|
|
|
+ }else{
|
|
|
+ uni.setStorageSync('H5course',{
|
|
|
+ companyId: this.urlOption.companyId,
|
|
|
+ companyUserId:this.urlOption.companyUserId,
|
|
|
+ type: 1, //1自动,其他手动
|
|
|
+ })
|
|
|
+ uni.showLoading({ title: '加载中' });
|
|
|
+
|
|
|
+ try {
|
|
|
+ await this.utils.getDomain({ projectCode: this.projectCode}); // code 换成你的业务标识
|
|
|
+ await this.utils.getConfigKey();
|
|
|
+ uni.navigateTo({
|
|
|
+ url:'/pages_course/webview?H5course='+uni.getStorageSync('H5course')
|
|
|
+ })
|
|
|
+ } catch (err) {
|
|
|
+ console.error('初始化失败', err);
|
|
|
+ uni.showToast({ title: '请求失败', icon: 'none' });
|
|
|
+ } finally {
|
|
|
+ uni.hideLoading();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped lang="scss">
|
|
|
+
|
|
|
+
|
|
|
+ .title {
|
|
|
+text-align: center;
|
|
|
+font-size: 40rpx;
|
|
|
+font-weight: 500;
|
|
|
+ }
|
|
|
+ .list{
|
|
|
+ padding: 24rpx;
|
|
|
+ .item{
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ }
|
|
|
+ }
|
|
|
+</style>
|