index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. <!-- -->
  2. <template>
  3. <div class="m-container">
  4. <h2>
  5. <div class="squrt"></div>比赛管理
  6. </h2>
  7. <div class="m-core">
  8. <el-form :inline="true" ref="searchForm" :model="searchForm">
  9. <el-form-item prop="search">
  10. <el-input v-model.trim="searchForm.search"
  11. @keyup.enter.native="search"
  12. placeholder='选手姓名/编号/身份证号'></el-input>
  13. </el-form-item>
  14. <el-form-item prop="grade">
  15. <el-select v-model.trim="searchForm.grade"
  16. clearable
  17. placeholder="请选择年级">
  18. <el-option label="小学A组:2-3年级" value="小学A组:2-3年级"></el-option>
  19. <el-option label="小学B组:4-5年级" value="小学B组:4-5年级"></el-option>
  20. <el-option label="中学组:6-8年级" value="中学组:6-8年级"></el-option>
  21. </el-select>
  22. </el-form-item>
  23. <el-form-item prop="gender">
  24. <el-select v-model.trim="searchForm.gender"
  25. clearable
  26. placeholder="请选择性别">
  27. <el-option label="男"
  28. :value="true"></el-option>
  29. <el-option label="女"
  30. :value="false"></el-option>
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item prop="subject">
  34. <el-select v-model.trim="searchForm.subject"
  35. clearable
  36. placeholder="请选择参赛专业">
  37. <el-option label="长笛" value="长笛"></el-option>
  38. <el-option label="单簧管" value="单簧管"></el-option>
  39. <el-option label="萨克斯" value="萨克斯"></el-option>
  40. <el-option label="小号" value="小号"></el-option>
  41. <el-option label="圆号" value="圆号"></el-option>
  42. <el-option label="长号" value="长号"></el-option>
  43. <el-option label="上低音号" value="上低音号"></el-option>
  44. </el-select>
  45. </el-form-item>
  46. <el-form-item prop="prizeLevel">
  47. <el-select v-model.trim="searchForm.prizeLevel"
  48. clearable
  49. placeholder="请选择获奖级别">
  50. <el-option label="大雅之星" :value="1"></el-option>
  51. <el-option label="一等奖" :value="2"></el-option>
  52. <el-option label="二等奖" :value="3"></el-option>
  53. <el-option label="三等奖" :value="4"></el-option>
  54. <el-option label="优秀奖" :value="5"></el-option>
  55. </el-select>
  56. </el-form-item>
  57. <el-form-item prop="isShow">
  58. <el-select v-model.trim="searchForm.isShow"
  59. clearable
  60. placeholder="请选择是否展示">
  61. <el-option label="是"
  62. :value="1"></el-option>
  63. <el-option label="否"
  64. :value="0"></el-option>
  65. </el-select>
  66. </el-form-item>
  67. <el-form-item prop="isReview">
  68. <el-select v-model.trim="searchForm.isReview"
  69. clearable
  70. placeholder="请选择是否评审">
  71. <el-option label="是"
  72. :value="1"></el-option>
  73. <el-option label="否"
  74. :value="0"></el-option>
  75. </el-select>
  76. </el-form-item>
  77. <el-form-item>
  78. <el-button type="danger"
  79. @click="search">搜索</el-button>
  80. <el-button @click="onReSet"
  81. type="primary">重置</el-button>
  82. </el-form-item>
  83. </el-form>
  84. <div class="tableWrap">
  85. <el-table style="width: 100%"
  86. :header-cell-style="{background:'#EDEEF0',color:'#444'}"
  87. :data="tableList">
  88. <el-table-column align="center"
  89. prop="userId"
  90. label="选手编号"></el-table-column>
  91. <el-table-column align="center"
  92. prop="username"
  93. label="选手姓名"></el-table-column>
  94. <el-table-column align="center" width="200px"
  95. prop="idCardNo"
  96. label="身份证号码"></el-table-column>
  97. <el-table-column align="center"
  98. prop="age"
  99. label="年龄">
  100. <template slot-scope="scope">
  101. {{ scope.row.age }}岁
  102. </template>
  103. </el-table-column>
  104. <el-table-column align="center"
  105. prop="grade"
  106. label="年级"></el-table-column>
  107. <el-table-column align="center"
  108. label="性别">
  109. <template slot-scope="scope">
  110. {{ scope.row.gender ? '男' : '女' }}
  111. </template>
  112. </el-table-column>
  113. <el-table-column align="center"
  114. prop="subject"
  115. label="参赛专业"></el-table-column>
  116. <el-table-column align="center"
  117. prop="chapter"
  118. label="参赛曲目"></el-table-column>
  119. <el-table-column align="center"
  120. prop="score"
  121. label="得分"></el-table-column>
  122. <el-table-column align="center"
  123. prop="prizeLevel"
  124. label="获奖级别">
  125. <template slot-scope="scope">
  126. {{ prizeLevelList[scope.row.prizeLevel] }}
  127. </template>
  128. </el-table-column>
  129. <el-table-column align="center"
  130. prop="show"
  131. label="是否展示">
  132. <template slot-scope="scope">
  133. {{ scope.row.show ? '是' : '否' }}
  134. </template>
  135. </el-table-column>
  136. <el-table-column align="center"
  137. prop="comment"
  138. label="选手点评">
  139. <template slot-scope="scope">
  140. <tooltip :content="scope.row.comment" />
  141. </template>
  142. </el-table-column>
  143. <el-table-column align="center"
  144. label="操作">
  145. <template slot-scope="scope">
  146. <div>
  147. <el-button type="text"
  148. v-if="permission('studentCompetition/lookDetail')"
  149. @click="lookDetail(scope.row)">查看</el-button>
  150. <el-button type="text"
  151. v-if="permission('studentCompetition/update')"
  152. @click="onReview(scope.row)">评审</el-button>
  153. </div>
  154. </template>
  155. </el-table-column>
  156. </el-table>
  157. <pagination :total="pageInfo.total"
  158. :page.sync="pageInfo.page"
  159. :limit.sync="pageInfo.limit"
  160. :page-sizes="pageInfo.page_size"
  161. @pagination="getList" />
  162. </div>
  163. </div>
  164. <el-dialog title="查看"
  165. v-if="dialogVisible"
  166. :visible.sync="dialogVisible"
  167. width="900px">
  168. <match-detail :detail="detail" />
  169. </el-dialog>
  170. <el-dialog title="评审" :visible.sync="reviewStatus"
  171. width="500px">
  172. <el-form :model="form"
  173. :rules="rules"
  174. label-width="100px"
  175. ref="ruleForm">
  176. <el-form-item label="得分"
  177. prop="score">
  178. <el-input placeholder="请输入得分"
  179. type="number"
  180. @mousewheel.native.prevent
  181. v-model.trim="form.score"></el-input>
  182. </el-form-item>
  183. <el-form-item label="获奖级别"
  184. prop="prizeLevel">
  185. <el-select v-model.trim="form.prizeLevel"
  186. style="width: 100% !important;"
  187. placeholder="请选择获奖级别">
  188. <el-option label="大雅之星" :value="1"></el-option>
  189. <el-option label="一等奖" :value="2"></el-option>
  190. <el-option label="二等奖" :value="3"></el-option>
  191. <el-option label="三等奖" :value="4"></el-option>
  192. <el-option label="优秀奖" :value="5"></el-option>
  193. <el-option label="无" :value="0"></el-option>
  194. </el-select>
  195. </el-form-item>
  196. <el-form-item label="是否展示"
  197. prop="show">
  198. <el-select v-model.trim="form.show"
  199. style="width: 100% !important;"
  200. placeholder="请选择是否展示">
  201. <el-option label="是"
  202. :value="true"></el-option>
  203. <el-option label="否"
  204. :value="false"></el-option>
  205. </el-select>
  206. </el-form-item>
  207. <el-form-item label="选手点评"
  208. prop="comment">
  209. <el-input type="textarea"
  210. v-model.trim="form.comment"></el-input>
  211. </el-form-item>
  212. </el-form>
  213. <span slot="footer"
  214. class="dialog-footer">
  215. <el-button @click="reviewStatus = false">取 消</el-button>
  216. <el-button @click="onReviewSubmit('ruleForm')"
  217. type="primary">确 定</el-button>
  218. </span>
  219. </el-dialog>
  220. </div>
  221. </template>
  222. <script>
  223. import pagination from "@/components/Pagination/index";
  224. import { permission } from '@/utils/directivePage'
  225. import Tooltip from '@/components/Tooltip/index'
  226. import { studentCompetitionPage, studentCompetitionUpdate } from './api.js'
  227. import cleanDeep from 'clean-deep'
  228. import MatchDetail from './matchDetail'
  229. const validateScore = (rule, value, callBack) => {
  230. if (value == '' && typeof value == 'string' || value == null) {
  231. callBack(new Error('请输入得分'))
  232. } else if (value < 0 || value > 100) {
  233. callBack(new Error('输入得分必须在0-100之间'))
  234. } else {
  235. callBack()
  236. }
  237. }
  238. export default {
  239. components: { pagination, Tooltip, MatchDetail },
  240. data () {
  241. return {
  242. searchForm: {
  243. search: null,
  244. gender: null,
  245. subject: null,
  246. prizeLevel: null,
  247. grade: null,
  248. isShow: null,
  249. isReview: null,
  250. },
  251. tableList: [],
  252. pageInfo: {
  253. // 分页规则
  254. limit: 10, // 限制显示条数
  255. page: 1, // 当前页
  256. total: 0, // 总条数
  257. page_size: [10, 20, 40, 50] // 选择限制显示条数
  258. },
  259. prizeLevelList: {
  260. 1: '大雅之星',
  261. 2: '一等奖',
  262. 3: '二等奖',
  263. 4: '三等奖',
  264. 5: '优秀奖'
  265. },
  266. detail: null,
  267. dialogVisible: false,
  268. reviewStatus: false,
  269. form: {
  270. id: null,
  271. score: null,
  272. prizeLevel: null,
  273. show: null,
  274. comment: null
  275. },
  276. rules: {
  277. score: [{required: true, validator: validateScore, trigger: 'blur'}],
  278. // prizeLevel: [{required: true, message:'请选择获奖级别', trigger: 'blur'}],
  279. // show: [{required: true, message:'请选择是否展示', trigger: 'blur'}],
  280. }
  281. };
  282. },
  283. //生命周期 - 创建完成(可以访问当前this实例)
  284. created () { },
  285. //生命周期 - 挂载完成(可以访问DOM元素)
  286. mounted () {
  287. this.getList()
  288. },
  289. activated () {
  290. // this.getList()
  291. },
  292. methods: {
  293. permission (str) {
  294. return permission(str)
  295. },
  296. getList () {
  297. let obj = {}
  298. Object.assign(obj, this.searchForm)
  299. obj.rows = this.pageInfo.limit;
  300. obj.page = this.pageInfo.page;
  301. studentCompetitionPage(cleanDeep(obj)).then(res => {
  302. if (res.code == 200) {
  303. this.pageInfo.total = res.data.total;
  304. let rows = res.data && res.data.rows ? res.data.rows : []
  305. rows.forEach(row => {
  306. row.score = row.score == -1 ? null : row.score
  307. row.prizeLevel = row.prizeLevel == -1 ? null : row.prizeLevel
  308. });
  309. this.tableList = res.data.rows
  310. }
  311. })
  312. },
  313. search () {
  314. this.pageInfo.page = 1;
  315. this.getList();
  316. },
  317. onReSet () {
  318. this.pageInfo.page = 1;
  319. this.$refs['searchForm'].resetFields()
  320. this.getList()
  321. },
  322. lookDetail(row) {
  323. this.detail = row
  324. this.dialogVisible = true
  325. },
  326. onReview(row) {
  327. this.$nextTick(() => {
  328. this.form = {
  329. id: row.id,
  330. score: row.score,
  331. prizeLevel: row.prizeLevel,
  332. show: row.show,
  333. comment: row.comment
  334. }
  335. })
  336. this.reviewStatus = true
  337. },
  338. onReviewSubmit(formName) {
  339. this.$refs[formName].validate(async (valid) => {
  340. if(valid) {
  341. await studentCompetitionUpdate(cleanDeep(this.form)).then(res => {
  342. if(res.code == 200) {
  343. this.$message.success('评审成功')
  344. this.getList()
  345. this.reviewStatus = false
  346. } else {
  347. this.$message.error(res.msg)
  348. }
  349. })
  350. } else {
  351. return false
  352. }
  353. })
  354. },
  355. }
  356. };
  357. </script>
  358. <style lang='scss' scoped>
  359. /deep/.el-dialog__body {
  360. padding: 10px 20px;
  361. }
  362. </style>