index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
  4. <el-form-item label="团队ID" prop="teamId">
  5. <el-input
  6. v-model="queryParams.teamId"
  7. placeholder="请输入团队ID"
  8. clearable
  9. size="small"
  10. @keyup.enter.native="handleQuery"
  11. />
  12. </el-form-item>
  13. <el-form-item label="活动ID" prop="activityId">
  14. <el-input
  15. v-model="queryParams.activityId"
  16. placeholder="请输入活动ID"
  17. clearable
  18. size="small"
  19. @keyup.enter.native="handleQuery"
  20. />
  21. </el-form-item>
  22. <el-form-item label="作品名称" prop="workName">
  23. <el-input
  24. v-model="queryParams.workName"
  25. placeholder="请输入作品名称"
  26. clearable
  27. size="small"
  28. @keyup.enter.native="handleQuery"
  29. />
  30. </el-form-item>
  31. <el-form-item label="状态" prop="status">
  32. <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
  33. <el-option
  34. v-for="dict in statusOptions"
  35. :key="dict.dictValue"
  36. :label="dict.dictLabel"
  37. :value="dict.dictValue"
  38. />
  39. </el-select>
  40. </el-form-item>
  41. <el-form-item label="审核时间">
  42. <el-date-picker
  43. v-model="daterangeAuditTime"
  44. size="small"
  45. style="width: 240px"
  46. value-format="yyyy-MM-dd"
  47. type="daterange"
  48. range-separator="-"
  49. start-placeholder="开始日期"
  50. end-placeholder="结束日期"
  51. ></el-date-picker>
  52. </el-form-item>
  53. <el-form-item label="创建时间">
  54. <el-date-picker
  55. v-model="daterangeCreatedAt"
  56. size="small"
  57. style="width: 240px"
  58. value-format="yyyy-MM-dd"
  59. type="daterange"
  60. range-separator="-"
  61. start-placeholder="开始日期"
  62. end-placeholder="结束日期"
  63. ></el-date-picker>
  64. </el-form-item>
  65. <el-form-item>
  66. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  67. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  68. </el-form-item>
  69. </el-form>
  70. <el-row :gutter="10" class="mb8">
  71. <!-- <el-col :span="1.5">-->
  72. <!-- <el-button-->
  73. <!-- type="primary"-->
  74. <!-- plain-->
  75. <!-- icon="el-icon-plus"-->
  76. <!-- size="mini"-->
  77. <!-- @click="handleAdd"-->
  78. <!-- v-hasPermi="['app:accWork:add']"-->
  79. <!-- >新增</el-button>-->
  80. <!-- </el-col>-->
  81. <!-- <el-col :span="1.5">-->
  82. <!-- <el-button-->
  83. <!-- type="success"-->
  84. <!-- plain-->
  85. <!-- icon="el-icon-edit"-->
  86. <!-- size="mini"-->
  87. <!-- :disabled="single"-->
  88. <!-- @click="handleUpdate"-->
  89. <!-- v-hasPermi="['app:accWork:edit']"-->
  90. <!-- >修改</el-button>-->
  91. <!-- </el-col>-->
  92. <!-- <el-col :span="1.5">-->
  93. <!-- <el-button-->
  94. <!-- type="danger"-->
  95. <!-- plain-->
  96. <!-- icon="el-icon-delete"-->
  97. <!-- size="mini"-->
  98. <!-- :disabled="multiple"-->
  99. <!-- @click="handleDelete"-->
  100. <!-- v-hasPermi="['app:accWork:remove']"-->
  101. <!-- >删除</el-button>-->
  102. <!-- </el-col>-->
  103. <el-col :span="1.5">
  104. <el-button
  105. type="warning"
  106. plain
  107. icon="el-icon-download"
  108. size="mini"
  109. :loading="exportLoading"
  110. @click="handleExport"
  111. v-hasPermi="['app:accWork:export']"
  112. >导出</el-button>
  113. </el-col>
  114. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  115. </el-row>
  116. <el-table border v-loading="loading" :data="activityList" @selection-change="handleSelectionChange">
  117. <el-table-column type="selection" width="55" align="center" />
  118. <el-table-column label="主键ID" align="center" prop="id" />
  119. <el-table-column label="团队ID" align="center" prop="teamId" />
  120. <el-table-column label="活动ID" align="center" prop="activityId" />
  121. <el-table-column label="作品名称" align="center" prop="workName" />
  122. <!-- <el-table-column label="封面图URL" align="center" prop="coverUrl" />-->
  123. <!-- <el-table-column label="视频URL" align="center" prop="videoUrl" />-->
  124. <el-table-column label="作品描述" align="center" prop="description" />
  125. <el-table-column label="视频时长" align="center" prop="duration" />
  126. <el-table-column label="总投票数" align="center" prop="voteCount" />
  127. <el-table-column label="观看次数" align="center" prop="viewCount" />
  128. <el-table-column label="视频" align="center" width="100">
  129. <template slot-scope="scope">
  130. <el-button
  131. size="mini"
  132. type="text"
  133. icon="el-icon-video-play"
  134. @click="handlePlayVideo(scope.row)"
  135. >播放视频</el-button>
  136. </template>
  137. </el-table-column>
  138. <el-table-column label="状态" align="center" prop="status">
  139. <template slot-scope="scope">
  140. <dict-tag :options="statusOptions" :value="scope.row.status"/>
  141. </template>
  142. </el-table-column>
  143. <el-table-column label="审核意见" align="center" prop="auditRemark" />
  144. <el-table-column label="审核时间" align="center" prop="auditTime" width="180">
  145. <template slot-scope="scope">
  146. <span>{{ parseTime(scope.row.auditTime, '{y}-{m}-{d}') }}</span>
  147. </template>
  148. </el-table-column>
  149. <el-table-column label="创建时间" align="center" prop="createdAt" width="180">
  150. <template slot-scope="scope">
  151. <span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
  152. </template>
  153. </el-table-column>
  154. <el-table-column label="更新时间" align="center" prop="updatedAt" width="180">
  155. <template slot-scope="scope">
  156. <span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
  157. </template>
  158. </el-table-column>
  159. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  160. <template slot-scope="scope">
  161. <el-button
  162. size="mini"
  163. type="text"
  164. icon="el-icon-edit"
  165. @click="handleUpdate(scope.row)"
  166. v-hasPermi="['app:accWork:edit']"
  167. >审核</el-button>
  168. <!-- <el-button-->
  169. <!-- size="mini"-->
  170. <!-- type="text"-->
  171. <!-- icon="el-icon-delete"-->
  172. <!-- @click="handleDelete(scope.row)"-->
  173. <!-- v-hasPermi="['app:accWork:remove']"-->
  174. <!-- >删除</el-button>-->
  175. </template>
  176. </el-table-column>
  177. </el-table>
  178. <pagination
  179. v-show="total>0"
  180. :total="total"
  181. :page.sync="queryParams.pageNum"
  182. :limit.sync="queryParams.pageSize"
  183. @pagination="getList"
  184. />
  185. <!-- 视频播放对话框 -->
  186. <el-dialog
  187. title="视频播放"
  188. :visible.sync="videoDialogVisible"
  189. width="800px"
  190. append-to-body
  191. >
  192. <video
  193. :src="currentVideoUrl"
  194. controls style="width: 100%"
  195. ></video>
  196. </el-dialog>
  197. <!-- 添加或修改作品对话框 -->
  198. <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
  199. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  200. <!-- <el-form-item label="团队ID" prop="teamId">-->
  201. <!-- <el-input v-model="form.teamId" placeholder="请输入团队ID" />-->
  202. <!-- </el-form-item>-->
  203. <!-- <el-form-item label="活动ID" prop="activityId">-->
  204. <!-- <el-input v-model="form.activityId" placeholder="请输入活动ID" />-->
  205. <!-- </el-form-item>-->
  206. <el-form-item label="作品名称" prop="workName">
  207. <el-input v-model="form.workName" placeholder="请输入作品名称" disabled/>
  208. </el-form-item>
  209. <!-- <el-form-item label="封面图URL" prop="coverUrl">-->
  210. <!-- <el-input v-model="form.coverUrl" type="textarea" placeholder="请输入内容" />-->
  211. <!-- </el-form-item>-->
  212. <!-- <el-form-item label="视频URL" prop="videoUrl">-->
  213. <!-- <el-input v-model="form.videoUrl" type="textarea" placeholder="请输入内容" />-->
  214. <!-- </el-form-item>-->
  215. <el-form-item label="作品描述" prop="description">
  216. <el-input v-model="form.description" type="textarea" placeholder="请输入内容" disabled/>
  217. </el-form-item>
  218. <!-- <el-form-item label="视频时长" prop="duration">-->
  219. <!-- <el-input v-model="form.duration" placeholder="请输入视频时长" />-->
  220. <!-- </el-form-item>-->
  221. <el-form-item label="总投票数" prop="voteCount">
  222. <el-input v-model="form.voteCount" placeholder="请输入总投票数" disabled/>
  223. </el-form-item>
  224. <el-form-item label="观看次数" prop="viewCount">
  225. <el-input v-model="form.viewCount" placeholder="请输入观看次数" disabled/>
  226. </el-form-item>
  227. <el-form-item label="状态" prop="status">
  228. <el-select v-model="form.status" placeholder="请选择状态">
  229. <el-option
  230. v-for="dict in statusOptions"
  231. :key="dict.dictValue"
  232. :label="dict.dictLabel"
  233. :value="parseInt(dict.dictValue)"
  234. />
  235. </el-select>
  236. </el-form-item>
  237. <el-form-item label="审核意见" prop="auditRemark">
  238. <el-input v-model="form.auditRemark" placeholder="请输入审核意见" />
  239. </el-form-item>
  240. <!-- <el-form-item label="审核时间" prop="auditTime">-->
  241. <!-- <el-date-picker clearable size="small"-->
  242. <!-- v-model="form.auditTime"-->
  243. <!-- type="date"-->
  244. <!-- value-format="yyyy-MM-dd"-->
  245. <!-- placeholder="选择审核时间">-->
  246. <!-- </el-date-picker>-->
  247. <!-- </el-form-item>-->
  248. <!-- <el-form-item label="审核时间" prop="createdAt">-->
  249. <!-- <el-date-picker clearable size="small"-->
  250. <!-- v-model="form.createdAt"-->
  251. <!-- type="date"-->
  252. <!-- value-format="yyyy-MM-dd"-->
  253. <!-- placeholder="选择审核时间">-->
  254. <!-- </el-date-picker>-->
  255. <!-- </el-form-item>-->
  256. <!-- <el-form-item label="审核时间" prop="updatedAt">-->
  257. <!-- <el-date-picker clearable size="small"-->
  258. <!-- v-model="form.updatedAt"-->
  259. <!-- type="date"-->
  260. <!-- value-format="yyyy-MM-dd"-->
  261. <!-- placeholder="选择审核时间">-->
  262. <!-- </el-date-picker>-->
  263. <!-- </el-form-item>-->
  264. </el-form>
  265. <div slot="footer" class="dialog-footer">
  266. <el-button type="primary" @click="submitForm">确 定</el-button>
  267. <el-button @click="cancel">取 消</el-button>
  268. </div>
  269. </el-dialog>
  270. </div>
  271. </template>
  272. <script>
  273. import { listActivity, getActivity, delActivity, addActivity, updateActivity, exportActivity } from "@/api/app/activity/accWork";
  274. export default {
  275. name: "AccWork",
  276. data() {
  277. return {
  278. // 遮罩层
  279. loading: true,
  280. // 视频播放对话框
  281. videoDialogVisible: false,
  282. // 当前播放的视频 URL
  283. currentVideoUrl: "",
  284. // 导出遮罩层
  285. exportLoading: false,
  286. // 选中数组
  287. ids: [],
  288. // 非单个禁用
  289. single: true,
  290. // 非多个禁用
  291. multiple: true,
  292. // 显示搜索条件
  293. showSearch: true,
  294. // 总条数
  295. total: 0,
  296. // 作品表格数据
  297. activityList: [],
  298. // 弹出层标题
  299. title: "",
  300. // 是否显示弹出层
  301. open: false,
  302. // 状态:0-待审核 1-已通过 2-已驳回 3-已下架字典
  303. statusOptions: [],
  304. // 审核时间时间范围
  305. daterangeAuditTime: [],
  306. // 审核时间时间范围
  307. daterangeCreatedAt: [],
  308. // 查询参数
  309. queryParams: {
  310. pageNum: 1,
  311. pageSize: 10,
  312. teamId: null,
  313. activityId: null,
  314. workName: null,
  315. status: null,
  316. auditTime: null,
  317. createdAt: null,
  318. },
  319. // 表单参数
  320. form: {},
  321. // 表单校验
  322. rules: {
  323. }
  324. };
  325. },
  326. created() {
  327. this.getDicts("acc_work_status").then(response => {
  328. this.statusOptions = response.data;
  329. });
  330. this.getList();
  331. },
  332. methods: {
  333. /** 播放视频 */
  334. handlePlayVideo(row) {
  335. this.currentVideoUrl = row.videoUrl;
  336. this.videoDialogVisible = true;
  337. },
  338. /** 查询作品列表 */
  339. getList() {
  340. this.loading = true;
  341. this.queryParams.params = {};
  342. if (null != this.daterangeAuditTime && '' != this.daterangeAuditTime) {
  343. this.queryParams.params["beginAuditTime"] = this.daterangeAuditTime[0];
  344. this.queryParams.params["endAuditTime"] = this.daterangeAuditTime[1];
  345. }
  346. if (null != this.daterangeCreatedAt && '' != this.daterangeCreatedAt) {
  347. this.queryParams.params["beginCreatedAt"] = this.daterangeCreatedAt[0];
  348. this.queryParams.params["endCreatedAt"] = this.daterangeCreatedAt[1];
  349. }
  350. listActivity(this.queryParams).then(response => {
  351. this.activityList = response.rows;
  352. this.total = response.total;
  353. this.loading = false;
  354. });
  355. },
  356. // 取消按钮
  357. cancel() {
  358. this.open = false;
  359. this.reset();
  360. },
  361. // 表单重置
  362. reset() {
  363. this.form = {
  364. id: null,
  365. teamId: null,
  366. activityId: null,
  367. workName: null,
  368. coverUrl: null,
  369. videoUrl: null,
  370. description: null,
  371. duration: null,
  372. voteCount: null,
  373. viewCount: null,
  374. status: 0,
  375. auditRemark: null,
  376. auditTime: null,
  377. createdAt: null,
  378. updatedAt: null
  379. };
  380. this.resetForm("form");
  381. },
  382. /** 搜索按钮操作 */
  383. handleQuery() {
  384. this.queryParams.pageNum = 1;
  385. this.getList();
  386. },
  387. /** 重置按钮操作 */
  388. resetQuery() {
  389. this.daterangeAuditTime = [];
  390. this.daterangeCreatedAt = [];
  391. this.resetForm("queryForm");
  392. this.handleQuery();
  393. },
  394. // 多选框选中数据
  395. handleSelectionChange(selection) {
  396. this.ids = selection.map(item => item.id)
  397. this.single = selection.length!==1
  398. this.multiple = !selection.length
  399. },
  400. /** 新增按钮操作 */
  401. handleAdd() {
  402. this.reset();
  403. this.open = true;
  404. this.title = "添加作品";
  405. },
  406. /** 修改按钮操作 */
  407. handleUpdate(row) {
  408. this.reset();
  409. const id = row.id || this.ids
  410. getActivity(id).then(response => {
  411. this.form = response.data;
  412. this.open = true;
  413. this.title = "审核作品";
  414. });
  415. },
  416. /** 提交按钮 */
  417. submitForm() {
  418. this.$refs["form"].validate(valid => {
  419. if (valid) {
  420. if (this.form.id != null) {
  421. updateActivity(this.form).then(response => {
  422. this.msgSuccess("修改成功");
  423. this.open = false;
  424. this.getList();
  425. });
  426. } else {
  427. addActivity(this.form).then(response => {
  428. this.msgSuccess("新增成功");
  429. this.open = false;
  430. this.getList();
  431. });
  432. }
  433. }
  434. });
  435. },
  436. /** 删除按钮操作 */
  437. handleDelete(row) {
  438. const ids = row.id || this.ids;
  439. this.$confirm('是否确认删除作品编号为"' + ids + '"的数据项?', "警告", {
  440. confirmButtonText: "确定",
  441. cancelButtonText: "取消",
  442. type: "warning"
  443. }).then(function() {
  444. return delActivity(ids);
  445. }).then(() => {
  446. this.getList();
  447. this.msgSuccess("删除成功");
  448. }).catch(() => {});
  449. },
  450. /** 导出按钮操作 */
  451. handleExport() {
  452. const queryParams = this.queryParams;
  453. this.$confirm('是否确认导出所有作品数据项?', "警告", {
  454. confirmButtonText: "确定",
  455. cancelButtonText: "取消",
  456. type: "warning"
  457. }).then(() => {
  458. this.exportLoading = true;
  459. return exportActivity(queryParams);
  460. }).then(response => {
  461. this.download(response.msg);
  462. this.exportLoading = false;
  463. }).catch(() => {});
  464. }
  465. }
  466. };
  467. </script>