完成全部功能
This commit is contained in:
父節點
b839c99028
當前提交
8b0fcca7bc
@ -1,12 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<v-app>
|
<v-app>
|
||||||
<!-- src="https://api.ixiaowai.cn/api/api.php"-->
|
<v-app-bar app>
|
||||||
<v-app-bar app :dark="useDarkTheme">
|
<v-app-bar-nav-icon @click="navigateToHome">
|
||||||
<v-app-bar-nav-icon></v-app-bar-nav-icon>
|
<v-icon>mdi-home</v-icon>
|
||||||
|
</v-app-bar-nav-icon>
|
||||||
<v-toolbar-title class="text-h5">slader-legacy</v-toolbar-title>
|
<v-toolbar-title class="text-h5">slader-legacy</v-toolbar-title>
|
||||||
<v-spacer></v-spacer>
|
<v-spacer></v-spacer>
|
||||||
<v-btn icon>
|
<v-btn icon>
|
||||||
<v-icon @click="useDarkTheme=!useDarkTheme">mdi-brightness-6</v-icon>
|
<v-icon @click="toggleDarkTheme">mdi-brightness-6</v-icon>
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</v-app-bar>
|
</v-app-bar>
|
||||||
<v-main>
|
<v-main>
|
||||||
@ -14,7 +15,10 @@
|
|||||||
<v-row justify="center">
|
<v-row justify="center">
|
||||||
<v-col md="8" sm="12">
|
<v-col md="8" sm="12">
|
||||||
<v-card :loading="cardLoading">
|
<v-card :loading="cardLoading">
|
||||||
<router-view @loadingSignal="cardLoadingCompleted" class="pa-4"></router-view>
|
<keep-alive>
|
||||||
|
<router-view @setCardLoadingStatus="handleSetCardLoadingStatus" class="pa-4"></router-view>
|
||||||
|
</keep-alive>
|
||||||
|
|
||||||
</v-card>
|
</v-card>
|
||||||
</v-col>
|
</v-col>
|
||||||
</v-row>
|
</v-row>
|
||||||
@ -22,7 +26,7 @@
|
|||||||
</v-main>
|
</v-main>
|
||||||
<v-footer padless>
|
<v-footer padless>
|
||||||
<v-col cols="12" class="text-center">
|
<v-col cols="12" class="text-center">
|
||||||
slader-legacy {{new Date().getFullYear()}}
|
slader-legacy {{ new Date().getFullYear() }}
|
||||||
</v-col>
|
</v-col>
|
||||||
</v-footer>
|
</v-footer>
|
||||||
</v-app>
|
</v-app>
|
||||||
@ -31,7 +35,7 @@
|
|||||||
<script>
|
<script>
|
||||||
|
|
||||||
import TextbookBlock from "@/components/TextbookBlock"
|
import TextbookBlock from "@/components/TextbookBlock"
|
||||||
import {showServerErrorAlert} from "@/includes"
|
import {cardLoadingStatusCheck, showServerErrorAlert} from "@/includes"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'App',
|
||||||
@ -40,17 +44,20 @@ export default {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
useDarkTheme: false,
|
|
||||||
cardLoading: true
|
cardLoading: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
created() {
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
cardLoadingCompleted(status) {
|
handleSetCardLoadingStatus(status) {
|
||||||
if (status) {
|
this.cardLoading = status
|
||||||
this.cardLoading = false
|
},
|
||||||
} else {
|
navigateToHome() {
|
||||||
showServerErrorAlert()
|
this.$router.push('/')
|
||||||
}
|
},
|
||||||
|
toggleDarkTheme() {
|
||||||
|
this.$vuetify.theme.dark = !this.$vuetify.theme.dark
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,16 @@
|
|||||||
|
|
||||||
<v-card outlined shaped hover height="329">
|
<v-card outlined shaped hover height="329">
|
||||||
<div @click="openTextbook">
|
<div @click="openTextbook">
|
||||||
<v-img :src="imgSrc" height="210"></v-img>
|
<v-img :src="imgSrc" height="210">
|
||||||
|
<template #placeholder>
|
||||||
|
<v-row class="fill-height" align="center" justify="center">
|
||||||
|
<v-progress-circular
|
||||||
|
indeterminate
|
||||||
|
color="primary"
|
||||||
|
></v-progress-circular>
|
||||||
|
</v-row>
|
||||||
|
</template>
|
||||||
|
</v-img>
|
||||||
<v-card-subtitle class="text-truncate subtitle-2">
|
<v-card-subtitle class="text-truncate subtitle-2">
|
||||||
{{ textbookTitleRefined }}
|
{{ textbookTitleRefined }}
|
||||||
</v-card-subtitle>
|
</v-card-subtitle>
|
||||||
@ -33,8 +42,8 @@ import {textbookTitleRefine} from "@/includes"
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "TextbookBlock",
|
name: "TextbookBlock",
|
||||||
computed:{
|
computed: {
|
||||||
textbookTitleRefined(){
|
textbookTitleRefined() {
|
||||||
return textbookTitleRefine(this.title)
|
return textbookTitleRefine(this.title)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -11,6 +11,14 @@
|
|||||||
><p class="font-weight-bold text-h5 mb-0 mx-5">题 {{ exercise }}</p></v-badge>
|
><p class="font-weight-bold text-h5 mb-0 mx-5">题 {{ exercise }}</p></v-badge>
|
||||||
</v-row>
|
</v-row>
|
||||||
<div class="mt-5" v-html="myHtml"></div>
|
<div class="mt-5" v-html="myHtml"></div>
|
||||||
|
<v-btn v-if="hasPreviousExercise" @click="goToExercise(previousExerciseIndex)" fab bottom left icon fixed
|
||||||
|
elevation="2" color="green">
|
||||||
|
<v-icon>mdi-arrow-left</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
<v-btn v-if="hasNextExercise" @click="goToExercise(nextExerciseIndex)" fab bottom right icon fixed elevation="2"
|
||||||
|
color="green">
|
||||||
|
<v-icon>mdi-arrow-right</v-icon>
|
||||||
|
</v-btn>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -20,23 +28,42 @@ import {showServerErrorAlert} from "@/includes"
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "Exercise",
|
name: "Exercise",
|
||||||
async created() {
|
created() {
|
||||||
if (!this.html) {
|
this.getExercise()
|
||||||
let resp = await myAxios.get('textbook/' + this.textbook + '/' + encodeURIComponent(this.section) + '/' + this.exercise)
|
},
|
||||||
if (!resp.data.status) {
|
watch:{
|
||||||
showServerErrorAlert()
|
exercise(){
|
||||||
return
|
console.log('watch exercise trigger')
|
||||||
}
|
this.getExercise()
|
||||||
this.myHtml = resp.data.data.html
|
|
||||||
this.myPage = resp.data.data.page
|
|
||||||
this.myPart = resp.data.data.part || 'exercises'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$emit('loadingSignal', true)
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
badgeContent() {
|
badgeContent() {
|
||||||
return this.section + ' - ' + this.myPage
|
return this.section + ' - ' + this.myPage
|
||||||
|
},
|
||||||
|
tableDataIndex() {
|
||||||
|
if (!this.tableData) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return this.tableData.findIndex(single => single.exercise === this.exercise)
|
||||||
|
},
|
||||||
|
hasPreviousExercise(){
|
||||||
|
return this.previousExerciseIndex !== false;
|
||||||
|
},
|
||||||
|
hasNextExercise(){
|
||||||
|
return this.nextExerciseIndex !== false;
|
||||||
|
},
|
||||||
|
previousExerciseIndex() {
|
||||||
|
if (this.tableDataIndex === false || this.tableDataIndex === 0) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return this.tableDataIndex - 1
|
||||||
|
},
|
||||||
|
nextExerciseIndex() {
|
||||||
|
if (this.tableDataIndex === false || this.tableDataIndex === this.tableData.length - 1) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return this.tableDataIndex + 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
@ -45,11 +72,34 @@ export default {
|
|||||||
exercise: [String, Number],
|
exercise: [String, Number],
|
||||||
page: Number,
|
page: Number,
|
||||||
part: String,
|
part: String,
|
||||||
html: String
|
html: String,
|
||||||
|
tableData: Array
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
goToExercise(exerciseIndex) {
|
||||||
|
this.$router.push({name: 'exercise', params: {...this.tableData[exerciseIndex], tableData: this.tableData}})
|
||||||
|
},
|
||||||
returnToSection() {
|
returnToSection() {
|
||||||
this.$router.push({name: 'section', params: {textbook: this.textbook, section: this.section}})
|
this.$router.push({name: 'section', params: {textbook: this.textbook, section: this.section}})
|
||||||
|
},
|
||||||
|
async getExercise() {
|
||||||
|
this.$emit('setCardLoadingStatus', true)
|
||||||
|
console.log('get exercise')
|
||||||
|
if (!this.html) {
|
||||||
|
let resp = await myAxios.get('textbook/' + this.textbook + '/' + encodeURIComponent(this.section) + '/' + this.exercise)
|
||||||
|
if (!resp.data.status) {
|
||||||
|
showServerErrorAlert()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.myHtml = resp.data.data.html
|
||||||
|
this.myPage = resp.data.data.page
|
||||||
|
this.myPart = resp.data.data.part || 'exercises'
|
||||||
|
} else {
|
||||||
|
this.myHtml = this.html
|
||||||
|
this.myPage = this.page
|
||||||
|
this.myPart = this.part
|
||||||
|
}
|
||||||
|
this.$emit('setCardLoadingStatus', false)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@ -63,23 +113,27 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.inline-picture-name{
|
.inline-picture-name {
|
||||||
margin: 50px 0;
|
margin: 50px 0;
|
||||||
border-top: 5px gray solid;
|
border-top: 5px gray solid;
|
||||||
padding-top: 20px;
|
padding-top: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.inline-picture-name img {
|
.inline-picture-name img {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
}
|
}
|
||||||
.object-ratings-wrap{
|
|
||||||
|
.object-ratings-wrap {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.open-comments{
|
|
||||||
|
.open-comments {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.row-counter{
|
|
||||||
|
.row-counter {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background-color: whitesmoke;
|
background-color: whitesmoke;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@ -87,40 +141,50 @@ export default {
|
|||||||
border-bottom: black 1px solid;
|
border-bottom: black 1px solid;
|
||||||
margin: 5px 0;
|
margin: 5px 0;
|
||||||
}
|
}
|
||||||
.result-heading{
|
|
||||||
|
.result-heading {
|
||||||
display: block;
|
display: block;
|
||||||
font-size: 25px;
|
font-size: 25px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
.solution-content img{
|
|
||||||
|
.solution-content img {
|
||||||
max-width: 90%;
|
max-width: 90%;
|
||||||
border: 1px solid black;
|
border: 1px solid black;
|
||||||
display: block;
|
display: block;
|
||||||
margin: 10px auto;
|
margin: 10px auto;
|
||||||
}
|
}
|
||||||
.image-reg{
|
|
||||||
display: none!important;
|
.image-reg {
|
||||||
|
display: none !important;
|
||||||
}
|
}
|
||||||
.unfinished-hover{
|
|
||||||
|
.unfinished-hover {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.annotations{
|
|
||||||
|
.annotations {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.comment-footer{
|
|
||||||
|
.comment-footer {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.center{
|
|
||||||
|
.center {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
.solution-content p{
|
|
||||||
|
.solution-content p {
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
font-family: "Times New Roman",serif;
|
font-family: "Times New Roman", serif;
|
||||||
}
|
}
|
||||||
.Paywall__footer-counter{
|
|
||||||
|
.Paywall__footer-counter {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.edit-toolbar{
|
|
||||||
|
.edit-toolbar {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import TextbookBlock from "@/components/TextbookBlock"
|
import TextbookBlock from "@/components/TextbookBlock"
|
||||||
import {myAxios} from "@/includes"
|
import {myAxios} from "@/includes"
|
||||||
|
import {showServerErrorAlert} from "@/includes"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Home',
|
name: 'Home',
|
||||||
@ -16,10 +17,13 @@ export default {
|
|||||||
myAxios.get('textbook').then(resp => {
|
myAxios.get('textbook').then(resp => {
|
||||||
if (resp.data.status) {
|
if (resp.data.status) {
|
||||||
this.textbooks = resp.data.data
|
this.textbooks = resp.data.data
|
||||||
|
}else{
|
||||||
|
showServerErrorAlert()
|
||||||
}
|
}
|
||||||
this.$emit('loadingSignal',resp.data.status)
|
this.$emit('setCardLoadingStatus',!resp.data.status)
|
||||||
}).catch(reason => {
|
}).catch(reason => {
|
||||||
this.$emit('loadingSignal',false)
|
showServerErrorAlert()
|
||||||
|
this.$emit('setCardLoadingStatus',true)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
|
@ -16,21 +16,18 @@ import {myAxios} from '@/includes'
|
|||||||
export default {
|
export default {
|
||||||
name: "Section",
|
name: "Section",
|
||||||
components: {StandardTable},
|
components: {StandardTable},
|
||||||
|
computed:{
|
||||||
|
textbookSection(){
|
||||||
|
return this.textbook+this.section
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch:{
|
||||||
|
textbookSection(){
|
||||||
|
this.getSection()
|
||||||
|
}
|
||||||
|
},
|
||||||
created() {
|
created() {
|
||||||
myAxios.get('textbook/' + this.textbook + '/' + encodeURIComponent(this.section)).then(resp => {
|
this.getSection()
|
||||||
if (resp.data.status) {
|
|
||||||
this.tableData = resp.data.data.map(single => {
|
|
||||||
let modified = single
|
|
||||||
if (!modified.part) {
|
|
||||||
modified.part = 'exercises'
|
|
||||||
}
|
|
||||||
return modified
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.$emit('loadingSignal', resp.data.status)
|
|
||||||
}).catch(reason => {
|
|
||||||
this.$emit('loadingSignal', false)
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
textbook: String,
|
textbook: String,
|
||||||
@ -43,7 +40,26 @@ export default {
|
|||||||
openExercise(item) {
|
openExercise(item) {
|
||||||
this.$router.push({
|
this.$router.push({
|
||||||
name: 'exercise',
|
name: 'exercise',
|
||||||
params: {...item}
|
params: {...item, tableData: this.tableData}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getSection() {
|
||||||
|
this.$emit('setCardLoadingStatus', true)
|
||||||
|
console.log('ajax get section')
|
||||||
|
this.tableData = []
|
||||||
|
myAxios.get('textbook/' + this.textbook + '/' + encodeURIComponent(this.section)).then(resp => {
|
||||||
|
if (resp.data.status) {
|
||||||
|
this.tableData = resp.data.data.map((single, index, array) => {
|
||||||
|
let modified = single
|
||||||
|
if (!modified.part) {
|
||||||
|
modified.part = 'exercises'
|
||||||
|
}
|
||||||
|
return modified
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.$emit('setCardLoadingStatus', !resp.data.status)
|
||||||
|
}).catch(reason => {
|
||||||
|
this.$emit('setCardLoadingStatus', true)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -13,6 +13,7 @@ import {textbookTitleRefine} from "@/includes"
|
|||||||
import {myAxios} from "@/includes"
|
import {myAxios} from "@/includes"
|
||||||
import Swal from "sweetalert2"
|
import Swal from "sweetalert2"
|
||||||
import StandardTable from "@/components/StandardTable"
|
import StandardTable from "@/components/StandardTable"
|
||||||
|
import {showServerErrorAlert} from "@/includes"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "Textbook",
|
name: "Textbook",
|
||||||
@ -22,31 +23,43 @@ export default {
|
|||||||
return textbookTitleRefine(this.textbook)
|
return textbookTitleRefine(this.textbook)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
watch:{
|
||||||
|
textbook(){
|
||||||
|
this.getTextbook()
|
||||||
|
}
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
goToHomePage() {
|
goToHomePage() {
|
||||||
this.$router.push('/')
|
this.$router.push('/')
|
||||||
},
|
},
|
||||||
openSection(item) {
|
openSection(item) {
|
||||||
this.$router.push({name: 'section', params: {textbook: this.textbook, section: item.section}})
|
this.$router.push({name: 'section', params: {textbook: this.textbook, section: item.section}})
|
||||||
|
},
|
||||||
|
getTextbook(){
|
||||||
|
this.$emit('setCardLoadingStatus', true)
|
||||||
|
this.tableData=[]
|
||||||
|
if (!this.textbook) {
|
||||||
|
Swal.fire({
|
||||||
|
title: '错误',
|
||||||
|
text: '没有指定textbook',
|
||||||
|
icon: 'error'
|
||||||
|
})
|
||||||
|
this.$router.push('/')
|
||||||
|
}
|
||||||
|
myAxios.get('textbook/' + this.textbook).then(resp => {
|
||||||
|
if (resp.data.status) {
|
||||||
|
this.tableData = resp.data.data
|
||||||
|
}else{
|
||||||
|
showServerErrorAlert()
|
||||||
|
}
|
||||||
|
this.$emit('setCardLoadingStatus', !resp.data.status)
|
||||||
|
}).catch(reason => {
|
||||||
|
this.$emit('setCardLoadingStatus', true)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
if (!this.textbook) {
|
this.getTextbook()
|
||||||
Swal.fire({
|
|
||||||
title: '错误',
|
|
||||||
text: '没有指定textbook',
|
|
||||||
icon: 'error'
|
|
||||||
})
|
|
||||||
this.$router.push('/')
|
|
||||||
}
|
|
||||||
myAxios.get('textbook/' + this.textbook).then(resp => {
|
|
||||||
if (resp.data.status) {
|
|
||||||
this.tableData = resp.data.data
|
|
||||||
}
|
|
||||||
this.$emit('loadingSignal', resp.data.status)
|
|
||||||
}).catch(reason => {
|
|
||||||
this.$emit('loadingSignal', false)
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
textbook: String
|
textbook: String
|
||||||
|
載入中…
x
新增問題並參考
Block a user