Merge remote-tracking branch 'origin/dev' into test

This commit is contained in:
fan 2019-10-17 18:09:54 +08:00
commit 31beb32ae0
137 changed files with 10330 additions and 4368 deletions

179
src/api/designPlatform.js Normal file
View File

@ -0,0 +1,179 @@
import request from '@/utils/request';
export function getDraftLesson(params, mapId) {
/** 根据mapId获取草稿课程 */
return request({
url: `/api/mapSystem/findDraftLessonBy/${mapId}`,
method: 'get',
params
});
}
/** 获取用户地图树 */
export function getUserMapTree(cityCode) {
return request({
url: `/api/mapSystem/findDraftMapByCityCode?cityCode=${cityCode}`,
method: 'get'
});
}
/** 运行图*/
export function getRpListByUserMapId(mapId) {
return request({
url: `/api/draftMap/runPlan/findByDraftMapId/${mapId}`,
method: 'get'
});
}
export function getMapList(cityCode) {
/** 根据cityCode获取地图列表 */
return request({
url: `/api/mapSystem/queryMapByCityCode/${cityCode}`,
method: 'get'
});
}
/** 获取用户自己的运行图详情*/
export function getRpDetailByUserMapId(planId) {
return request({
url: `/api/draftMap/runPlan/selectDiagramData/${planId}`,
method: 'get'
});
}
/** 获取用户自己创建的草稿地图详情*/
export function getUserMapDetailByMapId(mapId) {
return request({
url: `/api/mapBuild/findById/${mapId}`,
method: 'get'
});
}
/** 用户自己的运行图仿真测试*/
export function runUserPlanNotify({ planId }) {
return request({
url: `/api/draftMap/runPlan/simulationCheck/${planId}`,
method: 'get'
});
}
/** 管理员获取需审核的课程列表 */
export function reviewLessonList(params) {
return request({
url: `/api/review/query/lesson`,
method: 'get',
params
});
}
/** 管理员发布课程接口 */
export function adminPublishLesson(data, id) {
return request({
url: `/api/review/${id}/publishLesson`,
method: 'post',
data: data
});
}
/** 管理员驳回课程发布申请 */
export function rejectedLessonRelease(data, id) {
return request({
url: `/api/review/lesson/${id}`,
method: 'post',
data: data
});
}
// /** 普通用户申请课程发布和撤销申请 */
// export function releaseOrCancel(id, status) {
// return request({
// url: `/api/review/lesson/releaseOrCancel/${id}/${status}`,
// method: 'get'
// });
// }
/** 管理员获取需审核的剧本列表 ok */
export function reviewScriptList(params) {
return request({
url: `/api/review/query/script`,
method: 'get',
params
});
}
/** 管理员发布剧本 ok */
export function publishScript(id) {
return request({
url: `/api/review/${id}/publishScript`,
method: 'post'
});
}
/** 管理员剧本申请驳回 ok */
export function rejectScript(id, data) {
return request({
url: `/api/review/script/${id}`,
method: 'post',
data: data
});
}
/** 管理员获取需审核的运行图列表 */
export function reviewRunPlanList(params) {
return request({
url: `/api/review/query/runPlan`,
method: 'get',
params
});
}
/** 管理员发布运行图 */
export function publishRunPlan(planId, data) {
return request({
url: `/api/review/${planId}/publishRunPlan`,
method: 'post',
data: data
});
}
/** 普通用户申请或撤销运行图发布 */
export function releaseOrCancelRunPlan(planId, status) {
return request({
url: `/api/review/runPlan/releaseOrCancel/${planId}/${status}`,
method: 'get'
});
}
/** 管理员运行图申请驳回 */
export function rejectRunPlan(id, data) {
return request({
url: `/api/review/runPlan/${id}`,
method: 'post',
data: data
});
}
/** 用户申请发布剧本或者撤销剧本申请 */
export function releaseScript(id, status) {
return request({
url: `/api/review/script/releaseOrCancel/${id}/${status}`,
method: 'get'
});
}
/** 查看课程详情 */
export function reviewLessonDetail(id) {
return request({
url: `/api/review/previewLesson/${id}`,
method: 'get'
});
}
/** 管理员预览草稿运行图*/
export function previewRunPlan(planId) {
return request({
url: `/api/review/previewRunPlan/${planId}`,
method: 'get'
});
}
/** 加载剧本 */
export function loadDraftScript(scriptId, memberId, group) {
return request({
url: `api/simulation/${group}/scriptDraft/${scriptId}?memberId=${memberId}`,
method: 'post'
});
}

View File

