guojy 1 yıl önce
ebeveyn
işleme
e74b3b1ac2

+ 2 - 2
src/main.js

@@ -23,7 +23,7 @@ import axiosUser from '@/utils/axiosUser'
 import axiosKc from '@/utils/axiosKc'
 import 'shepherd.js/dist/css/shepherd.css';
 
-import { Tabbar, Empty, TabbarItem, ShareSheet, Loading, Divider, Grid, GridItem, Form, Field, NavBar, Row, Col, List, Picker, Cell, CellGroup, Toast, Popup, Dialog, RadioGroup, Radio, Notify, Button, Icon, Tab, Tabs } from 'vant'
+import { Tabbar, Empty, TabbarItem, ShareSheet, Loading, Divider, Overlay,Grid, GridItem, Form, Field, NavBar, Row, Col, List, Picker, Cell, CellGroup, Toast, Popup, Dialog, RadioGroup, Radio, Notify, Button, Icon, Tab, Tabs } from 'vant'
 import { getWxToken, setWxToken, getIsIdentity, supremeAuthority, getIsWx, getTypes, getTypesName, getUserData, getEmployeeMap, getCache, setCache, removeCache, returnDeptName, getEmployeeMapItem, returnFh } from '@/utils/auth'
 Vue.prototype.$echarts = echarts
 Vue.prototype.$moment = moment
@@ -57,7 +57,7 @@ Vue.use(VueScroller)
 Vue.component('icon', icon)
 Vue.component('noData', noData)
 Vue.component('userImage', userImage)
-Vue.use(Button).use(Tabbar).use(TabbarItem).use(ShareSheet).use(Grid).use(Loading).use(Divider).use(GridItem).use(Picker).use(Form).use(Field).use(List).use(Tabs).use(Tab).use(NavBar).use(Row).use(Col).use(Cell).use(CellGroup).use(Toast).use(Popup).use(Dialog).use(RadioGroup).use(Radio).use(Icon).use(Notify).use(Empty)
+Vue.use(Button).use(Tabbar).use(TabbarItem).use(ShareSheet).use(Grid).use(Overlay).use(Loading).use(Divider).use(GridItem).use(Picker).use(Form).use(Field).use(List).use(Tabs).use(Tab).use(NavBar).use(Row).use(Col).use(Cell).use(CellGroup).use(Toast).use(Popup).use(Dialog).use(RadioGroup).use(Radio).use(Icon).use(Notify).use(Empty)
 
 Vue.prototype.$route_back = function (setp) {
   if (typeof (setp) == 'undefined') {

+ 0 - 7
src/router/course.js

@@ -56,13 +56,6 @@
       label: '课程名额交易',
       need_login: true,
     },
-    {
-      path: '/course/limitChange/:id',
-      name: 'assignLimitChange',
-      component: () => import('@/view/course/deal/courseLimitRecord'),
-      label: '课程名额变动',
-      need_login: true,
-    },
     {
       path: '/course/transfer/:id',
       name: 'transfer',

+ 4 - 29
src/view/course/components/CourseTeam.vue

@@ -23,7 +23,7 @@
         <div class="flex-r">
           <div class="flex-tel">
             <p>{{ item.name }}</p>
-            <span>手机:{{ item.mobile }}</span>
+            <span v-if="item.mobile != ''">手机:{{ item.mobile }}</span>
           </div>
           <div class="flex-deal" @click="otDealPage(item)">交易</div>
         </div>
@@ -77,34 +77,6 @@ export default {
     },
     //初始化
     init() {
-      let data = {
-        count: 10,
-        list: [
-          {
-            img_url: "../../../assets/course.jpg",
-            name: "张三",
-            tel: "16844554155",
-            id: 123
-          },
-          {
-            img_url: "../../../assets/course.jpg",
-            name: "李四",
-            tel: "16844554155",
-            id: 123
-          },
-          {
-            img_url: "../../../assets/course.jpg",
-            name: "王五",
-            tel: "16844554155",
-            id: 123
-          }
-        ]
-      };
-      if (this.teamType == 2) {
-        data.list[0].name = "李白";
-      }
-      this.teamData.count = data.count;
-      this.teamData.list = data.list;
     },
     //人员搜索
     onSearch() {
@@ -169,4 +141,7 @@ export default {
       }
     }
 }
+/deep/ .van-search .van-cell{
+  padding: 0.1rem 0.16rem 0.1rem 0.16rem;
+}
 </style>

+ 54 - 79
src/view/course/components/courseList.vue

@@ -1,11 +1,5 @@
 <template>
   <div class="listOuer">
-    <div class="listTit" v-if="fixedTitle" :style="{ background: outBg }">
-      <p>{{ fixedTitle }}</p>
-      <span v-if="showNum == 1 && fixedTitle" @click="toMoreUrl"
-        >课程变动明细</span
-      >
-    </div>
     <div class="listInner">
       <template v-if="dataList.length > 0">
         <div
@@ -15,7 +9,11 @@
           :class="{ marginGap: listType == 2 }"
           :style="{ background: outBg }"
         >
-          <div class="listLiTit" v-if="item.toUserId&&listType==2">
+          <div class="courseBtm" v-if="showNum == 2">
+            <p>剩余名额</p>
+            <span>{{ item.amount }}套</span>
+          </div>
+          <div class="listLiTit" v-if="item.toUserId && listType == 2">
             <p>
               {{ item.toUserId == user_info.id ? "收到" : "卖出"
               }}<span>【{{ item.dealAmount }}】套</span>课程
@@ -32,34 +30,25 @@
                 <p>{{ item.subjectName }}</p>
               </div>
               <div class="courseLiDesc">
-                <span>共{{ item.sectionsNum }}节</span>
+                <span v-if="showNum == 1">剩余{{ item.amount }}套</span>
+                <span v-else>共{{ item.sectionsNum }}节</span>
                 <span style="color: #F76146;">¥{{ item.subjectPrice }}</span>
               </div>
             </div>
           </div>
-          <div class="courseBtm" v-if="showNum == 1">
+          <!-- <div class="courseBtm" v-if="showNum == 1">
             <span>剩余名额:{{ item.amount }}套</span>
             <span>已卖出:{{ item.statistics.saleAmount }}套</span>
-          </div>
-          <div class="courseBtm showNumTwo" v-if="showNum == 2">
-            <div class="showNumTwoL">
-              <p>剩余名额</p>
-              <span>{{ item.amount }}套</span>
-            </div>
-            <div class="showNumTwoL">
-              <p>已卖出</p>
-              <span>{{ item.statistics.saleAmount }}套</span>
-            </div>
-          </div>
-          <div
+          </div> -->
+          <!-- <div
             v-if="showNum == 0 && !(item.status && item.status !== 4)"
             style="height: .2rem;"
-          ></div>
+          ></div> -->
           <div
             class="dealComfirm"
             @click="comfirm(item)"
-            v-if="item.status && item.status == 1&&listType==2"
-            :class="payClass(item)? '' : 'dealTo'"
+            v-if="item.status && item.status == 1 && listType == 2"
+            :class="payClass(item) ? '' : 'dealTo'"
           >
             <span>{{
               item.toUserId == user_info.id ? "确认接收" : "待对方确认"
@@ -68,8 +57,8 @@
         </div>
       </template>
       <template v-else>
-        <div class='noData'>
-          <van-empty description="暂无课程..." />
+        <div class="noData">
+          <van-empty :description="courseNodata" />
         </div>
       </template>
     </div>
@@ -106,11 +95,6 @@ export default {
       type: Number,
       default: 1
     },
-    //是否展示更多
-    showMore: {
-      type: Boolean,
-      default: false
-    },
     // 是否是推广的课程
     isNoAd: {
       type: Boolean,
@@ -119,47 +103,53 @@ export default {
   },
   data() {
     return {
-      user_info:JSON.parse(localStorage.getItem('wx_user_info'))
+      user_info: JSON.parse(localStorage.getItem("wx_user_info"))
     };
   },
-  computed:{
-    payClass(item){
-      return function (item) { 
-        if(item.toUserId == this.user_info.id && item.status == 1){
-          return true
+  computed: {
+    payClass(item) {
+      return function(item) {
+        if (item.toUserId == this.user_info.id && item.status == 1) {
+          return true;
         }
-        return false
-       }
-    }
+        return false;
+      };
+    },
+    courseNodata(){
+      return this.isNoAd?'暂无学习课程...':"暂无推广课程..."
+    },
   },
   created() {},
   methods: {
-    //查看名额变动明细
-    toMoreUrl() {
-      // this.$router.push(`/course/adlist`);
-      this.$router.push(`/course/limitChange`);
-    },
     // 查看课程详情
     toUrl(item) {
-      if(!item.status){
-        if (!this.isNoAd&&this.$route.path != `/courseAdDetail/${item.subjectId}`) {
-          sessionStorage.setItem('course_detail',JSON.stringify(item))
+      if (!item.status) {
+        if (
+          !this.isNoAd &&
+          this.$route.path != `/courseAdDetail/${item.subjectId}`
+        ) {
+          sessionStorage.setItem("course_detail", JSON.stringify(item));
           this.$router.push({
-            path:`/courseAdDetail/${item.subjectId}`
+            path: `/courseAdDetail/${item.subjectId}`
           });
-        } else if(this.isNoAd&&this.$route.path != `/courseDetail/${item.subjectId}`) {
+        } else if (
+          this.isNoAd &&
+          this.$route.path != `/courseDetail/${item.subjectId}`
+        ) {
           this.$router.push(`/courseDetail/${item.subjectId}`);
         }
+      }else if(item.status == 1 && this.listType == 2){
+        this.comfirm(item)
       }
     },
     // 接受名额转入
     comfirm(item) {
       this.$router.push({
-        path:`/course/transfer/${item.id}`,
-        query:item
+        path: `/course/transfer/${item.id}`,
+        query: item
       });
     }
-  },
+  }
 };
 </script>
 <style scoped lang="scss">
@@ -191,14 +181,14 @@ export default {
     }
   }
   .listInner {
-    .noData{
-      width:100%;
-      background:#FFF;
+    .noData {
+      width: 100%;
+      background: #fff;
     }
     .listLi {
       // padding-top: 0.2rem;
-      padding-bottom: 0.2rem;
-      padding: 0.2rem 0.15rem 0;
+      // padding-bottom: 0.2rem;
+      padding: 0.2rem 0.15rem;
       &:not(:nth-last-child(1)) {
         // padding-bottom: 0.2rem;
         border-bottom: 1px solid #efefef;
@@ -239,7 +229,7 @@ export default {
         justify-content: space-between;
         &.listLiTopT {
           padding: 0.2rem 0.1rem;
-          background: #efefef;
+          background: linear-gradient(90deg, #F3F2EE, #E7EFF9);
           border-radius: 0.1rem;
         }
         & > img {
@@ -282,34 +272,19 @@ export default {
         }
       }
       .courseBtm {
-        display: flex;
-        span {
-          font-size: 0.28rem;
-          color: #0075fc;
-          line-height: 2;
-          &:nth-child(1) {
-            margin-right: 0.3rem;
-          }
-        }
-        &.showNumTwo {
-          align-items: center;
-          .showNumTwoL {
-            padding: 0.1rem 0;
-            flex: 1;
-            text-align: center;
-            p {
+        padding: 0.6rem;
+        text-align: center;
+        p {
               font-size: 0.26rem;
               color: #000;
               line-height: 0.5rem;
             }
             span {
               color: #000;
-              font-size: 0.35rem;
+              font-size: 0.45rem;
               font-weight: 600;
-              line-height: 2.3;
+              line-height: 1.5;
             }
-          }
-        }
       }
     }
   }

+ 0 - 48
src/view/course/deal/courseLimitRecord.vue

@@ -1,48 +0,0 @@
-<template>
-<div>
-  <scroller ref="scroller" :on-refresh="refresh" :on-infinite="infinite" noDataText="没有了噢" :list="targetList">
-    <div class="list-box" v-for="(item,index) in targetList" :key="index">
-        <div class="flex-box border-m" style="padding: 0.2rem;" @click.stop="activeId(item,1)">
-            <div class="radio" style="top: 0.06rem;" :class="{'radio-active':selectId==item.id&&type==item.type}" v-if="showType!=2"></div>
-            <div class="flex-1">
-              <div class="flex-box">
-                <div class="clamp2 flex-1" style="margin-bottom: 5px;">{{item.name}}</div>
-                <van-icon :name="item.isShow? 'arrow-up':'arrow-down'" style="padding-left: 0.2rem;" @click.stop="item.isShow=!item.isShow"/>
-              </div>
-              <div class="flex-box-ce fontColorC" style="font-size: 0.26rem;">
-                  <span>{{item.year}}年</span>
-                  <span class="border-l-r">{{item.dateStr}}</span>
-                  <span>{{$getEmployeeMapItem(item.owner_id).name}}</span>
-              </div>
-            </div>
-        </div>
-        <template v-if="item.isShow">
-          <div class="flex-box-ce border-m" style="padding: 0.2rem;padding-left: 0.6rem;" v-for="(item2,index2) in item.krs" :key="index2" @click.stop="activeId(item2,2)">
-              <div class="radio" :class="{'radio-active':selectId==item2.id&&type==item2.type}"></div>
-              <div class="flex-1 font-flex-word" style="padding-right: 0.2rem;font-size: 0.28rem;">{{item2.name}}</div>
-          </div>
-        </template>
-    </div>
-    <noData :list="targetList" />
-  </scroller>
-</div>
-</template>
-
-<script>
-export default {
-  name: 'courseLimitRecord',
-  components: {},
-    props: [],
-  data () {
-    return {
-    }
-  },
-  created () { },
-  mounted () { },
-  methods: { },
-  computed: {}
-}
-</script>
-<style scoped lang='scss'>
-
-</style>

+ 14 - 6
src/view/course/deal/dealOrder.vue

@@ -39,11 +39,11 @@
         <div class="submit">
           <van-button
             color="#999"
-            style="padding: 0 .8rem;"
+            style="padding: 0 .8rem;border-radius: 0.15rem;"
             @click="$router.go(-1)"
             >取消</van-button
           >
-          <van-button type="primary" style="padding: 0 .8rem;" @click="comfirm"
+          <van-button style="background-color: #26A2FF;padding: 0 .8rem;color: #FFF;border-radius: 0.15rem;" @click="comfirm"
             >确认</van-button
           >
         </div>
@@ -112,9 +112,11 @@ export default {
       }
       dealCourse(this.$route.params.id,data).then(res=>{
         this.$toast.success('交易成功')
-        setTimeout(()=>{
-          this.$router.go(-1)
-        },1500)
+        this.form.id = 0;
+        this.form.number = 0;
+        this.form.content = "";
+        this.form.name = "";
+        this.$router.go(-1)
       })
     },
     comfirm(){
@@ -122,7 +124,11 @@ export default {
          title: '提示',
          message: '确认要提交当前名额交易吗?',
         }).then(() => {
-          this.postDeal();
+          if(this.form.id != 0 && this.form.number != 0){
+            this.postDeal();
+          }else{
+            this.$toast.fail('请填写正确的交易信息后提交')
+          }
         })
     },
     onInput(key) {
@@ -148,6 +154,8 @@ export default {
 </script>
 <style scoped lang="scss">
 .page {
+  background: #F3F2EE;
+  background: linear-gradient(90deg, #F3F2EE, #E7EFF9);
   .orderContent {
     .form {
       .desc {

+ 4 - 1
src/view/course/deal/limitRecord.vue

@@ -28,6 +28,7 @@
             <span>{{ item.createTime }}</span>
           </div>
         </div>
+        <noData :list="recordList" />
       </scroller>
     </div>
   </div>
@@ -101,6 +102,8 @@ img{
   display: block;
 }
 .page {
+  background: #F3F2EE;
+  background: linear-gradient(90deg, #F3F2EE, #E7EFF9);
   .recordContent {
     height: calc(100vh - 0.92rem);
     position: relative;
@@ -111,7 +114,7 @@ img{
         background: #fff;
         padding: 0 0.2rem;
         &:not(:nth-last-child(1)) {
-          border-bottom: 1px solid #999;
+          border-bottom: 1px solid #efefef;
         }
         .flex-name-num {
           display: flex;

+ 34 - 7
src/view/course/deal/transfer.vue

@@ -7,30 +7,33 @@
       @click-left="onClickLeft"
     ></van-nav-bar>
     <div class="transferTop">
+      <van-icon name="clock-o" size=".8rem" color="#26A2FF"/>
       <p>{{ transferInfo.dealAmount }}套</p>
       <span>课程名额</span>
     </div>
     <div class="transferConetent">
       <span>{{ transferInfo.name }}</span>
       <courseList :dataList="courseInfo" :showNum="3"></courseList>
-      <p>备注信息:{{ transferInfo.content }}</p>
+      <div class="content">
+        <p>交易说明</p>
+        <p>{{ transferInfo.content }}</p>
+      </div>
     </div>
     <div class="transferBtm">
       <van-button
-        style="padding:0 .5rem;"
-        type="primary"
+        style="padding:0 .5rem;border-radius: .15rem;background-color: #26A2FF;color: #FFF;"
         v-if="transferInfo.toUserId == user_info.id"
         @click="confirm"
         >确认接收</van-button
       >
       <van-button
-        style="padding:0 .5rem;background-color: #999;color:#FFF;"
-        size="large"
+        style="padding:0 .5rem;background-color: #999;color:#FFF;border-radius: .15rem;"
+        size="default"
         v-else
         >等待对方接收</van-button
       >
       <div class="transferTH">
-        <p>如一天内未确认,将自动退还对方。 <span @click="returnLimit()">{{user_info.id == transferInfo.toUserId?'立即退还':'立即撤回'}}</span></p>
+        <p>如交易名额有误,可先{{user_info.id == transferInfo.toUserId?'退还':'撤回'}}再重新交易。 <span @click="returnLimit()">{{user_info.id == transferInfo.toUserId?'立即退还':'立即撤回'}}</span></p>
       </div>
     </div>
   </div>
@@ -159,6 +162,8 @@ img {
   display: block;
 }
 .page {
+  background: #F3F2EE;
+  background: linear-gradient(90deg, #F3F2EE, #E7EFF9);
   position: relative;
   .transferTop {
     padding: 0.6rem;
@@ -173,6 +178,27 @@ img {
     }
   }
   .transferConetent {
+    .content{
+      margin: .2rem;
+      border-top: 1px solid #efefef;
+      padding-top: .1rem;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      flex-wrap: wrap;
+      p{
+        font-size: .24rem;
+        color: #666;
+        line-height: .35rem;
+        width: 30%;
+        &:nth-child(2){
+          flex: 1;
+          display: flex;
+          flex-wrap: wrap;
+          flex-direction: row-reverse;
+        }
+      }
+    }
     .listOuer {
       padding: 0 0 0.1rem;
       background-color: #fff;
@@ -194,7 +220,8 @@ img {
     display: flex;
     flex-wrap: wrap;
     justify-content: center;
-    padding-top: 0.7rem;
+    position: absolute;
+    bottom: 8%;
     .transferTH {
       margin-top: 0.7rem;
       width: 100%;

+ 12 - 3
src/view/course/error.vue

@@ -1,6 +1,12 @@
 <template>
 <div>
-    <van-empty image="network" description="请求失败了呢" />
+  <van-nav-bar
+      title="网络错误"
+      left-text="返回"
+      left-arrow
+      @click-left="onClickLeft"
+    ></van-nav-bar>
+    <van-empty style="position: relative;left: 0;top: 50%;transform: translateY(-50%);" image="network" description="请求失败了呢" />
 </div>
 </template>
 
@@ -14,8 +20,11 @@ export default {
     }
   },
   created () { },
-  mounted () { },
-  methods: { },
+  methods: { 
+    onClickLeft(){
+      this.$router.replace('/courseHome')
+    }
+   },
   computed: {}
 }
 </script>

+ 174 - 79
src/view/course/home.vue

@@ -54,21 +54,32 @@
         </div>
       </div>
     </div>
-    <van-search v-model="wxId"
-      placeholder="请输入wxid替换当前账号" 
+    <div class="user_course_tabs">
+      <div class="tbsL" v-if='user_info.marketable'>
+        <div class="tbsi" :class="{active:tbsIndex==0}" @click="selectTbs()">我的推广</div>
+        <div class="tbsi" :class="{active:tbsIndex==1}" @click="selectTbs()">我的学习</div>
+      </div>
+      <div class="tbsR" v-if='user_info.marketable' @click="toMoreUrl">
+        <span>名额变动明细</span>
+      </div>
+    </div>
+    <van-search
+      v-model="wxId"
+      placeholder="请输入wxid替换当前账号"
       show-action
+      style="margin: 0.1rem 0.2rem 0;border-radius: 0.1rem;"
       @search="changeUSer"
-      />
-    <div class="courScroll">
+    />
+    <div class="courScroll" :style="{height:user_info.marketable?'calc(100vh - 3.32rem) !important':'calc(-2.05rem + 100vh) !important'}">
       <scroller ref="scroller" :isInitRefresh="false">
-        <div class="myCourseList" v-if="user_info.marketable">
+        <div class="myCourseList" v-if="user_info.marketable&&tbsIndex==0">
           <courseList
             :dataList="courseClass.proCourse.courseList"
             :showNum="1"
             :fixedTitle="courseClass.proCourse.title"
           ></courseList>
         </div>
-        <div class="myCourseList">
+        <div class="myCourseList" v-if="tbsIndex==1">
           <courseList
             :dataList="courseClass.learnCourse.courseList"
             :fixedTitle="courseClass.learnCourse.title"
@@ -79,27 +90,27 @@
     </div>
     <van-overlay :show="qrVisible" @click="qrVisible = false">
       <div class="wrapper">
-        <div class="qrcode-wrap" ref="qrCodeUrl"></div>
+        <div class="qrContent">
+          <div class="tit">我的二维码</div>
+          <div class="qrcode-wrap" ref="qrCodeUrl"></div>
+        </div>
       </div>
     </van-overlay>
   </div>
 </template>
 
 <script>
-import Vue from "vue";
 import Clipboard from "clipboard";
 import QRCode from "qrcodejs2";
 import { getWxToken, setWxToken, openError } from "@/utils/auth";
 import { isWxEnv } from "./utils";
 import courseList from "./components/courseList.vue";
-import { Overlay } from "vant";
 import {
   getWxApiToken,
   getUSerInfo,
   getDealerCourseList,
   getUserCourseList
 } from "./api";
-Vue.use(Overlay);
 export default {
   name: "courseHome",
   components: {
@@ -107,7 +118,8 @@ export default {
   },
   data() {
     return {
-      clipboard:null,
+      tbsIndex:0,
+      clipboard: null,
       qrVisible: false,
       qrcode: null,
       qrcodeStatus: false,
@@ -128,43 +140,55 @@ export default {
       courseClass: {
         proCourse: {
           title: "我推广的课程",
-          total:0,
+          total: 0,
           courseList: []
         },
         learnCourse: {
           title: "我学习的课程",
-          total:0,
+          total: 0,
           courseList: []
         }
       },
-      wxId:'11770'
+      wxId: "11770"
     };
   },
   created() {
     this.init();
   },
-  watch:{
-    '$route'(to){
-      if(to.path == '/courseHome'){
+  watch: {
+    $route(to) {
+      if (to.path == "/courseHome") {
         this.init();
       }
     }
   },
   methods: {
-    changeUSer(){
+    selectTbs(){
+      if(this.user_info.marketable){
+        if(this.tbsIndex == 1){
+          this.tbsIndex = 0;
+        }else{
+          this.tbsIndex = 1;
+        }
+      }
+    },
+    //查看名额变动明细
+    toMoreUrl() {
+      // this.$router.push(`/course/adlist`);
+      this.$router.push(`/course/limitChange`);
+    },
+    changeUSer() {
       localStorage.clear();
-      this.getUerInfo(this.wxId)
+      this.getUerInfo(this.wxId);
     },
-    getUerInfo(wxid){
+    getUerInfo(wxid) {
       getWxApiToken(wxid).then(token => {
         getUSerInfo(token).then(res => {
-          this.user_info = JSON.parse(
-            localStorage.getItem("wx_user_info")
-          );
-          if(this.$route.query && this.$route.query.pid){
-            localStorage.setItem('pid',this.$route.query.pid)
+          this.user_info = JSON.parse(localStorage.getItem("wx_user_info"));
+          if (this.$route.query && this.$route.query.pid) {
+            localStorage.setItem("pid", this.$route.query.pid);
             this.$router.push(`/courseLogin?pid=${this.$route.query.pid}`);
-          }else if (this.user_info.marketable) {
+          } else if (this.user_info.marketable) {
             getDealerCourseList();
           }
           getUserCourseList();
@@ -173,62 +197,66 @@ export default {
     },
     //获取用户数据
     init() {
-        isWxEnv()
-          .then(() => {
-            if (getWxToken()&&localStorage.getItem('wx_user_info')) {
-              this.user_info = JSON.parse(localStorage.getItem("wx_user_info"));
-              if(this.$route.query && this.$route.query.pid){
-                localStorage.setItem('pid',this.$route.query.pid)
-                this.$router.push(`/courseLogin?pid=${this.$route.query.pid}`);
-              }else if (this.user_info.marketable) {
-                this.getDealerCourseList();
-              }
-              this.getUserCourseList();
-            } else {
-              this.getUerInfo(this.wxId)
+      isWxEnv()
+        .then(() => {
+          if (getWxToken() && localStorage.getItem("wx_user_info")) {
+            this.user_info = JSON.parse(localStorage.getItem("wx_user_info"));
+            if (this.$route.query && this.$route.query.pid) {
+              localStorage.setItem("pid", this.$route.query.pid);
+              this.$router.push(`/courseLogin?pid=${this.$route.query.pid}`);
+            } else if (this.user_info.marketable) {
+              this.getDealerCourseList();
+            } else if (!this.user_info.marketable){
+              this.tbsIndex = 1;
             }
-          })
-          .catch(err => {
-            if (getWxToken()&&localStorage.getItem('wx_user_info')) {
-              this.user_info = JSON.parse(localStorage.getItem("wx_user_info"));
-              if(this.$route.query && this.$route.query.pid){
-                localStorage.setItem('pid',this.$route.query.pid)
-                this.$router.push(`/courseLogin?pid=${this.$route.query.pid}`);
-              }else if (this.user_info.marketable) {
-                this.getDealerCourseList();
-              }
-              this.getUserCourseList();
-            } else {
-              this.getUerInfo(this.wxId)
+            this.getUserCourseList();
+          } else {
+            this.getUerInfo(this.wxId);
+          }
+        })
+        .catch(err => {
+          if (getWxToken() && localStorage.getItem("wx_user_info")) {
+            this.user_info = JSON.parse(localStorage.getItem("wx_user_info"));
+            if (this.$route.query && this.$route.query.pid) {
+              localStorage.setItem("pid", this.$route.query.pid);
+              this.$router.push(`/courseLogin?pid=${this.$route.query.pid}`);
+            } else if (this.user_info.marketable) {
+              this.getDealerCourseList();
+            } else if (!this.user_info.marketable){
+              this.tbsIndex = 1;
             }
-          });
+            this.getUserCourseList();
+          } else {
+            this.getUerInfo(this.wxId);
+          }
+        });
     },
     //获取经销推广课程列表
     getDealerCourseList(done) {
       getDealerCourseList().then(res => {
-        this.courseClass.proCourse.total = res.total
-        this.courseClass.proCourse.courseList = res.list
-        if(done) done();
+        this.courseClass.proCourse.total = res.total;
+        this.courseClass.proCourse.courseList = res.list;
+        if (done) done();
       });
     },
     //获取用户消费的课程列表
     getUserCourseList(done) {
       getUserCourseList().then(res => {
-        this.courseClass.learnCourse.total = res.total
-        let list = []
-        res.list.forEach(item=>{
+        this.courseClass.learnCourse.total = res.total;
+        let list = [];
+        res.list.forEach(item => {
           let data = {
-            subjectName:item.name,
-            subjectId:item.id,
-            subjectPrice:item.price,
-            subjectThumb:item.thumb,
-            subjectEnable:item.enable,
-            sectionsNum:item.sectionsNum
-          }
-          list.push(data)
-        })
-        this.courseClass.learnCourse.courseList = list
-        if(done) done();
+            subjectName: item.name,
+            subjectId: item.id,
+            subjectPrice: item.price,
+            subjectThumb: item.thumb,
+            subjectEnable: item.enable,
+            sectionsNum: item.sectionsNum
+          };
+          list.push(data);
+        });
+        this.courseClass.learnCourse.courseList = list;
+        if (done) done();
       });
     },
     // 打开二维码
@@ -241,11 +269,13 @@ export default {
     // 创建二维码
     creatQrCode() {
       if (!this.qrcodeStatus) {
-        console.log(`http://192.168.0.102:8088/#/courseHome?pid=${
+        console.log(
+          `http://192.168.0.102:8088/#/courseHome?pid=${
             JSON.parse(localStorage.getItem("wx_user_info")).id
-          }`)
+          }`
+        );
         this.qrcode = new QRCode(this.$refs.qrCodeUrl, {
-          text: `${window.location.href.split('#')[0]}#/courseHome?pid=${
+          text: `${window.location.href.split("#")[0]}#/courseHome?pid=${
             JSON.parse(localStorage.getItem("wx_user_info")).id
           }`, // 需要转换为二维码的内容
           width: 200,
@@ -301,7 +331,9 @@ img {
 .curPage {
   height: 100%;
   position: relative !important;
-  background-color: #eee;
+  padding-top: .4rem;
+  background: #F3F2EE;
+  background: linear-gradient(90deg, #F3F2EE, #E7EFF9);
   .userInfo {
     padding: 0.24rem 0.32rem 0.12rem;
     .userImage {
@@ -346,9 +378,10 @@ img {
     padding: 0 0.2rem;
     .tabs_content {
       padding: 0.1rem 0.2rem;
-      background-color: #fff;
       display: flex;
       border-radius: 0.1rem;
+      background: #E9F1FE;
+      background: linear-gradient(90deg, #E9F1FE, #C1D9FF);
       .tabsLi {
         flex: 1;
         text-align: center;
@@ -370,8 +403,41 @@ img {
       }
     }
   }
+  .user_course_tabs{
+    padding: .15rem .2rem 0;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    .tbsL{
+      width: 60%;
+      display: flex;
+      align-items: center;
+      .tbsi{
+        padding: 0 0.15rem;
+        border-radius: 0.25rem;
+        border: 0.02rem solid #999;
+        font-size: .24rem;
+        color: #444;
+        line-height: .4rem;
+        text-align: center;
+        margin-right: 0.2rem;
+        &.active{
+          border: 1px solid rgb(22, 132, 252);
+          background-color: rgba(38, 162, 255,.1);
+          color: rgb(22, 132, 252);
+        }
+      }
+    }
+    .tbsR{
+      span{
+        font-size: .24rem;
+        color: rgb(22, 132, 252);
+        line-height: .3rem;
+      }
+    }
+  }
   .courScroll {
-    height: calc(100vh - 2.35rem) !important;
+    height: calc(100vh - 2.75rem) !important;
     position: relative;
     .cScroll {
       height: 100%;
@@ -390,10 +456,39 @@ img {
     justify-content: center;
     align-items: center;
     height: 100vh;
-    .qrcode-wrap {
-      padding: 0.2rem;
-      background-color: #fff;
+    .qrContent{
+      width: 65%;
+      border-radius: 0.2rem;
+      overflow: hidden;
+      .tit{
+        position: relative;
+        width: 100%;
+        background-color: #FFF;
+        text-align: center;
+        font-size: .3rem;
+        color: #333;
+        line-height: .8rem;
+        border-bottom: 1px solid #efefef;
+        &::after{
+          content: "X";
+          position: absolute;
+          right: .2rem;
+          top: .2rem;
+          font-size: .3rem;
+          line-height: .3rem;
+        }
+      }
+      .qrcode-wrap {
+        padding: 0.2rem;
+        background-color: #fff;
+        text-align: center;
+        display: flex;
+        justify-content: center;
+      }
     }
   }
 }
+/deep/ .van-search .van-cell{
+  padding: 0.1rem 0.16rem 0.1rem 0.16rem;
+}
 </style>

+ 89 - 37
src/view/course/user/courseAdDeal.vue

@@ -49,6 +49,16 @@
       :aria-label="giveLink"
       class="linkCodeShare"
     />
+    <van-overlay :show="showGive" @click="showGive = false">
+      <div class="wrapper" @click.stop>
+        <div class="tit">赠送课程给好友<div class="cancle" @click="showGive = false"><van-icon name="cross" /></div></div>
+        <div class="msg">请提醒好友尽快点击链接领取课程份额。链接分享后,1小时内有效。</div>
+        <div class="copy">
+          <p><van-icon name="info-o" /> 链接分享后,1小时内有效</p>
+          <van-button style="padding: 0 1rem;border-radius: 0.4rem;" color="#26A2FF"  @click="getCourseCode">复制链接</van-button>
+        </div>
+      </div>
+    </van-overlay>
   </div>
 </template>
 <script>
@@ -70,6 +80,7 @@ export default {
       title: "课程详情",
       giveLink: "",
       noDate: false,
+      showGive:false,
       options: [
         // { name: '微信', icon: 'wechat' },
         { name: "复制链接", icon: "link" }
@@ -114,34 +125,35 @@ export default {
   methods: {
     onSelect(option) {
       if (option.name == "复制链接") {
-        this.$dialog
-          .confirm({
-            title: "提示",
-            message: "确定要生成课程分享码?"
-          })
-          .then(() => {
-            createCourseCode(this.courseDetail.subjectId).then(res => {
-              this.giveLink = `${
-                window.location.href.split("#")[0]
-              }#/courseDetail/${this.$route.params.id}?code=${res}`;
-              this.copyLink(this.giveLink);
-              // this.copyTextToClipboard(this.giveLink);
-            });
-          })
-          .catch(err => {
-            this.showShare = false;
-          });
-      }
-    },
-    async copyTextToClipboard(text) {
-      try {
-        await navigator.clipboard.writeText(text);
-        this.$toast.success("复制成功~");
+        this.showGive = true;
         this.showShare = false;
-      } catch (err) {
-        console.error("Failed to copy: ", err);
+        // this.$dialog
+        //   .confirm({
+        //     title: "赠送课程给好友",
+        //     message: "请提醒好友尽快点击链接领取课程份额。链接分享后,1小时内有效"
+        //   })
+        //   .then(() => {
+        //     this.showGive = true;
+        //     createCourseCode(this.courseDetail.subjectId).then(res => {
+        //       this.giveLink = `${
+        //         window.location.href.split("#")[0]
+        //       }#/courseDetail/${this.$route.params.id}?code=${res}`;
+        //       this.copyLink(this.giveLink);
+        //     });
+        //   })
+        //   .catch(err => {
+        //     this.showShare = false;
+        //   });
       }
     },
+    getCourseCode(){
+      createCourseCode(this.courseDetail.subjectId).then(res => {
+        this.giveLink = `${
+          window.location.href.split("#")[0]
+        }#/courseDetail/${this.$route.params.id}?code=${res}`;
+        this.copyLink(this.giveLink);
+      });
+    },
     wxShare() {
       let that = this;
       let url = window.location.href;
@@ -198,8 +210,8 @@ export default {
       let that = this;
       //这里是复制目标的类名
       let clipboard = new Clipboard(event, {
-        text: function(trigger) {
-          return trigger.getAttribute("aria-label");
+        text: function() {
+          return text;
         }
       });
       clipboard.on("success", function(e) {
@@ -224,17 +236,17 @@ export default {
       var copyResult = document.execCommand("copy");
       if (copyResult) {
         this.$toast.success("复制成功~");
-        that.showShare = false;
+        this.showGive = false;
         //移除
         document.body.removeChild(input);
       } else {
         navigator.clipboard.writeText(str);
         this.$toast.success("复制成功~");
-        that.showShare = false;
+        this.showGive = false;
       }
     },
     comfirmCode() {
-      this.showShare = true;
+      this.showGive = true;
     },
     getMoreList(done) {
       console.log("到底了");
@@ -297,8 +309,8 @@ img {
     height: calc(100vh - 0.9rem);
     position: relative;
     .record {
-      border-top: 1px solid #999;
-      border-bottom: 1px solid #999;
+      border-top: 1px solid #efefef;
+      border-bottom: 1px solid #efefef;
       & > p {
         font-size: 0.28rem;
         line-height: 0.8rem;
@@ -307,13 +319,13 @@ img {
         padding: 0 0.2rem;
       }
       .recordList {
-        border-top: 0.02rem solid #999;
+        border-top: 0.02rem solid #efefef;
         // border-bottom: 1px solid #999;
         .recordLi {
           background: #fff;
           padding: 0 0.2rem;
           &:not(:nth-last-child(1)) {
-            border-bottom: 1px solid #999;
+            border-bottom: 1px solid #efefef;
           }
           .flex-name-num {
             display: flex;
@@ -350,15 +362,55 @@ img {
     position: absolute;
     left: 0.3rem;
     bottom: 0.1rem;
-    border: 1px solid #999;
-    background-color: #fff;
+    background-color: #26A2FF;
     display: flex;
     align-items: center;
     justify-content: center;
-    border-radius: 0.1rem;
+    border-radius: 0.15rem;
     span {
       font-size: 0.26rem;
+      color: #fff;
+    }
+  }
+  .wrapper{
+    background: #fff;
+    width: 75%;
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%, -50%);
+    border-radius: 0.2rem;
+    padding: 0.3rem 0.2rem;
+    .tit{
+      font-size: .32rem;
       color: #333;
+      line-height: .8rem;
+      text-align: center;
+      position: relative;
+      font-weight: 600;
+      position: relative;
+      .cancle{
+        position: absolute;
+        top: 0;
+        right: 0;
+        font-size: .3rem;
+        line-height: .3rem;
+      }
+    }
+    .msg{
+      font-size: .27rem;
+      text-align: center;
+      padding: 0 0.1rem;
+    }
+    .copy{
+      text-align: center;
+      margin-top: 0.5rem;
+      p{
+        font-size: .22rem;
+        color: #888;
+        line-height: .3rem;
+        margin-bottom: 0.15rem;
+      }
     }
   }
 }

+ 2 - 2
src/view/course/user/courseDeal.vue

@@ -218,7 +218,7 @@ img {
       }
       .catelog {
         margin-top: 1px;
-        border-top: 1px solid #ccc;
+        border-top: 1px solid #efefef;
         .sup {
           display: flex;
           justify-content: space-between;
@@ -231,7 +231,7 @@ img {
         }
         .logConetent {
           .logLi {
-            border: 1px solid #ccc;
+            border: 1px solid #efefef;
             border-radius: 0.1rem;
             padding: 0 0.2rem;
             margin-bottom: 0.15rem;

+ 9 - 3
src/view/course/user/deal.vue

@@ -29,7 +29,7 @@
                 color="#E1B98B"
                 style="margin-left: .1rem;"
             /></span>
-            <p>手机:{{ user_info.mobile }}</p>
+            <p v-if="user_info.mobile != ''">手机:{{ user_info.mobile }}</p>
           </div>
         </div>
         <div class="user_leave" @click="dealCourseNum">
@@ -92,7 +92,7 @@
             <span>{{ item.createTime }}</span>
           </div>
         </div>
-        <van-divider v-if="recordList.length != 0 && recordList.length == page1.total">没有更多了...</van-divider>
+        <van-divider v-if="recordList.length != 0 && recordList.length == page1.total" style="line-height: .6rem;">没有更多了...</van-divider>
         <noData :list="recordList" />
       </scroller>
     </div>
@@ -329,7 +329,7 @@ export default {
       background-color: #efefef;
     }
     .dealList {
-      padding: 0 0.2rem;
+      padding: 0.15rem 0.2rem 0;
       border-radius: 0.1rem;
     }
     .dealRecordList {
@@ -342,6 +342,12 @@ export default {
         &:not(:nth-last-child(1)) {
           border-bottom: 1px solid #efefef;
         }
+        &:first-child{
+          border-radius: .1rem .1rem 0 0;
+        }
+        &:last-child{
+          border-radius: 0 0 .1rem .1rem;
+        }
         .flex-name-num {
           display: flex;
           justify-content: space-between;

+ 3 - 2
src/view/course/user/wxAuth.vue

@@ -15,8 +15,9 @@ export default {
   created () { 
     
   },
-  mounted () { },
-  methods: { },
+  methods: { 
+    
+   },
   computed: {}
 }
 </script>

+ 2 - 2
src/view/course/video/video.vue

@@ -173,7 +173,7 @@ img {
       }
       .catelog {
         margin-top: 1px;
-        border-top: 1px solid #ccc;
+        border-top: 1px solid #efefef;
         .sup {
           display: flex;
           justify-content: space-between;
@@ -186,7 +186,7 @@ img {
         }
         .logConetent {
           .logLi {
-            border: 1px solid #ccc;
+            border: 1px solid #efefef;
             border-radius: 0.1rem;
             padding: 0 0.2rem;
             margin-bottom: 0.15rem;