Commit a1b82268 authored by 张伯涛's avatar 张伯涛

课程管理页面

parent 3e41afba
......@@ -3,4 +3,4 @@ ENV = 'test'
# 测试环境
# base api
VUE_APP_BASE_API = 'http://192.144.239.97:20075/'
VUE_APP_BASE_API = 'http://49.232.167.247:20024/'
......@@ -41,7 +41,8 @@
"vue-pdf": "^4.1.0",
"vue-router": "3.0.6",
"vuedraggable": "^2.23.2",
"vuex": "3.1.0"
"vuex": "3.1.0",
"vue-video-player": "^5.0.0"
},
"devDependencies": {
"@babel/core": "7.0.0",
......
......@@ -6,7 +6,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="<%= BASE_URL %>liulanqi_logo.png">
<!-- <link rel="stylesheet" href="//at.alicdn.com/t/font_2011217_f70ptj9y4oc.css">-->
<title><%= webpackConfig.name %></title>
<!-- <title><%= webpackConfig.name %></title>-->
<title>教育资源云平台</title>
</head>
<body>
<noscript>
......
......@@ -11,7 +11,7 @@ import Qs from 'qs'
// 查询异常日志列表
export function list(query) {
return request({
url: '/monitor/errorLog/list',
url: '/monitor/errorLog/queryErrorLogListByPagination',
method: 'get',
params: query
})
......
......@@ -11,7 +11,7 @@ import Qs from 'qs'
// 查询登录日志列表
export function list(query) {
return request({
url: '/monitor/loginInfo/list',
url: '/monitor/loginInfo/querySysLoginListByPagination',
method: 'get',
params: query
})
......
......@@ -11,7 +11,7 @@ import Qs from 'qs'
// 查询操作日志列表
export function list(query) {
return request({
url: '/monitor/operLog/list',
url: '/monitor/operLog/queryOperLogListByPagination',
method: 'get',
params: query
})
......
......@@ -66,7 +66,7 @@ export function statusChange(data) {
// 5.查询部门列表
export function listDept(query) {
return request({
url: '/system/dept/listAll',
url: '/system/dept/list',
method: 'get',
params: query
})
......
<template>
<div class="down-con">
<img src="../../assets/image/icon/rar.png">
<span @click="download" class="downloads">{{fileName}} </span>
<a @click="download" class="btn">点击下载</a>
</div>
</template>
<style>
.down-con{
display: flex;
justify-content: center;
align-items: center;
flex-direction:column;
background-color: #EEF1F6;
}
.down-con img {
/*width: 64px;height: 64px;*/
display: block;
}
.down-con .btn {
color: #7ECEF4;cursor: pointer
}
.downloads{
max-width: 300px;
display: block;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
float: left;
}
.downloads:hover{
text-decoration:underline;
cursor:pointer;
}
</style>
<script>
export default{
data(){
return {
}
},
methods: {
download(){
// console.log("122")
// let _this = this;
// _this.fullscreenLoading=true;
// this.eduUtil.ajaxGetUtil('BVideo/downloadFileWithoutAuth',{
// chapterId:_this.chpId
// },res=>{
// _this.fullscreenLoading=false;
// if(res.code) {
// _this.$notify({
// title: '操作提示',
// message: '文件可能不存在,下载失败!',
// type: 'warning'
// });
// return;
// }
// var blob = new Blob([res])
// var link = document.createElement('a');
// link.href = URL.createObjectURL(blob);
// link.download = _this.fileName;
// link.click();
//// window.URL.revokeObjectURL(link.href);
//
// },err=>{
// _this.fullscreenLoading=false;
// _this.$notify({
// title: '错误',
// message: '网络错误'+err,
// type: 'error'
// });
// })
window.location.href = this.interfaceUrl + 'BVideo/downloadFileWithoutAuth?chapterId='+this.chpId;
},
},
components: {},
props:['fileName','chpId'],
mounted(){
}
}
</script>
<template>
<div class="pdf-container">
<div class="tool-bar">
<input @keyup.enter="toPage" @blur="toPage" onkeypress="return event.keyCode>=48&&event.keyCode<=57" ng-pattern="/[^a-zA-Z]/" v-model="page" >&nbsp;/&nbsp;{{numPages}}
<a class="resize" @click="toLittle">-</a>
<a class="resize" @click="toBig">+</a>
<a class="aRotate" @click="rotate += 90">&#x27F3;</a>
<a class="aRotate" @click="rotate -= 90">&#x27F2;</a>
</div>
<div class="pdf" @scroll="onScroll()">
<div class="pdfList">
<pdf
class="pdfItem"
v-for="(i,index) in numPages"
:key="i"
:src="src"
:page="i"
style="display: inline-block; width: 100%"
:id="index"
:rotate="rotate"
></pdf>
</div>
</div>
</div>
</template>
<script>
import pdf from 'vue-pdf'
export default {
components: {
pdf: pdf
},
data () {
return {
src: "",
numPages: undefined,
page:1,
rotate: 0,
pageArr:[1]
}
},
watch: {
page (curVal,oldVal) {
let newPage = parseInt(curVal)
if(newPage>0 && newPage<(this.numPages+1)){
let arr = this.pageArr;
if($.inArray(newPage,arr)==-1){
this.pageArr.push(newPage);
console.log(this.pageArr);
if(this.pageArr.length>(this.numPages-3)){
this.$emit('seeComplete');
}
}
}else {
this.page = this.numPages
}
// this.page = parseInt((this.page).toString().replace(/[^A-Za-z0-9\u4e00-\u9fa5]/g, '') || 1) > this.numPages ? this.numPages : parseInt((this.page).toString().replace(/[^A-Za-z0-9\u4e00-\u9fa5]/g, '') || 1);
},
},
props: ['pdfSrc'],
methods: {
// handleInput(e){
// this.page=parseInt(e.target.value.replace(/[^\d]/g,''));
// },
toPage(){
console.log("toPage-----------");
let newPage = parseInt(this.page);
if(newPage<1||$.trim(this.page)==""){
console.log("toPage-----------<1");
this.page = 1;
}
if(newPage>this.numPages){
console.log("toPage----------->total");
this.page = this.numPages;
}
window.location.hash=(this.page-1)+"";
},
toLittle(){
let cW = $('.pdf-container').width();
let cH = $('.pdf-container').height();
let pW = $('.pdfList').width();
let pH = $('.pdfList').height();
if(pW*5/6<cW*0.01 || (pH*5/6/this.numPages)<cH*0.01){
return;
}
// let newW = pW*5/6<cW*0.3?cW*0.3:pW*5/6;
// let newH = (pH*5/6/this.numPages)<cH*0.3?cH*0.3*this.numPages:pH*5/6;
let newW = pW*5/6;
let newH = pH*5/6;
$('.pdfList').width(newW);
$('.pdfList').height(newH);
},
toBig(){
let cW = $('.pdf-container').width();
let cH = $('.pdf-container').height();
let pW = $('.pdfList').width();
let pH = $('.pdfList').height();
let newW,newH;
if(pW*6/5>cW && (pH*6/5/this.numPages)>cH){
return;
}
// newW = pW*6/5>cW?cW:pW*6/5;
// newH = (pH*6/5/this.numPages)>cH?cH*this.numPages:pH*6/5;
newW = pW*6/5;
newH = pH*6/5;
$('.pdfList').width(newW);
$('.pdfList').height(newH);
},
onScroll () {
let itemHeight = $('.pdfItem').height()+15;//$('.pdfList').height()/this.numPages;
let scrolled = $('.pdf')[0].scrollTop;
this.page = parseInt((scrolled+itemHeight/2+20)/(itemHeight))+1;
},
},
beforeMount(){
this.src = pdf.createLoadingTask(this.pdfSrc)
// this.src = 'https://cdn.mozilla.net/pdfjs/tracemonkey.pdf'
},
mounted() {
let that = this;
this.src.then(pdf => {
that.numPages = pdf.numPages;
if(pdf.numPages<3){
that.$emit('seeComplete');
}
// $('.pdf').onscroll(this.onScroll);
});
}
}
</script>
<style scoped>
.pdf-container {
background-color: rgb(82, 86, 89);
text-align: center;
height: 100%;
flex-flow: column;
display:flex;
overflow: hidden;
}
.tool-bar {
width: 100%;
background: rgb(50, 54, 57);
height: 48px;
line-height: 48px;
box-shadow: 0 2px 6px 0 rgb(50, 54, 57);
color: rgb(241, 241, 241);
text-align: center;
font-size: 13px;
}
.tool-bar a {
color: rgb(241, 241, 241);
cursor: pointer;
}
.tool-bar a:hover {
color: #ff6b1b;
}
.tool-bar input {
font-size: 15px;
display: inline-block;
color: rgb(241, 241, 241);
width: 100px;
text-align: center;
max-width: 20px;
border: 1px solid #0D242D;
background: transparent;
border: none;
border-bottom: 1px solid #ff6b1b;
}
.pdfList {
display: inline-block;
margin-top: 20px;
width: 60%;
}
.pdfList div {
background: #fff;
border-radius: 5px;
margin-top: 5px;
margin-bottom: 10px;
box-shadow: 1px 4px 10px 2px rgb(50, 54, 57);
}
.aRotate {
font-size: 16px;
float: right;
margin-right: 15px;
}
.resize {
font-size: 25px;
float: right;
margin-right: 15px;
}
.pdf {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
}
</style>
<template>
<div class="ppt-container">
<div class="tool-bar">
<a @click="toMinus">上一页</a>
<input @keyup.enter="toPage" @blur="toPage" onkeypress="return event.keyCode>=48&&event.keyCode<=57" ng-pattern="/[^a-zA-Z]/" v-model="pageInput" >&nbsp;/&nbsp;{{numPages}}
<a @click="toAdd">下一页</a>
</div>
<div class="ppt">
<pdf :src="pdfSrc" :page="page" @num-pages="numPages = $event"></pdf>
</div>
</div>
</template>
<script>
import pdf from 'vue-pdf'
export default {
components: {
pdf: pdf
},
data () {
return {
loadedRatio: 0,
page: 1,
pageArr:[1],
pageInput:1,
numPages: 0,
rotate: 0,
}
},
watch: {
page (curVal,oldVal) {
let newPage = parseInt(curVal);
console.log(newPage);
if(newPage>0 && newPage<(this.numPages+1)){
let arr = this.pageArr;
if($.inArray(newPage,arr)==-1){
this.pageArr.push(newPage);
console.log(this.pageArr);
if(this.pageArr.length>(this.numPages*2/3)){
this.$emit('seeComplete');
}
}
}
// this.page = parseInt((this.page).toString().replace(/[^A-Za-z0-9\u4e00-\u9fa5]/g, '') || 1) > this.numPages ? this.numPages : parseInt((this.page).toString().replace(/[^A-Za-z0-9\u4e00-\u9fa5]/g, '') || 1);
},
},
props:['pdfSrc'],
methods: {
toPage(){
let newPage = parseInt(this.pageInput);
if(newPage<1||$.trim(this.pageInput)==""){
this.page = 1;
this.pageInput = 1;
return;
}
if(newPage>this.numPages){
this.page = this.numPages;
this.pageInput = this.numPages;
return;
}
this.page = newPage;
},
toMinus(){
if(this.page>1){
this.page -=1;
this.pageInput=this.page;
}
},
toAdd(){
if(this.page<this.numPages){
this.page +=1;
this.pageInput=this.page;
}
}
},
mounted(){
let that = this;
setTimeout(()=>{
if(that.numPages<3){
that.$emit('seeComplete');
}
},3000);
console.log(11111111111);
console.log(this.pdfSrc);
}
}
</script>
<style scoped>
.tool-bar {
background: rgb(50, 54, 57);
height: 48px !important;
line-height: 48px;
box-shadow: 0 2px 0 #ececec;
color: rgb(241, 241, 241);
text-align: center;
font-size: 13px;
}
.tool-bar a {
color: rgb(241, 241, 241);
cursor: pointer;
}
.tool-bar a:hover {
color: #ff6b1b;
}
.tool-bar input {
font-size: 15px;
display: inline-block;
color: rgb(241, 241, 241);
width: 100px;
text-align: center;
max-width: 20px;
border: 1px solid #0D242D;
background: transparent;
border: none;
border-bottom: 1px solid #ff6b1b;
}
.ppt-container {
background-color: rgb(82, 86, 89);
text-align: center;
height: 100%;
overflow: hidden;
}
.ppt {
display: inline-block;
text-align: center;
width: 100%;
height: 100%;
overflow-y: auto;
overflow-x: hidden;
}
.ppt div {
display: inline-block;
width: 80%;
background: #fff;
border-radius: 5px;
margin-top: 10px;
margin-bottom: 10px;
box-shadow: 1px 4px 10px 2px rgb(50, 54, 57);
}
</style>
<template>
<div class="item">
<div class="player">
<video-player class="vjs-custom-skin"
ref="videoPlayer"
:options="playerOptions"
:playsinline="true"
@play="onPlayerPlay($event)"
@pause="onPlayerPause($event)"
@ended="onPlayerEnded($event)"
@loadeddata="onPlayerLoadeddata($event)"
@waiting="onPlayerWaiting($event)"
@playing="onPlayerPlaying($event)"
@timeupdate="onPlayerTimeupdate($event)"
@canplay="onPlayerCanplay($event)"
@canplaythrough="onPlayerCanplaythrough($event)"
@ready="playerReadied"
@statechanged="playerStateChanged($event)">
</video-player>
</div>
</div>
</template>
<script>
import 'video.js/dist/video-js.css'
import { videoPlayer } from 'vue-video-player'
export default {
data() {
return {
// videojs options
}
},
components:{
videoPlayer
},
props:['playerOptions'],
mounted() {
// console.log('this is current player instance object', this.player)
setTimeout(() => {
//console.log('dynamic change options', this.player)
this.player.muted(false)
}, 2000)
},
computed: {
player() {
return this.$refs.videoPlayer.player
}
},
methods: {
// listen event
onPlayerPlay(player) {
// console.log('player play!', player)
},
onPlayerPause(player) {
// console.log('player pause!', player)
},
onPlayerEnded(player) {
this.$emit('seeComplete');
// console.log('player ended!', player)
},
onPlayerLoadeddata(player) {
// console.log('player Loadeddata!', player)
},
onPlayerWaiting(player) {
// console.log('player Waiting!', player)
},
onPlayerPlaying(player) {
// console.log('player Playing!', player)
},
onPlayerTimeupdate(player) {
// console.log('player Timeupdate!', player.currentTime())
},
onPlayerCanplay(player) {
// console.log('player Canplay!', player)
},
onPlayerCanplaythrough(player) {
// console.log('player Canplaythrough!', player)
},
// or listen state event
playerStateChanged(playerCurrentState) {
// console.log('player current update state', playerCurrentState)
},
// player is ready
playerReadied(player) {
// seek to 10s
// console.log('example player 1 readied', player)
player.currentTime(0)
// console.log('example 01: the player is readied', player)
}
}
}
</script>
<style >
.vjs-custom-skin > .video-js {
width: 100%;
font-family: "PingFang SC","Helvetica Neue","Hiragino Sans GB","Segoe UI","Microsoft YaHei","微软雅黑",sans-serif;
}
.vjs-custom-skin > .video-js .vjs-menu-button-inline.vjs-slider-active,.vjs-custom-skin > .video-js .vjs-menu-button-inline:focus,.vjs-custom-skin > .video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline {
width: 10em
}
.vjs-custom-skin > .video-js .vjs-controls-disabled .vjs-big-play-button {
display: none!important
}
.vjs-custom-skin > .video-js .vjs-control {
width: 3em
}
.vjs-custom-skin > .video-js .vjs-control.vjs-live-control{
width: auto;
padding-left: .5em;
letter-spacing: .1em;
}
.vjs-custom-skin > .video-js .vjs-menu-button-inline:before {
width: 1.5em
}
.vjs-menu-button-inline .vjs-menu {
left: 3em
}
.vjs-paused.vjs-has-started.vjs-custom-skin > .video-js .vjs-big-play-button,.video-js.vjs-ended .vjs-big-play-button,.video-js.vjs-paused .vjs-big-play-button {
display: block
}
.vjs-custom-skin > .video-js .vjs-load-progress div,.vjs-seeking .vjs-big-play-button,.vjs-waiting .vjs-big-play-button {
display: none!important
}
.vjs-custom-skin > .video-js .vjs-mouse-display:after,.vjs-custom-skin > .video-js .vjs-play-progress:after {
padding: 0 .4em .3em
}
.video-js.vjs-ended .vjs-loading-spinner {
display: none;
}
.video-js.vjs-ended .vjs-big-play-button {
display: block !important;
}
.video-js.vjs-ended .vjs-big-play-button,.video-js.vjs-paused .vjs-big-play-button,.vjs-paused.vjs-has-started.vjs-custom-skin > .video-js .vjs-big-play-button {
display: block
}
.vjs-custom-skin > .video-js .vjs-big-play-button {
top: 50%;
left: 50%;
margin-left: -1.5em;
margin-top: -1em
}
.vjs-custom-skin > .video-js .vjs-big-play-button {
background-color: rgba(0,0,0,0.45);
font-size: 3.5em;
/*border-radius: 50%;*/
height: 2em !important;
line-height: 2em !important;
margin-top: -1em !important
}
.video-js:hover .vjs-big-play-button,.vjs-custom-skin > .video-js .vjs-big-play-button:focus,.vjs-custom-skin > .video-js .vjs-big-play-button:active {
background-color: rgba(36,131,213,0.9)
}
.vjs-custom-skin > .video-js .vjs-loading-spinner {
border-color: rgba(36,131,213,0.8)
}
.vjs-custom-skin > .video-js .vjs-control-bar2 {
background-color: #000000
}
.vjs-custom-skin > .video-js .vjs-control-bar {
/*background-color: rgba(0,0,0,0.3) !important;*/
color: #ffffff;
font-size: 14px
}
.vjs-custom-skin > .video-js .vjs-play-progress,.vjs-custom-skin > .video-js .vjs-volume-level {
background-color: #2483d5
}
.vjs-custom-skin > .video-js .vjs-play-progress:before {
top: -0.3em;
}
.vjs-custom-skin > .video-js .vjs-progress-control:hover .vjs-progress-holder {
font-size: 1.3em;
}
.vjs-menu-button-popup.vjs-volume-menu-button-vertical .vjs-menu {
left: 0em;
}
.vjs-custom-skin > .video-js .vjs-menu li {
padding: 0;
line-height: 2em;
font-size: 1.1em;
font-family: "PingFang SC","Helvetica Neue","Hiragino Sans GB","Segoe UI","Microsoft YaHei","微软雅黑",sans-serif;
}
.vjs-custom-skin > .video-js .vjs-time-tooltip,
.vjs-custom-skin > .video-js .vjs-mouse-display:after,
.vjs-custom-skin > .video-js .vjs-play-progress:after {
border-radius: 0;
font-size: 1em;
padding: 0;
width: 3em;
height: 1.5em;
line-height: 1.5em;
top: -3em;
}
.vjs-custom-skin > .video-js .vjs-menu-button-popup .vjs-menu {
width: 5em;
left: -1em;
}
.vjs-custom-skin > .video-js .vjs-menu-button-popup.vjs-volume-menu-button-vertical .vjs-menu {
left: 0;
}
.vjs-custom-skin > .video-js .vjs-control-bar .vjs-resolution-button .vjs-menu {
/*order: 4;*/
}
/*排序顺序*/
.vjs-custom-skin > .video-js .vjs-control-bar .vjs-play-control {
order: 0;
}
.vjs-custom-skin > .video-js .vjs-control-bar .vjs-time-control {
min-width: 1em;
padding: 0;
margin: 0 .1em;
text-align: center;
display: block;
order: 1;
}
.vjs-custom-skin > .video-js .vjs-control-bar .vjs-playback-rate .vjs-playback-rate-value{
font-size: 1.2em;
line-height: 2.4;
}
.vjs-custom-skin > .video-js .vjs-progress-control.vjs-control {
order: 2;
}
.vjs-custom-skin > .video-js .vjs-control-bar .vjs-volume-menu-button {
order: 3;
}
.vjs-custom-skin > .video-js .vjs-control-bar .vjs-resolution-button {
order: 4;
}
.vjs-custom-skin > .video-js .vjs-control-bar .vjs-resolution-button .vjs-resolution-button-label {
display: block;
line-height: 3em;
}
.vjs-custom-skin > .video-js .vjs-control-bar .vjs-playback-rate {
order: 5;
}
.vjs-custom-skin > .video-js .vjs-control-bar .vjs-fullscreen-control {
order: 6;
}
*{outline:none}
</style>
......@@ -28,7 +28,7 @@ export default {
},
data() {
return {
title: '信息化管理系统'
title: '教育资源云平台'
// logo: require('@/assets/image/denglu_logo@2x.png')
}
},
......
......@@ -24,7 +24,7 @@ export default {
},
data() {
return {
title: '信息化管理系统',
title: '教育资源云平台',
logo: 'https://image-1252351428.cos.ap-beijing.myqcloud.com/home_logo.png'
}
},
......
module.exports = {
title: '信息化管理系统',
title: '教育资源云平台',
/**
* @type {boolean} true | false
......
This diff is collapsed.
......@@ -7,7 +7,7 @@
<div class="login_form_logo" />
</div>
<div class="loginTitleRow">
<div class="title">信息化管理系统</div>
<div class="title">教育资源云平台</div>
</div>
<div class="login-form-content">
<el-form-item prop="username">
......@@ -246,9 +246,6 @@ export default {
// this.$router.push({ path: `http://main.court.com${this.redirect || "/"}` });
// this.$router.push('/welcome')
this.$router.push('/controlPlatform/control')
setTimeout(() => {
this.loading = false
}, 1000)
}).catch(() => {
this.loading = false
this.verify = false
......
......@@ -46,11 +46,11 @@
>{{ commonField.resetName }}</el-button>
</el-form-item>
<el-form-item style="float: right">
<el-button
:class="commonField.addClass"
:type="commonField.typePrimary"
@click="handleTest"
>图片预览测试</el-button>
<!-- <el-button-->
<!-- :class="commonField.addClass"-->
<!-- :type="commonField.typePrimary"-->
<!-- @click="handleTest"-->
<!-- >图片预览测试</el-button>-->
<!-- //新增按钮-->
<el-button
v-hasPermi="hasAddPerm"
......
......@@ -57,7 +57,7 @@ module.exports = {
open: false,
proxy: {
[process.env.VUE_APP_BASE_API]: {
target: `http://192.168.1.78:8082/`,
target: `http://192.168.1.41:8090/`,
// target: `http://192.168.1.21:8001/`, // 张宇
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
......@@ -75,14 +75,14 @@ module.exports = {
},
chainWebpack(config) {
// 删除注释
config.optimization.minimizer('terser').tap(args => {
// 直接修改 terserOptions 下的属性值,保留原有配置
// 这里访问 terserOptions 的时候并没有 output,访问不到 output.comments 需要直接赋值
args[0].terserOptions.output = {
comments: false,
}
return args
})
// config.optimization.minimizer('terser').tap(args => {
// // 直接修改 terserOptions 下的属性值,保留原有配置
// // 这里访问 terserOptions 的时候并没有 output,访问不到 output.comments 需要直接赋值
// args[0].terserOptions.output = {
// comments: false,
// }
// return args
// })
config.plugins.delete('preload') // TODO: need test
config.plugins.delete('prefetch') // TODO: need test
config.module
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment