CardManage.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. <template>
  2. <div class="card-manage">
  3. <div class="part-box part-box-filter part-box-flex">
  4. <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
  5. <template v-if="checkPrivilege('condition', 'condition')">
  6. <secp-select
  7. v-model="filter"
  8. defaultSelectExam
  9. @exam-default="toPage(1)"
  10. ></secp-select>
  11. <el-form-item label="题卡名称:">
  12. <el-input
  13. v-model.trim="filter.title"
  14. placeholder="名称"
  15. clearable
  16. ></el-input>
  17. </el-form-item>
  18. <el-form-item label="题卡类型:" label-width="90px">
  19. <el-select
  20. v-model="filter.cardType"
  21. style="width: 120px"
  22. placeholder="题卡类型"
  23. clearable
  24. >
  25. <el-option
  26. v-for="(val, key) in CARD_TYPE"
  27. :key="key"
  28. :value="key"
  29. :label="val"
  30. ></el-option>
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item label="创建方式:" label-width="90px">
  34. <el-select
  35. v-model="filter.createMethod"
  36. style="width: 120px"
  37. placeholder="创建方式"
  38. clearable
  39. >
  40. <el-option
  41. v-for="(val, key) in CARD_CREATE_METHOD_TYPE"
  42. :key="key"
  43. :value="key"
  44. :label="val"
  45. ></el-option>
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item label="创建时间:">
  49. <el-date-picker
  50. v-model="createTime"
  51. type="datetimerange"
  52. :picker-options="pickerOptions"
  53. range-separator="至"
  54. start-placeholder="创建开始时间"
  55. end-placeholder="创建结束时间"
  56. value-format="timestamp"
  57. align="right"
  58. unlink-panels
  59. >
  60. </el-date-picker>
  61. </el-form-item>
  62. </template>
  63. <el-form-item>
  64. <el-button
  65. v-if="checkPrivilege('button', 'select')"
  66. type="primary"
  67. @click="toPage(1)"
  68. >查询</el-button
  69. >
  70. </el-form-item>
  71. </el-form>
  72. <div class="part-box-action">
  73. <el-button
  74. v-if="checkPrivilege('button', 'add')"
  75. type="primary"
  76. icon="el-icon-circle-plus-outline"
  77. @click="toAdd"
  78. >新增</el-button
  79. >
  80. </div>
  81. </div>
  82. <div class="part-box part-box-pad">
  83. <el-table ref="TableList" :data="cardList">
  84. <el-table-column
  85. type="index"
  86. label="序号"
  87. width="70"
  88. :index="indexMethod"
  89. ></el-table-column>
  90. <el-table-column
  91. prop="title"
  92. label="题卡名称"
  93. min-width="120"
  94. ></el-table-column>
  95. <el-table-column label="课程(代码)">
  96. <template slot-scope="scope">
  97. {{ scope.row.courseName | defaultFieldFilter }}({{
  98. scope.row.courseCode | defaultFieldFilter
  99. }})
  100. </template>
  101. </el-table-column>
  102. <el-table-column prop="type" label="类型" width="100">
  103. <span slot-scope="scope">{{ scope.row.type | cardTypeFilter }}</span>
  104. </el-table-column>
  105. <el-table-column prop="createMethod" label="创建方式" width="100">
  106. <span slot-scope="scope">{{
  107. scope.row.createMethod | cardCreateMethodTypeFilter
  108. }}</span>
  109. </el-table-column>
  110. <el-table-column prop="status" label="状态" width="100">
  111. <span
  112. :class="{ 'color-danger': scope.row.status !== 'SUBMIT' }"
  113. slot-scope="scope"
  114. >{{ scope.row.status === "SUBMIT" ? "提交" : "暂存" }}</span
  115. >
  116. </el-table-column>
  117. <el-table-column prop="remark" label="备注" min-width="80">
  118. <span slot-scope="scope">{{
  119. scope.row.remark | defaultFieldFilter
  120. }}</span>
  121. </el-table-column>
  122. <el-table-column prop="createTime" label="创建时间" width="170">
  123. <span slot-scope="scope">{{
  124. scope.row.createTime | timestampFilter
  125. }}</span>
  126. </el-table-column>
  127. <el-table-column
  128. class-name="action-column"
  129. label="操作"
  130. width="230"
  131. fixed="right"
  132. >
  133. <template slot-scope="scope">
  134. <el-button
  135. v-if="checkPrivilege('link', 'preview')"
  136. class="btn-primary"
  137. type="text"
  138. @click="toPreview(scope.row)"
  139. >查看</el-button
  140. >
  141. <el-button
  142. v-if="
  143. checkPrivilege('link', 'ConvertImage') && !scope.row.imageUrls
  144. "
  145. class="btn-primary"
  146. type="text"
  147. @click="toConvertImage(scope.row)"
  148. >生成图片</el-button
  149. >
  150. <el-button
  151. v-if="
  152. checkPrivilege('link', 'ConvertImage') && scope.row.imageUrls
  153. "
  154. class="btn-primary"
  155. type="text"
  156. @click="toPreviewImage(scope.row)"
  157. >预览图片</el-button
  158. >
  159. <el-button
  160. v-if="
  161. checkPrivilege('link', 'delete') &&
  162. scope.row.type !== 'CUSTOM' &&
  163. !scope.row.used
  164. "
  165. class="btn-danger"
  166. type="text"
  167. @click="toDelete(scope.row)"
  168. >删除</el-button
  169. >
  170. <el-button
  171. v-if="
  172. checkPrivilege('link', 'edit') &&
  173. scope.row.createMethod !== 'UPLOAD'
  174. "
  175. class="btn-primary"
  176. type="text"
  177. @click="toEditCard(scope.row)"
  178. >编辑题卡</el-button
  179. >
  180. <el-button
  181. v-if="
  182. checkPrivilege('link', 'edit') &&
  183. scope.row.type !== 'CUSTOM' &&
  184. !scope.row.used
  185. "
  186. class="btn-primary"
  187. type="text"
  188. @click="toEditInfo(scope.row)"
  189. >编辑信息</el-button
  190. >
  191. <el-button
  192. v-if="checkPrivilege('link', 'Download')"
  193. class="btn-primary"
  194. type="text"
  195. @click="toDownload(scope.row)"
  196. >下载题卡</el-button
  197. >
  198. </template>
  199. </el-table-column>
  200. </el-table>
  201. <div class="part-page">
  202. <el-pagination
  203. background
  204. layout="total, sizes, prev, pager, next, jumper"
  205. :pager-count="5"
  206. :current-page="current"
  207. :total="total"
  208. :page-size="size"
  209. @current-change="toPage"
  210. @size-change="pageSizeChange"
  211. >
  212. </el-pagination>
  213. </div>
  214. </div>
  215. <!-- ModifyCardInfo -->
  216. <modify-card-info
  217. ref="ModifyCardInfo"
  218. :instance="curCard"
  219. @new-card="toNewCard"
  220. @modified="getList"
  221. ></modify-card-info>
  222. <!-- ModifyCard -->
  223. <modify-card ref="ModifyCard" @modified="getList"></modify-card>
  224. <!-- image-preview -->
  225. <simple-image-preview
  226. :cur-image="curImage"
  227. @on-prev="toPrevImage"
  228. @on-next="toNextImage"
  229. ref="SimpleImagePreview"
  230. ></simple-image-preview>
  231. <!-- card-preview-dialog -->
  232. <card-preview-dialog
  233. ref="CardPreviewDialog"
  234. :card-id="curCard.id"
  235. ></card-preview-dialog>
  236. </div>
  237. </template>
  238. <script>
  239. import {
  240. CARD_CREATE_METHOD_TYPE,
  241. CARD_TYPE,
  242. } from "../../../constants/enumerate";
  243. import {
  244. cardListPage,
  245. deleteCard,
  246. convertCardImage,
  247. downloadCardFile,
  248. } from "../api";
  249. import ModifyCardInfo from "../components/ModifyCardInfo";
  250. import pickerOptions from "@/constants/datePickerOptions";
  251. import ModifyCard from "../../card/components/ModifyCard";
  252. import SimpleImagePreview from "@/components/SimpleImagePreview";
  253. import CardPreviewDialog from "../../card/components/CardPreviewDialog.vue";
  254. import { downloadByApi } from "@/plugins/download";
  255. export default {
  256. name: "card-manage",
  257. components: {
  258. ModifyCardInfo,
  259. ModifyCard,
  260. SimpleImagePreview,
  261. CardPreviewDialog,
  262. },
  263. data() {
  264. return {
  265. filter: {
  266. semesterId: "",
  267. examId: "",
  268. courseCode: "",
  269. paperNumber: "",
  270. title: "",
  271. cardType: "",
  272. createMethod: "",
  273. createStartTime: "",
  274. createEndTime: "",
  275. },
  276. current: 1,
  277. size: this.GLOBAL.pageSize,
  278. total: 0,
  279. CARD_CREATE_METHOD_TYPE,
  280. CARD_TYPE,
  281. cardList: [],
  282. curCard: {},
  283. // date-picker
  284. createTime: [],
  285. pickerOptions,
  286. // image-preview
  287. imageList: [],
  288. curImage: {},
  289. curImageIndex: 0,
  290. };
  291. },
  292. methods: {
  293. async getList() {
  294. if (!this.checkPrivilege("list", "list")) return;
  295. const datas = {
  296. ...this.filter,
  297. pageNumber: this.current,
  298. pageSize: this.size,
  299. };
  300. if (this.createTime) {
  301. datas.createStartTime = this.createTime[0];
  302. datas.createEndTime = this.createTime[1];
  303. }
  304. const data = await cardListPage(datas);
  305. this.cardList = data.records;
  306. this.total = data.total;
  307. },
  308. toPage(page) {
  309. this.current = page;
  310. this.getList();
  311. },
  312. toAdd() {
  313. this.curCard = {};
  314. this.$refs.ModifyCardInfo.open();
  315. },
  316. toPreview(row) {
  317. this.curCard = row;
  318. this.$refs.CardPreviewDialog.open();
  319. },
  320. toNewCard(data) {
  321. this.$ls.set("prepareTcPCard", data);
  322. this.$refs.ModifyCard.open();
  323. },
  324. toEditCard(row) {
  325. this.curCard = row;
  326. this.$ls.set("prepareTcPCard", {
  327. id: row.id,
  328. title: row.title,
  329. type: row.type,
  330. createMethod: row.createMethod,
  331. makeMethod: row.makeMethod,
  332. remark: row.remark,
  333. courseCode: row.courseCode,
  334. courseName: row.courseName,
  335. cardRuleId: row.cardRuleId,
  336. attachmentId: row.attachmentId,
  337. });
  338. this.$refs.ModifyCard.open();
  339. },
  340. toEditInfo(row) {
  341. this.curCard = row;
  342. this.$refs.ModifyCardInfo.open();
  343. },
  344. toDelete(row) {
  345. this.$confirm(`确定要删除题卡【${row.title}】吗?`, "提示", {
  346. type: "warning",
  347. })
  348. .then(async () => {
  349. await deleteCard(row.id);
  350. this.$message.success("删除成功!");
  351. this.deletePageLastItem();
  352. })
  353. .catch(() => {});
  354. },
  355. async toConvertImage(row) {
  356. await convertCardImage(row.id);
  357. this.$message.success("操作成功!");
  358. },
  359. async toDownload(row) {
  360. const res = await downloadByApi(() => {
  361. return downloadCardFile(row.id);
  362. }, "").catch((e) => {
  363. this.$message.error(e || "下载失败,请重新尝试!");
  364. });
  365. if (!res) return;
  366. this.$message.success("下载成功!");
  367. },
  368. // image-preview
  369. toPreviewImage(row) {
  370. this.imageList = row.imageUrls;
  371. this.curImageIndex = 0;
  372. this.selectImage(0);
  373. this.$refs.SimpleImagePreview.open();
  374. },
  375. selectImage(index) {
  376. this.curImage = {
  377. url: this.imageList[index],
  378. filename: Math.floor(index / 2) + 1 + "-" + ((index % 2) + 1),
  379. };
  380. },
  381. toPrevImage() {
  382. if (this.curImageIndex === 0) {
  383. this.curImageIndex = this.imageList.length - 1;
  384. } else {
  385. this.curImageIndex--;
  386. }
  387. this.selectImage(this.curImageIndex);
  388. },
  389. toNextImage() {
  390. if (this.curImageIndex === this.imageList.length - 1) {
  391. this.curImageIndex = 0;
  392. } else {
  393. this.curImageIndex++;
  394. }
  395. this.selectImage(this.curImageIndex);
  396. },
  397. },
  398. };
  399. </script>