desc: 修改代码

This commit is contained in:
zyy 2019-11-04 10:33:45 +08:00
parent 92b06df4b4
commit 1c373822ee
7 changed files with 153 additions and 721 deletions

View File

@ -30,34 +30,34 @@ import login from './login';
import designPlatform from './designPlatform'; import designPlatform from './designPlatform';
export default { export default {
...cnLocale, ...cnLocale,
map, map,
global, global,
router, router,
lesson, lesson,
error, error,
teach, teach,
rules, rules,
scriptRecord, scriptRecord,
tip, tip,
system, system,
orderAuthor, orderAuthor,
publish, publish,
permission, permission,
replay, replay,
planMonitor, planMonitor,
screenMonitor, screenMonitor,
demonstration, demonstration,
exam, exam,
dashboard, dashboard,
jlmap3d, jlmap3d,
display, display,
joinTraining, joinTraining,
trainRoom, trainRoom,
menu, menu,
ibp, ibp,
approval, approval,
systemGenerate, systemGenerate,
login, login,
designPlatform designPlatform
}; };

View File

@ -92,7 +92,6 @@ export default {
} }
}, },
created() { created() {
debugger;
this.PlanConvert = this.$theme.loadPlanConvert(this.$route.query.skinCode); this.PlanConvert = this.$theme.loadPlanConvert(this.$route.query.skinCode);
}, },
mounted() { mounted() {
@ -209,8 +208,8 @@ export default {
}); });
}, },
handelRevert(row) { handelRevert(row) {
this.$confirm(this.$t('tip.cancelRunPlanTips'), this.$t('tip.hint'), { this.$confirm(this.$t('tip.cancelRunPlanTips'), this.$t('tip.hint'), {
confirmButtonText: this.$t('tip.confirm'), confirmButtonText: this.$t('tip.confirm'),
cancelButtonText: this.$t('tip.cancel'), cancelButtonText: this.$t('tip.cancel'),
type:'warning' type:'warning'
}).then(() => { }).then(() => {

View File

@ -1,252 +0,0 @@
<template>
<el-card>
<div slot="header" style="text-align: center;">
<span class=" title">{{ $t('global.line') + courseModel.name }}</span>
</div>
<div style="margin:50px; overflow-x: auto;" :style="{ height: height - 150 +'px' }">
<p class="list-item">
<span class="list-label">{{ $t('global.updateTime') }}</span>
<span class="list-elem">{{ courseModel.updateTime }}</span>
</p>
<p v-if="!courseModel.pmsList.length" class="list-item">
<span class="list-label">{{ $t('screenMonitor.productTrialDuration') }}</span>
<span class="list-elem">{{ showTryTime }}</span>
</p>
<p class="list-item">
<span class="list-label">{{ $t('global.permissionList') }}</span>
</p>
<limit-list ref="limitList" :course-model="courseModel" @initLoadPage="getScreenLists" />
<p style="display: flex; justify-content: center;">
<span class="list-label" />
<el-button type="success" @click="buy">{{ $t('global.buy') }}</el-button>
<el-button v-if="hasPermssion" type="primary" @click="distribute">{{ $t('global.distributePermission') }}</el-button>
<el-button v-if="hasPermssion" type="primary" @click="transfer">{{ $t('global.transferQRCode') }}</el-button>
<el-button type="primary" @click="start">{{ $t('screenMonitor.aTSScreenSimulation') }}</el-button>
</p>
</div>
<set-time ref="setTime" @ConfirmSelectBeginTime="jump" />
</el-card>
</template>
<script>
import { getPublishMapInfo } from '@/api/jmap/map';
import { queryPermissionScreen } from '@/api/management/author';
import { getGoodsTryUse } from '@/api/management/goods';
import { PermissionType } from '@/scripts/ConstDic';
import { launchFullscreen } from '@/utils/screen';
import { UrlConfig } from '@/router/index';
import LimitList from '@/views/components/limits/index';
import SetTime from '@/views/display/demon/setTime';
import { bitScreenNotify } from '@/api/simulation';
export default {
name: 'ExamDetailList',
components: {
LimitList,
SetTime
},
filters: {
},
data() {
return {
courseModel: {
mapId: '',
name: '',
skinCode: '',
updateTime: '',
pmsList: []
},
goodsId: '',
tryTime: 0,
showTryTime: '0',
tryUser: 0,
EffectiveTypeList: [],
screenList: []
};
},
computed: {
hasPermssion() {
let isShow = false;
this.courseModel.pmsList.forEach(item => {
if (item.canDistribute) {
isShow = true;
}
});
return isShow;
},
height() {
return this.$store.state.app.height;
}
},
watch: {
$route(newVal) {
this.initLoadPage();
}
},
async mounted() {
this.$Dictionary.effectiveType().then(list => {
this.EffectiveTypeList = list;
});
await this.getScreenLists();
this.initLoadPage();
},
methods: {
async getScreenLists() {
const res = await queryPermissionScreen();
this.screenList = res.data;
this.courseModel = {
pmsList: this.screenList || []
};
},
async initLoadPage() {
const data = { id: this.$route.params.lessonId };
if (parseInt(data.id)) {
try {
const res = await getPublishMapInfo(data.id);
this.tryUser = 0;
this.courseModel = {
name: res.data.name,
mapId: res.data.id,
skinCode: res.data.skinCode,
updateTime: res.data.updateTime,
pmsList: this.screenList || [],
permissionType: PermissionType.SCREEN
};
this.$store.dispatch('training/setPrdType', res.data.prdType);
const paras = {
permissionType: PermissionType.SCREEN
};
if (!this.courseModel.pmsList.length) {
this.tryUser = 1;
try {
const resp = await getGoodsTryUse(paras);
if (resp.data.tryTime <= 0) {
this.tryTime = 0;
this.setTryTime(0);
} else {
this.tryTime = resp.data.tryTime;
this.setTryTime(resp.data.tryTime);
this.goodsId = resp.data.goodsId;
}
} catch (error) {
console.log(error);
this.$messageBox(this.$t('error.acquisitionTimeFailed'));
}
}
} catch (error) {
console.log(error);
this.$messageBox(this.$t('error.refreshFailed'));
}
}
},
buy() {
this.$router.push({
path: `${UrlConfig.dp.pay}/${this.$route.params.lessonId}`,
query: { permissionType: PermissionType.SCREEN }
});
},
transfer() {
if (this.$refs) {
this.$refs.limitList.transfer(this.courseModel);
}
},
distribute() {
if (this.$refs) {
this.$refs.limitList.distribute(this.courseModel);
}
},
selectBeginTime() {
this.$refs.setTime.doShow();
},
jump(model) {
const data = { mapId: this.courseModel.mapId };
bitScreenNotify(data).then(resp => {
const query = {
skinCode: this.courseModel.skinCode,
group: resp.data, prdType: '01',
mapId: this.courseModel.mapId,
try: this.tryUser,
goodsId: this.goodsId,
initTime: model.initTime
};
this.$router.push({ path: `${UrlConfig.display}/dp`, query: query });
launchFullscreen();
}).catch(error => {
this.$messageBox(this.$t('error.createSimulationFailed') + error.message);
});
},
start() {
if (this.courseModel.pmsList.length) {
this.selectBeginTime();
} else {
if (this.tryTime <= 0) {
this.$confirm(this.$t('tip.noPermissionHint'), this.$t('global.tips'), {
confirmButtonText: this.$t('global.confirm'),
cancelButtonText: this.$t('global.cancel'),
type: 'warning'
}).then(() => {
this.buy();
}).catch(() => { });
} else {
this.selectBeginTime();
}
}
},
setTryTime(val) {
if (val <= 1) {
this.showTryTime = `0`+ this.$t('global.minute');
} else if (val > 1 && val <= 60) {
this.showTryTime = '1'+ this.$t('global.minute');
} else if (val > 60) {
const time = parseInt(val / 60);
this.showTryTime = time+ this.$t('global.minutes');
}
}
}
};
</script>
<style scoped>
::-webkit-scrollbar {
width: 3px;
height: 3px;
}
</style>
<style rel="stylesheet/scss" lang="scss" scoped>
@import "src/styles/mixin.scss";
.title {
font-weight: bold
}
.time-item {
font-size: 24px;
color: black !important;
}
.time-label {
display: -moz-inline-box;
display: inline-block;
text-align: right;
margin-left: 14px;
}
.time-elem {
color: rgb(90, 89, 89) !important;
}
.list-item {
font-size: 16px;
margin-bottom: 20px;
}
.list-label {
display: -moz-inline-box;
display: inline-block;
text-align: right;
/* width: 160px; */
}
.list-elem {
color: #808080 !important;
}
</style>

View File

@ -1,98 +0,0 @@
<template>
<el-card :style="{height: height+'px'}">
<div class="home-box" :style="{height: height+'px'}">
<el-scrollbar wrap-class="scrollbar-wrapper" style="margin-top:5px;">
<h1 class="title">
{{ $t('screenMonitor.screenSystem') }}
<img :src="logo" alt="" class="logo-img">
</h1>
<div class="card-box">
<el-carousel :interval="4000" type="card" height="370px">
<el-carousel-item v-for="(item, index) in listImg" :key="index">
<img :src="item.src" alt="" height="100%" width="100%">
</el-carousel-item>
</el-carousel>
</div>
<div class="brief-box">{{ $t('screenMonitor.screenSystemDescription') }}</div>
</el-scrollbar>
</div>
</el-card>
</template>
<script>
import logo from '@/assets/logo.png';
import home1 from '@/assets/home/home1.png';
import home2 from '@/assets/home/home2.png';
import home3 from '@/assets/home/demon1.jpg';
import home4 from '@/assets/home/tring1.png';
import home5 from '@/assets/home/tring4.jpg';
import home6 from '@/assets/home/demon2.jpg';
export default {
name: 'Home',
data() {
return {
listImg: [
{ src: home1 },
{ src: home2 },
{ src: home3 },
{ src: home4 },
{ src: home5 },
{ src: home6 }
],
logo: logo
};
},
computed: {
height() {
return this.$store.state.app.height;
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
@import "src/styles/mixin.scss";
/deep/ .el-carousel {
overflow: hidden;
}
.home-box {
padding: 15px 100px;
float: left;
width: 100%;
font-family: 'Microsoft YaHei';
.title {
font-size: 35px;
width: 100%;
text-align: center;
font-weight: 400;
margin-top: 55px;
border-bottom: 2px dashed #333;
padding-bottom: 15px;
margin-bottom: 70px;
position: relative;
.logo-img {
position: absolute;
right: 0;
top: 0;
width: 55px;
}
}
.card-box {
width: 100%;
padding: 0 50px;
}
.brief-box {
font-size: 18px;
text-indent: 2em;
line-height: 32px;
padding: 40px 20px 0;
font-family: unset;
}
}
</style>

View File

@ -1,71 +0,0 @@
<template>
<div class="app-wrapper">
<div v-show="listShow" class="examList" :style="{width: widthLeft+'px'}">
<demon-list ref="demonList" :height="height" />
</div>
<drap-left :width-left="widthLeft" @drapWidth="drapWidth" />
<transition>
<router-view />
</transition>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import demonList from './list/demonList';
import drapLeft from '@/views/components/drapLeft/index';
import localStore from 'storejs';
export default {
name: 'Exam',
components: {
demonList,
drapLeft
},
data() {
return {
listShow: true,
widthLeft: 450
};
},
computed: {
...mapGetters([
'lessonbar'
]),
height() {
return this.$store.state.app.height;
}
},
watch: {
'lessonbar.opened': function (val) {
this.listShow = val;
}
},
mounted() {
this.widthLeft = Number(localStore.get('LeftWidth'));
},
methods: {
refresh() {
this.$refs && this.$refs.demonList && this.$refs.demonList.refresh();
},
drapWidth(width) {
this.widthLeft = Number(width);
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
@import "src/styles/mixin.scss";
.app-wrapper {
@include clearfix;
position: relative;
height: 100%;
width: 100%;
overflow: hidden;
}
.examList {
float: left;
}
</style>

View File

@ -1,147 +0,0 @@
<template>
<el-card v-loading="loading" class="map-list-main">
<div slot="header" class="clearfix">
<span>{{ $t('global.mapList') }}</span>
</div>
<filter-city ref="filerCity" filter-empty :query-function="queryFunction" @filterSelectChange="refresh" />
<el-input v-model="filterText" :placeholder="this.$t('global.filteringKeywords')" clearable />
<el-scrollbar wrap-class="scrollbar-wrapper" :style="{ height: (height-125) +'px' }">
<el-tree
ref="tree"
:data="treeList"
node-key="id"
highlight-current
:default-expanded-keys="defaultShowKeys"
:props="defaultProps"
:span="22"
@node-click="clickEvent"
@node-contextmenu="showContextMenu"
>
<span slot-scope="{ node:nd, data }">
<span
class="el-icon-tickets"
:style="{color: data.valid ? 'green':''}"
>&nbsp;{{ nd.label }}</span>
<span :style="{color: data.valid ? 'green':''}">&nbsp;{{ nd.label }}</span>
</span>
</el-tree>
</el-scrollbar>
</el-card>
</template>
<script>
import FilterCity from '@/views/components/filterCity';
import { listPublishMap } from '@/api/jmap/map';
import { queryPermissionScreen } from '@/api/management/author';
import { UrlConfig } from '@/router/index';
import { getSessionStorage, setSessionStorage, removeSessionStorage } from '@/utils/auth';
export default {
name: 'ExamDetailList',
components: {
FilterCity
},
props: {
height: {
type: Number,
required: true
}
},
data() {
return {
loading: true,
queryFunction: listPublishMap,
defaultShowKeys: [],
filterText: '',
treeData: [],
treeList: [],
selected: {},
defaultProps: {
children: 'children',
label: 'name'
},
node: {
},
screenList: []
};
},
watch: {
filterText(val) {
this.treeList = this.treeData.filter((res) => {
return res.name.includes(val);
});
}
},
created() {
this.getScreenLists();
},
beforeDestroy () {
removeSessionStorage('screenMonitorList');
},
methods: {
async getScreenLists() {
const list = await queryPermissionScreen();
this.screenList = list.data || [];
},
filterNode(value, data) {
if (!value) return true;
return data.name.indexOf(value) !== -1;
},
showContextMenu(e, obj, node, vueElem) {
if (obj) {
this.node = node;
this.selected = obj;
}
},
clickEvent(obj) {
setSessionStorage('screenMonitorList', obj.id);
this.$router.push({ path: `${UrlConfig.dp.detail}/${obj.id}` });
},
refresh(filterSelect) {
this.loading = true;
this.treeData = this.treeList = [];
listPublishMap().then(res => {
(res.data || []).forEach(ele => {
if (ele.cityCode == filterSelect) {
ele.valid = false;
if (this.screenList.length) {
ele.valid = true;
}
this.treeData.push(ele);
}
});
this.treeList = this.filterText
? this.treeData.filter((res) => {
return res.name.includes(this.filterText);
})
: this.treeData;
if (this.treeList.length == 0) {
this.$router.push({ path: `${UrlConfig.dp.prefix}/home` });
} else {
this.$nextTick(() => {
const mapId = getSessionStorage('screenMonitorList') || (this.treeList[0] || { id: 0 }).id;
this.$router.push({ path: `${UrlConfig.dp.detail}/${mapId}` });
this.$refs.tree.setCurrentKey(mapId); // value node-key
});
}
this.$nextTick(() => { this.loading = false; });
}).catch(error => {
console.log(error);
this.loading = false;
this.$messageBox(this.$t('error.refreshFailed'));
});
}
}
};
</script>
<style>
.el-tree {
overflow-x: hidden;
}
.el-tree-node.is-current>.el-tree-node__content {
background-color: #e4e3e3 !important;
}
</style>

View File

@ -7,7 +7,7 @@ const defaultSettings = require('./src/settings.js');
const CopyWebpackPlugin = require('copy-webpack-plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin');
function resolve(dir) { function resolve(dir) {
return path.join(__dirname, dir); return path.join(__dirname, dir);
} }
const name = defaultSettings.title; // page title const name = defaultSettings.title; // page title
@ -15,134 +15,135 @@ const port = 9527; // dev port
// All configuration item explanations can be find in https://cli.vuejs.org/config/ // All configuration item explanations can be find in https://cli.vuejs.org/config/
module.exports = { module.exports = {
/** /**
* You will need to set publicPath if you plan to deploy your site under a sub path, * You will need to set publicPath if you plan to deploy your site under a sub path,
* for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/, * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
* then publicPath should be set to "/bar/". * then publicPath should be set to "/bar/".
* In most cases please use '/' !!! * In most cases please use '/' !!!
* Detail: https://cli.vuejs.org/config/#publicpath * Detail: https://cli.vuejs.org/config/#publicpath
*/ */
publicPath: '/', publicPath: '/',
outputDir: 'dist', outputDir: 'dist',
assetsDir: 'static', assetsDir: 'static',
lintOnSave: false, lintOnSave: false,
productionSourceMap: false, productionSourceMap: false,
devServer: { cssSourceMap: true,
port: port, devServer: {
open: true, port: port,
overlay: { open: true,
warnings: false, overlay: {
errors: true warnings: false,
} errors: true
// proxy: { }
// // change xxx-api/login => mock/login // proxy: {
// // detail: https://cli.vuejs.org/config/#devserver-proxy // // change xxx-api/login => mock/login
// [process.env.VUE_APP_BASE_API]: { // // detail: https://cli.vuejs.org/config/#devserver-proxy
// target: `http://localhost:${port}/mock`, // [process.env.VUE_APP_BASE_API]: {
// changeOrigin: true, // target: `http://localhost:${port}/mock`,
// pathRewrite: { // changeOrigin: true,
// ['^' + process.env.VUE_APP_BASE_API]: '' // pathRewrite: {
// } // ['^' + process.env.VUE_APP_BASE_API]: ''
// } // }
// }, // }
// after: require('./mock/mock-server.js') // },
}, // after: require('./mock/mock-server.js')
configureWebpack: { },
// provide the app's title in webpack's name field, so that configureWebpack: {
// it can be accessed in index.html to inject the correct title. // provide the app's title in webpack's name field, so that
name: name, // it can be accessed in index.html to inject the correct title.
resolve: { name: name,
extensions: ['.js', '.vue', '.json'], resolve: {
alias: { extensions: ['.js', '.vue', '.json'],
'@': resolve('src') alias: {
} '@': resolve('src')
}, }
plugins: [ },
new CopyWebpackPlugin([ plugins: [
{ new CopyWebpackPlugin([
from: path.resolve(__dirname, './static'), {
to: 'static', from: path.resolve(__dirname, './static'),
ignore: ['.*'] to: 'static',
} ignore: ['.*']
]) }
] ])
}, ]
chainWebpack(config) { },
config.plugins.delete('preload'); // TODO: need test chainWebpack(config) {
config.plugins.delete('prefetch'); // TODO: need test config.plugins.delete('preload'); // TODO: need test
config.plugins.delete('prefetch'); // TODO: need test
// set svg-sprite-loader // set svg-sprite-loader
config.module config.module
.rule('svg') .rule('svg')
.exclude.add(resolve('src/icons')) .exclude.add(resolve('src/icons'))
.end(); .end();
config.module config.module
.rule('icons') .rule('icons')
.test(/\.svg$/) .test(/\.svg$/)
.include.add(resolve('src/icons')) .include.add(resolve('src/icons'))
.end() .end()
.use('svg-sprite-loader') .use('svg-sprite-loader')
.loader('svg-sprite-loader') .loader('svg-sprite-loader')
.options({ .options({
symbolId: 'icon-[name]' symbolId: 'icon-[name]'
}) })
.end(); .end();
// set preserveWhitespace // set preserveWhitespace
config.module config.module
.rule('vue') .rule('vue')
.use('vue-loader') .use('vue-loader')
.loader('vue-loader') .loader('vue-loader')
.tap(options => { .tap(options => {
options.compilerOptions.preserveWhitespace = true; options.compilerOptions.preserveWhitespace = true;
return options; return options;
}) })
.end(); .end();
config config
// https://webpack.js.org/configuration/devtool/#development // https://webpack.js.org/configuration/devtool/#development
.when(process.env.NODE_ENV === 'development', .when(process.env.NODE_ENV === 'development',
config => config.devtool('cheap-source-map') config => config.devtool('cheap-source-map')
); );
config config
.when(process.env.NODE_ENV !== 'development', .when(process.env.NODE_ENV !== 'development',
config => { config => {
config config
.plugin('ScriptExtHtmlWebpackPlugin') .plugin('ScriptExtHtmlWebpackPlugin')
.after('html') .after('html')
.use('script-ext-html-webpack-plugin', [{ .use('script-ext-html-webpack-plugin', [{
// `runtime` must same as runtimeChunk name. default is `runtime` // `runtime` must same as runtimeChunk name. default is `runtime`
inline: /runtime\..*\.js$/ inline: /runtime\..*\.js$/
}]) }])
.end(); .end();
config config
.optimization.splitChunks({ .optimization.splitChunks({
chunks: 'all', chunks: 'all',
cacheGroups: { cacheGroups: {
libs: { libs: {
name: 'chunk-libs', name: 'chunk-libs',
test: /[\\/]node_modules[\\/]/, test: /[\\/]node_modules[\\/]/,
priority: 10, priority: 10,
chunks: 'initial' // only package third parties that are initially dependent chunks: 'initial' // only package third parties that are initially dependent
}, },
elementUI: { elementUI: {
name: 'chunk-elementUI', // split elementUI into a single package name: 'chunk-elementUI', // split elementUI into a single package
priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
}, },
commons: { commons: {
name: 'chunk-commons', name: 'chunk-commons',
test: resolve('src/components'), // can customize your rules test: resolve('src/components'), // can customize your rules
minChunks: 3, // minimum common number minChunks: 3, // minimum common number
priority: 5, priority: 5,
reuseExistingChunk: true reuseExistingChunk: true
} }
} }
}); });
config.optimization.runtimeChunk('single'); config.optimization.runtimeChunk('single');
} }
); );
} }
}; };