From 54e06ab83d8fbebf91f8e0c3a621da743ac5af26 Mon Sep 17 00:00:00 2001 From: 黄何裕 <1053952480@qq.com> Date: 星期四, 08 八月 2024 09:28:06 +0800 Subject: [PATCH] 课表页面开发 --- src/views/class/index.vue | 227 ++- vue.config.js | 2 src/api/rollCall.js | 102 + src/views/curriculum/index.vue | 356 ++++- src/api/integral.js | 72 + src/views/student/index.vue | 130 + src/views/scheduleCourses/index.vue | 211 ++- src/api/work.js | 82 + src/views/rollCall/index.vue | 336 ++++- src/views/student/components/create.vue | 39 src/utils/graphql.js | 2 src/views/development/index.vue | 254 ++- src/views/integral/index.vue | 227 ++- src/views/home/components/chart.vue | 67 + src/router/index.js | 279 ++-- src/views/comment/index.vue | 244 ++- .env.development | 2 src/api/curriculum.js | 75 + src/views/home/index.vue | 41 src/api/comment.js | 77 + src/api/student.js | 63 package.json | 1 src/api/scheduleCourses.js | 68 + src/api/class.js | 78 + src/api/development.js | 70 + src/views/work/index.vue | 215 ++- 26 files changed, 2,453 insertions(+), 867 deletions(-) diff --git a/.env.development b/.env.development index 3796388..2ebbba7 100644 --- a/.env.development +++ b/.env.development @@ -2,4 +2,4 @@ ENV = 'development' # base api -VUE_APP_BASE_API = 'http://192.168.3.88:18080/dream_test' +VUE_APP_BASE_API = 'http://192.168.3.87:18081/dream' diff --git a/package.json b/package.json index 186f2b0..8ce7d9a 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "core-js": "3.6.5", "cors": "^2.8.5", "cos-js-sdk-v5": "^1.8.3", + "echarts": "^5.5.1", "element-ui": "2.13.2", "graphql": "^16.9.0", "graphql-tag": "^2.12.6", diff --git a/src/api/class.js b/src/api/class.js new file mode 100644 index 0000000..21e36e8 --- /dev/null +++ b/src/api/class.js @@ -0,0 +1,78 @@ +import apolloClient from "@/utils/graphql"; +import gql from "graphql-tag"; + +//鍏ㄩ儴 +export function getTeamDtoAll(params) { + return apolloClient.query({ + query: gql` + query vars( + $staffId: Int! + $types: [TeamType!]! + $keyword: String + $pageIn: PageIn! + ) { + findTeamDtoAll( + staffId: $staffId + types: $types + keyword: $keyword + pageIn: $pageIn + ) { + ls { + team { + id + name + voucher { + id + name + } + sessionStaffs { + id + name + } + } + playerCount + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} + +//鍋滅敤 +export function getDeletedItem(params) { + return apolloClient.query({ + query: gql` + query vars( + $staffId: Int! + $itemType: ItemType! + $keyword: String + $pageIn: PageIn! + ) { + findDeletedItem( + staffId: $staffId + itemType: $itemType + keyword: $keyword + pageIn: $pageIn + ) { + ls { + id + name + modifyTime + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} diff --git a/src/api/comment.js b/src/api/comment.js new file mode 100644 index 0000000..a41583c --- /dev/null +++ b/src/api/comment.js @@ -0,0 +1,77 @@ +import apolloClient from "@/utils/graphql"; +import gql from "graphql-tag"; + +//鍏ㄩ儴 +export function getSessionWithComment(params) { + return apolloClient.query({ + query: gql` + query vars($staffId: Int!, $keyword: String, $pageIn: PageIn!) { + findSessionWithComment( + staffId: $staffId + keyword: $keyword + pageIn: $pageIn + ) { + ls { + sessionId + courseName + beginTime + endTime + homeworkCommentId + playerCount + commentCount + staffNames + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} + +//鍋滅敤 +export function getHomeworkCommentByAuth(params) { + return apolloClient.query({ + query: gql` + query vars( + $staffId: Int! + $commentTypes: [HomeworkCommentType!]! + $keyword: String + $pageIn: PageIn! + ) { + findHomeworkCommentByAuth( + staffId: $staffId + commentTypes: $commentTypes + keyword: $keyword + pageIn: $pageIn + ) { + ls { + id + player { + id + name + } + commentType + homework { + id + name + } + lastStaffCommentId + createTime + createById + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} diff --git a/src/api/curriculum.js b/src/api/curriculum.js new file mode 100644 index 0000000..501921e --- /dev/null +++ b/src/api/curriculum.js @@ -0,0 +1,75 @@ +import apolloClient from "@/utils/graphql"; +import gql from "graphql-tag"; + +//鍏ㄩ儴 +export function getBySessionExistsOfDay(params) { + return apolloClient.query({ + query: gql` + query vars($staffId: Int!, $day: LocalDate!) { + findBySessionExistsOfDay(staffId: $staffId, day: $day) { + id + name + } + } + `, + variables: params, + }); +} + +//鍋滅敤 +export function getSubjectByCourseAndDateRange(params) { + return apolloClient.query({ + query: gql` + query vars( + $staffId: Int! + $courseIds: [Int]! + $beginDate: LocalDate! + $endDate: LocalDate! + ) { + findSubjectByCourseAndDateRange( + staffId: $staffId + courseIds: $courseIds + beginDate: $beginDate + endDate: $endDate + ) { + date + subjects { + id + name + subjectType + sessions { + id + courseId + courseName + courseType + playerMax + planId + sessionType + beginTime + endTime + staffCount + placeCount + staffNames + placeIds + placeNames + firstPlayerName + playerCount + playerNoneCount + playerApplyBookingCount + playerBookingCount + playerApplyLeaveCount + playerLeaveCount + playerLateCount + playerAbsenceCount + playerCompleteCount + description + complete + color + } + } + } + } + `, + variables: params, + }); +} diff --git a/src/api/development.js b/src/api/development.js new file mode 100644 index 0000000..0e00796 --- /dev/null +++ b/src/api/development.js @@ -0,0 +1,70 @@ +import apolloClient from "@/utils/graphql"; +import gql from "graphql-tag"; + +//鍏ㄩ儴 +export function getHomeworkByType(params) { + return apolloClient.query({ + query: gql` + query vars( + $staffId: Int! + $homeworkType: HomeworkType! + $keyword: String + $pageIn: PageIn + ) { + findHomeworkByType( + staffId: $staffId + homeworkType: $homeworkType + keyword: $keyword + pageIn: $pageIn + ) { + ls { + id + name + category + publisher { + id + name + } + createTime + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} + +//鍋滅敤 +export function getSessionHomeworkDto(params) { + return apolloClient.query({ + query: gql` + query vars($staffId: Int!, $keyword: String, $pageIn: PageIn!) { + findSessionHomeworkDto( + staffId: $staffId + keyword: $keyword + pageIn: $pageIn + ) { + ls { + sessionId + courseName + beginTime + endTime + playerCount + commentCount + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} diff --git a/src/api/integral.js b/src/api/integral.js new file mode 100644 index 0000000..459523e --- /dev/null +++ b/src/api/integral.js @@ -0,0 +1,72 @@ +import apolloClient from "@/utils/graphql"; +import gql from "graphql-tag"; + +//鍏ㄩ儴 +export function getPlayerScore(params) { + return apolloClient.query({ + query: gql` + query vars($staffId: Int!, $keyword: String, $pageIn: PageIn!) { + findPlayerScore(staffId: $staffId, keyword: $keyword, pageIn: $pageIn) { + ls { + playerId + playerName + voucherId + voucherName + qty + endDate + modifyTime + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} + +//鍋滅敤 +export function getTeamDtoAll(params) { + return apolloClient.query({ + query: gql` + query vars( + $staffId: Int! + $types: [TeamType!]! + $keyword: String + $pageIn: PageIn! + ) { + findTeamDtoAll( + staffId: $staffId + types: $types + keyword: $keyword + pageIn: $pageIn + ) { + ls { + team { + id + name + voucher { + id + name + } + sessionStaffs { + id + name + } + } + playerCount + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} diff --git a/src/api/rollCall.js b/src/api/rollCall.js new file mode 100644 index 0000000..5a599cd --- /dev/null +++ b/src/api/rollCall.js @@ -0,0 +1,102 @@ +import apolloClient from "@/utils/graphql"; +import gql from "graphql-tag"; + +//鍏ㄩ儴 +export function getPlayerAccByStaffWithRollCall(params) { + return apolloClient.query({ + query: gql` + query vars($staffId: Int!, $keyword: String, $pageIn: PageIn!) { + findPlayerAccByStaffWithRollCall( + staffId: $staffId + keyword: $keyword + pageIn: $pageIn + ) { + ls { + id + player { + id + name + } + voucher { + id + name + } + voucherType + memberType + qty + amt + endDate + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} + +//鍋滅敤 +export function getTeamByStaffWithRollCall(params) { + return apolloClient.query({ + query: gql` + query vars($staffId: Int!, $keyword: String, $pageIn: PageIn!) { + findTeamByStaffWithRollCall( + staffId: $staffId + keyword: $keyword + pageIn: $pageIn + ) { + ls { + id + name + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} + +export function getUnCompleteSession(params) { + return apolloClient.query({ + query: gql` + query vars( + $staffId: Int! + $completeTypes: [CompleteType!]! + $keyword: String + $pageIn: PageIn! + ) { + findUnCompleteSession( + staffId: $staffId + completeTypes: $completeTypes + keyword: $keyword + pageIn: $pageIn + ) { + ls { + id + courseName + teamId + teamName + beginTime + endTime + playerCount + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} diff --git a/src/api/scheduleCourses.js b/src/api/scheduleCourses.js new file mode 100644 index 0000000..a60c721 --- /dev/null +++ b/src/api/scheduleCourses.js @@ -0,0 +1,68 @@ +import apolloClient from "@/utils/graphql"; +import gql from "graphql-tag"; + +//鍏ㄩ儴 +export function getCourse(params) { + return apolloClient.query({ + query: gql` + query vars( + $staffId: Int! + $types: [CourseType] + $keyword: String + $pageIn: PageIn + ) { + findCourse( + staffId: $staffId + types: $types + keyword: $keyword + pageIn: $pageIn + ) { + ls { + id + name + courseType + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} + +//鍋滅敤 +export function getDeletedItem(params) { + return apolloClient.query({ + query: gql` + query vars( + $staffId: Int! + $itemType: ItemType! + $keyword: String + $pageIn: PageIn! + ) { + findDeletedItem( + staffId: $staffId + itemType: $itemType + keyword: $keyword + pageIn: $pageIn + ) { + ls { + id + name + modifyTime + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} diff --git a/src/api/student.js b/src/api/student.js index 739105b..6456ede 100644 --- a/src/api/student.js +++ b/src/api/student.js @@ -181,37 +181,6 @@ }); } -export function getDeleted(params) { - return apolloClient.query({ - query: gql` - query vars( - $staffId: Int! - $itemType: ItemType! - $keyword: String - $pageIn: PageIn! - ) { - findDeletedItem( - staffId: $staffId - itemType: $itemType - keyword: $keyword - pageIn: $pageIn - ) { - ls { - id - name - modifyTime - } - pageOut { - total - index - size - } - } - } - `, - variables: params, - }); -} export function getDetails(params) { return apolloClient.query({ @@ -335,3 +304,35 @@ variables: params, }); } +//宸插仠鐢� +export function getDeleted(params) { + return apolloClient.query({ + query: gql` + query vars( + $staffId: Int! + $itemType: ItemType! + $keyword: String + $pageIn: PageIn! + ) { + findDeletedItem( + staffId: $staffId + itemType: $itemType + keyword: $keyword + pageIn: $pageIn + ) { + ls { + id + name + modifyTime + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} diff --git a/src/api/work.js b/src/api/work.js new file mode 100644 index 0000000..4f0b224 --- /dev/null +++ b/src/api/work.js @@ -0,0 +1,82 @@ +import apolloClient from "@/utils/graphql"; +import gql from "graphql-tag"; + +//鍏ㄩ儴 +export function getHomeworkByType(params) { + return apolloClient.query({ + query: gql` + query vars( + $staffId: Int! + $homeworkType: HomeworkType! + $keyword: String + $pageIn: PageIn + ) { + findHomeworkByType( + staffId: $staffId + homeworkType: $homeworkType + keyword: $keyword + pageIn: $pageIn + ) { + ls { + id + name + publisher { + id + name + } + createTime + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} + +//鍋滅敤 +export function getHomeworkCommentByAuth(params) { + return apolloClient.query({ + query: gql` + query vars( + $staffId: Int! + $commentTypes: [HomeworkCommentType!]! + $keyword: String + $pageIn: PageIn! + ) { + findHomeworkCommentByAuth( + staffId: $staffId + commentTypes: $commentTypes + keyword: $keyword + pageIn: $pageIn + ) { + ls { + id + player { + id + name + } + commentType + homework { + id + name + } + lastStaffCommentId + createTime + createById + } + pageOut { + total + index + size + } + } + } + `, + variables: params, + }); +} diff --git a/src/router/index.js b/src/router/index.js index 5a0c890..ee4ea47 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -56,83 +56,108 @@ }, ], }, - { - path: "/educational", + path: "/", component: Layout, - redirect: "/educational/student", - name: "Educational", - meta: { title: "鏁欏姟", icon: "el-icon-s-help" }, + redirect: "/curriculum", children: [ { - path: "student", + path: "/curriculum", + name: "Curriculum", + component: () => import("@/views/curriculum/index"), + meta: { title: "璇捐〃", icon: "table" }, + }, + ], + }, + { + path: "/", + component: Layout, + redirect: "/student", + children: [ + { + path: "/student", name: "Student", component: () => import("@/views/student/index"), meta: { title: "瀛﹀憳", icon: "table" }, }, - { - path: "student/details", - name: "StudentDetails", - component: () => import("@/views/student/components/details.vue"), - meta: { title: "瀛﹀憳璇︽儏" }, - hidden: true, - }, - { - path: "class", - name: "Class", - component: () => import("@/views/class/index"), - meta: { title: "鐝骇", icon: "tree" }, - }, - { - path: "scheduleCourses", - name: "ScheduleCourses", - component: () => import("@/views/scheduleCourses/index"), - meta: { title: "鎺掕", icon: "table" }, - }, - { - path: "work", - name: "Work", - component: () => import("@/views/work/index"), - meta: { title: "浣滀笟", icon: "tree" }, - }, - { - path: "comment", - name: "Comment", - component: () => import("@/views/comment/index"), - meta: { title: "鐐硅瘎", icon: "table" }, - }, - { - path: "curriculum", - name: "Curriculum", - component: () => import("@/views/curriculum/index"), - meta: { title: "璇捐〃", icon: "tree" }, - }, - { - path: "table", - name: "Table", - component: () => import("@/views/student/index"), - meta: { title: "鏃ョ▼", icon: "table" }, - }, - { - path: "development", - name: "Development", - component: () => import("@/views/development/index"), - meta: { title: "鎴愰暱", icon: "tree" }, - }, - { - path: "integral", - name: "Integral", - component: () => import("@/views/integral/index"), - meta: { title: "绉垎", icon: "tree" }, - }, - { - path: "rollCall", - name: "RollCall", - component: () => import("@/views/rollCall/index"), - meta: { title: "鐐硅瘎", icon: "tree" }, - }, ], }, + // { + // path: "/educational", + // component: Layout, + // redirect: "/educational/student", + // name: "Educational", + // meta: { title: "鏁欏姟", icon: "el-icon-s-help" }, + // children: [ + // { + // path: "student", + // name: "Student", + // component: () => import("@/views/student/index"), + // meta: { title: "瀛﹀憳", icon: "table" }, + // }, + // { + // path: "student/details", + // name: "StudentDetails", + // component: () => import("@/views/student/components/details.vue"), + // meta: { title: "瀛﹀憳璇︽儏" }, + // hidden: true, + // }, + // { + // path: "class", + // name: "Class", + // component: () => import("@/views/class/index"), + // meta: { title: "鐝骇", icon: "tree" }, + // }, + // { + // path: "scheduleCourses", + // name: "ScheduleCourses", + // component: () => import("@/views/scheduleCourses/index"), + // meta: { title: "鎺掕", icon: "table" }, + // }, + // { + // path: "work", + // name: "Work", + // component: () => import("@/views/work/index"), + // meta: { title: "浣滀笟", icon: "tree" }, + // }, + // { + // path: "comment", + // name: "Comment", + // component: () => import("@/views/comment/index"), + // meta: { title: "鐐硅瘎", icon: "table" }, + // }, + // { + // path: "curriculum", + // name: "Curriculum", + // component: () => import("@/views/curriculum/index"), + // meta: { title: "璇捐〃", icon: "tree" }, + // }, + // { + // path: "table", + // name: "Table", + // component: () => import("@/views/student/index"), + // meta: { title: "鏃ョ▼", icon: "table" }, + // }, + // { + // path: "development", + // name: "Development", + // component: () => import("@/views/development/index"), + // meta: { title: "鎴愰暱", icon: "tree" }, + // }, + // { + // path: "integral", + // name: "Integral", + // component: () => import("@/views/integral/index"), + // meta: { title: "绉垎", icon: "tree" }, + // }, + // { + // path: "rollCall", + // name: "RollCall", + // component: () => import("@/views/rollCall/index"), + // meta: { title: "鐐硅瘎", icon: "tree" }, + // }, + // ], + // }, // { // path: '/form', @@ -147,66 +172,66 @@ // ] // }, - { - path: "/nested", - component: Layout, - redirect: "/nested/menu1", - name: "Nested", - meta: { - title: "Nested", - icon: "nested", - }, - children: [ - { - path: "menu1", - component: () => import("@/views/nested/menu1/index"), // Parent router-view - name: "Menu1", - meta: { title: "Menu1" }, - children: [ - { - path: "menu1-1", - component: () => import("@/views/nested/menu1/menu1-1"), - name: "Menu1-1", - meta: { title: "Menu1-1" }, - }, - { - path: "menu1-2", - component: () => import("@/views/nested/menu1/menu1-2"), - name: "Menu1-2", - meta: { title: "Menu1-2" }, - children: [ - { - path: "menu1-2-1", - component: () => - import("@/views/nested/menu1/menu1-2/menu1-2-1"), - name: "Menu1-2-1", - meta: { title: "Menu1-2-1" }, - }, - { - path: "menu1-2-2", - component: () => - import("@/views/nested/menu1/menu1-2/menu1-2-2"), - name: "Menu1-2-2", - meta: { title: "Menu1-2-2" }, - }, - ], - }, - { - path: "menu1-3", - component: () => import("@/views/nested/menu1/menu1-3"), - name: "Menu1-3", - meta: { title: "Menu1-3" }, - }, - ], - }, - { - path: "menu2", - component: () => import("@/views/nested/menu2/index"), - name: "Menu2", - meta: { title: "menu2" }, - }, - ], - }, + // { + // path: "/nested", + // component: Layout, + // redirect: "/nested/menu1", + // name: "Nested", + // meta: { + // title: "Nested", + // icon: "nested", + // }, + // children: [ + // { + // path: "menu1", + // component: () => import("@/views/nested/menu1/index"), // Parent router-view + // name: "Menu1", + // meta: { title: "Menu1" }, + // children: [ + // { + // path: "menu1-1", + // component: () => import("@/views/nested/menu1/menu1-1"), + // name: "Menu1-1", + // meta: { title: "Menu1-1" }, + // }, + // { + // path: "menu1-2", + // component: () => import("@/views/nested/menu1/menu1-2"), + // name: "Menu1-2", + // meta: { title: "Menu1-2" }, + // children: [ + // { + // path: "menu1-2-1", + // component: () => + // import("@/views/nested/menu1/menu1-2/menu1-2-1"), + // name: "Menu1-2-1", + // meta: { title: "Menu1-2-1" }, + // }, + // { + // path: "menu1-2-2", + // component: () => + // import("@/views/nested/menu1/menu1-2/menu1-2-2"), + // name: "Menu1-2-2", + // meta: { title: "Menu1-2-2" }, + // }, + // ], + // }, + // { + // path: "menu1-3", + // component: () => import("@/views/nested/menu1/menu1-3"), + // name: "Menu1-3", + // meta: { title: "Menu1-3" }, + // }, + // ], + // }, + // { + // path: "menu2", + // component: () => import("@/views/nested/menu2/index"), + // name: "Menu2", + // meta: { title: "menu2" }, + // }, + // ], + // }, // { // path: 'external-link', diff --git a/src/utils/graphql.js b/src/utils/graphql.js index e1d8377..8d5bd0e 100644 --- a/src/utils/graphql.js +++ b/src/utils/graphql.js @@ -6,7 +6,7 @@ // export default apolloClient; // 瀹氫箟涓嶅悓璇锋眰鍦板潃 -const EFORMURI = "http://192.168.3.88:18080/dream_test/graphql"; +const EFORMURI = "http://192.168.3.87:18081/dream/graphql"; const IOTURI = "https://www.9village.cn/dream_test" + "/graphql"; // import ApolloClient from 'apollo-boost' //寮曞叆apollo-boost鎻掍欢 import { ApolloClient } from "apollo-client"; diff --git a/src/views/class/index.vue b/src/views/class/index.vue index f79de1a..11fdb70 100644 --- a/src/views/class/index.vue +++ b/src/views/class/index.vue @@ -1,103 +1,178 @@ <template> - <div class="app-container"> - <el-tabs v-model="activeName" @tab-click="handleClick"> - <el-tab-pane label="鍏ㄩ儴" name="first" /> - <el-tab-pane label="宸插仠鐢�" name="fourth" /> - </el-tabs> - <div style="display: flex; flex-direction: row-reverse;"> - <div style="width: 300px;"> - <el-input - placeholder="鎸夌彮绾у悕绉版悳绱�" - v-model="input3" - class="input-with-select" - size="small" - > - <el-button slot="append" icon="el-icon-search"></el-button> - </el-input> - </div> + <div class="app-container"> + <el-tabs v-model="activeName" @tab-click="fetchData"> + <el-tab-pane label="鍏ㄩ儴" name="all" /> + <el-tab-pane label="宸插仠鐢�" name="deactivated" /> + </el-tabs> + <div style="display: flex; flex-direction: row-reverse"> + <div style="width: 300px"> + <el-input + placeholder="鎸夌彮绾у悕绉版悳绱�" + v-model="data.keyword" + class="input-with-select" + size="small" + > + <el-button + slot="append" + icon="el-icon-search" + @click="fetchData" + ></el-button> + </el-input> </div> + </div> + <div style="height: calc(100vh - 248px)"> <el-table v-loading="listLoading" :data="list" element-loading-text="Loading" fit + v-if="activeName == 'all'" + height="100%" > <el-table-column label="鐝骇鍚嶇О"> - <template slot-scope=""> xxxxx </template> + <template slot-scope="scope"> + <el-link type="primary" :underline="false">{{ + scope.row.team.name + }}</el-link> + </template> </el-table-column> - <el-table-column label="鐝骇浜烘暟" width="80"> - <template slot-scope=""> 鐢� </template> + <el-table-column label="鐝骇浜烘暟" width="200"> + <template slot-scope="scope">{{ scope.row.playerCount }} 浜�</template> </el-table-column> <el-table-column label="璇惧寘/浼氬憳鍗�" width="200"> - <template slot-scope=""> 10086 </template> - </el-table-column> - <el-table-column label="榛樿璇炬秷" width="200"> - <template slot-scope=""> asfiaf </template> + <template slot-scope="scope">{{ + scope.row.team.voucher.name + }}</template> </el-table-column> <el-table-column label="鏁欏笀" width=""> - <template slot-scope=""> asfiaf </template> + <template slot-scope="scope">{{ + concatenateArray(scope.row.team.sessionStaffs) + }}</template> </el-table-column> - <el-table-column label="瀛﹀憳浜烘暟" width=""> - <template slot-scope=""> asfiaf </template> + </el-table> + <el-table + v-loading="listLoading" + :data="list" + element-loading-text="Loading" + fit + height="100%" + v-else + > + <el-table-column label="鐝骇鍚嶇О"> + <template slot-scope="scope">{{ scope.row.name }} </template> </el-table-column> - <!-- <el-table-column label="Author" width="110" align="center"> - <template slot-scope="scope"> - <span>{{ scope.row.author }}</span> + <el-table-column label="鍋滅敤鏃堕棿"> + <template slot-scope="scope">{{ scope.row.modifyTime }} </template> + </el-table-column> + <el-table-column label="鎿嶄綔" width="200"> + <template slot-scope=""> + <el-link type="primary" :underline="false">鎭㈠</el-link> </template> </el-table-column> - <el-table-column label="Pageviews" width="110" align="center"> - <template slot-scope="scope"> - {{ scope.row.pageviews }} - </template> - </el-table-column> - <el-table-column class-name="status-col" label="Status" width="110" align="center"> - <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter">{{ scope.row.status }}</el-tag> - </template> - </el-table-column> - <el-table-column align="center" prop="created_at" label="Display_time" width="200"> - <template slot-scope="scope"> - <i class="el-icon-time" /> - <span>{{ scope.row.display_time }}</span> - </template> - </el-table-column> --> </el-table> </div> - </template> - - <script> - import { getList } from "@/api/table"; - - export default { - filters: { - statusFilter(status) { - const statusMap = { - published: "success", - draft: "gray", - deleted: "danger", - }; - return statusMap[status]; - }, - }, - data() { - return { - list: null, - listLoading: true, - activeName: "first", + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> + </div> +</template> + +<script> +import { getTeamDtoAll, getDeletedItem } from "@/api/class"; + +export default { + filters: { + statusFilter(status) { + const statusMap = { + published: "success", + draft: "gray", + deleted: "danger", }; + return statusMap[status]; }, - created() { - this.fetchData(); + }, + data() { + return { + list: null, + listLoading: true, + activeName: "all", + total: 0, + data: { + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: "", + pageIn: { + //鍙�夛紝濡傛灉鏄垎椤垫煡璇紝闇�瑕佸姞涓娿�� + index: 0, //蹇呴�� + size: 10, //姣忛〉鐨勫ぇ灏忋�傞粯璁�20 + sorts: { + name: "name", //鎺掑簭瀛楁鍚嶇О + direction: "ASC", //鎺掑簭鏂瑰悜 + }, + }, + types: ["NORMAL"], + }, + }; + }, + created() { + this.fetchData(); + }, + methods: { + handleSizeChange(val) { + this.data.pageIn.size = val; + this.fetchData("pageIn"); }, - methods: { - fetchData() { + handleCurrentChange(val) { + this.data.pageIn.index = val - 1; + this.fetchData("pageIn"); + }, + fetchData(_val) { + if (_val !== "pageIn") { + this.data.pageIn.index = 0; + this.data.pageIn.size = 10; + } + this.listLoading = true; + if (this.activeName == "all") { this.listLoading = true; - getList().then((response) => { - this.list = response.data.items; + getTeamDtoAll(this.data).then((response) => { + this.list = response.data.findTeamDtoAll.ls; + this.total = response.data.findTeamDtoAll.pageOut.total; this.listLoading = false; }); - }, + } else if (this.activeName == "deactivated") { + this.listLoading = true; + let data = { + itemType: "TEAM", + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: this.data.keyword, + pageIn: { ...this.data.pageIn }, + }; + getDeletedItem(data).then((response) => { + this.list = response.data.findDeletedItem.ls; + this.total = response.data.findDeletedItem.pageOut.total; + this.listLoading = false; + }); + } }, - }; - </script> - \ No newline at end of file + concatenateArray(arr) { + let result = ""; + for (let i = 0; i < arr.length; i++) { + if (i == 0) { + result += arr[i].name; + } else { + result += "," + arr[i].name; + } + } + return result; + }, + }, +}; +</script> diff --git a/src/views/comment/index.vue b/src/views/comment/index.vue index 0bcef35..004ad03 100644 --- a/src/views/comment/index.vue +++ b/src/views/comment/index.vue @@ -1,118 +1,190 @@ <template> - <div class="app-container"> - <el-tabs v-model="activeName" @tab-click="handleClick"> - <el-tab-pane label="璇剧▼" name="first"> - <div style="display: flex; flex-direction: row-reverse"> - <div style="width: 300px"> - <el-input - placeholder="鎸夎绋嬪悕绉版悳绱�" - v-model="input3" - class="input-with-select" - size="small" - > - <el-button slot="append" icon="el-icon-search"></el-button> - </el-input> - </div> + <div class="app-container"> + <el-tabs v-model="activeName" @tab-click="fetchData"> + <el-tab-pane label="璇惧悗鐐硅瘎" name="comment"> + <div style="display: flex; flex-direction: row-reverse"> + <div style="width: 300px"> + <el-input + placeholder="鎸夎绋嬪悕绉版悳绱�" + v-model="data.keyword" + class="input-with-select" + size="small" + > + <el-button + slot="append" + icon="el-icon-search" + @click="fetchData" + ></el-button> + </el-input> </div> + </div> + <div style="height: calc(100vh - 248px)"> <el-table v-loading="listLoading" :data="list" element-loading-text="Loading" fit + height="100%" > <el-table-column label="璇剧▼鍚嶇О"> - <template slot-scope=""> xxxxx </template> + <template slot-scope="scope"> + <el-link type="primary" :underline="false">{{ + scope.row.courseName + }}</el-link> + </template> </el-table-column> - <el-table-column label="鏃堕棿" width="80"> - <template slot-scope=""> 鐢� </template> + <el-table-column label="璇剧▼鏃堕棿" width=""> + <template slot-scope="scope"> + {{ scope.row.beginTime }} + </template> </el-table-column> - <el-table-column label="鏁欏笀" width="200"> - <template slot-scope=""> 10086 </template> + <el-table-column label="鏁欏笀" width="" prop="staffNames"> </el-table-column> - <el-table-column label="瀛﹀憳鏁�" width="200"> - <template slot-scope=""> asfiaf </template> + <el-table-column label="瀛﹀憳鏁�" width="" prop="playerCount"> </el-table-column> - <el-table-column label="宸茬偣璇勬暟" width=""> - <template slot-scope=""> asfiaf </template> - </el-table-column> - <el-table-column label="鎿嶄綔" width=""> - <template slot-scope=""> 鐐硅瘎 </template> + <el-table-column label="宸茬偣璇勬暟" width="" prop="commentCount"> </el-table-column> </el-table> - </el-tab-pane> - <el-tab-pane label="鍏朵粬" name="fourth"> - <div style="display: flex; flex-direction: row-reverse"> - <div style="width: 300px"> - <el-input - placeholder="鎸夊鍛樺悕绉版悳绱�" - v-model="input3" - class="input-with-select" - size="small" - > - <el-button slot="append" icon="el-icon-search"></el-button> - </el-input> - </div> + </div> + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> + </el-tab-pane> + <el-tab-pane label="鍏朵粬" name="other"> + <div style="display: flex; flex-direction: row-reverse"> + <div style="width: 300px"> + <el-input + placeholder="鎸夊鍛樺悕绉版悳绱�" + v-model="data.keyword" + class="input-with-select" + size="small" + > + <el-button slot="append" icon="el-icon-search" @click="fetchData"></el-button> + </el-input> </div> + </div> + <div style="height: calc(100vh - 248px)"> <el-table v-loading="listLoading" :data="list" element-loading-text="Loading" fit + height="100%" > - <el-table-column label="瀛﹀憳"> - <template slot-scope=""> xxxxx </template> + <el-table-column label="瀛﹀憳鍚嶇О"> + <template slot-scope="scope"> + <el-link type="primary" :underline="false">{{ + scope.row.player.name + }}</el-link> + </template> </el-table-column> - <el-table-column label="鏃堕棿" width="80"> - <template slot-scope=""> 鐢� </template> - </el-table-column> - <el-table-column label="鏍囬" width="200"> - <template slot-scope=""> 10086 </template> - </el-table-column> - <el-table-column label="鐐硅瘎鑰佸笀" width="200"> - <template slot-scope=""> asfiaf </template> - </el-table-column> - <el-table-column label="鎿嶄綔" width=""> - <template slot-scope=""> 鏌ョ湅 </template> + <el-table-column label="鐐硅瘎鏃堕棿" width="" prop="createTime"> </el-table-column> </el-table> - </el-tab-pane> - </el-tabs> - </div> - </template> - - <script> - import { getList } from "@/api/table"; - - export default { - filters: { - statusFilter(status) { - const statusMap = { - published: "success", - draft: "gray", - deleted: "danger", - }; - return statusMap[status]; - }, - }, - data() { - return { - list: null, - listLoading: true, - activeName: "first", + </div> + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> + </el-tab-pane> + </el-tabs> + </div> +</template> + +<script> +import { getSessionWithComment, getHomeworkCommentByAuth } from "@/api/comment"; + +export default { + filters: { + statusFilter(status) { + const statusMap = { + published: "success", + draft: "gray", + deleted: "danger", }; + return statusMap[status]; }, - created() { - this.fetchData(); + }, + data() { + return { + list: null, + listLoading: true, + activeName: "comment", + total: 0, + data: { + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: "", + pageIn: { + //鍙�夛紝濡傛灉鏄垎椤垫煡璇紝闇�瑕佸姞涓娿�� + index: 0, //蹇呴�� + size: 10, //姣忛〉鐨勫ぇ灏忋�傞粯璁�20 + sorts: { + name: "begin_time", //鎺掑簭瀛楁鍚嶇О + direction: "ASC", //鎺掑簭鏂瑰悜 + }, + }, + }, + }; + }, + created() { + this.fetchData(); + }, + methods: { + handleSizeChange(val) { + this.data.pageIn.size = val; + this.fetchData("pageIn"); }, - methods: { - fetchData() { + handleCurrentChange(val) { + this.data.pageIn.index = val - 1; + this.fetchData("pageIn"); + }, + fetchData(_val) { + if (_val !== "pageIn") { + this.data.pageIn.index = 0; + this.data.pageIn.size = 10; + } + this.listLoading = true; + if (this.activeName == "comment") { this.listLoading = true; - getList().then((response) => { - this.list = response.data.items; + getSessionWithComment(this.data).then((response) => { + this.list = response.data.findSessionWithComment.ls; + this.total = response.data.findSessionWithComment.pageOut.total; this.listLoading = false; }); - }, + } else if (this.activeName == "other") { + this.listLoading = true; + let data = { + commentTypes: ["DIRECT_COMMENT"], + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: this.data.keyword, + pageIn: { ...this.data.pageIn }, + }; + data.pageIn.sorts.name = "createTime"; + data.pageIn.sorts.direction = "DESC"; + getHomeworkCommentByAuth(data).then((response) => { + this.list = response.data.findHomeworkCommentByAuth.ls; + this.total = response.data.findHomeworkCommentByAuth.pageOut.total; + this.listLoading = false; + }); + } }, - }; - </script> - \ No newline at end of file + }, +}; +</script> diff --git a/src/views/curriculum/index.vue b/src/views/curriculum/index.vue index c1fbb06..de71a49 100644 --- a/src/views/curriculum/index.vue +++ b/src/views/curriculum/index.vue @@ -1,131 +1,271 @@ <template> - <div class="app-container"> - <el-tabs v-model="activeName" @tab-click="handleClick"> - <el-tab-pane label="璇剧▼" name="first" /> - <el-tab-pane label="鏁欏笀" name="fourth" /> - <el-tab-pane label="鍦哄湴" name="xxx" /> + <div style="padding: 20px"> + <el-tabs v-model="activeName" @tab-click="getCourses"> + <el-tab-pane label="璇剧▼" name="course" /> + <el-tab-pane label="鏁欏笀" name="teacher" /> + <el-tab-pane label="鍦哄湴" name="site" /> </el-tabs> - <div> - <div style="width: 300px"> - <el-date-picker v-model="timeData" type="date" placeholder="閫夋嫨鏃ユ湡"> - </el-date-picker> - </div> - <div style="display: flex"> - <div class="timetable-b w100"> - <table class="timetable-content w100"> - <thead> - <tr> - <th></th> - <th v-for="(item1, index1) in weeks" :key="index1"> - xxx - </th> - </tr> - </thead> - <tbody> - <tr v-for="(item2, index2) in maxCourseLength" :key="index2"> - <td> - <p>{{ xxx }}</p> - </td> - <template v-for="(item3, index3) in weeks"> - <td - :key="index3" - :rowspan=" - showData(index3, index2 + 1).subject && - showData(index3, index2).subject === - showData(index3, index2 + 1).subject - ? 2 - : '' - " - :style="[ - { - display: - showData(index3, index2 - 1).subject && - showData(index3, index2 - 1).subject === - showData(index3, index2).subject - ? 'none' - : '', - }, - ]" - > - <div - class="dmsjandjs-b" - :style="[ - { - background: showData(index3, index2).index - ? getRandomColor() - : '#FFFFFF', - }, - { color: '#fff' }, - { borderRadius: '15px' }, - { padding: '12px' }, - { height: '100%' }, - ]" - > - <p> - {{ showData(index3, index2).startTime }} - {{ showData(index3, index2).startTime ? "-" : "" }} - {{ showData(index3, index2).endTime }} - </p> - <p>{{ showData(index3, index2).subject }}</p> - <p>{{ showData(index3, index2).major }}</p> - <p>{{ showData(index3, index2).class }}</p> - </div> - </td> - </template> - </tr> - </tbody> - </table> + <div style="margin-bottom: 20px"> + <el-date-picker + v-model="time" + type="date" + size="small" + placeholder="閫夋嫨鏃ユ湡" + @change="getCourses" + > + </el-date-picker> + </div> + <el-row> + <el-col :span="1" style="margin-top: 7px" + ><div + class="" + v-for="i in tiemData" + :key="i" + style="display: flex; flex-direction: row-reverse; margin: 32px 10px" + > + {{ i }} + </div></el-col + > + <el-col :span="23"> + <div class="table_box"> + <div + :style="{ display: 'flex', width: dataList.length * 200 + 'px' }" + > + <div + v-for="(i, index) in dataList" + :key="i.id" + class="header_box" + :id="0 < index ? 'header_boxA' : ''" + > + {{ i.name }} + </div> + </div> + <div style="display: flex; position: relative"> + <div v-for="(i, index) in dataList" :key="i.id"> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div class="body_box" :id="0 < index ? 'header_boxA' : ''"></div> + <div + v-for="(j, index) in i.sessions" + :key="index" + :style="{ + width: '200px', + backgroundColor: j.color, + position: 'absolute', + top: getTop(j.beginTime), + height: getHeight(j.beginTime, j.endTime), + borderRadius: '5px', + fontSize: '15px', + }" + @click="lookDetails(j)" + > + <div>{{ j.staffNames }}</div> + <span>{{ j.placeNames }}</span> + <div> + 瀛﹀憳锛歿{ j.playerCount }}浜� 璇峰亣锛歿{ j.placeCount }}浜� + </div> + </div> + </div> + </div> + </div> + </el-col> + </el-row> + <el-drawer :title="drawerTime" :visible.sync="drawer" direction="rtl"> + <div v-if="drawerIf"> + <div style="display: flex; justify-content: center"> + <i class="el-icon-time"></i> {{ headerTime }} + </div> + <div> + <el-form ref="form" label-width="80px"> + <el-form-item label="璇剧▼"> + <span>{{ formData.courseName }}</span> + </el-form-item> + <el-form-item label="鑰佸笀"> + <span>{{ formData.staffNames }}</span> + </el-form-item> + <el-form-item label="鍦哄湴"> + <span>{{ formData.placeNames }}</span> + </el-form-item> + <el-form-item label="瀛﹀憳"> + <div style="display: flex; align-items: center;"> + <el-progress + style="width: 300px" + :percentage=" + Math.floor( + (formData.playerCount / formData.playerMax) * 100 + ) + " + ></el-progress> + <span + >瀛﹀憳{{ formData.playerCount }}浜�/涓婇檺{{ + formData.playerMax + }}浜�</span + > + </div> + </el-form-item> + </el-form> </div> </div> - </div> + </el-drawer> </div> </template> - <script> -import { getList } from "@/api/table"; - +import { + getBySessionExistsOfDay, + getSubjectByCourseAndDateRange, +} from "@/api/curriculum"; export default { - filters: { - statusFilter(status) { - const statusMap = { - published: "success", - draft: "gray", - deleted: "danger", - }; - return statusMap[status]; + props: { + // 涓嬪崍鑺傛鏁� + afternoonLength: { + type: [String, Number], + default: 6, }, + // 鎬昏妭娆� + length: { + type: [String, Number], + default: 14, + }, + // 璇捐〃鏁版嵁 + // events: { + // type: Array, + // default: this.events1, + // }, }, data() { return { - list: null, - listLoading: true, - activeName: "first", - timeData: new Date(), + // 璇剧▼琛ㄦ暟鎹� + tiemData: [ + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + ], + time: new Date(), + dataList: [], + drawerTime: new Date(), + drawerIf: true, + drawer: false, + headerTime: "", + formData: {}, + activeName:'course' }; }, + mounted() { + this.mergeData(); + }, + watch: { + events: { + handler(newVal, oldVal) { + this.mergeData(); + }, + deep: true, + }, + }, created() { - this.fetchData(); + this.getCourses(); }, methods: { - fetchData() { - this.listLoading = true; - getList().then((response) => { - this.list = response.data.items; - this.listLoading = false; + getCourses() { + let data = { + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + day: this.getYMD(this.time), + }; + getBySessionExistsOfDay(data).then((res) => { + let courseIds = []; + res.data.findBySessionExistsOfDay.map((i) => { + courseIds.push(i.id); + }); + let params = { + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + beginDate: this.getYMD(this.time), + endDate: this.getYMD(this.time), + courseIds: courseIds, + }; + getSubjectByCourseAndDateRange(params).then((res) => { + this.dataList = res.data.findSubjectByCourseAndDateRange[0].subjects; + }); }); }, - //闅忔満鑾峰彇棰滆壊 - getRandomColor() { - let colorList = this.colorList; - let colorRandom = Math.floor(Math.random() * colorList.length + 1) - 1; - let color; - for (let i = 0; colorList.length > i; i++) { - if (i == colorRandom) { - color = colorList[i]; - } - } - return color; + getYMD(time) { + const year = time.getFullYear(); + const month = (time.getMonth() + 1).toString().padStart(2, "0"); + const day = time.getDate().toString().padStart(2, "0"); + return `${year}/${month}/${day}`; + }, + getTop(time) { + let tiemData = new Date(time); + return (tiemData.getHours() - 7 + tiemData.getMinutes() / 60) * 50 + "px"; + }, + getHeight(beginTime, endTime) { + let time = new Date(beginTime); + let timeA = new Date(endTime); + return ((timeA - time) / 1000 / 60 / 60) * 50 + "px"; + }, + lookDetails(i) { + const month = (this.time.getMonth() + 1).toString().padStart(2, "0"); + const day = this.time.getDate().toString().padStart(2, "0"); + this.drawerTime = `${month}/${day}(${this.getDayOfWeek(this.time)})`; + this.headerTime = + new Date(i.beginTime).getHours().toString().padStart(2, "0") + + ":" + + new Date(i.beginTime).getMinutes().toString().padStart(2, "0") + + "-" + + new Date(i.endTime).getHours().toString().padStart(2, "0") + + ":" + + new Date(i.endTime).getMinutes().toString().padStart(2, "0"); + this.formData = i; + this.drawer = true; + }, + getDayOfWeek(timestamp) { + const days = ["鍛ㄦ棩", "鍛ㄤ竴", "鍛ㄤ簩", "鍛ㄤ笁", "鍛ㄥ洓", "鍛ㄤ簲", "鍛ㄥ叚"]; + const date = new Date(timestamp); + return days[date.getDay()]; }, }, }; </script> +<style scoped> +.table_box { + overflow-x: auto; + white-space: nowrap; +} +.header_box { + height: 50px; + width: 200px; + border: 2px solid rgb(165, 165, 165); + background-color: rgb(212, 241, 255); + display: flex; + align-items: center; + justify-content: center; +} +#header_boxA { + border-left: none; +} +.body_box { + height: 50px; + width: 200px; + border: 2px solid rgb(165, 165, 165); + border-top: none; +} +</style> diff --git a/src/views/development/index.vue b/src/views/development/index.vue index c619222..26bd43e 100644 --- a/src/views/development/index.vue +++ b/src/views/development/index.vue @@ -1,124 +1,202 @@ <template> - <div class="app-container"> - <el-tabs v-model="activeName" @tab-click="handleClick"> - <el-tab-pane label="鍏ㄩ儴" name="first"> - <div style="display: flex; flex-direction: row-reverse"> - <div style="width: 300px"> - <el-input - placeholder="鎸夋爣棰樻悳绱�" - v-model="input3" - class="input-with-select" - size="small" - > - <el-button slot="append" icon="el-icon-search"></el-button> - </el-input> - </div> + <div class="app-container"> + <el-tabs v-model="activeName" @tab-click="fetchData"> + <el-tab-pane label="鍏ㄩ儴" name="all"> + <div style="display: flex; flex-direction: row-reverse"> + <div style="width: 300px"> + <el-input + placeholder="鎸夋爣棰樻悳绱�" + v-model="data.keyword" + class="input-with-select" + size="small" + > + <el-button + slot="append" + icon="el-icon-search" + @click="fetchData" + ></el-button> + </el-input> </div> + </div> + <div style="height: calc(100vh - 248px)"> <el-table v-loading="listLoading" :data="list" element-loading-text="Loading" fit + height="100%" > <el-table-column label="鏍囬"> - <template slot-scope=""> xxxxx </template> + <template slot-scope="scope"> + <el-link type="primary" :underline="false">{{ + scope.row.name + }}</el-link> + </template> </el-table-column> - <el-table-column label="鍒嗙被" width="80"> - <template slot-scope=""> 鐢� </template> - </el-table-column> - <el-table-column label="璋佸惁鍏紑" width="200"> - <template slot-scope=""> 10086 </template> - </el-table-column> - <el-table-column label="鐝骇" width="200"> - <template slot-scope=""> asfiaf </template> - </el-table-column> - <el-table-column label="瀛﹀憳" width=""> - <template slot-scope=""> asfiaf </template> + <el-table-column label="鍒嗙被" width="" prop="category"> </el-table-column> <el-table-column label="鏁欏笀" width=""> - <template slot-scope=""> 鐐硅瘎 </template> + <template slot-scope="scope">{{ + scope.row.publisher.name + }}</template> </el-table-column> - <el-table-column label="鍐呭" width=""> - <template slot-scope=""> 鐐硅瘎 </template> - </el-table-column> - <el-table-column label="鎿嶄綔" width=""> - <template slot-scope=""> 淇敼 </template> + <el-table-column label="鐐硅瘎鏃堕棿" width="" prop="createTime"> </el-table-column> </el-table> - </el-tab-pane> - <el-tab-pane label="璇剧▼" name="fourth"> - <div style="display: flex; flex-direction: row-reverse"> - <div style="width: 300px"> - <el-input - placeholder="鎸夊鍛樺悕绉版悳绱�" - v-model="input3" - class="input-with-select" - size="small" - > - <el-button slot="append" icon="el-icon-search"></el-button> - </el-input> - </div> + </div> + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> + </el-tab-pane> + <el-tab-pane label="璇剧▼" name="other"> + <div style="display: flex; flex-direction: row-reverse"> + <div style="width: 300px"> + <el-input + placeholder="鎸夊鍛樺悕绉版悳绱�" + v-model="data.keyword" + class="input-with-select" + size="small" + > + <el-button slot="append" icon="el-icon-search" @click="fetchData"></el-button> + </el-input> </div> + </div> + <div style="height: calc(100vh - 248px)"> <el-table v-loading="listLoading" :data="list" element-loading-text="Loading" fit + height="100%" > <el-table-column label="璇剧▼"> - <template slot-scope=""> xxxxx </template> + <template slot-scope="scope"> + <el-link type="primary" :underline="false">{{ + scope.row.courseName + }}</el-link> + </template> </el-table-column> - <el-table-column label="鏃堕棿" width="80"> - <template slot-scope=""> 鐢� </template> + <el-table-column label="寮�濮嬫椂闂�" width="" prop="beginTime"> </el-table-column> - <el-table-column label="瀛﹀憳鏁�" width="200"> - <template slot-scope=""> 10086 </template> + <el-table-column label="缁撴潫鏃堕棿" width="" prop="endTime"> </el-table-column> - <el-table-column label="宸茶褰曟暟" width="200"> - <template slot-scope=""> asfiaf </template> + <el-table-column label="瀛﹀憳鏁�" width="" prop="playerCount"> </el-table-column> - <el-table-column label="鎿嶄綔" width=""> - <template slot-scope=""> 璁板綍 </template> + <el-table-column label="宸茶褰曟暟" width="" prop="commentCount"> </el-table-column> </el-table> - </el-tab-pane> - </el-tabs> - </div> - </template> - - <script> - import { getList } from "@/api/table"; - - export default { - filters: { - statusFilter(status) { - const statusMap = { - published: "success", - draft: "gray", - deleted: "danger", - }; - return statusMap[status]; - }, - }, - data() { - return { - list: null, - listLoading: true, - activeName: "first", + </div> + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> + </el-tab-pane> + </el-tabs> + </div> +</template> + +<script> +import { getHomeworkByType, getSessionHomeworkDto } from "@/api/development"; + +export default { + filters: { + statusFilter(status) { + const statusMap = { + published: "success", + draft: "gray", + deleted: "danger", }; + return statusMap[status]; }, - created() { - this.fetchData(); + }, + data() { + return { + list: null, + listLoading: true, + activeName: "all", + total: 0, + data: { + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: "", + pageIn: { + //鍙�夛紝濡傛灉鏄垎椤垫煡璇紝闇�瑕佸姞涓娿�� + index: 0, //蹇呴�� + size: 10, //姣忛〉鐨勫ぇ灏忋�傞粯璁�20 + sorts: [ + { + name: "name", //鎺掑簭瀛楁鍚嶇О + direction: "ASC", //鎺掑簭鏂瑰悜 + }, + { + name: "createTime", + direction: "DESC", + }, + ], + }, + homeworkType: "GROWTH", + }, + }; + }, + created() { + this.fetchData(); + }, + methods: { + handleSizeChange(val) { + this.data.pageIn.size = val; + this.fetchData("pageIn"); }, - methods: { - fetchData() { + handleCurrentChange(val) { + this.data.pageIn.index = val - 1; + this.fetchData("pageIn"); + }, + fetchData(_val) { + if (_val !== "pageIn") { + this.data.pageIn.index = 0; + this.data.pageIn.size = 10; + } + this.listLoading = true; + if (this.activeName == "all") { this.listLoading = true; - getList().then((response) => { - this.list = response.data.items; + getHomeworkByType(this.data).then((response) => { + this.list = response.data.findHomeworkByType.ls; + this.total = response.data.findHomeworkByType.pageOut.total; this.listLoading = false; }); - }, + } else if (this.activeName == "other") { + this.listLoading = true; + let data = { + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: this.data.keyword, + pageIn: { ...this.data.pageIn }, + }; + data.pageIn.sorts = { + direction: "DESC", + name: "beginTime", + }; + getSessionHomeworkDto(data).then((response) => { + this.list = response.data.findSessionHomeworkDto.ls; + this.total = response.data.findSessionHomeworkDto.pageOut.total; + this.listLoading = false; + }); + } }, - }; - </script> - \ No newline at end of file + }, +}; +</script> diff --git a/src/views/home/components/chart.vue b/src/views/home/components/chart.vue new file mode 100644 index 0000000..aa5e300 --- /dev/null +++ b/src/views/home/components/chart.vue @@ -0,0 +1,67 @@ +<template> + <div class="dashboard-container"> + <div :id="data.value" style="height: 260px; width: 100%"></div> + </div> +</template> + +<script> +import * as echarts from "echarts"; + +export default { + name: "Chart", + props:{ + data: { + type: Object, + } + }, + mounted() { + this.loadEcharts(); + }, + methods: { + //鍔犺浇echarts + loadEcharts() { + // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥 + var myChart = echarts.init(document.getElementById(this.data.value)); + // 缁樺埗鍥捐〃 + myChart.setOption({ + title: { + text: this.data.lable, + }, + xAxis: { + type: "category", + data: [ + "8鏈�4鍙�", + "8鏈�4鍙�", + "8鏈�4鍙�", + "8鏈�4鍙�", + "8鏈�4鍙�", + "8鏈�4鍙�", + "8鏈�4鍙�", + ], + }, + yAxis: { + type: "value", + }, + series: [ + { + data: [150, 230, 224, 218, 135, 147, 260], + type: "line", + }, + ], + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.dashboard { + &-container { + margin: 30px; + } + &-text { + font-size: 30px; + line-height: 46px; + } +} +</style> diff --git a/src/views/home/index.vue b/src/views/home/index.vue index 0824cae..c9254e9 100644 --- a/src/views/home/index.vue +++ b/src/views/home/index.vue @@ -1,29 +1,56 @@ <template> <div class="dashboard-container"> - <div class="dashboard-text">name: {{ name }}</div> <el-button @click="getUserDate">鐧诲綍</el-button> + <div> + <div> + <Chart :data="data1"></Chart> + </div> + <div> + <Chart :data="data2"></Chart> + </div> + <div> + <Chart :data="data3"></Chart> + </div> + </div> </div> </template> <script> import { mapGetters } from "vuex"; import { login } from "@/api/user"; +import Chart from "./components/chart.vue"; export default { name: "Dashboard", + components: { + Chart, + }, computed: { ...mapGetters(["name"]), }, - created() { - // this.getUserDate(); + data(){ + return{ + data1:{ + value:'course', + lable:'璇炬秷' + }, + data2:{ + value:'student', + lable:'瀛﹀憳' + }, + data3:{ + value:'class', + lable:'鑰冨嫟' + } + } }, + mounted() {}, methods: { getUserDate() { login({ - code: "061akYFa14JATH0EzoIa1NNVTC3akYFI" - } - ).then((res) => { - localStorage.setItem('user',JSON.stringify(res.data)) + code: "0913JF000eW6BS1rZ3100FQTUM03JF05", + }).then((res) => { + localStorage.setItem("user", JSON.stringify(res.data)); }); }, }, diff --git a/src/views/integral/index.vue b/src/views/integral/index.vue index f2ff00c..9104d43 100644 --- a/src/views/integral/index.vue +++ b/src/views/integral/index.vue @@ -1,106 +1,195 @@ <template> - <div class="app-container"> - <el-tabs v-model="activeName" @tab-click="handleClick"> - <el-tab-pane label="鎸夊鍛�" name="first"> - <div style="display: flex; flex-direction: row-reverse"> - <div style="width: 300px"> - <el-input - placeholder="鎸夋爣棰樻悳绱�" - v-model="input3" - class="input-with-select" - size="small" - > - <el-button slot="append" icon="el-icon-search"></el-button> - </el-input> - </div> + <div class="app-container"> + <el-tabs v-model="activeName" @tab-click="fetchData"> + <el-tab-pane label="鎸夊鍛�" name="student"> + <div style="display: flex; flex-direction: row-reverse"> + <div style="width: 300px"> + <el-input + placeholder="鎸夋爣棰樻悳绱�" + v-model="data.keyword" + class="input-with-select" + size="small" + > + <el-button + slot="append" + icon="el-icon-search" + @click="fetchData" + ></el-button> + </el-input> </div> + </div> + <div style="height: calc(100vh - 248px)"> <el-table v-loading="listLoading" :data="list" element-loading-text="Loading" fit + height="100%" > <el-table-column label="濮撳悕"> - <template slot-scope=""> xxxxx </template> + <template slot-scope="scope"> + <el-link type="primary" :underline="false">{{ + scope.row.playerName + }}</el-link> + </template> </el-table-column> - <el-table-column label="绉垎" width="80"> - <template slot-scope=""> 鐢� </template> + <el-table-column label="绉垎" width="" prop="qty"> </el-table-column> - <el-table-column label="鏇存柊鏃堕棿" width="200"> - <template slot-scope=""> 10086 </template> + <el-table-column label="鏇存柊鏃堕棿" width="" prop="modifyTime"> </el-table-column> <el-table-column label="鎿嶄綔" width=""> <template slot-scope=""> 鍏戞崲 鍙戞斁 </template> </el-table-column> </el-table> - </el-tab-pane> - <el-tab-pane label="鎸夌彮绾�" name="fourth"> - <div style="display: flex; flex-direction: row-reverse"> - <div style="width: 300px"> - <el-input - placeholder="鎸夊鍛樺悕绉版悳绱�" - v-model="input3" - class="input-with-select" - size="small" - > - <el-button slot="append" icon="el-icon-search"></el-button> - </el-input> - </div> + </div> + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> + </el-tab-pane> + <el-tab-pane label="鎸夌彮绾�" name="class"> + <div style="display: flex; flex-direction: row-reverse"> + <div style="width: 300px"> + <el-input + placeholder="鎸夊鍛樺悕绉版悳绱�" + v-model="data.keyword" + class="input-with-select" + size="small" + > + <el-button + slot="append" + icon="el-icon-search" + @click="fetchData" + ></el-button> + </el-input> </div> + </div> + <div style="height: calc(100vh - 248px)"> <el-table v-loading="listLoading" :data="list" element-loading-text="Loading" fit + height="100%" > <el-table-column label="鐝骇"> - <template slot-scope=""> xxxxx </template> + <template slot-scope="scope"> + <el-link type="primary" :underline="false">{{ + scope.row.team.name + }}</el-link> + </template> </el-table-column> - <el-table-column label="瀛﹀憳浜烘暟" width="80"> - <template slot-scope=""> 鐢� </template> + <el-table-column label="瀛﹀憳浜烘暟" width="" prop="playerCount"> </el-table-column> <el-table-column label="鎿嶄綔" width=""> <template slot-scope=""> 鍙戞斁 </template> </el-table-column> </el-table> - </el-tab-pane> - </el-tabs> - </div> - </template> - - <script> - import { getList } from "@/api/table"; - - export default { - filters: { - statusFilter(status) { - const statusMap = { - published: "success", - draft: "gray", - deleted: "danger", - }; - return statusMap[status]; - }, - }, - data() { - return { - list: null, - listLoading: true, - activeName: "first", + </div> + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> + </el-tab-pane> + </el-tabs> + </div> +</template> + +<script> +import { getPlayerScore, getTeamDtoAll } from "@/api/integral"; + +export default { + filters: { + statusFilter(status) { + const statusMap = { + published: "success", + draft: "gray", + deleted: "danger", }; + return statusMap[status]; }, - created() { - this.fetchData(); + }, + data() { + return { + list: null, + listLoading: true, + activeName: "student", + total: 0, + data: { + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: "", + pageIn: { + //鍙�夛紝濡傛灉鏄垎椤垫煡璇紝闇�瑕佸姞涓娿�� + index: 0, //蹇呴�� + size: 10, //姣忛〉鐨勫ぇ灏忋�傞粯璁�20 + sorts: [ + { name: "v.id", direction: "DESC" }, + { name: "acc.modify_time", direction: "DESC" }, + ], + }, + }, + }; + }, + created() { + this.fetchData(); + }, + methods: { + handleSizeChange(val) { + this.data.pageIn.size = val; + this.fetchData("pageIn"); }, - methods: { - fetchData() { + handleCurrentChange(val) { + this.data.pageIn.index = val - 1; + this.fetchData("pageIn"); + }, + fetchData(_val) { + if (_val !== "pageIn") { + this.data.pageIn.index = 0; + this.data.pageIn.size = 10; + } + this.listLoading = true; + if (this.activeName == "student") { this.listLoading = true; - getList().then((response) => { - this.list = response.data.items; + getPlayerScore(this.data).then((response) => { + this.list = response.data.findPlayerScore.ls; + this.total = response.data.findPlayerScore.pageOut.total; this.listLoading = false; }); - }, + } else if (this.activeName == "class") { + this.listLoading = true; + let data = { + types: ["NORMAL"], + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: this.data.keyword, + pageIn: { ...this.data.pageIn }, + }; + data.pageIn.sorts = [ + { name: "createTime", direction: "DESC" }, + { name: "name", direction: "ASC" }, + ]; + getTeamDtoAll(data).then((response) => { + this.list = response.data.findTeamDtoAll.ls; + this.total = response.data.findTeamDtoAll.pageOut.total; + this.listLoading = false; + }); + } }, - }; - </script> - \ No newline at end of file + }, +}; +</script> diff --git a/src/views/rollCall/index.vue b/src/views/rollCall/index.vue index a42846b..6f529cd 100644 --- a/src/views/rollCall/index.vue +++ b/src/views/rollCall/index.vue @@ -1,115 +1,291 @@ <template> - <div class="app-container"> - <el-tabs v-model="activeName" @tab-click="handleClick"> - <el-tab-pane label="鎸夊鍛�" name="first"> - <div style="display: flex; flex-direction: row-reverse"> - <div style="width: 300px"> - <el-input - placeholder="鎸夋爣棰樻悳绱�" - v-model="input3" - class="input-with-select" - size="small" - > - <el-button slot="append" icon="el-icon-search"></el-button> - </el-input> - </div> + <div class="app-container"> + <el-tabs v-model="activeName" @tab-click="fetchData"> + <el-tab-pane label="鎸夊鍛�" name="student"> + <div style="display: flex; flex-direction: row-reverse"> + <div style="width: 300px"> + <el-input + placeholder="鎸夋爣棰樻悳绱�" + v-model="data.keyword" + class="input-with-select" + size="small" + > + <el-button + slot="append" + icon="el-icon-search" + @click="fetchData" + ></el-button> + </el-input> </div> + </div> + <div style="height: calc(100vh - 248px)"> <el-table v-loading="listLoading" :data="list" element-loading-text="Loading" fit + height="100%" > <el-table-column label="濮撳悕"> - <template slot-scope=""> xxxxx </template> + <template slot-scope="scope"> + <el-link type="primary" :underline="false">{{ + scope.row.player.name + }}</el-link> + </template> </el-table-column> - <el-table-column label="璇惧寘/浼氬憳鍗�" width="80"> - <template slot-scope=""> 鐢� </template> + <el-table-column label="璇惧寘/浼氬憳鍗�" width=""> + <template slot-scope="scope" + >{{ scope.row.voucher.name }} + </template> </el-table-column> - <el-table-column label="涓婅鏃ユ湡" width="200"> - <template slot-scope=""> 10086 </template> + <el-table-column label="浣欓" width="" prop="qty"> </el-table-column> - <el-table-column label="璇剧▼鏃堕暱" width="200"> - <template slot-scope=""> 10086 </template> - </el-table-column> - <el-table-column label="寮�濮嬫椂闂�" width="200"> - <template slot-scope=""> 10086 </template> - </el-table-column> - <el-table-column label="璇炬秷鏁伴噺" width="200"> - <template slot-scope=""> 10086 </template> + <el-table-column label="鍒版湡鏃堕棿" width="" prop="endDate"> + <template slot-scope="scope" + >{{ timeCompare(scope.row.endDate) }} + </template> </el-table-column> <el-table-column label="鎿嶄綔" width=""> - <template slot-scope=""> 鍏戞崲 鍙戞斁 </template> + <template slot-scope=""> 鐐瑰悕 </template> </el-table-column> </el-table> - </el-tab-pane> - <el-tab-pane label="鎸夌彮绾�" name="fourth"> - <div style="display: flex; flex-direction: row-reverse"> - <div style="width: 300px"> - <el-input - placeholder="鎸夊鍛樺悕绉版悳绱�" - v-model="input3" - class="input-with-select" - size="small" - > - <el-button slot="append" icon="el-icon-search"></el-button> - </el-input> - </div> + </div> + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> + </el-tab-pane> + <el-tab-pane label="鎸夌彮绾�" name="class"> + <div style="display: flex; flex-direction: row-reverse"> + <div style="width: 300px"> + <el-input + placeholder="鎸夊鍛樺悕绉版悳绱�" + v-model="data.keyword" + class="input-with-select" + size="small" + > + <el-button + slot="append" + icon="el-icon-search" + @click="fetchData" + ></el-button> + </el-input> </div> + </div> + <div style="height: calc(100vh - 248px)"> <el-table v-loading="listLoading" :data="list" element-loading-text="Loading" fit + height="100%" > <el-table-column label="鐝骇"> - <template slot-scope=""> xxxxx </template> - </el-table-column> - <el-table-column label="瀛﹀憳浜烘暟" width="80"> - <template slot-scope=""> 鐢� </template> + <template slot-scope="scope"> + <el-link type="primary" :underline="false">{{ + scope.row.name + }}</el-link> + </template> </el-table-column> <el-table-column label="鎿嶄綔" width=""> - <template slot-scope=""> 鍙戞斁 </template> + <template slot-scope=""> 鐐瑰悕 </template> </el-table-column> </el-table> - </el-tab-pane> - </el-tabs> - </div> - </template> - - <script> - import { getList } from "@/api/table"; - - export default { - filters: { - statusFilter(status) { - const statusMap = { - published: "success", - draft: "gray", - deleted: "danger", - }; - return statusMap[status]; - }, - }, - data() { - return { - list: null, - listLoading: true, - activeName: "first", + </div> + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> + </el-tab-pane> + <el-tab-pane label="鎸夎绋�" name="course"> + <div style="display: flex; flex-direction: row-reverse"> + <div style="width: 300px"> + <el-input + placeholder="鎸夎绋嬪悕绉版悳绱�" + v-model="data.keyword" + class="input-with-select" + size="small" + > + <el-button + slot="append" + icon="el-icon-search" + @click="fetchData" + ></el-button> + </el-input> + </div> + </div> + <div style="height: calc(100vh - 248px)"> + <el-table + v-loading="listLoading" + :data="list" + element-loading-text="Loading" + fit + height="100%" + > + <el-table-column label="璇剧▼"> + <template slot-scope="scope"> + <el-link type="primary" :underline="false">{{ + scope.row.courseName + }}</el-link> + </template> + </el-table-column> + <el-table-column label="寮�濮嬫椂闂�" width="" prop="beginTime"> + </el-table-column> + <el-table-column label="缁撴潫鏃堕棿" width="" prop="endTime"> + </el-table-column> + <el-table-column label="瀛﹀憳浜烘暟" width="" prop="playerCount"> + </el-table-column> + <el-table-column label="鎿嶄綔" width=""> + <template slot-scope=""> 鐐瑰悕 </template> + </el-table-column> + </el-table> + </div> + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> + </el-tab-pane> + </el-tabs> + </div> +</template> + +<script> +import { + getPlayerAccByStaffWithRollCall, + getTeamByStaffWithRollCall, + getUnCompleteSession, +} from "@/api/rollCall"; + +export default { + filters: { + statusFilter(status) { + const statusMap = { + published: "success", + draft: "gray", + deleted: "danger", }; + return statusMap[status]; }, - created() { - this.fetchData(); + }, + data() { + return { + list: null, + listLoading: true, + activeName: "student", + total: 0, + data: { + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: "", + pageIn: { + //鍙�夛紝濡傛灉鏄垎椤垫煡璇紝闇�瑕佸姞涓娿�� + index: 0, //蹇呴�� + size: 10, //姣忛〉鐨勫ぇ灏忋�傞粯璁�20 + sorts: [ + { name: "modifyTime", direction: "DESC" }, + { name: "player.name", direction: "ASC" }, + ], + }, + }, + }; + }, + created() { + this.fetchData(); + }, + methods: { + handleSizeChange(val) { + this.data.pageIn.size = val; + this.fetchData("pageIn"); }, - methods: { - fetchData() { + handleCurrentChange(val) { + this.data.pageIn.index = val - 1; + this.fetchData("pageIn"); + }, + fetchData(_val) { + if (_val !== "pageIn") { + this.data.pageIn.index = 0; + this.data.pageIn.size = 10; + } + this.listLoading = true; + if (this.activeName == "student") { this.listLoading = true; - getList().then((response) => { - this.list = response.data.items; + getPlayerAccByStaffWithRollCall(this.data).then((response) => { + this.list = response.data.findPlayerAccByStaffWithRollCall.ls; + this.total = + response.data.findPlayerAccByStaffWithRollCall.pageOut.total; this.listLoading = false; }); - }, + } else if (this.activeName == "class") { + this.listLoading = true; + let data = { + types: ["NORMAL"], + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: this.data.keyword, + pageIn: { ...this.data.pageIn }, + }; + data.pageIn.sorts = [ + { name: "modifyTime", direction: "DESC" }, + { name: "name", direction: "ASC" }, + ]; + getTeamByStaffWithRollCall(data).then((response) => { + this.list = response.data.findTeamByStaffWithRollCall.ls; + this.total = response.data.findTeamByStaffWithRollCall.pageOut.total; + this.listLoading = false; + }); + } else if (this.activeName == "course") { + this.listLoading = true; + let data = { + completeTypes: ["ROLL_CALL"], + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: this.data.keyword, + pageIn: { ...this.data.pageIn }, + }; + data.pageIn.sorts = [ + { name: "s.begin_time", direction: "DESC" }, + { name: "courseName", direction: "ASC" }, + ]; + getUnCompleteSession(data).then((response) => { + this.list = response.data.findUnCompleteSession.ls; + this.total = response.data.findUnCompleteSession.pageOut.total; + this.listLoading = false; + }); + } }, - }; - </script> - \ No newline at end of file + timeCompare(time) { + if (!time) { + return ""; + } + let timeDate = new Date(time); + let nowTime = new Date(); + if (nowTime > timeDate) { + return time + "(宸茶繃鏈�)"; + } else { + return time; + } + }, + }, +}; +</script> diff --git a/src/views/scheduleCourses/index.vue b/src/views/scheduleCourses/index.vue index 86d6c25..08aebe3 100644 --- a/src/views/scheduleCourses/index.vue +++ b/src/views/scheduleCourses/index.vue @@ -1,112 +1,151 @@ <template> - <div class="app-container"> - <el-tabs v-model="activeName" @tab-click="handleClick"> - <el-tab-pane label="鍏ㄩ儴" name="first" /> - <el-tab-pane label="宸插仠鐢�" name="fourth" /> - </el-tabs> - <div style="display: flex; flex-direction: row-reverse;"> - <div style="width: 300px;"> - <el-input - placeholder="鎸夎绋嬪悕绉版悳绱�" - v-model="input3" - class="input-with-select" - size="small" - > - <el-button slot="append" icon="el-icon-search"></el-button> - </el-input> - </div> + <div class="app-container"> + <el-tabs v-model="activeName" @tab-click="fetchData"> + <el-tab-pane label="鍏ㄩ儴" name="all" /> + <el-tab-pane label="宸插仠鐢�" name="deactivated" /> + </el-tabs> + <div style="display: flex; flex-direction: row-reverse"> + <div style="width: 300px"> + <el-input + placeholder="鎸夎绋嬪悕绉版悳绱�" + v-model="data.keyword" + class="input-with-select" + size="small" + > + <el-button + slot="append" + icon="el-icon-search" + @click="fetchData" + ></el-button> + </el-input> </div> + </div> + <div style="height: calc(100vh - 248px)"> <el-table v-loading="listLoading" :data="list" element-loading-text="Loading" fit + height="100%" > <el-table-column label="璇剧▼鍚嶇О"> - <template slot-scope=""> xxxxx </template> - </el-table-column> - <el-table-column label="鐝骇鍚嶇О" width="80"> - <template slot-scope=""> 鐢� </template> - </el-table-column> - <el-table-column label="绫诲瀷" width="200"> - <template slot-scope=""> 10086 </template> - </el-table-column> - <el-table-column label="璇捐妭甯傚満(鍒嗛挓)" width="200"> - <template slot-scope=""> asfiaf </template> - </el-table-column> - <el-table-column label="浜烘暟涓婇檺" width=""> - <template slot-scope=""> asfiaf </template> - </el-table-column> - <el-table-column label="娑堣鏂瑰紡" width=""> - <template slot-scope=""> asfiaf </template> - </el-table-column> - <el-table-column label="棰滆壊" width=""> - <template slot-scope=""> asfiaf </template> - </el-table-column> - <el-table-column label="鎻忚堪" width=""> - <template slot-scope=""> asfiaf </template> - </el-table-column> - <el-table-column label="鎿嶄綔" width=""> - <template slot-scope=""> 淇敼 鍋滅敤 </template> - </el-table-column> - <!-- <el-table-column label="Author" width="110" align="center"> <template slot-scope="scope"> - <span>{{ scope.row.author }}</span> + <el-link type="primary" :underline="false">{{ + scope.row.name + }}</el-link> </template> </el-table-column> - <el-table-column label="Pageviews" width="110" align="center"> + <el-table-column + label="鍋滅敤鏃堕棿" + width="200" + v-if="activeName == 'deactivated'" + > <template slot-scope="scope"> - {{ scope.row.pageviews }} + {{ scope.row.modifyTime }} </template> </el-table-column> - <el-table-column class-name="status-col" label="Status" width="110" align="center"> - <template slot-scope="scope"> - <el-tag :type="scope.row.status | statusFilter">{{ scope.row.status }}</el-tag> + <el-table-column + label="鎿嶄綔" + width="200" + v-if="activeName == 'deactivated'" + > + <template slot-scope=""> + <el-link type="primary" :underline="false">鎭㈠</el-link> </template> </el-table-column> - <el-table-column align="center" prop="created_at" label="Display_time" width="200"> - <template slot-scope="scope"> - <i class="el-icon-time" /> - <span>{{ scope.row.display_time }}</span> - </template> - </el-table-column> --> </el-table> </div> - </template> - - <script> - import { getList } from "@/api/table"; - - export default { - filters: { - statusFilter(status) { - const statusMap = { - published: "success", - draft: "gray", - deleted: "danger", - }; - return statusMap[status]; - }, - }, - data() { - return { - list: null, - listLoading: true, - activeName: "first", + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> + </div> +</template> + +<script> +import { getCourse, getDeletedItem } from "@/api/scheduleCourses"; + +export default { + filters: { + statusFilter(status) { + const statusMap = { + published: "success", + draft: "gray", + deleted: "danger", }; + return statusMap[status]; }, - created() { - this.fetchData(); + }, + data() { + return { + list: null, + listLoading: true, + activeName: "all", + total: 0, + data: { + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: "", + pageIn: { + //鍙�夛紝濡傛灉鏄垎椤垫煡璇紝闇�瑕佸姞涓娿�� + index: 0, //蹇呴�� + size: 10, //姣忛〉鐨勫ぇ灏忋�傞粯璁�20 + sorts: { + name: "name", //鎺掑簭瀛楁鍚嶇О + direction: "ASC", //鎺掑簭鏂瑰悜 + }, + }, + types: ["BOOKING_NONE", "BOOKING_TIME_STAFF", "BOOKING_TIME_PLACE"], + }, + }; + }, + created() { + this.fetchData(); + }, + methods: { + handleSizeChange(val) { + this.data.pageIn.size = val; + this.fetchData("pageIn"); }, - methods: { - fetchData() { + handleCurrentChange(val) { + this.data.pageIn.index = val - 1; + this.fetchData("pageIn"); + }, + fetchData(_val) { + if (_val !== "pageIn") { + this.data.pageIn.index = 0; + this.data.pageIn.size = 10; + } + this.listLoading = true; + if (this.activeName == "all") { this.listLoading = true; - getList().then((response) => { - this.list = response.data.items; + getCourse(this.data).then((response) => { + this.list = response.data.findCourse.ls; + this.total = response.data.findCourse.pageOut.total; this.listLoading = false; }); - }, + } else if (this.activeName == "deactivated") { + this.listLoading = true; + let data = { + itemType: "COURSE", + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: this.data.keyword, + pageIn: { ...this.data.pageIn }, + }; + getDeletedItem(data).then((response) => { + this.list = response.data.findDeletedItem.ls; + this.total = response.data.findDeletedItem.pageOut.total; + this.listLoading = false; + }); + } }, - }; - </script> - \ No newline at end of file + }, +}; +</script> diff --git a/src/views/student/components/create.vue b/src/views/student/components/create.vue index 2dc2037..5a8c4a2 100644 --- a/src/views/student/components/create.vue +++ b/src/views/student/components/create.vue @@ -42,6 +42,35 @@ </el-option> </el-select> </el-form-item> + <el-form-item label="璇炬椂" style="width: 400px"> + <el-input-number v-model="num" size="small"></el-input-number> + </el-form-item> + <el-form-item label="缂磋垂" style="width: 400px"> + <el-input-number + v-model="num" + size="small" + style="width: 200px" + ></el-input-number> + </el-form-item> + <el-form-item label="鏈夋晥鏈�" style="width: 400px"> + <div> + <el-radio-group v-model="lifespan" @input="lifespanChange" size="mini"> + <el-radio-button label="month">涓�鏈�</el-radio-button> + <el-radio-button label="year">涓�骞�</el-radio-button> + <el-radio-button label="longTerm">闀挎湡</el-radio-button> + <el-radio-button label="custom">鑷畾涔�</el-radio-button> + </el-radio-group> + </div> + <div> + <el-date-picker + v-model="createData.endDate" + type="date" + placeholder="閫夋嫨鏃ユ湡" + size="small" + > + </el-date-picker> + </div> + </el-form-item> <el-form-item label="璇剧▼椤鹃棶"> <el-select v-model="createData.voucherId" @@ -96,16 +125,16 @@ return { dialogVisible: false, createData: { - beginDate: "", + beginDate: new Date(), birthday: null, description: "", detailDescription: "", - endDate: "", + endDate: new Date(), amt: 0, freezeQty: 0, gender: "鐢�", mobile: "", - orgId: "", //鏈烘瀯 + orgId: 25, //鏈烘瀯 playerId: null, playerName: "", qty: 0, @@ -119,6 +148,7 @@ }, saleManList: [], voucherList: [], + lifespan:'' }; }, created() {}, @@ -152,6 +182,9 @@ goDetails(row) { this.$router.push("/details"); }, + lifespanChange(val){ + console.log(val); + } }, }; </script> diff --git a/src/views/student/index.vue b/src/views/student/index.vue index d91dae9..3a28c1b 100644 --- a/src/views/student/index.vue +++ b/src/views/student/index.vue @@ -6,8 +6,9 @@ <el-tab-pane label="宸茶繃鏈�" name="expired" /> <el-tab-pane label="宸插仠鐢�" name="deactivated" /> </el-tabs> - <div style="display: flex; justify-content: space-between;"> - <el-button type="primary" size="small" @click="showCreate">鏂板缓瀛﹀憳</el-button> + <div style="display: flex; justify-content: space-between"> + <!-- <el-button type="primary" size="small" @click="showCreate">鏂板缓瀛﹀憳</el-button> --> + <el-button type="primary" size="small">瀵煎嚭瀛﹀憳</el-button> <div style="width: 300px"> <el-input placeholder="鎸夊鍚嶆悳绱�" @@ -18,43 +19,82 @@ <el-button slot="append" icon="el-icon-search" - @click="fetchData" + @click="handleClick" ></el-button> </el-input> </div> </div> - <el-table - v-loading="listLoading" - :data="list" - element-loading-text="Loading" - fit - > - <el-table-column label="濮撳悕" prop=""> - <template slot-scope="scope"> - <el-link + <div style="height: calc(100vh - 248px)"> + <el-table + v-loading="listLoading" + :data="list" + element-loading-text="Loading" + fit + height="100%" + > + <el-table-column label="濮撳悕" prop=""> + <template slot-scope="scope"> + <el-link type="primary" :underline="false" @click="goDetails(scope.row)" >{{ scope.row.name }}</el-link > - </template> - </el-table-column> - <el-table-column label="鎬у埆" width="80"> - <template slot-scope="scope"> - {{ scope.row.gender == "FEMALE" ? "濂�" : "鐢�" }} - </template> - </el-table-column> - <el-table-column label="鎵嬫満鍙�" width="200" prop="mobile"> - <template slot-scope="scope"> - {{ scope.row.mobile ? scope.row.mobile : "--" }} - </template> - </el-table-column> - <el-table-column label="鏄惁缁戝畾寰俊" width="200"> - <template slot-scope="scope"> - {{ scope.row.user ? "鏄�" : "鍚�" }} - </template> - </el-table-column> - </el-table> + <!-- <el-link type="primary" :underline="false">{{ + scope.row.name + }}</el-link> --> + </template> + </el-table-column> + <el-table-column + label="鎬у埆" + width="80" + v-if="activeName !== 'deactivated'" + > + <template slot-scope="scope"> + {{ scope.row.gender == "FEMALE" ? "濂�" : "鐢�" }} + </template> + </el-table-column> + <el-table-column + label="鎵嬫満鍙�" + width="200" + prop="mobile" + v-if="activeName !== 'deactivated'" + > + <template slot-scope="scope"> + {{ scope.row.mobile ? scope.row.mobile : "--" }} + </template> + </el-table-column> + <el-table-column + label="鏄惁缁戝畾寰俊" + width="200" + v-if="activeName !== 'deactivated'" + > + <template slot-scope="scope"> + {{ scope.row.user ? "鏄�" : "鍚�" }} + </template> + </el-table-column> + <el-table-column + label="鎿嶄綔" + width="200" + v-if="activeName == 'deactivated'" + > + <template slot-scope=""> + <el-link type="primary" :underline="false">鍒犻櫎</el-link> + + <el-link type="primary" :underline="false">鎭㈠</el-link> + </template> + </el-table-column> + <el-table-column + label="鍋滅敤鏃堕棿" + width="200" + v-if="activeName == 'deactivated'" + > + <template slot-scope="scope"> + {{ scope.row.modifyTime }} + </template> + </el-table-column> + </el-table> + </div> <div> <el-pagination @size-change="handleSizeChange" @@ -67,13 +107,13 @@ > </el-pagination> </div> - <StudentCreate ref="studentCreate"/> + <StudentCreate ref="studentCreate" /> </div> </template> <script> import { getData, getRenew, getExpire, getDeleted } from "@/api/student"; -import StudentCreate from './components/create.vue' +import StudentCreate from "./components/create.vue"; export default { filters: { @@ -86,7 +126,7 @@ return statusMap[status]; }, }, - components:{ + components: { StudentCreate, }, data() { @@ -96,7 +136,7 @@ activeName: "all", total: 0, data: { - staffId: JSON.parse(localStorage.getItem('user')).staffs[0].id, + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, keyword: "", pageIn: { //鍙�夛紝濡傛灉鏄垎椤垫煡璇紝闇�瑕佸姞涓娿�� @@ -124,11 +164,11 @@ }, handleSizeChange(val) { this.data.pageIn.size = val; - this.fetchData(); + this.handleClick(); }, handleCurrentChange(val) { this.data.pageIn.index = val - 1; - this.fetchData(); + this.handleClick(); }, handleClick(tab, event) { if (this.activeName == "pendingFees") { @@ -149,9 +189,15 @@ this.fetchData(); } else if (this.activeName == "deactivated") { this.listLoading = true; - getExpire(this.data).then((response) => { - this.list = response.data.findPlayerExpire.ls; - this.total = response.data.findPlayerExpire.pageOut.total; + let data = { + itemType: "PLAYER", + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: this.data.keyword, + pageIn: { ...this.data.pageIn }, + }; + getDeleted(data).then((response) => { + this.list = response.data.findDeletedItem.ls; + this.total = response.data.findDeletedItem.pageOut.total; this.listLoading = false; }); } @@ -164,9 +210,9 @@ }, }); }, - showCreate(){ - this.$refs.studentCreate.showDialog() - } + showCreate() { + this.$refs.studentCreate.showDialog(); + }, }, }; </script> diff --git a/src/views/work/index.vue b/src/views/work/index.vue index 6049020..90e2f7f 100644 --- a/src/views/work/index.vue +++ b/src/views/work/index.vue @@ -1,87 +1,135 @@ <template> <div class="app-container"> - <el-tabs v-model="activeName" @tab-click="handleClick"> - <el-tab-pane label="浣滀笟" name="first"> + <el-tabs v-model="activeName" @tab-click="fetchData"> + <el-tab-pane label="浣滀笟" name="work"> <div style="display: flex; flex-direction: row-reverse"> <div style="width: 300px"> <el-input placeholder="鎸変綔涓氬悕绉版悳绱�" - v-model="input3" + v-model="data.keyword" class="input-with-select" size="small" > - <el-button slot="append" icon="el-icon-search"></el-button> + <el-button + slot="append" + icon="el-icon-search" + @click="fetchData" + ></el-button> </el-input> </div> </div> - <el-table - v-loading="listLoading" - :data="list" - element-loading-text="Loading" - fit - > - <el-table-column label="浣滀笟鍚嶇О"> - <template slot-scope=""> xxxxx </template> - </el-table-column> - <el-table-column label="鐝骇" width="80"> - <template slot-scope=""> 鐢� </template> - </el-table-column> - <el-table-column label="瀛﹀憳" width="200"> - <template slot-scope=""> 10086 </template> - </el-table-column> - <el-table-column label="鏁欏笀" width="200"> - <template slot-scope=""> asfiaf </template> - </el-table-column> - <el-table-column label="鎴鏃ユ湡" width=""> - <template slot-scope=""> asfiaf </template> - </el-table-column> - <el-table-column label="鍐呭" width=""> - <template slot-scope=""> asfiaf </template> - </el-table-column> - <el-table-column label="鎿嶄綔" width=""> - <template slot-scope=""> 淇敼 </template> - </el-table-column> - </el-table> + <div style="height: calc(100vh - 248px)"> + <el-table + v-loading="listLoading" + :data="list" + element-loading-text="Loading" + fit + height="100%" + > + <el-table-column label="浣滀笟鍚嶇О"> + <template slot-scope="scope"> + <el-link type="primary" :underline="false">{{ + scope.row.name + }}</el-link> + </template> + </el-table-column> + <el-table-column label="甯冪疆鏃堕棿" width=""> + < + <template slot-scope="scope"> + {{ scope.row.createTime }} + </template> + </el-table-column> + <el-table-column label="甯冪疆浜�" width=""> + <template slot-scope="scope"> + {{ scope.row.publisher.name }} + </template> + </el-table-column> + <el-table-column label="鎿嶄綔" width=""> + <template slot-scope=""> 澶嶅埗 </template> + </el-table-column> + </el-table> + </div> + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> </el-tab-pane> - <el-tab-pane label="鎵归槄" name="fourth"> + <el-tab-pane label="鎵归槄" name="readOver"> <div style="display: flex; flex-direction: row-reverse"> <div style="width: 300px"> <el-input placeholder="鎸夊鍛樺悕绉版悳绱�" - v-model="input3" + v-model="data.keyword" class="input-with-select" size="small" > - <el-button slot="append" icon="el-icon-search"></el-button> + <el-button + slot="append" + icon="el-icon-search" + @click="fetchData" + ></el-button> </el-input> </div> </div> - <el-table - v-loading="listLoading" - :data="list" - element-loading-text="Loading" - fit - > - <el-table-column label="瀛﹀憳"> - <template slot-scope=""> xxxxx </template> - </el-table-column> - <el-table-column label="鏃堕棿" width="80"> - <template slot-scope=""> 鐢� </template> - </el-table-column> - <el-table-column label="浣滀笟" width="200"> - <template slot-scope=""> 10086 </template> - </el-table-column> - <el-table-column label="鐐硅瘎" width="200"> - <template slot-scope=""> asfiaf </template> - </el-table-column> - </el-table> + <div style="height: calc(100vh - 248px)"> + <el-table + v-loading="listLoading" + :data="list" + element-loading-text="Loading" + fit + height="100%" + > + <el-table-column label="瀛﹀憳"> + <template slot-scope="scope"> + <el-link type="primary" :underline="false">{{ + scope.row.player.name + }}</el-link> + </template> + </el-table-column> + <el-table-column label="瀹屾垚鏃堕棿" width=""> + <template slot-scope="scope"> + {{ scope.row.createTime }} + </template> + </el-table-column> + <el-table-column label="浣滀笟" width=""> + <template slot-scope="scope"> + {{ scope.row.homework.name }} + </template> + </el-table-column> + <el-table-column label="鐐硅瘎" width=""> + <template slot-scope="scope"> + {{ scope.row.lastStaffCommentId ? "宸茬偣璇�" : "鏈偣璇�" }} + </template> + </el-table-column> + </el-table> + </div> + <div> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="data.pageIn.index + 1" + :page-sizes="[10, 20, 30, 40]" + :page-size="data.pageIn.size" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + > + </el-pagination> + </div> </el-tab-pane> </el-tabs> </div> </template> <script> -import { getList } from "@/api/table"; +import { getHomeworkByType, getHomeworkCommentByAuth } from "@/api/work"; export default { filters: { @@ -98,19 +146,64 @@ return { list: null, listLoading: true, - activeName: "first", + activeName: "work", + total: 0, + data: { + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: "", + pageIn: { + //鍙�夛紝濡傛灉鏄垎椤垫煡璇紝闇�瑕佸姞涓娿�� + index: 0, //蹇呴�� + size: 10, //姣忛〉鐨勫ぇ灏忋�傞粯璁�20 + sorts: { + name: "name", //鎺掑簭瀛楁鍚嶇О + direction: "ASC", //鎺掑簭鏂瑰悜 + }, + }, + commentTypes: ["HOMEWORK"], + homeworkType: "HOMEWORK", + }, }; }, created() { this.fetchData(); }, methods: { - fetchData() { + handleSizeChange(val) { + this.data.pageIn.size = val; + this.fetchData("pageIn"); + }, + handleCurrentChange(val) { + this.data.pageIn.index = val - 1; + this.fetchData("pageIn"); + }, + fetchData(_val) { + if (_val !== "pageIn") { + this.data.pageIn.index = 0; + this.data.pageIn.size = 10; + } this.listLoading = true; - getList().then((response) => { - this.list = response.data.items; - this.listLoading = false; - }); + if (this.activeName == "work") { + this.listLoading = true; + getHomeworkByType(this.data).then((response) => { + this.list = response.data.findHomeworkByType.ls; + this.total = response.data.findHomeworkByType.pageOut.total; + this.listLoading = false; + }); + } else if (this.activeName == "readOver") { + this.listLoading = true; + let data = { + commentTypes: ["PLAYER_REPLY"], + staffId: JSON.parse(localStorage.getItem("user")).staffs[0].id, + keyword: this.data.keyword, + pageIn: { ...this.data.pageIn }, + }; + getHomeworkCommentByAuth(data).then((response) => { + this.list = response.data.findHomeworkCommentByAuth.ls; + this.total = response.data.findHomeworkCommentByAuth.pageOut.total; + this.listLoading = false; + }); + } }, }, }; diff --git a/vue.config.js b/vue.config.js index 159032f..8d82eff 100644 --- a/vue.config.js +++ b/vue.config.js @@ -39,7 +39,7 @@ proxy: { [process.env.VUE_APP_BASE_API]: { // 鍖归厤鎵�鏈変互 '/dev-api'寮�澶寸殑璇锋眰璺緞 - target: "http://192.168.3.88:18080/dream_test", //绫讳技浜嶯ginx鍙嶅悜浠g悊 + target: "http://192.168.3.87:18081/dream", //绫讳技浜嶯ginx鍙嶅悜浠g悊 changeOrigin: true, // 鏀寔璺ㄥ煙 pathRewrite: { // 閲嶅啓璺緞: 鍘绘帀璺緞涓紑澶寸殑'/dev-api' -- Gitblit v1.8.0