mo 2 years ago
parent
commit
7aacad784d
2 changed files with 211 additions and 161 deletions
  1. 43 84
      src/views/liveClassManager/index.vue
  2. 168 77
      src/views/liveClassManager/newLiveClass.vue

+ 43 - 84
src/views/liveClassManager/index.vue

@@ -7,10 +7,7 @@
     </h2>
     <div class="m-core">
       <auth auths="imLiveBroadcastRoom/add">
-        <el-button
-          @click="newLiveClass"
-          type="primary"
-          style="margin-bottom: 20px"
+        <el-button @click="newLiveClass" type="primary" style="margin-bottom: 20px"
           >新建直播课</el-button
         >
       </auth>
@@ -26,7 +23,7 @@
             v-model.trim="searchForm.search"
             clearable
             @keyup.enter.native="
-              e => {
+              (e) => {
                 e.target.blur();
                 $refs.searchForm.save();
                 search();
@@ -36,27 +33,19 @@
           ></el-input>
         </el-form-item>
         <el-form-item prop="popularize">
-          <el-select
-            placeholder="是否推广"
-            v-model="searchForm.popularize"
-            clearable
-          >
+          <el-select placeholder="是否推广" v-model="searchForm.popularize" clearable>
             <el-option label="否" value="0"></el-option>
             <el-option label="是" value="1"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item prop="liveState">
-          <el-select
-            placeholder="直播状态"
-            v-model="searchForm.liveState"
-            clearable
-          >
+          <el-select placeholder="直播状态" v-model="searchForm.liveState" clearable>
             <el-option label="未开始" value="0"></el-option>
             <el-option label="直播中" value="1"></el-option>
             <el-option label="已结束" value="2"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item prop="liveState">
+        <el-form-item prop="serviceProvider">
           <el-select
             placeholder="直播方案"
             v-model="searchForm.serviceProvider"
@@ -75,7 +64,7 @@
             start-placeholder="直播开始日期"
             end-placeholder="直播结束日期"
             :picker-options="{
-              firstDayOfWeek: 1
+              firstDayOfWeek: 1,
             }"
           >
           </el-date-picker>
@@ -92,11 +81,7 @@
           :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
           :data="tableList"
         >
-          <el-table-column
-            align="center"
-            prop="id"
-            label="直播间编号"
-          ></el-table-column>
+          <el-table-column align="center" prop="id" label="直播间编号"></el-table-column>
           <el-table-column
             align="center"
             prop="roomTitle"
@@ -107,11 +92,7 @@
             prop="speakerName"
             label="主讲人"
           ></el-table-column>
-          <el-table-column
-            align="center"
-            prop="liveStartTime"
-            label="直播开始时间"
-          >
+          <el-table-column align="center" prop="liveStartTime" label="直播开始时间">
             <template slot-scope="scope">
               <div>
                 {{ scope.row.liveStartTime | dateForMinFormat }}
@@ -147,11 +128,7 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="serviceProvider"
-            label="直播方案"
-          >
+          <el-table-column align="center" prop="serviceProvider" label="直播方案">
             <template slot-scope="scope">
               <div>
                 {{ scope.row.serviceProvider | serviceProvider }}
@@ -167,10 +144,7 @@
             <template slot-scope="scope">
               <div>
                 <auth auths="imLiveBroadcastRoom/query/roomUser">
-                  <el-button
-                    type="text"
-                    @click="lookReservationDetail(scope.row)"
-                  >
+                  <el-button type="text" @click="lookReservationDetail(scope.row)">
                     {{ scope.row.roomReservationNum }}</el-button
                   >
                 </auth>
@@ -180,20 +154,16 @@
           <el-table-column align="center" prop="studentId" label="操作">
             <template slot-scope="scope">
               <div>
-                <el-dropdown
-                  trigger="click"
-                  placement="bottom"
-                  :hide-on-click="false"
-                >
+                <el-dropdown trigger="click" placement="bottom" :hide-on-click="false">
                   <span class="el-dropdown-link">
                     操作<i class="el-icon-arrow-down el-icon--right"></i>
                   </span>
-                  <el-dropdown-menu slot="dropdown" style="width:100px">
+                  <el-dropdown-menu slot="dropdown" style="width: 100px">
                     <el-dropdown-item
-                      style="width:100px"
+                      style="width: 100px"
                       v-if="
                         permission('/liveStudentList') &&
-                          scope.row.popularizeType !== 'ALL'
+                        scope.row.popularizeType !== 'ALL'
                       "
                       @click.native="lookStudentDetail(scope.row)"
                     >
@@ -202,7 +172,7 @@
                     <el-dropdown-item
                       v-if="
                         permission('imLiveBroadcastRoom/opsPopularize') &&
-                          scope.row.liveState != 2
+                        scope.row.liveState != 2
                       "
                       @click.native="popularizeRoom(scope.row)"
                     >
@@ -214,7 +184,7 @@
                     <el-dropdown-item
                       v-if="
                         permission('imLiveBroadcastRoom/roomDestroy') &&
-                          scope.row.liveState == 1
+                        scope.row.liveState == 1
                       "
                       @click.native="closeRoom(scope.row)"
                     >
@@ -233,20 +203,13 @@
                       </el-dropdown-item>
                     </auth>
                     <el-dropdown-item
-                      v-if="
-                        permission('liveGoodsMapper/page') &&
-                          ishowCart(scope.row)
-                      "
+                      v-if="permission('liveGoodsMapper/page') && ishowCart(scope.row)"
                       @click.native="setShop(scope.row)"
                     >
                       <el-button type="text">商品设置</el-button>
                     </el-dropdown-item>
-                    <auth
-                      auths="imLiveBroadcastRoom/queryLiveRoomGoodsOrderList"
-                    >
-                      <el-dropdown-item
-                        @click.native="gotoBlacklist(scope.row)"
-                      >
+                    <auth auths="imLiveBroadcastRoom/queryLiveRoomGoodsOrderList">
+                      <el-dropdown-item @click.native="gotoBlacklist(scope.row)">
                         <el-button type="text">黑名单</el-button>
                       </el-dropdown-item>
                     </auth>
@@ -260,12 +223,10 @@
                     <el-dropdown-item
                       v-if="
                         permission('imLiveBroadcastRoom/update') &&
-                          scope.row.liveState == 0
+                        scope.row.liveState == 0
                       "
                     >
-                      <el-button
-                        type="text"
-                        @click.native="resetLive(scope.row)"
+                      <el-button type="text" @click.native="resetLive(scope.row)"
                         >修改</el-button
                       >
                     </el-dropdown-item>
@@ -275,9 +236,7 @@
                       v-if="scope.row.liveState == 0"
                     >
                       <el-dropdown-item>
-                        <el-button
-                          type="text"
-                          @click.native="deteleLive(scope.row)"
+                        <el-button type="text" @click.native="deteleLive(scope.row)"
                           >删除</el-button
                         >
                       </el-dropdown-item>
@@ -389,7 +348,7 @@ import {
   getLiveBroadcastList,
   delLiveBroadcast,
   closeBroadcastRoomList,
-  opsPopularize
+  opsPopularize,
 } from "./api";
 export default {
   components: {
@@ -397,7 +356,7 @@ export default {
     shareDetail,
     popularizeRoom,
     reservationDetail,
-    sellShopList
+    sellShopList,
   },
   data() {
     return {
@@ -406,7 +365,7 @@ export default {
         timer: [],
         serviceProvider: null,
         liveState: null,
-        popularize: null
+        popularize: null,
       },
 
       tableList: [],
@@ -416,10 +375,10 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50] // 选择限制显示条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
       },
       shareVisible: false,
-      activeRow: null
+      activeRow: null,
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
@@ -442,7 +401,7 @@ export default {
           ...rest,
           ...getTimes(timer, ["startTime", "endTime"]),
           rows: this.rules.limit,
-          page: this.rules.page
+          page: this.rules.page,
         });
         this.tableList = res.data.rows;
         this.rules.total = res.data.total;
@@ -460,9 +419,9 @@ export default {
     },
     newLiveClass() {
       let params = {
-        path: "/business/createLiveClass"
+        path: "/business/createLiveClass",
       };
-      this.$router.push(params, route => {
+      this.$router.push(params, (route) => {
         route.meta.title = "新建直播课";
       });
       this.$router.push("/business/createLiveClass");
@@ -471,7 +430,7 @@ export default {
     gotoDetail(row) {
       this.$router.push({
         path: "/business/liveClassDetail",
-        query: { roomUid: row.roomUid }
+        query: { roomUid: row.roomUid },
       });
       //
     },
@@ -482,10 +441,10 @@ export default {
     resetLive(row) {
       let params = {
         path: "/business/createLiveClass",
-        query: { id: row.id, roomUid: row.roomUid }
+        query: { id: row.id, roomUid: row.roomUid },
       };
       //  ,
-      this.$router.push(params, route => {
+      this.$router.push(params, (route) => {
         route.meta.title = "修改直播课";
       });
     },
@@ -493,7 +452,7 @@ export default {
       this.$confirm("您确定删除该直播间", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning"
+        type: "warning",
       })
         .then(async () => {
           try {
@@ -509,8 +468,8 @@ export default {
     closeRoom(row) {
       this.$confirm("您确定关闭直播间", "提示", {
         confirmButtonText: "确定",
-        type: "warning"
-      }).then(async res => {
+        type: "warning",
+      }).then(async (res) => {
         try {
           const res = await closeBroadcastRoomList(row.id);
           this.$message.success("关闭成功");
@@ -531,13 +490,13 @@ export default {
       this.$confirm(`您是否${str}直播间"${row.roomTitle}"`, "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning"
+        type: "warning",
       })
         .then(async () => {
           try {
             const res = await opsPopularize({
               popularize,
-              id: row.id
+              id: row.id,
             });
             this.$message.success(`${str}成功`);
             this.getList();
@@ -550,7 +509,7 @@ export default {
     setShop(row) {
       this.$router.push({
         path: "/business/liveShopControl",
-        query: { roomUid: row.roomUid }
+        query: { roomUid: row.roomUid },
       });
       //
     },
@@ -560,7 +519,7 @@ export default {
     gotoBlacklist(row) {
       this.$router.push({
         path: "/business/liveBlackList",
-        query: { roomUid: row.roomUid, name: row.roomTitle }
+        query: { roomUid: row.roomUid, name: row.roomTitle },
       });
     },
     gotoBuylist(row) {
@@ -569,7 +528,7 @@ export default {
     lookStudentDetail(row) {
       this.$router.push({
         path: "/business/liveStudentList",
-        query: { roomUid: row.roomUid, name: row.roomTitle }
+        query: { roomUid: row.roomUid, name: row.roomTitle },
       });
     },
     ishowCart(row) {
@@ -579,8 +538,8 @@ export default {
       } else {
         return false;
       }
-    }
-  }
+    },
+  },
 };
 </script>
 <style lang="scss" scoped>

+ 168 - 77
src/views/liveClassManager/newLiveClass.vue

@@ -32,33 +32,28 @@
             ></el-input>
           </el-form-item>
           <el-form-item
-            label="主讲人"
+            label="直播方案"
             class="nomb"
-            prop="speakerId"
-            :rules="[{ required: true, message: '请输入主讲人' }]"
+            prop="serviceProvider"
+            :rules="[{ required: true, message: '请选择直播方案' }]"
           >
             <el-select
-              v-model.trim="form.speakerId"
-              collapse-tags
+              placeholder="请选择直播方案"
+              v-model="form.serviceProvider"
               clearable
-              placeholder="请输入主讲人"
-              remote
-              filterable
-              :remote-method="remoteMethod"
-              :loading="remoteLoading"
-              @change="changeTeacher"
+              @change="
+                (value) => {
+                  // console.log(value, 'value');
+                  if (value === 'rongCloud') {
+                    form.os = 'pc';
+                  } else if (value === 'tencentCloud') {
+                    form.os = 'client';
+                  }
+                }
+              "
             >
-              <el-option
-                v-for="item in teacherList"
-                :key="item.id"
-                :label="item.realName"
-                :value="item.id"
-              >
-                <span style="float: left">{{ item.realName }}</span>
-                <span style="float: right; color: #8492a6; font-size: 13px">{{
-                  item.phone
-                }}</span>
-              </el-option>
+              <el-option label="融云" value="rongCloud"></el-option>
+              <el-option label="腾讯云" value="tencentCloud"></el-option>
             </el-select>
           </el-form-item>
           <el-form-item
@@ -69,6 +64,7 @@
           >
             <el-date-picker
               v-model="form.liveStartTime"
+              :picker-options="pickerOptions"
               type="datetime"
               format="yyyy-MM-dd HH:mm"
               value-format="yyyy-MM-dd HH:mm"
@@ -80,30 +76,91 @@
         </el-row>
         <el-row class="row">
           <el-form-item
-            label="直播方案"
+            label="主讲人身份"
             class="nomb"
-            prop="serviceProvider"
+            prop="clientType"
             :rules="[{ required: true, message: '请选择直播方案' }]"
           >
             <el-select
-              placeholder="请选择直播方案"
-              v-model="form.serviceProvider"
+              placeholder="请选择主讲人身份"
+              v-model="form.clientType"
               clearable
               @change="
-                value => {
-                  // console.log(value, 'value');
-                  if (value === 'rongCloud') {
-                    form.os = 'pc';
-                  } else if (value === 'tencentCloud') {
-                    form.os = 'client';
-                  }
+                (value) => {
+                  form.speakerId = '';
                 }
               "
             >
-              <el-option label="融云" value="rongCloud"></el-option>
-              <el-option label="腾讯云" value="tencentCloud"></el-option>
+              <el-option label="老师" value="TEACHER"></el-option>
+              <el-option label="员工" value="EDUCATION"></el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item
+            label="主讲人"
+            class="nomb"
+            prop="speakerId"
+            :rules="[{ required: true, message: '请输入主讲人' }]"
+            v-if="form.clientType == 'TEACHER'"
+          >
+            <el-select
+              v-model.trim="form.speakerId"
+              collapse-tags
+              clearable
+              placeholder="请输入主讲人"
+              remote
+              filterable
+              :remote-method="remoteMethod"
+              :loading="remoteLoading"
+              @change="changeTeacher"
+            >
+              <el-option
+                v-for="item in teacherList"
+                :key="item.id"
+                :label="item.realName"
+                :value="item.id"
+              >
+                <span style="float: left">{{ item.realName }}</span>
+                <span style="float: right; color: #8492a6; font-size: 13px">{{
+                  item.phone
+                }}</span>
+              </el-option>
             </el-select>
           </el-form-item>
+
+          <el-form-item
+            v-else
+            label="主讲人"
+            class="nomb"
+            prop="speakerId"
+            :rules="[{ required: true, message: '请输入主讲人' }]"
+          >
+            <el-select
+              v-model.trim="form.speakerId"
+              collapse-tags
+              clearable
+              placeholder="请输入主讲人"
+              remote
+              filterable
+              :remote-method="remoteMethodEduc"
+              :loading="remoteLoading"
+              @change="changeTeacher"
+            >
+              <el-option
+                v-for="item in educationList"
+                :key="item.id"
+                :label="item.realName"
+                :value="item.id"
+              >
+                <span style="float: left">{{ item.realName }}</span>
+                <span style="float: right; color: #8492a6; font-size: 13px">{{
+                  item.phone
+                }}</span>
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-row>
+        <el-row class="row">
           <el-form-item
             label="直播课内容"
             prop="liveRemark"
@@ -202,9 +259,7 @@
               <el-radio v-if="form.serviceProvider === 'rongCloud'" label="pc"
                 >web</el-radio
               >
-              <el-radio
-                v-if="form.serviceProvider === 'tencentCloud'"
-                label="client"
+              <el-radio v-if="form.serviceProvider === 'tencentCloud'" label="client"
                 >客户端</el-radio
               >
               <el-radio label="mobile">手机</el-radio>
@@ -235,8 +290,8 @@
           <el-form-item
             v-if="
               form.popularizeType == 'SCHOOL' ||
-                form.popularizeType == 'ORGAN' ||
-                form.popularizeType == 'TEAM'
+              form.popularizeType == 'ORGAN' ||
+              form.popularizeType == 'TEAM'
             "
             label="分部"
             prop="organIds"
@@ -403,11 +458,7 @@
 import preview from "./modals/preview.vue";
 import axios from "axios";
 import { getToken, getTenantId } from "@/utils/auth";
-import {
-  createLiveBroadcast,
-  resetLiveBroadcastRoomList,
-  getRoomInfo
-} from "./api";
+import { createLiveBroadcast, resetLiveBroadcastRoomList, getRoomInfo } from "./api";
 import { queryByOrganId } from "@/api/systemManage";
 import { getTeamList } from "@/api/teamServer";
 export default {
@@ -426,23 +477,31 @@ export default {
         liveRemark: "",
         preTemplate: null,
         popularizeType: "ALL",
+        clientType: "TEACHER",
         os: "client",
         roomConfig: {
           whether_like: 0,
           whether_chat: 0,
           whether_video: 0,
           whether_mic: 0,
-          whether_view_shop_cart: 0
+          whether_view_shop_cart: 0,
         },
         checkList: [],
-        serviceProvider: "tencentCloud"
+        serviceProvider: "tencentCloud",
       },
       remoteLoading: false,
       teacherList: [],
       checkList: [],
       cooperationList: [],
       teamList: [],
-      isinit: true
+      isinit: true,
+      pickerOptions: {
+        firstDayOfWeek: 1,
+        disabledDate(time) {
+          return time.getTime() + 86400000 <= new Date().getTime();
+        },
+      },
+      educationList: [],
     };
   },
   mounted() {
@@ -503,23 +562,19 @@ export default {
           schoolIds: [],
           teamIds: [],
           catIds: [],
-          studentIds: []
+          studentIds: [],
         };
         this.form.roomConfig = JSON.parse(res.data.roomConfig);
         if (res.data.popularizeOrgIds) {
-          this.form.organIds = res.data.popularizeOrgIds
-            .split(",")
-            .map(item => {
-              return item * 1;
-            });
+          this.form.organIds = res.data.popularizeOrgIds.split(",").map((item) => {
+            return item * 1;
+          });
         }
 
         if (res.data.popularizeSchoolIds) {
-          this.form.schoolIds = res.data.popularizeSchoolIds
-            .split(",")
-            .map(item => {
-              return item * 1;
-            });
+          this.form.schoolIds = res.data.popularizeSchoolIds.split(",").map((item) => {
+            return item * 1;
+          });
         }
 
         if (res.data.popularizeTeamIds) {
@@ -542,14 +597,14 @@ export default {
       this.$router.push("/liveClassManager");
     },
     changeTeacher(val) {
-      this.teacherList.forEach(item => {
+      this.teacherList.forEach((item) => {
         if (val == item.id) {
           this.form.speakerName = item.realName;
         }
       });
     },
     preLook() {
-      this.$refs.form.validate(flag => {
+      this.$refs.form.validate((flag) => {
         if (flag) {
           this.preLookVisible = true;
           console.log("预览", this.form);
@@ -576,25 +631,25 @@ export default {
           method: "get",
           headers: {
             Authorization: getToken(),
-            tenantId: getTenantId()
+            tenantId: getTenantId(),
           },
           params: {
             rows: 9999,
             search: query,
             lockFlag: 0,
-            demissionFlag: false
+            demissionFlag: false,
           },
-          url
+          url,
         };
         this.remoteLoading = true;
         // this.studentList = []
-        axios(options).then(res => {
+        axios(options).then((res) => {
           this.remoteLoading = false;
           let result = res.data;
           if (result.code == 200) {
             // Array.prototype.splice.apply(this.studentList, result.data.rows);
             if (result.data && result.data.rows.length > 0) {
-              result.data.rows.forEach(item => {
+              result.data.rows.forEach((item) => {
                 this.teacherList.unshift(item);
               });
               this.teacherList = this.deweight(this.teacherList, "phone");
@@ -611,11 +666,49 @@ export default {
         // });
       }
     },
+    remoteMethodEduc(query) {
+      this.educationList = [];
+      if (query !== "") {
+        this.remoteLoading = true;
+        // 发请求搜索
+        const url = "/api-web/employee/queryEmployByOrganId";
+        const options = {
+          method: "get",
+          headers: {
+            Authorization: getToken(),
+            tenantId: getTenantId(),
+          },
+          params: {
+            rows: 9999,
+            search: query,
+            lockFlag: 0,
+            demissionFlag: false,
+          },
+          url,
+        };
+        this.remoteLoading = true;
+
+        axios(options).then((res) => {
+          this.remoteLoading = false;
+          let result = res.data;
+          if (result.code == 200) {
+            // Array.prototype.splice.apply(this.studentList, result.data.rows);
+            if (result.data && result.data.rows.length > 0) {
+              result.data.rows.forEach((item) => {
+                this.educationList.unshift(item);
+              });
+              this.educationList = this.deweight(this.educationList, "phone");
+            }
+            // this.studentList = this.studentList.concat(result.data.rows);
+          }
+        });
+      }
+    },
     deweight(arr, key) {
       let res = [];
-      arr.forEach(item => {
+      arr.forEach((item) => {
         let list = [];
-        res.forEach(resitem => {
+        res.forEach((resitem) => {
           list.push(resitem[key]);
         });
         if (list.indexOf(item[key]) === -1) {
@@ -634,7 +727,7 @@ export default {
       this.form.popularizeOrgIds = this.form.organIds.join(",");
       this.form.popularizeSchoolIds = this.form.schoolIds.join(",");
       this.form.popularizeTeamIds = this.form.teamIds.join(",");
-      this.$refs.form.validate(async flag => {
+      this.$refs.form.validate(async (flag) => {
         if (!flag) return;
         if (this.$route.query.id) {
           // 修改
@@ -673,7 +766,7 @@ export default {
       if (this.form.popularizeType == "SCHOOL" && val && val.length > 0) {
         let organId = val.join(",");
         try {
-          await queryByOrganId({ organId }).then(res => {
+          await queryByOrganId({ organId }).then((res) => {
             if (res.code == 200) {
               this.cooperationList = res.data;
             }
@@ -685,7 +778,7 @@ export default {
       if (this.form.popularizeType == "TEAM" && val && val.length > 0) {
         let organId = val.join(",");
         try {
-          await getTeamList({ organId, page: 1, rows: 9999 }).then(res => {
+          await getTeamList({ organId, page: 1, rows: 9999 }).then((res) => {
             if (res.code == 200) {
               this.teamList = res.data.rows;
             }
@@ -694,8 +787,8 @@ export default {
           console.log(e);
         }
       }
-    }
-  }
+    },
+  },
 };
 </script>
 <style lang="scss" scoped>
@@ -782,15 +875,13 @@ export default {
       .dotWrap {
         width: 21px;
         height: 21px;
-        background: url("../../assets/images/icon_checkbox_default.png")
-          no-repeat center;
+        background: url("../../assets/images/icon_checkbox_default.png") no-repeat center;
         background-size: contain;
         margin-right: 8px;
         position: relative;
         overflow: hidden;
         &.checked {
-          background: url("../../assets/images/icon_checkbox.png") no-repeat
-            center;
+          background: url("../../assets/images/icon_checkbox.png") no-repeat center;
           background-size: contain;
         }
       }