index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. <style lang="scss" scoped>
  2. .blue {
  3. background: red !important;
  4. }
  5. </style>
  6. <template>
  7. <section class="content">
  8. <h4>赛事管理</h4>
  9. <el-divider></el-divider>
  10. <el-form label-width="80px" class="filter-form" :inline="true">
  11. <el-form-item label="赛事名称">
  12. <el-input
  13. @clear="getData()"
  14. clearable
  15. v-model="queryParams.name"
  16. placeholder="请输入赛事名称"
  17. size="mini"
  18. ></el-input>
  19. </el-form-item>
  20. <el-form-item label-width="10" >
  21. <el-button type="primary" @click="getData" size="mini"
  22. >筛选</el-button
  23. >
  24. </el-form-item>
  25. <el-form-item>
  26. <el-button
  27. type="primary"
  28. plain
  29. icon="el-icon-plus"
  30. size="mini"
  31. @click="handleAdd"
  32. >新增赛事</el-button
  33. >
  34. </el-form-item>
  35. </el-form>
  36. <el-table
  37. v-loading="loading"
  38. :data="list"
  39. style="width: 100%; margin-top: 10px"
  40. height="50vh"
  41. >
  42. <el-table-column align="center" prop="name" label="赛事名称" />
  43. <el-table-column align="center" prop="join_count" label="参赛人数" />
  44. <el-table-column align="center" prop="out_count" label="退赛人数" />
  45. <el-table-column align="center" prop="groups" label="比赛分组" />
  46. <el-table-column label="赛事状态">
  47. <template slot-scope="scope">
  48. <span v-if="scope.row.match_status==1">待发布</span>
  49. <span v-if="scope.row.match_status==2">开始报名</span>
  50. <span v-if="scope.row.match_status==3">比赛中</span>
  51. <span v-if="scope.row.match_status==4">比赛结束</span>
  52. </template>
  53. </el-table-column>
  54. <el-table-column align="center" prop="start_time" label="比赛开始时间" />
  55. <el-table-column align="center" prop="end_time" label="比赛结束时间" />
  56. <el-table-column align="center" prop="signup_start_time" label="报名开始时间" />
  57. <el-table-column align="center" prop="signup_end_time" label="报名结束时间" />
  58. <el-table-column align="center" prop="player_price" label="选手价格" />
  59. <el-table-column align="center" prop="viewer_price" label="游客价格" />
  60. <el-table-column align="center" prop="date" label="操作" width="150">
  61. <template slot-scope="scope">
  62. <el-button @click="edit(scope.row)" size="mini" type="warning"
  63. >编辑</el-button
  64. >
  65. <el-button @click="del(scope.row.id)" size="mini" type="danger"
  66. >删除</el-button
  67. >
  68. </template>
  69. </el-table-column>
  70. </el-table>
  71. <Page
  72. ref="pageButton"
  73. :current="form.page"
  74. :page_size="form.page_size"
  75. :total="total"
  76. @pageChange="gopage"
  77. />
  78. <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
  79. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  80. <el-form-item label="比赛名称" prop="name">
  81. <el-input
  82. clearable
  83. v-model="form.name"
  84. placeholder="请输入比赛名称"
  85. ></el-input>
  86. </el-form-item>
  87. <el-form-item label="比赛开始时间" prop="start_time">
  88. <el-date-picker
  89. v-model="form.start_time"
  90. type="date"
  91. placeholder="选择日期"
  92. format="yyyy-MM-dd"
  93. value-format="yyyy-MM-dd"
  94. size="mini"
  95. >
  96. </el-date-picker>
  97. </el-form-item>
  98. <el-form-item label="比赛结束时间" prop="end_time">
  99. <el-date-picker
  100. v-model="form.end_time"
  101. type="date"
  102. placeholder="选择日期"
  103. format="yyyy-MM-dd"
  104. value-format="yyyy-MM-dd"
  105. size="mini"
  106. >
  107. </el-date-picker>
  108. </el-form-item>
  109. <el-form-item label="报名开始时间" prop="signup_start_time">
  110. <el-date-picker
  111. v-model="form.signup_start_time"
  112. type="date"
  113. placeholder="选择日期"
  114. format="yyyy-MM-dd"
  115. value-format="yyyy-MM-dd"
  116. size="mini"
  117. >
  118. </el-date-picker>
  119. </el-form-item>
  120. <el-form-item label="报名结束时间" prop="signup_end_time">
  121. <el-date-picker
  122. v-model="form.signup_end_time"
  123. type="date"
  124. placeholder="选择日期"
  125. format="yyyy-MM-dd"
  126. value-format="yyyy-MM-dd"
  127. size="mini"
  128. >
  129. </el-date-picker>
  130. </el-form-item>
  131. <el-form-item label="交作业开始时间" prop="post_start_time">
  132. <el-date-picker
  133. v-model="form.post_start_time"
  134. type="date"
  135. placeholder="选择日期"
  136. format="yyyy-MM-dd"
  137. value-format="yyyy-MM-dd"
  138. size="mini"
  139. >
  140. </el-date-picker>
  141. </el-form-item>
  142. <el-form-item label="选手价格" prop="player_price">
  143. <el-input
  144. clearable
  145. v-model="form.player_price"
  146. placeholder="请输入选手报名价格"
  147. ></el-input>
  148. </el-form-item>
  149. <el-form-item label="游客价格" prop="viewer_price">
  150. <el-input
  151. clearable
  152. v-model="form.viewer_price"
  153. placeholder="请输入游客报名价格"
  154. ></el-input>
  155. </el-form-item>
  156. <el-form-item label="赛事状态" prop="match_status">
  157. <el-select v-model="form.match_status" placeholder="">
  158. <el-option
  159. v-for="item in matchStatus"
  160. :key="item.value"
  161. :label="item.label"
  162. :value="item.value">
  163. </el-option>
  164. </el-select>
  165. </el-form-item>
  166. <el-form-item label="奖项内容">
  167. <el-input type="textarea" v-model="form.awards_content"></el-input>
  168. </el-form-item>
  169. <el-form-item label="报单日历" prop="calendar">
  170. <full-calendar
  171. :events="monthData"
  172. class="test-fc"
  173. first-day="1"
  174. locale="fr"
  175. @changeMonth="changeMonth"
  176. @eventClick="eventClick"
  177. @dayClick="dayClick"
  178. @moreClick="moreClick"
  179. lang="zh"
  180. >
  181. </full-calendar>
  182. </el-form-item>
  183. </el-form>
  184. <div slot="footer" class="dialog-footer">
  185. <el-button type="primary" @click="submitForm">确 定</el-button>
  186. <el-button @click="open = false">取 消</el-button>
  187. </div>
  188. </el-dialog>
  189. </section>
  190. </template>
  191. <script>
  192. import Page from "../../components/Page";
  193. import { FullCalendar } from "vue-fullcalendar";
  194. export default {
  195. components: {
  196. Page,
  197. "full-calendar": require("vue-fullcalendar"),
  198. },
  199. data() {
  200. return {
  201. monthData: [],
  202. dateRange: ["2021-12-01", "2022-01-02"],
  203. loading: false,
  204. queryParams: {
  205. page: 1,
  206. },
  207. form: {monthData:[]},
  208. list: [{}, {}],
  209. total: 0,
  210. title: "新增赛事",
  211. open: false,
  212. rules: {
  213. name: [{ required: true, message: "请输入比赛名称", trigger: "blur" }],
  214. start_time: [
  215. { required: true, message: "请输入开始时间", trigger: "blur" },
  216. ],
  217. end_time: [
  218. { required: true, message: "请输入结束时间", trigger: "blur" },
  219. ],
  220. player_price: [
  221. { required: true, message: "请输入选手报名价格", trigger: "blur" },
  222. ],
  223. viewer_price: [
  224. { required: true, message: "请输入游客报名价格", trigger: "blur" },
  225. ],
  226. },
  227. matchList: [],
  228. groupList: [],
  229. userList: [],
  230. matchStatus:[{
  231. label:"待发布",
  232. value:1,
  233. },{
  234. label:"开始报名",
  235. value:2,
  236. },{
  237. label:"比赛中",
  238. value:3,
  239. },{
  240. label:"已结束",
  241. value:4,
  242. }]
  243. };
  244. },
  245. methods: {
  246. del(id) {
  247. this.$confirm("确定删除吗?", "提示", {
  248. type: "warning",
  249. }).then(() => {
  250. this.$api.delMatch({ id: id }).then((res) => {
  251. this.$message({
  252. message: "删除成功",
  253. type: "success",
  254. });
  255. this.getData();
  256. });
  257. });
  258. },
  259. edit(row) {
  260. this.open = true;
  261. this.form = row;
  262. this.monthData = JSON.parse(row.calendar);
  263. },
  264. gopage(size) {
  265. if (size) {
  266. this.queryParams.page_size = size;
  267. }
  268. this.queryParams.page = this.$refs.pageButton.page;
  269. this.getData();
  270. },
  271. getData() {
  272. this.loading = true;
  273. this.$api.getMatchList().then((res) => {
  274. this.matchList = res.data.data;
  275. });
  276. this.$api.getGroupList().then((res) => {
  277. this.groupList = res.data.data;
  278. });
  279. this.$api.getUserSearch().then((res) => {
  280. this.userList = res.data.data;
  281. });
  282. //
  283. this.$api.getMatchs(this.queryParams).then((res) => {
  284. this.list = res.data.data.list;
  285. this.total = res.data.data.total;
  286. this.loading = false;
  287. });
  288. },
  289. handleAdd() {
  290. this.open = true;
  291. this.title = "新增赛事";
  292. this.form = {};
  293. },
  294. /** 提交按钮 */
  295. submitForm() {
  296. this.$refs["form"].validate((valid) => {
  297. if (valid) {
  298. if (this.monthData.length == 0) {
  299. this.$message.error("请设置报单日历!");
  300. return;
  301. }
  302. this.form.calendar = JSON.stringify(this.monthData);
  303. let valid_dates = [];
  304. this.monthData.forEach((item) => {
  305. valid_dates.push(item.start);
  306. });
  307. this.form.valid_dates = valid_dates;
  308. this.valid_dates = JSON.stringify(valid_dates);
  309. if (this.form.id != null) {
  310. this.$api.updateMatch(this.form).then((response) => {
  311. this.msgSuccess("修改成功");
  312. this.open = false;
  313. this.getData();
  314. });
  315. } else {
  316. this.$api.addMatch(this.form).then((response) => {
  317. this.msgSuccess("新增成功");
  318. this.open = false;
  319. this.getData();
  320. });
  321. }
  322. }
  323. });
  324. },
  325. formatDate(date) {
  326. var y = date.getFullYear();
  327. var m = date.getMonth() + 1;
  328. m = m < 10 ? "0" + m : m;
  329. var d = date.getDate();
  330. d = d < 10 ? "0" + d : d;
  331. return y + "-" + m + "-" + d;
  332. },
  333. // 选择月份
  334. changeMonth(start, end, current) {
  335. console.log("changeMonth", start, end, current);
  336. },
  337. // 点击事件
  338. eventClick(event, jsEvent, pos) {
  339. console.log("eventClick", event, jsEvent, pos);
  340. },
  341. // 点击当天
  342. dayClick(day, jsEvent) {
  343. let curDate = this.formatDate(new Date(day));
  344. let selDate = { title: "报单", start: curDate, end: curDate };
  345. if (this.monthData.filter((item) => item.start == curDate).length == 0) {
  346. this.monthData.push(selDate);
  347. } else {
  348. this.removeAaary(this.monthData,selDate)
  349. }
  350. },
  351. // 查看更多
  352. moreClick(day, events, jsEvent) {
  353. console.log("moreCLick", day, events, jsEvent);
  354. },
  355. removeAaary(_arr, _obj) {
  356. var length = _arr.length;
  357. for (var i = 0; i < length; i++) {
  358. if (_arr[i].start === _obj.start) {
  359. if (i == 0) {
  360. _arr.shift(); //删除并返回数组的第一个元素
  361. return _arr;
  362. } else if (i == length - 1) {
  363. _arr.pop(); //删除并返回数组的最后一个元素
  364. return _arr;
  365. } else {
  366. _arr.splice(i, 1); //删除下标为i的元素
  367. return _arr;
  368. }
  369. }
  370. }
  371. },
  372. },
  373. created() {
  374. this.getData();
  375. },
  376. };
  377. </script>