courseOverview.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. <!-- -->
  2. <template>
  3. <div>
  4. <div class="m-core">
  5. <el-form ref="liveForm" :model="form" label-position="top">
  6. <el-alert title="课程规划" :closable="false" type="info" style="margin: 0 0 20px" />
  7. <el-row :gutter="20">
  8. <el-col :span="8">
  9. <el-form-item label="直播课标题" prop="roomTitle" :rules="[{ required: false, message: '请输入直播课标题' }]">
  10. <el-input v-model="form.roomTitle" placeholder="请输入直播课标题" maxlength="25" :disabled="disabled"></el-input>
  11. </el-form-item>
  12. </el-col>
  13. <el-col :span="8">
  14. <el-form-item label="分部" prop="organIds" :rules="[{ required: false, message: '请选择分部' }]">
  15. <select-all v-model.trim="form.organIds" filterable placeholder="请选择分部" multiple clearable
  16. :disabled="disabled">
  17. <el-option v-for="(item, index) in selects.branchs" :key="index" :label="item.name"
  18. :value="item.id"></el-option>
  19. </select-all>
  20. </el-form-item>
  21. </el-col>
  22. <el-col :span="8">
  23. <el-form-item label="直播课内容" prop="liveRemark" :rules="[{ required: false, message: '请输入直播课内容' }]">
  24. <el-input type="textarea" v-model="form.liveRemark" placeholder="请输入直播课内容" maxlength="200" show-word-limit
  25. :disabled="disabled"></el-input>
  26. </el-form-item>
  27. </el-col>
  28. <el-col :span="8">
  29. <el-form-item label="声部" prop="subjectIdList" :rules="[{ required: false, message: '请选择声部' }]">
  30. <el-select v-model.trim="form.subjectIdList" filterable clearable placeholder="请选择声部"
  31. style="width: 100% !important" :disabled="disabled">
  32. <el-option v-for="(item, index) in subjectList" :key="index" :value="item.id" :label="item.name" />
  33. </el-select>
  34. </el-form-item>
  35. </el-col>
  36. <el-col :span="8">
  37. <el-form-item label="指导老师" prop="teacher" :rules="[{ required: false, message: '请选择指导老师' }]">
  38. <el-select v-model.trim="form.teacher" filterable clearable placeholder="请选择指导老师"
  39. style="width: 100% !important" :disabled="!form.subjectIdList || disabled">
  40. <el-option v-for="(item, index) in teacherList" :key="index" :label="item.realName" :value="item.id" />
  41. </el-select>
  42. </el-form-item>
  43. </el-col>
  44. <el-col :span="8">
  45. <el-form-item label="乐团主管" prop="educationalTeacherId" :rules="[{ required: false, message: '请选择乐团主管' }]">
  46. <el-select v-model.trim="form.educationalTeacherId" filterable clearable style="width: 100% !important"
  47. :disabled="disabled">
  48. <el-option v-for="(item, key) in educationList" :key="key" :label="item.userName" :value="item.userId" />
  49. </el-select>
  50. </el-form-item>
  51. </el-col>
  52. <el-col :span="8">
  53. <el-form-item label="课程购买时间" prop="signUpTimeList" :rules="[{ required: false, message: '请选择课程购买时间' }]">
  54. <!-- :default-time="['00:00:00', '23:59:59']" -->
  55. <el-date-picker style="width: 100%" v-model="form.signUpTimeList" type="daterange" range-separator="-"
  56. start-placeholder="购买开始日期" end-placeholder="购买结束日期" :disabled="disabled">
  57. </el-date-picker>
  58. </el-form-item>
  59. </el-col>
  60. <el-col :span="8">
  61. <el-form-item label="课时数" prop="onlineClassesNum" :rules="[{ required: false, message: '请输入课时数' }]">
  62. <el-input v-model="form.onlineClassesNum" placeholder="请输入课时数" maxlength="2"
  63. :disabled="disabled"></el-input>
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="8">
  67. <el-form-item label="课程时长" prop="singleClassMinuteId" :rules="[{ required: false, message: '请选择课程时长' }]">
  68. <el-select v-model.trim="form.singleClassMinuteId" filterable clearable style="width: 100% !important"
  69. placeholder="请选择课程时长" :disabled="disabled">
  70. <el-option v-for="(item, key) in liveGroupList" :key="key" :label="item.singleClassMinutes"
  71. :value="item.id" />
  72. </el-select>
  73. </el-form-item>
  74. </el-col>
  75. <el-col :span="8">
  76. <el-form-item label="现价" prop="onlineClassesUnitPrice" :rules="[{ required: false, message: '请输入现价' }]">
  77. <el-input v-model="form.onlineClassesUnitPrice" placeholder="请输入现价" @keyup.native="keyupEvent($event)"
  78. :disabled="disabled"></el-input>
  79. </el-form-item>
  80. </el-col>
  81. <el-col :span="8">
  82. <el-form-item label="原价" prop="offlineClassesUnitPrice" :rules="[{ required: false, message: '请输入原价' }]">
  83. <el-input v-model="form.offlineClassesUnitPrice" placeholder="请输入原价" @keyup.native="keyupEvent($event)"
  84. :disabled="disabled"></el-input>
  85. </el-form-item>
  86. </el-col>
  87. </el-row>
  88. <el-table style="width: 100%; margin-top: 20px;" :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  89. :data="form.timeTable">
  90. <el-table-column align="center" label="课时">
  91. <template slot-scope="scope">
  92. 第{{ scope.$index + 1 }}课
  93. </template>
  94. </el-table-column>
  95. <el-table-column align="center" label="内容" width="150px" prop="teachingContent" key="teachingContent">
  96. <template slot-scope="scope">
  97. <!-- {{ scope.row.teachingContent }} -->
  98. <Tooltip :content="scope.row.teachingContent" />
  99. </template>
  100. </el-table-column>
  101. <el-table-column align="center" label="技能/知识点掌握" width="220px" prop="teachingPoint" key="teachingPoint">
  102. <template slot-scope="scope">
  103. <!-- {{ scope.row.teachingPoint }} -->
  104. <Tooltip :content="scope.row.teachingPoint" />
  105. </template>
  106. </el-table-column>
  107. <el-table-column align="center" prop="singleClassMinutes" label="时长"></el-table-column>
  108. <el-table-column align="center" label="课程日期">
  109. <template slot-scope="scope">
  110. <div>{{ scope.row.classDate | formatTimer }}</div>
  111. </template>
  112. </el-table-column>
  113. <el-table-column align="center" prop="startClassTimeStr" label="开始时间"></el-table-column>
  114. <el-table-column align="center" prop="endClassTimeStr" label="结束时间"></el-table-column>
  115. <el-table-column align="center" label="课程类型">
  116. <template slot-scope="scope">
  117. <div>{{ scope.row.teachMode | teachMode }}</div>
  118. </template>
  119. </el-table-column>
  120. </el-table>
  121. <el-alert title="直播课信息" :closable="false" type="info" style="margin: 20px 0" />
  122. <el-row :gutter="20">
  123. <el-col :span="6">
  124. <el-form-item label="直播设备" prop="os" :rules="[{ required: false, message: '请选择推广类型' }]">
  125. <el-radio-group v-model="form.os" :disabled="disabled">
  126. <!-- 根据不同的模式,显示不同的直播设备 -->
  127. <el-radio v-if="serviceProvider === 'rongCloud'" label="pc">web</el-radio>
  128. <el-radio v-if="serviceProvider === 'tencentCloud'" label="client">客户端</el-radio>
  129. <el-radio label="mobile">手机</el-radio>
  130. </el-radio-group>
  131. </el-form-item>
  132. </el-col>
  133. <el-col :span="6">
  134. <el-form-item label="直播场景" prop="useScene" :rules="[{ required: false, message: '请选择直播场景' }]">
  135. <el-radio-group v-model="form.useScene" :disabled="disabled">
  136. <el-radio label="NORMAL">普通模式</el-radio>
  137. <el-radio label="MUSIC">音乐模式</el-radio>
  138. </el-radio-group>
  139. </el-form-item>
  140. </el-col>
  141. <el-col :span="6">
  142. <el-form-item prop="roomConfig.whether_video" label="保存直播回放"
  143. :rules="[{ required: false, message: '是否保存直播回放' }]">
  144. <el-radio-group v-model="form.roomConfig.whether_video" :disabled="disabled">
  145. <el-radio :label="0">是</el-radio>
  146. <el-radio :label="1">否</el-radio>
  147. </el-radio-group>
  148. </el-form-item>
  149. </el-col>
  150. <el-col :span="6">
  151. <el-form-item prop="roomConfig.whether_view_shop_cart" label="是否展示购物车"
  152. :rules="[{ required: false, message: '是否展示购物车' }]">
  153. <el-radio-group v-model="form.roomConfig.whether_view_shop_cart" :disabled="disabled">
  154. <el-radio :label="0">是</el-radio>
  155. <el-radio :label="1">否</el-radio>
  156. </el-radio-group>
  157. </el-form-item>
  158. </el-col>
  159. <el-col :span="24">
  160. <el-form-item label="预热模板(模板使用于分享宣传图片)" prop="preTemplate" :rules="[{ required: false, message: '请选择预热模板' }]">
  161. <el-radio-group v-model="form.preTemplate" :disabled="disabled">
  162. <div class="chioseWrap">
  163. <div class="chioseItem">
  164. <img src="../../images/img1.png" alt="" />
  165. <i class="dotWrap" :class="form.preTemplate == 1 ? 'checked' : ''"></i>
  166. </div>
  167. <div class="chioseItem">
  168. <img src="../../images/img2.png" alt="" />
  169. <i class="dotWrap" :class="form.preTemplate == 2 ? 'checked' : ''"></i>
  170. </div>
  171. <div class="chioseItem">
  172. <img src="../../images/img3.png" alt="" />
  173. <i class="dotWrap" :class="form.preTemplate == 3 ? 'checked' : ''"></i>
  174. </div>
  175. </div>
  176. </el-radio-group>
  177. </el-form-item>
  178. </el-col>
  179. </el-row>
  180. </el-form>
  181. </div>
  182. </div>
  183. </template>
  184. <script>
  185. import Tooltip from "@/components/Tooltip/index";
  186. import { liveGroupDetail } from "../../api";
  187. export default {
  188. components: {
  189. Tooltip
  190. },
  191. data() {
  192. return {
  193. disabled: true,
  194. tableList: [],
  195. form: {
  196. roomTitle: "", //
  197. liveRemark: "", // 内容
  198. organIds: [],
  199. subjectIdList: null, // 声部
  200. teacher: "", // 指导老师列表
  201. educationalTeacherId: null, // 乐团主管
  202. preTemplate: 1, // 模板
  203. signUpStart: null, // 开始时间
  204. signUpEnd: null, // 结束时间
  205. signUpTimeList: [], // 课程购买时间
  206. onlineClassesNum: null,
  207. singleClassMinuteId: null, //时长编号
  208. singleClassMinutes: null, // 时长
  209. onlineClassesUnitPrice: null, // 售价
  210. offlineClassesUnitPrice: null, // 原价
  211. os: "client", // 直播设备
  212. useScene: "NORMAL", // 直播场景
  213. popularizeType: "ALL", // 观看权限信息
  214. viewMode: "LOGIN",
  215. roomConfig: {
  216. whether_like: 0,
  217. whether_chat: 0,
  218. whether_video: 0,
  219. whether_mic: 0,
  220. whether_view_shop_cart: 0
  221. },
  222. timeTable: [], // 排课
  223. clientType: "TEACHER" // 主讲人身份 默认[老师]
  224. },
  225. serviceProvider: "tencentCloud", // 直播模式
  226. subjectList: [], // 声部列表
  227. teacherList: [], // 指导老师
  228. educationList: [], // 乐团主管
  229. liveGroupList: [] // 课时列表
  230. };
  231. },
  232. mounted() {
  233. this.getList();
  234. },
  235. methods: {
  236. async getList() {
  237. try {
  238. const query = this.$route.query;
  239. const { data } = await liveGroupDetail({ id: query.id });
  240. const liveBroadcastRoom = data.liveBroadcastRoom || {};
  241. const vipGroupApplyBaseInfo = data.vipGroupApplyBaseInfo || {};
  242. const courseSchedules = data.courseSchedules || [];
  243. const tempCourse = [];
  244. courseSchedules.forEach(item => {
  245. tempCourse.push({
  246. classDate: item.classDate,
  247. actualTeacherId: item.teacherId,
  248. startClassTimeStr: item.startClassTimeStr,
  249. endClassTimeStr: item.endClassTimeStr,
  250. teachMode: "ONLINE",
  251. singleClassMinutes: vipGroupApplyBaseInfo.singleClassMinutes,
  252. teachingContent: item.teachingContent,
  253. teachingPoint: item.teachingPoint
  254. });
  255. });
  256. // 初始化数据
  257. this.form = {
  258. roomTitle: liveBroadcastRoom.roomTitle, //
  259. liveRemark: liveBroadcastRoom.liveRemark, // 内容
  260. organIds: vipGroupApplyBaseInfo.organName ? vipGroupApplyBaseInfo.organName.split(",") : [],
  261. subjectIdList: vipGroupApplyBaseInfo.subjectName, // 声部
  262. teacher: liveBroadcastRoom.speakerName, // 指导老师列表
  263. educationalTeacherId: vipGroupApplyBaseInfo.educationalTeacherName, // 乐团主管
  264. preTemplate: liveBroadcastRoom.preTemplate, // 模板
  265. signUpStart: null, // 开始时间
  266. signUpEnd: null, // 结束时间
  267. signUpTimeList: [
  268. vipGroupApplyBaseInfo.registrationStartTime,
  269. vipGroupApplyBaseInfo.paymentExpireDate
  270. ], // 课程购买时间
  271. onlineClassesNum: vipGroupApplyBaseInfo.onlineClassesNum,
  272. singleClassMinuteId: vipGroupApplyBaseInfo.singleClassMinutes, //时长编号
  273. singleClassMinutes: vipGroupApplyBaseInfo.singleClassMinutes, // 时长
  274. onlineClassesUnitPrice: vipGroupApplyBaseInfo.onlineClassesUnitPrice, // 售价
  275. offlineClassesUnitPrice:
  276. vipGroupApplyBaseInfo.offlineClassesUnitPrice, // 原价
  277. os: liveBroadcastRoom.os, // 直播设备
  278. useScene: liveBroadcastRoom.useScene, // 直播场景
  279. popularizeType: liveBroadcastRoom.popularizeType, // 观看权限信息
  280. viewMode: liveBroadcastRoom.viewMode,
  281. roomConfig: liveBroadcastRoom.roomConfig || {
  282. whether_like: 0,
  283. whether_chat: 0,
  284. whether_video: 0,
  285. whether_mic: 0,
  286. whether_view_shop_cart: 0
  287. },
  288. timeTable: tempCourse, // 排课
  289. clientType: "TEACHER" // 主讲人身份 默认[老师]
  290. };
  291. } catch {
  292. //
  293. }
  294. }
  295. }
  296. };
  297. </script>
  298. <style lang="scss" scoped>
  299. .chioseWrap {
  300. display: flex;
  301. flex-direction: row;
  302. justify-content: flex-start;
  303. .chioseItem {
  304. border-radius: 4px;
  305. overflow: hidden;
  306. position: relative;
  307. margin-right: 10px;
  308. width: 188px;
  309. height: 188px;
  310. cursor: pointer;
  311. .dotWrap {
  312. width: 21px;
  313. height: 21px;
  314. background: url("../../../../assets/images/icon_checkbox_default.png") no-repeat center;
  315. background-size: contain;
  316. display: block;
  317. position: absolute;
  318. top: 10px;
  319. right: 12px;
  320. overflow: hidden;
  321. &.checked {
  322. background: url("../../../../assets/images/icon_checkbox.png") no-repeat center;
  323. background-size: contain;
  324. }
  325. }
  326. }
  327. }
  328. ::v-deep .el-select>.el-input {
  329. height: 36px !important;
  330. }
  331. ::v-deep .select-all {
  332. .select {
  333. .el-input__inner {
  334. height: 36px !important;
  335. min-height: 36px !important;
  336. }
  337. }
  338. .btn {
  339. height: 36px !important;
  340. min-height: 36px !important;
  341. }
  342. }
  343. </style>