@ -1,16 +1,17 @@
import request from '@/utils/request';
/** 查找个人录制的仿真任务*/
export function getQuestPageList(mapId) {
/** 分页查找个人录制的仿真任务*/
export function getQuestPageList(mapId, params) {
return request({
url: `/api/script/${mapId}/list`,
method: 'get'
url: `/api/script/draft/${mapId}/list`,
method: 'get',
params: params
});
}
/** 创建任务 */
export function createQuest(data) {
return request({
url: `/api/script`,
url: `/api/script/draft`,
method: 'post',
data
});
@ -18,28 +19,28 @@ export function createQuest(data) {
/** 根据任务id删除任务 */
export function deleteQuest(id) {
return request({
url: `/api/script/${id}`,
url: `/api/script/draft/${id}`,
method: 'delete'
});
}
/** 根据id查询任务基础信息 */
export function getQuestById(id) {
return request({
url: `/api/script/${id}/basic`,
url: `/api/script/draft/${id}`,
method: 'get'
});
}
/** 根据id查询任务基础信息 */
/** 根据id查询任务详情信息 */
export function getQuestByIdList(id) {
return request({
url: `/api/quest/${id}/detail`,
url: `/api/script/draft/${id}/detail`,
method: 'get'
});
}
/** 更新任务基本信息 */
export function updateQuest(id, data) {
return request({
url: `/api/script/${id}`,
url: `/api/script/draft/${id}`,
method: 'put',
data
});
@ -53,3 +54,21 @@ export function getQuestPageListOnline(params) {
params: params
});
}
/** 剧本发布 */
export function publishQuest(id, data) {
return request({
url: `/api/script/draft/${id}/publish`,
method: 'put',
data
});
}
/** 剧本撤销发布 */
export function retractQuest(id, data) {
return request({
url: `/api/script/draft/${id}/retract`,
method: 'put'
});
}

View File

@ -3,7 +3,8 @@ import request from '@/utils/request';
/** 分页查找上线的剧本*/
export function getScriptPageListOnline(params) {
return request({
url: `/api/script/paging/online`,
// url: `/api/script/paging/online`,
url: `/api/script/paging/published`,
method: 'get',
params: params
});
@ -17,10 +18,17 @@ export function getScriptByIdList(id) {
});
}
/** 通过ID查询剧本的基础信息 */
/** 通过ID查询发布的剧本的详细信息 */
export function getScriptById(id) {
return request({
url: `/api/script/${id}/detail`,
method: 'get'
});
}
/** 通过ID查询未发布剧本的详细信息 */
export function getDraftScriptById(id) {
return request({
url: `/api/script/draft/${id}/detail`,
method: 'get'
});
}

View File

@ -0,0 +1,35 @@
import request from '@/utils/request';
export function getTrainingSystemList(params) {
/** 根据cityCode后去对应地图及其子系统 */
return request({
url: '/api/mapSystem/queryByCityCode',
method: 'get',
params
});
}
export function querySystemByTypeAndPrdCode(params, prodCode) {
/** 根据系统类型和地图产品code查询系统的内容课程、章节、考试*/
return request({
url: `/api/mapSystem/queryByTypeAndPrdCode/${prodCode}`,
method: 'get',
params
});
}
export function getTrainingSystemListByMapId(mapId) {
/** 根据mapId去获取其子系统 */
return request({
url: `/api/mapSystem/${mapId}`,
method: 'get'
});
}
export function generateMapSystem(mapId) {
/** 根据mapId生成地图子系统 */
return request({
url: `/api/mapSystem/generate/${mapId}`,
method: 'post'
});
}

BIN
src/assets/logo_changan.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@ -127,7 +127,7 @@
</el-row>
</template>
</el-col>
<el-col :span="6" :offset="0">
<el-col :span="5" :offset="1">
<el-button type="primary" size="small" :disabled="!canQuery" @click="query">{{ $t('global.query') }}</el-button>
<el-button v-if="queryForm.reset" type="primary" size="small" :disabled="!canQuery" @click="doClean">{{ $t('global.reset') }}</el-button>
<el-button v-if="exportFlag" type="primary" size="small" :disabled="!canQuery" @click="doExport">{{ $t('global.export') }}</el-button>
@ -139,6 +139,7 @@
size="small"
:style="button.style"
@click="button.handler"
class="button_style"
>{{ button.text }}</el-button>
</template>
</el-col>
@ -480,4 +481,7 @@ export default {
max-width: 240px;
min-width: 100px;
}
.button_style {
margin-bottom: 10px;
}
</style>

View File

@ -453,7 +453,10 @@ export default {
currentChoose() {
return this.choose;
},
refresh() {
refresh(flag) {
if (flag){
this.commitQuery();
}
this.queryList.data = [...this.queryList.data];
}
}

View File

@ -0,0 +1,36 @@
export default {
applicant: 'Applicant',
map: 'Map',
status: 'Status',
unpublished: 'Unpublished',
pendingReview: 'PendingReview',
releaseSuccess: 'ReleaseSuccess',
overrule: 'Overrule',
scriptName: 'Script Name',
scriptDescription: 'Script Description',
applyTime: 'Apply Time',
applyPassed: 'Apply Passed',
applyReject: 'Apply Reject',
scriptPreview: 'Script Preview',
passedScript: 'Passed Script',
rejectScript: 'Reject Script',
explanation: 'Explanation',
inputScriptName: 'Please input script name',
inputRejectExplanation: 'Please input reject explanation',
passedScriptSuccess: 'Passed script success',
passedScriptFailed: 'Passed script failed',
rejectScriptSuccess: 'Reject script success',
rejectScriptFailed: 'Reject script failed',
runPlanName: 'Run Plan Name',
passedRunPlan: 'Passed Run Plan',
rejectRunPlan: 'Reject Run Plan',
runPlanPreview: 'RunPlan Preview',
inputRunPlanName: 'Please input run plan name',
courseDescription: 'Course description',
lookOver: 'Look over',
courseDetails: 'Course details',
instructions: 'Instructions',
chapterTrainingName: 'Chapter/training name',
revokeScriptSuccess: 'Revoke script success',
revokeScriptFailed: 'Revoke script failed'
};

View File

@ -1,7 +1,7 @@
export default {
simulationSystem: 'Urban rail transit simulation system',
simulationSystemDescription: 'Based on the subway signal system, the urban rail transit simulation system is reformed for the training part, aiming to build a set of professional simulation system for driving demonstration. The system has high flexibility for future expansion and upgrading. Meanwhile, the simulation system has two modes of normal operation and fault operation. Besides normal functional operation, it can also conduct fault simulation of equipment.',
simulationName: 'Simulation name:',
simulationName: 'Simulation module:',
noSimulationProducts: 'No simulation products',
productDescription: 'Product description:',
startSimulation: 'Start the simulation',

View File

@ -79,6 +79,7 @@ export default {
schema: {
selectProduct: 'Please select product type',
loadScript: 'Load Script',
selectRoles: 'Select Roles',
previewRunDiagram: 'Preview Run Diagram',
loadRunDiagram: 'Load Run Diagram',
faultSetting: 'Fault Setting',
@ -123,6 +124,7 @@ export default {
dispatcher: 'Dispatcher',
attendant: 'Station',
audience: 'Audience',
repair: 'Repair',
driver: 'Train',
none: 'None'
},

View File

@ -91,5 +91,8 @@ export default {
getRunGraphDataFailed: 'Failed to get run graph data',
getStationListFail: 'Failed to get station list',
obtainTrainGroupNumberFailed: 'Failed to obtain train group number',
getTrainListFailed: 'Failed to get train list'
getTrainListFailed: 'Failed to get train list',
getDraftCourseDataFailed: 'Failed to get draft course data!',
failedToGetCourseData: 'Failed to get course data!',
failedToGetSystemData: 'Failed to get system data!'
};

View File

@ -15,20 +15,21 @@ export default {
returnToExamList: 'Return to the exam list',
totalScore: 'Total score',
itemList: 'Item list',
courseName: 'Course name',
permissionsDetails: 'Permissions for details',
courseName: 'Examination subject',
permissionsDetails: 'Permission details',
buy: 'buy',
distributePermission: 'Permission distribution (examination)',
viewCoursePapers: 'View course papers',
examStartTime: 'Exam start time',
theExamIsReadyAnyTime: 'The exam is ready any time',
testExplanation: 'Test Explanation',
examTimeAvailable: 'Exam time available',
fullMarksInTheExam: 'Full marks in the exam',
passMarkTheExam: 'Pass mark the exam',
examinationRules: 'Examination rules',
examStartTime: 'Start time',
theExamIsReadyAnyTime: 'Anytime you are available',
minutes: 'min',
testExplanation: 'Notes',
examTimeAvailable: 'Duration',
fullMarksInTheExam: 'Full marks',
passMarkTheExam: 'Passing score',
examinationRules: 'Rules',
trainingType: 'Training type',
numberOfQuestions: 'Number of questions',
numberOfQuestions: 'Quantity',
score: 'Score',
startTheExam: 'Start the exam',
examinationTiming: 'Examination timing',

View File

@ -40,7 +40,7 @@ export default {
mobile: 'mobile',
name: 'Name',
code: 'Code',
status: 'Status',
status: 'State',
remarks: 'Remarks',
selectionTime: 'Selection of time',
permissionNumber: 'Number of permissions',
@ -56,11 +56,11 @@ export default {
transferScreenPermission: 'Large screen rights transfer',
today: 'Today',
total: 'Total',
index: 'Indexes',
startTime: 'Start time',
endTime: 'End time',
isForever: 'Forever',
remains: 'Remainder',
index: 'Index',
startTime: 'Start',
endTime: 'End',
isForever: 'Timelimit',
remains: 'Remaining',
hasPermissionTip: 'Public permission is {0}, private permission is {1}',
create: 'Create',
update: 'Update',

View File

@ -24,6 +24,7 @@ import joinTraining from './joinTraining';
import trainRoom from './trainRoom';
import menu from './menu';
import ibp from './ibp';
import approval from './approval';
export default {
...enLocale,
@ -51,5 +52,6 @@ export default {
joinTraining,
trainRoom,
menu,
ibp
ibp,
approval
};

View File

@ -102,5 +102,19 @@ export default {
train: 'Train',
station: 'Station',
trainWindow: 'Train window',
editStepInfo: 'Edit step information'
editStepInfo: 'Edit step information',
trainingRecord: 'Training recording',
lesson: 'Lesson',
taskManage: 'Task manage',
trainingRule: 'Training rule',
trainingManage: 'Training manage',
newConstruction: 'New',
applicationForRelease: 'Application for release',
rejectReason: 'Reason for rejection',
withdraw: 'Withdraw',
notRelease: 'Not release',
pendingReview: 'Pending review',
published: 'Published',
rejected: 'Rejected',
review: 'Review'
};

View File

@ -1,16 +1,16 @@
export default {
updateStation: {
level1: 'level one: ',
level2: 'level two: ',
level3: 'level three: ',
level4: 'level four: ',
level5: 'level five: ',
level1: 'level1: ',
level2: 'level2: ',
level3: 'level3: ',
level4: 'level4: ',
level5: 'level5: ',
updateData: 'Update data',
pleaseInputLevel1: 'Please input level one',
pleaseInputLevel2: 'Please input level two',
pleaseInputLevel3: 'Please input level three',
pleaseInputLevel4: 'Please input level four',
pleaseInputLevel5: 'Please input level five',
pleaseInputLevel1: 'Please input level1',
pleaseInputLevel2: 'Please input level2',
pleaseInputLevel3: 'Please input level3',
pleaseInputLevel4: 'Please input level4',
pleaseInputLevel5: 'Please input level5',
systemOutPut: 'System output',
selectPrintArea: 'Selec print area',
selectDeleteRoute: 'Select delete route',
@ -229,5 +229,9 @@ export default {
editPlanningTrain: 'Edit planning train',
runGraphName: 'Run graph name',
tipOperationTime: '请先设置区段站间运行时间, 【文件】-> 【修改站间运行时间】',
serverTrainNum: '表号车次号'
serverTrainNum: '表号车次号',
explanation: 'Explanation',
creationDate: 'Creation date',
load: 'Load',
modifyName: 'Modify name'
};

View File

@ -7,6 +7,9 @@ export default {
runPlanManage: 'Run plan',
productEdit: 'Product editor',
designhomePage: 'Public map',
designUserPage: 'Personal map',
lessaonManage: 'Lesson',
lessonEdit: 'Lesson editor',
trainingRecord: 'Trainning recording',
@ -58,5 +61,11 @@ export default {
userExamManage: 'User examination management',
userSimulationManage: 'User simulation management',
existingSimulation: 'Existence simulation management',
ibpDraw: 'ibp Draw'
ibpDraw: 'Ibp Draw',
trainingPlatform: 'trainingPlatform',
releaseApplication: 'Release application',
courseApplication: 'Course release application',
scriptReleaseApplication: 'Script release application',
runGraphReleaseApplication: 'Run graph release application',
subsystemGeneration: 'Subsystem generation'
};

View File

@ -239,9 +239,9 @@ export default {
selectOneTrainingType: 'Only one training type can be selected',
enterProductType: 'Please enter product type',
selectAssociatedStation: 'Please select the associated station',
pleaseSelectTrainDir: '请选择列车所在方向',
pleaseEnterSplit: '请输入拆分数量',
pleaseEnterSplitNumber: '请输入合理的拆分数量',
pleaseSelectTrainDir: 'Please select the direction of the train',
pleaseEnterSplit: 'Please enter the split number',
pleaseEnterSplitNumber: 'Please enter a reasonable number of split',
enterScale: 'Please enter the zoom ratio',
enterXOffset: 'Please enter X offset',
enterYOffset: 'Please enter Y offset',
@ -276,7 +276,7 @@ export default {
accessNumber: 'Please input the number of permissions',
courseNameEmpty: 'Course name cannot be empty',
purchaseMonth: 'Please input the number of months to buy',
pleaseEnterGoodPrice: '请输入商品价格',
pleaseEnterGoodPrice: 'Please enter the price of the goods',
enterTheNameOfTheRunGraph: 'Please enter the name of the run graph',
chooseToPublishTheRunGraph: 'Please choose to publish the run chart',
enterTheAlarmCode: 'Please enter the alarm code',
@ -306,5 +306,6 @@ export default {
enterTheKeyWidth: 'Please enter the key width',
enterTheKeyDirection: 'Please select the key direction',
enterTheUpperText: 'Please enter the upper text',
enterTheLowerText: 'Please enter the lower text'
enterTheLowerText: 'Please enter the lower text',
enterRejectReason: 'Please enter reject reason'
};

View File

@ -4,6 +4,7 @@ export default {
saveData: 'Save Data',
mapList: 'Map List',
createScript: 'Create Script',
modifyScript: 'Modify Script',
scriptName: 'Script Name',
addScript: 'Add Script',
map: 'Map',
@ -15,6 +16,7 @@ export default {
createScriptFail: 'Create script failure',
scriptDetail: 'Script Detail',
scriptRecord: 'Edit',
scriptCreate: 'Create',
scriptModify: 'Modify',
scriptDelete: 'Delete',
getScriptFail: 'Get script information failure',
@ -81,7 +83,22 @@ export default {
scriptBack: 'Back',
speakTo: 'to',
executeCommandTips: 'execute command: ',
operate: 'Operate',
scriptList: 'Script List',
applyPublish: 'Apply for release',
preview: 'Preview',
status: 'Status',
applyRevoke: 'Revoke',
publish: 'Publish',
revokeReason: 'Revoke explanation',
language: 'language',
chinese: 'Chinese Simplified',
english: 'English'
english: 'English',
publishScript: 'Publish Script',
releaseScriptSuccess: 'release script success',
releaseScriptFailed: 'release script failed',
publishScriptSuccess: 'Publish Script Success',
publishScriptFailed: 'Publish Script Failed',
releaseScriptTip: 'This action will apply to release script, whether to continue?',
revokeScriptTip: 'This action will undo release script, whether to continue?'
};

View File

@ -198,5 +198,12 @@ export default {
runGraphNameModifiedSuccessfully: 'Run graph name modified successfully!',
modifyRunGraphNameFailed: 'Modify run graph name failed!',
planCreationSuccessful: 'Plan creation successful!',
createPlanFailed: 'Failed to create plan!'
createPlanFailed: 'Failed to create plan!',
cancelCoursePublicationHint: 'This action will cancel the course publication application, is it OK?',
cancelTheSuccessfulApplicationOfTheCourseRelease: 'Cancel the successful application of the course release!',
cancellationOfCoursePublicationApplicationFailed: 'Cancellation of course publication application failed!',
publishTheCourseHint: 'This operation will publish the course. Are you sure?',
rejectedCourseReleaseApplicationSuccessful: 'Rejected course release application successful!',
rejectedCourseReleaseApplicationFailed: 'Rejected course release application failed!',
duplicatePlanFailedTips: 'The interval needs to be more than 30 seconds or the times is more than 1'
};

View File

@ -0,0 +1,37 @@
export default {
applicant: '申请人',
map: '地图',
status: '状态',
unpublished: '未发布',
pendingReview: '待审核',
releaseSuccess: '发布成功',
overrule: '驳回',
scriptName: '剧本名称',
scriptDescription: '剧本简介',
applyTime: '申请时间',
applyPassed: '通过',
applyReject: '驳回',
scriptPreview: '预览',
passedScript: '通过剧本',
rejectScript: '驳回剧本',
explanation: '驳回说明',
inputScriptName: '请输入剧本名称',
inputRejectExplanation: '请输入驳回说明',
passedScriptSuccess: '通过剧本成功',
passedScriptFailed: '通过剧本失败',
rejectScriptSuccess: '驳回剧本成功',
rejectScriptFailed: '驳回剧本失败',
runPlanName: '运行图名称',
passedRunPlan: '通过运行图',
rejectRunPlan: '驳回运行图',
runPlanPreview: '预览',
inputRunPlanName: '请输入运行图名称',
courseDescription: '课程说明',
lookOver: '查看',
courseDetails: '课程详情',
instructions: '说明',
chapterTrainingName: '章节/课程名称',
revokeScriptSuccess: '撤回成功',
revokeScriptFailed: '撤回失败'
};

View File

@ -79,6 +79,7 @@ export default {
schema: {
selectProduct: '请选择产品类型',
loadScript: '加载剧本',
selectRoles: '选择角色',
previewRunDiagram: '运行图预览',
loadRunDiagram: '运行图加载',
faultSetting: '故障设置',
@ -123,6 +124,7 @@ export default {
dispatcher: '行调',
attendant: '车站',
audience: '观众',
repair: '通号',
driver: '列车',
none: '无'
},

View File

@ -91,5 +91,8 @@ export default {
getRunGraphDataFailed: '获取运行图数据失败',
getStationListFail: '获取车站列表失败',
obtainTrainGroupNumberFailed: '获取列车车组号失败',
getTrainListFailed: '获取列车列表失败'
getTrainListFailed: '获取列车列表失败',
getDraftCourseDataFailed: '获取草稿课程数据失败!',
failedToGetCourseData: '获取课程数据失败!',
failedToGetSystemData: '获取系统数据失败!'
};

View File

@ -22,6 +22,7 @@ export default {
viewCoursePapers: '查看课程试卷',
nameOfTestPaper: '试卷名称',
examStartTime: '考试时间',
minutes: '分钟',
theExamIsReadyAnyTime: '随时都可以考试',
testExplanation: '考试说明',
examTimeAvailable: '考试时长',

View File

@ -24,6 +24,7 @@ import joinTraining from './joinTraining';
import trainRoom from './trainRoom';
import menu from './menu';
import ibp from './ibp';
import approval from './approval';
export default {
...cnLocale,
@ -51,5 +52,6 @@ export default {
joinTraining,
trainRoom,
menu,
ibp
ibp,
approval
};

View File

@ -101,6 +101,21 @@ export default {
train: '列车',
station: '车站',
trainWindow: '车次窗',
countSkinCode: '复制皮肤与被复制皮肤类型不能一样'
countSkinCode: '复制皮肤与被复制皮肤类型不能一样',
trainingRecord: '实训录制',
lesson: '课程',
taskManage: '任务管理',
trainingRule: '操作定义',
trainingManage: '实训管理',
newConstruction: '新建',
applicationForRelease: '申请发布',
rejectReason: '驳回原因',
withdraw: '撤销',
notRelease: '未发布',
pendingReview: '待审核',
published: '已发布',
rejected: '已驳回',
review: '查看'
};

View File

@ -232,5 +232,9 @@ export default {
endTime: '终到时间',
editPlanningTrain: '编辑计划车',
tipOperationTime: '请先设置区段站间运行时间, 【文件】-> 【修改站间运行时间】',
serverTrainNum: '表号车次号'
serverTrainNum: '表号车次号',
explanation: '驳回说明',
creationDate: '创建日期',
load: '加载',
modifyName: '修改名称'
};

View File

@ -1,6 +1,9 @@
export default {
homePage: '首页',
designhomePage: '公共地图',
designUserPage: '个人地图',
mapManage: '地图管理',
skinManage: '皮肤管理',
mapDraw: '地图绘制',
@ -59,5 +62,11 @@ export default {
userSimulationManage: '用户仿真统计',
existingSimulation: '存在仿真管理',
ibpDraw: 'Ibp盘绘制'
ibpDraw: 'Ibp盘绘制',
trainingPlatform: '实训平台',
releaseApplication: '发布申请',
courseApplication: '课程发布申请',
scriptReleaseApplication: '剧本发布申请',
runGraphReleaseApplication: '运行图发布申请',
subsystemGeneration: '子系统生成'
};

View File

@ -308,5 +308,6 @@ export default {
enterTheKeyWidth: '请输入钥匙宽度',
selectTheKeyDirection: '请选择钥匙朝向',
enterTheUpperText: '请输入上侧文字',
enterTheLowerText: '请输入下侧文字'
enterTheLowerText: '请输入下侧文字',
enterRejectReason: '请输入驳回说明'
};

View File

@ -4,6 +4,7 @@ export default {
saveData: '保存数据',
mapList: '地图列表',
createScript: '创建剧本',
modifyScript: '修改剧本',
scriptName: '剧本名称',
addScript: '添加剧本',
map: '所属地图',
@ -15,6 +16,7 @@ export default {
createScriptFail: '创建剧本失败',
scriptDetail: '剧本详情',
scriptRecord: '编制',
scriptCreate: '创建',
scriptModify: '修改',
scriptDelete: '删除',
getScriptFail: '获取剧本信息失败',
@ -82,7 +84,22 @@ export default {
scriptBack: '返回',
speakTo: '对',
executeCommandTips: '执行指令: ',
operate: '操作',
scriptList: '剧本列表',
applyPublish: '申请发布',
preview: '预览',
status: '状态',
applyRevoke: '撤回',
publish: '发布',
revokeReason: '驳回原因',
language: '语言',
chinese: '中文',
english: '英文'
english: '英文',
publishScript: '发布剧本',
releaseScriptSuccess: '申请发布成功',
releaseScriptFailed: '申请发布失败',
publishScriptSuccess: '发布成功',
publishScriptFailed: '发布失败',
releaseScriptTip: '此操作将申请发布剧本, 是否继续?',
revokeScriptTip: '此操作将撤销发布剧本申请, 是否继续?'
};

View File

@ -198,5 +198,12 @@ export default {
runGraphNameModifiedSuccessfully: '修改运行图名称成功!',
modifyRunGraphNameFailed: '修改运行图名称失败!',
planCreationSuccessful: '创建计划成功!',
createPlanFailed: '创建计划失败!'
createPlanFailed: '创建计划失败!',
cancelCoursePublicationHint: '此操作将撤销课程发布申请,是否确定?',
cancelTheSuccessfulApplicationOfTheCourseRelease: '撤销课程发布申请成功!',
cancellationOfCoursePublicationApplicationFailed: '撤销课程发布申请失败!',
publishTheCourseHint: '此操作将发布课程,是否确定?',
rejectedCourseReleaseApplicationSuccessful: '驳回课程发布申请成功!',
rejectedCourseReleaseApplicationFailed: '驳回课程发布申请失败!',
duplicatePlanFailedTips: '间隔时间需要大于30秒或次数大于1'
};

View File

@ -73,7 +73,7 @@ export default {
this.$store.state.training.roles == 'BigScreen';
},
isShowMenu() {
return this.$store.state.training.prdType != '';
return this.$store.state.training.prdType;
}
},
watch: {

View File

@ -72,7 +72,7 @@ export default {
this.$store.state.training.roles != 'BigScreen';
},
isShowBar() {
return this.$store.state.training.prdType != '';
return this.$store.state.training.prdType;
}
},
watch: {

View File

@ -157,7 +157,7 @@ export default {
operate: OperationEvent.Command.mBar.system,
children: [
{
title: '登',
title: '登',
click: this.undeveloped
},
{
@ -424,7 +424,7 @@ export default {
operate: OperationEvent.Command.mBar.system,
children: [
{
title: '登',
title: '登',
click: this.undeveloped
},
{

View File

@ -0,0 +1,326 @@
<template>
<div>
<el-dialog v-dialogDrag class="chengdou-03__systerm route-hand-control" :title="title" :visible.sync="show" width="500px" :before-close="doClose" :z-index="2000" :modal="false" :close-on-click-modal="false">
<el-row class="header">
<el-col :span="11"><span>车站</span></el-col>
<el-col :span="11" :offset="2"><span>始端信号机</span></el-col>
</el-row>
<el-row>
<el-col :span="11">
<el-input v-model="stationName" size="small" disabled />
</el-col>
<el-col :span="11" :offset="2">
<el-input v-model="signalName" size="small" disabled />
</el-col>
</el-row>
<div class="table">
<el-table ref="tempTable" :data="tempData" border style="width: 100%" size="mini" highlight-current-row :height="140">
<el-table-column prop="name" label="选择" width="55" style="margin-left:50px; text-align: right;">
<template slot-scope="scope">
<el-checkbox
v-model="scope.row.check"
style="text-align: center; display: block;"
:disabled="scope.row.disabled"
/>
</template>
</el-table-column>
<el-table-column :id="domIdChoose" prop="name" width="155" label="描述" style="margin-left:30px">
<template slot-scope="scope">
<span :style="{color: scope.row.disabled ? '#CBCBCB':'unset'}">{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column :id="domIdChoose" prop="name" label="方向" style="">
<template slot-scope="scope">
<span :style="{color: scope.row.disabled ? '#CBCBCB':'unset'}">111</span>
</template>
</el-table-column>
<el-table-column :id="domIdChoose" prop="name" label="属性" style="">
<template slot-scope="scope">
<span :style="{color: scope.row.disabled ? '#CBCBCB':'unset'}">1111</span>
</template>
</el-table-column>
<el-table-column :id="domIdChoose" prop="name" label="控制" style="">
<template slot-scope="scope">
<span :style="{color: scope.row.disabled ? '#CBCBCB':'unset'}">2222</span>
</template>
</el-table-column>
</el-table>
</div>
<el-row justify="center" class="button-group">
<el-col :span="10" :offset="2">
<el-button :id="domIdConfirm" type="primary" :disabled="commitDisabled" :loading="loading" @click="commit">确定</el-button>
</el-col>
<el-col :span="8" :offset="4">
<el-button :id="domIdCancel" @click="cancel"> </el-button>
</el-col>
</el-row>
<confirm-control ref="confirmControl" />
<notice-info ref="noticeInfo" />
</el-dialog>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import { MapDeviceType, OperationEvent, getDomIdByOperation } from '@/scripts/ConstDic';
import ConfirmControl from './childDialog/confirmControl';
import { mouseCancelState } from '../utils/menuItemStatus';
import NoticeInfo from './childDialog/childDialog/noticeInfo';
export default {
name: 'RouteHandControl',
components: {
ConfirmControl,
NoticeInfo
},
data() {
return {
dialogShow: false,
loading: false,
selected: null,
tempData: [],
operation: null,
selection: [],
stationName: '',
signalName: '',
allSelect: false
};
},
computed: {
...mapGetters('map', [
'signalList'
]),
show() {
return this.dialogShow && !this.$store.state.menuOperation.break;
},
domIdCancel() {
return this.dialogShow ? OperationEvent.Command.cancel.menu.domId : '';
},
domIdChoose() {
if (this.operation == OperationEvent.Signal.humanControl.menu.operation) {
return OperationEvent.Signal.humanControl.choose.domId;
} else if (this.operation == OperationEvent.Signal.atsAutoControl.menu.operation) {
return OperationEvent.Signal.atsAutoControl.choose.domId;
}
return '';
},
domIdConfirm() {
return this.dialogShow ? getDomIdByOperation(this.operation) : '';
},
title() {
if (this.operation == OperationEvent.Signal.humanControl.menu.operation) {
return '进路交人工控';
} else if (this.operation == OperationEvent.Signal.atsAutoControl.menu.operation) {
return '进路交自动控';
}
return '';
},
commitDisabled() {
let disabled = true;
if (this.selection && this.selection.length) {
disabled = false;
}
return disabled;
}
},
watch: {
//
tempData: {
handler(val, oldVal) {
this.checkTableDataSelction(val);
},
deep: true
}
},
mounted() {
this.$nextTick(() => {
this.$store.dispatch('training/tipReload');
});
},
methods: {
doShow(operate, selected, tempData) {
this.selected = selected;
//
if (!this.dialogShow) {
this.signalName = '';
this.stationName = '';
if (selected && selected._type.toUpperCase() === 'Signal'.toUpperCase()) {
this.signalName = selected.name;
const station = this.$store.getters['map/getDeviceByCode'](selected.stationCode);
if (station) {
this.stationName = station.name;
}
}
// if (tempData && tempData.length > 0) {
// tempData.forEach(elem => {
// elem.check = false;
// elem.disabled = false;
// //
// if (operate.operation === OperationEvent.Signal.humanControl.menu.operation &&
// elem.controlType != '01') {
// elem.disabled = true;
// } if (operate.operation === OperationEvent.Signal.atsAutoControl.menu.operation &&
// elem.controlType == '01') {
// elem.disabled = true;
// }
// });
// }
this.tempData = tempData || [];
this.operation = operate.operation;
}
this.dialogShow = true;
this.$nextTick(function () {
this.$store.dispatch('training/emitTipFresh');
});
},
doClose() {
this.loading = false;
this.dialogShow = false;
this.$refs.tempTable.setCurrentRow();
this.$store.dispatch('training/emitTipFresh');
mouseCancelState(this.selected);
},
checkTableDataSelction(data) {
const selection = [];
if (data && data.length > 0) {
data.forEach(row => {
if (row.check && !row.disabled) {
selection.push(row);
}
});
}
if (JSON.stringify(selection) !== JSON.stringify(this.selection)) {
this.handleChooseChange(selection);
this.selection = selection;
}
let num = 0;
this.allSelect = false;
this.tempData.forEach(item => {
if (item.check) {
num++;
if (num == this.tempData.length) {
this.allSelect = true;
}
}
});
},
allSelectChange() {
if (this.allSelect) {
this.tempData.forEach(item => {
if (!item.disabled) {
item.check = true;
}
});
} else {
this.tempData.forEach(item => {
if (!item.disabled) {
item.check = false;
}
});
}
},
serializeCodeListWithSeparator(sep) {
const codeList = [];
if (this.selection && this.selection.length) {
this.selection.forEach(elem => {
codeList.push(elem.code);
});
}
return codeList.join(sep);
},
handleChooseChange(selection) {
this.selection = selection;
if (selection && selection.length) {
const operate = {
repeat: true,
type: MapDeviceType.Signal.type,
operation: '',
val: this.serializeCodeListWithSeparator('::'),
selection: selection
};
if (this.operation == OperationEvent.Signal.humanControl.menu.operation) {
/** 进路交人工控*/
operate.operation = OperationEvent.Signal.humanControl.choose.operation;
} else if (this.operation == OperationEvent.Signal.atsAutoControl.menu.operation) {
/** 进路交自动控*/
operate.operation = OperationEvent.Signal.atsAutoControl.choose.operation;
}
this.$store.dispatch('training/next', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
}
});
} else if (!selection) {
this.$messageBox(`请选择一条数据`);
}
},
commit() {
if (this.operation == OperationEvent.Signal.humanControl.menu.operation) {
/** 进路交人工控*/
this.humanControl();
} else if (this.operation == OperationEvent.Signal.atsAutoControl.menu.operation) {
/** 进路交自动控*/
this.atsAutoControl();
}
},
//
humanControl() {
const operate = {
send: true,
type: MapDeviceType.Signal.type,
operation: OperationEvent.Signal.humanControl.menu.operation
};
this.loading = true;
this.$store.dispatch('training/next', operate).then(({ valid }) => {
this.loading = false;
if (valid) {
this.doClose();
}
}).catch(() => {
this.loading = false;
this.doClose();
this.$refs.noticeInfo.doShow(operate);
});
},
//
atsAutoControl() {
const operate = {
send: true,
type: MapDeviceType.Signal.type,
operation: OperationEvent.Signal.atsAutoControl.menu.operation
};
this.loading = true;
this.$store.dispatch('training/next', operate).then(({ valid }) => {
this.loading = false;
if (valid) {
this.doClose();
}
}).catch(() => {
this.loading = false;
this.doClose();
this.$refs.noticeInfo.doShow(operate);
});
},
cancel() {
const operate = {
type: MapDeviceType.Signal.type,
operation: OperationEvent.Command.cancel.menu.operation
};
this.$store.dispatch('training/next', operate).then(({ valid }) => {
if (valid) {
this.doClose();
}
}).catch(() => { this.doClose(); });
}
}
};
</script>

View File

@ -74,7 +74,7 @@ export default {
this.$store.state.training.roles != 'BigScreen';
},
isShowBar() {
return this.$store.state.training.prdType != '';
return this.$store.state.training.prdType;
}
},
watch: {

View File

@ -133,7 +133,7 @@ export default {
operate: OperationEvent.Command.mBar.system,
children: [
{
title: '登',
title: '登',
click: this.undeveloped
},
{
@ -400,7 +400,7 @@ export default {
operate: OperationEvent.Command.mBar.system,
children: [
{
title: '登',
title: '登',
click: this.undeveloped
},
{

View File

@ -5,6 +5,7 @@
<route-control ref="routeControl" />
<route-detail ref="routeDetail" />
<route-guide ref="routeGuide" />
<route-hand-control ref="routeHandControl" />
<notice-info ref="noticeInfo" />
</div>
</template>
@ -14,6 +15,7 @@ import PopMenu from '@/components/PopMenu';
import RouteControl from './dialog/routeControl';
import RouteSelection from './dialog/routeSelection';
import RouteDetail from './dialog/routeDetail';
import RouteHandControl from './dialog/routeHandControl';
import RouteGuide from './dialog/routeGuide';
import NoticeInfo from './dialog/childDialog/childDialog/noticeInfo';
import { mapGetters } from 'vuex';
@ -28,6 +30,7 @@ export default {
PopMenu,
RouteControl,
RouteSelection,
RouteHandControl,
RouteDetail,
RouteGuide,
NoticeInfo
@ -441,7 +444,7 @@ export default {
tempData = response.data;
}
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.routeControl.doShow(operate, this.selected, tempData);
this.$refs.routeHandControl.doShow(operate, this.selected, tempData);
}
});
},
@ -462,7 +465,7 @@ export default {
tempData = response.data;
}
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.routeControl.doShow(operate, this.selected, tempData);
this.$refs.routeHandControl.doShow(operate, this.selected, tempData);
}
});
},

View File

@ -71,7 +71,7 @@ export default {
this.$store.state.training.roles != 'BigScreen';
},
isShowBar() {
return this.$store.state.training.prdType != '';
return this.$store.state.training.prdType;
}
},
watch: {

View File

@ -158,7 +158,7 @@ export default {
operate: OperationEvent.Command.mBar.system,
children: [
{
title: '登',
title: '登',
click: this.undeveloped
},
{
@ -425,7 +425,7 @@ export default {
operate: OperationEvent.Command.mBar.system,
children: [
{
title: '登',
title: '登',
click: this.undeveloped
},
{

View File

@ -66,7 +66,7 @@ export default {
this.$store.state.training.roles != 'BigScreen';
},
isShowBar() {
return this.$store.state.training.prdType != '';
return this.$store.state.training.prdType;
}
},
watch: {

View File

@ -177,7 +177,7 @@ export default {
if (operate.selection && operate.selection.length) {
operate.selection.forEach(elem => {
if (operate.commit) {
this.updateTableValue(elem.code, { result: `${this.$t('menu.menuDialog.senedMessageOne')}${this.timeout} ${this.$t('menu.menuDialog.senedMessageTwo')}` }, false);
this.updateTableValue(elem.code, { result: `${$t('menu.menuDialog.senedMessageOne')}${this.timeout} ${this.$t('menu.menuDialog.senedMessageTwo')}` }, false);
} else if (operate.cancel) {
this.updateTableValue(elem.code, { result: '' }, false);
}
@ -381,7 +381,7 @@ export default {
};
this.selection.forEach((elem, index) => {
operate.messages.push(`${this.$t('menu.menuDialog.operatingArea')} ${index + 1}:${elem.operate}`);
operate.messages.push(`${$t('menu.menuDialog.operatingArea')} ${index + 1}:${elem.operate}`);
});
this.disabledSure = true;
@ -406,7 +406,7 @@ export default {
};
this.selection.forEach((elem, index) => {
operate.messages.push(`${this.$t('menu.menuDialog.operatingArea')} ${index + 1}:${elem.operate}`);
operate.messages.push(`${$t('menu.menuDialog.operatingArea')} ${index + 1}:${elem.operate}`);
});
this.disabledSure = true;
@ -431,7 +431,7 @@ export default {
};
this.selection.forEach((elem, index) => {
operate.messages.push(`${this.$t('menu.menuDialog.operatingArea')} ${index + 1}:${elem.operate}`);
operate.messages.push(`${$t('menu.menuDialog.operatingArea')} ${index + 1}:${elem.operate}`);
});
this.disabledSure = true;

View File

@ -160,7 +160,7 @@ export default {
childType: this.$t('menu.passiveDialog.childTypeTips'),
timeSummary: this.$t('menu.passiveDialog.controlModeSummary'),
recommendedOperation: '',
alarmDetail: `${this.$t('menu.passiveDialog.controlModeTransfer')} ${this.operate.name}${this.$t('menu.passiveDialog.alarmDetailOne')}${operate.currentMode == '01' ? this.$t('menu.passiveDialog.stationToCentral') : this.$t('menu.passiveDialog.centralToStation')}`
alarmDetail: `${$t('menu.passiveDialog.controlModeTransfer')} ${this.operate.name}${this.$t('menu.passiveDialog.alarmDetailOne')}${operate.currentMode == '01' ? this.$t('menu.passiveDialog.stationToCentral') : this.$t('menu.passiveDialog.centralToStation')}`
};
this.dialogShow = true;
this.$nextTick(function () {

View File

@ -25,7 +25,7 @@
<script>
import Language from './Language';
import { UrlConfig } from '@/router/index';
export default {
name: 'Logout',
components: {
@ -34,11 +34,13 @@ export default {
data() {
return {
};
},
mounted(){
},
computed: {
username() {
return this.$store.state.user.nickname;
}
},
},
methods: {
language() {
@ -48,6 +50,9 @@ export default {
this.$store.dispatch('LogOut').then(() => {
location.reload(); // vue-router bug
});
},
selfPermission(){
this.$router.push({ path: `${UrlConfig.permission.prefix}/manage`});
}
}
};

View File

@ -2,12 +2,13 @@
<el-menu
class="navbar"
router
:default-active="$route.path"
:default-active="activePath"
mode="horizontal"
background-color="#545c64"
text-color="#fff"
active-text-color="#ffd04b"
>
<system-title></system-title>
<template v-for="(item,idx) in routers">
<template v-if="!item.hidden&&item.children">
<template v-if="hasOneScreenShowingChildren(item.children) &&!item.alwaysShow">
@ -23,6 +24,7 @@
</template>
<template v-else-if="hasOneShowingChildren(item.children) &&!item.alwaysShow">
<template :to="item.path+'/'+item.children[0].path">
<!-- -->
<el-menu-item :key="idx" :index="item.redirect ? item.redirect : (item.path+'/'+item.children[0].path)">
<span
v-if="item.children[0].meta&&item.children[0].meta.i18n"
@ -66,7 +68,7 @@
</el-submenu>
</template>
</template>
<quick-entry ref="quickEntry" />
<quick-entry ref="quickEntry" v-if="isShow"/>
<user-logout ref="userLogout" />
</el-menu>
</template>
@ -75,15 +77,20 @@
import { mapGetters } from 'vuex';
import UserLogout from './Logout';
import QuickEntry from './Entry';
import SystemTitle from './Title';
import { getSessionStorage } from '@/utils/auth';
export default {
components: {
UserLogout,
QuickEntry
QuickEntry,
SystemTitle
},
data() {
return {
routes: []
routes: [],
isShow:false,
activePath:'',
};
},
computed: {
@ -94,6 +101,21 @@ export default {
},
mounted() {
this.routes = this.$router.options.routes;
if (getSessionStorage('design')) {
this.isShow=false;
}
else{
this.isShow=true;
}
if(this.$route.fullPath.indexOf('design/userlist')>=0){
this.activePath='/design/userlist/home';
}
else if(this.$route.fullPath.indexOf('design/lesson')>=0 || this.$route.fullPath.indexOf('design/script')>=0 || this.$route.fullPath.indexOf('design/runPlan')>=0){
this.activePath='/design/home';
}
else{
this.activePath=this.$route.path;
}
},
methods: {
toggleSideBar() {

View File

@ -0,0 +1,57 @@
<template>
<div class="avatar-container" style="margin-left:40px;">
<img class="logo" :src="logoImg" @click="goToMain"/>
<div class="titleInner" style="margin-left:60px;" @click="goToMain">{{systemTitle}}</div>
</div>
</template>
<script>
import logoImg from '@/assets/logo_changan.png';
import { getSessionStorage } from '@/utils/auth';
import { UrlConfig } from '@/router/index';
import { loginTitle } from '@/scripts/ConstDic';
export default {
data() {
return {
logoImg: logoImg,
systemTitle:"城市轨道交通实训平台"
};
},
mounted(){
if (getSessionStorage('design')) {
this.systemTitle="城市轨道交通设计平台";
}
else{
this.systemTitle=loginTitle[getSessionStorage('project')||'default'];
}
},
methods:{
goToMain(){
// if (getSessionStorage('design')) {
// this.$router.push({ path: `${UrlConfig.design.prefix}/home`});
// }
}
}
}
</script>
<style lang="scss" scoped>
.main-container .navbar .avatar-container {
height: 61px;
position: relative;
right: 35px;
float: left;
}
.titleInner{
display:inline-block;
color: #fff;
font-size:24px;
font-weight:bold;
}
.logo{
position: absolute;
width: 40px;
height: 40px;
top: 10px;
}
</style>

View File

@ -3,9 +3,11 @@ import store from '@/store';
import router from './router';
import NProgress from 'nprogress'; // Progress 进度条
import 'nprogress/nprogress.css';// Progress 进度条样式
import { admin } from './router';
import { getToken, getScreenToken, getPlanToken } from '@/utils/auth'; // 验权
import { admin, userDesign} from './router';
import { getToken, getScreenToken, getDesignToken} from '@/utils/auth'; // 验权
// getPlanToken
import { LoginParams } from '@/utils/login';
import { getSessionStorage } from '@/utils/auth';
function hasPermission(roles, permissionRoles) {
if (roles.indexOf(admin) >= 0) return true;
@ -13,13 +15,24 @@ function hasPermission(roles, permissionRoles) {
return roles.some(role => permissionRoles.indexOf(role) >= 0);
}
const whiteList = ['/login', '/dp/login', '/plan/login', '/en/login']; // 不重定向白名单
const project = getSessionStorage('project');
// const whiteList = ['/login', '/login1', '/dp/login', '/dp/login1', '/design/login1']; // 不重定向白名单
//
// const loginPage = whiteList[0] + (('/'+project) || '');
//
// const loginScreenPage = isDev ? whiteList[3] : whiteList[2];
//
// const loginPlanPage = isDev ? whiteList[5] : whiteList[4];
// const loginDesignPage = isDev ? whiteList[4] : whiteList[4];
const whiteList = ['/login', '/dp/login', '/en/login', '/design/login', '/en/design/login', '/login/xty']; // 不重定向白名单
const loginPage = whiteList[0];
const loginScreenPage = whiteList[1];
const loginPlanPage = whiteList[2];
const loginDesignPage = whiteList[3];
// 获取路径数据
function getRouteInfo(to) {
@ -32,10 +45,21 @@ function getRouteInfo(to) {
loginPath = loginScreenPage;
getTokenInfo = getScreenToken;
clientId = LoginParams.DaPing.clientId;
} else if (/^\/plan/.test(toRoutePath) || /^\/display\/plan/.test(toRoutePath) || /^\/planEdit/.test(toRoutePath)) {
loginPath = loginPlanPage;
getTokenInfo = getPlanToken;
clientId = LoginParams.LianJiHua.clientId;
} else if (/^\/design/.test(toRoutePath) || /^\/scriptDisplay/.test(toRoutePath) || /^\/publish/.test(toRoutePath) || /^\/orderauthor/.test(toRoutePath) || /^\/system/.test(toRoutePath) || /^\/display\/manage/.test(toRoutePath) || /^\/apply/.test(toRoutePath)) {
loginPath = loginDesignPage;
getTokenInfo = getDesignToken;
clientId = LoginParams.Design.clientId;
} else if (/^\/plan/.test(toRoutePath) || /^\/display\/plan/.test(toRoutePath)) {
const flag = getSessionStorage('design');
if (flag == 'true') {
loginPath = loginDesignPage;
getTokenInfo = getDesignToken;
clientId = LoginParams.Design.clientId;
} else {
loginPath = loginPage;
getTokenInfo = getToken;
clientId = null;
}
} else {
loginPath = loginPage;
getTokenInfo = getToken;
@ -50,11 +74,15 @@ function handleRoute(to, from, next, routeInfo) {
// 拉取用户信息
store.dispatch('GetInfo', routeInfo.getTokenInfo).then(res => {
// 根据roles权限生成可访问的路由表
// debugger;
const roles = res.roles;
if (getSessionStorage('design')) {
roles.push(userDesign);
}
store.dispatch('GenerateRoutes', { roles, clientId: routeInfo.clientId }).then(() => {
// 动态添加可访问路由表
router.addRoutes(store.getters.addRouters);
// router.addRoutes(asyncRouter1);
if (to.redirectedFrom) {
next({ path: to.redirectedFrom, replace: true });
} else {
@ -64,7 +92,7 @@ function handleRoute(to, from, next, routeInfo) {
}).catch(() => {
store.dispatch('FedLogOut', routeInfo.clientId).then(() => {
Vue.prototype.$messageBox('验证失败,请重新登');
Vue.prototype.$messageBox('验证失败,请重新登');
next({ path: routeInfo.loginPath });
});
});

View File

@ -8,21 +8,20 @@ import Layout from '@/layout';
import Login from '@/views/login/index';
// 英文默认登陆窗口
import LoginEn from '@/views/login/loginEn';
// import LoginNewScreen from '@/views/login/loginNewScreen';
import LoginScreen from '@/views/login/loginScreen';
import LoginPlan from '@/views/login/loginPlan';
import LoginDesign from '@/views/login/loginDesign';
import LoginDesignEn from '@/views/login/loginEnDesign';
import Jlmap3dedit from '@/views/jlmap3d/edit/jlmap3dedit';
import Jlmap3d from '@/views/jlmap3d/drive/jl3ddrive';
import Display from '@/views/display/index';
import DesignDisplay from '@/views/display/designIndex';
import TrainRoom from '@/views/trainRoom/index';
import JointTraining from '@/views/jointTraining/index';
import Error401 from '@/views/error-page/401';
import Errpr404 from '@/views/error-page/404';
import Dashboard from '@/views/dashboard/index';
import Dashboard1 from '@/views/dashboard/index.vue';
import SkinCode from '@/views/map/skinCode/index';
import SkinCodeDraft from '@/views/map/skinCode/draft';
import Mapdraft from '@/views/map/mapdraft/index';
@ -36,41 +35,38 @@ import Taskmanage from '@/views/lesson/taskmanage/list';
import TrainingRuleList from '@/views/lesson/trainingRule/list';
import TrainingRuleEdit from '@/views/lesson/trainingRule/detail/index';
import Trainingmanage from '@/views/lesson/trainingmanage/index';
import Lessoncategory from '@/views/lesson/lessoncategory/index';
// import Scriptmanage from '@/views/lesson/scriptmanage/list';
import LessonEdit from '@/views/lesson/lessoncategory/index';
import LessonHome from '@/views/lesson/home';
import Scriptmanage from '@/views/scriptManage/index';
import ScriptmanageHome from '@/views/scriptManage/home';
import ScriptDisplay from '@/views/scriptManage/display/index';
import ScriptDetail from '@/views/scriptManage/detail/index';
import Teach from '@/views/teach/index';
import TeachHome from '@/views/teach/home';
import TeachDetail from '@/views/teach/detail/index';
import TeachPractical from '@/views/teach/practical/index';
import Pay from '@/views/components/pay/index';
import Exam from '@/views/exam/index';
import ExamHome from '@/views/exam/home';
import ExamDetail from '@/views/exam/detail/examDetail';
import ExamCourseDetail from '@/views/exam/detail/courseDetail';
import ExamQuestionDetail from '@/views/exam/detail/questionDetail';
import ExamResult from '@/views/exam/result';
import PublishExamRule from '@/views/publish/examRule/index';
import PublishExamRuleDraft from '@/views/publish/examRule/draft/index';
import Demonstration from '@/views/demonstration/index';
import DemonstrationHome from '@/views/demonstration/home';
import DemonstrationDetail from '@/views/demonstration/detail/index';
import ScreenMonitor from '@/views/screenMonitor/index';
import ScreenMonitorHome from '@/views/screenMonitor/home';
import ScreenMonitorDetail from '@/views/screenMonitor/detail/index';
import PlanMonitorEditTool from '@/views/planMonitor/editTool/index';
import PlanMonitorEditUserTool from '@/views/planMonitor/editTool/userindex';
import PlanMonitor from '@/views/planMonitor/index';
import PlanMonitorHome from '@/views/planMonitor/home';
import PlanMonitorDetail from '@/views/planMonitor/detail';
import DesignPlatformHome from '@/views/designPlatform/home';
import DesignPlatform from '@/views/designPlatform/index';
import DesignPlatformUser from '@/views/designPlatform/userIndex';
import Replay from '@/views/replay/index';
import Package from '@/views/package/index';
import PackageDraft from '@/views/package/draft/ruleForm';
@ -85,8 +81,10 @@ import RunPlanTemplate from '@/views/publish/runPlanTemplate/index';
import RunPlanEveryDay from '@/views/publish/runPlanEveryDay/index';
import ProductStatus from '@/views/publish/productStatus/index';
import PublishLesson from '@/views/publish/publishLesson/index';
// import SimulationScript from '@/views/publish/simulationScript/index';
import IbpEdit from '@/views/ibp/ibpDraft/ibpEdit/index';
import TrainingPlatform from '@/views/trainingPlatform/index';
import TrainingPlatformHome from '@/views/trainingPlatform/home';
import Commodity from '@/views/orderauthor/commodity/index';
import CommodityDraft from '@/views/orderauthor/commodity/draft';
@ -110,9 +108,17 @@ import UserTraining from '@/views/management/userTraining/index';
import UserExam from '@/views/management/userExam/index';
import UserSimulation from '@/views/management/userSimulation/index';
import ExistingSimulation from '@/views/management/existingSimulation/index';
import CacheControl from '@/views/management/cacheControl/index';
import LessonApproval from '@/views/approval/lesson/index';
import ScriptApproval from '@/views/approval/script/index';
import RunPlanApproval from '@/views/approval/runPlan/index';
import SystemGenerate from '@/views/systemGenerate/index';
import { loginTitle } from '@/scripts/ConstDic';
import { getSessionStorage } from '@/utils/auth';
/**
* Note: sub-menu only appear when route children.length >= 1
* Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
@ -143,6 +149,7 @@ export const userLesson = '012'; // 教学系统
export const userSimulation = '013'; // 仿真系统
export const userScreen = '014'; // 大屏系统
export const userPlan = '015'; // 计划系统
export const userDesign='016'; // 设计系统
export const UrlConfig = {
display: '/display',
@ -152,8 +159,8 @@ export const UrlConfig = {
map: {
prefix: '/map',
draft: '/map/draw',
skinCode: '/map/skinCode',
skinCodeDraft: '/map/skinCode/draft',
skinCode: '/system/skinCode',
skinCodeDraft: '/system/skinCode/draft',
runPlan: '/map/runPlan',
runPlanView: '/map/runPlan/view',
product: '/map/product',
@ -164,24 +171,6 @@ export const UrlConfig = {
record: '/lesson/record/training',
manage: '/lesson/manage/training'
},
teach: {
prefix: '/teach',
detail: '/teach/detail',
practical: '/teach/practical',
pay: '/teach/pay'
},
exam: {
prefix: '/exam',
detail: '/exam/detail',
course: '/exam/course',
examRuleManage: '/exam/examRule/manage',
pay: '/exam/pay'
},
demonstration: {
prefix: '/demonstration',
detail: '/demonstration/detail',
pay: '/demonstration/pay'
},
dp: {
prefix: '/dp',
detail: '/dp/detail',
@ -191,18 +180,39 @@ export const UrlConfig = {
plan: {
prefix: '/plan',
tool: '/plan/tool',
usertool: '/plan/usertool',
detail: '/plan/detail',
pay: '/plan/pay'
},
design: {
prefix: '/design/home',
// tool: '/design/tool',
// detail: '/plan/detail',
// pay: '/plan/pay'
mapDraw: '/design/map/draw',
lessonEdit: '/design/lesson/edit',
lessonHome: '/design/lesson/home',
lessonManage: '/design/lesson/manage',
taskManage: '/design/lesson/taskManage',
trainingRule: '/design/lesson/trainingRule',
trainingRuleDetail: '/design/lesson/trainingRule/detail',
trainingManage: '/design/lesson/trainingManage',
lessonTraining: '/design/lesson/training',
trainingRecord: '/design/lesson/training',
runPlan: '/design/runPlan/detail',
scriptHome: '/design/script/home',
display: '/design/display'
},
designUser: {
prefix: '/design/userlist/home',
scriptHome: '/design/userlist/script/home',
mapDraw: '/design/userlist/map/draw',
lessonHome: '/design/userlist/lesson/home',
runPlan: '/design/userlist/runPlan/detail'
},
replay: {
prefix: '/replay'
},
permission: {
prefix: '/permission',
permissionList: '/permission/manage',
permissionDraft: '/permission/draft',
permission: '/permission/restore'
},
publish: {
prefix: '/publish',
map: '/publish/map',
@ -234,6 +244,22 @@ export const UrlConfig = {
prefix: 'ibp',
draft: '/ibp/draft',
edit: 'ibp/edit'
},
trainingPlatform: {
trainingPlatform: '/trainingPlatform',
trainingPlatformHome: '/trainingPlatform/home',
prodDetail: '/trainingPlatform/detail',
teachDetail: '/trainingPlatform/teach',
examDetail: '/trainingPlatform/exam',
examRuleManage: '/trainingPlatform/examRule/manage',
examRuleDraft: '/trainingPlatform/examRule/Draft',
course: '/trainingPlatform/course',
practical: '/trainingPlatform/practical',
permission: '/trainingPlatform/permission',
permissionDetails: '/trainingPlatform/permission/detail',
draft: '/trainingPlatform/draft',
pay: '/trainingPlatform/pay',
runPlan: '/trainingPlatform/runPlan/manage'
}
};
@ -243,13 +269,19 @@ export const UrlConfig = {
* all roles can be accessed
*/
export const constantRoutes = [
// 默认登陆窗口
// 实训平台登录
{
path: '/login',
component: Login,
hidden: true
},
// 英文登陆窗口
// 项目系统登录
{
path: '/login/:project',
component: Login,
hidden: true
},
// 实训平台英文登录
{
path: '/en/login',
component: LoginEn,
@ -261,13 +293,18 @@ export const constantRoutes = [
component: LoginScreen,
hidden: true
},
// 琏计划登陆
// 设计平台登录
{
path: '/plan/login',
component: LoginPlan,
path: '/design/login',
component: LoginDesign,
hidden: true
},
// 设计平台英文登录
{
path: '/design/en/login',
component: LoginDesignEn,
hidden: true
},
{
path: '/jlmap3d/edit',
component: Jlmap3dedit,
@ -284,34 +321,152 @@ export const constantRoutes = [
component: Errpr404,
hidden: true
},
{
path: '/',
component: Layout,
redirect: '/dashboard',
children: [{
path: 'dashboard',
component: Dashboard,
meta: {
i18n: 'router.homePage',
icon: 'dashboard'
}
}]
},
{ path: '*', redirect: '/404', hidden: true }
];
export const asyncRouter = [
{
path: '/',
path: '/design',
component: Layout,
redirect: '/dashboard',
hidden: true,
redirect: '/design/home',
meta: {
roles: [admin, user, userDesign]
},
children: [
{
path: 'dashboard',
component: Dashboard1
path: '',
redirect: '/design/home',
component: DesignPlatform,
meta: {
i18n: 'router.designhomePage',
icon: 'design'
},
children: [
{
path: 'home',
component: DesignPlatformHome,
meta: {
}
},
{
path: 'map/draw/:mapId/:view',
component: Mapedit,
hidden: true
},
{
path: 'lesson/edit/:type',
component: LessonEdit,
hidden: true
},
{
path: 'runPlan/detail/:mapId',
component: PlanMonitorDetail,
hidden: true
},
{
path: 'script/home/:mapId',
component: ScriptmanageHome,
meta: {
i18n: 'router.scriptManage'
},
hidden: true
},
{
path: 'lesson/home/:mapId/:skinCode',
component: LessonHome,
hidden: true
},
{
path: 'lesson/training/:trainingId/:trainingName',
component: TrainingrecordManage,
hidden: true
},
{
path: 'lesson/taskManage',
component: Taskmanage,
hidden: true
},
{
path: 'lesson/trainingRule',
component: TrainingRuleList,
hidden: true
},
{
path: 'lesson/trainingRule/detail',
hidden: true,
component: TrainingRuleEdit
},
{
path: 'lesson/trainingManage/:skinCode',
component: Trainingmanage,
hidden: true
},
{
path: 'lesson/training/:trainingId/:trainingName',
component: TrainingrecordManage,
hidden: true
}
]
}
]
},
{
path: '/design/userlist',
redirect: '/design/userlist/home',
component: Layout,
meta: {
roles: [admin, user, userDesign]
},
children: [
{
path: '',
redirect: '/design/userlist/home',
component: DesignPlatformUser,
meta: {
i18n: 'router.designUserPage',
icon: 'design'
},
children: [
{
path: 'home',
component: DesignPlatformHome,
meta: {
}
},
{
path: 'map/draw/:mapId/:view',
component: Mapedit,
hidden: true
},
{
path: 'lesson/edit/:type',
component: LessonEdit,
hidden: true
},
{
path: 'runPlan/detail/:mapId',
component: PlanMonitorDetail,
hidden: true
},
{
path: 'script/home/:mapId',
component: ScriptmanageHome,
meta: {
i18n: 'router.scriptManage'
},
hidden: true
},
{
path: 'lesson/home/:mapId',
component: LessonHome,
hidden: true
},
{
path: 'lesson/training/:trainingId/:trainingName',
component: TrainingrecordManage,
hidden: true
}
]
}
]
},
@ -322,6 +477,13 @@ export const asyncRouter = [
},
hidden: true
},
{
path: '/design/display/:mode',
component: DesignDisplay,
meta: {
},
hidden: true
},
{
path: '/scriptDisplay/:mode',
component: ScriptDisplay,
@ -352,22 +514,11 @@ export const asyncRouter = [
path: '/map',
meta: {
i18n: 'router.mapManage',
roles: [admin, mapCreater]
roles: [admin, mapCreater, userDesign]
},
hidden: true,
component: Layout,
children: [
{
path: 'skinCode',
component: SkinCode,
meta: {
i18n: 'router.skinManage'
}
},
{
path: 'skinCode/draft/:mode/:skinCodeId',
hidden: true,
component: SkinCodeDraft
},
{
path: 'draw',
redirect: '/map/draw/0/draft',
@ -383,13 +534,6 @@ export const asyncRouter = [
}
]
},
{
path: 'ibp/edit',
component: IbpEdit,
meta: {
i18n: 'router.ibpDraw'
}
},
{
path: 'runPlan',
redirect: '/map/runPlan/view/draft',
@ -415,9 +559,10 @@ export const asyncRouter = [
{
path: '/lesson',
component: Layout,
hidden: true,
meta: {
i18n: 'router.lessaonManage',
roles: [admin, lessonCreater]
roles: [admin, lessonCreater, userDesign]
},
children: [
{
@ -435,13 +580,6 @@ export const asyncRouter = [
}
]
},
{
path: 'manage/taskManage',
component: Taskmanage,
meta: {
i18n: 'router.taskManage'
}
},
{
path: 'manage/trainingRule',
component: TrainingRuleList,
@ -462,186 +600,96 @@ export const asyncRouter = [
meta: {
i18n: 'router.trainingManage'
}
},
{
path: 'edit',
component: Lessoncategory,
meta: {
i18n: 'router.lessonEdit'
}
}
]
},
{
path: '/script',
path: '/trainingPlatform',
component: Layout,
meta: {
roles: [admin, lessonCreater, user]
},
children: [
{
path: '',
redirect: '/script/home',
component: Scriptmanage,
meta: {
i18n: 'router.scriptManage'
},
children: [
{
path: 'home',
component: ScriptmanageHome,
meta: {
i18n: 'router.scriptManage'
}
},
{
path: 'detail/:scriptId',
component: ScriptDetail,
hidden: true
}
]
}
]
},
{
path: '/teach',
component: Layout,
meta: {
roles: [admin, userLesson, user]
},
children: [
{
path: '',
redirect: '/teach/home',
component: Teach,
meta: {
i18n: 'router.teachSystem'
},
children: [
{
path: 'home',
component: TeachHome
},
{
// 课程详情
path: 'detail/:lessonId',
component: TeachDetail,
meta: {
},
hidden: true
},
{
// 实训详情
path: 'practical/:trainingId/:lessonId',
component: TeachPractical,
meta: {
},
hidden: true
},
{
path: 'pay/:lessonId',
component: Pay,
meta: {
},
hidden: true
}
]
}
]
},
{
path: '/exam',
component: Layout,
meta: {
roles: [admin, userExam, user]
},
children: [
{
path: '',
redirect: '/exam/home',
component: Exam,
meta: {
i18n: 'router.examSystem'
},
children: [
{
path: 'home',
component: ExamHome
},
{
// 试卷详情
path: 'detail/:examId',
component: ExamDetail,
hidden: true
},
{
path: 'course/:lessonId',
component: ExamCourseDetail,
hidden: true
},
{
// 规则管理
path: 'examRule/manage',
component: PublishExamRule,
hidden: true
},
{
path: 'examRule/draft/:mode/:ruleId/:lessonId',
hidden: true,
component: PublishExamRuleDraft
},
{
path: 'pay/:lessonId',
component: Pay,
hidden: true
},
{
// 开始考试
path: 'questionDetail/:examQuestionId',
component: ExamQuestionDetail,
hidden: true
},
{
// 考试结果
path: 'result/:userExamId',
component: ExamResult,
hidden: true
}
]
}
]
},
{
path: '/demonstration',
component: Layout,
meta: {
roles: [admin, userSimulation, user]
},
children: [
{
path: '',
redirect: '/demonstration/home',
component: Demonstration,
redirect: '/trainingPlatform/home',
component: TrainingPlatform,
meta: {
i18n: 'router.demonstrationSystem'
},
children: [
{
path: 'home',
component: DemonstrationHome,
redirect: '/trainingPlatform/permission/14',
component: TrainingPlatformHome,
meta: {
i18n: 'router.demonstrationSystem'
}
},
hidden: true
},
{
path: 'detail/:mapId',
component: DemonstrationDetail,
hidden: true
},
{
path: 'teach',
component: TeachDetail,
hidden: true
},
{
path: 'exam/:examId',
component: ExamDetail,
hidden: true
},
{
path: 'practical/:trainingId/:lessonId',
component: TeachPractical,
hidden: true
},
{
path: 'pay/:lessonId',
component: Pay,
hidden: true
},
{
path: 'course/:mapId',
component: ExamCourseDetail,
hidden: true
},
{
path: 'result/:userExamId',
component: ExamResult,
hidden: true
},
{
path: 'permission/:mapId',
component: Package,
hidden: true
},
{
path: 'permission/detail/:id',
component: PackageDetail,
hidden: true
},
{
path: 'draft',
component: PackageDraft,
hidden: true
},
{
path: 'examRule/manage',
component: PublishExamRule,
hidden: true
},
{
path: 'examRule/draft/:mode/:ruleId/:lessonId',
component: PublishExamRuleDraft,
hidden: true
},
{
path: 'runPlan/manage/:mapId',
component: PlanMonitorDetail,
hidden: true
}
]
}
@ -649,6 +697,7 @@ export const asyncRouter = [
},
{
path: '/dp',
hidden: true,
redirect: '/dp/home',
component: ScreenMonitor,
meta: {
@ -675,6 +724,13 @@ export const asyncRouter = [
}
]
},
{
path: '/plan/usertool',
component: PlanMonitorEditUserTool,
meta: {
},
hidden: true
},
{
path: '/plan/tool',
component: PlanMonitorEditTool,
@ -686,8 +742,9 @@ export const asyncRouter = [
path: '/plan',
redirect: '/plan/home',
component: PlanMonitor,
hidden: true,
meta: {
roles: [admin, user]
roles: [admin, user, userDesign]
},
children: [
{
@ -713,8 +770,9 @@ export const asyncRouter = [
{
path: '/replay',
component: Layout,
hidden: true,
meta: {
roles: [admin]
roles: [admin, userDesign]
},
children: [
{
@ -726,38 +784,12 @@ export const asyncRouter = [
}
]
},
{
path: '/permission',
component: Layout,
meta: {
roles: [admin, user]
},
children: [
{
path: 'manage',
component: Package,
meta: {
i18n: 'router.selfPermission'
}
},
{
path: 'manage/detail/:id',
component: PackageDetail,
hidden: true
},
{
path: 'draft',
component: PackageDraft,
hidden: true
}
]
},
{
path: '/publish',
component: Layout,
meta: {
i18n: 'router.pulishManage',
roles: [admin]
roles: [admin, userDesign]
},
children: [
{
@ -848,7 +880,7 @@ export const asyncRouter = [
component: Layout,
meta: {
i18n: 'router.orderAuthorityManage',
roles: [admin]
roles: [admin, userDesign]
},
children: [
{
@ -940,9 +972,28 @@ export const asyncRouter = [
component: Layout,
meta: {
i18n: 'router.systemManage',
roles: [admin]
roles: [admin, userDesign]
},
children: [
{
path: 'skinCode',
component: SkinCode,
meta: {
i18n: 'router.skinManage'
}
},
{
path: 'skinCode/draft/:mode/:skinCodeId',
hidden: true,
component: SkinCodeDraft
},
{
path: 'ibp/edit',
component: IbpEdit,
meta: {
i18n: 'router.ibpDraw'
}
},
{
path: 'dictionary',
component: Dictionary,
@ -999,6 +1050,44 @@ export const asyncRouter = [
meta: {
i18n: 'router.existingSimulation'
}
},
{
path: 'systemGenerate',
component: SystemGenerate,
meta: {
i18n: 'router.subsystemGeneration'
}
}
]
},
{
path: '/apply',
component: Layout,
meta: {
i18n: 'router.releaseApplication',
roles: [admin, userDesign]
},
children: [
{
path: 'lesson',
component: LessonApproval,
meta: {
i18n: 'router.courseApplication'
}
},
{
path: 'script',
component: ScriptApproval,
meta: {
i18n: 'router.scriptReleaseApplication'
}
},
{
path: 'runGraph',
component: RunPlanApproval,
meta: {
i18n: 'router.runGraphReleaseApplication'
}
}
]
}
@ -1016,11 +1105,17 @@ router.beforeEach((to, from, next) => {
const name = to.fullPath;
if (name.includes('/dp/') || name.includes('display/dp')) {
document.title = '琏课堂-大屏系统';
} else if (name.includes('/plan/') || name.includes('/planEdit/')) {
document.title = '琏计划';
} else if (name.includes('/trainingPlatform/')) {
const project = getSessionStorage('project');
document.title = loginTitle[project || 'default'];
} else if (name.includes('/design/') || name.includes('/scriptDisplay/') || name.includes('/plan/') || name.includes('/publish/') || name.includes('/orderauthor/') || name.includes('/system/') || name.includes('/display/plan/') || name.includes('/apply/') || name.includes('/display/manage/')) {
document.title = '城市轨道交通设计平台';
} else {
document.title = '琏课堂';
}
// else if (name.includes('/plan/') || name.includes('/planEdit/')) {
// document.title = '琏计划';
// }
next();
});

View File

@ -97,6 +97,12 @@ export default {
{ label: '北京一号线', value: '03'},
{ label: '成都三号线', value: '04'},
{ label: '北京八通线', value: '05'}
],
releaseReview: [
{ enlabel: 'Unpublished', label: '未发布', value: '0'},
{ enlabel: 'Pending review', label: '待审核', value: '1'},
{ enlabel: 'Successfully released', label: '发布成功', value: '2'},
{ enlabel: 'Overrule', label: '被驳回', value: '3'}
]
}

View File

@ -1094,7 +1094,7 @@ export const OperationEvent = {
event: '2',
button: {
operation: '4020',
domId: '_Tips-Section-Fault-Mbm{TOP}'
domId: '_Tips-Section-Fault-Mbm'
},
menu: {
operation: '402',
@ -2192,3 +2192,8 @@ export const IbpOperation = {
Down_Hold_Train: {operate: '03', status: 'on'},
Down_Cancel_Hold_Train: {operate: '04', status: 'off'}
};
export const loginTitle = {
xty: '西铁院城市轨道交通实训平台',
default: '城市轨道交通实训平台'
};

File diff suppressed because it is too large Load Diff

View File

@ -29,7 +29,7 @@ OperateHandler.prototype = {
if (order >= steps) {
return valid;
}
// debugger;
const standard = steps[order];
if (operate && standard && operate.code == standard.code && operate.type == standard.type &&
operate.operation == standard.operation &&

View File

@ -1,6 +1,7 @@
import { asyncRouter, constantRoutes, user, userLesson, userExam, userSimulation, userScreen, userPlan, superAdmin, admin } from '@/router';
import { asyncRouter, constantRoutes, user, userLesson, userExam, userSimulation, userScreen, userPlan, superAdmin, admin, userDesign } from '@/router';
import { PermissionType } from '@/utils/PermissionType';
import { UrlConfig } from '@/router/index';
import { getSessionStorage } from '@/utils/auth';
function setHonePagePath(route, roles) {
if (roles && roles.length === 2 && roles.indexOf(user) >= 0 && (route.path === '/' || route.path === 'dashboard')) {
@ -27,7 +28,38 @@ function hasPermission(roles, route, parentsRoles) {
setHonePagePath(route, roles);
if (route.meta && route.meta.roles) {
// 如果存在本级路由则使用自己的roles过滤
return roles.some(role => route.meta.roles.indexOf(role) >= 0);
// debugger;
// if (getSessionStorage('design')) {
// if (route.meta.roles.indexOf(userDesign)===-1) {
// route.hidden = true;
// } else {
// if ((route.meta.roles.indexOf(admin)>=0 && roles.indexOf(admin)>=0)) {
// route.hidden = false;
// } else if (route.meta.roles.indexOf(user)>=0 && roles.indexOf(user)>=0) {
// route.hidden = false;
// } else {
// route.hidden = true;
// }
// }
// } else {
// if (route.meta.roles.indexOf(userDesign)>0) {
// route.hidden = true;
// }
// }
// return roles.some(role => route.meta.roles.indexOf(role) >= 0);
if (getSessionStorage('design')) {
roles= roles.filter(function (role) {
return route.meta.roles.indexOf(role) >= 0;
});
const result=roles.every(role => route.meta.roles.indexOf(role) >= 0);
return result && ((roles.indexOf(admin)>=0 && route.meta.roles.indexOf(admin)>=0) || (roles.indexOf(user)>=0 && route.meta.roles.indexOf(user)>=0 ));
} else {
roles= roles.filter(function (role) {
return route.meta.roles.indexOf(role) >= 0;
});
return roles.some(role => route.meta.roles.indexOf(role) >= 0) && route.meta.roles.indexOf(userDesign)<0;
}
} else if (parentsRoles) {
// 如果没有本级路由,有父级路由,则使用父级路由过滤
return roles.some(role => parentsRoles.indexOf(role) >= 0);
@ -93,12 +125,15 @@ const permission = {
return new Promise(resolve => {
const { roles } = convertRouterRoles(data);
let accessedRouters;
if (roles.indexOf(superAdmin) >= 0) {
accessedRouters = asyncRouter;
} else {
accessedRouters = filterAsyncRouter(asyncRouter, roles);
if (roles.indexOf(superAdmin) >= 0 && roles.indexOf(admin) < 0) {
roles.push(admin);
}
// if (roles.indexOf(superAdmin) >= 0) {
// accessedRouters = asyncRouter;
// } else {
// eslint-disable-next-line prefer-const
accessedRouters = filterAsyncRouter(asyncRouter, roles);
// }
commit('SET_ROUTERS', accessedRouters);
resolve();
});

View File

@ -1,6 +1,6 @@
import { setSessionStorage } from '@/utils/auth';
import { setSessionStorage, removeSessionStorage } from '@/utils/auth';
import { login, logout, getInfo } from '@/api/login';
import { getToken, setToken, removeToken, removeScreenToken, setScreenToken, getScreenToken, setPlanToken, getPlanToken, removePlanToken, handleToken, handleRemoveToken } from '@/utils/auth';
import { getToken, setToken, removeToken, removeScreenToken, setScreenToken, getScreenToken, setPlanToken, getDesignToken, setDesignToken, getPlanToken, removeDesignToken, removePlanToken, handleToken, handleRemoveToken } from '@/utils/auth';
import { getUserConfigInfo } from '@/api/management/user';
import { LoginParams } from '@/utils/login';
import { creatSubscribe, perpetualTopic } from '@/utils/stomp';
@ -10,6 +10,7 @@ const user = {
token: getToken(),
tokenScreen: getScreenToken(),
tokenPlan: getPlanToken(),
tokenDesign: getDesignToken(),
name: '',
nickname: '',
nationcode: '',
@ -17,7 +18,8 @@ const user = {
id: '',
admin: false,
wxId: '',
wxUnionId: ''
wxUnionId: '',
account: ''
},
mutations: {
@ -27,6 +29,9 @@ const user = {
SET_TOKENSCREEN: (state, token) => {
state.tokenScreen = token;
},
SET_TOKENDESIGN: (state, token) => {
state.tokenDesign = token;
},
SET_TOKENPLAN: (state, token) => {
state.tokenPlan = token;
},
@ -50,6 +55,9 @@ const user = {
},
SET_WXUNIONID: (state, wxUnionId) => {
state.wxUnionId = wxUnionId;
},
SET_ACCOUNT: (state, account) => {
state.account = account;
}
},
@ -69,12 +77,22 @@ const user = {
const header = { group: '', 'X-Token': getScreenToken() };
creatSubscribe(perpetualTopic, header);
};
} else if (userInfo.type == 'plan') {
params = Object.assign({ account: username, password }, LoginParams.LianJiHua);
}
// else if (userInfo.type == 'plan') {
// params = Object.assign({ account: username, password }, LoginParams.LianJiHua);
// execFc = (token) => {
// setPlanToken(token);
// commit('SET_TOKENPLAN', token);
// const header = { group: '', 'X-Token': getPlanToken() };
// creatSubscribe(perpetualTopic, header);
// };
// }
else if (userInfo.type == 'design') {
params = Object.assign({ account: username, password }, LoginParams.Design);
execFc = (token) => {
setPlanToken(token);
commit('SET_TOKENPLAN', token);
const header = { group: '', 'X-Token': getPlanToken() };
setDesignToken(token);
commit('SET_TOKENDESIGN', token);
const header = { group: '', 'X-Token': getDesignToken() };
creatSubscribe(perpetualTopic, header);
};
} else {
@ -82,6 +100,7 @@ const user = {
execFc = (token) => {
setToken(token);
commit('SET_TOKEN', token);
setSessionStorage('project', userInfo.project||'');
const header = { group: '', 'X-Token': getToken() };
creatSubscribe(perpetualTopic, header);
};
@ -89,6 +108,12 @@ const user = {
// 登录系统
login(params).then(resp => {
if (userInfo.type == 'design') {
removeSessionStorage('design');
setSessionStorage('design', true);
} else {
removeSessionStorage('design');
}
execFc(resp.data);
resolve();
}).catch(error => { reject(error); });
@ -149,12 +174,17 @@ const user = {
FedLogOut({ commit }, clientId) {
return new Promise(resolve => {
if (clientId == LoginParams.DaPing.clientId) {
commit('SET_TOKENSCREEN', '');
commit('SET_TOKENDESIGN', '');
removeScreenToken();
} else if (clientId == LoginParams.LianJiHua.clientId) {
commit('SET_TOKENPLAN', '');
removePlanToken();
} else {
} else if (clientId == LoginParams.Design.clientId) {
commit('SET_TOKENSCREEN', '');
removeDesignToken();
}
// else if (clientId == LoginParams.LianJiHua.clientId) {
// commit('SET_TOKENPLAN', '');
// removePlanToken();
// }
else {
commit('SET_TOKEN', '');
removeToken();
}
@ -170,12 +200,17 @@ const user = {
commit('SET_TOKEN', '');
commit('SET_ROLES', []);
commit('SET_ID', '');
removeSessionStorage('design');
handleRemoveToken();
resolve();
}).catch(error => {
reject(error);
});
});
},
SetAccount({ commit }, account) {
commit('SET_ACCOUNT', account);
}
}
};

View File

@ -7,6 +7,8 @@ const TokenScreenKey = 'Screen-Token';
const TokenPlanKey = 'Plan-Token';
const TokenDesignKey='Design-Token';
// 设置教学实训仿真系统token
export function getToken() {
return SessionStorage.getItem(TokenKey);
@ -28,6 +30,17 @@ export function removeScreenToken() {
return SessionStorage.removeItem(TokenScreenKey);
}
// 设置城市轨道交通设计平台token
export function getDesignToken() {
return SessionStorage.getItem(TokenDesignKey);
}
export function setDesignToken(token) {
return SessionStorage.setItem(TokenDesignKey, token);
}
export function removeDesignToken() {
return SessionStorage.removeItem(TokenDesignKey);
}
// 设置琏计划token
export function getPlanToken() {
return SessionStorage.getItem(TokenPlanKey);
@ -54,8 +67,10 @@ export function handleToken() {
const path = window.location.href;
if (path.includes('/dp/') || path.includes('/display/dp')) {
return getScreenToken();
} else if (path.includes('/design') || path.includes('/scriptDisplay') || path.includes('/publish') || path.includes('/orderauthor') || path.includes('/system') || path.includes('/display/manage') || path.includes('/apply/')) {
return getDesignToken();
} else if (path.includes('/plan') || path.includes('/display/plan')) {
return getPlanToken();
return getDesignToken() || getToken();
} else {
return getToken();
}
@ -66,8 +81,8 @@ export function handleRemoveToken() {
const path = window.location.href;
if (path.includes('/dp/') || path.includes('/display/dp')) {
return removeScreenToken();
} else if (path.includes('/plan') || path.includes('/display/plan')) {
return removePlanToken();
} else if (path.includes('/design') || path.includes('/scriptDisplay') || path.includes('/plan') || path.includes('/publish') || path.includes('/orderauthor') || path.includes('/system') || path.includes('/display/plan') || path.includes('/display/manage') || path.includes('/apply/')) {
return removeDesignToken();
} else {
return removeToken();
}
@ -79,8 +94,12 @@ export function gainClientId() {
let clientId = null;
if (path.includes('/dp/') || path.includes('/display/dp')) {
clientId = LoginParams.DaPing.clientId;
} else if (path.includes('/plan') || path.includes('/display/plan')) {
clientId = LoginParams.LianJiHua.clientId;
}
// else if (path.includes('/plan') || path.includes('/display/plan')) {
// clientId = LoginParams.LianJiHua.clientId;
// }
else if (path.includes('/design') || path.includes('/scriptDisplay') || path.includes('/plan') || path.includes('/publish') || path.includes('/orderauthor') || path.includes('/system') || path.includes('/display/plan') || path.includes('/display/manage') || path.includes('/apply/')) {
clientId = LoginParams.Design.clientId;
}
return clientId;

View File

@ -4,5 +4,6 @@ export const LoginParams = {
LianKeTang: { clientId: '1', secret: 'joylink' }, // "琏课堂"
DaPing: { clientId: '2', secret: 'bigscreen' }, // "大屏系统"
LianJiHua: { clientId: '3', secret: 'linkplan' }, // "琏计划"
Assistant: { clientId: '4', secret: 'linkassistant' } // "琏课堂助手"
Assistant: { clientId: '4', secret: 'linkassistant' }, // "琏课堂助手"
Design: { clientId: '6', secret: 'design' } // "城市轨道交通设计平台"
};

View File

@ -0,0 +1,100 @@
<template>
<el-dialog
:title="this.$t('approval.courseDetails')"
:visible.sync="showDetail"
top="20px"
width="90%"
:before-do-close="doClose"
:close-on-click-modal="false"
>
<div>
<el-card v-loading="loading">
<div slot="header" style="text-align: center;">
<b>{{ $t('global.courseName') }}: {{ lessonName }}</b>
</div>
<div style="margin:50px">
<p style="font-size: 14px; margin-bottom: 20px"> {{ $t('approval.courseDescription')}}:
<span style="color: #808080 !important;">{{ lessonRemark }}</span>
</p>
</div>
</el-card>
<el-card v-loading="loading">
<el-scrollbar wrap-class="scrollbar-wrapper" :style="{height: height -60 + 'px'}">
<el-table
:data="tableData"
row-key="id"
border
default-expand-all
:tree-props="{children: 'children', hasChildren: 'hasChildren'}">
<el-table-column
prop="name"
border
:label="this.$t('approval.chapterTrainingName')">
</el-table-column>
<el-table-column
prop="remarks"
border
:label="this.$t('approval.instructions')">
</el-table-column>
</el-table>
</el-scrollbar>
</el-card>
</div>
</el-dialog>
</template>
<script>
import {reviewLessonDetail} from '@/api/designPlatform';
export default {
name: 'LessonApprovalDetail',
components: {
},
watch: {
},
computed: {
height() {
return this.$store.state.app.height - 260;
}
},
data() {
return{
loading: false,
tableData: [],
lessonName: '',
lessonRemark: '',
showDetail: false
}
},
created() {
},
mounted() {
// this.loadInitData();
},
beforeDestroy(){
},
methods: {
show(lessonId){
this.showDetail = true;
this.loadInitData(lessonId);
},
loadInitData(lessonId) {
this.loading =true;
reviewLessonDetail(lessonId).then(response =>{
this.tableData = response.data[0].children;
this.lessonName = response.data[0].name;
this.lessonRemark = response.data[0].remarks;
this.loading = false;
}).catch(error=>{
this.$messageBox(this.$t('approval.failedToGetCourseData'))
});
},
doClose() {
}
}
}
</script>

View File

@ -0,0 +1,214 @@
<template>
<div>
<QueryListPage ref="queryListPage" :pager-config="pagerConfig" :query-form="queryForm" :query-list="queryList"></QueryListPage>
<el-dialog :title="this.$t('approval.explanation')" :visible.sync="dialogFormVisible" v-dialogDrag>
<!--<el-input type="textarea"
:rows="2"
:placeholder="this.$t('rules.enterRejectReason')"
@focus="inputFocus"
@blur="inputBlur"
v-model="textarea"></el-input>
<span v-show="needReason" style="color: red">{{'*'+$t('rules.enterRejectReason')}}</span>-->
<data-form ref="dataform" :form="form" :form-model="formModel" :rules="rules" />
<div slot="footer" class="dialog-footer">
<el-button @click="rejectCancel">{{$t('global.cancel')}}</el-button>
<el-button type="primary" @click="rejectConfirm">{{$t('global.confirm')}}</el-button>
</div>
</el-dialog>
<lesson-detail ref="lessonDetail"></lesson-detail>
</div>
</template>
<script>
import {adminPublishLesson,rejectedLessonRelease,reviewLessonList} from '@/api/designPlatform';
import { listPublishMap } from '@/api/jmap/map';
import LessonDetail from './detail';
export default {
name: 'LessonApproval',
components: {
LessonDetail
},
data() {
return{
dialogFormVisible: false,
rejectId: '',
formModel: {
explanation: ''
},
mapList: [],
pagerConfig: {
pageSize: 'pageSize',
pageIndex: 'pageNum'
},
queryForm: {
labelWidth: '120px',
reset: true,
queryObject: {
mapId: {
type: 'select',
label: this.$t('approval.map')+this.$t('global.colon'),
config: {
data: []
}
},
lessonName: {
type: 'text',
label: this.$t('lesson.courseName')
},
userName: {
type: 'text',
label: this.$t('approval.applicant')+this.$t('global.colon'),
}
}
},
queryList: {
query: reviewLessonList,
selectCheckShow: false,
indexShow: true,
columns: [
{
title: this.$t('lesson.courseName'),
prop: 'name'
},
{
title: this.$t('approval.map'),
prop: 'mapId ',
type: 'tag',
columnValue: (row) => { return this.$convertField(row.mapId , this.mapList, ['value', 'label']); },
tagType: (row) => { return ''; }
},
{
title: this.$t('approval.courseDescription'),
prop: 'remarks'
},
{
title: this.$t('approval.applicant'),
prop: 'userName'
},
{
title: this.$t('approval.applyTime'),
prop: 'uploadTime',
type: 'tag',
columnValue: (row) => { return this.handleTime(row.uploadTime)},
tagType: (row) => { return ''; }
},
{
type: 'button',
title: this.$t('global.operate'),
width: '250',
buttons: [
{
name: this.$t('approval.lookOver'),
handleClick: this.goDetail,
type: ''
},
{
name: this.$t('approval.applyPassed'),
handleClick: this.pass,
type: ''
},
{
name: this.$t('approval.applyReject'),
handleClick: this.noPass,
type: ''
}
]
}
]
},
form :{
labelWidth: '150px',
items: [
{ prop: 'explanation', label: this.$t('approval.explanation'), type: 'textarea', required: true},
]
},
rules :{
explanation: [
{ required: true, message: this.$t('rules.enterRejectReason'), trigger: 'blur' }
]
}
}
},
created(){
listPublishMap().then(response=>{
response.data.forEach(elem => {
this.mapList.push({ value: elem.id, label: elem.name });
});
this.queryForm.queryObject.mapId.config.data = this.mapList;
});
},
mounted(){
},
beforeDestroy(){
},
watch: {
},
methods: {
goDetail(index,row) {
this.$refs.lessonDetail.show(row.id);
},
pass(index,row) {
this.$confirm(this.$t('tip.publishTheCourseHint'), this.$t('global.tips'), {
confirmButtonText: this.$t('global.confirm'),
cancelButtonText: this.$t('global.cancel'),
type: 'warning'
}).then(() => {
const params = {
cityCode: row.cityCode,
mapId: row.mapId,
name: row.name,
prdCode: row.prdCode
};
adminPublishLesson(params,row.id).then(response => {
this.loading = false;
this.$message.success(this.$t('tip.coursePublishSuccessful'));
this.doClose();
}).catch(error => {
this.loading = false;
this.$messageBox(this.$t('tip.coursePublishFailed'));
})
});
},
noPass(index,row) {
this.dialogFormVisible = true;
this.rejectId = row.id;
},
handleTime(time) {
let timeList = time.split("T");
return timeList[0] + ' ' +timeList[1];
},
doClose() {
this.$refs.queryListPage.refresh(true);
},
rejectConfirm() {
this.$refs.dataform.validateForm(() => {
if (this.rejectId){
rejectedLessonRelease(this.formModel,this.rejectId).then(resp =>{
this.loading = false;
this.$message.success(this.$t('tip.rejectedCourseReleaseApplicationSuccessful'));
this.dialogFormVisible = false;
this.rejectId = '';
this.doClose();
}).catch(error => {
this.loading = false;
this.$messageBox(this.$t('tip.rejectedCourseReleaseApplicationSuccessful'));
this.dialogFormVisible = false;
this.rejectId = '';
this.doClose();
})
}
});
},
rejectCancel() {
this.dialogFormVisible = false;
this.rejectId = '';
this.textarea = '';
}
}
}
</script>

View File

@ -0,0 +1,180 @@
<template>
<div>
<QueryListPage ref="queryListPage" :pager-config="pagerConfig" :query-form="queryForm" :query-list="queryList" />
<run-plan-operate ref='applyPassed' @reloadTable="reloadTable" @create="handleConfirmPass" :title="$t('approval.passedRunPlan')" type="applyPassed">
</run-plan-operate>
<run-plan-operate ref='applyReject' @reloadTable="reloadTable" @create="handleConfirmReject" :title="$t('approval.rejectRunPlan')" type="applyReject">
</run-plan-operate>
</div>
</template>
<script>
import RunPlanOperate from './operate';
import { reviewRunPlanList,publishRunPlan,rejectRunPlan,previewRunPlan } from '@/api/designPlatform';
import { listPublishMap } from '@/api/jmap/map';
import { launchFullscreen } from '@/utils/screen';
import { UrlConfig } from '@/router/index';
export default {
name: 'ScriptApproval',
components: {
RunPlanOperate
},
data() {
return{
pagerConfig: {
pageSize: 'pageSize',
pageIndex: 'pageNum'
},
queryForm: {
labelWidth: '100px',
reset: true,
queryObject: {
mapId: {
type: 'select',
label: this.$t('approval.map'),
config: {
data: []
}
},
'scriptName':{
type: 'text',
label: this.$t('approval.runPlanName')
},
'userName': {
type: 'text',
label: this.$t('approval.applicant')
}
}
},
queryList: {
query: this.queryFunction,
selectCheckShow: false,
indexShow: true,
columns: [
{
title: this.$t('approval.runPlanName'),
width:250,
prop: 'name'
},
{
title: this.$t('approval.map'),
prop: 'mapId ',
width:250,
type: 'tag',
columnValue: (row) => { return this.$convertField(row.mapId , this.mapList, ['value', 'label']); },
tagType: (row) => { return ''; }
},
{
title: this.$t('approval.applicant'),
prop: 'userName'
},
{
title: this.$t('approval.applyTime'),
prop: 'uploadTime',
type: 'tag',
columnValue: (row) => { return row.uploadTime.replace("T"," ")},
tagType: (row) => { return ''; }
},
{
type: 'button',
title: this.$t('global.operate'),
width: '450',
buttons: [
{
name: this.$t('approval.applyPassed'),
handleClick: this.applyPassed,
type: ''
},
{
name: this.$t('approval.applyReject'),
handleClick: this.applyReject,
type: ''
},
{
name: this.$t('approval.runPlanPreview'),
handleClick: this.runPlanPreview,
type: ''
}
]
}
]
}
}
},
created(){
},
mounted(){
this.loadInitData();
},
beforeDestroy(){
},
watch: {
},
methods: {
reloadTable() {
if (this.queryList && this.queryList.reload) {
this.queryList.reload();
}
},
goDetail() {
this.$router.push({path:``});
},
async loadInitData() {
try {
//
this.mapList = [];
const res = await listPublishMap();
res.data.forEach(elem => {
this.queryForm.queryObject.mapId.config.data.push({ value: elem.id, label: elem.name });
this.mapList.push({ value: elem.id, label: elem.name });
});
} catch (error) {
console.error(error, '获取发布地图');
}
},
queryFunction(params) {
return reviewRunPlanList(params);
},
applyPassed(index,row){
this.$refs.applyPassed.doShow(row);
},
applyReject(index,row){
this.$refs.applyReject.doShow(row);
},
runPlanPreview(index,row){
previewRunPlan(row.id).then(resp => {
const query = {
skinCode: row.skinCode, prdType: '01', group: resp.data, mapId: row.mapId, planId: row.id,from:''
};
this.$router.push({ path: `${UrlConfig.display}/plan`, query: query });
launchFullscreen();
}).catch(error => {
this.$messageBox(this.$t('tip.createSimulationFaild')+this.$t('global.colon')+error.message);
});
},
handleConfirmPass(data){
publishRunPlan(data.id,data).then(resp => {
if(resp.data.length<=0){
this.$message.success(this.$t('approval.passedScriptSuccess'));
}
else{
this.$messageBox(`${this.$t('approval.passedScriptFailed')}: ${resp.data[0]}`);
}
this.reloadTable();
}).catch(error => {
this.$messageBox(`${this.$t('approval.passedScriptFailed')}: ${error.message}`);
})
},
handleConfirmReject(data){
rejectRunPlan(data.id,data).then(resp => {
this.reloadTable();
this.$message.success(this.$t('approval.rejectScriptSuccess'));
}).catch(error => {
this.$messageBox(`${this.$t('approval.rejectScriptFailed')}: ${error.message}`);
})
},
}
}
</script>

View File

@ -0,0 +1,98 @@
<template>
<div>
<el-dialog :title="title" :visible.sync="dialogVisible" width="500px" :before-close="doClose" center>
<data-form ref="dataform" :form="form" :formModel="formModel" :rules="rules"></data-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="doCreate">{{$t('global.confirm')}}</el-button>
<el-button @click="doClose">{{$t('global.cancel')}}</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
name: 'ScriptOperate',
data() {
return {
dialogVisible: false,
formModel:{
runPlanName:'',
id:'',
explanation:'',
},
isShow: false,
}
},
props: {
title: String,
type:String,
},
computed: {
form() {
let form={};
if(this.type=="applyPassed"){
form = {
labelWidth: '150px',
items: [
{ prop: 'runPlanName', label: this.$t('approval.runPlanName'), type: 'text', required: true},
]
}
}
else{
form = {
labelWidth: '150px',
items: [
{ prop: 'explanation', label: this.$t('approval.explanation'), type: 'textarea', required: true},
]
}
}
return form
},
rules() {
let crules ={};
if(this.type=="applyPassed"){
crules={
runPlanName: [
{ required: true, message: this.$t('approval.inputRunPlanName'), trigger: 'blur' },
]
}
}
else{
crules={
explanation:[
{ required: true, message: this.$t('approval.inputRejectExplanation'), trigger: 'blur',max:200 },
]
}
}
return crules
},
},
methods: {
doShow(row) {
if(this.type=="applyPassed"){
this.formModel.runPlanName=row.name;
}
this.formModel.id=row.id;
this.dialogVisible = true
},
doCreate() {
let self = this
this.$refs.dataform.validateForm(() => {
self.$emit('create', Object.assign({}, this.formModel));
self.doClose()
})
},
doClose() {
this.$refs.dataform.resetForm();
this.isShow = false;
this.dialogVisible = false
}
}
};
</script>
<style lang="scss" scoped>
/deep/ .el-dialog--center .el-dialog__body{
padding: 15px 65px 10px 10px;
}
</style>

View File

@ -0,0 +1,161 @@
<template>
<div>
<QueryListPage ref="queryListPage" :pager-config="pagerConfig" :query-form="queryForm" :query-list="queryList" />
<!-- <script-operate ref='applyPassed' @reloadTable="reloadTable" @create="handleConfirmPass" :title="$t('approval.passedScript')" type="applyPassed">
</script-operate> -->
<script-operate ref='applyReject' @reloadTable="reloadTable" @create="handleConfirmReject" :title="$t('approval.rejectScript')">
</script-operate>
</div>
</template>
<script>
import ScriptOperate from './operate';
import { reviewScriptList,publishScript,rejectScript } from '@/api/designPlatform';
import { listPublishMap } from '@/api/jmap/map';
export default {
name: 'ScriptApproval',
components: {
ScriptOperate
},
data() {
return{
pagerConfig: {
pageSize: 'pageSize',
pageIndex: 'pageNum'
},
queryForm: {
labelWidth: '100px',
reset: true,
queryObject: {
mapId: {
type: 'select',
label: this.$t('approval.map'),
config: {
data: []
}
},
'scriptName':{
type: 'text',
label: this.$t('approval.scriptName')
},
'creatorName': {
type: 'text',
label: this.$t('approval.applicant')
}
}
},
queryList: {
query: this.queryFunction,
selectCheckShow: false,
indexShow: true,
columns: [
{
title: this.$t('approval.scriptName'),
width:250,
prop: 'name'
},
{
title: this.$t('approval.map'),
prop: 'mapId ',
width:250,
type: 'tag',
columnValue: (row) => { return this.$convertField(row.mapId , this.mapList, ['value', 'label']); },
tagType: (row) => { return ''; }
},
{
title: this.$t('approval.scriptDescription'),
prop: 'description'
},
{
title: this.$t('approval.applicant'),
prop: 'creatorName'
},
{
title: this.$t('approval.applyTime'),
prop: 'uploadTime',
type: 'tag',
columnValue: (row) => { return row.uploadTime.replace("T"," ")},
tagType: (row) => { return ''; }
},
{
type: 'button',
title: this.$t('global.operate'),
width: '450',
buttons: [
{
name: this.$t('approval.applyPassed'),
handleClick: this.applyPassed,
type: ''
},
{
name: this.$t('approval.applyReject'),
handleClick: this.applyReject,
type: ''
},
{
name: this.$t('approval.scriptPreview'),
handleClick: this.scriptPreview,
type: ''
}
]
}
]
}
}
},
created(){
},
mounted(){
this.loadInitData();
},
beforeDestroy(){
},
watch: {
},
methods: {
reloadTable() {
if (this.queryList && this.queryList.reload) {
this.queryList.reload();
}
},
goDetail() {
this.$router.push({path:``});
},
async loadInitData() {
try {
//
this.mapList = [];
const res = await listPublishMap();
res.data.forEach(elem => {
this.queryForm.queryObject.mapId.config.data.push({ value: elem.id, label: elem.name });
this.mapList.push({ value: elem.id, label: elem.name });
});
} catch (error) {
console.error(error, '获取发布地图');
}
},
queryFunction(params) {
return reviewScriptList(params);
},
applyPassed(index,row){
this.handleConfirmPass(row);
},
applyReject(index,row){
this.$refs.applyReject.doShow(row);
},
scriptPreview(index,row){
debugger;
},
handleConfirmReject(data){
rejectScript(data.id,data).then(resp => {
this.reloadTable();
this.$message.success(this.$t('approval.rejectScriptSuccess'));
}).catch(error => {
this.$messageBox(`${this.$t('approval.rejectScriptFailed')}: ${error.message}`);
})
},
}
}
</script>

View File

@ -0,0 +1,73 @@
<template>
<div>
<el-dialog :title="title" :visible.sync="dialogVisible" width="500px" :before-close="doClose" center>
<data-form ref="dataform" :form="form" :formModel="formModel" :rules="rules"></data-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="doCreate">{{$t('global.confirm')}}</el-button>
<el-button @click="doClose">{{$t('global.cancel')}}</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
name: 'ScriptOperate',
data() {
return {
dialogVisible: false,
formModel:{
id:'',
explanation:'',
},
isShow: false,
}
},
props: {
title: String,
type:String,
},
computed: {
form() {
let form={
labelWidth: '150px',
items: [
{ prop: 'explanation', label: this.$t('approval.explanation'), type: 'textarea', required: true},
]
}
return form
},
rules() {
let crules ={
explanation:[
{ required: true, message: this.$t('approval.inputRejectExplanation'), trigger: 'blur',max:200 },
]
}
return crules
},
},
methods: {
doShow(row) {
this.formModel.id=row.id;
this.dialogVisible = true
},
doCreate() {
let self = this
this.$refs.dataform.validateForm(() => {
self.$emit('create', Object.assign({}, this.formModel));
self.doClose()
})
},
doClose() {
this.$refs.dataform.resetForm();
this.isShow = false;
this.dialogVisible = false
}
}
};
</script>
<style lang="scss" scoped>
/deep/ .el-dialog--center .el-dialog__body{
padding: 15px 65px 10px 10px;
}
</style>

View File

@ -0,0 +1,104 @@
<template>
<div
ref="drapBox"
class="drapHeight"
:style="{width: width + 'px', height: height + 'px', top: heightUp +'px'}"
@mousedown="mousedown"
/>
</template>
<script>
import localStore from 'storejs';
export default {
name: 'DrapUp',
props: {
heightUp: {
type: Number,
required: true
},
isSave: {
type: Boolean,
default: true
},
max: {
type: Number,
default: 0
},
min: {
type: Number,
default: 0
},
width: {
type: Number,
default: 0
},
height: {
type: Number,
default: 36
}
},
data() {
return {
heightUps: 0
};
},
computed: {
heightTotol() {
return this.$store.state.app.height - 50;
},
},
mounted() {
const oDiv = this.$refs.drapBox;
oDiv.onmousedown = () => {
return false;
};
},
methods: {
mousedown(e) {
const oDiv = this.$refs.drapBox;
const maxNum = this.max || this.heightTotol-200;
const minNum = this.min || 150;
oDiv.onmousedown = function() {
return false;
};
e.stopPropagation();
window.event.cancelBubble = true;
const odiv = e.target;
const disY = e.clientY - odiv.offsetTop ;
document.onmousemove = (e) => {
let top = e.clientY - disY;
if (top > maxNum) {
top = maxNum;
} else if (top < minNum) {
top = minNum;
}
odiv.style.top = top + 'px';
this.$emit('drapHeight', top);
this.heightUps = top;
};
document.onmouseup = (e) => {
if (this.isSave) {
if (this.heightUps > minNum) {
localStore('upHeight', JSON.stringify(this.heightUps));
}
}
document.onmousemove = null;
document.onmouseup = null;
};
}
}
};
</script>
<style>
.drapHeight {
float: left;
width: 16px;
background: red;
opacity: 0;
cursor: n-resize;
position: absolute;
top: 0;
z-index: 9999;
}
</style>

View File

@ -21,7 +21,9 @@
<script>
import { setUserConfigInfo } from '@/api/management/user';
import { listPublishMap } from '@/api/jmap/map';
import {getUserMapTree} from '@/api/designPlatform';
import { getPublishMapTree } from '@/api/management/mapprd';
import localStore from 'storejs';
export default {
@ -120,6 +122,7 @@ export default {
},
async loadInitData() {
//
this.filterOptions=[];
const resp = await this.$Dictionary.cityType();
const cityList = resp.sort((a, b) => {
return a.code.localeCompare(b.code);
@ -146,10 +149,12 @@ export default {
this.loadSecondLevelFilterOptions(cityList, mapDict, nodeList);
} else {
//
const mapDict = {};
if (this.filterEmpty && this.queryFunction) {
if (this.queryFunction === getPublishMapTree) {
if (this.queryFunction === getPublishMapTree || this.queryFunction === getUserMapTree) {
// citycodemapList
for (var i = 0; i < cityList.length; i++) {
const response = await this.queryFunction(cityList[i].code);

View File

@ -104,7 +104,6 @@ export default {
data['prdCode'] = this.$route.query.prdCode;
data['lessonId'] = this.$route.query.lessonId;
}
getCommodityDetailByParams(data).then(response => {
this.active = 0;
this.orderData = response.data;
@ -128,13 +127,13 @@ export default {
this.active = 0;
const type = this.$route.query.permissionType;
if (type === PermissionType.LESSON) {
this.$router.replace({ path: `${UrlConfig.teach.detail}/${this.$route.params.lessonId}` });
this.$router.replace({ path: `${UrlConfig.trainingPlatform.teachDetail}`,query: { prodId: this.$route.query.prdCode,type: '教学系统'} });
} else if (type === PermissionType.EXAM) {
this.$router.replace({ path: `${UrlConfig.exam.course}/${this.orderData.lessonId}` });
this.$router.replace({ path: `${UrlConfig.trainingPlatform.course}/${this.$route.query.mapId}`, query: { prodId:this.$route.query.prdCode, type: '考试系统' }});
} else if (type === PermissionType.SCREEN) {
this.$router.replace({ path: `${UrlConfig.dp.detail}/${this.$route.params.lessonId}` });
} else if (type === PermissionType.SIMULATION) {
this.$router.replace({ path: `${UrlConfig.demonstration.detail}/${this.$route.params.lessonId}` });
this.$router.replace({ path: `${UrlConfig.trainingPlatform.prodDetail}/${this.$route.query.mapId}`,query: { prodId: this.$route.query.prdCode,type: '仿真系统'} });
} else {
this.$router.replace({ path: `/` });
}

View File

@ -1,12 +1,9 @@
<template>
<el-card v-loading="loading">
<div slot="header" style="text-align: center;">
<span v-if="hasProduct"><b>{{ $t('demonstration.simulationName') + courseModel.name }}</b></span>
<span v-else>{{ $t('demonstration.noSimulationProducts') }}</span>
<span><b>{{ $t('demonstration.simulationName') + courseModel.name }}</b></span>
</div>
<el-tabs type="border-card" :value="currentPrdCode" :style="{ height: height-50 +'px' }" @tab-click="handleLeave">
<el-tab-pane v-for="item in productList" :key="item.code" :name="item.code" :label="item.name" style="padding: 5px" :style="{ height: height-160 +'px' }">
<div>
<div class="simulation-detail" :style="{ height: height-190 +'px' }">
<p class="list-item">
<span class="list-label">{{ $t('demonstration.productDescription') }}</span>
<span class="list-elem">{{ courseModel.remarks }}</span>
@ -14,10 +11,9 @@
<p class="list-item">
<span class="list-label">{{ $t('global.permissionList') }}</span>
</p>
<limit-list :ref="`limit_${item.code}`" :course-model="courseModel" @initLoadPage="initLoadPage" />
<limit-list :ref="`limit`" :course-model="courseModel" />
</div>
</el-tab-pane>
<div v-if="hasProduct" class="btn-buy">
<div class="btn-buy">
<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>
@ -25,20 +21,18 @@
<el-button v-show="isCreateRoom" :loading="buttonLoading" type="primary" @click="start">{{ $t('demonstration.createRoom') }}</el-button>
<el-button v-show="isInRoom" :loading="buttonLoading" type="primary" @click="joinRoom">{{ $t('demonstration.enterRoom') }}</el-button>
</div>
</el-tabs>
</el-card>
</template>
<script>
import { getPublishMapInfo } from '@/api/jmap/map';
// import { getPublishMapInfo } from '@/api/jmap/map';
import { getGoodsTryUse } from '@/api/management/goods';
import { getCommodityMapProduct, getMapProductDetail } from '@/api/management/mapprd';
import { getMapProductDetail } from '@/api/management/mapprd';
import { PermissionType } from '@/scripts/ConstDic';
import { launchFullscreen } from '@/utils/screen';
import { queryPermissionSimulation } from '@/api/management/author';
import { postCreateRoom, getjointTraining, checkRoomExist } from '@/api/chat';
import { UrlConfig } from '@/router/index';
import { simulationNotify, schedulingNotify } from '@/api/simulation';
import localStore from 'storejs';
import LimitList from '@/views/components/limits/index';
export default {
@ -66,15 +60,11 @@ export default {
prdCode: '',
pmsList: []
},
EffectiveTypeList: [],
jointShow: false,
jointGroup: ''
};
},
computed: {
hasProduct() {
return this.productList.length;
},
hasPermssion() {
let isShow = false;
if (this.courseModel.pmsList && this.courseModel.pmsList.length) {
@ -89,11 +79,14 @@ export default {
return this.courseModel.prdType === '03' && this.hasPermssion && !this.jointShow;
},
isInRoom() {
return this.courseModel.prdType == '03' && this.hasPermssion && this.jointShow;
return this.courseModel.prdType === '03' && this.hasPermssion && this.jointShow;
},
mapId() {
return this.$route.params.mapId;
},
prodId() {
return this.$route.query.prodId;
},
height() {
return this.$store.state.app.height - 50;
}
@ -101,9 +94,6 @@ export default {
watch: {
'$route': function (val) {
this.loadInitData();
},
'currentPrdCode': function (code) {
this.initLoadPage({ id: this.mapId, code: code });
}
},
async mounted() {
@ -111,61 +101,17 @@ export default {
},
methods: {
async loadInitData() {
this.$Dictionary.effectiveType().then(list => {
this.EffectiveTypeList = list;
});
this.currentPrdCode = '';
this.productList = [];
try {
if (parseInt(this.mapId)) {
this.getJointTrainingList();
const rest = await getPublishMapInfo(this.mapId);
if (rest && rest.code == 200) {
const resp = await getCommodityMapProduct(rest.data.skinCode);
if (resp.data && resp.data.length) {
this.productList = resp.data.sort((a, b) => {
return Number(b.prdType) - Number(a.prdType);
});
this.currentPrdCode = localStore.get(this.$route.path) || this.productList[0].code;
}
}
}
this.loading = false;
} catch (e) {
this.$messageBox(this.$t('error.getProductListFailed'));
}
},
async getJointTrainingList() {
try {
if (this.mapId) {
const res = await checkRoomExist({ mapId: this.mapId });
this.jointGroup = res.data;
this.jointShow = false;
if (res.data) {
this.jointShow = true;
}
}
} catch (error) {
console.error(error, '获取是否拥有综合演练房间');
}
},
async handleLeave(tab) {
this.currentPrdCode = tab.name;
localStore.set(this.$route.path, this.currentPrdCode);
},
async initLoadPage(data) {
this.loading = true;
if (data && parseInt(data.id) && data.code) {
this.currentPrdCode = this.prodId;
try {
const resp = await getMapProductDetail(data.code);
this.getJointTrainingList();
const resp = await getMapProductDetail(this.prodId);
this.tryUser = 0;
this.loading = false;
this.courseModel = {
id: resp.data.id,
name: resp.data.name,
mapId: data.id,
mapId: this.mapId,
skinCode: resp.data.skinCode,
remarks: resp.data.remarks,
prdType: resp.data.prdType,
@ -178,8 +124,8 @@ export default {
if (!this.courseModel.pmsList) {
this.tryUser = 1;
const paras = {
mapId: data.id,
prdCode: data.code,
mapId: this.mapId,
prdCode: this.prodId,
permissionType: PermissionType.SIMULATION
};
@ -199,8 +145,19 @@ export default {
this.loading = false;
this.$messageBox(this.$t('error.refreshFailed'));
}
} else {
this.loading = false;
},
async getJointTrainingList() {
try {
if (this.mapId) {
const res = await checkRoomExist({ mapId: this.mapId });
this.jointGroup = res.data;
this.jointShow = false;
if (res.data) {
this.jointShow = true;
}
}
} catch (error) {
console.error(error, '获取是否拥有综合演练房间');
}
},
async joinRoom() {
@ -284,20 +241,20 @@ export default {
buy() {
this.buttonLoading = true;
this.$router.push({
path: `${UrlConfig.demonstration.pay}/${this.courseModel.id}`,
path: `${UrlConfig.trainingPlatform.pay}/${this.courseModel.id}`,
query: { permissionType: PermissionType.SIMULATION, prdCode: this.courseModel.prdCode, mapId: this.courseModel.mapId }
});
},
transfer() {
this.buttonLoading = false;
if (this.$refs) {
this.$refs[`limit_${this.currentPrdCode}`][0].transfer(this.courseModel);
this.$refs[`limit`].transfer(this.courseModel);
}
},
distribute() {
this.buttonLoading = false;
if (this.$refs) {
this.$refs[`limit_${this.currentPrdCode}`][0].distribute(this.courseModel);
this.$refs[`limit`].distribute(this.courseModel);
}
}
}
@ -310,28 +267,12 @@ export default {
}
</style>
<style>
.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;
.simulation-detail {
margin: 50px;
}
.list-item {
font-size: 16px;
font-size: 14px;
margin-bottom: 20px;
padding: 0px;
}

View File

@ -0,0 +1,229 @@
<template>
<div>
<el-card v-loading="loading" class="map-list-main" header="已发布地图列表">
<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' }">
<!-- :style="{ height: heightUp +'px' }" -->
<el-tree
ref="tree"
:data="treeList"
node-key="id"
:props="defaultProps"
highlight-current
:span="22"
:filter-node-method="filterNode"
@node-click="clickEvent"
>
<!-- @node-contextmenu="showContextMenu" -->
<span slot-scope="{ node:tnode, data }">
<span
class="el-icon-tickets"
:style="{color: data.valid ? 'green':''}"
>&nbsp;{{ tnode.label }}</span>
</span>
</el-tree>
</el-scrollbar>
</el-card>
</div>
</template>
<script>
import { DeviceMenu } from '@/scripts/ConstDic';
import { postBuildMapImport } from '@/api/jmap/mapdraft';
import { getPublishMapTree } from '@/api/management/mapprd';
import { getMapList } from '@/api/designPlatform';
import { UrlConfig } from '@/router/index';
import { getSessionStorage, setSessionStorage, removeSessionStorage } from '@/utils/auth';
import FilterCity from '@/views/components/filterCity';
import localStore from 'storejs';
export default {
name: 'publicMapList',
components: {
FilterCity,
},
props: {
height: {
type: Number,
required: true
},
width: {
type: Number,
required: true
}
},
data() {
return {
loading: true,
defaultShowKeys: [],
queryFunction: getPublishMapTree,
filterText: '',
treeData: [],
treeList: [],
selected: {},
defaultProps: {
children: 'children',
label: 'name'
},
node: {
},
// mapId: '',
heightUp: 450,
point: {
x: 0,
y: 0
},
editModel: {},
// skinCode:''
};
},
computed: {
role() {
return this.$store.state.user.roles.includes('04') ||
this.$store.state.user.roles.includes('05') ||
this.$store.state.user.roles.includes('01');
},
},
watch: {
filterText(val) {
this.treeList = this.treeData.filter((res) => {
return res.name.includes(val);
});
}
},
beforeDestroy () {
removeSessionStorage('demonList');
},
mounted() {
this.heightUp = Number(localStore.get('upHeight')?localStore.get('upHeight'):(this.height)/2);
},
methods: {
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, data, ele) {
switch(obj.type){
case 'scriptDesign':{
setSessionStorage('designType', 'scriptDesign');
this.$router.push({ path: `${UrlConfig.design.scriptHome}/${obj.mapId}?skinCode=${obj.skinCode}` });
break;
}
case 'lessonDesign': {
setSessionStorage('designType', 'lessonDesign');
this.$router.push({ path: `${UrlConfig.design.lessonHome}/${obj.mapId}/${obj.skinCode}`,query: {cityCode:data.parent.data.cityCode} });
break;
}
case 'runPlanDesign': {
setSessionStorage('designType', 'runPlanDesign');
this.$router.push({ path: `${UrlConfig.design.runPlan}/${obj.mapId}?skinCode=${obj.skinCode}` });
break;
}
case 'map':{
setSessionStorage('demonList', obj.id);
}
}
// this.$refs.menu.doClose();
},
// async myrefresh(filterSelect){
// },
async refresh(filterSelect) {
this.loading = true;
this.treeData = this.treeList = [];
try {
const res = await getMapList(filterSelect);
res.data.forEach(elem=>{
// debugger;
// elem.children.find(n => { return n.name.includes("")})
elem.children=[
// {
// id:'1',
// name:'',
// type:'mapDesign'
// },
{
id:'2',
name:'课程设计',
type:'lessonDesign',
mapId:elem.id,
skinCode:elem.skinCode
},
{
id:'3',
name:'剧本设计',
type:'scriptDesign',
mapId:elem.id,
skinCode:elem.skinCode,
// code:elem.children.find(n => { return n.name.includes("")})
},
{
id:'4',
name:'运行图设计',
type:'runPlanDesign',
mapId:elem.id,
skinCode:elem.skinCode
},
]
});
this.treeData = res.data;
this.treeList = this.filterText
? res.data.filter(elem => { return elem.name.includes(this.filterText); })
: res.data;
this.$nextTick(() => {
const mapId = getSessionStorage('demonList') || null;
this.$refs.tree.setCurrentKey(mapId);
this.loading = false;
});
} catch (error) {
this.loading = false;
this.$messageBox(this.$t('error.refreshFailed'));
}
},
// refresh1(){
// },
drapHeight(height) {
this.heightUp = Number(height);
},
resize() {
this.widthLeft = Number(localStore.get('LeftWidth')) || this.widthLeft;
const width = this.$store.state.app.width - 521 - this.widthLeft;
const height = this.$store.state.app.height - 90;
this.$store.dispatch('config/resize', { width: width, height: height });
},
// createMap() {
// this.$emit("createMap");
// },
}
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.back-home {
float: right;
cursor: pointer;
&:hover {
color: #3ea726;
}
}
.map-list-main{
text-align:left;
}
</style>
<style>
.el-tree {
overflow-x: hidden;
}
.el-tree-node.is-current>.el-tree-node__content {
background-color: #e4e3e3 !important;
}
</style>

View File

@ -0,0 +1,97 @@
<template>
<el-card :style="{height: height+'px'}">
<div class="home-box" :style="{height: height+'px'}">
<el-scrollbar wrap-class="scrollbar-wrapper">
<h1 class="title">
城市轨道交通设计平台
<img :src="logo" alt="" class="logo-img">
</h1>
<div class="card-box">
<el-carousel :interval="4000" type="card" height="380px">
<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('demonstration.simulationSystemDescription') }}</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 - 50;
}
}
};
</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

@ -0,0 +1,121 @@
<template>
<div class="app-wrapper">
<el-scrollbar wrap-class="scrollbar-wrapper">
<div v-show="listShow" class="examList" :style="{width: widthLeft+'px'}">
<demon-list ref="demonList" :height="height" :width="widthLeft"/>
</div>
<drap-left :width-left="widthLeft" @drapWidth="drapWidth" />
<transition>
<router-view :product-list="productList" :style="{width:currentWidth+'px',display:'inline-block'}"/>
</transition>
</el-scrollbar>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import demonList from './demonList';
import drapLeft from '@/views/components/drapLeft/index';
import { launchFullscreen } from '@/utils/screen';
import localStore from 'storejs';
import { getSessionStorage, setSessionStorage } from '@/utils/auth';
import MapCreate from '@/views/map/mapdraft/mapmanage/create';
export default {
name: 'DesignPlatform',
components: {
demonList,
drapLeft,
MapCreate
},
data() {
return {
listShow: true,
widthLeft: Number(localStore.get('LeftWidth')) || 450,
productList: [],
skinCode: '',
currentWidth:'',
};
},
computed: {
...mapGetters([
'lessonbar'
]),
height() {
return this.$store.state.app.height - 50;
},
width() {
return this.$store.state.app.width;
}
},
watch: {
'lessonbar.opened': function (val) {
this.listShow = val;
},
widthLeft(val) {
this.setMapResize(val);
},
'$store.state.app.windowSizeCount': function() {
this.resize();
}
},
mounted() {
this.currentWidth=this.$store.state.app.width - this.widthLeft;
const againEnter = getSessionStorage('againEnter') || null;
if (!againEnter){
launchFullscreen();
setSessionStorage('againEnter',true);
}
this.resize();
this.widthLeft = Number(localStore.get('LeftWidth'));
},
methods: {
refresh() {
this.$refs && this.$refs.demonList && this.$refs.demonList.refresh();
},
drapWidth(width) {
this.widthLeft = Number(width);
},
refresh1() {
},
mapSelected(data) {
if (data && this.editModel) {
this.$router.push({ path: `${UrlConfig.map.draft}/${this.editModel.id}/${data.view}`, query: { name: this.editModel.name } });
}
},
resize() {
this.widthLeft = Number(localStore.get('LeftWidth')) || this.widthLeft;
const width = this.$store.state.app.width - 521 - this.widthLeft;
const height = this.$store.state.app.height - 90;
this.$store.dispatch('config/resize', { width: width, height: height });
},
setMapResize(LeftWidth) {
this.currentWidth=this.$store.state.app.width - this.widthLeft;
const widths = this.$store.state.app.width - 521 - LeftWidth;
const heights = this.$store.state.app.height - 90;
this.$store.dispatch('config/resize', { width: widths, height: heights });
}
}
};
</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 {
// position: fixed;
// top: 61px;
float: left;
height: 100%;
}
</style>

View File

@ -0,0 +1,299 @@
<template>
<el-card v-loading="loading" class="map-list-main" header="我的地图列表">
<filter-city ref="myfilerCity" 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-185) +'px' }">
<el-tree
ref="tree"
:data="treeList"
node-key="id"
:props="defaultProps"
highlight-current
:span="22"
:filter-node-method="filterNode"
@node-click="clickEvent"
@node-contextmenu="showContextMenu"
>
<span slot-scope="{ node:tnode, data }">
<span
class="el-icon-tickets"
:style="{color: data.valid ? 'green':''}"
>&nbsp;{{ tnode.label }}</span>
</span>
</el-tree>
</el-scrollbar>
<div class="buttonList">
<el-button size="small" type="primary" class="eachButton uploadDemo ">
<input
ref="files"
type="file"
class="file_box"
accept=".json, application/json"
@change="importf"
>
导入地图
<!-- {{ $t('map.importMap') }} -->
</el-button>
<el-button size="small" type="primary" class="eachButton" @click="createMap" >新建地图</el-button>
<!-- {{ $t('map.newConstruction') }} -->
</div>
<map-operate-menu
ref="menu"
:point="point"
:edit-model="editModel"
:skin-code="skinCode"
@refresh="refresh1"
@jlmap3d="jlmap3d"
/>
</el-card>
</template>
<script>
import { DeviceMenu } from '@/scripts/ConstDic';
import { postBuildMapImport } from '@/api/jmap/mapdraft';
import { getUserMapTree } from '@/api/designPlatform';
import { UrlConfig } from '@/router/index';
import { getSessionStorage, setSessionStorage, removeSessionStorage } from '@/utils/auth';
import FilterCity from '@/views/components/filterCity';
import localStore from 'storejs';
import MapOperateMenu from '@/views/map/mapdraft/mapmanage/operateMenu';
export default {
name: 'userMapList',
components: {
FilterCity,
MapOperateMenu
},
props: {
height: {
type: Number,
required: true
},
width: {
type: Number,
required: true
}
},
data() {
return {
loading: true,
defaultShowKeys: [],
queryFunction:getUserMapTree,
filterText: '',
treeData: [],
treeList: [],
selected: {},
defaultProps: {
children: 'children',
label: 'name'
},
node: {
},
// mapId: '',
// mapName:'',
heightUp: 450,
point: {
x: 0,
y: 0
},
editModel: {},
skinCode:''
};
},
computed: {
role() {
return this.$store.state.user.roles.includes('04') ||
this.$store.state.user.roles.includes('05') ||
this.$store.state.user.roles.includes('01');
},
},
watch: {
filterText(val) {
this.treeList = this.treeData.filter((res) => {
return res.name.includes(val);
});
}
},
beforeDestroy () {
removeSessionStorage('demonList');
},
mounted() {
this.heightUp = Number(localStore.get('upHeight')?localStore.get('upHeight'):(this.height)/2);
},
methods:{
filterNode(value, data) {
if (!value) return true;
return data.name.indexOf(value) !== -1;
},
createMap() {
this.$emit("createMap");
},
async refresh(filterSelect) {
this.loading = true;
this.treeData = this.treeList = [];
try {
const res = await getUserMapTree(filterSelect);
res.data.forEach(elem=>{
// if(elem.children)
// {
elem.type="map",
elem.children=[
{
id:'1',
name:'地图设计',
type:'mapDesign',
mapId:elem.id,
mapName:elem.name,
skinCode:elem.skinCode
},
// {
// id:'2',
// name:'',
// type:'lessonDesign'
// },
// {
// id:'3',
// name:'',
// type:'scriptDesign'
// },
{
id:'4',
name:'运行图设计',
type:'runPlanDesign',
mapId:elem.id,
mapName:elem.name,
skinCode:elem.skinCode
},
]
// }
});
this.treeData = res.data;
this.treeList = this.filterText
? res.data.filter(elem => { return elem.name.includes(this.filterText); })
: res.data;
this.$nextTick(() => {
// const mapId = getSessionStorage('demonList') || null;
// this.$refs.tree.setCurrentKey(mapId);
this.loading = false;
});
} catch (error) {
this.loading = false;
this.$messageBox(this.$t('error.refreshFailed'));
}
},
clickEvent(obj, data, ele) {
if (obj.type=="map"){
// this.mapId = data.data.id;
// this.mapName=data.data.name;
// this.skinCode=data.data.skinCode;
}
switch(obj.type){
// case 'scriptDesign':{
// this.$router.push({ path: `${UrlConfig.designUser.scriptHome}/${this.mapId}` });
// break;
// }
case 'mapDesign': {
// this.resize();
this.$router.push({ path: `${UrlConfig.designUser.mapDraw}/${obj.mapId}/draft`, query: { name: obj.mapName } });
break;
}
// case 'lessonDesign': {
// this.$router.push({ path: `${UrlConfig.designUser.lessonHome}/${this.mapId}` });
// break;
// }
case 'runPlanDesign': {
this.$router.push({ path: `${UrlConfig.designUser.runPlan}/${obj.mapId}?skinCode=${obj.skinCode}` })
break;
}
}
this.$refs.menu.doClose();
},
showContextMenu(e, obj, node, vueElem) {
if (obj && obj.type == 'map') {
e.preventDefault();
const menu = DeviceMenu.Map;
this.point = {
x: e.clientX,
y: e.clientY
};
this.editModel = obj;
this.editModel.skinCode = obj.skinCode;
this.$store.dispatch('menuOperation/setPopMenu', { position: this.point, menu: menu });
}
else{
//
}
},
refresh1(){
this.$refs.myfilerCity.loadInitData();
this.refresh();
},
refresh2(){
this.$refs.myfilerCity.loadInitData();
this.refresh();
},
jlmap3d() {
this.$router.push({ path: '/jlmap3d/edit', query: { mapid: this.editModel.id } });
},
importf() {
const loading = this.$loading({
lock: true,
text: '正在导入中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
setTimeout(() => {
const obj = this.$refs.files;
if (!obj.files) return;
const f = obj.files[0];
const reader = new FileReader();
const that = this;
reader.readAsText(f, 'utf-8');
reader.onload = function(e) {
const data = e.target.result;
postBuildMapImport(JSON.parse(data)).then(res => {
loading.close();
that.$message.success('导入成功!');
that.refresh();
loading.close();
}).catch(error => {
loading.close();
that.$message.error('导入失败' + error.message);
});
obj.value = '';
};
});
},
}
};
</script>
<style lang="scss" scoped>
.buttonList{
padding: 8px 0px 8px 0px;
border-top: 1px #ccc solid;
}
.eachButton{
margin-left:10px;
}
.uploadDemo {
position: relative;
overflow: hidden;
// float: right;
padding: 9px 15px;
margin-right: 3px;
cursor: pointer;
input {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
opacity: 0;
cursor: pointer;
}
}
.map-list-main{
text-align:left;
}
</style>

View File

@ -0,0 +1,147 @@
<template>
<div class="app-wrapper">
<map-create ref="mapCreate" :skin-code="skinCode" @refresh="refresh1" @editmap="handleNodeClick" />
<!-- <el-scrollbar wrap-class="scrollbar-wrapper"> -->
<div>
<div v-show="listShow" class="examList" :style="{width: widthLeft+'px'}">
<demon-list ref="demonList" :height="height" :width="widthLeft" @createMap="createMap"/>
</div>
<drap-left :width-left="widthLeft" @drapWidth="drapWidth" />
<transition>
<!-- position:'relative', -->
<!-- :style="{left:widthLeft+'px', width: (width - widthLeft)+'px'}" -->
<router-view :product-list="productList" />
</transition>
</div>
<!-- </el-scrollbar> -->
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import demonList from './userDemonList';
import drapLeft from '@/views/components/drapLeft/index';
import { launchFullscreen } from '@/utils/screen';
import localStore from 'storejs';
import { getSessionStorage, setSessionStorage } from '@/utils/auth';
import MapCreate from '@/views/map/mapdraft/mapmanage/create';
export default {
name: 'DesignPlatform',
components: {
demonList,
drapLeft,
MapCreate
},
data() {
return {
listShow: true,
widthLeft: Number(localStore.get('LeftWidth')) || 450,
productList: [],
skinCode: '',
};
},
computed: {
...mapGetters([
'lessonbar'
]),
height() {
return this.$store.state.app.height - 50;
},
width() {
return this.$store.state.app.width;
}
},
watch: {
'lessonbar.opened': function (val) {
this.listShow = val;
},
widthLeft(val) {
this.setMapResize(val);
},
'$store.state.app.windowSizeCount': function() {
this.resize();
}
},
mounted() {
const againEnter = getSessionStorage('againEnter') || null;
if (!againEnter){
launchFullscreen();
setSessionStorage('againEnter',true);
}
this.resize();
this.widthLeft = Number(localStore.get('LeftWidth'));
},
methods: {
refresh() {
this.$refs && this.$refs.demonList && this.$refs.demonList.refresh();
},
drapWidth(width) {
this.widthLeft = Number(width);
},
createMap() {
this.$refs.mapCreate.show();
},
refresh1() {
this.$refs.demonList.refresh2();
},
getSkinCode(node) {
let next = node;
while (next) {
if (next.data && next.data.type == 'skin') {
this.skinCode = next.data.id;
break;
}
next = next.parent;
}
},
handleNodeClick(obj, node) {
this.getSkinCode(node);
if (obj && obj.type == 'map') {
this.editModel = obj;
this.$store.dispatch('menuOperation/setPopMenu', { position: null, menu: null });
this.mapSelected({ view: 'draft' });
}
},
mapSelected(data) {
if (data && this.editModel) {
this.$router.push({ path: `${UrlConfig.map.draft}/${this.editModel.id}/${data.view}`, query: { name: this.editModel.name } });
}
},
resize() {
this.widthLeft = Number(localStore.get('LeftWidth')) || this.widthLeft;
const width = this.$store.state.app.width - 521 - this.widthLeft;
const height = this.$store.state.app.height - 90;
this.$store.dispatch('config/resize', { width: width, height: height });
},
setMapResize(LeftWidth) {
const widths = this.$store.state.app.width - 521 - LeftWidth;
const heights = this.$store.state.app.height - 90;
this.$store.dispatch('config/resize', { width: widths, height: heights });
}
}
};
</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 {
// position: fixed;
// top: 61px;
float: left;
height: 100%;
}
</style>

View File

@ -51,7 +51,7 @@
</template>
<script>
import { getScriptPageListOnline, getScriptById } from '@/api/script';
import { getScriptPageListOnline, getScriptById,getDraftScriptById } from '@/api/script';
export default {
name: 'AddQuest',
@ -82,6 +82,7 @@ export default {
role: ''
},
memberList: [],
mapLocation:null,
queryForm: {
labelWidth: '80px',
reset: false,
@ -128,6 +129,7 @@ export default {
'Attendant': this.$t('display.script.attendant'),
'Audience': this.$t('display.script.audience'),
'Driver': this.$t('display.script.driver'),
'Repair':this.$t('display.script.repair'),
'no': ''
}
};
@ -152,11 +154,15 @@ export default {
},
async handleLoad(index, row) {
this.row = row;
const res = await getScriptById(row.id);
const res = this.$route.fullPath.includes('design/display/demon')?await getDraftScriptById(row.id):await getScriptById(row.id);
let newMemberList = [];
if (res.code == 200) {
if (res.data.memberVOList && res.data.memberVOList.length > 0) {
newMemberList = res.data.memberVOList.filter(item => item.hasPlay === true);
if (res.data.playerVOList && res.data.playerVOList.length > 0) {
newMemberList = res.data.playerVOList.filter(item => item.hasPlay === true);
}
if(res.data.mapLocation)
{
this.mapLocation=res.data.mapLocation;
}
this.memberList = newMemberList || [];
this.memberList.unshift({ id: '', name: this.$t('display.script.none'), role: 'no' });
@ -171,11 +177,8 @@ export default {
},
async confirm() {
await this.$store.dispatch('training/over');
await this.$store.dispatch('training/setMapDefaultState');
await this.$store.dispatch('map/clearJlmapTrainView');
await this.$store.dispatch('map/setTrainWindowShow', false);
this.$emit('selectQuest', this.row, this.form.role);
let roleName=this.memberList.find(elem=>{return elem.id==this.form.role});
this.$emit('selectQuest', this.row, this.form.role,this.mapLocation,roleName.role);
this.doClose();
this.roleDoClose();
},
@ -186,6 +189,7 @@ export default {
},
checkDisabled(role) {
if(!this.$route.fullPath.includes('design/display/demon')){
if (this.$route.query.prdType == '01') {
return role !== 'Attendant' && role !== 'no';
} else if (this.$route.query.prdType == '02') {
@ -193,6 +197,7 @@ export default {
} else if (this.$route.query.prdType == '04') {
return role !== 'Driver' && role !== 'no';
}
}
},
handleName(item) {

View File

@ -0,0 +1,651 @@
<template>
<div class="main" :style="{width: canvasWidth+'px'}" @mousemove="mousemove">
<div v-show="panelShow" :panelShow="panelShow">
<transition name="el-zoom-in-bottom">
<map-system-draft ref="mapCanvas" @back="back" />
</transition>
<menu-exam v-if="isExam" ref="menuExam" :offset="offset" :group="group" />
<menu-lesson v-if="isLesson" ref="lessonMenu" :offset="offset" :group="group" :training-obj="trainingObj" />
<menu-demon
v-if="isDemon"
ref="menuDemon"
:offset="offset"
:group="group"
:quest-id="questId"
@tryTime="tryTime"
@hidepanel="hidepanel"
@quitQuest="quitQuest"
@showScheduling="showScheduling"
/>
<menu-screen v-if="isScreen" ref="menuScreen" :offset="offset" :group="group" @tryTime="tryTime" />
<menu-plan v-if="isPlan" ref="menuPlan" :offset="offset" :group="group" />
<menu-replay v-if="isReplay" ref="menuReplay" :offset="offset" :group="group" />
<menu-script v-if="isScript" ref="menuScript" :offset="offset" :group="group" />
<menu-schema
v-if="isDemon || isPlan || isScript "
ref="menuSchema"
:offset="offset"
:group="group"
@runPlanLoadShow="runPlanLoadShow"
@runPlanViewShow="runPlanViewShow"
@faultChooseShow="faultChooseShow"
@runQuestLoadShow="runQuestLoadShow"
@runAddRolesLoadShow="runAddRolesLoadShow"
@switchMode="switchMode"
/>
<menu-system-time ref="menuSystemTime" :offset="offset" :right="right" :group="group" />
</div>
<Jl3d-Simulation v-show="simulationShow" ref="Jl3dSimulation" :panel-show="simulationShow" @showpanel="showpanel" />
<Jl3d-Drive v-show="drivingShow" ref="Jl3dDrive" :panel-show="drivingShow" @showdriving="showdriving" />
<fault-choose ref="faultChoose" :group="group" />
<run-plan-Load ref="runPlanLoad" :group="group" />
<run-plan-view ref="runPlanView" :group="group" />
<add-quest ref="addQuest" @selectQuest="selectQuest" />
<scheduling v-if="isShowScheduling" ref="scheduling" :group="group" />
</div>
</template>
<script>
import RunPlanLoad from './demon/runPlanLoad';
import RunPlanView from './demon/runPlanView';
import FaultChoose from './demon/faultChoose';
import MapSystemDraft from '@/views/mapsystem/index';
import MenuExam from '@/views/display/menuExam';
import MenuLesson from '@/views/display/menuLesson';
import MenuReplay from '@/views/display/menuReplay';
import MenuDemon from '@/views/display/menuDemon';
import MenuScreen from '@/views/display/menuScreen';
import MenuSchema from '@/views/display/menuSchema';
import MenuSystemTime from '@/views/display/menuSystemTime';
import MenuPlan from '@/views/display/menuPlan';
import MenuScript from '@/views/display/menuScript';
import AddQuest from './demon/addQuest';
import Scheduling from './demon/scheduling';
import { mapGetters } from 'vuex';
import { getTrainingDetail, getTrainingStepsDetail } from '@/api/jmap/training';
import { setGoodsTryUse } from '@/api/management/goods';
import { getProductDetail } from '@/api/management/mapprd';
import { runDiagramQuit, loadScript, getSimulationInfo } from '@/api/simulation';
import { OperateMode, TrainingMode } from '@/scripts/ConstDic';
import { checkLoginLine } from '@/api/login';
import { loadMapData, loadMapDataById } from '@/utils/loaddata';
import { EventBus } from '@/scripts/event-bus';
import Vue from 'vue';
import { UrlConfig } from '@/router/index';
import {loadDraftScript} from '@/api/designPlatform'
//
import Jl3dSimulation from '@/views/jlmap3d/simulation/jl3dsimulation';
import Jl3dDrive from '@/views/jlmap3d/drive/jl3ddrive';
export default {
name: 'DisplayDraft',
components: {
RunPlanLoad,
RunPlanView,
FaultChoose,
AddQuest,
MenuExam,
MenuLesson,
MenuReplay,
MapSystemDraft,
MenuPlan,
MenuDemon,
MenuScreen,
MenuScript,
MenuSchema,
MenuSystemTime,
Jl3dSimulation,
Jl3dDrive,
Scheduling
},
props: {
size: {
type: Object,
default() {
return null;
}
}
},
data() {
return {
mode: '',
trainingObj: {},
timeDemonNum: 0,
checkLine: null,
offset: 15,
mouseNum: 1,
ierval: null,
mouseNumTime: 0,
mapBox: null,
mapBoxP: null,
panelShow: true,
simulationShow: false,
drivingShow: false,
questId: 0, // Id
group: '',
prdTypeMap: {
'01': '01', // =>
'02': '02', // =>
'04': '02', // =>
'05': '' // => null
}
};
},
computed: {
...mapGetters([
'canvasWidth',
'canvasHeight'
]),
...mapGetters('map', [
'map',
'mapDeviceStatus'
]),
...mapGetters('training', [
'offsetStationCode'
]),
...mapGetters('config', [
'canvasId'
]),
width() {
return this.$store.state.app.width;
},
height() {
return this.$store.state.app.height;
},
right() {
return this.$store.state.config.width / 2 - 55;
},
trainingId() {
return this.$route.query.trainingId;
},
mapId() {
return this.$route.query.mapId;
},
prdType() {
// return this.$route.query.prdType;
return this.$store.state.training.prdType;
},
skinCode() {
return this.$route.query.skinCode;
},
isLesson() {
return this.mode === 'teach' || this.mode === 'record' || this.mode === 'manage';
},
isExam() {
return this.mode === 'exam';
},
isDemon() {
return this.mode === 'demon';
},
isScreen() {
return this.mode === 'dp';
},
isReplay() {
return this.mode === 'replay';
},
isScript() {
return this.mode === 'script';
},
isPlan() {
return this.mode === 'plan';
},
isDrive() {
return this.prdType == '04';
},
isShowScheduling() {
return this.prdType == '05';
}
},
watch: {
'$store.state.config.menuBarLoadedCount': function (val) {
this.setPosition();
},
'$store.state.map.mapViewLoadedCount': function (val) {
this.mapBoxP = document.getElementById(this.canvasId).children[0];
this.mapBox = document.getElementsByTagName('canvas');
if (this.trainingId) {
getTrainingStepsDetail(this.trainingId, { group: this.group }).then(resp => {
this.trainingObj = resp.data;
this.$store.dispatch('training/setTrainingData', this.trainingObj);
});
}
},
'$store.state.training.prdType':function(val){
// this.prdType=val;
debugger;
this.isDrive=(val == '04');
this.isShowScheduling=(val == '05');
},
'$store.state.socket.permissionOver': function () {
this.$alert('用户权限已被收回', '提示', {
confirmButtonText: '确定',
callback: action => {
this.back();
}
});
},
'$store.state.app.windowSizeCount': function() {
this.setWindowSize();
},
$route() {
this.$nextTick(() => {
this.initLoadData();
});
}
},
async created() {
this.mode = this.$route.params.mode;
this.group = this.$route.query.group || '';
},
async mounted() {
EventBus.$on('clearCheckLogin', () => {
this.clearCheckLogin();
});
await this.setWindowSize();
await this.initLoadData();
},
async beforeDestroy() {
await this.clearAllTimer();
if (!this.isReplay) {
await this.quit();
}
await this.$store.dispatch('training/reset');
await this.$store.dispatch('map/mapClear');
EventBus.$off('clearCheckLogin');
},
methods: {
// 线
clearAllTimer() {
if (this.ierval) {
clearTimeout(this.ierval);
this.ierval = null;
}
if (this.checkLine) {
clearTimeout(this.checkLine);
this.checkLine = null;
}
},
// 线
checkLoginLineTimer() {
if (this.checkLine) {
clearTimeout(this.checkLine);
}
this.checkLine = setInterval(() => {
checkLoginLine();
}, 5000 * 60);
},
//
checkMouseStatusTimer() {
if (this.ierval) {
clearTimeout(this.ierval);
}
this.ierval = setInterval(() => {
if (this.mouseNum) {
this.mouseNum = 0;
this.mouseNumTime = 0;
} else {
this.mouseNumTime += 1;
}
if (this.mapBox) {
if (this.mouseNumTime >= 15) {
for (let i = 0; i < this.mapBox.length; i++) {
this.mapBox[i].style.cursor = 'none';
}
} else {
for (let i = 0; i < this.mapBox.length; i++) {
this.mapBox[i].style.cursor = '';
}
}
}
}, 1000);
},
mousemove(e) {
this.mouseNum = 1;
},
setPosition() {
this.$nextTick(() => {
let offset = 15;
const menuBar = document.getElementById('menuBar');
const menuTool = document.getElementById('menuTool');
if (menuBar) {
offset += (menuBar.offsetHeight || 0);
}
if (menuTool) {
offset += (menuTool.offsetHeight || 0);
}
if (this.offset != offset) {
this.offset = offset;
}
});
},
//
endViewLoading(isSuccess) {
if (!isSuccess) {
this.$store.dispatch('map/mapClear');
}
this.$nextTick(() => {
EventBus.$emit('viewLoading', false);
});
},
// 仿
async loadSimulationInfo() {
const resp = await getSimulationInfo(this.group);
if (resp && resp.code == 200) {
this.$store.dispatch('scriptRecord/updateSimulationPause', resp.data.pause);
this.questId = Number(resp.data.questId) || 0;
}
},
//
async initLoadData() {
this.$store.dispatch('training/reset');
try {
if (!this.isReplay) {
await this.loadSimulationInfo();
}
if (this.isReplay) {
await this.initLoadReplayData();
} else if (this.isDemon) {
await this.initLoadDemonData();
} else if (this.isScreen) {
await this.initLoadScreenData();
} else if (this.isPlan) {
await this.initLoadTestRunData();
} else if (this.isScript) {
await this.initLoadTaskData();
} else {
await this.initLoadLessonOrExamData();
}
this.checkLoginLineTimer();
this.checkMouseStatusTimer();
} catch (error) {
this.$messageBox(`初始化失败: ${error.message}`);
this.endViewLoading();
}
},
//
async initLoadLessonOrExamData() {
this.$store.dispatch('training/end', null);
this.$store.dispatch('training/changeOperateMode', { mode: OperateMode.NORMAL }); //
if (parseInt(this.trainingId)) {
//
//
const resp = await getTrainingDetail(this.trainingId);
if (resp && resp.code == 200) {
const detail = resp.data;
const rest = await getProductDetail(detail.prdCode);
if (rest && rest.code == 200) {
const data = rest.data;
await this.$store.dispatch('training/setPrdType', data.prdType);
await this.loadMapData(detail.skinCode);
}
} else {
this.$messageBox(`获取实训步骤数据失败`);
this.endViewLoading();
}
} else {
this.endViewLoading();
}
},
//
async initLoadReplayData() {
this.$store.dispatch('training/end', TrainingMode.NORMAL);
this.$store.dispatch('training/changeOperateMode', { mode: OperateMode.NORMAL }); //
this.$store.dispatch('training/setPrdType', '');
if (parseInt(this.skinCode)) {
await this.loadMapData(this.skinCode);
} else {
this.endViewLoading();
}
},
// 仿
async initLoadDemonData() {
this.$store.dispatch('training/end', TrainingMode.NORMAL);
this.$store.dispatch('training/changeOperateMode', { mode: OperateMode.NORMAL }); //
this.$store.dispatch('training/setPrdType', this.prdTypeMap[this.prdType]);
if (parseInt(this.skinCode)) {
await this.loadMapData(this.skinCode);
} else {
this.endViewLoading();
}
},
//
async initLoadScreenData() {
this.$store.dispatch('training/end', TrainingMode.NORMAL);
this.$store.dispatch('training/changeOperateMode', { mode: OperateMode.NORMAL }); //
this.$store.dispatch('training/setPrdType', '01');
if (parseInt(this.skinCode)) {
await this.loadMapData(this.skinCode);
} else {
this.endViewLoading();
}
},
//
async initLoadTaskData() {
this.$store.dispatch('training/end', TrainingMode.NORMAL);
this.$store.dispatch('training/changeOperateMode', { mode: OperateMode.NORMAL }); //
this.switchMode('01');
if (parseInt(this.mapId)) {
await this.loadMapDataById(this.mapId);
} else {
this.endViewLoading();
}
},
//
async initLoadTestRunData() {
this.$store.dispatch('training/end', TrainingMode.NORMAL);
this.$store.dispatch('training/changeOperateMode', { mode: OperateMode.NORMAL }); //
this.$store.dispatch('training/setPrdType', '01');
if (parseInt(this.skinCode)) {
await this.loadMapData(this.skinCode);
} else {
this.endViewLoading();
}
},
//
async runQuestLoadShow() {
this.$refs.addQuest.doShow();
},
async runAddRolesLoadShow(){
// this.$refs.addQuest.doShow();
let row={id:this.$route.query.scriptId}
this.$refs.addQuest.handleLoad(1, row);
},
//
async selectQuest(row, id,mapLocation,roleName) {
try {
let prdType="";
switch(roleName){
case 'Attendant':{
prdType="01";
break;
}
case 'Dispatcher':{
prdType="02";
break;
}
case 'Driver':{
prdType="04";
break;
}
case 'Repair':{
prdType="";
break;
}
}
this.switchMode(prdType);
const res = await loadDraftScript(row.id, id, this.group);
if (res && res.code == 200) {
this.questId = parseInt(row.id);
if(mapLocation){
const newMapLocation={'offsetX': mapLocation.x, 'offsetY': mapLocation.y, 'scaleRate': mapLocation.scale};
Vue.prototype.$jlmap.setOptions(newMapLocation);
}
// if (res.data && res.data.mapLocation) {
// const mapLocation={'offsetX': res.data.mapLocation.x, 'offsetY': res.data.mapLocation.y, 'scaleRate': res.data.mapLocation.scale};
// Vue.prototype.$jlmap.setOptions(mapLocation);
// }
}
if (this.$refs.menuDemon) {
await this.$refs.menuDemon.initLoadPage();
}
if (this.$refs.menuScript) {
await this.$refs.menuScript.initLoadPage();
}
} catch (error) {
this.$messageBox(error.message);
}
},
// 退
async quitQuest() {
this.questId = 0;
},
//
async loadMapData(skinCode) {
try {
await loadMapData(skinCode);
await this.$store.dispatch('training/setMapDefaultState');
} catch (error) {
this.$messageBox(`获取地图数据失败: ${error.message}`);
this.endViewLoading();
}
},
// id
async loadMapDataById(mapId) {
try {
await loadMapDataById(mapId);
await this.$store.dispatch('training/setMapDefaultState');
} catch (error) {
this.$messageBox(`获取地图数据失败: ${error.message}`);
this.endViewLoading();
}
},
// 仿
async quit() {
await runDiagramQuit(this.group);
await this.$store.dispatch('training/over');
},
// 仿退
async back() {
if (this.isExam) {
await this.$refs.menuExam.back();
} else if (this.isLesson) {
await this.$refs.lessonMenu.back();
} else if (this.isDemon) {
await this.$refs.menuDemon.back();
} else if (this.isScreen) {
await this.$refs.menuScreen.back();
} else if (this.isPlan) {
await this.$refs.menuPlan.back();
} else if (this.isScript) {
await this.$refs.menuScript.back();
}
},
// 使
async tryTime(param) {
const data = {
goodsId: param.goodsId,
time: param.time
};
if (data.goodsId) {
await setGoodsTryUse(data);
}
},
switchMode(prdType) {
this.$store.dispatch('training/setPrdType', prdType);
},
hidepanel() {
if (this.isDrive) {
this.panelShow = false;
this.drivingShow = true;
this.$refs.Jl3dDrive.show(this.skinCode);
} else {
this.panelShow = false;
this.simulationShow = true;
this.$refs.Jl3dSimulation.show(this.skinCode);
}
},
showScheduling() {
this.$refs.scheduling.doShow();
},
showpanel() {
this.panelShow = true;
this.simulationShow = false;
},
showdriving() {
this.panelShow = true;
this.drivingShow = false;
},
runPlanViewShow() {
this.$refs.runPlanView.doShow();
},
runPlanLoadShow() {
this.$refs.runPlanLoad.doShow();
},
faultChooseShow() {
this.$refs.faultChoose.doShow();
},
setWindowSize() {
this.$nextTick(() => {
const width = this.size ? this.size.width : this.width;
const height = this.size ? this.size.height : this.height;
this.$store.dispatch('config/resize', { width, height });
this.$store.dispatch('training/updateOffsetStationCode', { offsetStationCode: this.offsetStationCode });
});
}
}
};
</script>
<style>
.main {
z-index: 10;
display: block;
width: 100%;
height: 100%;
overflow: hidden;
-moz-user-select: none;
-o-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
</style>

View File

@ -38,6 +38,7 @@
@runPlanViewShow="runPlanViewShow"
@faultChooseShow="faultChooseShow"
@runQuestLoadShow="runQuestLoadShow"
@runAddRolesLoadShow="runAddRolesLoadShow"
@switchMode="switchMode"
/>
@ -236,6 +237,7 @@ export default {
$route() {
this.$nextTick(() => {
this.initLoadData();
console.log(1111);
});
}
},
@ -470,25 +472,35 @@ export default {
async runQuestLoadShow() {
this.$refs.addQuest.doShow();
},
async runAddRolesLoadShow(){
// this.$refs.addQuest.doShow();
let row={id:this.$route.query.scriptId}
this.$refs.addQuest.handleLoad(1, row);
},
//
async selectQuest(row, id) {
async selectQuest(row, id,mapLocation,roleName) {
try {
const res = await loadScript(row.id, id, this.group);
if (res && res.code == 200) {
this.questId = parseInt(row.id);
if (res.data && res.data.mapLocation) {
const mapLocation={'offsetX': res.data.mapLocation.x, 'offsetY': res.data.mapLocation.y, 'scaleRate': res.data.mapLocation.scale};
Vue.prototype.$jlmap.setOptions(mapLocation);
if(mapLocation){
const newMapLocation={'offsetX': mapLocation.x, 'offsetY': mapLocation.y, 'scaleRate': mapLocation.scale};
Vue.prototype.$jlmap.setOptions(newMapLocation);
}
// if (res.data && res.data.mapLocation) {
// const mapLocation={'offsetX': res.data.mapLocation.x, 'offsetY': res.data.mapLocation.y, 'scaleRate': res.data.mapLocation.scale};
// Vue.prototype.$jlmap.setOptions(mapLocation);
// }
}
if (this.$refs.menuDemon) {
this.$refs.menuDemon.initLoadPage();
await this.$refs.menuDemon.initLoadPage();
}
if (this.$refs.menuScript) {
this.$refs.menuScript.initLoadPage();
await this.$refs.menuScript.initLoadPage();
}
} catch (error) {
this.$messageBox(error.message);
}

View File

@ -124,7 +124,7 @@ export default {
type: 'warning'
}).then(() => {
this.$emit('quit');
this.$router.push({ path: `/exam/home` });
this.$router.back();
Notification.closeAll();
exitFullscreen();
}).catch(() => {
@ -141,7 +141,7 @@ export default {
}).catch(error => {
// 50009y
if (error.code === 500009) {
this.$router.replace({ path: `/exam/result/${this.$route.params.userExamId}` });
this.$router.replace({ path: `/trainingPlatform/result/${this.$route.params.userExamId}` });
} else {
this.$messageBox(this.$t('display.exam.refreshListError'));
}

View File

@ -5,7 +5,9 @@
</el-select>
<el-button-group>
<el-button v-if="isDemon" size="small" :disabled="viewDisabled" type="success" @click="viewRunQuest">{{$t('display.schema.loadScript')}}</el-button>
<!-- viewRunQuest -->
<el-button v-if="isDemon && isDesignPlatform" size="small" :disabled="viewDisabled" type="success" @click="viewScriptRoles">{{$t('display.schema.selectRoles')}}</el-button>
<el-button v-if="isDemon && !isDesignPlatform" size="small" :disabled="viewDisabled" type="success" @click="viewRunQuest">{{$t('display.schema.loadScript')}}</el-button>
<el-button v-if="notScript && runing" size="small" :disabled="viewDisabled" @click="viewRunPlan">{{$t('display.schema.previewRunDiagram')}}</el-button>
<el-button v-if="!runing && !isPlan && notScript" size="small" :disabled="viewDisabled" type="warning" @click="loadRunPlan">{{$t('display.schema.loadRunDiagram')}}</el-button>
<el-button v-if="mode==OperateMode.FAULT" size="small" type="danger" @click="setFault">{{$t('display.schema.faultSetting')}}</el-button>
@ -22,6 +24,7 @@ import { mapGetters } from 'vuex';
import { OperateMode } from '@/scripts/ConstDic';
import { getStationListBySkinCode, queryRunPlan } from '@/api/runplan';
import { getEveryDayRunPlanData } from '@/api/simulation';
import {getRpDetailByUserMapId} from '@/api/designPlatform';
export default {
name: 'MenuSchema',
@ -64,6 +67,9 @@ export default {
},
isDemon() {
return this.$route.params.mode === 'demon';
},
isDesignPlatform(){
return this.$route.fullPath.includes('design/display/demon');
}
},
watch: {
@ -90,6 +96,17 @@ export default {
getStationListBySkinCode(opt.skinCode).then(response => {
this.$store.dispatch('runPlan/setStations', response.data).then(() => {
if (this.$route.params.mode == 'plan') {
// debugger;
if(this.$route.query.from=="user"){
//
getRpDetailByUserMapId(this.$route.query.planId).then(resp => {
this.$store.dispatch('runPlan/setPlanData', resp.data);
this.viewDisabled = false;
}).catch(() => {
this.$store.dispatch('runPlan/setPlanData', []);
this.$messageBox(this.$t('display.schema.getRunDiagramFail'));
});
}else{
//
queryRunPlan(this.$route.query.planId).then(resp => {
this.$store.dispatch('runPlan/setPlanData', resp.data);
@ -98,6 +115,9 @@ export default {
this.$store.dispatch('runPlan/setPlanData', []);
this.$messageBox(this.$t('display.schema.getRunDiagramFail'));
});
}
} else {
getEveryDayRunPlanData(this.group).then(resp => {
this.$store.dispatch('runPlan/setPlanData', resp.data);
@ -136,6 +156,9 @@ export default {
viewRunQuest() {
this.$emit('runQuestLoadShow');
},
viewScriptRoles(){
this.$emit('runAddRolesLoadShow');
},
switchMode(swch) {
this.$emit('switchMode', swch);
}

View File

@ -260,7 +260,7 @@ export default {
exitFullscreen();
this.$store.dispatch('exam/over').then(() => {
this.$store.dispatch('trainingList/clearTrainingList');
this.$router.replace({ path: `/exam/result/${this.$route.query.userExamId}` });
this.$router.replace({ path: `/trainingPlatform/result/${this.$route.query.userExamId}` });
});
},
shrink() {

View File

@ -15,20 +15,24 @@
<div class="bullshit__headline">{{ message }}</div>
<div class="bullshit__info">Please check that the URL you entered is correct, or click the button below to
return to the homepage.</div>
<a href="" class="bullshit__return-home">Back to home</a>
<button @click="back" class="bullshit__return-home">Back</button>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'Page404',
computed: {
message() {
return 'The webmaster said that you can not enter this page...'
}
},
methods: {
back() {
this.$router.go(-1);
}
}
}
</script>

View File

@ -4,20 +4,29 @@
<b>{{ $t('exam.courseName') + ': '+ courseModel.name }}</b>
</div>
<div style=" margin:50px" :style="{ height: height - 150 +'px' }">
<!-- <p style="font-size: 14px; margin-bottom: 20px"> 课程说明:
<span style="color: #808080 !important;">
{{ courseModel.remarks }}
</span>
</p> -->
<el-tabs v-model="activeName">
<el-tab-pane :label="this.$t('exam.itemList')" name="first">
<div v-if="courseModel.detail.length != 0" :style="{ height: height - 230 +'px' }">
<el-scrollbar wrap-class="scrollbar-wrapper">
<template v-for="item in courseModel.detail">
<ul :key="item.code" type="circle">
<li>{{ item.name }}</li>
</ul>
</template>
<el-tree
ref="tree"
:data="courseModel.treeList"
node-key="id"
:props="defaultProps"
:filter-node-method="filterNode"
highlight-current
:span="22"
:default-expanded-keys="expandList"
@node-click="clickEvent"
@node-expand="nodeExpand"
@node-collapse="nodeCollapse"
>
<span slot-scope="{ node, data }">
<span v-if="node.data.valid" class="el-icon-goods" />
<span v-else class="el-icon-sold-out" />
<span :style="{color: node.data.valid?'green':'black'}">&nbsp;{{ node.label }}</span>
</span>
</el-tree>
</el-scrollbar>
</div>
<div v-else class="noList">
@ -42,10 +51,12 @@
</el-card>
</template>
<script>
import { getCourseLessonDetail } from '@/api/management/exam';
// import { getCourseLessonDetail } from '@/api/management/exam';
import { querySystemByTypeAndPrdCode } from '@/api/trainingPlatform';
import { PermissionType } from '@/scripts/ConstDic';
import { UrlConfig } from '@/router/index';
import LimitList from '@/views/components/limits/index';
import { getSessionStorage, setSessionStorage } from '@/utils/auth';
export default {
name: 'ExamDetailView',
@ -64,7 +75,12 @@ export default {
pmsList: []
},
EffectiveTypeList: [],
activeName: 'first'
activeName: 'first',
defaultProps: {
children: 'children',
label: 'name'
},
expandList: []
};
},
computed: {
@ -85,46 +101,52 @@ export default {
}
},
watch: {
'$route.params.lessonId': function (val) {
this.loadInitPage(val);
'$route.query.prodId': function (val) {
this.loadInitPage(val, this.$route.query.type);
}
},
mounted() {
this.$Dictionary.effectiveType().then(list => {
this.EffectiveTypeList = list;
});
this.loadInitPage(this.$route.params.lessonId);
this.loadInitPage(this.$route.query.prodId, this.$route.query.type);
},
methods: {
loadInitPage(lessonId = this.$route.params.lessonId) {
if (lessonId) {
getCourseLessonDetail({ lessonId: lessonId }).then(res => {
loadInitPage(prodId = this.$route.query.prodId, type = this.$route.query.type) {
if (prodId && type) {
querySystemByTypeAndPrdCode( {type: type}, prodId ).then(res => {
if (res.data.examsLessonVO){
this.courseModel = {
id: res.data.id,
name: res.data.name,
skinCode: res.data.skinCode,
price: res.data.price,
remarks: res.data.remarks,
detail: res.data.examDefinitionVOList || [],
pmsList: res.data.permissionVOList || [],
prdCode: res.data.prdCode,
mapId: res.data.mapId,
PermissionType: PermissionType.EXAM
id: res.data.examsLessonVO.id,
name: res.data.examsLessonVO.name,
skinCode: res.data.examsLessonVO.skinCode,
price: res.data.examsLessonVO.price,
remarks: res.data.examsLessonVO.remarks,
detail: res.data.examsLessonVO.examDefinitionVOList || [],
pmsList: res.data.examsLessonVO.permissionVOList || [],
prdCode: res.data.examsLessonVO.prdCode,
mapId: res.data.examsLessonVO.mapId,
PermissionType: PermissionType.EXAM,
treeList: res.data.treeNodeList
};
});
}
this.getExpandList(this.courseModel.id);
});
}
},
buy() {
this.loading = true;
this.$router.push({
path: `${UrlConfig.exam.pay}/${this.$route.params.lessonId}`,
query: { permissionType: PermissionType.EXAM, lessonId: this.$route.params.lessonId, prdCode: this.courseModel.prdCode, mapId: this.courseModel.mapId }
path: `${UrlConfig.trainingPlatform.pay}/${this.courseModel.id}`,
query: { permissionType: PermissionType.EXAM, lessonId: this.courseModel.id, prdCode: this.courseModel.prdCode, mapId: this.courseModel.mapId }
});
},
checkCourse() {
this.loading = true;
this.$router.push({
path: `${UrlConfig.exam.examRuleManage}`,
path: `${UrlConfig.trainingPlatform.examRuleManage}`,
query: { lessonId: this.courseModel.id }
});
},
@ -141,6 +163,44 @@ export default {
this.activeName = 'second';
this.$refs.limitList.distribute(this.courseModel);
}
},
clickEvent(obj, node, data) {
// setSessionStorage('trainingExamCheckId', obj.id);
if (obj.type === 'exam') {
if (obj.valid) {
this.$router.push(`${UrlConfig.trainingPlatform.examDetail}/${obj.id}`);
} else {
this.$confirm(this.$t('tip.accessCourseNo'), this.$t('tip.hint'), {
confirmButtonText: this.$t('tip.confirm'),
cancelButtonText: this.$t('tip.cancel')
}).then(() => {
this.buy();
}).catch(() => { });
}
}
},
filterNode(value, data) {
if (!value) return true;
return data.name.indexOf(value) !== -1;
},
nodeExpand(obj, node, ele) {
const key = obj.id;
this.expandList = this.expandList.filter(item => item!==key);
this.expandList.push(key);
setSessionStorage('trainingExamExpandList'+this.courseModel.id, this.expandList);
},
nodeCollapse(obj, node, ele) {
const key = obj.id;
this.expandList = this.expandList.filter(item => item!==key);
setSessionStorage('trainingExamExpandList'+this.courseModel.id, this.expandList);
},
getExpandList(id) {
let expand = getSessionStorage('trainingExamExpandList'+id);
expand = expand?(expand+'').split(','):'';
if (expand instanceof Array) {
this.expandList = expand;
}
}
}
};

View File

@ -17,15 +17,15 @@
</p>
<p class="list-item">
<span class="list-label">{{ $t('exam.examTimeAvailable') + ':' }}</span>
<span class="list-elem">{{ parseInt(examDetails.duration) / 60 + $t('global.minutes') }}</span>
<span class="list-elem">{{ parseInt(examDetails.duration) / 60 + $t('exam.minutes') }}</span>
</p>
<p class="list-item">
<span class="list-label">{{ $t('exam.fullMarksInTheExam') + ':' }}</span>
<span class="list-elem">{{ examDetails.fullPoint + $t('exam.points') }}</span>
<span class="list-elem">{{ examDetails.fullPoint }}</span>
</p>
<p class="list-item">
<span class="list-label">{{ $t('exam.passMarkTheExam') + ':' }}</span>
<span class="list-elem">{{ examDetails.passingPoint + $t('exam.points') }}</span>
<span class="list-elem">{{ examDetails.passingPoint }}</span>
</p>
<p class="list-item">
<span class="list-label">{{ $t('exam.examinationRules') + ':' }}</span>
@ -44,6 +44,7 @@
</div>
<div class="btn-start">
<el-button :loading="loading" type="primary" @click="exmaStart">{{ $t('exam.startTheExam') }}</el-button>
<el-button @click="back" >{{ $t('global.back') }}</el-button>
</div>
</el-card>
</template>
@ -153,8 +154,8 @@ export default {
this.loading = true;
getPublishLessonDetail({ id: this.examDetails.lessonId }).then((res) => {
this.$router.push({
path: `${UrlConfig.exam.pay}/${this.examDetails.lessonId}`,
query: { permissionType: PermissionType.EXAM, prdCode: res.data.prdCode, mapId: res.data.mapId }
path: `${UrlConfig.trainingPlatform.pay}/${this.examDetails.lessonId}`,
query: { permissionType: PermissionType.EXAM,lessonId: this.examDetails.lessonId,prdCode: res.data.prdCode, mapId: res.data.mapId }
});
}).catch(() => {
this.$messageBox(this.$t('error.obtainCourseDetailsFailed'));
@ -210,6 +211,9 @@ export default {
} else {
this.loading = false;
}
},
back() {
this.$router.back();
}
}
};

View File

@ -105,7 +105,7 @@ export default {
}).then(() => {
//
setExamGive(this.$route.query.userExamId).then(() => {
this.$router.push({ path: '/exam/home' });
this.$router.back();
});
}).catch(() => {
this.loading = false;

View File

@ -1,70 +0,0 @@
<template>
<div class="app-wrapper">
<el-scrollbar wrap-class="scrollbar-wrapper">
<div v-show="listShow" class="examList" :style="{width: widthLeft+'px'}">
<exam-list ref="examlList" :height="height" />
</div>
<drap-left :width-left="widthLeft" @drapWidth="drapWidth" />
<transition>
<router-view />
</transition>
</el-scrollbar>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import ExamList from './list/examList';
import drapLeft from '@/views/components/drapLeft/index';
import localStore from 'storejs';
export default {
name: 'Exam',
components: {
ExamList,
drapLeft
},
data() {
return {
listShow: true,
widthLeft: Number(localStore.get('LeftWidth')) || 450
};
},
computed: {
...mapGetters([
'lessonbar'
]),
height() {
return this.$store.state.app.height;
}
},
watch: {
'lessonbar.opened': function (val) {
this.listShow = val;
}
},
methods: {
refresh() {
this.$refs && this.$refs.examlList && this.$refs.examlList.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

@ -118,7 +118,7 @@ export default {
},
back() {
const examId = this.resultModel.examId;
this.$router.push(`${UrlConfig.exam.detail}/${examId}`);
this.$router.push(`${UrlConfig.trainingPlatform.examDetail}/${examId}`);
}
}
};

View File

@ -121,7 +121,7 @@ export default {
await this.$store.dispatch('training/over');
await runDiagramOver(this.group);
await deljointTrainRoom(this.group);
await this.$router.push({ path: `/demonstration/detail/${this.mapId}` });
await this.$router.push({ path: `/trainingPlatform/prodDetail/${this.mapId}` });
}
});
},

261
src/views/lesson/home.vue Normal file
View File

@ -0,0 +1,261 @@
<template>
<div style="height: 100%; overflow: hidden">
<el-card>
<div class="button_group">
<el-button size="mini" v-if="hasRelease" @click="trainingManage">{{$t('lesson.trainingManage')}}</el-button>
<el-button size="mini" v-if="hasRelease" @click="taskManage">{{$t('lesson.taskManage')}}</el-button>
<el-button size="mini" v-if="hasRelease" @click="operationManage">{{$t('lesson.trainingRule')}}</el-button>
<el-button size="mini" type="primary" @click="lessonCreateByPublish">{{$t('lesson.createNewCoursesFromRelease')}}</el-button>
<el-button size="mini" type="primary" @click="lessonCreate">{{$t('lesson.newConstruction')}}</el-button>
</div>
</el-card>
<el-card v-loading="loading">
<el-table
:data="tableData"
row-key="id"
border
default-expand-all
:tree-props="{children: 'children', hasChildren: 'hasChildren'}">
<el-table-column
prop="name"
border
:label="this.$t('lesson.lesson')">
</el-table-column>
<el-table-column
:label="this.$t('global.status')"
>
<template slot-scope="scope">
<span>{{handlerStatus(scope.row)}}</span>
</template>
</el-table-column>
<el-table-column
prop="explanation"
show-overflow-tooltip
:label="this.$t('lesson.rejectReason')">
</el-table-column>
<el-table-column
width="500"
:label="this.$t('global.operate')">
<template slot-scope="scope">
<el-button
size="mini"
type="primary"
v-if="scope.row.status!=='1'"
@click="createChapter(scope.row)"
>{{ scope.row.type==='lesson'? $t('lesson.createChapter'):$t('lesson.updateChapter')}}</el-button>
<el-button
size="mini"
type="primary"
v-if="scope.row.status==='1'"
@click="goDetail(scope.row)"
>
{{$t('lesson.review')}}
</el-button>
<el-button
size="mini"
type="primary" plain
v-if="scope.row.type === 'lesson' && scope.row.status!=='1'"
@click="treeSort(scope.row)"
>{{$t('lesson.contentSorting')}}</el-button>
<el-button size="mini"
type="info"
v-if="scope.row.type === 'lesson'&& scope.row.status!=='1'"
@click="editLesson(scope.row)"
>{{$t('lesson.editCourse')}}</el-button>
<el-button size="mini"
type="primary"
v-if="scope.row.type === 'lesson'&& scope.row.status==='0'"
@click="publish(scope.row)"
>{{hasRelease?$t('global.release'):$t('lesson.applicationForRelease')}}</el-button>
<el-button size="mini"
type="danger"
v-if="scope.row.type === 'lesson'&& scope.row.status!=='1'"
@click="deleteLesson(scope.row)"
>{{$t('global.delete')}}</el-button>
<el-button size="mini"
type="danger"
v-if="scope.row.status ==='1'"
@click="revertLesson(scope.row)"
>
{{$t('lesson.withdraw')}}
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<publish-create @refresh="refresh" ref="publishCreate" />
<publish-lesson ref="publishLesson" @refresh="refresh" />
<lesson-detail ref="lessonDetail"/>
</div>
</template>
<script>
import { getDraftLesson,releaseOrCancel } from '@/api/designPlatform';
import { UrlConfig } from '@/router/index';
import PublishCreate from './lessoncategory/edit/create';
import PublishLesson from './lessoncategory/edit/lesson/publish';
import { delLesson } from '@/api/jmap/lessondraft';
import LessonDetail from '@/views/approval/lesson/detail';
export default {
name: 'LessonHome',
components: {
PublishCreate,
PublishLesson,
LessonDetail
},
computed: {
mapId() {
return this.$route.params.mapId;
},
hasRelease() {
return this.$store.state.user.roles.includes('04') ||
this.$store.state.user.roles.includes('05');
}
},
data() {
return {
tableData: [],
loading: false,
showEdit: false
};
},
watch: {
$route() {
this.refresh();
}
},
mounted() {
this.loading = true;
this.loadInitData();
},
methods: {
loadInitData() {
getDraftLesson({},this.mapId).then(response=> {
response.data.forEach(elem => {
if (elem.children) {
elem.children.forEach( it => {
it.parentId = elem.id;
} )
}
});
this.tableData = response.data;
this.loading = false;
}).catch(error=>{
this.$messageBox(this.$t('error.getDraftCourseDataFailed'))
});
},
refuse() {
this.loading = true;
getDraftLesson({},this.mapId).then(response=> {
response.data.forEach(elem => {
if (elem.children) {
elem.children.forEach( it => {
it.parentId = elem.id;
} )
}
});
this.tableData = response.data;
this.loading = false;
});
},
handlerStatus(row) {
let lessonStatus = '';
switch (row.status){
case '0':
lessonStatus = this.$t('lesson.notRelease');
break;
case '1':
lessonStatus = this.$t('lesson.pendingReview');
break;
case '2':
lessonStatus = this.$t('lesson.published');
break;
case '3':
lessonStatus = this.$t('lesson.rejected');
break;
}
return lessonStatus;
},
refresh() {
this.loading = true;
this.loadInitData();
},
editLesson(row) {
this.$router.push( {path: `${UrlConfig.design.lessonEdit}/lessonEdit`, query: {id: row.id, skinCode: row.code}} )
},
lessonCreate() {
this.$router.push({ path: `${UrlConfig.design.lessonEdit}/lessonCreate`,query: {skinCode: this.$route.params.skinCode} })
},
lessonCreateByPublish() {
this.$nextTick(() => {
this.$refs.publishCreate.doShow();
});
},
publish(row) {
row.skinCode = this.$route.params.skinCode;
row.cityCode = this.$route.query.cityCode;
this.$refs.publishLesson.doShow(row);
},
deleteLesson(row) {
delLesson(row).then(response => {
this.$message.success(this.$t('tip.successfullyDelete'));
this.loading = true;
this.loadInitData();
}).catch(error => {
this.$messageBox(this.$t('tip.failDelete'))
});
},
createChapter(row) {
if (row.type === 'lesson') {
this.$router.push({path: `${UrlConfig.design.lessonEdit}/chapterCreate`, query: {lessonId: row.id}});
} else if (row.type === 'chapter') {
this.$router.push( {path: `${UrlConfig.design.lessonEdit}/chapterEdit`,query: {id: row.id, lessonId: row.parentId}} )
}
},
treeSort(row){
this.$router.push({path: `${UrlConfig.design.lessonEdit}/treeSort`, query: row});
},
taskManage() {
this.$router.push({path: `${UrlConfig.design.taskManage}`, query: {mapId: this.$route.params.mapId, skinCode: this.$route.params.skinCode}})
},
trainingManage() {
this.$router.push({path: `${UrlConfig.design.trainingManage}/${this.$route.params.skinCode}`, query: {mapId: this.$route.params.mapId}})
},
operationManage() {
this.$router.push({path: `${UrlConfig.design.trainingRule}`, query: {mapId: this.$route.params.mapId, skinCode: this.$route.params.skinCode}})
},
revertLesson(row) {
this.$confirm(this.$t('tip.cancelCoursePublicationHint'), this.$t('global.tips'), {
confirmButtonText: this.$t('global.confirm'),
cancelButtonText: this.$t('global.cancel'),
type: 'warning'
}).then(() => {
releaseOrCancel(row.id,"0").then(response => {
this.loading = false;
this.$message.success(this.$t('tip.cancelTheSuccessfulApplicationOfTheCourseRelease'));
this.refuse();
}).catch(error => {
this.loading = false;
this.$messageBox(this.$t('tip.cancellationOfCoursePublicationApplicationFailed'));
this.refuse();
});
});
},
goDetail(row) {
this.$refs.lessonDetail.show(row.id);
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.draft {
width: 400px;
text-align: center;
margin: 20px auto;
}
.button_group {
float: right;
margin: 20px 10px;
}
</style>

View File

@ -10,9 +10,9 @@
<el-form-item :label="this.$t('lesson.courseName')" prop="lessonName">
<el-input v-model="chapterModel.lessonName" :disabled="true"></el-input>
</el-form-item>
<el-form-item :label="this.$t('lesson.parentChapter')" prop="parentName">
<!--<el-form-item :label="this.$t('lesson.parentChapter')" prop="parentName">
<el-input v-model="chapterModel.parentName" :disabled="true"></el-input>
</el-form-item>
</el-form-item>-->
<el-form-item :label="this.$t('lesson.chapterName')" prop="name">
<el-input v-model="chapterModel.name"></el-input>
</el-form-item>
@ -49,6 +49,7 @@
<el-button-group>
<el-button type="primary" @click="create" v-show="!isEdit">{{$t('global.append')}}</el-button>
<el-button type="primary" @click="update" v-show="isEdit">{{$t('global.update')}}</el-button>
<el-button type="primary" @click="back" >{{$t('global.back')}}</el-button>
</el-button-group>
</div>
<train-list ref="pathRoute" :trainings="this.chapterModel.trainings" :detail="detail"
@ -83,8 +84,6 @@
lessonName: '',
name: '',
remarks: '',
parentId: null,
parentName: '',
trainings: []
},
detail: {
@ -105,30 +104,18 @@
remarks: [
{ required: true, message: this.$t('rules.enterChapterInstructions'), trigger: 'change' }
],
}
};
return baseRules;
}
},
methods: {
initData(isNew, node) {
initData(isNew, data) {
this.isEdit = !isNew;
this.clearForm();
if (isNew) {
let parent = null;
if (node.data.type === 'chapter') {
parent = node.data;
}
let lesson = this.getLesson(node);
this.setLessonAndParent(parent, lesson);
this.loadTrainingList(lesson);
this.loadTrainingList(data);
} else {
let parent = null;
if (node.parent.data.type === 'chapter') {
parent = node.parent.data;
}
let lesson = this.getLesson(node);
this.setLessonAndParent(parent, lesson);
this.loadTrainingList(lesson, node);
this.loadTrainingList(data);
}
},
getChapter(data) {
@ -157,26 +144,9 @@
},
setChapterModel(data) {
let lessonName = this.chapterModel.lessonName;
let parentName = this.chapterModel.parentName;
this.chapterModel = data;
this.chapterModel.trainings = data.trainings || [];
this.chapterModel.lessonName = lessonName;
this.chapterModel.parentName = parentName;
},
setLessonAndParent(parent, lesson) {
this.chapterModel.lessonId = lesson.id;
this.chapterModel.lessonName = lesson.name;
if (parent) {
this.chapterModel.parentId = parent.id;
this.chapterModel.parentName = parent.name;
}
},
getLesson(node) {
if (node.data.type === 'lesson') {
return node.data;
} else {
return this.getLesson(node.parent);
}
},
clearForm() {
this.chapterModel.trainingId = '';
@ -185,12 +155,14 @@
},
// /
loadTrainingList(model, node) {
getLessonDetail(model).then(resp => {
loadTrainingList(data) {
getLessonDetail({ id: data.lessonId }).then(resp => {
this.detail.mapId = resp.data.mapId;
this.detail.prdCode = resp.data.prdCode;
this.chapterModel.lessonId = resp.data.id;
this.chapterModel.lessonName = resp.data.name;
if (this.isEdit) {
this.getChapter(node.data);
this.getChapter(data);
}
}).catch(error => {
this.$messageBox(this.$t('error.obtainCourseDetailsFailed'));
@ -219,6 +191,9 @@
});
}
});
},
back() {
this.$router.go(-1);
}
}
}

View File

@ -45,15 +45,14 @@
<el-button-group>
<template v-if="!isEdit">
<el-button v-if="courseModel.skinCode" type="primary" @click="create">{{$t('global.create')}}</el-button>
<el-button type="primary" @click="back">{{$t('global.back')}}</el-button>
</template>
<template v-else>
<el-button type="primary" @click="update">{{$t('global.update')}}</el-button>
<el-button type="primary" @click="publish">{{$t('global.release')}}</el-button>
<el-button type="danger" @click="deleteLesson">{{$t('global.delete')}}</el-button>
<el-button type="primary" @click="back">{{$t('global.back')}}</el-button>
</template>
</el-button-group>
</div>
<publish-lesson ref="publishLesson" />
</div>
</template>
@ -61,12 +60,10 @@
import { createLesson, updateLesson, getLessonDetail, delLesson } from '@/api/jmap/lessondraft';
import { getCommodityMapProduct } from '@/api/management/mapprd';
import { getSkinCodeList } from '@/api/management/mapskin';
import PublishLesson from './publish';
export default {
name: 'CourseEdit',
components: {
PublishLesson
},
props: {
height: {
@ -119,17 +116,15 @@ export default {
});
},
methods: {
initData(isNew, node) {
initData(isNew, data) {
this.isEdit = !isNew;
this.clearForm();
if (!isNew) {
this.refresh(node);
this.refresh(data);
} else {
this.courseModel.skinCode = node.data.id;
this.courseModel.skinCode = this.$route.query.skinCode;
}
this.productList = [];
getCommodityMapProduct(this.getParentSkin(node)).then(response => {
getCommodityMapProduct(this.$route.query.skinCode).then(response => {
this.productList = response.data || [];
this.productList = this.productList.filter(elem => { return elem.prdType != '03'; });
});
@ -176,37 +171,13 @@ export default {
}
});
},
publish() {
this.$refs.publishLesson.doShow(this.courseModel);
},
deleteLesson() {
delLesson(this.courseModel).then(response => {
this.$message.success(this.$t('tip.successfullyDelete'));
this.$refs.form.resetFields();
this.isEdit = false,
this.$emit('refresh');
}).catch(error => {
this.$messageBox(this.$t('tip.failDelete'));
});
},
getParentSkin(node) {
let next = node;
let skinCode = '';
while (next) {
if (next.data && next.data.type == 'skin') {
skinCode = next.data.id;
}
next = next.parent;
}
return skinCode;
},
refresh(node) {
if (node && node.data) {
getLessonDetail(node.data).then(response => {
refresh(query) {
if (query) {
getLessonDetail(query).then(response => {
const data = response.data;
this.courseModel = {
id: data.id,
skinCode: this.getParentSkin(node),
skinCode: this.$route.query.skinCode,
prdCode: data.prdCode,
name: data.name,
remarks: data.remarks
@ -215,6 +186,9 @@ export default {
this.$messageBox(this.$t('error.obtainCourseInformationFailed'));
});
}
},
back() {
this.$router.back();
}
}
};

View File

@ -1,32 +1,28 @@
<template>
<el-dialog v-dialogDrag :title="this.$t('lesson.courseRelease')" :visible.sync="dialogShow" width="30%" :before-do-close="doClose">
<el-dialog :title="this.$t('lesson.courseRelease')" :visible.sync="dialogShow" width="30%" :before-do-close="doClose" v-dialogDrag>
<div>
<el-form
ref="form"
label-position="right"
:rules="rules"
:model="editModel"
label-width="140px"
@submit.native.prevent
>
<el-form label-position="right" ref="form" :rules="rules" :model="editModel" label-width="140px"
@submit.native.prevent>
<el-form-item :label="this.$t('lesson.releaseAssociatedCity')" prop="cityCode">
<el-select v-model="editModel.cityCode" :placeholder="this.$t('rules.pleaseSelect')" @change="cityChange">
<el-option v-for="item in cityList" :key="item.code" :label="item.name" :value="item.code" />
<el-select v-model="editModel.cityCode" @change="cityChange" :placeholder="this.$t('rules.pleaseSelect')" :disabled="this.disabled">
<el-option v-for="item in cityList" :key="item.code" :label="item.name" :value="item.code">
</el-option>
</el-select>
</el-form-item>
<el-form-item :label="this.$t('lesson.releaseAssociatedMap')" prop="mapId">
<el-select v-model="editModel.mapId" :placeholder="this.$t('rules.pleaseSelect')" @change="mapChange">
<el-option v-for="item in mapList" :key="item.id" :label="item.name" :value="item.id" />
<el-select v-model="editModel.mapId" @change="mapChange" :placeholder="this.$t('rules.pleaseSelect')" :disabled="this.disabled">
<el-option v-for="item in mapList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item :label="this.$t('lesson.publishCourseName')" prop="name">
<el-input v-model="editModel.name" />
<el-input v-model="editModel.name" :disabled="!this.hasRelease"></el-input>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogShow = false">{{$t('global.cancel')}}</el-button>
<el-button type="primary" :loading="loading" @click="doSave">{{ $t('global.confirm') }}</el-button>
<el-button type="primary" @click="doSave" :loading="loading">{{$t('global.confirm')}}</el-button>
</span>
</el-dialog>
</template>
@ -34,7 +30,7 @@
<script>
import { getPublishMapListBySkinCode } from '@/api/jmap/map';
import { getLessonNameByMapIdAndLessonId } from '@/api/jmap/lessondraft';
import { publishLesson } from '@/api/jmap/lessondraft';
import { adminPublishLesson,releaseOrCancel } from '@/api/designPlatform';
export default {
name: 'LessonPublish',
@ -42,6 +38,7 @@ export default {
return {
dialogShow: false,
loading: false,
disabled: true,
mapList: [],
cityList: [],
cityMapDict: {},
@ -50,9 +47,9 @@ export default {
name: '',
mapId: '',
prdCode: '',
cityCode: ''
cityCode: '',
}
}
};
},
computed: {
rules() {
@ -68,8 +65,12 @@ export default {
],
name: [
{ required: true, message: this.$t('rules.pleaseEnterMapName'), trigger: 'change' }
]
};
],
}
},
hasRelease() {
return this.$store.state.user.roles.includes('04') ||
this.$store.state.user.roles.includes('05');
}
},
methods: {
@ -78,7 +79,7 @@ export default {
this.mapList = this.cityMapDict[code];
},
async mapChange(mapId) {
const resp = await getLessonNameByMapIdAndLessonId({ mapId: mapId, lessonId: this.editModel.id });
let resp = await getLessonNameByMapIdAndLessonId({ mapId: mapId, lessonId: this.editModel.id });
if (resp && resp.data) {
this.editModel.name = resp.data.name;
}
@ -90,14 +91,14 @@ export default {
this.editModel = {
id: model.id,
name: model.name,
mapId: '',
mapId: this.$route.params.mapId,
prdCode: model.prdCode,
cityCode: model.cityCode
cityCode: model.cityCode,
};
if (model.skinCode && model.id) {
getPublishMapListBySkinCode(model.skinCode).then(resp => {
const list = resp.data || [];
let list = resp.data || [];
list.forEach(elem => {
if (!this.cityMapDict[elem.cityCode]) {
this.cityMapDict[elem.cityCode] = [];
@ -106,9 +107,10 @@ export default {
});
this.$Dictionary.cityType().then(list => {
this.cityList = list.filter(elem => { return this.cityMapDict[elem.code]; });
});
});
this.cityList = list.filter(elem => { return this.cityMapDict[elem.code] });
})
this.mapList = this.cityMapDict[model.cityCode];
})
}
this.dialogShow = true;
@ -116,12 +118,22 @@ export default {
doClose() {
this.$refs.form.resetFields();
this.dialogShow = false;
this.$emit('refresh')
},
doSave() {
this.loading = true;
this.$refs['form'].validate((valid) => {
if (valid) {
publishLesson(this.editModel).then(response => {
if (valid && this.hasRelease) {
adminPublishLesson(this.editModel,this.editModel.id).then(response => {
this.loading = false;
this.$message.success(this.$t('tip.coursePublishSuccessful'));
this.doClose();
}).catch(error => {
this.loading = false;
this.$messageBox(this.$t('tip.coursePublishFailed'));
});
}else if(valid && !this.hasRelease){
releaseOrCancel(this.editModel.id,"1").then(response => {
this.loading = false;
this.$message.success(this.$t('tip.coursePublishSuccessful'));
this.doClose();
@ -136,5 +148,5 @@ export default {
}
}
};
}
</script>

View File

@ -30,6 +30,9 @@
</el-tree>
</el-scrollbar>
</el-card>
<div class="draft">
<el-button type="primary" @click="goBack">{{$t('global.back')}}</el-button>
</div>
</div>
</template>
@ -50,24 +53,28 @@ export default {
},
computed: {
height() {
return this.$store.state.app.height - 140;
return this.$store.state.app.height - 180;
}
},
methods: {
convertTreeData(list, node) {
convertTreeData(list, data) {
let tree = [];
if (node && node.data && list && list.length) {
if (data && list && list.length) {
list.forEach(elem => {
if (node.data.name == elem.name) {
if (elem.children){
elem.children.forEach( item => {
if (data.id == item.id) {
tree = [elem];
}
})
}
});
}
return tree;
},
initData(node) {
initData(data) {
getLessonTree({ mapId: '' }).then(response => {
this.treeData = this.convertTreeData(response.data, node);
this.treeData = this.convertTreeData(response.data, data);
}).catch(() => {
this.$messageBox(this.$t('error.refreshFailed'));
});
@ -85,16 +92,15 @@ export default {
return draggingNode && (draggingNode.data.type === 'chapter' || draggingNode.data.type === 'training');
},
getLeesonId(node) {
if (node.parent.parent !== null) {
return this.getLeesonId(node.parent);
if (node.parent.data.type === 'lesson'){
return node.parent.data.id;
}else {
return node;
return this.getLeesonId(node.parent)
}
},
handleDragEnd(draggingNode, dropNode, dropType, ev) {
if (draggingNode && dropNode && dropType !== 'none') {
const lesson = this.getLeesonId(dropNode);
const lessonId = lesson.data.id;
const lessonId = this.getLeesonId(dropNode);
const model = {
location: dropType,
sourceId: draggingNode.data.id,
@ -109,6 +115,9 @@ export default {
this.$emit('refresh');
});
}
},
goBack() {
this.$router.go(-1);
}
}
};
@ -142,4 +151,9 @@ export default {
margin: 0 auto;
margin-top: 10px;
}
.draft {
width: 300px;
text-align: center;
margin: 20px auto;
}
</style>

View File

@ -1,18 +1,7 @@
<template>
<div class="mainContext">
<div class="treeContext">
<cource-category
ref="tree"
:height="height"
@publishCreate="publishCreate"
@lessonCreate="lessonCreate"
@lessonEdit="lessonEdit"
@chapterCreate="chapterCreate"
@chapterEdit="chapterEdit"
@treeSort="treeSort"
/>
</div>
<div class="draftContext" :style="{width: width +'px'}">
<div class="draftContext">
<!--:style="{width: width +'px'} -->
<div v-if="lessonShow">
<lesson-edit ref="lesson" :height="height" @refresh="refresh" />
</div>
@ -22,7 +11,6 @@
<div v-if="treeShow">
<sort-tree ref="sortTree" :height="height" @refresh="refresh" />
</div>
<publish-create ref="publish" @refresh="refresh" />
</div>
</div>
</template>
@ -32,13 +20,12 @@ import CourceCategory from './category/tree';
import LessonEdit from './edit/lesson/index';
import ChapterEdit from './edit/chapter/index';
import SortTree from './edit/sorttree/index';
import PublishCreate from './edit/create';
import localStore from 'storejs';
export default {
name: 'LessonDraft',
components: {
CourceCategory,
PublishCreate,
LessonEdit,
ChapterEdit,
SortTree
@ -55,12 +42,32 @@ export default {
},
computed: {
width() {
return this.$store.state.app.width - 420;
return this.$store.state.app.width - localStore.get('LeftWidth');
},
height() {
return this.$store.state.app.height - 102;
}
},
mounted() {
const data = this.$route.query;
switch (this.$route.params.type){
case 'lessonCreate':
this.lessonCreate(data);
break;
case 'lessonEdit':
this.lessonEdit(data);
break;
case 'chapterCreate':
this.chapterCreate(data);
break;
case 'chapterEdit':
this.chapterEdit(data);
break;
case 'treeSort':
this.treeSort(data);
break;
}
},
methods: {
exchangeShow(model) {
['lessonShow', 'chapterShow', 'treeShow'].forEach(elem => {
@ -71,51 +78,42 @@ export default {
}
});
},
publishCreate(node) {
this.isNew = true;
this.$nextTick(() => {
this.$refs.publish.doShow(node);
});
},
lessonCreate(node) {
lessonCreate(data) {
this.isNew = true;
this.exchangeShow({ lessonShow: true });
this.$nextTick(() => {
this.$refs.lesson.initData(true, node);
this.$refs.lesson.initData(true, data);
});
},
lessonEdit(node) {
lessonEdit(data) {
this.isNew = false;
this.exchangeShow({ lessonShow: true });
this.$nextTick(() => {
this.$refs.lesson.initData(false, node);
this.$refs.lesson.initData(false, data);
});
},
chapterCreate(node) {
chapterCreate(data) {
this.isNew = true;
this.exchangeShow({ chapterShow: true });
this.$nextTick(() => {
this.$refs.chapter.initData(true, node);
this.$refs.chapter.initData(true, data);
});
},
chapterEdit(node) {
chapterEdit(data) {
this.isNew = false;
this.exchangeShow({ chapterShow: true });
this.$nextTick(() => {
this.$refs.chapter.initData(false, node);
this.$refs.chapter.initData(false, data);
});
},
treeSort(node) {
treeSort(data) {
this.isNew = false;
this.exchangeShow({ treeShow: true });
this.$nextTick(() => {
this.$refs.sortTree.initData(node);
this.$refs.sortTree.initData(data);
});
},
refresh(filterSelect) {
this.$nextTick(() => {
this.$refs.tree.refresh(filterSelect);
});
}
}
};
@ -129,6 +127,6 @@ export default {
}
.draftContext {
float: left;
// float: left;
}
</style>

View File

@ -1,6 +1,6 @@
<template>
<el-dialog v-dialogDrag :title="title" :visible.sync="dialogVisible" width="25%" :before-close="doClose" center>
<data-form ref="dataform" :form="form" :form-model="formModel" :rules="rules" />
<data-form ref="dataform" :form="form" :formModel="formModel" :rules="rules"/>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="doSave">{{$t('global.confirm')}}</el-button>
<el-button @click="doClose">{{$t('global.cancel')}}</el-button>
@ -13,7 +13,7 @@ import { addTrainingRulesList } from '@/api/management/dictionary';
import { listPublishMap } from '@/api/jmap/mapdraft';
import { OperationList } from '@/scripts/OperationConfig';
import { addAutoGenerateTask } from '@/api/management/task';
import { getSkinCodeList } from '@/api/management/mapskin';
import { getSkinCodeList } from '@/api/management/mapskin'
export default {
name: 'CreateTask',
@ -23,7 +23,7 @@ export default {
skinCodeList: [],
taskStatusList: [],
formModel: {
parameter: '',
parameter: this.$route.query.skinCode,
type: '01'
},
isShow: false
@ -35,17 +35,17 @@ export default {
const form = {
labelWidth: '120px',
items: [
{ prop: 'parameter', label: this.$t('lesson.skinType'), type: 'select', required: true, options: this.skinCodeList }
{ prop: 'parameter', label: this.$t('lesson.skinType'), type: 'select', required: true, options: this.skinCodeList, disabled: true }
]
};
return form;
},
rules() {
const crules = {
let crules = {
parameter: [
{ required: true, message: this.$t('rules.mapInput'), trigger: 'change' }
]
};
}
return crules;
},
title() {
@ -65,7 +65,7 @@ export default {
this.taskStatusList = [];
this.$Dictionary.taskStatus().then(list => {
this.taskStatusList = list.map(elem => { return { value: elem.code, label: elem.name }; });
});
})
},
doShow() {
this.dialogVisible = true;
@ -74,27 +74,27 @@ export default {
const self = this;
this.$refs.dataform.validateForm(() => {
self.create();
});
})
},
doClose() {
this.formModel = {
parameter: '',
parameter: this.$route.query.skinCode,
type: '01'
};
}
this.$refs.dataform.resetForm();
this.isShow = false;
this.dialogVisible = false;
},
async create() {
const self = this;
let self = this
try {
const res = await addAutoGenerateTask(this.formModel);
self.doClose();
let res = await addAutoGenerateTask(this.formModel);
self.doClose()
self.$emit('reloadTable'); //
} catch (error) {
this.$messageBox(this.$t('tip.creatingFailed'));
}
}
}
};
}
</script>

View File

@ -3,6 +3,11 @@
<QueryListPage ref="queryListPage" :pager-config="pagerConfig" :query-form="queryForm" :query-list="queryList">
</QueryListPage>
<create-task ref='CreateTask' @reloadTable="reloadTable"></create-task>
<div class="draft">
<el-button-group>
<el-button type="primary" @click="turnback">{{ $t('global.back') }}</el-button>
</el-button-group>
</div>
</div>
</template>
@ -42,7 +47,7 @@
}
},
queryList: {
query: getTaskList,
query: this.queryFunction,
selectCheckShow: false,
indexShow: true,
columns: [
@ -145,7 +150,7 @@
})
},
taskCancel(index, node) {
this.$confirm( this.$t('tip.startOperationHint'), this.$t('global.tips'), {
this.$confirm( this.$t('tip.cancelsTaskHint'), this.$t('global.tips'), {
confirmButtonText: this.$t('global.confirm'),
cancelButtonText: this.$t('global.cancel'),
type: 'warning'
@ -165,6 +170,20 @@
createTask() {
this.$refs.CreateTask.doShow();
},
turnback() {
this.$router.go(-1)
},
queryFunction(params) {
params['mapId'] = this.$route.query.mapId;
return getTaskList(params)
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.draft {
width: 400px;
text-align: center;
margin: 20px auto;
}
</style>

View File

@ -20,7 +20,7 @@ export default {
loading: false,
dialogVisible: false,
formModel: {
skinCode: ''
skinCode: this.$route.query.skinCode
},
skinCodeList: [],
isShow: false
@ -32,7 +32,7 @@ export default {
const form = {
labelWidth: '120px',
items: [
{ prop: 'skinCode', label: this.$t('lesson.skinType'), type: 'select', required: true, options: this.skinCodeList }
{ prop: 'skinCode', label: this.$t('lesson.skinType'), type: 'select', required: true, options: this.skinCodeList, disabled: true }
]
};
return form;
@ -104,7 +104,7 @@ export default {
},
handleClose() {
this.formModel = {
skinCode: ''
skinCode: this.$route.query.skinCode
};
this.$refs.dataform.resetForm();
this.isShow = false;

View File

@ -46,7 +46,7 @@ export default {
const form = {
labelWidth: '120px',
items: [
{ prop: 'skinCode', label: this.$t('lesson.skinType'), type: 'select', required: true, options: this.skinCodeList, disabled: !isAdd },
{ prop: 'skinCode', label: this.$t('lesson.skinType'), type: 'select', required: true, options: this.skinCodeList, disabled: true },
{ prop: 'trainingType', label: this.$t('lesson.trainingType'), type: 'select', required: true, options: this.trainingTypeList, disabled: !isAdd, change: true, onChange: this.changeList },
{ prop: 'operateType', label: this.$t('lesson.operationType'), type: 'select', required: true, options: this.trainingOperateTypeMap[this.formModel.trainingType], disabled: !isAdd },
{ label: '', type: 'button', options: this.placeholderList, style: 'margin-bottom: 0; margin-top: -10px;', typeBtn: 'info', click: this.addTrainName },
@ -197,6 +197,10 @@ export default {
maxDuration: data.maxDuration,
trainingRemark: this.repliceName(data.trainingRemark, this.placeholderList)
};
}else {
this.formModel = {
skinCode: this.$route.query.skinCode
}
}
},
repliceName(fieldValue, enumList) {

View File

@ -5,6 +5,11 @@
<training-edit ref="edit" type="EDIT" @reloadTable="reloadTable" />
<add-batch ref="addBatch" @reloadTable="reloadTable" />
<save-as ref="saveAs" @reloadTable="reloadTable" />
<div class="draft">
<el-button-group>
<el-button type="primary" @click="turnback">{{ $t('global.back') }}</el-button>
</el-button-group>
</div>
</div>
</template>
@ -14,6 +19,7 @@ import { getSkinCodeList } from '@/api/management/mapskin';
import TrainingEdit from './addEdit';
import AddBatch from './addBatch';
import SaveAs from './saveAs.vue';
import { UrlConfig } from '@/router/index';
export default {
name: 'TrainingRule',
@ -37,13 +43,6 @@ export default {
labelWidth: '140px',
reset: true,
queryObject: {
skinCode: {
type: 'select',
label: this.$t('lesson.skinType'),
config: {
data: []
}
},
trainingType: {
type: 'select',
label: this.$t('lesson.trainingType'),
@ -179,9 +178,6 @@ export default {
this.skinCodeList = [];
getSkinCodeList().then(response => {
this.skinCodeList = response.data;
response.data.forEach(elem => {
this.queryForm.queryObject.skinCode.config.data.push({ value: elem.code, label: elem.name });
});
});
//
@ -218,12 +214,13 @@ export default {
}
},
async getList(params) {
params['mapId'] = this.$route.query.mapId;
const res = await getTrainingRulesList(params);
this.totals = res.data.total;
return res;
},
handleViewDetail(index, row) {
this.$router.push({ path: `/lesson/manage/trainingRule/detail`, query: { id: row.id, type: row.trainingType, skinCode: row.skinCode } });
this.$router.push({ path: `${UrlConfig.design.trainingRuleDetail}`, query: { id: row.id, type: row.trainingType, skinCode: row.skinCode } });
},
handleEdit(index, row) {
@ -257,10 +254,19 @@ export default {
});
});
},
turnback() {
this.$router.go(-1)
},
reloadTable() {
this.queryList.reload();
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.draft {
width: 400px;
text-align: center;
margin: 20px auto;
}
</style>

View File

@ -2,7 +2,7 @@
<el-dialog v-dialogDrag :title="operation.title" :visible.sync="dialogShow" width="500px" :before-close="close">
<el-form ref="form" :model="operateModel" label-width="auto" :rules="rules" size="mini" label-position="right" class="dialog-form">
<el-form-item :label="this.$t('lesson.skinType') + ':'" prop="skinCode">
<el-select v-model="operateModel.skinCode" @change="skinCodeChoose">
<el-select v-model="operateModel.skinCode" :disabled="this.disable" @change="skinCodeChoose">
<el-option
v-for="option in skinCodeList"
:key="option.code"
@ -77,7 +77,8 @@ export default {
trainingOperateTypeMap: {
type: Object,
required: true
}
},
},
data() {
var minDurations = (rule, value, callback) => {
@ -128,6 +129,7 @@ export default {
return {
dialogShow: false,
disable: true,
productTypesList: [],
trainTypesList: [],
productList: [],
@ -135,7 +137,7 @@ export default {
operateModel: {
name: '',
type: '',
skinCode: '',
skinCode: this.$route.params.skinCode,
prdCode: '',
operateType: [],
maxDuration: 0,
@ -179,6 +181,9 @@ export default {
return this.operation.event == '02';
}
},
mounted() {
this.skinCodeChoose(this.$route.params.skinCode);
},
methods: {
show(data) {
this.operation = {

View File

@ -8,6 +8,11 @@
:training-operate-type-map="trainingOperateTypeMap"
@refresh="reloadTable"
/>
<div class="draft">
<el-button-group>
<el-button type="primary" @click="turnback">{{ $t('global.back') }}</el-button>
</el-button-group>
</div>
</div>
</template>
@ -38,16 +43,7 @@ export default {
},
queryForm: {
labelWidth: '120px',
initLoadCallback: this.loadInitQueryList,
queryObject: {
skinCode: {
type: 'select',
label: this.$t('lesson.skinType'),
change: this.skinCodeChoose,
config: {
data: []
}
},
prdCode: {
type: 'select',
label: this.$t('lesson.product'),
@ -85,7 +81,7 @@ export default {
}
},
queryList: {
query: pageQueryTraining,
query: this.queryFunction,
selectCheckShow: false,
indexShow: true,
columns: [
@ -142,14 +138,20 @@ export default {
name: this.$t('lesson.demonstration'),
handleClick: this.demoDisplay,
type: ''
},
{
name: '实训录制',
handleClick: this.trainingRecord,
type: ''
}
]
}
],
actions: [
{ text: this.$t('lesson.generateTraining'), btnCode: 'employee_insert', handler: this.autoMaticTrainging },
{ text: this.$t('lesson.updateTraining'), btnCode: 'employee_insert', handler: this.editTrainingByType, type: 'warning'},
{ text: this.$t('lesson.deleteTraining'), btnCode: 'employee_insert', handler: this.delAutoMaticTrainging, type: 'danger'}
{ text: this.$t('lesson.generateTraining'), btnCode: 'employee_auto', handler: this.autoMaticTrainging },
{ text: this.$t('lesson.updateTraining'), btnCode: 'employee_edit', handler: this.editTrainingByType, type: 'warning'},
{ text: this.$t('lesson.deleteTraining'), btnCode: 'employee_delete', handler: this.delAutoMaticTrainging, type: 'danger'},
{ text: '添加实训', btnCode: 'employee_add', handler:this.addTraining, type: 'primary' }
]
},
@ -159,22 +161,27 @@ export default {
async created() {
await this.loadInitData();
const json = localStore.get(this.$route.path);
if (json && json.type) {
this.typeChoose(json);
}
if (json && json.prdCode) {
this.skinCodeChoose(json);
}
json.type = '';
json.prdCode = '';
json.operateType = '';
},
methods: {
async loadInitData() {
this.skinCodeList = [];
this.queryForm.queryObject.skinCode.config.data = [];
this.queryForm.queryObject.prdCode.config.data = [];
getSkinCodeList().then(response => {
this.skinCodeList = response.data;
response.data.forEach(elem => {
this.queryForm.queryObject.skinCode.config.data.push({ value: elem.code, label: elem.name });
});
getCommodityMapProduct(this.$route.params.skinCode).then((response) => {
const productList = response.data;
if (productList && productList.length > 0) {
productList.forEach(elem => {
//
if (elem.prdType != '03') {
this.queryForm.queryObject.prdCode.config.data.push({ value: elem.code, label: elem.name });
}
});
}
});
this.prdTypeList = [];
@ -213,28 +220,6 @@ export default {
this.trainingOperateTypeMap['08'] = list08; //
this.reloadTable();
},
loadInitQueryList(form) {
if (form && form.skinCode) {
getCommodityMapProduct(form.skinCode).then((response) => {
const productList = response.data;
if (productList && productList.length > 0) {
productList.forEach(elem => {
//
if (elem.prdType != '03') {
this.queryForm.queryObject.prdCode.config.data.push({ value: elem.code, label: elem.name });
}
});
}
});
}
},
skinCodeChoose(form) {
this.queryForm.queryObject.prdCode.config.data = [];
form.type = '';
form.prdCode = '';
form.operateType = '';
this.loadInitQueryList(form);
},
prdChoose(form) {
form.type = '';
form.operateType = '';
@ -270,7 +255,32 @@ export default {
},
reloadTable() {
this.queryList.reload();
},
turnback() {
this.$router.go(-1)
},
trainingRecord(index, node) {
trainingNotify({ trainingId: node.id }).then(resp => {
this.group = resp.data;
this.$router.push({ path: `${UrlConfig.design.trainingRecord}/${node.id}/${node.name}`, query: { group: resp.data } });
}).catch(error => {
this.$messageBox(`${this.$t('error.createSimulationFailed')}: ${error.message}`);
});
},
queryFunction(params) {
params['mapId'] = this.$route.query.mapId;
return pageQueryTraining(params);
},
addTraining() {
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.draft {
width: 400px;
text-align: center;
margin: 20px auto;
}
</style>

View File

@ -0,0 +1,160 @@
<template>
<el-card v-loading="loading" class="map-list-main">
<div slot="header" class="clearfix">
<span>{{ $t(`lesson.trainingList`) }}</span>
</div>
<div style="{width: 150px}">
<el-input v-model="filterText" :placeholder="$t(`lesson.filterPlaceholder`)" clearable />
</div>
<el-scrollbar wrap-class="scrollbar-wrapper" :style="{ height: (height-270) +'px' }">
<el-tree
ref="tree"
:data="treeData"
:props="defaultProps"
node-key="id"
:default-expanded-keys="defaultShowKeys"
:filter-node-method="filterNode"
expand-on-click-node
highlight-current
:span="22"
@node-contextmenu="showContextMenu"
@node-click="clickEvent"
>
<div slot-scope="{ node: nodeScop }">
<span v-if="nodeScop.data.type == 'skin'" class="el-icon-news">&nbsp;{{ nodeScop.label }}</span>
<span v-else-if="nodeScop.data.type == 'prd'" class="el-icon-tickets">&nbsp;{{ nodeScop.label }}</span>
<span
v-else-if="nodeScop.data.type == 'trainingType'"
class="el-icon-document"
>&nbsp;{{ nodeScop.label }}</span>
<span
v-else-if="nodeScop.data.type == 'training'"
class="el-icon-edit-outline"
>&nbsp;{{ nodeScop.label }}</span>
</div>
</el-tree>
</el-scrollbar>
<operate-menu ref="menu" :point="point" :node="node" @refresh="refresh" @trainingShow="trainingShow" />
</el-card>
</template>
<script>
import { DeviceMenu } from '@/scripts/ConstDic';
import { getTrainingTree } from '@/api/jmap/training';
import { trainingNotify } from '@/api/simulation';
import OperateMenu from './category/operateMenu';
import { UrlConfig } from '@/router/index';
import localStore from 'storejs';
export default {
name: 'TrainingOperate',
components: {
OperateMenu
},
data() {
return {
loading: true,
defaultShowKeys: [],
filterText: '',
treeData: [],
defaultProps: {
children: 'children',
label: 'name'
},
point: {
x: 0,
y: 0
},
node: {
}
};
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
}
},
computed: {
height() {
return this.$store.state.app.height - 50;
}
},
mounted() {
this.refresh();
},
methods: {
filterNode(value, data) {
if (!value) return true;
return data.name.indexOf(value) !== -1;
},
clickEvent(obj, node, data) {
this.$store.dispatch('menuOperation/setPopMenu', { position: null, menu: null });
if (obj && obj.type === 'training') {
this.resize();
trainingNotify({ trainingId: obj.id }).then(resp => {
this.group = resp.data;
this.$router.push({ path: `${UrlConfig.design.lessonTraining}/${obj.id}/${obj.name}`, query: { group: resp.data } });
}).catch(error => {
this.$messageBox(`${this.$t('error.createSimulationFailed')}: ${error.message}`);
});
}
},
showContextMenu(e, obj, node, vueElem) {
if (obj && obj.type === 'trainingType' || obj.type === 'training') {
e.preventDefault();
this.point = {
x: e.clientX,
y: e.clientY
};
this.node = node;
const menu = DeviceMenu.Training;
this.$store.dispatch('menuOperation/setPopMenu', { position: this.point, menu: menu });
}
},
getParent(node) {
while (node && node.data.type != 'skin') {
node = node.parent;
}
return node || {};
},
trainingShow() {
this.$emit('trainingStart', { id: this.node.data.id, lessonId: this.getParent(this.node).data.id });
},
refresh() {
this.loading = true;
getTrainingTree().then(response => {
this.treeData = response.data;
this.defaultShowKeys = [this.$route.params.trainingId];
this.$nextTick(() => {
this.loading = false;
this.$refs.tree.setCurrentKey(this.$route.params.trainingId); // value node-key
if (this.filterText) {
this.$refs.tree.filter(this.filterText);
}
});
}).catch(() => {
this.loading = false;
this.$messageBox(this.$t('error.refreshFailed'));
});
},
resize() {
this.widthLeft = Number(localStore.get('LeftWidth')) || this.widthLeft;
const width = this.$store.state.app.width - 521 - this.widthLeft;
const height = this.$store.state.app.height - 90;
this.$store.dispatch('config/resize', { width: width, height: height });
}
}
};
</script>
<style>
.el-tree {
overflow-x: hidden;
}
.map-list-main {
text-align: center;
}
.el-tree-node.is-current>.el-tree-node__content {
background-color: #e4e3e3 !important;
}
</style>

View File

@ -43,6 +43,12 @@ export default {
},
trainingId() {
return this.$route.params.trainingId;
},
width() {
return this.$store.state.app.width - 481 - this.widthLeft;
},
height() {
return this.$store.state.app.height - 90;
}
},
watch: {
@ -112,7 +118,9 @@ export default {
@import "src/styles/mixin.scss";
.blockContext {
float: left;
// float: left;
height: 100%;
overflow: hidden;
}
.mapContext {
@ -121,7 +129,7 @@ export default {
.stepContext {
float: right;
width: 480px;
width: 520px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<div class="login-container" :style="{'background-image': 'url('+bgImg+')'}">
<div v-if="project" class="text-box">{{title}}</div>
<div class="content-box">
<div class="qrcode-main">
<div class="login-code-box" @click="loginRefresh">
<qrcode-vue
@ -30,7 +30,7 @@
</div>
<el-form ref="loginForm" class="login-form" :model="loginForm" :rules="loginRules" label-position="left">
<div class="title_box">欢迎登陆琏课堂</div>
<div class="title_box">欢迎登录城市轨道交通实训平台</div>
<el-form-item prop="username" class="item_form_box">
<span class="svg-container svg-container_login">
<svg-icon icon-class="user" />
@ -58,14 +58,14 @@
title=""
width="200"
trigger="hover"
content="请在琏课堂小程序助手,完善个人信息,设置登密码,手机号或邮箱。"
content="请在琏课堂小程序助手,完善个人信息,设置登密码,手机号或邮箱。"
class="popover_box"
>
<div slot="reference">无法登?</div>
<div slot="reference">无法登?</div>
</el-popover>
<el-form-item>
<el-button type="primary" style="width:100%;" :loading="loading" @click.native.prevent="handleLogin">
登陆
登录
</el-button>
</el-form-item>
</el-form>
@ -75,14 +75,19 @@
</template>
<script>
// import md5 from 'js-md5';
import { removeSessionStorage } from '@/utils/auth';
import { UrlConfig } from '@/router/index';
import localStore from 'storejs';
import Cookies from 'js-cookie';
import md5 from 'js-md5';
import QrcodeVue from 'qrcode.vue';
import { getLoginWmurl, checkLoginStatus } from '@/api/login';
import { LoginParams } from '@/utils/login';
import bgImg from '@/assets/bg1.jpg';
import { setToken } from '@/utils/auth';
import { loginTitle } from '@/scripts/ConstDic';
//
export default {
name: 'Login',
components: { QrcodeVue },
@ -124,9 +129,17 @@ export default {
};
},
mounted() {
document.title = '琏课堂';
document.title = loginTitle[this.$route.params.project||'default'];
this.loginRefresh();
},
computed: {
project() {
return this.$route.params.project;
},
title() {
return loginTitle[this.$route.params.project||'default'];
}
},
methods: {
clearTimer(timer) {
if (timer) {
@ -149,7 +162,7 @@ export default {
}).catch((error) => {
console.log(error);
this.loadingCode = false;
this.$messageBox('获取登陆二维码失败,请刷新重试');
this.$messageBox('获取登录二维码失败,请刷新重试');
});
},
checkLoginStatus() {
@ -170,7 +183,15 @@ export default {
self.$store.dispatch('QrLoginSetting', { key: 'SET_TOKEN', value: response.data.token }).then(() => {
//
self.clearTimer(self.checkLogin);
self.$router.push({ path: '/' });
let path = '/login';
if (project) {
path = path + '/' + project;
}
self.$router.push({ path: path });
self.$nextTick(() => {
self.$i18n.locale = 'zh';
Cookies.set('user_lang', 'zh');
});
});
}).catch(error => {
if (error.data && error.data.status == '1') {
@ -193,18 +214,28 @@ export default {
const model = Object.assign({}, this.loginForm);
model.password = md5(model.password);
model.type = 'class';
model.project = this.$route.params.project;
this.loading = true;
removeSessionStorage('againEnter');
this.$store.dispatch('Login', model).then(() => {
this.$store.dispatch('GetUserConfigInfo');
this.$store.dispatch('SetAccount', model.username);
//
this.loading = false;
this.tipsMsg = '';
this.$router.push({ path: '/' });
}).catch(() => {
this.tipsMsg = '用户名或密码不正确,请重新输入。';
let path = localStore.get('trainingPlatformRoute'+model.username);
if (!path || !path.startsWith('/trainingPlatform')) {
path = UrlConfig.trainingPlatform.trainingPlatformHome;
}
this.$nextTick(() => {
this.$i18n.locale = 'zh';
Cookies.set('user_lang', 'zh');
});
this.$router.push({ path: path });
}).catch(error => {
this.tipsMsg = error.message;
this.loading = false;
setTimeout(() => { this.tipsMsg = ''; }, 15000);
setTimeout(() => { this.tipsMsg = ''; }, 5000);
});
} else {
console.log('error submit!!');
@ -221,10 +252,13 @@ export default {
$light_gray:#eee;
.login-container {
.el-form-item{
background: #fff !important;
border: 1px solid rgba(0, 0, 0, 0.1) !important;
.el-input {
height: 40px;
width: 85%;
background: #fff;
input {
background: #fff !important;
border: 0px;
@ -240,6 +274,8 @@ export default {
}
}
}
}
.item_form_box {
border: 1px solid #ccc;
@ -275,7 +311,6 @@ export default {
color: #225592;
font-size: 14px;
}
.login-container {
position: fixed;
display: flex;
@ -286,7 +321,6 @@ export default {
background-repeat: no-repeat;
background-origin: border-box;
background-size: 100% 100%;
.content-box{
width: 720px;
display: flex;
@ -298,7 +332,12 @@ export default {
box-sizing: border-box;
position: relative;
}
.text-box{
position: absolute;
top: 10%;
font-size: 30px;
font-weight: bold;
}
.login-form {
width: 420px;
padding: 0 50px;
@ -317,7 +356,7 @@ export default {
}
.title_box {
font-size: 24px;
font-size: 20px;
color: #000;
margin: 0px auto 30px auto;
text-align: center;
@ -365,3 +404,4 @@ export default {
}
}
</style>

Some files were not shown because too many files have changed in this diff Show More