Course.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830
  1. <template>
  2. <section
  3. v-loading.body="fileLoading"
  4. v-loading.fullscreen="loading"
  5. element-loading-text="请稍后..."
  6. class="content"
  7. >
  8. <div class="part-box">
  9. <h2 class="part-box-title">课程列表</h2>
  10. <el-form
  11. ref="primaryForm"
  12. class="part-filter-form"
  13. inline
  14. :model="formSearch"
  15. >
  16. <el-form-item label="课程名称">
  17. <el-input v-model="formSearch.name" placeholder="请输入课程名称" />
  18. </el-form-item>
  19. <el-form-item label="课程代码">
  20. <el-input v-model="formSearch.code" placeholder="请输入课程代码" />
  21. </el-form-item>
  22. <el-form-item label="课程状态">
  23. <el-select v-model="formSearch.enable" placeholder="请选择" clearable>
  24. <el-option
  25. v-for="item in statusList"
  26. :key="item.value"
  27. :label="item.label"
  28. :value="item.value"
  29. />
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item label="层次">
  33. <el-select v-model="formSearch.level" placeholder="请选择" clearable>
  34. <el-option
  35. v-for="item in levelList"
  36. :key="item.value"
  37. :label="item.label"
  38. :value="item.value"
  39. />
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item>
  43. <el-button type="danger" @click="handleSearchBtn">查询</el-button>
  44. <el-button type="danger" plain @click="resetPrimaryForm">
  45. 重置
  46. </el-button>
  47. </el-form-item>
  48. </el-form>
  49. <div class="part-box-action">
  50. <div>
  51. <el-button
  52. type="success"
  53. plain
  54. :disabled="noBatchSelected"
  55. icon="icon icon-play"
  56. @click="enableByIds"
  57. >启用
  58. </el-button>
  59. <el-button
  60. type="danger"
  61. plain
  62. :disabled="noBatchSelected"
  63. icon="icon icon-delete"
  64. @click="disableByIds"
  65. >禁用</el-button
  66. >
  67. <el-button
  68. type="primary"
  69. plain
  70. icon="icon icon-import"
  71. @click="impCourse"
  72. >导入</el-button
  73. >
  74. <el-button
  75. type="primary"
  76. plain
  77. icon="icon icon-export"
  78. @click="exportCourse"
  79. >导出</el-button
  80. >
  81. </div>
  82. <el-button
  83. type="primary"
  84. icon="icon icon-plus-white"
  85. @click="insertCourse"
  86. >新增</el-button
  87. >
  88. </div>
  89. </div>
  90. <div class="part-box">
  91. <!-- 页面列表 -->
  92. <!-- FIXME: element-ui style bug https://github.com/ElemeFE/element/issues/16167 -->
  93. <el-table :data="tableData" resizable @selection-change="selectChange">
  94. <el-table-column type="selection" width="50" align="center" />
  95. <el-table-column prop="id" label="课程ID" width="80" />
  96. <el-table-column prop="name" label="课程名称" width="180" />
  97. <el-table-column prop="code" label="课程代码" />
  98. <el-table-column label="层次">
  99. <span slot-scope="scope">{{ getLevel(scope.row.level) }}</span>
  100. </el-table-column>
  101. <el-table-column width="50" label="状态">
  102. <span slot-scope="scope">
  103. <span v-if="scope.row.enable">
  104. <el-tooltip
  105. class="item"
  106. effect="dark"
  107. content="启用"
  108. placement="left"
  109. >
  110. <i class="icon icon-right"></i>
  111. </el-tooltip>
  112. </span>
  113. <span v-else>
  114. <el-tooltip
  115. class="item"
  116. effect="dark"
  117. content="禁用"
  118. placement="left"
  119. >
  120. <i class="icon icon-error"></i>
  121. </el-tooltip>
  122. </span>
  123. </span>
  124. </el-table-column>
  125. <el-table-column
  126. sortable
  127. prop="updateTime"
  128. label="更新时间"
  129. width="170"
  130. />
  131. <el-table-column label="操作" width="160">
  132. <div slot-scope="scope">
  133. <!-- <el-button
  134. size="mini"
  135. type="primary"
  136. plain
  137. icon="el-icon-share"
  138. @click="relation(scope.row)"
  139. >
  140. 关联专业
  141. </el-button> -->
  142. <el-button
  143. size="mini"
  144. type="primary"
  145. plain
  146. @click="editCourse(scope.row)"
  147. >
  148. 编辑
  149. </el-button>
  150. <el-button
  151. v-if="!scope.row.enable"
  152. size="mini"
  153. plain
  154. type="primary"
  155. @click="enableById(scope.row)"
  156. >
  157. 启用
  158. </el-button>
  159. <el-button
  160. v-if="scope.row.enable"
  161. size="mini"
  162. plain
  163. type="danger"
  164. @click="disableById(scope.row)"
  165. >
  166. 禁用
  167. </el-button>
  168. </div>
  169. </el-table-column>
  170. </el-table>
  171. <div class="part-page">
  172. <el-pagination
  173. :current-page="currentPage"
  174. :page-size="10"
  175. :page-sizes="[10, 20, 50, 100, 200, 300]"
  176. layout="total, sizes, prev, pager, next, jumper"
  177. :total="total"
  178. @current-change="handleCurrentChange"
  179. @size-change="handleSizeChange"
  180. >
  181. </el-pagination>
  182. </div>
  183. </div>
  184. <!-- 添加或新增课程弹出框 -->
  185. <el-dialog
  186. title="课程"
  187. width="520px"
  188. :visible.sync="courseDialog"
  189. :modal="false"
  190. append-to-body
  191. custom-class="side-dialog"
  192. @close="dialogBeforeClose"
  193. >
  194. <el-form
  195. ref="courseForm"
  196. :inline="true"
  197. inline-message
  198. class="form-tight"
  199. :model="courseForm"
  200. :rules="rules"
  201. label-width="90px"
  202. >
  203. <el-form-item label="课程代码" prop="code">
  204. <el-input
  205. v-model="courseForm.code"
  206. :disabled="null != courseForm.id"
  207. class="dialog-input-width"
  208. auto-complete="off"
  209. placeholder="请输入课程代码"
  210. />
  211. </el-form-item>
  212. <el-form-item label="课程名称" prop="name">
  213. <el-input
  214. v-model="courseForm.name"
  215. class="dialog-input-width"
  216. auto-complete="off"
  217. placeholder="请输入课程名称"
  218. />
  219. </el-form-item>
  220. <el-form-item label="层次" prop="level">
  221. <el-select
  222. v-model="courseForm.level"
  223. class="dialog-input-width"
  224. placeholder="请选择"
  225. >
  226. <el-option
  227. v-for="item in levelList"
  228. :key="item.value"
  229. :label="item.label"
  230. :value="item.value"
  231. />
  232. </el-select>
  233. </el-form-item>
  234. <el-form-item label="课程状态" prop="enable">
  235. <el-radio-group
  236. v-model="courseForm.enable"
  237. class="dialog-input-width"
  238. >
  239. <el-radio label="true">启用</el-radio>
  240. <el-radio label="false">禁用</el-radio>
  241. </el-radio-group>
  242. </el-form-item>
  243. </el-form>
  244. <div slot="footer">
  245. <el-button type="primary" @click="submitForm">保存</el-button>
  246. <el-button type="danger" plain @click="courseDialog = false"
  247. >取消</el-button
  248. >
  249. </div>
  250. </el-dialog>
  251. <!-- 导入弹窗 -->
  252. <el-dialog
  253. title="导入课程"
  254. width="520px"
  255. :visible.sync="impDialog"
  256. :modal="false"
  257. append-to-body
  258. custom-class="side-dialog"
  259. >
  260. <el-form>
  261. <el-form-item style="margin-left: 20px">
  262. <el-upload
  263. ref="upload"
  264. class="form_left"
  265. accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
  266. :action="uploadAction"
  267. :headers="uploadHeaders"
  268. :data="uploadData"
  269. :before-upload="beforeUpload"
  270. :on-progress="uploadProgress"
  271. :on-success="uploadSuccess"
  272. :on-error="uploadError"
  273. :file-list="fileList"
  274. :auto-upload="false"
  275. :multiple="false"
  276. >
  277. <el-button
  278. slot="trigger"
  279. size="small"
  280. type="primary"
  281. icon="icon icon-search-white"
  282. >
  283. 选择文件
  284. </el-button>
  285. <el-button
  286. size="small"
  287. type="primary"
  288. icon="icon icon-save-white"
  289. @click="submitUpload"
  290. >
  291. 确认上传
  292. </el-button>
  293. <el-button
  294. size="small"
  295. type="primary"
  296. icon="icon icon-delete-white"
  297. @click="removeFile"
  298. >
  299. 清空文件
  300. </el-button>
  301. <el-button
  302. size="small"
  303. type="primary"
  304. icon="icon icon-export-white"
  305. @click="exportFile"
  306. >
  307. 下载模板
  308. </el-button>
  309. <div slot="tip" class="el-upload__tip">只能上传xlsx文件</div>
  310. </el-upload>
  311. </el-form-item>
  312. </el-form>
  313. </el-dialog>
  314. <!-- 导入错误信息列表 -->
  315. <el-dialog title="错误提示" :visible.sync="errDialog">
  316. <div
  317. v-for="errMessage in errMessages"
  318. :key="errMessage.lineNum"
  319. class="text-danger"
  320. >
  321. 第{{ errMessage.lineNum }}行:{{ errMessage.msg }}
  322. </div>
  323. <span slot="footer" class="dialog-footer">
  324. <el-button @click="errDialog = false">确定</el-button>
  325. </span>
  326. </el-dialog>
  327. </section>
  328. </template>
  329. <script>
  330. import { QUESTION_API } from "@/constants/constants.js";
  331. import { ENABLE_TYPE, LEVEL_TYPE } from "../constants/constants.js";
  332. import { mapState } from "vuex";
  333. export default {
  334. name: "Course",
  335. data() {
  336. return {
  337. formSearch: {
  338. name: "",
  339. code: "",
  340. enable: "",
  341. level: "",
  342. },
  343. courseForm: {
  344. id: null,
  345. name: "",
  346. code: "",
  347. level: "ALL",
  348. enable: "true",
  349. },
  350. statusList: ENABLE_TYPE,
  351. levelList: LEVEL_TYPE,
  352. selectedCourseIds: [],
  353. tableData: [],
  354. currentPage: 1,
  355. pageSize: 10,
  356. total: 10,
  357. impDialog: false,
  358. uploadAction: QUESTION_API + "/course/import",
  359. uploadHeaders: {},
  360. uploadData: {},
  361. errMessages: [],
  362. errDialog: false,
  363. fileLoading: false,
  364. loading: false,
  365. fileList: [],
  366. courseDialog: false,
  367. relationDialog: false,
  368. rules: {
  369. name: [
  370. {
  371. required: true,
  372. message: "请输入课程名称",
  373. trigger: "blur",
  374. },
  375. ],
  376. code: [
  377. {
  378. required: true,
  379. message: "请输入课程代码",
  380. trigger: "blur",
  381. },
  382. ],
  383. level: [
  384. {
  385. required: true,
  386. message: "请选择层次",
  387. trigger: "change",
  388. },
  389. ],
  390. status: [
  391. {
  392. required: true,
  393. message: "请选择状态",
  394. trigger: "change",
  395. },
  396. ],
  397. },
  398. };
  399. },
  400. computed: {
  401. ...mapState({
  402. user: (state) => state.user,
  403. }),
  404. noBatchSelected() {
  405. return this.selectedCourseIds.length === 0;
  406. },
  407. courseIds() {
  408. var courseIds = "";
  409. for (let courseId of this.selectedCourseIds) {
  410. if (!courseIds) {
  411. courseIds += courseId;
  412. } else {
  413. courseIds += "," + courseId;
  414. }
  415. }
  416. return courseIds;
  417. },
  418. },
  419. //初始化查询
  420. created() {
  421. this.searchForm();
  422. this.uploadHeaders = {
  423. key: this.user.key,
  424. token: this.user.token,
  425. };
  426. },
  427. methods: {
  428. handleSizeChange(val) {
  429. this.pageSize = val;
  430. this.currentPage = 1;
  431. this.searchForm();
  432. },
  433. dialogBeforeClose() {
  434. this.$refs.courseForm.clearValidate();
  435. },
  436. submitAddRelationForm() {
  437. this.$refs.addRelationForm.validate((valid) => {
  438. if (valid) {
  439. var param = new URLSearchParams(this.addRelationForm);
  440. var url = QUESTION_API + "/courseSpeciatlyRelation/add?" + param;
  441. this.$httpWithMsg.post(url, this.speciallyForm).then(() => {
  442. this.$notify({
  443. type: "success",
  444. message: "添加成功!",
  445. });
  446. this.addRelationDialog = false;
  447. });
  448. } else {
  449. console.log("error submit!");
  450. return false;
  451. }
  452. });
  453. },
  454. getTag(status) {
  455. if (status == true) {
  456. return "success";
  457. } else if (status == false) {
  458. return "danger";
  459. }
  460. return status;
  461. },
  462. getLevel(level) {
  463. if (level == "ZSB") {
  464. return "专升本";
  465. } else if (level == "GQZ") {
  466. return "高起专";
  467. } else if (level == "GQB") {
  468. return "高起本";
  469. } else {
  470. return "不限";
  471. }
  472. },
  473. handleSearchBtn() {
  474. this.currentPage = 1;
  475. this.searchForm();
  476. },
  477. searchForm() {
  478. let searchLock = true;
  479. setTimeout(() => {
  480. if (searchLock) {
  481. this.loading = true;
  482. }
  483. }, 500);
  484. var param = new URLSearchParams(this.formSearch);
  485. var url =
  486. QUESTION_API +
  487. "/course/coursePage/" +
  488. (this.currentPage - 1) +
  489. "/" +
  490. this.pageSize +
  491. "?" +
  492. param;
  493. this.$httpWithMsg
  494. .get(url)
  495. .then((response) => {
  496. this.tableData = response.data.content;
  497. this.total = response.data.totalElements;
  498. })
  499. .finally(() => {
  500. searchLock = false;
  501. this.loading = false;
  502. });
  503. },
  504. handleCurrentChange(val) {
  505. this.currentPage = val;
  506. this.searchForm();
  507. },
  508. selectChange(row) {
  509. this.selectedCourseIds = [];
  510. row.forEach((element) => {
  511. this.selectedCourseIds.push(element.id);
  512. });
  513. console.log(this.selectedCourseIds);
  514. },
  515. //新增
  516. insertCourse() {
  517. this.courseForm.id = null;
  518. this.courseForm.name = null;
  519. this.courseForm.code = null;
  520. this.courseForm.level = "ALL";
  521. this.courseForm.enable = "true";
  522. this.courseDialog = true;
  523. },
  524. //修改
  525. editCourse(row) {
  526. this.courseForm = Object.assign({}, row);
  527. this.courseForm.enable = row.enable ? "true" : "false";
  528. this.courseId = row.id;
  529. this.courseDialog = true;
  530. },
  531. exportCourse() {
  532. var param = new URLSearchParams(this.formSearch);
  533. window.open(
  534. QUESTION_API +
  535. "/course/export?$key=" +
  536. this.user.key +
  537. "&$token=" +
  538. this.user.token +
  539. "&" +
  540. param
  541. );
  542. },
  543. closeCourse() {
  544. this.courseDialog = false;
  545. },
  546. saveRelation() {},
  547. //保存(新增/修改)
  548. submitForm() {
  549. var url = QUESTION_API + "/course";
  550. if (null != this.courseForm.id) {
  551. //修改
  552. this.$refs.courseForm.validate((valid) => {
  553. if (valid) {
  554. this.$httpWithMsg.put(url, this.courseForm).then(() => {
  555. this.$notify({
  556. type: "success",
  557. message: "修改成功!",
  558. });
  559. this.searchForm();
  560. this.resetForm();
  561. this.courseDialog = false;
  562. });
  563. } else {
  564. console.log("error submit!");
  565. return false;
  566. }
  567. });
  568. } else {
  569. this.$refs.courseForm.validate((valid) => {
  570. if (valid) {
  571. this.$httpWithMsg.post(url, this.courseForm).then(() => {
  572. this.$notify({
  573. type: "success",
  574. message: "添加成功",
  575. });
  576. this.searchForm();
  577. this.resetForm();
  578. this.courseDialog = false;
  579. });
  580. } else {
  581. console.log("error submit!");
  582. return false;
  583. }
  584. });
  585. }
  586. },
  587. //重置
  588. resetForm() {
  589. this.$refs.courseForm.resetFields();
  590. },
  591. resetPrimaryForm() {
  592. this.formSearch = {
  593. name: "",
  594. code: "",
  595. enable: "",
  596. level: "",
  597. };
  598. this.$refs.primaryForm.resetFields();
  599. },
  600. //删除单个数据
  601. deleteById(row) {
  602. this.$confirm("是否删除该课程?", "提示", {
  603. confirmButtonText: "确定",
  604. cancelButtonText: "取消",
  605. type: "warning",
  606. }).then(() => {
  607. var url = QUESTION_API + "/course/" + row.id;
  608. this.$httpWithMsg.delete(url).then(() => {
  609. this.$notify({
  610. type: "success",
  611. message: "删除成功!",
  612. });
  613. this.searchForm();
  614. });
  615. });
  616. },
  617. //删除多条数据
  618. deleteByIds() {
  619. if (this.selectedCourseIds.length === 0) {
  620. this.$notify({
  621. type: "warning",
  622. message: "请选择要删除的课程",
  623. });
  624. } else {
  625. this.$confirm("是否删除这些课程?", "提示", {
  626. confirmButtonText: "确定",
  627. cancelButtonText: "取消",
  628. type: "error",
  629. }).then(() => {
  630. var url = QUESTION_API + "/course/" + this.courseIds;
  631. this.$httpWithMsg.delete(url).then(() => {
  632. this.$notify({
  633. type: "success",
  634. message: "删除成功!",
  635. });
  636. this.searchForm();
  637. });
  638. });
  639. }
  640. },
  641. //启用
  642. enableByIds() {
  643. if (this.selectedCourseIds.length === 0) {
  644. this.$notify({
  645. type: "warning",
  646. message: "请选择要启用的课程",
  647. });
  648. } else {
  649. this.$confirm("是否启用这些课程?", "提示", {
  650. confirmButtonText: "确定",
  651. cancelButtonText: "取消",
  652. type: "warning",
  653. }).then(() => {
  654. var url = QUESTION_API + "/course/enable/" + this.courseIds;
  655. this.$httpWithMsg.put(url, {}).then(() => {
  656. this.$notify({
  657. type: "success",
  658. message: "启用成功!",
  659. });
  660. this.searchForm();
  661. });
  662. });
  663. }
  664. },
  665. enableById(row) {
  666. this.$confirm("是否启用该课程?", "提示", {
  667. confirmButtonText: "确定",
  668. cancelButtonText: "取消",
  669. type: "warning",
  670. }).then(() => {
  671. var url = QUESTION_API + "/course/enable/" + row.id;
  672. this.$httpWithMsg.put(url, {}).then(() => {
  673. this.$notify({
  674. type: "success",
  675. message: "启用成功!",
  676. });
  677. this.searchForm();
  678. });
  679. });
  680. },
  681. //禁用
  682. disableByIds() {
  683. if (this.selectedCourseIds.length === 0) {
  684. this.$notify({
  685. type: "warning",
  686. message: "请选择要禁用的课程",
  687. });
  688. } else {
  689. this.$confirm("是否禁用这些课程?", "提示", {
  690. confirmButtonText: "确定",
  691. cancelButtonText: "取消",
  692. type: "error",
  693. }).then(() => {
  694. var url = QUESTION_API + "/course/disable/" + this.courseIds;
  695. this.$httpWithMsg.put(url, {}).then(() => {
  696. this.$notify({
  697. type: "success",
  698. message: "禁用成功!",
  699. });
  700. this.searchForm();
  701. });
  702. });
  703. }
  704. },
  705. //禁用
  706. disableById(row) {
  707. this.$confirm("是否禁用该课程?", "提示", {
  708. confirmButtonText: "确定",
  709. cancelButtonText: "取消",
  710. type: "error",
  711. }).then(() => {
  712. var url = QUESTION_API + "/course/disable/" + row.id;
  713. return this.$httpWithMsg.put(url, {}).then(() => {
  714. this.$notify({
  715. type: "success",
  716. message: "禁用成功!",
  717. });
  718. return this.searchForm();
  719. });
  720. });
  721. },
  722. //导入
  723. impCourse() {
  724. this.impDialog = true;
  725. this.initUpload();
  726. },
  727. initUpload() {
  728. this.fileList = [];
  729. },
  730. beforeUpload(file) {
  731. console.log(file);
  732. },
  733. uploadProgress() {
  734. console.log("uploadProgress");
  735. },
  736. uploadSuccess(response) {
  737. if (!response.hasError) {
  738. this.$notify({
  739. message: "上传成功",
  740. type: "success",
  741. });
  742. this.fileLoading = false;
  743. this.impDialog = false;
  744. this.searchForm();
  745. } else {
  746. this.fileLoading = false;
  747. this.impDialog = false;
  748. this.errMessages = response.failRecords;
  749. this.errDialog = true;
  750. }
  751. },
  752. uploadError(response) {
  753. var json = JSON.parse(response.message);
  754. if (response.status == 500) {
  755. this.$notify({
  756. message: json.desc,
  757. type: "error",
  758. });
  759. }
  760. this.fileLoading = false;
  761. },
  762. //确定上传
  763. submitUpload() {
  764. if (!this.checkUpload()) {
  765. return false;
  766. }
  767. this.$refs.upload.submit();
  768. this.fileLoading = true;
  769. },
  770. checkUpload() {
  771. var fileList = this.$refs.upload.uploadFiles;
  772. if (fileList.length == 0) {
  773. this.$notify({
  774. message: "上传文件不能为空",
  775. type: "error",
  776. });
  777. return false;
  778. }
  779. if (fileList.length > 1) {
  780. this.$notify({
  781. message: "每次只能上传一个文件",
  782. type: "error",
  783. });
  784. return false;
  785. }
  786. for (let file of fileList) {
  787. if (!file.name.endsWith(".xlsx")) {
  788. this.$notify({
  789. message: "上传文件必须为xlsx格式",
  790. type: "error",
  791. });
  792. this.initUpload();
  793. return false;
  794. }
  795. }
  796. return true;
  797. },
  798. //清空文件
  799. removeFile() {
  800. // this.fileList = [];
  801. this.$refs.upload.clearFiles();
  802. },
  803. //下载模板
  804. exportFile() {
  805. window.location.href =
  806. QUESTION_API +
  807. "/course/importTemplate?$key=" +
  808. this.user.key +
  809. "&$token=" +
  810. this.user.token;
  811. },
  812. },
  813. };
  814. </script>