index.vue 11 KB

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