index.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  1. <template>
  2. <div id="">
  3. <table-list
  4. :tableSets="tableSet"
  5. :tableData="tableData"
  6. :navText="navText"
  7. :loading="loading"
  8. >
  9. <template slot="btn" slot-scope="props">
  10. <el-button type="text" @click="msgInfo(props.scope.row)"
  11. >课程内容详情</el-button
  12. ><el-button
  13. type="text"
  14. @click="exportBtn(props.scope.row)"
  15. style="margin-left: 0px"
  16. >导出课程结构</el-button
  17. >
  18. </template>
  19. </table-list>
  20. <pagination
  21. :total="total"
  22. :pageSize="formData.pageSize"
  23. :currentPage="formData.pageNum"
  24. @handleSizeChange="handleSizeChange"
  25. @handleCurrentChange="handleCurrentChange"
  26. />
  27. <el-dialog
  28. :visible.sync="dialogVisible"
  29. width="1300px"
  30. :show-close="false"
  31. :close-on-click-modal="false"
  32. >
  33. <div slot="title" class="hearders">
  34. <div class="leftTitle">{{ goodsBoxName }}</div>
  35. <div class="rightBoxs">
  36. <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
  37. </div>
  38. </div>
  39. <div class="dis_flexs">
  40. <div class="leftBoxs">
  41. <span v-if="!activeId" style="font-size: 30px"
  42. >请打开目录详情,点击播放您需要观看的视频内容。</span
  43. >
  44. <div v-show="vid && viewSign == 1" id="player"></div>
  45. <div v-show="vidzb" id="playerzb"></div>
  46. </div>
  47. <div class="rightBoxslist">
  48. <div v-for="(item, index) in courseList" :key="index" class="bg_ls">
  49. <div
  50. class="jus_sty"
  51. :style="
  52. item.checked
  53. ? 'border-bottom: 1px dotted #666;margin-bottom:6px;'
  54. : ''
  55. "
  56. >
  57. <div style="font-size: 12px">{{ item.courseName }}</div>
  58. <div class="line_h" @click="getCourseInfos(item, index)">
  59. {{ item.checked ? "—" : "+" }}
  60. </div>
  61. </div>
  62. <template v-if="item.checked">
  63. <div v-for="(items, indexs) in item.children" :key="indexs">
  64. <div
  65. class="firstSty"
  66. @click="getSecouredInfos(items, index, indexs)"
  67. >
  68. <div class="typeIcon" v-if="items.type === 3">
  69. {{ getTypeName(items.sectionType) }}
  70. </div>
  71. <i
  72. v-if="items.type !== 3"
  73. :class="
  74. items.checked
  75. ? 'el-icon-caret-bottom'
  76. : 'el-icon-caret-right'
  77. "
  78. ></i>
  79. <span :style="activeId === items.onlyId ? 'color:red;' : ''">
  80. {{ items.menuName }}
  81. </span>
  82. <span v-if="items.type === 3" class="itemsty">{{
  83. $methodsTools.secondToDate(items.durationTime, false)
  84. }}</span>
  85. </div>
  86. <template v-if="items.checked">
  87. <div
  88. v-for="(its, ids) in items.children"
  89. :key="ids"
  90. style="padding-left: 14px"
  91. >
  92. <div
  93. class="firstSty"
  94. @click="getTemsInfo(its, index, indexs, ids)"
  95. >
  96. <div class="typeIcon" v-if="its.type === 3">
  97. {{ getTypeName(its.sectionType) }}
  98. </div>
  99. <i
  100. v-if="its.type !== 3"
  101. :class="
  102. its.checked
  103. ? 'el-icon-caret-bottom'
  104. : 'el-icon-caret-right'
  105. "
  106. ></i>
  107. <span
  108. :style="activeId === its.onlyId ? 'color:red;' : ''"
  109. >
  110. {{ its.menuName }}
  111. </span>
  112. <span v-if="its.type === 3" class="itemsty">{{
  113. $methodsTools.secondToDate(its.durationTime, false)
  114. }}</span>
  115. </div>
  116. <template v-if="its.checked">
  117. <div
  118. v-for="(itschild, ids) in its.children"
  119. :key="ids"
  120. style="padding-left: 14px"
  121. @click="getTemsInfo(itschild)"
  122. >
  123. <div class="firstSty">
  124. <div class="typeIcon">
  125. {{ getTypeName(itschild.sectionType) }}
  126. </div>
  127. <span
  128. :style="
  129. activeId === itschild.onlyId ? 'color:red;' : ''
  130. "
  131. >
  132. {{ itschild.menuName }}
  133. </span>
  134. <span class="itemsty">{{
  135. $methodsTools.secondToDate(
  136. itschild.durationTime,
  137. false
  138. )
  139. }}</span>
  140. </div>
  141. </div>
  142. </template>
  143. </div>
  144. </template>
  145. </div>
  146. </template>
  147. </div>
  148. </div>
  149. </div>
  150. <span slot="footer" class="dialog-footer">
  151. <el-button @click="close">取 消</el-button>
  152. </span>
  153. </el-dialog>
  154. </div>
  155. </template>
  156. <script>
  157. import tableList from "@/components/tableList";
  158. import pagination from "@/components/pagination";
  159. export default {
  160. name: "",
  161. components: { tableList, pagination },
  162. data() {
  163. return {
  164. loading: false, //当前表单加载是否加载动画
  165. navText: {
  166. title: "课程列表",
  167. index: 0,
  168. ch: "条",
  169. num: false,
  170. changeWidth: "150px",
  171. border: true,
  172. choice: true,
  173. addHide: true,
  174. backFatherBtn: {
  175. status: false,
  176. title: "未定义",
  177. },
  178. },
  179. formData: {
  180. status: 1,
  181. pageSize: 10,
  182. pageNum: 1,
  183. commitPeriodStatus:1
  184. },
  185. // 表单
  186. tableSet: [
  187. {
  188. label: "教育类型",
  189. prop: "educationName",
  190. hidden: true,
  191. },
  192. {
  193. label: "业务层次",
  194. prop1: "projectName",
  195. prop2: "businessName",
  196. hidden: true,
  197. scope: "InfoMore",
  198. },
  199. {
  200. label: "商品编码",
  201. prop: "code",
  202. hidden: false,
  203. },
  204. {
  205. label: "商品名称",
  206. prop: "goodsName",
  207. hidden: true,
  208. },
  209. {
  210. label: "商品状态",
  211. prop: "status",
  212. hidden: false,
  213. scope: "isOptions",
  214. options: [
  215. {
  216. label: "有效",
  217. value: 1,
  218. },
  219. {
  220. label: "无效",
  221. value: 0,
  222. },
  223. ],
  224. },
  225. {
  226. label: "学时",
  227. prop: "classHours",
  228. hidden: true,
  229. },
  230. {
  231. label: "官方审核备注说明",
  232. prop: "commitPeriodRemark",
  233. hidden: true,
  234. },
  235. {
  236. label: "学习服务期",
  237. prop1: "serviceTimeType",
  238. prop2: "serviceTimeNum",
  239. prop3: "studyStartTime",
  240. prop4: "studyEndTime",
  241. scope: "studentServicePeriod",
  242. hidden: false,
  243. },
  244. ],
  245. tableData: [], //表单数据
  246. total: 0, //一共多少条
  247. dialogVisible: false,
  248. courseList: [], //详情列表
  249. activeId: "", //当前选中ID
  250. viewSign: 1,
  251. vodPlayerJs: "https://player.polyv.net/script/player.js",
  252. vodPlayerJsForTCPlayer:
  253. "https://web.sdk.qcloud.com/player/tcplayer/release/v5.1.0/tcplayer.v5.1.0.min.js",
  254. vid: "",
  255. playerJs:
  256. "https://player.polyv.net/resp/live-h5-player/latest/liveplayer.min.js",
  257. uidzb: "egsxlptzdq",
  258. vidzb: "",
  259. goodsId: "",
  260. goodsBoxName: "",
  261. };
  262. },
  263. mounted() {
  264. this.$api
  265. .coursebusinessqueryFullId({
  266. educationName: "继续教育",
  267. projectName: "造价师",
  268. businessName: "二级",
  269. })
  270. .then((res) => {
  271. this.formData.educationId = res.data.educationId;
  272. this.formData.projectId = res.data.projectId;
  273. this.formData.businessId = res.data.businessId;
  274. this.search();
  275. });
  276. },
  277. methods: {
  278. getTypeName(type) {
  279. let ast = "";
  280. switch (type) {
  281. case 1:
  282. ast = "录播";
  283. break;
  284. case 2:
  285. ast = "直播";
  286. break;
  287. case 3:
  288. ast = "回放";
  289. break;
  290. default:
  291. break;
  292. }
  293. return ast;
  294. },
  295. /**
  296. * 导出商品的课程结构
  297. */
  298. exportBtn(item) {
  299. this.$api
  300. .inquireGradegradeexportGoodsMenuExcel({ goodsId: item.goodsId })
  301. .then((res) => {
  302. this.$methodsTools.exportData(res.msg);
  303. });
  304. },
  305. /**
  306. * 关闭详情触发事件
  307. */
  308. close() {
  309. this.dialogVisible = false;
  310. this.clears();
  311. },
  312. search(int) {
  313. this.loading = true;
  314. if (int === 1) {
  315. this.formData.pageNum = 1;
  316. }
  317. var data = JSON.parse(JSON.stringify(this.formData));
  318. data.chapterNum = 1
  319. this.$api
  320. .commonfreegoodslist(data)
  321. .then((res) => {
  322. this.tableData = res.rows;
  323. this.total = res.total;
  324. this.navText.index = res.total;
  325. })
  326. .finally(() => {
  327. this.loading = false;
  328. });
  329. },
  330. /**
  331. * 点击详情
  332. */
  333. msgInfo(option) {
  334. this.goodsBoxName = option.goodsName;
  335. this.viewSign = option.viewSign;
  336. this.$api.obtainCourseSgoodsId(option.goodsId).then(async (res) => {
  337. // if (res.rows.length) {
  338. if (!res.rows.length) {
  339. this.dialogVisible = true;
  340. } else {
  341. res.rows.forEach((item, index) => {
  342. item.checked = false;
  343. });
  344. this.courseList = res.rows;
  345. await this.autoGetCourseInfos(res.rows[0], 0);
  346. this.dialogVisible = true;
  347. }
  348. // } else {
  349. // this.$message.warning("该商品暂无课程");
  350. // return;
  351. // }
  352. });
  353. },
  354. /**
  355. * 自动播放第一个视频
  356. */
  357. autoGetCourseInfos(option, int) {
  358. return new Promise((resolve, reject) => {
  359. this.$api
  360. .inquireCoursemenuListS({ courseId: option.courseId })
  361. .then((res) => {
  362. res.rows.forEach((item) => {
  363. if (item.type !== 3) {
  364. item.checked = false;
  365. }
  366. if (item.type === 3) {
  367. item.onlyId = `${option.courseId}-0-0-${item.menuId}`;
  368. }
  369. });
  370. this.$set(this.courseList[int], "children", res.rows);
  371. this.$set(this.courseList[int], "checked", true);
  372. if (this.courseList[0].children.length) {
  373. switch (this.courseList[0].children[0].type) {
  374. case 1:
  375. this.$api
  376. .inquireCourseListmodulechapter(
  377. this.courseList[0].children[0].menuId
  378. )
  379. .then((resz) => {
  380. resz.data.forEach((item) => {
  381. if (item.type !== 3) {
  382. item.checked = false;
  383. item.type = 2;
  384. item.courseId =
  385. this.courseList[0].children[0].courseId;
  386. item.menuName = item.name;
  387. }
  388. });
  389. this.$set(
  390. this.courseList[int].children[0],
  391. "children",
  392. resz.data
  393. );
  394. this.$set(
  395. this.courseList[int].children[0],
  396. "checked",
  397. true
  398. );
  399. if (this.courseList[int].children[0].children.length) {
  400. this.$api
  401. .inquireCoursechaptersectionlist(
  402. this.courseList[0].children[0].children[0].chapterId
  403. )
  404. .then((result) => {
  405. result.data.forEach((item) => {
  406. item.type = 3;
  407. item.menuName = item.name;
  408. item.onlyId = `${this.courseList[0].children[0].children[0].courseId}-${this.courseList[0].children[0].children[0].moduleId}-${this.courseList[0].children[0].children[0].chapterId}-${item.sectionId}`;
  409. });
  410. this.$set(
  411. this.courseList[int].children[0].children[0],
  412. "children",
  413. result.data
  414. );
  415. this.$set(
  416. this.courseList[int].children[0].children[0],
  417. "checked",
  418. true
  419. );
  420. if (
  421. this.courseList[int].children[0].children[0]
  422. .children.length
  423. ) {
  424. this.activeId =
  425. this.courseList[0].children[0].children[0].children[0].onlyId;
  426. this.initVideo(
  427. this.courseList[0].children[0].children[0]
  428. .children[0]
  429. );
  430. }
  431. });
  432. }
  433. });
  434. break;
  435. case 2:
  436. this.$api
  437. .inquireCoursechaptersectionlist(
  438. this.courseList[0].children[0].menuId
  439. )
  440. .then((result) => {
  441. result.data.forEach((item) => {
  442. item.type = 3;
  443. item.menuName = item.name;
  444. item.onlyId = `${this.courseList[0].children[0].courseId}-0-${this.courseList[0].children[0].menuId}-${item.sectionId}`;
  445. });
  446. this.$set(
  447. this.courseList[int].children[0],
  448. "children",
  449. result.data
  450. );
  451. this.$set(
  452. this.courseList[int].children[0],
  453. "checked",
  454. true
  455. );
  456. if (this.courseList[0].children[0].children.length) {
  457. this.activeId =
  458. this.courseList[0].children[0].children[0].onlyId;
  459. this.initVideo(
  460. this.courseList[0].children[0].children[0]
  461. );
  462. }
  463. });
  464. break;
  465. case 3:
  466. this.activeId = this.courseList[0].children[0].onlyId;
  467. this.initVideo(this.courseList[0].children[0]);
  468. break;
  469. default:
  470. break;
  471. }
  472. }
  473. resolve();
  474. });
  475. });
  476. },
  477. /**
  478. * 点击课程
  479. */
  480. getCourseInfos(option, int) {
  481. if (option.checked) {
  482. this.$set(this.courseList[int], "checked", false);
  483. } else {
  484. if (option.children) {
  485. this.$set(this.courseList[int], "checked", true);
  486. return;
  487. }
  488. this.$api
  489. .inquireCoursemenuListS({ courseId: option.courseId })
  490. .then((res) => {
  491. res.rows.forEach((item) => {
  492. if (item.type !== 3) {
  493. item.checked = false;
  494. }
  495. if (item.type === 3) {
  496. item.onlyId = `${option.courseId}-0-0-${item.menuId}`;
  497. }
  498. });
  499. this.$set(this.courseList[int], "children", res.rows);
  500. this.$set(this.courseList[int], "checked", true);
  501. });
  502. }
  503. },
  504. getSecouredInfos(option, int, ints) {
  505. if (option.type === 3) {
  506. //触发节函数
  507. this.activeId = option.onlyId;
  508. this.initVideo(option);
  509. } else {
  510. if (option.checked) {
  511. this.$set(this.courseList[int].children[ints], "checked", false);
  512. } else {
  513. if (option.children) {
  514. this.$set(this.courseList[int].children[ints], "checked", true);
  515. return;
  516. }
  517. if (option.type === 1) {
  518. this.$api
  519. .inquireCourseListmodulechapter(option.menuId)
  520. .then((res) => {
  521. res.data.forEach((item) => {
  522. if (item.type !== 3) {
  523. item.checked = false;
  524. item.type = 2;
  525. item.courseId = option.courseId;
  526. item.menuName = item.name;
  527. }
  528. });
  529. this.$set(
  530. this.courseList[int].children[ints],
  531. "children",
  532. res.data
  533. );
  534. this.$set(this.courseList[int].children[ints], "checked", true);
  535. });
  536. }
  537. if (option.type === 2) {
  538. this.$api
  539. .inquireCoursechaptersectionlist(option.menuId)
  540. .then((res) => {
  541. res.data.forEach((item) => {
  542. item.type = 3;
  543. item.menuName = item.name;
  544. item.onlyId = `${option.courseId}-0-${option.menuId}-${item.sectionId}`;
  545. });
  546. this.$set(
  547. this.courseList[int].children[ints],
  548. "children",
  549. res.data
  550. );
  551. this.$set(this.courseList[int].children[ints], "checked", true);
  552. });
  553. }
  554. }
  555. }
  556. },
  557. getTemsInfo(option, int, ints, ids) {
  558. if (option.type === 3) {
  559. //触发节函数
  560. this.initVideo(option);
  561. } else {
  562. if (option.checked) {
  563. this.$set(
  564. this.courseList[int].children[ints].children[ids],
  565. "checked",
  566. false
  567. );
  568. } else {
  569. if (option.children) {
  570. this.$set(
  571. this.courseList[int].children[ints].children[ids],
  572. "checked",
  573. true
  574. );
  575. return;
  576. }
  577. if (option.type === 2) {
  578. this.$api
  579. .inquireCoursechaptersectionlist(option.chapterId)
  580. .then((res) => {
  581. res.data.forEach((item) => {
  582. item.type = 3;
  583. item.menuName = item.name;
  584. item.onlyId = `${option.courseId}-${option.moduleId}-${option.chapterId}-${item.sectionId}`;
  585. });
  586. this.$set(
  587. this.courseList[int].children[ints].children[ids],
  588. "children",
  589. res.data
  590. );
  591. this.$set(
  592. this.courseList[int].children[ints].children[ids],
  593. "checked",
  594. true
  595. );
  596. });
  597. }
  598. }
  599. }
  600. },
  601. handleSizeChange(v) {
  602. this.formData.pageSize = v;
  603. this.formData.pageNum = 1;
  604. this.search();
  605. },
  606. handleCurrentChange(v) {
  607. this.formData.pageNum = v;
  608. this.search();
  609. },
  610. async initVideo(option) {
  611. await this.clears();
  612. this.activeId = option.onlyId;
  613. if (option.sectionType === 2) {
  614. this.vidzb = option.liveUrl;
  615. this.loadPlayerScriptzb(this.loadPlayerzb);
  616. } else {
  617. this.vid = option.recordingUrl;
  618. if(this.viewSign == 2) {
  619. this.loadPlayerScript_tencent(this.loadPlayer_tencent);
  620. }else {
  621. this.loadPlayerScript(this.loadPlayer);
  622. }
  623. }
  624. },
  625. loadPlayerScript(callback) {
  626. if (!window.polyvPlayer) {
  627. const myScript = document.createElement("script");
  628. myScript.setAttribute("src", this.vodPlayerJs);
  629. myScript.onload = callback;
  630. document.body.appendChild(myScript);
  631. } else {
  632. callback();
  633. }
  634. },
  635. loadPlayerScript_tencent(callback) {
  636. if (!window.TCPlayer) {
  637. const myScript = document.createElement("script");
  638. myScript.setAttribute("src", this.vodPlayerJsForTCPlayer);
  639. myScript.onload = callback;
  640. document.body.appendChild(myScript);
  641. } else {
  642. callback();
  643. }
  644. },
  645. loadPlayer() {
  646. var self = this;
  647. const polyvPlayer = window.polyvPlayer;
  648. self.player = polyvPlayer({
  649. wrap: "#player",
  650. width: 932,
  651. height: 627,
  652. vid: self.vid,
  653. teaser_show: 0,
  654. playsafe: function (vid, next) {
  655. self.$api.obtainpolyvvideosign(vid).then((res) => {
  656. next(res.data);
  657. });
  658. },
  659. });
  660. },
  661. loadPlayer_tencent() {
  662. var self = this;
  663. const TCPlayer = window.TCPlayer;
  664. try {
  665. let video = document.querySelector("video");
  666. video.parentNode.removeChild(video);
  667. } catch (error) {
  668. console.log("清除video标签异常");
  669. }
  670. let player_tencent = document.createElement("video");
  671. player_tencent.id = "player-tencent";
  672. document
  673. .getElementById("player")
  674. .insertAdjacentElement("afterend", player_tencent);
  675. self.$api.obtaintcvideosign(self.vid).then(res => {
  676. self.player_tencent = TCPlayer("player-tencent", {
  677. width: 932,
  678. height: 627,
  679. fileID: self.vid,
  680. appID: res.data.appID,
  681. psign: res.data.psign,
  682. licenseUrl: res.data.licenseUrl
  683. });
  684. });
  685. },
  686. /**
  687. * @param {String} 关闭视频窗口-销毁实例
  688. */
  689. clears() {
  690. return new Promise((resolve, reject) => {
  691. this.activeId = "";
  692. this.vid = "";
  693. this.vidzb = "";
  694. if (this.player) {
  695. this.player.destroy();
  696. }
  697. if (this.player_tencent) {
  698. this.player_tencent.dispose();
  699. }
  700. if (this.playerzb) {
  701. this.playerzb.destroy();
  702. }
  703. resolve();
  704. });
  705. },
  706. /**
  707. * @param {String} 直播预览
  708. */
  709. loadPlayerScriptzb(callback) {
  710. if (!window.polyvLivePlayer) {
  711. const myScript = document.createElement("script");
  712. myScript.setAttribute("src", this.playerJs);
  713. myScript.onload = callback;
  714. document.body.appendChild(myScript);
  715. } else {
  716. callback();
  717. }
  718. },
  719. loadPlayerzb() {
  720. const polyvLivePlayer = window.polyvLivePlayer;
  721. this.playerzb = polyvLivePlayer({
  722. wrap: "#playerzb",
  723. width: 932,
  724. height: 627,
  725. uid: this.uidzb,
  726. vid: this.vidzb,
  727. });
  728. },
  729. },
  730. };
  731. </script>
  732. <style lang="less" scoped>
  733. /deep/.el-button {
  734. border-radius: 8px;
  735. }
  736. /deep/.el-dialog {
  737. border-radius: 8px;
  738. .el-dialog__header {
  739. padding: 0;
  740. .hearders {
  741. height: 40px;
  742. display: flex;
  743. align-items: center;
  744. justify-content: space-between;
  745. padding: 0px 18px 0px 20px;
  746. border-bottom: 1px solid #e2e2e2;
  747. .leftTitle {
  748. font-size: 14px;
  749. font-weight: bold;
  750. color: #2f4378;
  751. }
  752. .rightBoxs {
  753. display: flex;
  754. align-items: center;
  755. img {
  756. width: 14px;
  757. height: 14px;
  758. margin-left: 13px;
  759. cursor: pointer;
  760. }
  761. }
  762. }
  763. }
  764. .el-dialog__footer {
  765. padding: 0;
  766. .dialog-footer {
  767. padding: 0px 40px;
  768. height: 70px;
  769. border-top: 1px solid #e2e2e2;
  770. display: flex;
  771. align-items: center;
  772. justify-content: flex-end;
  773. }
  774. }
  775. }
  776. .imgBox {
  777. width: 100%;
  778. // height: 210px;
  779. border: 1px solid #e2e2e2;
  780. border-radius: 8px;
  781. padding: 8px 8px 3px;
  782. display: flex;
  783. flex-direction: column;
  784. align-items: center;
  785. .imgLabel {
  786. flex: 1;
  787. width: 100%;
  788. border: 1px dotted #e2e2e2;
  789. color: #999;
  790. font-size: 14px;
  791. cursor: pointer;
  792. border-radius: 8px;
  793. .msPhoto {
  794. display: flex;
  795. justify-content: center;
  796. align-items: center;
  797. max-width: 100%;
  798. max-height: 270px;
  799. img {
  800. max-width: 100%;
  801. max-height: 270px;
  802. }
  803. }
  804. .imgbbx {
  805. display: flex;
  806. flex-direction: column;
  807. align-items: center;
  808. justify-content: center;
  809. width: 100%;
  810. height: 100%;
  811. i {
  812. font-weight: bold;
  813. margin: 14px 0;
  814. font-size: 24px;
  815. }
  816. }
  817. }
  818. p {
  819. margin: 5px 0px;
  820. }
  821. }
  822. .dis_flexs {
  823. display: flex;
  824. }
  825. .leftBoxs {
  826. width: 932px;
  827. height: 627px;
  828. border: 1px solid #eee;
  829. display: flex;
  830. align-items: center;
  831. justify-content: center;
  832. }
  833. .rightBoxslist {
  834. flex: 1;
  835. max-height: 627px;
  836. overflow-y: auto;
  837. margin-left: 10px;
  838. }
  839. .bg_ls {
  840. background-color: #eee;
  841. padding: 8px;
  842. margin-bottom: 10px;
  843. }
  844. .jus_sty {
  845. display: flex;
  846. justify-content: space-between;
  847. padding: 6px 0px;
  848. }
  849. .line_h {
  850. font-size: 14px;
  851. height: 18px;
  852. width: 18px;
  853. font-weight: bold;
  854. color: #000;
  855. background-color: rgb(153, 153, 153);
  856. line-height: 18px;
  857. text-align: center;
  858. cursor: pointer;
  859. }
  860. .firstSty {
  861. font-size: 13px;
  862. margin-bottom: 6px;
  863. cursor: pointer;
  864. &:hover {
  865. color: red;
  866. }
  867. }
  868. .typeIcon {
  869. display: inline-block;
  870. border-radius: 8px;
  871. border: 1px solid #000;
  872. padding: 0px 4px;
  873. color: #000 !important;
  874. font-size: 12px;
  875. }
  876. .itemsty {
  877. font-size: 13px;
  878. color: purple;
  879. margin-left: 14px;
  880. }
  881. </style>