| | |
| | | <template> |
| | | <div class="dashboard-container"> |
| | | <el-row :gutter="40" class="panel-group"> |
| | | <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col"> |
| | | <div class="card-panel"> |
| | | <div class="card-panel-icon-wrapper icon-people"> |
| | | <svg-icon icon-class="exam" class-name="card-panel-icon"/> |
| | | </div> |
| | | <div class="card-panel-description"> |
| | | <div class="card-panel-text"> |
| | | 试卷总数 |
| | | <div class="c"> |
| | | <div class="bg"> |
| | | <div class="main"> |
| | | <div class="m1"> |
| | | <div |
| | | class="card" |
| | | style="width:310px; margin-bottom:20px;" |
| | | > |
| | | <p class="card-title">学生总数</p> |
| | | <p class="card-num">3250</p> |
| | | <div class="bar"> |
| | | <div |
| | | class="bar-r" |
| | | style="width:75%; background:rgb(99,1,190)" |
| | | ></div> |
| | | </div> |
| | | <count-to :start-val="0" :end-val="examPaperCount" :duration="2600" class="card-panel-num" v-loading="loading"/> |
| | | <p class="card-d">20天内增加75%</p> |
| | | </div> |
| | | <div |
| | | class="card" |
| | | style="width:310px;" |
| | | > |
| | | <p class="card-title">新生</p> |
| | | <p class="card-num">230</p> |
| | | <div class="bar"> |
| | | <div |
| | | class="bar-r" |
| | | style="width:50%;" |
| | | ></div> |
| | | </div> |
| | | <p class="card-d">20天内增加50%</p> |
| | | </div> |
| | | <div |
| | | class="card" |
| | | style="width:310px;" |
| | | > |
| | | <p class="card-title">总课程</p> |
| | | <p class="card-num">3</p> |
| | | <div class="bar"> |
| | | <div |
| | | class="bar-r" |
| | | style="width:76%; background:rgb(16,71,247)" |
| | | ></div> |
| | | </div> |
| | | <p class="card-d">20天内增加75%</p> |
| | | </div> |
| | | <div |
| | | class="card" |
| | | style="width:310px;" |
| | | > |
| | | <p class="card-title">收费</p> |
| | | <p class="card-num">¥355000.00</p> |
| | | <div class="bar"> |
| | | <div |
| | | class="bar-r" |
| | | style="width:56%; background:rgb(245,155,34)" |
| | | ></div> |
| | | </div> |
| | | <p class="card-d">20天内增加56%</p> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col"> |
| | | <div class="card-panel" > |
| | | <div class="card-panel-icon-wrapper icon-message"> |
| | | <svg-icon icon-class="question" class-name="card-panel-icon"/> |
| | | </div> |
| | | <div class="card-panel-description"> |
| | | <div class="card-panel-text"> |
| | | 题目总数 |
| | | <div class="m2 card"> |
| | | <p class="card-title">收入/费用报告</p> |
| | | <img |
| | | src="@/assets/img/1.jpg" |
| | | alt="" |
| | | > |
| | | </div> |
| | | <div class="m3 card"> |
| | | <p |
| | | class="card-title" |
| | | style="margin-bottom:20px;" |
| | | >老师名单</p> |
| | | <div class="scrollBar"> |
| | | <div |
| | | class="m3-con" |
| | | v-for="(item) in state.listTeachers" |
| | | :key="item.id" |
| | | > |
| | | <div style="display:flex"> |
| | | <img |
| | | src="https://img1.baidu.com/it/u=842647274,1455615798&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500" |
| | | alt="" |
| | | > |
| | | <div style="margin-left:10px;"> |
| | | <p class="m3-con-name">{{item.name}}</p> |
| | | <p class="m3-con-d">工龄:{{item.workTIme}}年<span style="margin-left:50px;">学生:{{item.students}}个</span></p> |
| | | </div> |
| | | </div> |
| | | <div class="m3-con-b"> |
| | | <el-button type="text">查看</el-button> |
| | | </div> |
| | | </div> |
| | | <count-to :start-val="0" :end-val="questionCount" :duration="3000" class="card-panel-num" v-loading="loading"/> |
| | | </div> |
| | | <div |
| | | class="m3-btn" |
| | | style="border-top:1px solid #EBEEF5" |
| | | > |
| | | <button |
| | | class="content_padding" |
| | | @click="$router.push('/manage/teacher-manage')" |
| | | >查看所有</button> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col"> |
| | | <div class="card-panel"> |
| | | <div class="card-panel-icon-wrapper icon-shopping"> |
| | | <svg-icon icon-class="doexampaper" class-name="card-panel-icon"/> |
| | | </div> |
| | | <div class="card-panel-description"> |
| | | <div class="card-panel-text"> |
| | | 答卷总数 |
| | | </div> |
| | | <count-to :start-val="0" :end-val="doExamPaperCount" :duration="3600" class="card-panel-num" v-loading="loading"/> |
| | | <div class="m4 card"> |
| | | <p |
| | | class="card-title" |
| | | style="margin-bottom:20px;" |
| | | >学生名单</p> |
| | | <el-table |
| | | :data="state.listStudents" |
| | | height="80%" |
| | | > |
| | | <el-table-column |
| | | label="学生名称" |
| | | prop="name" |
| | | ></el-table-column> |
| | | <el-table-column |
| | | label="班级" |
| | | prop="className" |
| | | ></el-table-column> |
| | | <el-table-column |
| | | label="班主任" |
| | | prop="teacher" |
| | | ></el-table-column> |
| | | <el-table-column |
| | | label="入学时间" |
| | | prop="inTime" |
| | | ></el-table-column> |
| | | <el-table-column |
| | | label="操作" |
| | | width="60px" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | style="color:#f59b22" |
| | | type="text" |
| | | @click="viewDetails(1)" |
| | | >查看</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <div class="m3-btn m4-btn content_padding"> |
| | | <button>查看所有</button> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col"> |
| | | <div class="card-panel"> |
| | | <div class="card-panel-icon-wrapper icon-money"> |
| | | <svg-icon icon-class="doquestion" class-name="card-panel-icon"/> |
| | | </div> |
| | | <div class="card-panel-description"> |
| | | <div class="card-panel-text"> |
| | | 答题总数 |
| | | </div> |
| | | <count-to :start-val="0" :end-val="doQuestionCount" :duration="3200" class="card-panel-num" v-loading="loading"/> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row class="echarts-line"> |
| | | <div id="echarts-moth-user" style="width: 100%;height:400px;" v-loading="loading"/> |
| | | </el-row> |
| | | <el-row class="echarts-line"> |
| | | <div id="echarts-moth-question" style="width: 100%;height:400px;" v-loading="loading"/> |
| | | </el-row> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import resize from './components/mixins/resize' |
| | | import CountTo from 'vue-count-to' |
| | | import dashboardApi from '@/api/dashboard' |
| | | // import { createNamespacedHelpers } from "vuex"; |
| | | // const a = createNamespacedHelpers("home"); |
| | | // console.log(a, "a"); |
| | | // 随机 mock |
| | | import { listStudent, listTeacher, countStudent } from "@/utils/mock/home"; |
| | | export default { |
| | | mixins: [resize], |
| | | components: { |
| | | CountTo |
| | | }, |
| | | data () { |
| | | data() { |
| | | return { |
| | | examPaperCount: 0, |
| | | questionCount: 0, |
| | | doExamPaperCount: 0, |
| | | doQuestionCount: 0, |
| | | echartsUserAction: null, |
| | | echartsQuestion: null, |
| | | loading: false |
| | | } |
| | | state: { |
| | | // 学生名单 |
| | | listStudents: listStudent.studentsArr, |
| | | // 老师名单 |
| | | listTeachers: listTeacher.TeachersArr, |
| | | // 学生总数 |
| | | countStudents: countStudent.countStudent, |
| | | }, |
| | | }; |
| | | }, |
| | | mounted () { |
| | | // eslint-disable-next-line no-undef |
| | | this.echartsUserAction = echarts.init(document.getElementById('echarts-moth-user'), 'macarons') |
| | | // eslint-disable-next-line no-undef |
| | | this.echartsQuestion = echarts.init(document.getElementById('echarts-moth-question'), 'macarons') |
| | | let _this = this |
| | | this.loading = true |
| | | dashboardApi.index().then(re => { |
| | | let response = re.response |
| | | _this.examPaperCount = response.examPaperCount |
| | | _this.questionCount = response.questionCount |
| | | _this.doExamPaperCount = response.doExamPaperCount |
| | | _this.doQuestionCount = response.doQuestionCount |
| | | _this.echartsUserAction.setOption(this.option('用户活跃度', '{b}日{c}度', response.mothDayText, response.mothDayUserActionValue)) |
| | | _this.echartsQuestion.setOption(this.option('题目月数量', '{b}日{c}题', response.mothDayText, response.mothDayDoExamQuestionValue)) |
| | | this.loading = false |
| | | }) |
| | | computed: { |
| | | // ...mapState(["listStudents", "listTeachers", "countStudents"]), |
| | | }, |
| | | methods: { |
| | | option (title, formatter, label, vaule) { |
| | | return { |
| | | title: { |
| | | text: title, |
| | | x: 'center' |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item', |
| | | formatter: formatter |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: label |
| | | }, |
| | | grid: { |
| | | left: 10, |
| | | right: 10, |
| | | bottom: 20, |
| | | top: 30, |
| | | containLabel: true |
| | | }, |
| | | yAxis: { |
| | | type: 'value' |
| | | }, |
| | | series: [{ |
| | | data: vaule, |
| | | type: 'line' |
| | | }] |
| | | // ...mapActions(["getListStudents", "getListTeachers", "getCountStudents"]), |
| | | // 查看详情 |
| | | viewDetails(v) { |
| | | console.log(v); |
| | | }, |
| | | }, |
| | | mounted() { |
| | | // this.getListStudents(); |
| | | // this.getListTeachers(); |
| | | // this.getCountStudents(); |
| | | // console.log(this.listStudents, "+++++++++++++++"); |
| | | // this.getAll(); |
| | | }, |
| | | created() {}, |
| | | }; |
| | | </script> |
| | | <style scoped lang="scss"> |
| | | .main { |
| | | margin-top: 100px; |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | width: 1300px; |
| | | } |
| | | .m1 { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | width: 640px; |
| | | justify-content: space-between; |
| | | align-items: baseline; |
| | | margin-bottom: 20px; |
| | | } |
| | | .card { |
| | | background: white; |
| | | border-radius: 10px; |
| | | padding: 10px 20px; |
| | | box-sizing: border-box; |
| | | display: inline-block; |
| | | |
| | | &-title { |
| | | font-size: 16px; |
| | | color: #777; |
| | | margin-bottom: 0; |
| | | } |
| | | &-num { |
| | | font-size: 32px; |
| | | font-weight: 700; |
| | | margin: 5px 0; |
| | | } |
| | | &-d { |
| | | color: #777; |
| | | font-size: 12px; |
| | | margin-top: 5px; |
| | | } |
| | | } |
| | | .bar { |
| | | width: 100%; |
| | | height: 10px; |
| | | background-color: rgb(242, 242, 242); |
| | | &-r { |
| | | background-color: red; |
| | | height: 100%; |
| | | } |
| | | } |
| | | .m2 { |
| | | width: 630px; |
| | | height: 324px; |
| | | margin-bottom: 20px; |
| | | } |
| | | .m3 { |
| | | width: 467px; |
| | | height: 590px; |
| | | &-con { |
| | | display: flex; |
| | | align-items: center; |
| | | width: 100%; |
| | | margin-bottom: 15px; |
| | | justify-content: space-between; |
| | | & img { |
| | | width: 34px; |
| | | height: 34px; |
| | | border-radius: 34px; |
| | | } |
| | | & p { |
| | | margin: 0; |
| | | } |
| | | &-d { |
| | | color: #777; |
| | | font-size: 12px; |
| | | } |
| | | &-b { |
| | | // margin-left: ; |
| | | color: #f59b22; |
| | | } |
| | | } |
| | | &-btn { |
| | | display: flex; |
| | | justify-content: center; |
| | | & > button { |
| | | width: 175px; |
| | | height: 39px; |
| | | border-color: rgba(16, 71, 247, 1); |
| | | background: none; |
| | | border-radius: 5px; |
| | | color: rgba(16, 71, 247, 1); |
| | | transition: 0.2s; |
| | | cursor: pointer; |
| | | &:hover { |
| | | background: rgba(16, 71, 247, 1); |
| | | color: white; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | |
| | | .dashboard-container { |
| | | padding: 32px; |
| | | background-color: rgb(240, 242, 245); |
| | | position: relative; |
| | | |
| | | .chart-wrapper { |
| | | background: #fff; |
| | | padding: 16px 16px 0; |
| | | margin-bottom: 32px; |
| | | } |
| | | .m4 { |
| | | width: 790px; |
| | | height: 590px; |
| | | &-btn { |
| | | margin-top: 10px; |
| | | } |
| | | } |
| | | .scrollBar { |
| | | height: 80%; |
| | | overflow: auto; |
| | | } |
| | | // 滚动条 |
| | | .scrollBar::-webkit-scrollbar { |
| | | width: 0px; |
| | | height: 0px; |
| | | } |
| | | |
| | | @media (max-width: 1024px) { |
| | | .chart-wrapper { |
| | | padding: 8px; |
| | | } |
| | | } |
| | | //隐藏滚动条 |
| | | /deep/.el-table__body-wrapper::-webkit-scrollbar { |
| | | width: 0; |
| | | } |
| | | |
| | | .dashboard-editor-container { |
| | | padding: 32px; |
| | | background-color: rgb(240, 242, 245); |
| | | position: relative; |
| | | |
| | | .github-corner { |
| | | position: absolute; |
| | | top: 0px; |
| | | border: 0; |
| | | right: 0; |
| | | } |
| | | |
| | | .chart-wrapper { |
| | | background: #fff; |
| | | padding: 16px 16px 0; |
| | | margin-bottom: 32px; |
| | | } |
| | | } |
| | | |
| | | @media (max-width: 1024px) { |
| | | .chart-wrapper { |
| | | padding: 8px; |
| | | } |
| | | } |
| | | |
| | | .panel-group { |
| | | margin-top: 18px; |
| | | |
| | | .card-panel-col { |
| | | margin-bottom: 32px; |
| | | } |
| | | |
| | | .card-panel { |
| | | height: 108px; |
| | | cursor: pointer; |
| | | font-size: 12px; |
| | | position: relative; |
| | | overflow: hidden; |
| | | color: #666; |
| | | background: #fff; |
| | | box-shadow: 4px 4px 40px rgba(0, 0, 0, .05); |
| | | border-color: rgba(0, 0, 0, .05); |
| | | |
| | | &:hover { |
| | | .card-panel-icon-wrapper { |
| | | color: #fff; |
| | | } |
| | | |
| | | .icon-people { |
| | | background: #40c9c6; |
| | | } |
| | | |
| | | .icon-message { |
| | | background: #36a3f7; |
| | | } |
| | | |
| | | .icon-money { |
| | | background: #f4516c; |
| | | } |
| | | |
| | | .icon-shopping { |
| | | background: #34bfa3 |
| | | } |
| | | } |
| | | |
| | | .icon-people { |
| | | color: #40c9c6; |
| | | } |
| | | |
| | | .icon-message { |
| | | color: #36a3f7; |
| | | } |
| | | |
| | | .icon-money { |
| | | color: #f4516c; |
| | | } |
| | | |
| | | .icon-shopping { |
| | | color: #34bfa3 |
| | | } |
| | | |
| | | .card-panel-icon-wrapper { |
| | | float: left; |
| | | margin: 14px 0 0 14px; |
| | | padding: 16px; |
| | | transition: all 0.38s ease-out; |
| | | border-radius: 6px; |
| | | } |
| | | |
| | | .card-panel-icon { |
| | | float: left; |
| | | font-size: 48px; |
| | | } |
| | | |
| | | .card-panel-description { |
| | | float: right; |
| | | font-weight: bold; |
| | | margin: 26px; |
| | | margin-left: 0px; |
| | | |
| | | .card-panel-text { |
| | | line-height: 18px; |
| | | color: rgba(0, 0, 0, 0.45); |
| | | font-size: 16px; |
| | | margin-bottom: 12px; |
| | | } |
| | | |
| | | .card-panel-num { |
| | | font-size: 20px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | @media (max-width: 550px) { |
| | | .card-panel-description { |
| | | display: none; |
| | | } |
| | | |
| | | .card-panel-icon-wrapper { |
| | | float: none !important; |
| | | width: 100%; |
| | | height: 100%; |
| | | margin: 0 !important; |
| | | |
| | | .svg-icon { |
| | | display: block; |
| | | margin: 14px auto !important; |
| | | float: none !important; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .echarts-line{ |
| | | background:#fff; |
| | | padding:16px 16px 0; |
| | | margin-bottom:32px; |
| | | } |
| | | .content_padding { |
| | | margin: 20px 0; |
| | | } |
| | | </style> |