init
2
.env
|
@ -1,3 +1,3 @@
|
|||
NODE_ENV=production
|
||||
VUE_APP_PREVIEW=false
|
||||
VUE_APP_API_BASE_URL=/dawa
|
||||
VUE_APP_API_BASE_URL=/welfare
|
|
@ -1,4 +1,4 @@
|
|||
NODE_ENV=development
|
||||
VUE_APP_PREVIEW=true
|
||||
VUE_APP_API_BASE_URL=/dawa
|
||||
VUE_APP_API_BASE_URL=/welfare
|
||||
VUE_APP_PUBLIC_PATH =/
|
|
@ -1,3 +1,3 @@
|
|||
NODE_ENV=production
|
||||
VUE_APP_PREVIEW=true
|
||||
VUE_APP_API_BASE_URL=/dawa
|
||||
VUE_APP_API_BASE_URL=/welfare
|
|
@ -14,12 +14,14 @@
|
|||
"@ant-design-vue/pro-layout": "^0.3.4",
|
||||
"@antv/data-set": "^0.10.2",
|
||||
"@icon-park/vue": "^1.3.5",
|
||||
"@jiaminghi/data-view": "^2.7.3",
|
||||
"@types/echarts": "^4.4.3",
|
||||
"ant-design-vue": "^1.7.7",
|
||||
"axios": "^0.19.0",
|
||||
"core-js": "^3.1.2",
|
||||
"core-js": "^3.6.4",
|
||||
"dplayer": "^1.26.0",
|
||||
"draftjs-to-html": "^0.9.1",
|
||||
"echarts": "^5.2.2",
|
||||
"echarts": "^4.6.0",
|
||||
"enquire.js": "^2.1.6",
|
||||
"file-saver": "^2.0.5",
|
||||
"html-to-draftjs": "^1.5.0",
|
||||
|
@ -39,6 +41,7 @@
|
|||
"store": "^2.0.12",
|
||||
"viser-vue": "^2.4.6",
|
||||
"vue": "^2.6.10",
|
||||
"vue-awesome": "^4.5.0",
|
||||
"vue-clipboard2": "^0.2.1",
|
||||
"vue-cropper": "0.4.9",
|
||||
"vue-echarts": "^6.0.2",
|
||||
|
@ -73,6 +76,8 @@
|
|||
"git-revision-webpack-plugin": "^3.0.6",
|
||||
"less": "^3.0.4",
|
||||
"less-loader": "^5.0.0",
|
||||
"sass": "^1.25.0",
|
||||
"sass-loader": "^8.0.2",
|
||||
"opencollective": "^1.0.3",
|
||||
"opencollective-postinstall": "^2.0.2",
|
||||
"vue-svg-icon-loader": "^2.1.1",
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<link rel="icon" href="<%= BASE_URL %>logo.png">
|
||||
<title>安全培训平台管理系统</title>
|
||||
<title class="index-title">下堡坪乡农村福利院长者信息管理系统</title>
|
||||
<style>
|
||||
.first-loading-wrp {
|
||||
display: flex;
|
||||
|
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 8.3 KiB |
|
@ -0,0 +1,162 @@
|
|||
import { ref } from 'vue'
|
||||
export default function () {
|
||||
const mapData1 = ref({
|
||||
middle: [
|
||||
{ label: '村/社区', count: 0 },
|
||||
{ label: '党群服务中心', count: 0 },
|
||||
{ label: '村组/小区', count: 0 },
|
||||
{ label: '有物业小区', count: 0 },
|
||||
{ label: '党群连心站', count: 0 },
|
||||
{ label: '楼栋', count: 0 },
|
||||
{ label: '党员中心户', count: 0 },
|
||||
{ label: '户籍数', count: 0 },
|
||||
{ label: '常住人口', count: 0 },
|
||||
],
|
||||
charts: {
|
||||
follow: {
|
||||
look: [0, 0, 0, 0],
|
||||
room: [0, 0, 0, 0],
|
||||
},
|
||||
partyMember: {
|
||||
member_1: [0, 0, 0, 0],
|
||||
member_2: [0, 0, 0, 0],
|
||||
member_3: [0, 0, 0, 0],
|
||||
member_4: [0, 0, 0, 0],
|
||||
},
|
||||
},
|
||||
resource: {
|
||||
position: { area: 0, interest: '0%' },
|
||||
party: { area: 0, interest: '0%' },
|
||||
stand: { area: 0, interest: '0%' },
|
||||
venue: { area: 0, interest: '0%' },
|
||||
},
|
||||
properyService: {
|
||||
service1: [
|
||||
{
|
||||
value: 0,
|
||||
name: '市场化管理0个',
|
||||
},
|
||||
{
|
||||
value: 0,
|
||||
name: '公益性物业托底0个',
|
||||
},
|
||||
{
|
||||
value: 0,
|
||||
name: '业主自治0个',
|
||||
},
|
||||
{
|
||||
value: 0,
|
||||
name: '单位代管0个',
|
||||
},
|
||||
],
|
||||
service2: [
|
||||
{
|
||||
value: 0,
|
||||
name: '已建党组0个',
|
||||
},
|
||||
{
|
||||
value: 0,
|
||||
name: '未建党组织0个',
|
||||
},
|
||||
],
|
||||
},
|
||||
orgCharts: {
|
||||
data: [1, 0, 5, 0, 1, 20],
|
||||
Proportion: [
|
||||
{ name: '下沉党员干部占比:0%', value: 0 },
|
||||
{ name: '业委会成员占比:0%', value: 0 },
|
||||
{ name: '物业公司负责人占比:0%', value: 0 },
|
||||
{ name: '小区网格员占比:0%', value: 0 },
|
||||
{ name: '社区“两委”成员占比0%', value: 0 },
|
||||
{ name: '居民群众代表占比:0%', value: 0 },
|
||||
],
|
||||
number: [
|
||||
{ name: '50-200㎡ 数量', value: 0 },
|
||||
{ name: '200-500㎡ 数量', value: 0 },
|
||||
{ name: '500-1000㎡ 数量', value: 0 },
|
||||
],
|
||||
},
|
||||
fourTwo: {
|
||||
fourCharts: [0, 0, 0, 0, 0, 0],
|
||||
buCharts: [
|
||||
{ value: 0, name: '自管党员' },
|
||||
{ value: 0, name: '下沉党员' },
|
||||
{ value: 0, name: '其他党员' },
|
||||
],
|
||||
unitCharts: [
|
||||
{ value: 0, name: '自管党员' },
|
||||
{ value: 0, name: '下沉党员' },
|
||||
{ value: 0, name: '其他党员' },
|
||||
],
|
||||
},
|
||||
activity: {
|
||||
activityNum: 0,
|
||||
proport: '0%',
|
||||
directNUm: 0,
|
||||
finishNum: 0,
|
||||
progress: 0,
|
||||
forPeople: 0,
|
||||
proportion: '0%',
|
||||
},
|
||||
bigBranch: {
|
||||
allBuild: { small: 0, big: 0 },
|
||||
branchMember: [
|
||||
{ value: 0, name: '社区‘两委’成员占比:0%' },
|
||||
{ value: 0, name: '业委会成员占比:0%' },
|
||||
{ value: 0, name: '小区网格员占比:0%' },
|
||||
{ value: 0, name: '物业公司服务负责人占比:0%' },
|
||||
{ value: 0, name: '下沉党员干部占比:0%' },
|
||||
{ value: 0, name: '居民群众干部占比:0%' },
|
||||
],
|
||||
},
|
||||
bigParty: {
|
||||
allBuild: { small: 0, big: 0 },
|
||||
branchMember: [
|
||||
{ value: 0, name: '社区‘两委’成员占比:0%' },
|
||||
{ value: 0, name: '业委会成员占比:0%' },
|
||||
{ value: 0, name: '小区网格员占比:0%' },
|
||||
{ value: 0, name: '物业公司服务负责人占比:0%' },
|
||||
{ value: 0, name: '下沉党员干部占比:0%' },
|
||||
{ value: 0, name: '居民群众干部占比:0%' },
|
||||
],
|
||||
},
|
||||
indus: {
|
||||
allNum: 0,
|
||||
member: 0,
|
||||
zb: [
|
||||
{ value: 0, name: '自管党员' },
|
||||
{ value: 0, name: '下沉党员' },
|
||||
{ value: 0, name: '其他党员' },
|
||||
],
|
||||
overSix: [
|
||||
{ value: 0, name: '已达到60%' },
|
||||
{ value: 0, name: '未达到60%' },
|
||||
],
|
||||
},
|
||||
twoTeam: {
|
||||
emergencyCount: {
|
||||
proportion: 0,
|
||||
teamCount: 11,
|
||||
totalCount: 0,
|
||||
xcMemberCount: 0,
|
||||
},
|
||||
volunteerCount: {
|
||||
proportion: 0,
|
||||
teamCount: 11,
|
||||
totalCount: 0,
|
||||
xcMemberCount: 0,
|
||||
},
|
||||
},
|
||||
orgTable: {
|
||||
partyService: [],
|
||||
residen: [],
|
||||
service: [],
|
||||
activityList: [],
|
||||
directList: [],
|
||||
vence: [],
|
||||
social: [],
|
||||
},
|
||||
})
|
||||
|
||||
return { mapData1 }
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const api = {
|
||||
list: '/sys/dictionary/item/list',
|
||||
findMaxValue: '/sys/dictionary/item/findMaxValue',
|
||||
get: '/sys/dictionary/item/get',
|
||||
add: '/sys/dictionary/item/add',
|
||||
del: '/sys/dictionary/item/del',
|
||||
edit: '/sys/dictionary/item/edit',
|
||||
|
||||
certificateList: '/archives/certificate/listPage',
|
||||
addCertificate: '/person/certificate/add',
|
||||
certificateDetail: '/person/certificate/detail',
|
||||
delCertificate: '/person/certificate/del',
|
||||
certificateExport: 'person/certificate/export'
|
||||
}
|
||||
|
||||
// 证书类型 列表
|
||||
export function getCertificateTypeList(params) {
|
||||
return request({
|
||||
url: api.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 查询最大词典项值 列表
|
||||
export function getCertificateTypeMaxValue(params) {
|
||||
return request({
|
||||
url: api.findMaxValue,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 根据ID查询证书类型 列表
|
||||
export function getCertificateType(params) {
|
||||
return request({
|
||||
url: api.get,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 证书类型 新增
|
||||
export function addCertificateType(params) {
|
||||
return request({
|
||||
url: api.add,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
// 证书类型 删除
|
||||
export function delCertificateType(params) {
|
||||
return request({
|
||||
url: api.del,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 证书类型 修改
|
||||
export function editCertificateType(params) {
|
||||
return request({
|
||||
url: api.edit,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
// 证书列表
|
||||
export function getArchivesCertificatelist(params) {
|
||||
return request({
|
||||
url: api.certificateList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 新增人员证书
|
||||
export function addPersonCertificate(params) {
|
||||
return request({
|
||||
url: api.addCertificate,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
// 获取证书详情
|
||||
export function findPersonCertificateDetail(params) {
|
||||
return request({
|
||||
url: api.certificateDetail,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 删除人员证书
|
||||
export function delCertificate(params) {
|
||||
return request({
|
||||
url: api.delCertificate,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 导出证书详情
|
||||
export function exportCertificate(params) {
|
||||
return request({
|
||||
url: api.certificateExport,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const api = {
|
||||
list: '/archives/project/listPage',
|
||||
projectUserList: '/archives/project/user/listPage',
|
||||
projectUserCourseList: '/archives/project/user/course/listPage',
|
||||
projectUserAnswerList: '/archives/project/user/answer/listPage'
|
||||
}
|
||||
|
||||
// 项目档案 列表
|
||||
export function getArchivesProjectList(params) {
|
||||
return request({
|
||||
url: api.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 项目档案-人员记录 列表
|
||||
export function getArchivesProjectUserList(params) {
|
||||
return request({
|
||||
url: api.projectUserList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 项目档案-人员记录-培训详情 列表
|
||||
export function getArchivesProjectUserCourseList(params) {
|
||||
return request({
|
||||
url: api.projectUserCourseList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 项目档案-人员记录-答题记录 列表
|
||||
export function getArchivesProjectUserAnswerList(params) {
|
||||
return request({
|
||||
url: api.projectUserAnswerList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,84 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const courseApi = {
|
||||
list: '/archives/user/listPage',
|
||||
autoTrainList: '/archives/user/autoTrainPageList',
|
||||
autoTrainDetailList: '/archives/user/autoTrainDetailPageList',
|
||||
autoTrainAnswerList: '/archives/user/autoTrainAnswerPageList',
|
||||
terminalTrainList: '/archives/user/terminalTrainPageList',
|
||||
terminalTrainDetail: '/archives/user/terminalTrainDetail',
|
||||
selfStudyList: '/archives/user/selfStudyPageList',
|
||||
violationList: '/archives/user/violationPageList'
|
||||
}
|
||||
|
||||
// 人员档案 列表
|
||||
export function getArchivesUserList(params) {
|
||||
return request({
|
||||
url: courseApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 人员档案-自主培训 列表
|
||||
export function getArchivesUserAutoTrainList(params) {
|
||||
return request({
|
||||
url: courseApi.autoTrainList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 人员档案-自主培训-培训详情 列表
|
||||
export function getArchivesUserAutoTrainDetailList(params) {
|
||||
return request({
|
||||
url: courseApi.autoTrainDetailList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 人员档案-自主培训-答题记录 列表
|
||||
export function getArchivesUserAutoTrainAnswerList(params) {
|
||||
return request({
|
||||
url: courseApi.autoTrainAnswerList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 人员档案-终端培训 列表
|
||||
export function getArchivesUserTerminalTrainList(params) {
|
||||
return request({
|
||||
url: courseApi.terminalTrainList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 人员档案-终端培训-查看详情
|
||||
export function getArchivesUserTerminalTrainDetail(params) {
|
||||
return request({
|
||||
url: courseApi.terminalTrainDetail,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 人员档案-自学档案
|
||||
export function getArchivesUserSelfStudyList(params) {
|
||||
return request({
|
||||
url: courseApi.selfStudyList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 人员档案-违章档案
|
||||
export function getArchivesUserViolationList(params) {
|
||||
return request({
|
||||
url: courseApi.violationList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
const api = {
|
||||
download: '/dawa/common/download',
|
||||
download: '/welfare/common/download',
|
||||
}
|
||||
|
||||
// 附件下载
|
||||
|
|
|
@ -1,80 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const courseApi = {
|
||||
add: '/courseManagement/course/addOrUpdate',
|
||||
get: '/courseManagement/course/details',
|
||||
// update: 'sys/menu/update',
|
||||
del: 'courseManagement/course/delete',
|
||||
// updateStatus: 'sys/menu/updateStatus',
|
||||
list: '/courseManagement/course/listPage',
|
||||
coursewareList: '/courseManagement/course/courseware/details',
|
||||
questionList: '/courseManagement/course/questionList',
|
||||
listByClass: '/courseManagement/course/list',
|
||||
}
|
||||
|
||||
export function courseAdd(params) {
|
||||
return request({
|
||||
url: courseApi.add,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function listByClass(params) {
|
||||
return request({
|
||||
url: courseApi.listByClass,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
// export function menuUpdate (params) {
|
||||
// return request({
|
||||
// url: menuApi.update,
|
||||
// method: 'post',
|
||||
// data: params
|
||||
// })
|
||||
// }
|
||||
|
||||
export function deleteCourse(params) {
|
||||
return request({
|
||||
url: courseApi.del,
|
||||
method: 'delete',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 查询课程列表
|
||||
export function getCourseList(params) {
|
||||
if (params.tag) params.tag = params.tag.toString();
|
||||
return request({
|
||||
url: courseApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 查看课程详情
|
||||
export function getCourseDetails(params) {
|
||||
return request({
|
||||
url: courseApi.get,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
//通过课程ID获取课件列表
|
||||
export function getCoursewareListByCourseId(params) {
|
||||
return request({
|
||||
url: courseApi.coursewareList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
//通过课程ID获取题目列表
|
||||
export function getQuestionListByCourseId(params) {
|
||||
return request({
|
||||
url: courseApi.questionList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const coursewareApi = {
|
||||
add: '/courseManagement/xmCourseCourseware/addOrUpdate',
|
||||
get: '/courseManagement/xmCourseCourseware/details',
|
||||
del: 'courseManagement/xmCourseCourseware/delete',
|
||||
classList: '/courseManagement/coursewareClassify/listPage',
|
||||
resource:'/courseManagement/xmCourseCourseware/resource'
|
||||
}
|
||||
|
||||
|
||||
|
||||
//删除课件
|
||||
export function deleteCourseware(params) {
|
||||
return request({
|
||||
url: coursewareApi.del,
|
||||
method: 'delete',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 课件新增
|
||||
export function coursewareAdd(params) {
|
||||
return request({
|
||||
url: coursewareApi.add,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
// 课件分类列表
|
||||
export function coursewareClassList(params) {
|
||||
return request({
|
||||
url: coursewareApi.classList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
// 课件详情
|
||||
export function coursewareDeatil(params) {
|
||||
return request({
|
||||
url: coursewareApi.get,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
// 资源库
|
||||
export function resource(params) {
|
||||
return request({
|
||||
url: coursewareApi.resource,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,53 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const projectApi = {
|
||||
// add: 'sys/menu/add',
|
||||
// get: 'sys/menu/get',
|
||||
// update: 'sys/menu/update',
|
||||
// del: 'sys/menu/delete',
|
||||
// updateStatus: 'sys/menu/updateStatus',
|
||||
list: 'courseManagement/customCourse/listPage'
|
||||
}
|
||||
|
||||
// export function menuAdd (params) {
|
||||
// return request({
|
||||
// url: menuApi.add,
|
||||
// method: 'post',
|
||||
// data: params
|
||||
// })
|
||||
// }
|
||||
// export function menuGet (params) {
|
||||
// return request({
|
||||
// url: menuApi.get,
|
||||
// method: 'post',
|
||||
// data: params
|
||||
// })
|
||||
// }
|
||||
// export function menuUpdate (params) {
|
||||
// return request({
|
||||
// url: menuApi.update,
|
||||
// method: 'post',
|
||||
// data: params
|
||||
// })
|
||||
// }
|
||||
// export function menuDelete (params) {
|
||||
// return request({
|
||||
// url: menuApi.del,
|
||||
// method: 'post',
|
||||
// data: params
|
||||
// })
|
||||
// }
|
||||
export function getcustomCourseList (params) {
|
||||
return request({
|
||||
url: customApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
// export function menuUpdateStatus (params) {
|
||||
// return request({
|
||||
// url: menuApi.updateStatus,
|
||||
// method: 'post',
|
||||
// data: params
|
||||
// })
|
||||
// }
|
|
@ -1,74 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const questionApi = {
|
||||
add: 'courseManagement/question/addOrUpdate',
|
||||
get: '/courseManagement/question/details',
|
||||
// update: 'sys/menu/update',
|
||||
del: 'courseManagement/question/delete',
|
||||
// updateStatus: 'sys/menu/updateStatus',
|
||||
// list: '/courseManagement/course/listPage',
|
||||
// coursewareList:'/courseManagement/course/courseware/details',
|
||||
// questionList:'/courseManagement/course/questionList',
|
||||
importTemplate: "courseManagement/question/importTemplate",
|
||||
getQuestionNumByCourseIds: '/courseManagement/question/getQuestionNumByCourseIds',
|
||||
}
|
||||
|
||||
|
||||
// 题目新增
|
||||
export function questionAdd(params) {
|
||||
return request({
|
||||
url: questionApi.add,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
// 题目数量
|
||||
export function getQuestionNumByCourseIds(params) {
|
||||
return request({
|
||||
url: questionApi.getQuestionNumByCourseIds,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
// export function menuGet (params) {
|
||||
// return request({
|
||||
// url: menuApi.get,
|
||||
// method: 'post',
|
||||
// data: params
|
||||
// })
|
||||
// }
|
||||
// export function menuUpdate (params) {
|
||||
// return request({
|
||||
// url: menuApi.update,
|
||||
// method: 'post',
|
||||
// data: params
|
||||
// })
|
||||
// }
|
||||
|
||||
|
||||
export function deleteQuestion(params) {
|
||||
return request({
|
||||
url: questionApi.del,
|
||||
method: 'delete',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 查看课程详情
|
||||
export function getQuestionDeatil(params) {
|
||||
return request({
|
||||
url: questionApi.get,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 题目批量导入
|
||||
export function importTemplate(params) {
|
||||
return request({
|
||||
url: questionApi.importTemplate,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const requiredQuesitonApi = {
|
||||
list: 'courseManagement/requiredQuestion/listPage',
|
||||
addOrUpdate: 'courseManagement/requiredQuestion/addOrUpdate',
|
||||
requiredQuestionId:'courseManagement/requiredQuestion/requiredQuestionId',
|
||||
testing:'/courseManagement/requiredQuestion/testing',
|
||||
}
|
||||
|
||||
|
||||
// 必选题列表
|
||||
export function requiredList(params) {
|
||||
return request({
|
||||
url: requiredQuesitonApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// 必选题新增和设置
|
||||
export function addOrUpdate(params) {
|
||||
return request({
|
||||
url: requiredQuesitonApi.addOrUpdate,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
//必选题题目ID
|
||||
export function requiredQuestionId(params) {
|
||||
return request({
|
||||
url: requiredQuesitonApi.requiredQuestionId,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
//必选题题目内容
|
||||
export function testing(params) {
|
||||
return request({
|
||||
url: requiredQuesitonApi.testing,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
// export function menuGet (params) {
|
||||
// return request({
|
||||
// url: menuApi.get,
|
||||
// method: 'post',
|
||||
// data: params
|
||||
// })
|
||||
// }
|
||||
// export function menuUpdate (params) {
|
||||
// return request({
|
||||
// url: menuApi.update,
|
||||
// method: 'post',
|
||||
// data: params
|
||||
// })
|
||||
// }
|
||||
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const honorApi = {
|
||||
addOrUpdate: '/honor/show/addOrUpdate',
|
||||
detail: '/honor/show/detail',
|
||||
del: '/honor/show/del',
|
||||
list: '/honor/show/list'
|
||||
}
|
||||
|
||||
export function honorAddOrUpdate (params) {
|
||||
return request({
|
||||
url: honorApi.addOrUpdate,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function honorDetail (params) {
|
||||
return request({
|
||||
url: honorApi.detail,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function honorDel (params) {
|
||||
return request({
|
||||
url: honorApi.del,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function honorPage (params) {
|
||||
return request({
|
||||
url: honorApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,187 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const mycourseApi = {
|
||||
changePassword: '/sys/user/changePwd',
|
||||
mycourseList: 'myCourse/getMyCourseList', // 我的课程列表,课程搜索
|
||||
addMyCourse: 'myCourse/addMyCourse', // 添加课程
|
||||
centerList: 'focusTrain/getList', // 集中培训列表
|
||||
centerDetail: 'focusTrain/getDetail', // 集中培训详情
|
||||
centerJoin: 'project/terminalTrain/enroll', // 集中培训报名
|
||||
centerSign: 'project/terminalTrain/sign', // 集中培训签到
|
||||
recommendList: 'sys/recommend/listPage', // 系统推荐课程列表
|
||||
recommendDetail: 'sys/recommend/detail', // 系统课程推荐详情
|
||||
trainPlanList: '/myCourse/getMyTrainPlanList', // 培训计划列表
|
||||
getMyTrainPlanCourse: '/myCourse/getMyTrainPlanCourse', // 获取培训计划中的课程列表
|
||||
getCourseDetail: 'myCourse/getCourseDetail', // 我的课程详情
|
||||
getCourseCatalogue: 'myCourse/getCourseCatalogue', // 获取课程目录
|
||||
reqCourseExam: 'testInClass/add', // 课中检测
|
||||
simulateTestList: 'simulateTest/list', // 模拟测试列表
|
||||
simulateTestDetail: 'simulateTest/getQuestions', // 获取模拟测试详情
|
||||
operationList: 'classwork/list', // 作业列表
|
||||
reqOperationDetail: 'classwork/get', // 作业详情
|
||||
reqOperationSubmit: 'classwork/submit', // 作业提交
|
||||
getMyCourseList: 'studyStatistics/getMyCourseList', // 课程学习统计
|
||||
addRecord: '/testInClass/addRecord' // pdf学习完成
|
||||
}
|
||||
|
||||
export function reqMyTrainPlanCourse (data) {
|
||||
return request({
|
||||
url: mycourseApi.getMyTrainPlanCourse,
|
||||
method: 'get',
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
||||
export function reqAddRecord (data) {
|
||||
return request({
|
||||
url: mycourseApi.addRecord,
|
||||
method: 'post',
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
||||
export function reqChangePassword (data) {
|
||||
return request({
|
||||
url: mycourseApi.changePassword,
|
||||
method: 'get',
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
||||
export function reqCenterJoin (data) {
|
||||
return request({
|
||||
url: mycourseApi.centerJoin,
|
||||
method: 'POST',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function reqMycourseCount (params) {
|
||||
return request({
|
||||
url: mycourseApi.getMyCourseList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqOperationDetail (params) {
|
||||
return request({
|
||||
url: mycourseApi.reqOperationDetail,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqOperationSubmit (params) {
|
||||
return request({
|
||||
url: mycourseApi.reqOperationSubmit,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqOperationList (params) {
|
||||
return request({
|
||||
url: mycourseApi.operationList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqSimulateTestDetail (params) {
|
||||
return request({
|
||||
url: mycourseApi.simulateTestDetail,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqSimulateTestList (data) {
|
||||
return request({
|
||||
url: mycourseApi.simulateTestList,
|
||||
method: 'post',
|
||||
data: data,
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
||||
export function reqMyCourseList (params) {
|
||||
return request({
|
||||
url: mycourseApi.mycourseList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqMyTrainPlanList (params) {
|
||||
return request({
|
||||
url: mycourseApi.trainPlanList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqAddMyCourse (params) {
|
||||
return request({
|
||||
url: mycourseApi.addMyCourse,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqCourseCenterList (params) {
|
||||
return request({
|
||||
url: mycourseApi.centerList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqCourseCenterDetail (params) {
|
||||
return request({
|
||||
url: mycourseApi.centerDetail,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqRecommendList (params) {
|
||||
return request({
|
||||
url: mycourseApi.recommendList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function recommendDetail (params) {
|
||||
return request({
|
||||
url: mycourseApi.recommendDetail,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqCourseDetail (params) {
|
||||
return request({
|
||||
url: mycourseApi.getCourseDetail,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqCourseCatalogue (params) {
|
||||
return request({
|
||||
url: mycourseApi.getCourseCatalogue,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqCourseExam (params, data) {
|
||||
return request({
|
||||
url: mycourseApi.reqCourseExam,
|
||||
method: 'post',
|
||||
params: params,
|
||||
data: data
|
||||
})
|
||||
}
|
|
@ -1,67 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const examApi = {
|
||||
examList: 'exam/list', // 我的考试-预约考试列表
|
||||
attendList: 'exam/attend', // 我的考试-已参加考试
|
||||
exam: 'exam/exam', // 我的考试进入考试
|
||||
viewReport: 'exam/viewReport', // 查看报告
|
||||
viewResolution: 'exam/viewResolution', // 查看解析
|
||||
submit: 'exam/submit', // 交卷
|
||||
subscribe: '/exam/subscribe'
|
||||
}
|
||||
|
||||
export function reqExamViewResolution (data) {
|
||||
return request({
|
||||
url: examApi.viewResolution,
|
||||
method: 'get',
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
||||
export function reqExamSubscribe (data) {
|
||||
return request({
|
||||
url: examApi.subscribe,
|
||||
method: 'get',
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
||||
export function reqExamSubmit (data) {
|
||||
return request({
|
||||
url: examApi.submit,
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function reqExamList (params) {
|
||||
return request({
|
||||
url: examApi.examList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqExamAttendList (params) {
|
||||
return request({
|
||||
url: examApi.attendList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqExamExam (params) {
|
||||
return request({
|
||||
url: examApi.exam,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqExamViewReport (params) {
|
||||
return request({
|
||||
url: examApi.viewReport,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const countApi = {
|
||||
myexamCount: 'data/person/learningStatistics' // 学习统计
|
||||
}
|
||||
|
||||
export function getMyexamCount (params) {
|
||||
return request({
|
||||
url: countApi.myexamCount,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const myresourceApi = {
|
||||
list: 'courseManagement/xmCourseCourseware/resource', // 学习统计
|
||||
addPreview: 'courseManagement/xmCourseCourseware/details', // 预览次数
|
||||
}
|
||||
|
||||
export function gerMyresource (params) {
|
||||
return request({
|
||||
url: myresourceApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqAddPreview (params) {
|
||||
return request({
|
||||
url: myresourceApi.addPreview,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const noticeApi = {
|
||||
add: 'notice/addOrUpdate',
|
||||
del: 'notice/del',
|
||||
get: 'notice/get',
|
||||
page: 'notice/pageList',
|
||||
read: 'notice/read',
|
||||
pagePerson: 'notice/pagePersonList',
|
||||
cancel: 'notice/cancel'
|
||||
}
|
||||
|
||||
export function noticeAdd (params) {
|
||||
return request({
|
||||
url: noticeApi.add,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function noticeDel (params) {
|
||||
return request({
|
||||
url: noticeApi.del,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function noticeGet (params) {
|
||||
return request({
|
||||
url: noticeApi.get,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function noticePage (params) {
|
||||
return request({
|
||||
url: noticeApi.page,
|
||||
method: 'post',
|
||||
params: {pageSize: params.pageSize, pageNum: params.pageNum},
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function noticeRead (params) {
|
||||
return request({
|
||||
url: noticeApi.read,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function noticePagePerson (params) {
|
||||
return request({
|
||||
url: noticeApi.pagePerson,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function noticeCancel (params) {
|
||||
return request({
|
||||
url: noticeApi.cancel,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const orgApi = {
|
||||
add: 'sys/org/add',
|
||||
edit: 'sys/org/edit',
|
||||
del: 'sys/org/del',
|
||||
list: 'sys/org/list',
|
||||
page: 'sys/org/pageList',
|
||||
}
|
||||
|
||||
export function orgAdd (params) {
|
||||
return request({
|
||||
url: orgApi.add,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function orgEdit (params) {
|
||||
return request({
|
||||
url: orgApi.edit,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function orgDel (params) {
|
||||
return request({
|
||||
url: orgApi.del,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function orgList (params) {
|
||||
return request({
|
||||
url: orgApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function orgPage (params) {
|
||||
return request({
|
||||
url: orgApi.page,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,93 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const personApi = {
|
||||
addOrUpdate: 'person/addOrUpdate',
|
||||
del: 'person/del',
|
||||
get: 'person/get',
|
||||
page: 'person/pageList',
|
||||
transferOrg: 'person/transferOrg',
|
||||
quit: 'person/quit',
|
||||
resetPwd: 'person/resetPwd',
|
||||
setAdmin: 'person/setAdmin',
|
||||
changeLogPage: '/person/changeLog/pageList',
|
||||
exportList: '/person/exportList',
|
||||
importList: '/person/importList'
|
||||
}
|
||||
|
||||
export function personAddOrUpdate (params) {
|
||||
return request({
|
||||
url: personApi.addOrUpdate,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function personGet (params) {
|
||||
return request({
|
||||
url: personApi.get,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function personDel (params) {
|
||||
return request({
|
||||
url: personApi.del,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function personPage (params) {
|
||||
return request({
|
||||
url: personApi.page,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function personTransferOrg (params) {
|
||||
return request({
|
||||
url: personApi.transferOrg,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function personQuit (params) {
|
||||
return request({
|
||||
url: personApi.quit,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function personResetPwd (params) {
|
||||
return request({
|
||||
url: personApi.resetPwd,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function personSetAdmin (params) {
|
||||
return request({
|
||||
url: personApi.setAdmin,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function personChangeLogPage (params) {
|
||||
return request({
|
||||
url: personApi.changeLogPage,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function personExport (params) {
|
||||
return request({
|
||||
url: personApi.exportList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function personImport (params) {
|
||||
return request({
|
||||
url: personApi.importList,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const personOrgApi = {
|
||||
listByOrgId: 'person/org/listByOrgId',
|
||||
addPersonOrg: 'person/org/addPersonOrg',
|
||||
removePersonOrg: 'person/org/removePersonOrg'
|
||||
}
|
||||
|
||||
export function listPersonByOrgId(params) {
|
||||
return request({
|
||||
url: personOrgApi.listByOrgId,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function addPersonOrg(params) {
|
||||
return request({
|
||||
url: personOrgApi.addPersonOrg,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function removePersonOrg(params) {
|
||||
return request({
|
||||
url: personOrgApi.removePersonOrg,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const personRegisterApi = {
|
||||
page: 'person/register/pageList'
|
||||
}
|
||||
|
||||
export function personRegisterPage (params) {
|
||||
return request({
|
||||
url: personRegisterApi.page,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const personApi = {
|
||||
addOrUpdate: '/person/service/addOrUpdate',
|
||||
detail: '/person/service/detail',
|
||||
del: '/person/service/del',
|
||||
list: '/person/service/list'
|
||||
}
|
||||
|
||||
export function personServiceAddOrUpdate (params) {
|
||||
return request({
|
||||
url: personApi.addOrUpdate,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function personServiceDetail (params) {
|
||||
return request({
|
||||
url: personApi.detail,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function personServiceDel (params) {
|
||||
return request({
|
||||
url: personApi.del,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function personServicePage (params) {
|
||||
return request({
|
||||
url: personApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const personApi = {
|
||||
addOrUpdate: '/person/support/addOrUpdate',
|
||||
detail: '/person/support/detail',
|
||||
del: '/person/support/del',
|
||||
list: '/person/support/list'
|
||||
}
|
||||
|
||||
export function personAddOrUpdate (params) {
|
||||
return request({
|
||||
url: personApi.addOrUpdate,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function personDetail (params) {
|
||||
return request({
|
||||
url: personApi.detail,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function personDel (params) {
|
||||
return request({
|
||||
url: personApi.del,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function personPage (params) {
|
||||
return request({
|
||||
url: personApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const practiceApi = {
|
||||
get: 'practice/get',
|
||||
add: 'practice/add',
|
||||
del: 'practice/del',
|
||||
list: 'practice/list',
|
||||
collectionList: 'practice/collection/pageList', // 我的收藏列表
|
||||
recordList: 'practice/record/pageList', // 答题记录
|
||||
wrongList: 'practice/wrong/pageList', // 错题集
|
||||
startAnswer: 'practice/startAnswer', // 开始答题
|
||||
executeSubmit: 'practice/executeSubmit', // 练习交卷
|
||||
}
|
||||
|
||||
export function practiceExecuteSubmit(data) {
|
||||
return request({
|
||||
url: practiceApi.executeSubmit,
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function practiceStartAnswer(params) {
|
||||
return request({
|
||||
url: practiceApi.startAnswer,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function practiceCollectionPageList(params) {
|
||||
return request({
|
||||
url: practiceApi.collectionList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function practiceRecordPageList(params) {
|
||||
return request({
|
||||
url: practiceApi.recordList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function practiceWrongPageList(params) {
|
||||
return request({
|
||||
url: practiceApi.wrongList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function practiceAdd(params) {
|
||||
return request({
|
||||
url: practiceApi.add,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function practiceGet(params) {
|
||||
return request({
|
||||
url: practiceApi.getDict,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function practiceDel (params) {
|
||||
return request({
|
||||
url: practiceApi.del,
|
||||
method: 'delete',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function practiceList(params) {
|
||||
return request({
|
||||
url: practiceApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const answerApi = {
|
||||
answerViewReport: 'answer/viewReport', // 查看报告
|
||||
answerViewResolution: 'answer/viewResolution', // 查看解析
|
||||
collection: 'practice/collection', // 收藏
|
||||
collectionCancel: 'practice/cancel/collection' // 取消收藏
|
||||
}
|
||||
|
||||
export function answerViewReport (params) {
|
||||
return request({
|
||||
url: answerApi.answerViewReport,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqCollection (params) {
|
||||
return request({
|
||||
url: answerApi.collection,
|
||||
method: 'post',
|
||||
params: params,
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
export function reqCollectionCancel (params) {
|
||||
return request({
|
||||
url: answerApi.collectionCancel,
|
||||
method: 'get',
|
||||
params: params,
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
export function answerViewResolution (params) {
|
||||
return request({
|
||||
url: answerApi.answerViewResolution,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const classApi = {
|
||||
get: '/project/species/get',
|
||||
add: '/project/species/add',
|
||||
del: '/project/species/del',
|
||||
list: '/project/species/pageList'
|
||||
}
|
||||
|
||||
export function classAdd(params) {
|
||||
return request({
|
||||
url: classApi.add,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function classGet(params) {
|
||||
return request({
|
||||
url: classApi.getDict,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function classDel (params) {
|
||||
return request({
|
||||
url: classApi.del,
|
||||
method: 'delete',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function classList(params) {
|
||||
console.log("------------{}", params)
|
||||
return request({
|
||||
url: classApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,59 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const projectApi = {
|
||||
add: 'project/addOrUpdate',
|
||||
getDict: 'project/dict/get',
|
||||
list: 'project/pageList',
|
||||
get: 'project/get',
|
||||
del: 'project/del',
|
||||
projectCourseList: '',
|
||||
release: '/project/release',
|
||||
}
|
||||
|
||||
export function projectAdd(params) {
|
||||
return request({
|
||||
url: projectApi.add,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
export function projectDel(params) {
|
||||
return request({
|
||||
url: projectApi.del,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function dictGet(params) {
|
||||
return request({
|
||||
url: projectApi.getDict,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function getProjectList(params) {
|
||||
return request({
|
||||
url: projectApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export function getProjectDetail(params) {
|
||||
return request({
|
||||
url: projectApi.get,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function releaseProject(params) {
|
||||
return request({
|
||||
url: projectApi.release,
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const projectCourseApi = {
|
||||
// add: 'project/add',
|
||||
// getDict:'project/dict/get',
|
||||
// get: 'sys/menu/get',
|
||||
// update: 'sys/menu/update',
|
||||
// del: 'sys/menu/delete',
|
||||
// // updateStatus: 'sys/menu/updateStatus',
|
||||
// list: 'project/pageList',
|
||||
projectCourseList: '/project/course/list',
|
||||
courseList: '/project/course/listByCourseIds'
|
||||
}
|
||||
|
||||
/** 通过项目id查询 */
|
||||
export function getCourseList (params) {
|
||||
return request({
|
||||
url: projectCourseApi.projectCourseList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
/** 通过课程列表查询 */
|
||||
export function getCourseListByCourseIds (params) {
|
||||
return request({
|
||||
url: projectCourseApi.courseList,
|
||||
method: 'Post',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,56 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const terminalTrainApi = {
|
||||
edit: '/project/terminal/addOrUpdate',
|
||||
del: '/project/terminal/del',
|
||||
list: '/project/terminal/pageList',
|
||||
get: '/project/terminal/get',
|
||||
release: '/project/terminal/release', //发布项目
|
||||
}
|
||||
|
||||
export function terminalTrainEdit(params) {
|
||||
return request({
|
||||
url: terminalTrainApi.edit,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
export function terminalTrainDel(params) {
|
||||
return request({
|
||||
url: terminalTrainApi.del,
|
||||
method: 'delete',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function terminalTrainList(params) {
|
||||
console.log("terminalTrainList------------{}", params)
|
||||
return request({
|
||||
url: terminalTrainApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export function terminalTrainGet(params) {
|
||||
console.log("terminalTrainGet------------{}", params)
|
||||
return request({
|
||||
url: terminalTrainApi.get,
|
||||
method: 'get',
|
||||
params: {
|
||||
id: params,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// releaseTerminalTrain
|
||||
export function releaseTerminalTrain(params) {
|
||||
console.log("terminalTrainRelease------------{}", params)
|
||||
return request({
|
||||
url: terminalTrainApi.release,
|
||||
method: 'put',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const terminalTrainSignApi = {
|
||||
list: 'project/terminalTrain/list',
|
||||
|
||||
}
|
||||
|
||||
export function terminalTrainSignList(params) {
|
||||
// console.log("terminalTrainList------------{}", params)
|
||||
return request({
|
||||
url: terminalTrainSignApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const roomApi = {
|
||||
addOrUpdate: '/room/addOrUpdate',
|
||||
detail: '/room/detail',
|
||||
del: '/room/del',
|
||||
list: '/room/list',
|
||||
listAllRoom: '/room/listAllRoom',
|
||||
listAllBed: '/room/listAllBed',
|
||||
|
||||
}
|
||||
|
||||
export function roomAddOrUpdate (params) {
|
||||
return request({
|
||||
url: roomApi.addOrUpdate,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function roomDetail (params) {
|
||||
return request({
|
||||
url: roomApi.detail,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function roomDel (params) {
|
||||
return request({
|
||||
url: roomApi.del,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function roomPage (params) {
|
||||
return request({
|
||||
url: roomApi.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function roomListAll (params) {
|
||||
return request({
|
||||
url: roomApi.listAllRoom,
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
export function roomListAllBed (params) {
|
||||
return request({
|
||||
url: roomApi.listAllBed,
|
||||
method: 'post'
|
||||
})
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const roomCheckApi = {
|
||||
addOrUpdate: '/hospital/record/addOrUpdate',
|
||||
detail: '/hospital/record/detail',
|
||||
del: '/hospital/record/del',
|
||||
checkinList: '/hospital/record/checkin/list',
|
||||
checkoutList: '/hospital/record/checkout/list'
|
||||
}
|
||||
|
||||
export function roomCheckAddOrUpdate (params) {
|
||||
return request({
|
||||
url: roomCheckApi.addOrUpdate,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function roomCheckDetail (params) {
|
||||
return request({
|
||||
url: roomCheckApi.detail,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function roomCheckDel (params) {
|
||||
return request({
|
||||
url: roomCheckApi.del,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function roomCheckinList (params) {
|
||||
return request({
|
||||
url: roomCheckApi.checkinList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function roomCheckoutList (params) {
|
||||
return request({
|
||||
url: roomCheckApi.checkoutList,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
|
@ -9,7 +9,8 @@ const userApi = {
|
|||
page: '/sys/user/pageList',
|
||||
getInfo: '/sys/user/getInfo',
|
||||
ownRole: '/sys/user/ownRole',
|
||||
grantRole: '/sys/user/grantRole'
|
||||
grantRole: '/sys/user/grantRole',
|
||||
changePassword: '/sys/user/changePwd'
|
||||
}
|
||||
|
||||
const userPasswordApi = {
|
||||
|
@ -89,3 +90,10 @@ export function passwordReset (params) {
|
|||
params: params
|
||||
})
|
||||
}
|
||||
export function reqChangePassword (data) {
|
||||
return request({
|
||||
url: mycourseApi.changePassword,
|
||||
method: 'get',
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
const trainPlanAPI = {
|
||||
add: '/trainPlan/add',
|
||||
list: '/trainPlan/list',
|
||||
get: '/trainPlan/get',
|
||||
del: '/trainPlan/del'
|
||||
}
|
||||
|
||||
export function trainPlanAdd(params) {
|
||||
return request({
|
||||
url: trainPlanAPI.add,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
export function trainPlanList(params) {
|
||||
return request({
|
||||
url: trainPlanAPI.list,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function trainPlanGet(params) {
|
||||
return request({
|
||||
url: trainPlanAPI.get,
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function trainPlanDel(params) {
|
||||
return request({
|
||||
url: trainPlanAPI.del,
|
||||
method: 'delete',
|
||||
params: params
|
||||
})
|
||||
}
|
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 289 KiB |
|
@ -0,0 +1,98 @@
|
|||
// 颜色
|
||||
$colors: (
|
||||
"primary": #1A5CD7,
|
||||
"info-1": #4394e4,
|
||||
"info": #4b67af,
|
||||
"white": #ffffff,
|
||||
"light": #f9f9f9,
|
||||
"grey-1": #999999,
|
||||
"grey": #666666,
|
||||
"dark-1": #5f5f5f,
|
||||
"dark": #222222,
|
||||
"black-1": #171823,
|
||||
"black": #000000,
|
||||
"icon": #5cd9e8
|
||||
);
|
||||
|
||||
// 字体大小
|
||||
$base-font-size: 0.2rem;
|
||||
$font-sizes: (
|
||||
xxs: 0.1,
|
||||
//8px
|
||||
xs: 0.125,
|
||||
//10px
|
||||
sm: 0.2875,
|
||||
//12px
|
||||
md: 0.1625,
|
||||
//13px
|
||||
lg: 0.175,
|
||||
//14px
|
||||
xl: 0.2,
|
||||
//16px
|
||||
xxl: 0.225,
|
||||
//18px
|
||||
xxxl: 0.25 //20px,,,,
|
||||
);
|
||||
|
||||
// 宽高
|
||||
.w-100 {
|
||||
width: 100%;
|
||||
}
|
||||
.h-100 {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
//flex
|
||||
.d-flex {
|
||||
display: flex;
|
||||
}
|
||||
.flex-column {
|
||||
flex-direction: column;
|
||||
}
|
||||
.flex-wrap {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.flex-nowrap {
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
$flex-jc: (
|
||||
start: flex-start,
|
||||
end: flex-end,
|
||||
center: center,
|
||||
between: space-between,
|
||||
around: space-around,
|
||||
evenly: space-evenly,
|
||||
);
|
||||
|
||||
$flex-ai: (
|
||||
start: flex-start,
|
||||
end: flex-end,
|
||||
center: center,
|
||||
stretch: stretch,
|
||||
);
|
||||
|
||||
.flex-1 {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
//.mt-1 => margin top
|
||||
//spacing
|
||||
$spacing-types: (
|
||||
m: margin,
|
||||
p: padding,
|
||||
);
|
||||
$spacing-directions: (
|
||||
t: top,
|
||||
r: right,
|
||||
b: bottom,
|
||||
l: left,
|
||||
);
|
||||
$spacing-base-size: 0.5rem;
|
||||
$spacing-sizes: (
|
||||
0: 0,
|
||||
1: 0.5,
|
||||
2: 1,
|
||||
3: 1.5,
|
||||
4: 2,
|
||||
5: 2.5,
|
||||
);
|
|
@ -0,0 +1,145 @@
|
|||
#index {
|
||||
color: #d3d6dd;
|
||||
// color: #0f1325;
|
||||
width: 1920px;
|
||||
height: 1080px;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
transform-origin: left top;
|
||||
overflow: hidden;
|
||||
|
||||
.bg {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 16px 16px 0 16px;
|
||||
background-image: url("../../assets/pageBg.png");
|
||||
background-size: cover;
|
||||
background-position: center center;
|
||||
}
|
||||
|
||||
.host-body {
|
||||
.dv-dec-10,
|
||||
.dv-dec-10-s {
|
||||
width: 33.3%;
|
||||
height: 5px;
|
||||
}
|
||||
.dv-dec-10-s {
|
||||
transform: rotateY(180deg);
|
||||
}
|
||||
.dv-dec-8 {
|
||||
width: 200px;
|
||||
height: 50px;
|
||||
}
|
||||
.title {
|
||||
position: relative;
|
||||
width: 500px;
|
||||
text-align: center;
|
||||
background-size: cover;
|
||||
background-repeat: no-repeat;
|
||||
|
||||
.title-text {
|
||||
font-size: 24px;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 50%;
|
||||
transform: translate(-50%);
|
||||
}
|
||||
|
||||
.dv-dec-6 {
|
||||
position: absolute;
|
||||
bottom: -30px;
|
||||
left: 50%;
|
||||
width: 250px;
|
||||
height: 8px;
|
||||
transform: translate(-50%);
|
||||
}
|
||||
}
|
||||
|
||||
// 第二行
|
||||
.aside-width {
|
||||
width: 40%;
|
||||
}
|
||||
.react-r-s,
|
||||
.react-l-s {
|
||||
background-color: #0f1325;
|
||||
}
|
||||
|
||||
// 平行四边形
|
||||
.react-right {
|
||||
&.react-l-s {
|
||||
text-align: right;
|
||||
width: 500px;
|
||||
}
|
||||
font-size: 18px;
|
||||
width: 300px;
|
||||
line-height: 50px;
|
||||
text-align: center;
|
||||
transform: skewX(-45deg);
|
||||
|
||||
.react-after {
|
||||
position: absolute;
|
||||
right: -25px;
|
||||
top: 0;
|
||||
height: 50px;
|
||||
width: 50px;
|
||||
background-color: #0f1325;
|
||||
transform: skewX(45deg);
|
||||
}
|
||||
|
||||
.text {
|
||||
display: inline-block;
|
||||
transform: skewX(45deg);
|
||||
}
|
||||
}
|
||||
|
||||
.react-left {
|
||||
&.react-l-s {
|
||||
width: 500px;
|
||||
text-align: left;
|
||||
}
|
||||
font-size: 18px;
|
||||
width: 300px;
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
text-align: center;
|
||||
transform: skewX(45deg);
|
||||
background-color: #0f1325;
|
||||
|
||||
.react-left {
|
||||
position: absolute;
|
||||
left: -25px;
|
||||
top: 0;
|
||||
height: 50px;
|
||||
width: 50px;
|
||||
background-color: #0f1325;
|
||||
transform: skewX(-45deg);
|
||||
}
|
||||
|
||||
.text {
|
||||
display: inline-block;
|
||||
transform: skewX(-45deg);
|
||||
}
|
||||
}
|
||||
|
||||
.body-box {
|
||||
margin-top: 16px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
//下方区域的布局
|
||||
.content-box {
|
||||
display: grid;
|
||||
grid-template-columns: 2fr 3fr 5fr 3fr 2fr;
|
||||
}
|
||||
|
||||
// 底部数据
|
||||
.bottom-box {
|
||||
margin-top: 10px;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 50%);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,186 @@
|
|||
@import "./variables";
|
||||
|
||||
// 全局样式
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
outline: none;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
line-height: 1.2em;
|
||||
background-color: #f1f1f1;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #343440;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.clearfix {
|
||||
&::after {
|
||||
content: "";
|
||||
display: table;
|
||||
height: 0;
|
||||
line-height: 0;
|
||||
visibility: hidden;
|
||||
clear: both;
|
||||
}
|
||||
}
|
||||
|
||||
//浮动
|
||||
.float-r {
|
||||
float: right;
|
||||
}
|
||||
|
||||
//浮动
|
||||
.float-l {
|
||||
float: left;
|
||||
}
|
||||
|
||||
// 字体加粗
|
||||
.fw-b {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
//文章一行显示,多余省略号显示
|
||||
.title-item {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.bg-color-black {
|
||||
background-color: rgba(19, 25, 47, 0.6);
|
||||
}
|
||||
|
||||
.bg-color-blue {
|
||||
background-color: #1a5cd7;
|
||||
}
|
||||
|
||||
.colorBlack {
|
||||
color: #272727 !important;
|
||||
|
||||
&:hover {
|
||||
color: #272727 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.colorGrass {
|
||||
color: #33cea0;
|
||||
|
||||
&:hover {
|
||||
color: #33cea0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.colorRed {
|
||||
color: #ff5722;
|
||||
|
||||
&:hover {
|
||||
color: #ff5722 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.colorText {
|
||||
color: #d3d6dd !important;
|
||||
|
||||
&:hover {
|
||||
color: #d3d6dd !important;
|
||||
}
|
||||
}
|
||||
|
||||
.colorBlue {
|
||||
color: #257dff !important;
|
||||
|
||||
&:hover {
|
||||
color: #257dff !important;
|
||||
}
|
||||
}
|
||||
|
||||
//颜色
|
||||
@each $colorkey, $color in $colors {
|
||||
.text-#{$colorkey} {
|
||||
color: $color;
|
||||
}
|
||||
|
||||
.bg-#{$colorkey} {
|
||||
background-color: $color;
|
||||
}
|
||||
}
|
||||
|
||||
//对齐
|
||||
@each $var in (left, center, right) {
|
||||
.text-#{$var} {
|
||||
text-align: $var !important;
|
||||
}
|
||||
}
|
||||
|
||||
//flex
|
||||
@each $key, $value in $flex-jc {
|
||||
.jc-#{$key} {
|
||||
justify-content: $value;
|
||||
}
|
||||
}
|
||||
|
||||
@each $key, $value in $flex-ai {
|
||||
.ai-#{$key} {
|
||||
align-items: $value;
|
||||
}
|
||||
}
|
||||
|
||||
//字体
|
||||
@each $fontkey, $fontvalue in $font-sizes {
|
||||
.fs-#{$fontkey} {
|
||||
font-size: $fontvalue * $base-font-size;
|
||||
}
|
||||
}
|
||||
|
||||
//.mt-1 => margin top
|
||||
//spacing
|
||||
|
||||
@each $typekey, $type in $spacing-types {
|
||||
//.m-1
|
||||
@each $sizekey, $size in $spacing-sizes {
|
||||
.#{$typekey}-#{$sizekey} {
|
||||
#{$type}: $size * $spacing-base-size;
|
||||
}
|
||||
}
|
||||
|
||||
//.mx-1
|
||||
@each $sizekey, $size in $spacing-sizes {
|
||||
.#{$typekey}x-#{$sizekey} {
|
||||
#{$type}-left: $size * $spacing-base-size;
|
||||
#{$type}-right: $size * $spacing-base-size;
|
||||
}
|
||||
|
||||
.#{$typekey}y-#{$sizekey} {
|
||||
#{$type}-top: $size * $spacing-base-size;
|
||||
#{$type}-bottom: $size * $spacing-base-size;
|
||||
}
|
||||
}
|
||||
|
||||
//.mt-1
|
||||
@each $directionkey, $direction in $spacing-directions {
|
||||
@each $sizekey, $size in $spacing-sizes {
|
||||
.#{$typekey}#{$directionkey}-#{$sizekey} {
|
||||
#{$type}-#{$direction}: $size * $spacing-base-size;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.#{$typekey} {
|
||||
#{$type}: 0;
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.4 KiB |
|
@ -0,0 +1,66 @@
|
|||
<template>
|
||||
<div :id="id" :class="className" :style="{ height: height, width: width }" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import tdTheme from './theme.json' // 引入默认主题
|
||||
import '../map/fujian.js'
|
||||
|
||||
export default {
|
||||
name: 'echart',
|
||||
props: {
|
||||
className: {
|
||||
type: String,
|
||||
default: 'chart'
|
||||
},
|
||||
id: {
|
||||
type: String,
|
||||
default: 'chart'
|
||||
},
|
||||
width: {
|
||||
type: String,
|
||||
default: '100%'
|
||||
},
|
||||
height: {
|
||||
type: String,
|
||||
default: '2.5rem'
|
||||
},
|
||||
options: {
|
||||
type: Object,
|
||||
default: ()=>({})
|
||||
}
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
chart: null
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
options: {
|
||||
handler (options) {
|
||||
// 设置true清空echart缓存
|
||||
this.chart.setOption(options, true)
|
||||
},
|
||||
deep: true
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
this.$echarts.registerTheme('tdTheme', tdTheme); // 覆盖默认主题
|
||||
this.initChart();
|
||||
},
|
||||
beforeDestroy () {
|
||||
this.chart.dispose()
|
||||
this.chart = null
|
||||
},
|
||||
methods: {
|
||||
initChart () {
|
||||
// 初始化echart
|
||||
this.chart = this.$echarts.init(this.$el, 'tdTheme')
|
||||
this.chart.setOption(this.options, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
|
@ -0,0 +1,490 @@
|
|||
{
|
||||
"color": [
|
||||
"#2d8cf0",
|
||||
"#19be6b",
|
||||
"#ff9900",
|
||||
"#E46CBB",
|
||||
"#9A66E4",
|
||||
"#ed3f14"
|
||||
],
|
||||
"backgroundColor": "rgba(0,0,0,0)",
|
||||
"textStyle": {},
|
||||
"title": {
|
||||
"textStyle": {
|
||||
"color": "#516b91"
|
||||
},
|
||||
"subtextStyle": {
|
||||
"color": "#93b7e3"
|
||||
}
|
||||
},
|
||||
"line": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"borderWidth": "2"
|
||||
}
|
||||
},
|
||||
"lineStyle": {
|
||||
"normal": {
|
||||
"width": "2"
|
||||
}
|
||||
},
|
||||
"symbolSize": "6",
|
||||
"symbol": "emptyCircle",
|
||||
"smooth": true
|
||||
},
|
||||
"radar": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"borderWidth": "2"
|
||||
}
|
||||
},
|
||||
"lineStyle": {
|
||||
"normal": {
|
||||
"width": "2"
|
||||
}
|
||||
},
|
||||
"symbolSize": "6",
|
||||
"symbol": "emptyCircle",
|
||||
"smooth": true
|
||||
},
|
||||
"bar": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"barBorderWidth": 0,
|
||||
"barBorderColor": "#ccc"
|
||||
},
|
||||
"emphasis": {
|
||||
"barBorderWidth": 0,
|
||||
"barBorderColor": "#ccc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"pie": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
},
|
||||
"emphasis": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scatter": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
},
|
||||
"emphasis": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"boxplot": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
},
|
||||
"emphasis": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"parallel": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
},
|
||||
"emphasis": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sankey": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
},
|
||||
"emphasis": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"funnel": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
},
|
||||
"emphasis": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"gauge": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
},
|
||||
"emphasis": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"candlestick": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"color": "#edafda",
|
||||
"color0": "transparent",
|
||||
"borderColor": "#d680bc",
|
||||
"borderColor0": "#8fd3e8",
|
||||
"borderWidth": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"graph": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"borderWidth": 0,
|
||||
"borderColor": "#ccc"
|
||||
}
|
||||
},
|
||||
"lineStyle": {
|
||||
"normal": {
|
||||
"width": 1,
|
||||
"color": "#aaa"
|
||||
}
|
||||
},
|
||||
"symbolSize": "6",
|
||||
"symbol": "emptyCircle",
|
||||
"smooth": true,
|
||||
"color": [
|
||||
"#2d8cf0",
|
||||
"#19be6b",
|
||||
"#f5ae4a",
|
||||
"#9189d5",
|
||||
"#56cae2",
|
||||
"#cbb0e3"
|
||||
],
|
||||
"label": {
|
||||
"normal": {
|
||||
"textStyle": {
|
||||
"color": "#eee"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"map": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"areaColor": "#f3f3f3",
|
||||
"borderColor": "#516b91",
|
||||
"borderWidth": 0.5
|
||||
},
|
||||
"emphasis": {
|
||||
"areaColor": "rgba(165,231,240,1)",
|
||||
"borderColor": "#516b91",
|
||||
"borderWidth": 1
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"normal": {
|
||||
"textStyle": {
|
||||
"color": "#000"
|
||||
}
|
||||
},
|
||||
"emphasis": {
|
||||
"textStyle": {
|
||||
"color": "rgb(81,107,145)"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"geo": {
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"areaColor": "#f3f3f3",
|
||||
"borderColor": "#516b91",
|
||||
"borderWidth": 0.5
|
||||
},
|
||||
"emphasis": {
|
||||
"areaColor": "rgba(165,231,240,1)",
|
||||
"borderColor": "#516b91",
|
||||
"borderWidth": 1
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"normal": {
|
||||
"textStyle": {
|
||||
"color": "#000"
|
||||
}
|
||||
},
|
||||
"emphasis": {
|
||||
"textStyle": {
|
||||
"color": "rgb(81,107,145)"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"categoryAxis": {
|
||||
"axisLine": {
|
||||
"show": true,
|
||||
"lineStyle": {
|
||||
"color": "#cccccc"
|
||||
}
|
||||
},
|
||||
"axisTick": {
|
||||
"show": false,
|
||||
"lineStyle": {
|
||||
"color": "#333"
|
||||
}
|
||||
},
|
||||
"axisLabel": {
|
||||
"show": true,
|
||||
"textStyle": {
|
||||
"color": "#fff"
|
||||
}
|
||||
},
|
||||
"splitLine": {
|
||||
"show": false,
|
||||
"lineStyle": {
|
||||
"color": [
|
||||
"#eeeeee"
|
||||
]
|
||||
}
|
||||
},
|
||||
"splitArea": {
|
||||
"show": false,
|
||||
"areaStyle": {
|
||||
"color": [
|
||||
"rgba(250,250,250,0.05)",
|
||||
"rgba(200,200,200,0.02)"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"valueAxis": {
|
||||
"axisLine": {
|
||||
"show": true,
|
||||
"lineStyle": {
|
||||
"color": "#cccccc"
|
||||
}
|
||||
},
|
||||
"axisTick": {
|
||||
"show": false,
|
||||
"lineStyle": {
|
||||
"color": "#333"
|
||||
}
|
||||
},
|
||||
"axisLabel": {
|
||||
"show": true,
|
||||
"textStyle": {
|
||||
"color": "#fff"
|
||||
}
|
||||
},
|
||||
"splitLine": {
|
||||
"show": false,
|
||||
"lineStyle": {
|
||||
"color": [
|
||||
"#eeeeee"
|
||||
]
|
||||
}
|
||||
},
|
||||
"splitArea": {
|
||||
"show": false,
|
||||
"areaStyle": {
|
||||
"color": [
|
||||
"rgba(250,250,250,0.05)",
|
||||
"rgba(200,200,200,0.02)"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"logAxis": {
|
||||
"axisLine": {
|
||||
"show": true,
|
||||
"lineStyle": {
|
||||
"color": "#cccccc"
|
||||
}
|
||||
},
|
||||
"axisTick": {
|
||||
"show": false,
|
||||
"lineStyle": {
|
||||
"color": "#333"
|
||||
}
|
||||
},
|
||||
"axisLabel": {
|
||||
"show": true,
|
||||
"textStyle": {
|
||||
"color": "#999999"
|
||||
}
|
||||
},
|
||||
"splitLine": {
|
||||
"show": true,
|
||||
"lineStyle": {
|
||||
"color": [
|
||||
"#eeeeee"
|
||||
]
|
||||
}
|
||||
},
|
||||
"splitArea": {
|
||||
"show": false,
|
||||
"areaStyle": {
|
||||
"color": [
|
||||
"rgba(250,250,250,0.05)",
|
||||
"rgba(200,200,200,0.02)"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"timeAxis": {
|
||||
"axisLine": {
|
||||
"show": true,
|
||||
"lineStyle": {
|
||||
"color": "#cccccc"
|
||||
}
|
||||
},
|
||||
"axisTick": {
|
||||
"show": false,
|
||||
"lineStyle": {
|
||||
"color": "#333"
|
||||
}
|
||||
},
|
||||
"axisLabel": {
|
||||
"show": true,
|
||||
"textStyle": {
|
||||
"color": "#999999"
|
||||
}
|
||||
},
|
||||
"splitLine": {
|
||||
"show": true,
|
||||
"lineStyle": {
|
||||
"color": [
|
||||
"#eeeeee"
|
||||
]
|
||||
}
|
||||
},
|
||||
"splitArea": {
|
||||
"show": false,
|
||||
"areaStyle": {
|
||||
"color": [
|
||||
"rgba(250,250,250,0.05)",
|
||||
"rgba(200,200,200,0.02)"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"toolbox": {
|
||||
"iconStyle": {
|
||||
"normal": {
|
||||
"borderColor": "#999"
|
||||
},
|
||||
"emphasis": {
|
||||
"borderColor": "#666"
|
||||
}
|
||||
}
|
||||
},
|
||||
"legend": {
|
||||
"textStyle": {
|
||||
"color": "#fff"
|
||||
}
|
||||
},
|
||||
"tooltip": {
|
||||
"axisPointer": {
|
||||
"lineStyle": {
|
||||
"color": "#ccc",
|
||||
"width": 1
|
||||
},
|
||||
"crossStyle": {
|
||||
"color": "#ccc",
|
||||
"width": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"lineStyle": {
|
||||
"color": "#8fd3e8",
|
||||
"width": 1
|
||||
},
|
||||
"itemStyle": {
|
||||
"normal": {
|
||||
"color": "#8fd3e8",
|
||||
"borderWidth": 1
|
||||
},
|
||||
"emphasis": {
|
||||
"color": "#8fd3e8"
|
||||
}
|
||||
},
|
||||
"controlStyle": {
|
||||
"normal": {
|
||||
"color": "#8fd3e8",
|
||||
"borderColor": "#8fd3e8",
|
||||
"borderWidth": 0.5
|
||||
},
|
||||
"emphasis": {
|
||||
"color": "#8fd3e8",
|
||||
"borderColor": "#8fd3e8",
|
||||
"borderWidth": 0.5
|
||||
}
|
||||
},
|
||||
"checkpointStyle": {
|
||||
"color": "#8fd3e8",
|
||||
"borderColor": "rgba(138,124,168,0.37)"
|
||||
},
|
||||
"label": {
|
||||
"normal": {
|
||||
"textStyle": {
|
||||
"color": "#8fd3e8"
|
||||
}
|
||||
},
|
||||
"emphasis": {
|
||||
"textStyle": {
|
||||
"color": "#8fd3e8"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"visualMap": {
|
||||
"color": [
|
||||
"#516b91",
|
||||
"#59c4e6",
|
||||
"#a5e7f0"
|
||||
]
|
||||
},
|
||||
"dataZoom": {
|
||||
"backgroundColor": "rgba(0,0,0,0)",
|
||||
"dataBackgroundColor": "rgba(255,255,255,0.3)",
|
||||
"fillerColor": "rgba(167,183,204,0.4)",
|
||||
"handleColor": "#a7b7cc",
|
||||
"handleSize": "100%",
|
||||
"textStyle": {
|
||||
"color": "#333"
|
||||
}
|
||||
},
|
||||
"markPoint": {
|
||||
"label": {
|
||||
"normal": {
|
||||
"textStyle": {
|
||||
"color": "#eee"
|
||||
}
|
||||
},
|
||||
"emphasis": {
|
||||
"textStyle": {
|
||||
"color": "#eee"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,176 @@
|
|||
<template>
|
||||
<div>
|
||||
<div class="dynamic-wrap" :style="{ maxHeight: wrapHeight + 'px' }">
|
||||
<div v-for="item in keysList" :key="item">
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="6">
|
||||
<a-form-item label="id" v-show="false" >
|
||||
<a-input
|
||||
placeholder="id"
|
||||
v-decorator="[
|
||||
`${title}Id[${item}]`,
|
||||
{
|
||||
initialValue: arr[item] ? arr[item].id : undefined
|
||||
}
|
||||
]"
|
||||
/>
|
||||
</a-form-item>
|
||||
<a-form-item label="姓名" :labelCol="{span: 8}" :wrapperCol="{span: 16}">
|
||||
<a-input
|
||||
placeholder="请填写姓名"
|
||||
v-decorator="[
|
||||
`${title}FamilyName[${item}]`,
|
||||
{
|
||||
initialValue: arr[item] ? arr[item].familyName : undefined
|
||||
// ,rules: [{ required: true, message: '请填写名称!' }]
|
||||
}
|
||||
]"
|
||||
/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="4">
|
||||
<a-form-item label="关系" :labelCol="{span: 6}" :wrapperCol="{span: 16}">
|
||||
<a-input
|
||||
placeholder="请填写关系"
|
||||
v-decorator="[
|
||||
`${title}Relation[${item}]`,
|
||||
{
|
||||
initialValue: arr[item] ? arr[item].relation : undefined
|
||||
}
|
||||
]"
|
||||
/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-form-item label="联系方式" :labelCol="{span: 8}" :wrapperCol="{span: 16}">
|
||||
<a-input
|
||||
placeholder="请填写联系方式"
|
||||
v-decorator="[
|
||||
`${title}Phone[${item}]`,
|
||||
{
|
||||
initialValue: arr[item] ? arr[item].phone : undefined
|
||||
}
|
||||
]" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-form-item label="工作单位" :labelCol="{span: 8}" :wrapperCol="{span: 16}">
|
||||
<a-input
|
||||
placeholder="请填写工作单位"
|
||||
v-decorator="[
|
||||
`${title}WorkInfo[${item}]`,
|
||||
{
|
||||
initialValue: arr[item] ? arr[item].workInfo : undefined
|
||||
}
|
||||
]" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="2" style="padding-left: 0px">
|
||||
<a-form-item :labelCol="{span: 0}" :wrapperCol="{span: 24}">
|
||||
<template >
|
||||
<a-button type="dashed" icon="minus" @click="removeRow(item)" class="minusRowBtn"></a-button>
|
||||
</template>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</div>
|
||||
<a-button type="dashed" icon="plus" @click="addRow" class="addRowBtn">
|
||||
新增一行
|
||||
</a-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'DynamicForm',
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
wrapHeight: { // 表单容器的高度
|
||||
type: Number,
|
||||
default: 120
|
||||
},
|
||||
arr: {
|
||||
type: Array,
|
||||
default: function () {
|
||||
return []
|
||||
}
|
||||
}
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
id: 0,
|
||||
keysList: []
|
||||
}
|
||||
},
|
||||
created () {
|
||||
this.form = this.$form.createForm(this)
|
||||
this.init()
|
||||
},
|
||||
methods: {
|
||||
// 初始化
|
||||
init () {
|
||||
console.log(this.arr.length)
|
||||
const arr = [0]
|
||||
if (this.arr.length !== 0) {
|
||||
for (let i = 1; i < (this.arr).length; i++) {
|
||||
arr.push(i)
|
||||
this.id = this.id + 1
|
||||
}
|
||||
}
|
||||
this.keysList = arr
|
||||
},
|
||||
// 移除某行
|
||||
removeRow (k) {
|
||||
/*
|
||||
if (this.keysList.length === 0) { // 如果存在可以移除所有行的情况,把条件改为this.keysList.length === 0即可
|
||||
return
|
||||
} */
|
||||
this.keysList = this.keysList.filter(item => item !== k)
|
||||
console.log(this.keysList)
|
||||
},
|
||||
// 新增一行
|
||||
addRow () {
|
||||
this.id = this.id + 1
|
||||
this.keysList = this.keysList.concat(this.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.dynamic-wrap {
|
||||
padding-top: 10px;
|
||||
background-color: white;
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
&::-webkit-scrollbar {
|
||||
width: 7px;
|
||||
}
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background: #d8d8d8;
|
||||
border-radius: 10px;
|
||||
}
|
||||
&::-webkit-scrollbar-track-piece {
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
.minusRowBtn {
|
||||
color: #f5222d;
|
||||
background: #fff1f0;
|
||||
border-color: #ffa39e;
|
||||
padding-right: 7px;
|
||||
padding-left: 7px;
|
||||
height: 29px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
.addRowBtn {
|
||||
width: 70%;
|
||||
color: #1890ff;
|
||||
border-color: #91d5ff;
|
||||
margin: 0px 0px 20px 70px;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,151 @@
|
|||
<template>
|
||||
<div>
|
||||
<div class="dynamic-wrap" :style="{ maxHeight: wrapHeight + 'px' }">
|
||||
<div v-for="item in keysList" :key="item">
|
||||
<a-row :gutter="24">
|
||||
<a-col :span="10">
|
||||
<a-form-item label="id" v-show="false" >
|
||||
<a-input
|
||||
placeholder="id"
|
||||
v-decorator="[
|
||||
`${title}Id[${item}]`,
|
||||
{
|
||||
initialValue: arr[item] ? arr[item].id : undefined
|
||||
}
|
||||
]"
|
||||
/>
|
||||
</a-form-item>
|
||||
<a-form-item label="床位名称" :labelCol="{span: 8}" :wrapperCol="{span: 16}">
|
||||
<a-input
|
||||
placeholder="请填写床位名称"
|
||||
v-decorator="[
|
||||
`${title}Name[${item}]`,
|
||||
{
|
||||
initialValue: arr[item] ? arr[item].name : undefined
|
||||
// ,rules: [{ required: true, message: '请填写名称!' }]
|
||||
}
|
||||
]"
|
||||
/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="10">
|
||||
<a-form-item label="备注" :labelCol="{span: 6}" :wrapperCol="{span: 16}">
|
||||
<a-input
|
||||
placeholder="请填写备注"
|
||||
v-decorator="[
|
||||
`${title}Remark[${item}]`,
|
||||
{
|
||||
initialValue: arr[item] ? arr[item].remark : undefined
|
||||
}
|
||||
]"
|
||||
/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="2" style="padding-left: 0px">
|
||||
<a-form-item :labelCol="{span: 0}" :wrapperCol="{span: 24}">
|
||||
<template >
|
||||
<a-button type="dashed" icon="minus" @click="removeRow(item)" class="minusRowBtn"></a-button>
|
||||
</template>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</div>
|
||||
<a-button type="dashed" icon="plus" @click="addRow" class="addRowBtn">
|
||||
新增一行
|
||||
</a-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'DynamicFormRoom',
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
wrapHeight: { // 表单容器的高度
|
||||
type: Number,
|
||||
default: 120
|
||||
},
|
||||
arr: {
|
||||
type: Array,
|
||||
default: function () {
|
||||
return []
|
||||
}
|
||||
}
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
id: 0,
|
||||
keysList: []
|
||||
}
|
||||
},
|
||||
created () {
|
||||
this.form = this.$form.createForm(this)
|
||||
this.init()
|
||||
},
|
||||
methods: {
|
||||
// 初始化
|
||||
init () {
|
||||
const arr = [0]
|
||||
if (this.arr.length !== 0) {
|
||||
for (let i = 1; i < (this.arr).length; i++) {
|
||||
arr.push(i)
|
||||
this.id = this.id + 1
|
||||
}
|
||||
}
|
||||
this.keysList = arr
|
||||
},
|
||||
// 移除某行
|
||||
removeRow (k) {
|
||||
/*
|
||||
if (this.keysList.length === 0) { // 如果存在可以移除所有行的情况,把条件改为this.keysList.length === 0即可
|
||||
return
|
||||
} */
|
||||
this.keysList = this.keysList.filter(item => item !== k)
|
||||
console.log(this.keysList)
|
||||
},
|
||||
// 新增一行
|
||||
addRow () {
|
||||
this.id = this.id + 1
|
||||
this.keysList = this.keysList.concat(this.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.dynamic-wrap {
|
||||
padding-top: 10px;
|
||||
background-color: white;
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
&::-webkit-scrollbar {
|
||||
width: 7px;
|
||||
}
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background: #d8d8d8;
|
||||
border-radius: 10px;
|
||||
}
|
||||
&::-webkit-scrollbar-track-piece {
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
.minusRowBtn {
|
||||
color: #f5222d;
|
||||
background: #fff1f0;
|
||||
border-color: #ffa39e;
|
||||
padding-right: 7px;
|
||||
padding-left: 7px;
|
||||
height: 29px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
.addRowBtn {
|
||||
width: 70%;
|
||||
color: #1890ff;
|
||||
border-color: #91d5ff;
|
||||
margin: 0px 0px 20px 70px;
|
||||
}
|
||||
</style>
|
|
@ -20,6 +20,7 @@
|
|||
:customRequest="uploadFile"
|
||||
:remove="handlerRemove"
|
||||
@preview="handlePreview"
|
||||
:disabled="disabled"
|
||||
>
|
||||
<div v-if="max>value.length">
|
||||
<a-icon type="plus" />
|
||||
|
@ -38,7 +39,7 @@
|
|||
<script>
|
||||
import _ from 'lodash'
|
||||
import { reqUploadFile, reqUploadImg } from '@/api/sys/upload'
|
||||
function getBase64(file) {
|
||||
function getBase64 (file) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const reader = new FileReader()
|
||||
reader.readAsDataURL(file)
|
||||
|
@ -60,7 +61,7 @@ export default {
|
|||
// 最大上传数量
|
||||
max: {
|
||||
type: [Number, String],
|
||||
default: 2 // 默认不做限制
|
||||
default: 999 // 默认不做限制
|
||||
},
|
||||
// [{name: '必传', uid: '必传', url: '必传'}]
|
||||
value: {
|
||||
|
@ -72,26 +73,30 @@ export default {
|
|||
default: 'image/*' // 默认只能上传图片,如果需要上传其他请改为*或者自己需要的格式
|
||||
},
|
||||
// 有默认值的数字
|
||||
fileSize:{
|
||||
type:[Number, String],
|
||||
default:500
|
||||
fileSize: {
|
||||
type: [Number, String],
|
||||
default: 500
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
model: {
|
||||
prop: 'value',
|
||||
event: 'change'
|
||||
},
|
||||
data() {
|
||||
data () {
|
||||
return {
|
||||
previewVisible: false,
|
||||
previewImage: ''
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleCancel() {
|
||||
handleCancel () {
|
||||
this.previewVisible = false
|
||||
},
|
||||
async handlePreview(file) {
|
||||
async handlePreview (file) {
|
||||
if (!file.url && !file.preview) {
|
||||
file.preview = await getBase64(file.originFileObj)
|
||||
}
|
||||
|
@ -99,13 +104,14 @@ export default {
|
|||
this.previewVisible = true
|
||||
},
|
||||
// 重写上传文件
|
||||
uploadFile(data) {
|
||||
uploadFile (data) {
|
||||
const { max } = this
|
||||
const { type } = this
|
||||
const formData = new FormData()
|
||||
formData.append('file', data.file)
|
||||
if (type == 'img') {
|
||||
formData.append('fileSize', this.fileSize)
|
||||
// 不指定压缩尺寸
|
||||
// formData.append('fileSize', this.fileSize)
|
||||
reqUploadImg(formData).then(res => {
|
||||
if (res.code === 200) {
|
||||
const file = {
|
||||
|
@ -142,7 +148,7 @@ export default {
|
|||
}
|
||||
},
|
||||
// 点击删除
|
||||
handlerRemove(file) {
|
||||
handlerRemove (file) {
|
||||
const index = _.findIndex(this.value, ['uid', file.uid])
|
||||
const newFileList = this.value.slice()
|
||||
newFileList.splice(index, 1)
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
<!-- 作者:cgd 邮箱:349008059@qq.com 时间:2022年02月24日 16:54:58 -->
|
||||
<template>
|
||||
<a-modal
|
||||
title="修改密码"
|
||||
|
@ -13,7 +12,7 @@
|
|||
size="large"
|
||||
type="text"
|
||||
placeholder="用户名"
|
||||
:value="$store.state.user.person.userName"
|
||||
:value="$store.state.user.person.name"
|
||||
disabled
|
||||
></a-input>
|
||||
</a-form-item>
|
||||
|
|
|
@ -0,0 +1,150 @@
|
|||
<template>
|
||||
<div>
|
||||
<!-- 年度开工率 -->
|
||||
<Echart
|
||||
:options="options"
|
||||
id="bottomLeftChart"
|
||||
height="480px"
|
||||
width="100%"
|
||||
></Echart>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Echart from '@/common/echart'
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
options: {},
|
||||
};
|
||||
},
|
||||
components: {
|
||||
Echart,
|
||||
},
|
||||
props: {
|
||||
cdata: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
cdata: {
|
||||
handler (newData) {
|
||||
this.options = {
|
||||
tooltip: {
|
||||
trigger: "axis",
|
||||
backgroundColor: "rgba(255,255,255,0.1)",
|
||||
axisPointer: {
|
||||
type: "shadow",
|
||||
label: {
|
||||
show: true,
|
||||
backgroundColor: "#7B7DDC"
|
||||
}
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
data: ["已贯通", "计划贯通", "贯通率"],
|
||||
textStyle: {
|
||||
color: "#B4B4B4"
|
||||
},
|
||||
top: "0%"
|
||||
},
|
||||
grid: {
|
||||
x: "8%",
|
||||
width: "88%",
|
||||
y: "4%"
|
||||
},
|
||||
xAxis: {
|
||||
data: newData.category,
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: "#B4B4B4"
|
||||
}
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
}
|
||||
},
|
||||
yAxis: [
|
||||
{
|
||||
splitLine: { show: false },
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: "#B4B4B4"
|
||||
}
|
||||
},
|
||||
|
||||
axisLabel: {
|
||||
formatter: "{value} "
|
||||
}
|
||||
},
|
||||
{
|
||||
splitLine: { show: false },
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: "#B4B4B4"
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
formatter: "{value} "
|
||||
}
|
||||
}
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: "贯通率",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
showAllSymbol: true,
|
||||
symbol: "emptyCircle",
|
||||
symbolSize: 8,
|
||||
yAxisIndex: 1,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: "#F02FC2"
|
||||
}
|
||||
},
|
||||
data: newData.rateData
|
||||
},
|
||||
{
|
||||
name: "已贯通",
|
||||
type: "bar",
|
||||
barWidth: 10,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
barBorderRadius: 5,
|
||||
color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "#956FD4" },
|
||||
{ offset: 1, color: "#3EACE5" }
|
||||
])
|
||||
}
|
||||
},
|
||||
data: newData.barData
|
||||
},
|
||||
{
|
||||
name: "计划贯通",
|
||||
type: "bar",
|
||||
barGap: "-100%",
|
||||
barWidth: 10,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
barBorderRadius: 5,
|
||||
color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "rgba(156,107,211,0.8)" },
|
||||
{ offset: 0.2, color: "rgba(156,107,211,0.5)" },
|
||||
{ offset: 1, color: "rgba(156,107,211,0.2)" }
|
||||
])
|
||||
}
|
||||
},
|
||||
z: -12,
|
||||
data: newData.lineData
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
immediate: true,
|
||||
deep: true
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,141 @@
|
|||
<template>
|
||||
<div>
|
||||
<Chart :cdata="cdata" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Chart from './chart.vue'
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
cdata: {
|
||||
category: [
|
||||
"市区",
|
||||
"万州",
|
||||
"江北",
|
||||
"南岸",
|
||||
"北碚",
|
||||
"綦南",
|
||||
"长寿",
|
||||
"永川",
|
||||
"璧山",
|
||||
"江津",
|
||||
"城口",
|
||||
"大足",
|
||||
"垫江",
|
||||
"丰都",
|
||||
"奉节",
|
||||
"合川",
|
||||
"江津区",
|
||||
"开州",
|
||||
"南川",
|
||||
"彭水",
|
||||
"黔江",
|
||||
"石柱",
|
||||
"铜梁",
|
||||
"潼南",
|
||||
"巫山",
|
||||
"巫溪",
|
||||
"武隆",
|
||||
"秀山",
|
||||
"酉阳",
|
||||
"云阳",
|
||||
"忠县",
|
||||
"川东",
|
||||
"检修"
|
||||
],
|
||||
lineData: [
|
||||
18092,
|
||||
20728,
|
||||
24045,
|
||||
28348,
|
||||
32808,
|
||||
36097,
|
||||
39867,
|
||||
44715,
|
||||
48444,
|
||||
50415,
|
||||
56061,
|
||||
62677,
|
||||
59521,
|
||||
67560,
|
||||
18092,
|
||||
20728,
|
||||
24045,
|
||||
28348,
|
||||
32808,
|
||||
36097,
|
||||
39867,
|
||||
44715,
|
||||
48444,
|
||||
50415,
|
||||
36097,
|
||||
39867,
|
||||
44715,
|
||||
48444,
|
||||
50415,
|
||||
50061,
|
||||
32677,
|
||||
49521,
|
||||
32808
|
||||
],
|
||||
barData: [
|
||||
4600,
|
||||
5000,
|
||||
5500,
|
||||
6500,
|
||||
7500,
|
||||
8500,
|
||||
9900,
|
||||
12500,
|
||||
14000,
|
||||
21500,
|
||||
23200,
|
||||
24450,
|
||||
25250,
|
||||
33300,
|
||||
4600,
|
||||
5000,
|
||||
5500,
|
||||
6500,
|
||||
7500,
|
||||
8500,
|
||||
9900,
|
||||
22500,
|
||||
14000,
|
||||
21500,
|
||||
8500,
|
||||
9900,
|
||||
12500,
|
||||
14000,
|
||||
21500,
|
||||
23200,
|
||||
24450,
|
||||
25250,
|
||||
7500
|
||||
],
|
||||
rateData: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
Chart,
|
||||
},
|
||||
mounted () {
|
||||
this.setData();
|
||||
},
|
||||
methods: {
|
||||
// 根据自己的业务情况修改
|
||||
setData () {
|
||||
for (let i = 0; i < this.cdata.barData.length -1; i++) {
|
||||
let rate = this.cdata.barData[i] / this.cdata.lineData[i];
|
||||
this.cdata.rateData.push(rate.toFixed(2));
|
||||
}
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
|
@ -0,0 +1,358 @@
|
|||
<template>
|
||||
<div>
|
||||
<Echart
|
||||
:options="options"
|
||||
id="centreLeft1Chart"
|
||||
height="480px"
|
||||
width="100%"
|
||||
></Echart>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Echart from '@/common/echart'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
options: {},
|
||||
// 定义颜色
|
||||
colorList: {
|
||||
linearYtoG: {
|
||||
type: 'linear',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 1,
|
||||
y2: 1,
|
||||
colorStops: [
|
||||
{
|
||||
offset: 0,
|
||||
color: '#f5b44d'
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: '#28f8de'
|
||||
}
|
||||
]
|
||||
},
|
||||
linearGtoB: {
|
||||
type: 'linear',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 1,
|
||||
y2: 0,
|
||||
colorStops: [
|
||||
{
|
||||
offset: 0,
|
||||
color: '#43dfa2'
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: '#28f8de'
|
||||
}
|
||||
]
|
||||
},
|
||||
linearBtoG: {
|
||||
type: 'linear',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 1,
|
||||
y2: 0,
|
||||
colorStops: [
|
||||
{
|
||||
offset: 0,
|
||||
color: '#1c98e8'
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: '#28f8de'
|
||||
}
|
||||
]
|
||||
},
|
||||
areaBtoG: {
|
||||
type: 'linear',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 1,
|
||||
colorStops: [
|
||||
{
|
||||
offset: 0,
|
||||
color: 'rgba(35,184,210,.2)'
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: 'rgba(35,184,210,0)'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
components: {
|
||||
Echart
|
||||
},
|
||||
props: {
|
||||
cdata: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
cdata: {
|
||||
handler(newData) {
|
||||
this.options = {
|
||||
title: {
|
||||
text: '',
|
||||
textStyle: {
|
||||
color: '#D3D6DD',
|
||||
fontSize: 24,
|
||||
fontWeight: 'normal'
|
||||
},
|
||||
subtext: newData.year + '/' + newData.weekCategory[6],
|
||||
subtextStyle: {
|
||||
color: '#fff',
|
||||
fontSize: 16
|
||||
},
|
||||
top: 50,
|
||||
left: 80
|
||||
},
|
||||
legend: {
|
||||
top: 120,
|
||||
left: 80,
|
||||
orient: 'vertical',
|
||||
itemGap: 15,
|
||||
itemWidth: 12,
|
||||
itemHeight: 12,
|
||||
data: ['平均指标', '我的指标'],
|
||||
textStyle: {
|
||||
color: '#fff',
|
||||
fontSize: 14
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'item'
|
||||
},
|
||||
radar: {
|
||||
center: ['68%', '27%'],
|
||||
radius: '40%',
|
||||
name: {
|
||||
color: '#fff'
|
||||
},
|
||||
splitNumber: 8,
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: this.colorList.linearYtoG,
|
||||
opacity: 0.6
|
||||
}
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: this.colorList.linearYtoG,
|
||||
opacity: 0.6
|
||||
}
|
||||
},
|
||||
splitArea: {
|
||||
areaStyle: {
|
||||
color: '#fff',
|
||||
opacity: 0.1,
|
||||
shadowBlur: 25,
|
||||
shadowColor: '#000',
|
||||
shadowOffsetX: 0,
|
||||
shadowOffsetY: 5
|
||||
}
|
||||
},
|
||||
indicator: [
|
||||
{
|
||||
name: '服务态度',
|
||||
max: newData.maxData
|
||||
},
|
||||
{
|
||||
name: '产品质量',
|
||||
max: 10
|
||||
},
|
||||
{
|
||||
name: '任务效率',
|
||||
max: 12
|
||||
},
|
||||
{
|
||||
name: '售后保障',
|
||||
max: 3.5
|
||||
}
|
||||
]
|
||||
},
|
||||
grid: {
|
||||
left: 90,
|
||||
right: 80,
|
||||
bottom: 40,
|
||||
top: '60%'
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
position: 'bottom',
|
||||
axisLine: true,
|
||||
axisLabel: {
|
||||
color: 'rgba(255,255,255,.8)',
|
||||
fontSize: 12
|
||||
},
|
||||
data: newData.weekCategory
|
||||
},
|
||||
// 下方Y轴
|
||||
yAxis: {
|
||||
name: '工单',
|
||||
nameLocation: 'end',
|
||||
nameGap: 24,
|
||||
nameTextStyle: {
|
||||
color: 'rgba(255,255,255,.5)',
|
||||
fontSize: 14
|
||||
},
|
||||
max: newData.maxData,
|
||||
splitNumber: 4,
|
||||
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
opacity: 0
|
||||
}
|
||||
},
|
||||
splitLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#fff',
|
||||
opacity: 0.1
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
color: 'rgba(255,255,255,.8)',
|
||||
fontSize: 12
|
||||
}
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '',
|
||||
type: 'radar',
|
||||
symbolSize: 0,
|
||||
data: [
|
||||
{
|
||||
value: newData.radarDataAvg[6],
|
||||
name: '平均指标',
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: '#f8d351'
|
||||
}
|
||||
},
|
||||
lineStyle: {
|
||||
normal: {
|
||||
opacity: 0
|
||||
}
|
||||
},
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: '#f8d351',
|
||||
shadowBlur: 25,
|
||||
shadowColor: 'rgba(248,211,81,.3)',
|
||||
shadowOffsetX: 0,
|
||||
shadowOffsetY: -10,
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
value: newData.radarData[6],
|
||||
name: '我的指标',
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: '#43dfa2'
|
||||
}
|
||||
},
|
||||
lineStyle: {
|
||||
normal: {
|
||||
opacity: 0
|
||||
}
|
||||
},
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: this.colorList.linearGtoB,
|
||||
shadowBlur: 15,
|
||||
shadowColor: 'rgba(0,0,0,.2)',
|
||||
shadowOffsetX: 0,
|
||||
shadowOffsetY: 5,
|
||||
opacity: 0.8
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: '',
|
||||
type: 'line',
|
||||
smooth: true,
|
||||
symbol: 'emptyCircle',
|
||||
symbolSize: 8,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: '#fff'
|
||||
}
|
||||
},
|
||||
lineStyle: {
|
||||
normal: {
|
||||
color: this.colorList.linearBtoG,
|
||||
width: 3
|
||||
}
|
||||
},
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: this.colorList.areaBtoG
|
||||
}
|
||||
},
|
||||
data: newData.weekLineData,
|
||||
lineSmooth: true,
|
||||
markLine: {
|
||||
silent: true,
|
||||
data: [
|
||||
{
|
||||
type: 'average',
|
||||
name: '平均值'
|
||||
}
|
||||
],
|
||||
precision: 0,
|
||||
label: {
|
||||
normal: {
|
||||
formatter: '平均值: \n {c}'
|
||||
}
|
||||
},
|
||||
lineStyle: {
|
||||
normal: {
|
||||
color: 'rgba(248,211,81,.7)'
|
||||
}
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
position: 'top',
|
||||
formatter: '{c} m',
|
||||
backgroundColor: 'rgba(28,152,232,.2)',
|
||||
padding: 6
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '占位背景',
|
||||
type: 'bar',
|
||||
itemStyle: {
|
||||
normal: {
|
||||
show: true,
|
||||
color: '#000',
|
||||
opacity: 0
|
||||
}
|
||||
},
|
||||
silent: true,
|
||||
barWidth: '50%',
|
||||
data: newData.weekMaxData,
|
||||
animation: false
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
immediate: true,
|
||||
deep: true
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,89 @@
|
|||
<template>
|
||||
<div>
|
||||
<Chart :cdata="cdata" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Chart from './chart.vue'
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
drawTiming: null,
|
||||
cdata: {
|
||||
year: null,
|
||||
weekCategory: [],
|
||||
radarData: [],
|
||||
radarDataAvg: [],
|
||||
maxData: 12000,
|
||||
weekMaxData: [],
|
||||
weekLineData: []
|
||||
}
|
||||
}
|
||||
},
|
||||
components: {
|
||||
Chart,
|
||||
},
|
||||
mounted () {
|
||||
this.drawTimingFn();
|
||||
},
|
||||
beforeDestroy () {
|
||||
clearInterval(this.drawTiming);
|
||||
},
|
||||
methods: {
|
||||
drawTimingFn () {
|
||||
this.setData();
|
||||
this.drawTiming = setInterval(() => {
|
||||
this.setData();
|
||||
}, 6000);
|
||||
},
|
||||
setData () {
|
||||
// 清空轮询数据
|
||||
this.cdata.weekCategory = [];
|
||||
this.cdata.weekMaxData = [];
|
||||
this.cdata.weekLineData = [];
|
||||
this.cdata.radarData = [];
|
||||
this.cdata.radarDataAvg = [];
|
||||
|
||||
let dateBase = new Date();
|
||||
this.cdata.year = dateBase.getFullYear();
|
||||
// 周数据
|
||||
for (let i = 0; i < 7; i++) {
|
||||
// 日期
|
||||
let date = new Date();
|
||||
this.cdata.weekCategory.unshift([date.getMonth() + 1, date.getDate()-i].join("/"));
|
||||
|
||||
// 折线图数据
|
||||
this.cdata.weekMaxData.push(this.cdata.maxData);
|
||||
let distance = Math.round(Math.random() * 11000 + 500);
|
||||
this.cdata.weekLineData.push(distance);
|
||||
|
||||
// 雷达图数据
|
||||
// 我的指标
|
||||
let averageSpeed = +(Math.random() * 5 + 3).toFixed(3);
|
||||
let maxSpeed = averageSpeed + +(Math.random() * 3).toFixed(2);
|
||||
let hour = +(distance / 1000 / averageSpeed).toFixed(1);
|
||||
let radarDayData = [distance, averageSpeed, maxSpeed, hour];
|
||||
this.cdata.radarData.unshift(radarDayData);
|
||||
|
||||
// 平均指标
|
||||
let distanceAvg = Math.round(Math.random() * 8000 + 4000);
|
||||
let averageSpeedAvg = +(Math.random() * 4 + 4).toFixed(3);
|
||||
let maxSpeedAvg = averageSpeedAvg + +(Math.random() * 2).toFixed(2);
|
||||
let hourAvg = +(distance / 1000 / averageSpeed).toFixed(1);
|
||||
let radarDayDataAvg = [
|
||||
distanceAvg,
|
||||
averageSpeedAvg,
|
||||
maxSpeedAvg,
|
||||
hourAvg
|
||||
];
|
||||
this.cdata.radarDataAvg.unshift(radarDayDataAvg);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
|
@ -0,0 +1,104 @@
|
|||
<template>
|
||||
<div>
|
||||
<!-- 通过率/达标率 -->
|
||||
<Echart
|
||||
:options="options"
|
||||
:id="id"
|
||||
height="100px"
|
||||
width="100px"
|
||||
></Echart>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Echart from '@/common/echart'
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
options: {},
|
||||
};
|
||||
},
|
||||
components: {
|
||||
Echart,
|
||||
},
|
||||
props: {
|
||||
id: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: "chartRate"
|
||||
},
|
||||
tips: {
|
||||
type: Number,
|
||||
required: true,
|
||||
default: 50
|
||||
},
|
||||
colorObj: {
|
||||
type: Object,
|
||||
default: function () {
|
||||
return {
|
||||
textStyle: "#3fc0fb",
|
||||
series: {
|
||||
color: ["#00bcd44a", "transparent"],
|
||||
dataColor: {
|
||||
normal: "#03a9f4",
|
||||
shadowColor: "#97e2f5"
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
// tips 是会变更的数据,所以进行监听
|
||||
tips: {
|
||||
handler (newData) {
|
||||
this.options = {
|
||||
title:{
|
||||
text: newData * 1 + "%",
|
||||
x: "center",
|
||||
y: "center",
|
||||
textStyle: {
|
||||
color: this.colorObj.textStyle,
|
||||
fontSize: 16
|
||||
}
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: "pie",
|
||||
radius: ["75%", "80%"],
|
||||
center: ["50%", "50%"],
|
||||
hoverAnimation: false,
|
||||
color: this.colorObj.series.color,
|
||||
label: {
|
||||
normal: {
|
||||
show: false
|
||||
}
|
||||
},
|
||||
data: [
|
||||
{
|
||||
value: newData,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: this.colorObj.series.dataColor.normal,
|
||||
shadowBlur: 10,
|
||||
shadowColor: this.colorObj.series.dataColor.shadowColor
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
value: 100 - newData
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
immediate: true,
|
||||
deep: true
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
|
@ -0,0 +1,81 @@
|
|||
<template>
|
||||
<div>
|
||||
<Echart
|
||||
:options="options"
|
||||
id="centreLeft1Chart"
|
||||
height="220px"
|
||||
width="260px"
|
||||
></Echart>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Echart from '@/common/echart'
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
options: {},
|
||||
};
|
||||
},
|
||||
components: {
|
||||
Echart,
|
||||
},
|
||||
props: {
|
||||
cdata: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
cdata: {
|
||||
handler (newData) {
|
||||
this.options = {
|
||||
color: [
|
||||
"#37a2da",
|
||||
"#32c5e9",
|
||||
"#9fe6b8",
|
||||
"#ffdb5c",
|
||||
"#ff9f7f",
|
||||
"#fb7293",
|
||||
"#e7bcf3",
|
||||
"#8378ea"
|
||||
],
|
||||
tooltip: {
|
||||
trigger: "item",
|
||||
formatter: "{a} <br/>{b} : {c} ({d}%)"
|
||||
},
|
||||
toolbox: {
|
||||
show: true
|
||||
},
|
||||
calculable: true,
|
||||
legend: {
|
||||
orient: "horizontal",
|
||||
icon: "circle",
|
||||
bottom: 0,
|
||||
x: "center",
|
||||
data: newData.xData,
|
||||
textStyle: {
|
||||
color: "#fff"
|
||||
}
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "通过率统计",
|
||||
type: "pie",
|
||||
radius: [10, 50],
|
||||
roseType: "area",
|
||||
center: ["50%", "40%"],
|
||||
data: newData.seriesData
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
immediate: true,
|
||||
deep: true
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
|
@ -0,0 +1,36 @@
|
|||
<template>
|
||||
<div>
|
||||
<Chart :cdata="cdata" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Chart from './chart.vue';
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
cdata: {
|
||||
xData: ["data1", "data2", "data3", "data4", "data5", "data6"],
|
||||
seriesData: [
|
||||
{ value: 10, name: "data1" },
|
||||
{ value: 5, name: "data2" },
|
||||
{ value: 15, name: "data3" },
|
||||
{ value: 25, name: "data4" },
|
||||
{ value: 20, name: "data5" },
|
||||
{ value: 35, name: "data6" }
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
components: {
|
||||
Chart,
|
||||
},
|
||||
mounted () {
|
||||
},
|
||||
methods: {
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
|
@ -0,0 +1,290 @@
|
|||
<template>
|
||||
<div>
|
||||
<Echart
|
||||
id="centreLeft2Chart"
|
||||
ref="centreLeft2ChartRef"
|
||||
:options="options"
|
||||
height="360px"
|
||||
width="330px"
|
||||
></Echart>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Echart from '@/common/echart';
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
options: {},
|
||||
};
|
||||
},
|
||||
components: {
|
||||
Echart,
|
||||
},
|
||||
props: {
|
||||
cdata: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
cdata: {
|
||||
handler(newData) {
|
||||
// 设置点的位置(经纬度)
|
||||
const geoCoordMap = {
|
||||
厦门市: [118.11022, 24.490474, 20],
|
||||
福州市: [119.206239, 26.275302, 20],
|
||||
泉州市: [118.589421, 24.908853, 20],
|
||||
漳州市: [117.561801, 24.510897, 20],
|
||||
龙岩市: [116.82978, 25.391603, 20],
|
||||
莆田市: [119.007558, 25.591011, 20],
|
||||
三明市: [117.435001, 26.465444, 20],
|
||||
南平市: [118.178459, 27.535627, 20],
|
||||
宁德市: [119.527082, 27.15924, 20],
|
||||
};
|
||||
let seriesData = [
|
||||
{
|
||||
name: '厦门市',
|
||||
},
|
||||
{
|
||||
name: '福州市',
|
||||
},
|
||||
{
|
||||
name: '泉州市',
|
||||
},
|
||||
{
|
||||
name: '漳州市',
|
||||
},
|
||||
{
|
||||
name: '龙岩市',
|
||||
},
|
||||
{
|
||||
name: '莆田市',
|
||||
},
|
||||
{
|
||||
name: '三明市',
|
||||
},
|
||||
{
|
||||
name: '南平市',
|
||||
},
|
||||
{
|
||||
name: '宁德市',
|
||||
},
|
||||
];
|
||||
let convertData = function (data) {
|
||||
let scatterData = [];
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var geoCoord = geoCoordMap[data[i].name];
|
||||
if (geoCoord) {
|
||||
scatterData.push({
|
||||
name: data[i].name,
|
||||
value: geoCoord.concat(data[i].value),
|
||||
});
|
||||
}
|
||||
}
|
||||
return scatterData;
|
||||
};
|
||||
this.options = {
|
||||
showLegendSymbol: true,
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
textStyle: {
|
||||
fontSize: 14,
|
||||
lineHeight: 22,
|
||||
},
|
||||
position: point => {
|
||||
// 固定在顶部
|
||||
return [point[0] + 50, point[1] - 20];
|
||||
},
|
||||
// 如果需要自定义 tooltip样式,需要使用formatter
|
||||
/*
|
||||
formatter: params => {
|
||||
return `<div style=""> ... </div>`
|
||||
}
|
||||
*/
|
||||
},
|
||||
visualMap: {
|
||||
min: 0,
|
||||
max: 10,
|
||||
show: false,
|
||||
seriesIndex: 0,
|
||||
// 颜色
|
||||
inRange: {
|
||||
color: ['rgba(41,166,206, .5)', 'rgba(69,117,245, .9)'],
|
||||
},
|
||||
},
|
||||
// 底部背景
|
||||
geo: {
|
||||
show: true,
|
||||
aspectScale: 0.85, //长宽比
|
||||
zoom: 1.2,
|
||||
top: '10%',
|
||||
left: '16%',
|
||||
map: '福建',
|
||||
roam: false,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
areaColor: 'rgba(0,0,0,0)',
|
||||
shadowColor: 'rgba(7,114,204, .8)',
|
||||
shadowOffsetX: 5,
|
||||
shadowOffsetY: 5,
|
||||
},
|
||||
emphasis: {
|
||||
areaColor: '#00aeef',
|
||||
},
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '相关指数',
|
||||
type: 'map',
|
||||
aspectScale: 0.85, //长宽比
|
||||
zoom: 1.2,
|
||||
mapType: '福建', // 自定义扩展图表类型
|
||||
top: '10%',
|
||||
left: '16%',
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: 'red',
|
||||
areaColor: 'rgba(19,54,162, .5)',
|
||||
borderColor: 'rgba(0,242,252,.3)',
|
||||
borderWidth: 1,
|
||||
shadowBlur: 7,
|
||||
shadowColor: '#00f2fc',
|
||||
},
|
||||
emphasis: {
|
||||
areaColor: '#4f7fff',
|
||||
borderColor: 'rgba(0,242,252,.6)',
|
||||
borderWidth: 2,
|
||||
shadowBlur: 10,
|
||||
shadowColor: '#00f2fc',
|
||||
},
|
||||
},
|
||||
label: {
|
||||
formatter: params => `${params.name}`,
|
||||
show: true,
|
||||
position: 'insideRight',
|
||||
textStyle: {
|
||||
fontSize: 14,
|
||||
color: '#efefef',
|
||||
},
|
||||
emphasis: {
|
||||
textStyle: {
|
||||
color: '#fff',
|
||||
},
|
||||
},
|
||||
},
|
||||
data: newData,
|
||||
},
|
||||
{
|
||||
type: 'effectScatter',
|
||||
coordinateSystem: 'geo',
|
||||
symbolSize: 7,
|
||||
effectType: 'ripple',
|
||||
legendHoverLink: false,
|
||||
showEffectOn: 'render',
|
||||
rippleEffect: {
|
||||
period: 4,
|
||||
scale: 2.5,
|
||||
brushType: 'stroke',
|
||||
},
|
||||
zlevel: 1,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: '#99FBFE',
|
||||
shadowBlur: 5,
|
||||
shadowColor: '#fff',
|
||||
},
|
||||
},
|
||||
data: convertData(seriesData),
|
||||
},
|
||||
],
|
||||
};
|
||||
// 重新选择区域
|
||||
this.handleMapRandomSelect();
|
||||
},
|
||||
immediate: true,
|
||||
deep: true,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
// 开启定时器
|
||||
startInterval() {
|
||||
const _self = this;
|
||||
// 应通过接口获取配置时间,暂时写死5s
|
||||
const time = 2000;
|
||||
if (this.intervalId !== null) {
|
||||
clearInterval(this.intervalId);
|
||||
}
|
||||
this.intervalId = setInterval(() => {
|
||||
_self.reSelectMapRandomArea();
|
||||
}, time);
|
||||
},
|
||||
// 重新随机选中地图区域
|
||||
reSelectMapRandomArea() {
|
||||
const length = 9;
|
||||
this.$nextTick(() => {
|
||||
try {
|
||||
const map = this.$refs.centreLeft2ChartRef.chart;
|
||||
let index = Math.floor(Math.random() * length);
|
||||
while (index === this.preSelectMapIndex || index >= length) {
|
||||
index = Math.floor(Math.random() * length);
|
||||
}
|
||||
map.dispatchAction({
|
||||
type: 'mapUnSelect',
|
||||
seriesIndex: 0,
|
||||
dataIndex: this.preSelectMapIndex,
|
||||
});
|
||||
map.dispatchAction({
|
||||
type: 'showTip',
|
||||
seriesIndex: 0,
|
||||
dataIndex: index,
|
||||
});
|
||||
map.dispatchAction({
|
||||
type: 'mapSelect',
|
||||
seriesIndex: 0,
|
||||
dataIndex: index,
|
||||
});
|
||||
this.preSelectMapIndex = index;
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
},
|
||||
handleMapRandomSelect() {
|
||||
this.$nextTick(() => {
|
||||
try {
|
||||
const map = this.$refs.centreLeft2ChartRef.chart;
|
||||
const _self = this;
|
||||
setTimeout(() => {
|
||||
_self.reSelectMapRandomArea();
|
||||
}, 0);
|
||||
// 移入区域,清除定时器、取消之前选中并选中当前
|
||||
map.on('mouseover', function (params) {
|
||||
clearInterval(_self.intervalId);
|
||||
map.dispatchAction({
|
||||
type: 'mapUnSelect',
|
||||
seriesIndex: 0,
|
||||
dataIndex: _self.preSelectMapIndex,
|
||||
});
|
||||
map.dispatchAction({
|
||||
type: 'mapSelect',
|
||||
seriesIndex: 0,
|
||||
dataIndex: params.dataIndex,
|
||||
});
|
||||
_self.preSelectMapIndex = params.dataIndex;
|
||||
});
|
||||
// 移出区域重新随机选中地图区域,并开启定时器
|
||||
map.on('globalout', function () {
|
||||
_self.reSelectMapRandomArea();
|
||||
_self.startInterval();
|
||||
});
|
||||
this.startInterval();
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,67 @@
|
|||
<template>
|
||||
<div>
|
||||
<Chart :cdata="cdata" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Chart from './chart.vue';
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
cdata: [
|
||||
{
|
||||
// 名字需要与 “common/map/fujian.js” 地图数据文件里面定义的一一对应,不能是 “福州” 或者 “闽” 之类的缩写
|
||||
name: '福州市',
|
||||
value: 10,
|
||||
elseData:{
|
||||
// 这里放置地图 tooltip 里想显示的数据
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '厦门市',
|
||||
value: 9,
|
||||
},
|
||||
{
|
||||
name: '漳州市',
|
||||
value: 8,
|
||||
},
|
||||
{
|
||||
name: '泉州市',
|
||||
value: 7,
|
||||
},
|
||||
{
|
||||
name: '三明市',
|
||||
value: 6,
|
||||
},
|
||||
{
|
||||
name: '莆田市',
|
||||
value: 5,
|
||||
},
|
||||
{
|
||||
name: '南平市',
|
||||
value: 4,
|
||||
},
|
||||
{
|
||||
name: '龙岩市',
|
||||
value: 3,
|
||||
},
|
||||
{
|
||||
name: '宁德市',
|
||||
value: 2,
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
components: {
|
||||
Chart,
|
||||
},
|
||||
mounted () {
|
||||
},
|
||||
methods: {
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
|
@ -0,0 +1,132 @@
|
|||
<template>
|
||||
<div>
|
||||
<Echart
|
||||
:options="options"
|
||||
id="centreRight2Chart1"
|
||||
height="200px"
|
||||
width="260px"
|
||||
></Echart>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Echart from '@/common/echart'
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
options: {},
|
||||
};
|
||||
},
|
||||
components: {
|
||||
Echart,
|
||||
},
|
||||
props: {
|
||||
cdata: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
cdata: {
|
||||
handler (newData) {
|
||||
// 固定样式数据
|
||||
let lineStyle = {
|
||||
normal: {
|
||||
width: 1,
|
||||
opacity: 0.5
|
||||
}
|
||||
};
|
||||
|
||||
this.options = {
|
||||
radar: {
|
||||
indicator: newData.indicatorData,
|
||||
shape: "circle",
|
||||
splitNumber: 5,
|
||||
radius: ["0%", "65%"],
|
||||
name: {
|
||||
textStyle: {
|
||||
color: "rgb(238, 197, 102)"
|
||||
}
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: [
|
||||
"rgba(238, 197, 102, 0.1)",
|
||||
"rgba(238, 197, 102, 0.2)",
|
||||
"rgba(238, 197, 102, 0.4)",
|
||||
"rgba(238, 197, 102, 0.6)",
|
||||
"rgba(238, 197, 102, 0.8)",
|
||||
"rgba(238, 197, 102, 1)"
|
||||
].reverse()
|
||||
}
|
||||
},
|
||||
splitArea: {
|
||||
show: false
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: "rgba(238, 197, 102, 0.5)"
|
||||
}
|
||||
}
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "北京",
|
||||
type: "radar",
|
||||
lineStyle: lineStyle,
|
||||
data: newData.dataBJ,
|
||||
symbol: "none",
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: "#F9713C"
|
||||
}
|
||||
},
|
||||
areaStyle: {
|
||||
normal: {
|
||||
opacity: 0.1
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "上海",
|
||||
type: "radar",
|
||||
lineStyle: lineStyle,
|
||||
data: newData.dataSH,
|
||||
symbol: "none",
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: "#B3E4A1"
|
||||
}
|
||||
},
|
||||
areaStyle: {
|
||||
normal: {
|
||||
opacity: 0.05
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "广州",
|
||||
type: "radar",
|
||||
lineStyle: lineStyle,
|
||||
data: newData.dataGZ,
|
||||
symbol: "none",
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: "rgb(238, 197, 102)"
|
||||
}
|
||||
},
|
||||
areaStyle: {
|
||||
normal: {
|
||||
opacity: 0.05
|
||||
}
|
||||
}
|
||||
} //end
|
||||
]
|
||||
}
|
||||
},
|
||||
immediate: true,
|
||||
deep: true
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,55 @@
|
|||
<template>
|
||||
<div>
|
||||
<Chart :cdata="cdata" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Chart from './chart.vue';
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
cdata: {
|
||||
indicatorData: [
|
||||
{ name: "data1", max: 300 },
|
||||
{ name: "data2", max: 250 },
|
||||
{ name: "data3", max: 300 },
|
||||
{ name: "data4", max: 5},
|
||||
{ name: "data5", max: 200 },
|
||||
{ name: "data6", max: 100 }
|
||||
],
|
||||
dataBJ: [
|
||||
[94, 69, 114, 2.08, 73, 39, 22],
|
||||
[99, 73, 110, 2.43, 76, 48, 23],
|
||||
[31, 12, 30, 0.5, 32, 16, 24],
|
||||
[42, 27, 43, 1, 53, 22, 25],
|
||||
[154, 117, 157, 3.05, 92, 58, 26],
|
||||
[234, 185, 230, 4.09, 123, 69, 27],
|
||||
[160, 120, 186, 2.77, 91, 50, 28]
|
||||
],
|
||||
dataGZ: [
|
||||
[84, 94, 140, 2.238, 68, 18, 22],
|
||||
[93, 77, 104, 1.165, 53, 7, 23],
|
||||
[99, 130, 227, 3.97, 55, 15, 24],
|
||||
[146, 84, 139, 1.094, 40, 17, 25],
|
||||
[113, 108, 137, 1.481, 48, 15, 26],
|
||||
[81, 48, 62, 1.619, 26, 3, 27],
|
||||
[56, 48, 68, 1.336, 37, 9, 28]
|
||||
],
|
||||
dataSH: [
|
||||
[91, 45, 125, 0.82, 34, 23, 1],
|
||||
[65, 27, 78, 0.86, 45, 29, 2],
|
||||
[83, 60, 84, 1.09, 73, 27, 3],
|
||||
[109, 81, 121, 1.28, 68, 51, 4],
|
||||
[106, 77, 114, 1.07, 55, 51, 5],
|
||||
[109, 81, 121, 1.28, 68, 51, 6],
|
||||
[106, 77, 114, 1.07, 55, 51, 7]
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
components: {
|
||||
Chart,
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -12,7 +12,7 @@
|
|||
*
|
||||
*/
|
||||
export default {
|
||||
navTheme: 'light', // theme for nav menu
|
||||
navTheme: 'dark', // theme for nav menu
|
||||
primaryColor: '#1890ff', // primary color of ant design
|
||||
layout: 'sidemenu', // nav menu position: `sidemenu` or `topmenu`
|
||||
contentWidth: 'Fluid', // layout of content: `Fluid` or `Fixed`, only works when layout is topmenu
|
||||
|
@ -22,7 +22,7 @@ export default {
|
|||
menu: {
|
||||
locale: true
|
||||
},
|
||||
title: '安全培训平台',
|
||||
title: '下堡坪乡农村福利院长者信息管理系统',
|
||||
pwa: false,
|
||||
iconfontUrl: '',
|
||||
production: process.env.NODE_ENV === 'production' && process.env.VUE_APP_PREVIEW !== 'true'
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// eslint-disable-next-line
|
||||
import { UserLayout, BasicLayout, RouteView } from '@/layouts';
|
||||
import { UserLayout, BasicLayout, RouteView, BigScreenLayout } from '@/layouts';
|
||||
import { bxAnaalyse } from '@/core/icons'
|
||||
|
||||
export const asyncRouterMap = [
|
||||
|
@ -72,6 +72,24 @@ export const constantRouterMap = [
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
path: '/screen',
|
||||
component: BigScreenLayout,
|
||||
redirect: '/screen/data2',
|
||||
hidden: true,
|
||||
children: [
|
||||
{
|
||||
path: 'data2',
|
||||
name: 'data2',
|
||||
component: () => import( '@/views/bigScreen/index')
|
||||
},
|
||||
{
|
||||
path: 'data3',
|
||||
name: 'data3',
|
||||
component: () => import( '@/views/index/welcome')
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
path: '/404',
|
||||
component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404')
|
||||
|
|
|
@ -49,7 +49,8 @@ import {
|
|||
Transfer,
|
||||
Tree,
|
||||
Empty,
|
||||
TreeSelect
|
||||
TreeSelect,
|
||||
Carousel
|
||||
} from 'ant-design-vue'
|
||||
import Viser from 'viser-vue'
|
||||
|
||||
|
@ -107,6 +108,7 @@ Vue.use(Tree)
|
|||
Vue.use(Transfer)
|
||||
Vue.use(Empty)
|
||||
Vue.use(TreeSelect)
|
||||
Vue.use(Carousel)
|
||||
|
||||
Vue.prototype.$confirm = Modal.confirm
|
||||
Vue.prototype.$message = message
|
||||
|
|
|
@ -1,22 +1,9 @@
|
|||
<template>
|
||||
<pro-layout
|
||||
:title="title"
|
||||
:menus="menus"
|
||||
:collapsed="collapsed"
|
||||
:mediaQuery="query"
|
||||
:isMobile="isMobile"
|
||||
:handleMediaQuery="handleMediaQuery"
|
||||
:handleCollapse="handleCollapse"
|
||||
:logo="logoRender"
|
||||
:i18nRender="i18nRender"
|
||||
v-bind="settings"
|
||||
>
|
||||
<pro-layout :title="title" :menus="menus" :collapsed="collapsed" :mediaQuery="query" :isMobile="isMobile"
|
||||
:handleMediaQuery="handleMediaQuery" :handleCollapse="handleCollapse" :logo="logoRender" :i18nRender="i18nRender"
|
||||
v-bind="settings">
|
||||
<template v-slot:rightContentRender>
|
||||
<right-content
|
||||
:top-menu="settings.layout === 'topmenu'"
|
||||
:is-mobile="isMobile"
|
||||
:theme="settings.theme"
|
||||
/>
|
||||
<right-content :top-menu="settings.layout === 'topmenu'" :is-mobile="isMobile" :theme="settings.theme" />
|
||||
</template>
|
||||
<!-- <template v-slot:footerRender>
|
||||
<global-footer />
|
||||
|
@ -26,126 +13,143 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import { i18nRender } from '@/locales'
|
||||
import { mapState } from 'vuex'
|
||||
import { SIDEBAR_TYPE, TOGGLE_MOBILE_TYPE } from '@/store/mutation-types'
|
||||
import {
|
||||
i18nRender
|
||||
} from '@/locales'
|
||||
import {
|
||||
mapState
|
||||
} from 'vuex'
|
||||
import {
|
||||
SIDEBAR_TYPE,
|
||||
TOGGLE_MOBILE_TYPE
|
||||
} from '@/store/mutation-types'
|
||||
|
||||
import defaultSettings from '@/config/defaultSettings'
|
||||
import RightContent from '@/components/GlobalHeader/RightContent'
|
||||
import GlobalFooter from '@/components/GlobalFooter'
|
||||
import LogoSvg from '../assets/logo.svg?inline'
|
||||
import defaultSettings from '@/config/defaultSettings'
|
||||
import RightContent from '@/components/GlobalHeader/RightContent'
|
||||
import GlobalFooter from '@/components/GlobalFooter'
|
||||
import LogoSvg from '../assets/logo.svg?inline'
|
||||
|
||||
export default {
|
||||
name: 'BasicLayout',
|
||||
components: {
|
||||
RightContent,
|
||||
GlobalFooter
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
// base
|
||||
menus: [],
|
||||
// 侧栏收起状态
|
||||
collapsed: false,
|
||||
title: defaultSettings.title,
|
||||
// settings: {
|
||||
// // 布局类型
|
||||
// layout: defaultSettings.layout, // 'sidemenu', 'topmenu'
|
||||
// // 定宽: true / 流式: false
|
||||
// contentWidth: defaultSettings.layout === 'sidemenu' ? false : defaultSettings.contentWidth === 'Fixed',
|
||||
// // 主题 'dark' | 'light'
|
||||
// theme: defaultSettings.navTheme,
|
||||
// // 主色调
|
||||
// primaryColor: defaultSettings.primaryColor,
|
||||
// fixedHeader: defaultSettings.fixedHeader,
|
||||
// fixSiderbar: defaultSettings.fixSiderbar,
|
||||
// colorWeak: defaultSettings.colorWeak,
|
||||
// hideHintAlert: false,
|
||||
// hideCopyButton: false
|
||||
// },
|
||||
// 媒体查询
|
||||
query: {},
|
||||
// 是否手机模式
|
||||
isMobile: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
// 动态主路由
|
||||
mainMenu: state => state.permission.addRouters,
|
||||
currentRole: state => state.user.currentRole
|
||||
}),
|
||||
settings: function () {
|
||||
const code = this.currentRole && this.currentRole.code
|
||||
export default {
|
||||
name: 'BasicLayout',
|
||||
components: {
|
||||
RightContent,
|
||||
GlobalFooter
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
// 布局类型
|
||||
layout: code === 'student' ? 'topmenu' : defaultSettings.layout, // 'sidemenu', 'topmenu'
|
||||
// 定宽: true / 流式: false
|
||||
contentWidth: code === 'student' ? true : (defaultSettings.layout === 'sidemenu' ? false : defaultSettings.contentWidth === 'Fixed'),
|
||||
// 主题 'dark' | 'light'
|
||||
theme: defaultSettings.navTheme,
|
||||
// 主色调
|
||||
primaryColor: defaultSettings.primaryColor,
|
||||
fixedHeader: defaultSettings.fixedHeader,
|
||||
fixSiderbar: defaultSettings.fixSiderbar,
|
||||
colorWeak: defaultSettings.colorWeak,
|
||||
hideHintAlert: false,
|
||||
hideCopyButton: false
|
||||
// base
|
||||
menus: [],
|
||||
// 侧栏收起状态
|
||||
collapsed: false,
|
||||
title: defaultSettings.title,
|
||||
// settings: {
|
||||
// // 布局类型
|
||||
// layout: defaultSettings.layout, // 'sidemenu', 'topmenu'
|
||||
// // 定宽: true / 流式: false
|
||||
// contentWidth: defaultSettings.layout === 'sidemenu' ? false : defaultSettings.contentWidth === 'Fixed',
|
||||
// // 主题 'dark' | 'light'
|
||||
// theme: defaultSettings.navTheme,
|
||||
// // 主色调
|
||||
// primaryColor: defaultSettings.primaryColor,
|
||||
// fixedHeader: defaultSettings.fixedHeader,
|
||||
// fixSiderbar: defaultSettings.fixSiderbar,
|
||||
// colorWeak: defaultSettings.colorWeak,
|
||||
// hideHintAlert: false,
|
||||
// hideCopyButton: false
|
||||
// },
|
||||
// 媒体查询
|
||||
query: {},
|
||||
// 是否手机模式
|
||||
isMobile: false
|
||||
}
|
||||
}
|
||||
},
|
||||
created () {
|
||||
const routes = this.mainMenu.find(item => item.path === '/')
|
||||
this.menus = (routes && routes.children) || []
|
||||
// 处理侧栏收起状态
|
||||
this.$watch('collapsed', () => {
|
||||
this.$store.commit(SIDEBAR_TYPE, this.collapsed)
|
||||
})
|
||||
this.$watch('isMobile', () => {
|
||||
this.$store.commit(TOGGLE_MOBILE_TYPE, this.isMobile)
|
||||
})
|
||||
},
|
||||
mounted () {
|
||||
const userAgent = navigator.userAgent
|
||||
if (userAgent.indexOf('Edge') > -1) {
|
||||
this.$nextTick(() => {
|
||||
this.collapsed = !this.collapsed
|
||||
setTimeout(() => {
|
||||
this.collapsed = !this.collapsed
|
||||
}, 16)
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
// 动态主路由
|
||||
mainMenu: state => state.permission.addRouters,
|
||||
currentRole: state => state.user.currentRole
|
||||
}),
|
||||
settings: function() {
|
||||
const code = this.currentRole && this.currentRole.code
|
||||
return {
|
||||
// 布局类型
|
||||
layout: code === 'student' ? 'topmenu' : defaultSettings.layout, // 'sidemenu', 'topmenu'
|
||||
// 定宽: true / 流式: false
|
||||
contentWidth: code === 'student' ? true : (defaultSettings.layout === 'sidemenu' ? false : defaultSettings.contentWidth ===
|
||||
'Fixed'),
|
||||
// 主题 'dark' | 'light'
|
||||
theme: defaultSettings.navTheme,
|
||||
// 主色调
|
||||
primaryColor: defaultSettings.primaryColor,
|
||||
fixedHeader: defaultSettings.fixedHeader,
|
||||
fixSiderbar: defaultSettings.fixSiderbar,
|
||||
colorWeak: defaultSettings.colorWeak,
|
||||
hideHintAlert: false,
|
||||
hideCopyButton: false
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
const routes = this.mainMenu.find(item => item.path === '/')
|
||||
this.menus = (routes && routes.children) || []
|
||||
// 处理侧栏收起状态
|
||||
this.$watch('collapsed', () => {
|
||||
this.$store.commit(SIDEBAR_TYPE, this.collapsed)
|
||||
})
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
i18nRender,
|
||||
handleMediaQuery (val) {
|
||||
this.query = val
|
||||
if (this.isMobile && !val['screen-xs']) {
|
||||
this.isMobile = false
|
||||
return
|
||||
}
|
||||
if (!this.isMobile && val['screen-xs']) {
|
||||
this.isMobile = true
|
||||
this.collapsed = false
|
||||
this.settings.contentWidth = false
|
||||
// this.settings.fixSiderbar = false
|
||||
this.$watch('isMobile', () => {
|
||||
this.$store.commit(TOGGLE_MOBILE_TYPE, this.isMobile)
|
||||
})
|
||||
},
|
||||
mounted() {
|
||||
const userAgent = navigator.userAgent
|
||||
if (userAgent.indexOf('Edge') > -1) {
|
||||
this.$nextTick(() => {
|
||||
this.collapsed = !this.collapsed
|
||||
setTimeout(() => {
|
||||
this.collapsed = !this.collapsed
|
||||
}, 16)
|
||||
})
|
||||
}
|
||||
},
|
||||
handleCollapse (val) {
|
||||
this.collapsed = val
|
||||
},
|
||||
logoRender () {
|
||||
return <LogoSvg />
|
||||
methods: {
|
||||
i18nRender,
|
||||
handleMediaQuery(val) {
|
||||
this.query = val
|
||||
if (this.isMobile && !val['screen-xs']) {
|
||||
this.isMobile = false
|
||||
return
|
||||
}
|
||||
if (!this.isMobile && val['screen-xs']) {
|
||||
this.isMobile = true
|
||||
this.collapsed = false
|
||||
this.settings.contentWidth = false
|
||||
// this.settings.fixSiderbar = false
|
||||
}
|
||||
},
|
||||
handleCollapse(val) {
|
||||
this.collapsed = val
|
||||
},
|
||||
logoRender() {
|
||||
return <LogoSvg / >
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less">
|
||||
@import './BasicLayout.less';
|
||||
@import './BasicLayout.less';
|
||||
|
||||
/*隐藏原本的图标*/
|
||||
.ant-pro-global-header-trigger {
|
||||
display: none;
|
||||
}
|
||||
/*隐藏原本的图标*/
|
||||
.ant-pro-global-header-trigger {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ant-pro-sider-menu-logo h1 {
|
||||
max-width: 80%;
|
||||
line-height: 2;
|
||||
}
|
||||
|
||||
.ant-pro-sider-menu-logo {
|
||||
height: 80px;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
<template>
|
||||
<div id="bigScreenLayout" :class="['user-layout-wrapper', isMobile && 'mobile']">
|
||||
<!-- <bigScreen></bigScreen> -->
|
||||
<router-view />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { deviceMixin } from '@/store/device-mixin'
|
||||
import BigScreen from '@/views/bigScreen/index.vue'
|
||||
export default {
|
||||
name: 'BigScreenLayout',
|
||||
mixins: [deviceMixin],
|
||||
components: {
|
||||
BigScreen
|
||||
},
|
||||
mounted () {
|
||||
document.body.classList.add('bigScreenLayout')
|
||||
},
|
||||
beforeDestroy () {
|
||||
document.body.classList.remove('bigScreenLayout')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#bigScreenLayout {
|
||||
|
||||
background-color: #0f1325;
|
||||
}
|
||||
</style>
|
|
@ -5,7 +5,7 @@
|
|||
<div class="header">
|
||||
<a href="javascript:void(0);">
|
||||
<img src="~@/assets/logo.svg" class="logo" alt="logo">
|
||||
<span class="title">安全培训平台</span>
|
||||
<span class="title">下堡坪乡农村福利院长者信息管理系统</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -17,7 +17,7 @@
|
|||
<a href="_self">条款</a>
|
||||
</div> -->
|
||||
<div class="copyright">
|
||||
Copyright © 2022 XinMei
|
||||
Copyright © 2023
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -52,11 +52,19 @@ export default {
|
|||
}
|
||||
}
|
||||
|
||||
.container {
|
||||
background-image: url('~@/assets/login.jpg'); /* 替换为您的背景图路径 */
|
||||
background-size: cover; /* 让背景图片覆盖整个容器 */
|
||||
// background-position: center; /* 居中对齐背景图 */
|
||||
background-repeat: no-repeat; /* 防止背景图重复 */
|
||||
width: 100%; /* 设置容器宽度为100%以适应屏幕宽度 */
|
||||
height: 100vh; /* 设置容器高度为100vh以适应屏幕高度 */
|
||||
}
|
||||
.container {
|
||||
width: 100%;
|
||||
min-height: 100%;
|
||||
background: #f0f2f5 url(~@/assets/background.svg) no-repeat 50%;
|
||||
background-size: 100%;
|
||||
// background: #f0f2f5 url(~@/assets/background.svg) no-repeat 50%;
|
||||
// background-size: 100%;
|
||||
padding: 110px 0 144px;
|
||||
position: relative;
|
||||
|
||||
|
|
|
@ -3,5 +3,6 @@ import BlankLayout from './BlankLayout'
|
|||
import BasicLayout from './BasicLayout'
|
||||
import RouteView from './RouteView'
|
||||
import PageView from './PageView'
|
||||
import BigScreenLayout from './BigScreenLayout'
|
||||
|
||||
export { UserLayout, BasicLayout, BlankLayout, RouteView, PageView }
|
||||
export { UserLayout, BasicLayout, BlankLayout, RouteView, PageView, BigScreenLayout }
|
||||
|
|
35
src/main.js
|
@ -25,16 +25,25 @@ import { hasBtnPermission } from './utils/permissions'
|
|||
|
||||
window.Vue = Vue
|
||||
|
||||
// echart
|
||||
// import { use } from 'echarts/core'
|
||||
// import { CanvasRenderer } from 'echarts/renderers'
|
||||
// import { BarChart } from 'echarts/charts'
|
||||
// import {
|
||||
// TitleComponent,
|
||||
// TooltipComponent,
|
||||
// LegendComponent,
|
||||
// GridComponent
|
||||
// } from 'echarts/components'
|
||||
|
||||
import dataV from '@jiaminghi/data-view';
|
||||
// 引入全局css
|
||||
import './assets/scss/style.scss';
|
||||
// 按需引入vue-awesome图标
|
||||
import Icon from 'vue-awesome/components/Icon';
|
||||
import 'vue-awesome/icons/chart-bar.js';
|
||||
import 'vue-awesome/icons/chart-area.js';
|
||||
import 'vue-awesome/icons/chart-pie.js';
|
||||
import 'vue-awesome/icons/chart-line.js';
|
||||
import 'vue-awesome/icons/align-left.js';
|
||||
|
||||
//引入echart
|
||||
//4.x 引用方式
|
||||
import echarts from 'echarts'
|
||||
//5.x 引用方式为按需引用
|
||||
//希望使用5.x版本的话,需要在package.json中更新版本号,并切换引用方式
|
||||
//import * as echarts from 'echarts'
|
||||
Vue.prototype.$echarts = echarts
|
||||
|
||||
Vue.use(FormModel)
|
||||
Vue.use(Empty)
|
||||
|
@ -45,6 +54,10 @@ Vue.config.productionTip = false
|
|||
|
||||
Vue.use(Print); //注册
|
||||
Vue.use(VueAxios)
|
||||
// 全局注册
|
||||
Vue.component('icon', Icon);
|
||||
Vue.use(dataV);
|
||||
|
||||
Vue.component('pro-layout', ProLayout)
|
||||
Vue.component('page-header-wrapper', PageHeaderWrapper)
|
||||
|
||||
|
@ -70,4 +83,4 @@ new Vue({
|
|||
Vue.filter('moment', (dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') => {
|
||||
if (!dataStr) return ''
|
||||
return moment(dataStr).format(pattern)
|
||||
})
|
||||
})
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import Vue from 'vue'
|
||||
import router from './router'
|
||||
import store from './store'
|
||||
import storage from 'store'
|
||||
import storage from 'store'
|
||||
|
||||
import NProgress from 'nprogress' // progress bar
|
||||
import '@/components/NProgress/nprogress.less' // progress bar custom style
|
||||
|
@ -10,16 +10,19 @@ import { ACCESS_TOKEN } from '@/store/mutation-types'
|
|||
|
||||
import { Modal } from 'ant-design-vue' // NProgress Configuration
|
||||
NProgress.configure({ showSpinner: false })
|
||||
const whiteList = ['login', 'register', 'registerResult', 'setting'] // no redirect whitelist
|
||||
const whiteList = ['login', 'register', 'registerResult', 'setting','bigScreen'] // no redirect whitelist
|
||||
const loginRoutePath = '/user/login'
|
||||
// 无默认首页的情况
|
||||
const defaultRoutePath = '/welcome'
|
||||
|
||||
router.beforeEach((to, from, next) => {
|
||||
console.log(to)
|
||||
NProgress.start() // start progress bar
|
||||
to.meta && (typeof to.meta.title !== 'undefined' && setDocumentTitle(`${to.meta.title} - ${domTitle}`))
|
||||
if (storage.get(ACCESS_TOKEN)) {
|
||||
console.log("ACCESS_TOKEN")
|
||||
if (to.path === loginRoutePath) {
|
||||
console.log("to.path === loginRoutePath")
|
||||
next({ path: defaultRoutePath })
|
||||
NProgress.done()
|
||||
} else {
|
||||
|
@ -50,10 +53,14 @@ router.beforeEach((to, from, next) => {
|
|||
// router.addRoute(element);
|
||||
// }
|
||||
// router.addRoutes方法被遗弃
|
||||
router.addRoutes(store.getters.addRouters)
|
||||
|
||||
// router.addRoutes(store.getters.addRouters)
|
||||
console.log(store.getters.addRouters)
|
||||
router.addRoutes(store.getters.addRouters)
|
||||
|
||||
// 请求带有 redirect 重定向时,登录自动重定向到该地址
|
||||
console.log(from.query)
|
||||
const redirect = decodeURIComponent(from.query.redirect || to.path)
|
||||
console.log("redirect:"+redirect)
|
||||
if (to.path === redirect) {
|
||||
next({ path: redirect })
|
||||
// hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
|
||||
|
@ -74,10 +81,13 @@ router.beforeEach((to, from, next) => {
|
|||
}
|
||||
}
|
||||
} else {
|
||||
console.log("noAccess")
|
||||
if (whiteList.includes(to.name)) {
|
||||
console.log("whiteList.includes")
|
||||
// 在免登录白名单,直接进入
|
||||
next()
|
||||
} else {
|
||||
console.log("whiteList no includes")
|
||||
next({ path: loginRoutePath, query: { redirect: to.fullPath } })
|
||||
NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it
|
||||
}
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
// eslint-disable-next-line
|
||||
// eslint-disable-next-line
|
||||
import { BasicLayout, BlankLayout, PageView, RouteView } from '@/layouts'
|
||||
import { BasicLayout, BlankLayout, PageView, RouteView, BigScreenLayout } from '@/layouts'
|
||||
|
||||
// 前端路由表
|
||||
const constantRouterComponents = {
|
||||
// 基础页面 layout 必须引入
|
||||
BasicLayout: BasicLayout,
|
||||
BigScreenLayout: BigScreenLayout,
|
||||
BlankLayout: BlankLayout,
|
||||
RouteView: RouteView,
|
||||
PageView: PageView,
|
||||
|
@ -23,7 +24,7 @@ const constantRouterComponents = {
|
|||
'CustomSettings': () => import('@/views/account/settings/Custom'),
|
||||
'BindingSettings': () => import('@/views/account/settings/Binding'),
|
||||
'NotificationSettings': () => import('@/views/account/settings/Notification'),
|
||||
|
||||
|
||||
// 默认首页
|
||||
'Console': () => import('@/views/index/welcome')
|
||||
}
|
||||
|
@ -32,6 +33,19 @@ const constantRouterComponents = {
|
|||
const notFoundRouter = {
|
||||
path: '*', redirect: '/404', hidden: true
|
||||
}
|
||||
/* const bigScreenRouter = {
|
||||
path: '/bigScreen',
|
||||
component: BigScreenLayout,
|
||||
redirect: '/bigScreen/data',
|
||||
hidden: true,
|
||||
children: [
|
||||
{
|
||||
path: 'bigScreen',
|
||||
name: 'bigScreen',
|
||||
component: () => import( '@/views/bigScreen/index')
|
||||
}
|
||||
]
|
||||
} */
|
||||
|
||||
// 个人中心页面
|
||||
export const userAccount = [
|
||||
|
@ -127,6 +141,17 @@ export const userAccount = [
|
|||
},
|
||||
'component': 'NotificationSettings'
|
||||
},
|
||||
/* {
|
||||
'name': 'BigScreen',
|
||||
'path': '/bigScreen',
|
||||
'pid': 0,
|
||||
'id': 183183,
|
||||
'meta': {
|
||||
'title': '数据统计',
|
||||
'show': false
|
||||
},
|
||||
'component': 'BigScreenLayout'
|
||||
}, */
|
||||
{
|
||||
'name': 'Console',
|
||||
'path': '/welcome',
|
||||
|
@ -141,6 +166,15 @@ export const userAccount = [
|
|||
|
||||
]
|
||||
|
||||
// 根级菜单
|
||||
/* const rootRouter = {
|
||||
path: '/',
|
||||
name: 'index',
|
||||
component: 'BigScreenLayout',
|
||||
redirect: '/bigScreen',
|
||||
meta: { title: '首页' },
|
||||
children: []
|
||||
} */
|
||||
// 根级菜单
|
||||
const rootRouter = {
|
||||
path: '/',
|
||||
|
@ -150,7 +184,6 @@ const rootRouter = {
|
|||
meta: { title: '首页' },
|
||||
children: []
|
||||
}
|
||||
|
||||
/**
|
||||
* 动态生成菜单
|
||||
* @param token
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import storage from 'store'
|
||||
import { login, getLoginUser, logout } from '@/api/login'
|
||||
import { reqChangePassword } from '@/api/mycourse/index'
|
||||
import { reqChangePassword } from '@/api/security/user'
|
||||
import { ACCESS_TOKEN } from '@/store/mutation-types'
|
||||
import { welcome } from '@/utils/util'
|
||||
|
||||
|
@ -66,7 +66,7 @@ const user = {
|
|||
commit('SET_ROLES', 1)
|
||||
commit('SET_BUTTONS', data.permissions)
|
||||
commit('SET_INFO', data.user)
|
||||
state.person = data.person
|
||||
state.person = data.user
|
||||
commit('SET_NAME', { name: data.user.userName, welcome: welcome() })
|
||||
if (data.user.avatar != null) {
|
||||
commit(
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
// 屏幕适配 mixin 函数
|
||||
|
||||
// * 默认缩放值
|
||||
const scale = {
|
||||
width: '1',
|
||||
height: '1',
|
||||
}
|
||||
|
||||
// * 设计稿尺寸(px)
|
||||
const baseWidth = 1920
|
||||
const baseHeight = 1080
|
||||
|
||||
// * 需保持的比例(默认1.77778)
|
||||
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
// * 定时函数
|
||||
drawTiming: null
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
this.calcRate()
|
||||
window.addEventListener('resize', this.resize)
|
||||
},
|
||||
beforeDestroy () {
|
||||
window.removeEventListener('resize', this.resize)
|
||||
},
|
||||
methods: {
|
||||
calcRate () {
|
||||
const appRef = this.$refs["appRef"]
|
||||
if (!appRef) return
|
||||
// 当前宽高比
|
||||
const currentRate = parseFloat((window.innerWidth / window.innerHeight).toFixed(5))
|
||||
if (appRef) {
|
||||
if (currentRate > baseProportion) {
|
||||
// 表示更宽
|
||||
scale.width = ((window.innerHeight * baseProportion) / baseWidth).toFixed(5)
|
||||
scale.height = (window.innerHeight / baseHeight).toFixed(5)
|
||||
appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`
|
||||
} else {
|
||||
// 表示更高
|
||||
scale.height = ((window.innerWidth / baseProportion) / baseHeight).toFixed(5)
|
||||
scale.width = (window.innerWidth / baseWidth).toFixed(5)
|
||||
appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`
|
||||
}
|
||||
}
|
||||
},
|
||||
resize () {
|
||||
clearTimeout(this.drawTiming)
|
||||
this.drawTiming = setTimeout(() => {
|
||||
this.calcRate()
|
||||
}, 200)
|
||||
}
|
||||
},
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
/**
|
||||
* @param {Function} fn 防抖函数
|
||||
* @param {Number} delay 延迟时间
|
||||
*/
|
||||
export function debounce(fn, delay) {
|
||||
var timer;
|
||||
return function () {
|
||||
var context = this;
|
||||
var args = arguments;
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(function () {
|
||||
fn.apply(context, args);
|
||||
}, delay);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {date} time 需要转换的时间
|
||||
* @param {String} fmt 需要转换的格式 如 yyyy-MM-dd、yyyy-MM-dd HH:mm:ss
|
||||
*/
|
||||
export function formatTime(time, fmt) {
|
||||
if (!time) return '';
|
||||
else {
|
||||
const date = new Date(time);
|
||||
const o = {
|
||||
'M+': date.getMonth() + 1,
|
||||
'd+': date.getDate(),
|
||||
'H+': date.getHours(),
|
||||
'm+': date.getMinutes(),
|
||||
's+': date.getSeconds(),
|
||||
'q+': Math.floor((date.getMonth() + 3) / 3),
|
||||
S: date.getMilliseconds(),
|
||||
};
|
||||
if (/(y+)/.test(fmt))
|
||||
fmt = fmt.replace(
|
||||
RegExp.$1,
|
||||
(date.getFullYear() + '').substr(4 - RegExp.$1.length)
|
||||
);
|
||||
for (const k in o) {
|
||||
if (new RegExp('(' + k + ')').test(fmt)) {
|
||||
fmt = fmt.replace(
|
||||
RegExp.$1,
|
||||
RegExp.$1.length === 1
|
||||
? o[k]
|
||||
: ('00' + o[k]).substr(('' + o[k]).length)
|
||||
);
|
||||
}
|
||||
}
|
||||
return fmt;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
// 混入代码 resize-mixins.js
|
||||
// 改成 Scale 缩放之后,没有使用这个代码,但是保留
|
||||
import { debounce } from '@/utils';
|
||||
const resizeChartMethod = '$__resizeChartMethod';
|
||||
|
||||
export default {
|
||||
data() {
|
||||
// 在组件内部将图表 init 的引用映射到 chart 属性上
|
||||
return {
|
||||
chart: null,
|
||||
};
|
||||
},
|
||||
created() {
|
||||
window.addEventListener('resize', this[resizeChartMethod], false);
|
||||
},
|
||||
activated() {
|
||||
// 防止 keep-alive 之后图表变形
|
||||
if (this.chart) {
|
||||
this.chart.resize()
|
||||
}
|
||||
},
|
||||
beforeDestroy() {
|
||||
window.removeEventListener('reisze', this[resizeChartMethod]);
|
||||
},
|
||||
methods: {
|
||||
// 防抖函数来控制 resize 的频率
|
||||
[resizeChartMethod]: debounce(function() {
|
||||
if (this.chart) {
|
||||
this.chart.resize();
|
||||
}
|
||||
}, 300),
|
||||
},
|
||||
};
|
|
@ -0,0 +1,59 @@
|
|||
export default function useDraw(appRefParams) {
|
||||
// * 指向最外层容器
|
||||
const appRef = appRefParams;
|
||||
// * 定时函数
|
||||
let timer = null;
|
||||
// * 默认缩放值
|
||||
const scale = {
|
||||
width: '1',
|
||||
height: '1',
|
||||
};
|
||||
// * 设计稿尺寸(px)
|
||||
const baseWidth = 1920;
|
||||
const baseHeight = 1080;
|
||||
|
||||
// * 需保持的比例(默认1.77778)
|
||||
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5));
|
||||
const calcRate = () => {
|
||||
// 当前宽高比
|
||||
const currentRate = parseFloat((window.innerWidth / window.innerHeight).toFixed(5));
|
||||
console.log(appRef)
|
||||
if (appRef.value) {
|
||||
if (currentRate > baseProportion) {
|
||||
// 表示更宽
|
||||
scale.width = ((window.innerHeight * baseProportion) / baseWidth).toFixed(5);
|
||||
scale.height = (window.innerHeight / baseHeight).toFixed(5);
|
||||
appRef.value.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`;
|
||||
} else {
|
||||
// 表示更高
|
||||
scale.height = ((window.innerWidth / baseProportion) / baseHeight).toFixed(5);
|
||||
scale.width = (window.innerWidth / baseWidth).toFixed(5);
|
||||
appRef.value.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const resize = () => {
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(() => {
|
||||
calcRate();
|
||||
}, 200);
|
||||
};
|
||||
|
||||
// 改变窗口大小重新绘制
|
||||
const windowDraw = () => {
|
||||
window.addEventListener('resize', resize);
|
||||
};
|
||||
|
||||
// 移除窗口大小改变监听
|
||||
const unWindowDraw = () => {
|
||||
window.removeEventListener('resize', resize);
|
||||
};
|
||||
|
||||
return {
|
||||
appRef,
|
||||
calcRate,
|
||||
windowDraw,
|
||||
unWindowDraw,
|
||||
};
|
||||
}
|
|
@ -1,155 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" title="证书类型">
|
||||
<template slot="extra">
|
||||
<a-button size="small" @click="close">返回</a-button>
|
||||
</template>
|
||||
|
||||
<div class="table-page-search-wrapper">
|
||||
<div style="width: 100%; height: 32px; margin-bottom: 8px;">
|
||||
<a-button type="primary" @click="addCertificateType()">新增证书类型</a-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<s-table ref="table" size="small" rowKey="id" :columns="columns" :data="loadData" :showPagination="false">
|
||||
<template slot="action" slot-scope="text, record">
|
||||
<a href="javascript:;" @click="edit(record)">编辑</a>
|
||||
|
||||
<a-popconfirm title="确定要删除该证书类型?" ok-text="确认" cancel-text="取消" @confirm="del(record)">
|
||||
<a href="javascript:;">删除</a>
|
||||
</a-popconfirm>
|
||||
</template>
|
||||
</s-table>
|
||||
|
||||
<a-modal v-model="isAdd" :width="700" title="新增证书类型" ok-text="确认" cancel-text="取消" @ok="addCertificateTypeQR">
|
||||
<a-form-model :model="addForm" :label-col="{span: 5}" :wrapper-col="{span: 19}">
|
||||
<a-form-model-item label="证书类型名称" :rules="{ required: true, message: '请输入证书类型名称!' }">
|
||||
<a-input v-model="addForm.name" />
|
||||
</a-form-model-item>
|
||||
</a-form-model>
|
||||
</a-modal>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { STable } from '@/components'
|
||||
import { getCertificateTypeList, getCertificateType, getCertificateTypeMaxValue, addCertificateType, delCertificateType, editCertificateType } from '@/api/archives/certificate'
|
||||
|
||||
export default {
|
||||
// import引入的组件需要注入到对象中才能使用
|
||||
components: { STable },
|
||||
props: {},
|
||||
data() {
|
||||
// 这里存放数据
|
||||
return {
|
||||
isAdd: false,
|
||||
addForm: {
|
||||
name: ''
|
||||
},
|
||||
editForm: {},
|
||||
queryParam: { dictionaryCode: '0001' },
|
||||
columns: [
|
||||
{ title: '证书类型', width: 'auto', align: 'center', dataIndex: 'name', key: 'name' },
|
||||
{ title: '操作', width: '170px', key: 'operation', align: 'center', scopedSlots: { customRender: 'action' } }
|
||||
],
|
||||
loadData: parameter => { return getCertificateTypeList(Object.assign(parameter, this.queryParam)).then((res) => { return res.data; }); },
|
||||
};
|
||||
},
|
||||
// 计算属性 类似于data概念
|
||||
computed: {},
|
||||
// 监控data中的数据变化
|
||||
watch: {},
|
||||
// 方法集合
|
||||
methods: {
|
||||
// 返回 按钮
|
||||
close() {
|
||||
this.$router.push({
|
||||
path: '/archives/certificate/Index', query: {
|
||||
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// 新增证书类型
|
||||
addCertificateType() {
|
||||
this.addForm.name = "";
|
||||
this.isAdd = true;
|
||||
},
|
||||
addCertificateTypeQR() {
|
||||
if (!this.addForm.name || this.addForm.name === '') {
|
||||
this.$message.error("请输入证书类型名称!");
|
||||
return;
|
||||
}
|
||||
|
||||
// 如果修改form内有值 则走修改
|
||||
if (this.editForm.id) {
|
||||
if (this.editForm.name === this.addForm.name) {
|
||||
this.$message.success("证书类型名称与之前一致,不需要发起修改");
|
||||
this.isAdd = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this.editForm.name = this.addForm.name;
|
||||
editCertificateType(this.editForm).then(res => {
|
||||
this.$message.success("修改成功!");
|
||||
this.editForm = {};
|
||||
this.isAdd = false;
|
||||
this.$refs.table.refresh(true);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
let certificateType = {};
|
||||
certificateType.dictionaryCode = '0001';
|
||||
certificateType.name = this.addForm.name;
|
||||
certificateType.parentid = 0;
|
||||
|
||||
// 先获取该词典项下最大value
|
||||
getCertificateTypeMaxValue(certificateType).then(res => {
|
||||
certificateType.value = res.data;
|
||||
|
||||
// 再发起新增
|
||||
addCertificateType(certificateType).then(res => {
|
||||
this.$message.success("新增成功!");
|
||||
this.isAdd = false;
|
||||
this.$refs.table.refresh(true);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// 编辑词典项
|
||||
edit(record) {
|
||||
getCertificateType({ id: record.id }).then(res => {
|
||||
this.isAdd = true;
|
||||
this.addForm.name = res.data.name;
|
||||
this.editForm = res.data;
|
||||
});
|
||||
},
|
||||
|
||||
// 删除证书类型
|
||||
del(record) {
|
||||
delCertificateType({ ids: record.id, deleteReason: '' }).then(res => { this.$refs.table.refresh(true); });
|
||||
}
|
||||
},
|
||||
// 生命周期 - 创建完成(可以访问当前this实例)
|
||||
created() { },
|
||||
// 生命周期 - 挂载完成(可以访问DOM元素)
|
||||
mounted() { },
|
||||
// 生命周期 - 创建之前
|
||||
beforeCreate() { },
|
||||
// 生命周期 - 挂载之前
|
||||
beforeMount() { },
|
||||
// 生命周期 - 更新之前
|
||||
beforeUpdate() { },
|
||||
// 生命周期 - 更新之后
|
||||
updated() { },
|
||||
// 生命周期 - 销毁之前
|
||||
beforeDestroy() { },
|
||||
// 生命周期 - 销毁完成
|
||||
destroyed() { },
|
||||
// 如果页面有keep-alive缓存功能,这个函数会触发
|
||||
activated() { }
|
||||
};
|
||||
|
||||
</script>
|
||||
<style scoped>
|
||||
</style>
|
|
@ -1,136 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" :title="pageName">
|
||||
<template slot="extra">
|
||||
<a-button size="small" @click="save" type="primary">保存</a-button>
|
||||
<a-button size="small" @click="close">返回</a-button>
|
||||
</template>
|
||||
|
||||
<a-form-model :model="form">
|
||||
<a-form-model-item label="证书名称" :label-col="{ span: 4 }" :wrapper-col="{ span: 15 }">
|
||||
<a-input v-model="form.name" placeholder="证书名称" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item label="证书注册日期" :label-col="{ span: 4 }" :wrapper-col="{ span: 15 }">
|
||||
<a-date-picker v-model="form.registerDate" :format="'YYYY-MM-DD'" valueFormat="YYYY-MM-DD" placeholder="证书注册日期" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item label="证书有效期" :label-col="{ span: 4 }" :wrapper-col="{ span: 15 }">
|
||||
<a-date-picker v-model="form.validityStartDate" :format="'YYYY-MM-DD'" valueFormat="YYYY-MM-DD" placeholder="证书有效期开始日期" />
|
||||
-
|
||||
<a-date-picker v-model="form.validityEndDate" :format="'YYYY-MM-DD'" valueFormat="YYYY-MM-DD" placeholder="证书有效期结束日期" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item label="证书类型" :label-col="{ span: 4 }" :wrapper-col="{ span: 15 }">
|
||||
<a-select v-model="form.type" placeholder="请选择证书类型" :allowClear="true">
|
||||
<a-select-option v-for="(item, index) in certificateType" :key="index" :value="item.value">{{ item.name }}</a-select-option>
|
||||
</a-select>
|
||||
</a-form-model-item>
|
||||
<!-- <a-form-model-item label="证书状态" :label-col="{ span: 4 }" :wrapper-col="{ span: 15 }">
|
||||
<a-select v-model="form.state" placeholder="请选择证书状态" :allowClear="true">
|
||||
<a-select-option v-for="(item, index) in certificateState" :key="index" :value="item.value">{{ item.name }}</a-select-option>
|
||||
</a-select>
|
||||
</a-form-model-item> -->
|
||||
<a-form-model-item label="证书照片" :label-col="{ span: 4 }" :wrapper-col="{ span: 15 }">
|
||||
<db-upload v-model="fileList"></db-upload>
|
||||
</a-form-model-item>
|
||||
</a-form-model>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import DbUpload from '@/components/DbUpload/DbUpload.vue'
|
||||
import { dictionaryDropDown } from '@/api/sys/dictionaryItem'
|
||||
import { addPersonCertificate, findPersonCertificateDetail } from '@/api/archives/certificate'
|
||||
|
||||
export default {
|
||||
// import引入的组件需要注入到对象中才能使用
|
||||
components: { DbUpload },
|
||||
props: {},
|
||||
data() {
|
||||
// 这里存放数据
|
||||
return {
|
||||
pageName: this.$route.query.certificateId ? '证书编辑' : '证书新增',
|
||||
fileList: [],
|
||||
form: {},
|
||||
certificateType: [], // 证书类型
|
||||
certificateState: [], // 证书状态
|
||||
};
|
||||
},
|
||||
// 计算属性 类似于data概念
|
||||
computed: {},
|
||||
// 监控data中的数据变化
|
||||
watch: {},
|
||||
// 方法集合
|
||||
methods: {
|
||||
// 返回 按钮
|
||||
close() {
|
||||
if (this.$route.query.certificateId) this.$router.push({ path: '/archives/certificate/Index', query: {} });
|
||||
else this.$router.push({ path: '/personList', query: {} });
|
||||
},
|
||||
|
||||
// 加载证书信息
|
||||
loadCertificateInfo() {
|
||||
if (!this.$route.query.certificateId) return;
|
||||
|
||||
findPersonCertificateDetail({ id: this.$route.query.certificateId }).then(res => {
|
||||
this.form = res.data;
|
||||
this.fileList = JSON.parse(res.data.file);
|
||||
})
|
||||
|
||||
},
|
||||
|
||||
// 获取词典项
|
||||
dictionaryDropDown() {
|
||||
// 获取证书类型
|
||||
dictionaryDropDown({ dictionaryCode: '0001' }).then((res) => {
|
||||
this.certificateType = res.data;
|
||||
})
|
||||
// 获取证书状态
|
||||
dictionaryDropDown({ dictionaryCode: '0010' }).then((res) => {
|
||||
this.certificateState = res.data;
|
||||
})
|
||||
},
|
||||
|
||||
// 保存 按钮
|
||||
save() {
|
||||
let personCertificate = this.form;
|
||||
|
||||
console.log(this.fileList)
|
||||
|
||||
if (!personCertificate.id) personCertificate.personId = parseInt(this.$route.query.personId);
|
||||
personCertificate.file = JSON.stringify(this.fileList);
|
||||
console.log('save---', this.form)
|
||||
|
||||
addPersonCertificate(personCertificate).then(res => {
|
||||
this.$message.success(this.pageName + "成功!");
|
||||
this.close();
|
||||
});
|
||||
|
||||
},
|
||||
},
|
||||
// 生命周期 - 创建完成(可以访问当前this实例)
|
||||
created() {
|
||||
// 加载词典项
|
||||
this.dictionaryDropDown();
|
||||
|
||||
// 加载证书数据
|
||||
this.loadCertificateInfo();
|
||||
},
|
||||
// 生命周期 - 挂载完成(可以访问DOM元素)
|
||||
mounted() { },
|
||||
// 生命周期 - 创建之前
|
||||
beforeCreate() { },
|
||||
// 生命周期 - 挂载之前
|
||||
beforeMount() { },
|
||||
// 生命周期 - 更新之前
|
||||
beforeUpdate() { },
|
||||
// 生命周期 - 更新之后
|
||||
updated() { },
|
||||
// 生命周期 - 销毁之前
|
||||
beforeDestroy() { },
|
||||
// 生命周期 - 销毁完成
|
||||
destroyed() { },
|
||||
// 如果页面有keep-alive缓存功能,这个函数会触发
|
||||
activated() { }
|
||||
};
|
||||
|
||||
</script>
|
||||
<style scoped>
|
||||
</style>
|
|
@ -1,251 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" title="证书档案" :loading="treeLoading">
|
||||
<div class="table-page-search-wrapper">
|
||||
<SearchCom :form="queryParam" :list="queryOptions" @search="handleRefresh" @reset="() => {queryParam.type = '', handleRefresh()}"></SearchCom>
|
||||
<div style="width: 100%; height: 32px; margin-bottom: 8px;">
|
||||
<a-button type="primary" @click="editCertificateType()">编辑证书类型</a-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<a-row :gutter="24">
|
||||
<a-col :md="5" :sm="24" class="borderTop ">
|
||||
<div>
|
||||
<div v-if="this.orgTree != ''">
|
||||
<a-tree
|
||||
:treeData="orgTree"
|
||||
v-if="orgTree.length"
|
||||
@select="handleClick"
|
||||
:defaultExpandAll="true"
|
||||
:defaultExpandedKeys="expandedKeys"
|
||||
:replaceFields="replaceFields" />
|
||||
</div>
|
||||
<div v-else>
|
||||
<a-empty :image="simpleImage" />
|
||||
</div>
|
||||
|
||||
<a-button type="primary" @click="changeOrgType" style="display: block; margin: 10px auto;">
|
||||
{{ queryParam.orgType === 1 ? '切换到项目组' : '切换到单位' }}
|
||||
</a-button>
|
||||
</div>
|
||||
</a-col>
|
||||
<a-col :md="19" :sm="24" style="padding-left: 0px">
|
||||
<s-table ref="table" size="small" rowKey="id" :columns="columns" :data="loadData">
|
||||
<template slot="action" slot-scope="text, record">
|
||||
<a-dropdown>
|
||||
<a class="ant-dropdown-link">操作
|
||||
<a-icon type="down" />
|
||||
</a>
|
||||
<a-menu slot="overlay">
|
||||
<a-menu-item v-if="hasPerm('person:certificate:edit')">
|
||||
<a href="javascript:;" @click="editPersonCertificate(record)">修改</a>
|
||||
</a-menu-item>
|
||||
<a-menu-item v-if="hasPerm('person:certificate:export')">
|
||||
<a href="javascript:;" @click="exportPersonCertificate(record)">导出</a>
|
||||
</a-menu-item>
|
||||
<a-menu-item v-if="hasPerm('person:certificate:del')">
|
||||
<a-popconfirm placement="topRight" title="确认删除?" @confirm="() => delPersonCertificate(record)">
|
||||
<a href="javascript:;">删除</a>
|
||||
</a-popconfirm>
|
||||
</a-menu-item>
|
||||
</a-menu>
|
||||
</a-dropdown>
|
||||
</template>
|
||||
</s-table>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { Empty } from 'ant-design-vue'
|
||||
import { STable, SearchCom } from '@/components'
|
||||
import { getArchivesCertificatelist, delCertificate, exportCertificate } from '@/api/archives/certificate'
|
||||
import { downloadExportFile } from '@/api/common/common'
|
||||
import { dictionaryDropDown } from '@/api/sys/dictionaryItem'
|
||||
import { orgList } from '@/api/org/org'
|
||||
import { listToTree } from '@/utils/util'
|
||||
|
||||
export default {
|
||||
// import引入的组件需要注入到对象中才能使用
|
||||
components: { STable, SearchCom },
|
||||
props: {},
|
||||
data () {
|
||||
// 这里存放数据
|
||||
return {
|
||||
queryParam: { orgId: '', orgType: 1, type: '' },
|
||||
queryOptions: [
|
||||
{ type: 'select-dic', placeholder: '证书类型', key: 'type', options: [] }
|
||||
],
|
||||
state: [], // 证书状态字典
|
||||
|
||||
// 组织机构数需要用到的参数
|
||||
simpleImage: Empty.PRESENTED_IMAGE_SIMPLE,
|
||||
orgTree: [],
|
||||
expandedKeys: [],
|
||||
treeLoading: true,
|
||||
replaceFields: {
|
||||
children: 'children',
|
||||
title: 'name',
|
||||
key: 'id',
|
||||
value: 'id'
|
||||
},
|
||||
|
||||
// 表格参数
|
||||
columns: [
|
||||
{ title: '姓名', width: '80px', align: 'center', dataIndex: 'personName', key: 'personName' },
|
||||
{ title: '单位信息', width: 'auto', align: 'center', dataIndex: 'dwOrgName', key: 'dwOrgName' },
|
||||
{ title: '部门信息', width: 'auto', align: 'center', dataIndex: 'bmOrgName', key: 'bmOrgName' },
|
||||
{ title: '证书名称', width: 'auto', align: 'center', dataIndex: 'name', key: 'name' },
|
||||
{
|
||||
title: '证书类型',
|
||||
width: 'auto',
|
||||
align: 'center',
|
||||
dataIndex: 'type',
|
||||
key: 'type',
|
||||
customRender: (text, record, index) => {
|
||||
let textStr = ''
|
||||
this.queryOptions[0].options.forEach(element => { if (element.value.toString() === text) textStr = element.name })
|
||||
return textStr
|
||||
}
|
||||
},
|
||||
{ title: '注册日期', width: 'auto', align: 'center', dataIndex: 'registerDate', key: 'registerDate' },
|
||||
{ title: '失效日期', width: 'auto', align: 'center', dataIndex: 'validityEndDate', key: 'validityEndDate' },
|
||||
{
|
||||
title: '证书状态',
|
||||
width: '80px',
|
||||
align: 'center',
|
||||
dataIndex: 'state',
|
||||
key: 'state',
|
||||
customRender: (text, record, index) => {
|
||||
let textStr = ''
|
||||
this.state.forEach(element => { if (element.value.toString() === text) textStr = element.name })
|
||||
return textStr
|
||||
}
|
||||
},
|
||||
{ title: '操作', width: '70px', key: 'operation', align: 'center', scopedSlots: { customRender: 'action' } }
|
||||
],
|
||||
loadData: null
|
||||
}
|
||||
},
|
||||
// 计算属性 类似于data概念
|
||||
computed: {},
|
||||
// 监控data中的数据变化
|
||||
watch: {},
|
||||
// 方法集合
|
||||
methods: {
|
||||
// 获取到机构树,展开顶级下树节点,考虑到后期数据量变大,不建议全部展开
|
||||
getOrgTree () {
|
||||
orgList({ orgType: this.queryParam.orgType }).then(res => {
|
||||
this.treeLoading = false
|
||||
if (!res.code === 200 || !res.data.length) {
|
||||
return
|
||||
}
|
||||
this.expandedKeys = []
|
||||
this.orgTree = listToTree(res.data, [], 0)
|
||||
this.queryParam.orgId = this.orgTree[0].id
|
||||
// 默认展开
|
||||
this.orgTree.forEach(item => {
|
||||
this.expandedKeys.push(item.id)
|
||||
})
|
||||
|
||||
if (!this.loadData) this.loadData = parameter => { return getArchivesCertificatelist(Object.assign(parameter, this.queryParam)).then(res => { return res }) }
|
||||
else this.handleRefresh()
|
||||
})
|
||||
},
|
||||
|
||||
// 获取词典项
|
||||
dictionaryDropDown () {
|
||||
// 获取证书类型
|
||||
dictionaryDropDown({ dictionaryCode: '0001' }).then((res) => {
|
||||
this.queryOptions[0].options = res.data
|
||||
})
|
||||
|
||||
// 获取证书状态
|
||||
dictionaryDropDown({ dictionaryCode: '0010' }).then((res) => {
|
||||
this.state = res.data
|
||||
})
|
||||
},
|
||||
|
||||
// 编辑证书类型
|
||||
editCertificateType () {
|
||||
this.$router.push({ path: '/archives/certificate/CertificateType', query: {} })
|
||||
},
|
||||
|
||||
// 搜索区查询按钮
|
||||
handleRefresh () {
|
||||
this.$refs.table.refresh(true)
|
||||
},
|
||||
|
||||
// 切换组织树
|
||||
changeOrgType () {
|
||||
this.queryParam.orgType = this.queryParam.orgType === 1 ? 2 : 1
|
||||
this.getOrgTree()
|
||||
// this.handleClick();
|
||||
},
|
||||
|
||||
// 点击组织树节点时调用
|
||||
handleClick (e) {
|
||||
this.queryParam.orgId = e.toString()
|
||||
this.$refs.table.refresh(true)
|
||||
},
|
||||
|
||||
// 修改人员证书
|
||||
editPersonCertificate (record) {
|
||||
this.$router.push({
|
||||
path: '/archives/certificate/EditCertificate',
|
||||
query: {
|
||||
certificateId: record.id
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 导出人员证书
|
||||
exportPersonCertificate (record) {
|
||||
exportCertificate({ id: record.id }).then(res => {
|
||||
downloadExportFile(res.data)
|
||||
})
|
||||
},
|
||||
|
||||
// 删除人员证书
|
||||
delPersonCertificate (record) {
|
||||
delCertificate({ id: record.id }).then(res => {
|
||||
this.$message.success('删除证书成功!')
|
||||
this.$refs.table.refresh(true)
|
||||
})
|
||||
}
|
||||
},
|
||||
// 生命周期 - 创建完成(可以访问当前this实例)
|
||||
created () {
|
||||
// 获取组织机构树
|
||||
this.getOrgTree()
|
||||
|
||||
// 获取所有证书类型
|
||||
this.dictionaryDropDown()
|
||||
},
|
||||
// 生命周期 - 挂载完成(可以访问DOM元素)
|
||||
mounted () { },
|
||||
// 生命周期 - 创建之前
|
||||
beforeCreate () { },
|
||||
// 生命周期 - 挂载之前
|
||||
beforeMount () { },
|
||||
// 生命周期 - 更新之前
|
||||
beforeUpdate () { },
|
||||
// 生命周期 - 更新之后
|
||||
updated () { },
|
||||
// 生命周期 - 销毁之前
|
||||
beforeDestroy () { },
|
||||
// 生命周期 - 销毁完成
|
||||
destroyed () { },
|
||||
// 如果页面有keep-alive缓存功能,这个函数会触发
|
||||
activated () { }
|
||||
}
|
||||
|
||||
</script>
|
||||
<style scoped>
|
||||
.borderTop {
|
||||
border-top: 1px solid #e8e8e8;
|
||||
}
|
||||
.borderRight {
|
||||
border-right: 1px solid #e8e8e8;
|
||||
}
|
||||
</style>
|
|
@ -1,109 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" title="项目档案">
|
||||
<div class="table-page-search-wrapper">
|
||||
<SearchCom :form="queryParam" :list="queryOptions" @search="handleRefresh" @reset="() => {queryParam = {}, handleRefresh()}"></SearchCom>
|
||||
<div style="width: 100%; height: 32px; margin-bottom: 8px;">
|
||||
<!-- <a-button type="primary">导出</a-button> -->
|
||||
</div>
|
||||
</div>
|
||||
<s-table ref="table" size="small" rowKey="id" :columns="columns" :data="loadData" :pageNum="Number(this.$route.query.pageNum) || 1">
|
||||
<template slot="action" slot-scope="text, record">
|
||||
<a-dropdown>
|
||||
<a class="ant-dropdown-link">操作
|
||||
<a-icon type="down" />
|
||||
</a>
|
||||
<a-menu slot="overlay">
|
||||
<a-menu-item v-if="hasPerm('archives:project:user:list')">
|
||||
<a href="javascript:;" @click="archivesProjectUser(record)">人员记录</a>
|
||||
</a-menu-item>
|
||||
<!-- <a-menu-item>
|
||||
<a href="javascript:;" @click="exportData(record)">导出</a>
|
||||
</a-menu-item> -->
|
||||
</a-menu>
|
||||
</a-dropdown>
|
||||
</template>
|
||||
</s-table>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { STable, SearchCom } from '@/components'
|
||||
import { getArchivesProjectList } from '@/api/archives/project'
|
||||
import { classList } from '@/api/project/class'
|
||||
|
||||
export default {
|
||||
components: { STable, SearchCom },
|
||||
data() {
|
||||
return {
|
||||
queryParam: { trainClass: '', trainWay: '', projectName: '' },
|
||||
columns: [
|
||||
// { title: '项目ID', width: '60px', align: 'center', dataIndex: 'id', key: 'id' },
|
||||
{ title: '项目名称', width: 'auto', align: 'center', dataIndex: 'name', key: 'name' },
|
||||
{ title: '项目时间', width: 'auto', align: 'center', dataIndex: 'time', key: 'time' },
|
||||
{ title: '项目类别', width: 'auto', align: 'center', dataIndex: 'way', key: 'way' },
|
||||
{ title: '人数', width: '60px', align: 'center', dataIndex: 'peopleSize', key: 'peopleSize' },
|
||||
{ title: '创建人', width: 'auto', align: 'center', dataIndex: 'creater', key: 'creater' },
|
||||
{ title: '创建时间', width: 'auto', align: 'center', dataIndex: 'createTime', key: 'createTime' },
|
||||
{ title: '项目状态', width: '80px', align: 'center', dataIndex: 'statusName', key: 'statusName' },
|
||||
{ title: '操作', width: '70px', key: 'operation', align: 'center', scopedSlots: { customRender: 'action' } }
|
||||
],
|
||||
loadData: parameter => { return getArchivesProjectList(Object.assign(parameter, this.queryParam)).then(res => { return res }) },
|
||||
trainClass: []
|
||||
}
|
||||
},
|
||||
created: function () {
|
||||
classList({ pageNum: 1, pageSize: 9999 }).then(res => {
|
||||
for (let index in res.rows) {
|
||||
let item = res.rows[index];
|
||||
let item_ = {};
|
||||
item_.id = item.id.toString();
|
||||
item_.name = item.value;
|
||||
this.trainClass.push(item_);
|
||||
}
|
||||
});
|
||||
|
||||
if (this.$route.query.queryParamTrainClass) this.queryParam.trainClass = this.$route.query.queryParamTrainClass;
|
||||
if (this.$route.query.queryParamTrainWay) this.queryParam.trainWay = this.$route.query.queryParamTrainWay;
|
||||
if (this.$route.query.queryParamProjectName) this.queryParam.projectName = this.$route.query.queryParamProjectName;
|
||||
},
|
||||
computed: {
|
||||
queryOptions: function () {
|
||||
return [
|
||||
{ type: 'select', placeholder: '培训种类', key: 'trainClass', options: [{ id: '', name: '全部' }, ...this.trainClass] },
|
||||
{
|
||||
type: 'select', placeholder: '培训方式', key: 'trainWay', options: [
|
||||
// 培训方式 1-培训 2-考试 3-培训练习 4-培训练习考试
|
||||
{ id: '', name: '全部' },
|
||||
{ id: '1', name: '培训' },
|
||||
{ id: '2', name: '考试' },
|
||||
{ id: '3', name: '培训练习' },
|
||||
{ id: '4', name: '培训练习考试' }
|
||||
]
|
||||
},
|
||||
{ type: 'input', placeholder: '项目名称', key: 'projectName' }
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleRefresh() {
|
||||
this.$refs.table.refresh(true)
|
||||
},
|
||||
// 培训详情
|
||||
archivesProjectUser(record) {
|
||||
this.$router.push({
|
||||
path: '/archives/project/ProjectUser', query: {
|
||||
id: record.id,
|
||||
queryParamTrainClass: this.queryParam.trainClass,
|
||||
queryParamTrainWay: this.queryParam.trainWay,
|
||||
queryParamProjectName: this.queryParam.projectName,
|
||||
pageNum: this.$refs.table.localPagination.current
|
||||
}
|
||||
});
|
||||
},
|
||||
// 导出
|
||||
exportData(record) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -1,158 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" title="人员记录">
|
||||
<template slot="extra">
|
||||
<a-button size="small" @click="close">返回</a-button>
|
||||
</template>
|
||||
|
||||
<div class="table-page-search-wrapper">
|
||||
<SearchCom :form="queryParam" :list="queryOptions" @search="handleRefresh" @reset="() => {queryParam = {}, handleRefresh()}"></SearchCom>
|
||||
</div>
|
||||
<s-table ref="table" size="small" rowKey="id" :columns="columns" :data="loadData" :pageNum="Number(this.$route.query.pageNum1) || 1">
|
||||
<template slot="action" slot-scope="text, record">
|
||||
<a-dropdown v-if="hasPerm('archives:project:user:course:list') || hasPerm('archives:project:user:answer:list')">
|
||||
<a class="ant-dropdown-link">操作
|
||||
<a-icon type="down" />
|
||||
</a>
|
||||
<a-menu slot="overlay">
|
||||
<a-menu-item v-if="hasPerm('archives:project:user:course:list')">
|
||||
<a href="javascript:;" @click="archivesProjectUserDateil(record)">培训详情</a>
|
||||
</a-menu-item>
|
||||
<a-menu-item v-if="hasPerm('archives:project:user:answer:list')">
|
||||
<a href="javascript:;" @click="archivesProjectUserAnswer(record)">答题记录</a>
|
||||
</a-menu-item>
|
||||
</a-menu>
|
||||
</a-dropdown>
|
||||
</template>
|
||||
</s-table>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { STable, SearchCom } from '@/components'
|
||||
import { getArchivesProjectUserList } from '@/api/archives/project'
|
||||
|
||||
export default {
|
||||
// import引入的组件需要注入到对象中才能使用
|
||||
components: { STable, SearchCom },
|
||||
props: {},
|
||||
data() {
|
||||
// 这里存放数据
|
||||
return {
|
||||
queryParam: {id:this.$route.query.projectId}, //state: '', userName: ''
|
||||
columns: [
|
||||
{ title: '姓名', width: '100px', align: 'center', dataIndex: 'name', key: 'name' },
|
||||
{ title: '单位信息', width: 'auto', align: 'center', dataIndex: 'dwOrgName', key: 'dwOrgName' },
|
||||
{ title: '部门信息', width: 'auto', align: 'center', dataIndex: 'bmOrgName', key: 'bmOrgName' },
|
||||
{ title: '应修学时', width: '80px', align: 'center', dataIndex: 'mustClassHour', key: 'mustClassHour' },
|
||||
{ title: '已修学时', width: '100px', align: 'center', dataIndex: 'alreadyClassHour', key: 'alreadyClassHour' },
|
||||
{ title: '总练习题量', width: '60px', align: 'center', dataIndex: 'addUpExercises', key: 'addUpExercises' },
|
||||
{ title: '已练习题量', width: '60px', align: 'center', dataIndex: 'alreadyExercises', key: 'alreadyExercises' },
|
||||
{ title: '答对题量', width: '60px', align: 'center', dataIndex: 'yesTopic', key: 'yesTopic' },
|
||||
{ title: '正确率', width: '60px', align: 'center', dataIndex: 'yesRate', key: 'yesRate' },
|
||||
{ title: '考试成绩', width: '60px', align: 'center', dataIndex: 'testResult', key: 'testResult' },
|
||||
{ title: '补考成绩', width: '60px', align: 'center', dataIndex: 'mendTestResult', key: 'mendTestResult' },
|
||||
{ title: '考试耗时', width: '80px', align: 'center', dataIndex: 'testTime', key: 'testTime' },
|
||||
{
|
||||
title: '考试状态', width: '80px', align: 'center', dataIndex: 'testState', key: 'testState', customRender: (text, record, index) => {
|
||||
// 考试状态 1-合格 2-不合格 3-未考试
|
||||
if (text == 1) return '合格'; else if (text == 2) return '不合格'; else if (text == 3) return '未考试';
|
||||
}
|
||||
},
|
||||
{ title: '操作', width: '70px', key: 'operation', align: 'center', scopedSlots: { customRender: 'action' } }
|
||||
],
|
||||
loadData: parameter => {
|
||||
this.queryParam.id = this.$route.query.id;
|
||||
return getArchivesProjectUserList(Object.assign(parameter, this.queryParam)).then(res => { return res });
|
||||
},
|
||||
};
|
||||
},
|
||||
// 计算属性 类似于data概念
|
||||
computed: {
|
||||
queryOptions: function () {
|
||||
let state = [{ id: '1', name: '合格' }, { id: '2', name: '不合格' }, { id: '3', name: '未考试' }]
|
||||
return [
|
||||
{ type: 'select', placeholder: '状态', key: 'state', options: [{ id: '', name: '全部' }, ...state] },
|
||||
{ type: 'input', placeholder: '姓名', key: 'userName' }
|
||||
]
|
||||
}
|
||||
},
|
||||
// 监控data中的数据变化
|
||||
watch: {},
|
||||
// 方法集合
|
||||
methods: {
|
||||
// 返回 按钮
|
||||
close() {
|
||||
this.$router.push({
|
||||
path: '/archives/project/Index', query: {
|
||||
queryParamTrainClass: this.$route.query.queryParamTrainClass,
|
||||
queryParamTrainWay: this.$route.query.queryParamTrainWay,
|
||||
queryParamProjectName: this.$route.query.queryParamProjectName,
|
||||
pageNum: this.$route.query.pageNum
|
||||
}
|
||||
});
|
||||
},
|
||||
handleRefresh() {
|
||||
this.$refs.table.refresh(true)
|
||||
},
|
||||
|
||||
// 培训详情
|
||||
archivesProjectUserDateil(record) {
|
||||
this.$router.push({
|
||||
path: '/archives/project/ProjectUserCourse', query: {
|
||||
projectId: this.$route.query.id,
|
||||
userId: record.id,
|
||||
queryParamState: this.queryParam.testState,
|
||||
queryParamUserName: this.queryParam.userName,
|
||||
pageNum1: this.$refs.table.localPagination.current,
|
||||
|
||||
queryParamTrainClass: this.$route.query.queryParamTrainClass,
|
||||
queryParamTrainWay: this.$route.query.queryParamTrainWay,
|
||||
queryParamProjectName: this.$route.query.queryParamProjectName,
|
||||
pageNum: this.$route.query.pageNum
|
||||
}
|
||||
});
|
||||
},
|
||||
// 答题记录
|
||||
archivesProjectUserAnswer(record) {
|
||||
this.$router.push({
|
||||
path: '/archives/project/ProjectUserAnswer', query: {
|
||||
projectId: this.$route.query.id,
|
||||
userId: record.id,
|
||||
queryParamState: this.queryParam.state,
|
||||
queryParamUserName: this.queryParam.userName,
|
||||
pageNum1: this.$refs.table.localPagination.current,
|
||||
|
||||
queryParamTrainClass: this.$route.query.queryParamTrainClass,
|
||||
queryParamTrainWay: this.$route.query.queryParamTrainWay,
|
||||
queryParamProjectName: this.$route.query.queryParamProjectName,
|
||||
pageNum: this.$route.query.pageNum
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
// 生命周期 - 创建完成(可以访问当前this实例)
|
||||
created() {
|
||||
if (this.$route.query.queryParamState) this.queryParam.state = this.$route.query.queryParamState;
|
||||
if (this.$route.query.queryParamUserName) this.queryParam.userName = this.$route.query.queryParamUserName;
|
||||
},
|
||||
// 生命周期 - 挂载完成(可以访问DOM元素)
|
||||
mounted() { },
|
||||
// 生命周期 - 创建之前
|
||||
beforeCreate() { },
|
||||
// 生命周期 - 挂载之前
|
||||
beforeMount() { },
|
||||
// 生命周期 - 更新之前
|
||||
beforeUpdate() { },
|
||||
// 生命周期 - 更新之后
|
||||
updated() { },
|
||||
// 生命周期 - 销毁之前
|
||||
beforeDestroy() { },
|
||||
// 生命周期 - 销毁完成
|
||||
destroyed() { },
|
||||
// 如果页面有keep-alive缓存功能,这个函数会触发
|
||||
activated() { }
|
||||
};
|
||||
|
||||
</script>
|
||||
<style scoped>
|
||||
</style>
|
|
@ -1,92 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" title="答题记录">
|
||||
<template slot="extra">
|
||||
<a-button size="small" @click="close">返回</a-button>
|
||||
</template>
|
||||
|
||||
<s-table ref="table" size="small" rowKey="id" :columns="columns" :data="loadData">
|
||||
<template slot="action" slot-scope="text, record">
|
||||
<a href="javascript:;" @click="archivesProjectUserAnswerDateil(record)">答题记录</a>
|
||||
</template>
|
||||
</s-table>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { STable, SearchCom } from '@/components'
|
||||
import { getArchivesProjectUserAnswerList } from '@/api/archives/project'
|
||||
|
||||
export default {
|
||||
// import引入的组件需要注入到对象中才能使用
|
||||
components: { STable, SearchCom },
|
||||
props: {},
|
||||
data() {
|
||||
// 这里存放数据
|
||||
return {
|
||||
queryParam: {},
|
||||
columns: [
|
||||
{ title: '交卷时间', width: 'auto', align: 'center', dataIndex: 'handDate', key: 'handDate' },
|
||||
{ title: '考试时长', width: 'auto', align: 'center', dataIndex: 'testTime', key: 'testTime' },
|
||||
{ title: '考试成绩', width: 'auto', align: 'center', dataIndex: 'testResult', key: 'testResult' },
|
||||
{ title: '操作', width: '100px', key: 'operation', align: 'center', scopedSlots: { customRender: 'action' } }
|
||||
],
|
||||
loadData: parameter => {
|
||||
this.queryParam.projectId = this.$route.query.projectId;
|
||||
this.queryParam.userId = this.$route.query.userId;
|
||||
return getArchivesProjectUserAnswerList(Object.assign(parameter, this.queryParam)).then(res => { return res });
|
||||
},
|
||||
};
|
||||
},
|
||||
// 计算属性 类似于data概念
|
||||
computed: {},
|
||||
// 监控data中的数据变化
|
||||
watch: {},
|
||||
// 方法集合
|
||||
methods: {
|
||||
// 返回 按钮
|
||||
close() {
|
||||
this.$router.push({
|
||||
path: '/archives/project/ProjectUser', query: {
|
||||
queryParamState: this.$route.query.queryParamState,
|
||||
queryParamUserName: this.$route.query.queryParamUserName,
|
||||
pageNum1: this.$route.query.pageNum1,
|
||||
|
||||
queryParamTrainClass: this.$route.query.queryParamTrainClass,
|
||||
queryParamTrainWay: this.$route.query.queryParamTrainWay,
|
||||
queryParamProjectName: this.$route.query.queryParamProjectName,
|
||||
pageNum: this.$route.query.pageNum
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// 答题记录
|
||||
archivesProjectUserAnswerDateil(record) {
|
||||
console.log('详情',record);
|
||||
|
||||
this.$router.push({ path: '/myreport', query: { type: 'exam', reportId: record.reportId } })
|
||||
}
|
||||
|
||||
},
|
||||
// 生命周期 - 创建完成(可以访问当前this实例)
|
||||
created() { },
|
||||
// 生命周期 - 挂载完成(可以访问DOM元素)
|
||||
mounted() { },
|
||||
// 生命周期 - 创建之前
|
||||
beforeCreate() { },
|
||||
// 生命周期 - 挂载之前
|
||||
beforeMount() { },
|
||||
// 生命周期 - 更新之前
|
||||
beforeUpdate() { },
|
||||
// 生命周期 - 更新之后
|
||||
updated() { },
|
||||
// 生命周期 - 销毁之前
|
||||
beforeDestroy() { },
|
||||
// 生命周期 - 销毁完成
|
||||
destroyed() { },
|
||||
// 如果页面有keep-alive缓存功能,这个函数会触发
|
||||
activated() { }
|
||||
};
|
||||
|
||||
</script>
|
||||
<style scoped>
|
||||
</style>
|
|
@ -1,106 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" title="培训详情">
|
||||
<template slot="extra">
|
||||
<a-button size="small" @click="close">返回</a-button>
|
||||
</template>
|
||||
|
||||
<div class="table-page-search-wrapper">
|
||||
<SearchCom :form="queryParam" :list="queryOptions" @search="handleRefresh" @reset="() => {queryParam = {}, handleRefresh()}"></SearchCom>
|
||||
</div>
|
||||
<s-table ref="table" size="small" rowKey="id" :columns="columns" :data="loadData"></s-table>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { STable, SearchCom } from '@/components'
|
||||
import { getArchivesProjectUserCourseList } from '@/api/archives/project'
|
||||
|
||||
export default {
|
||||
// import引入的组件需要注入到对象中才能使用
|
||||
components: { STable, SearchCom },
|
||||
props: {},
|
||||
data() {
|
||||
// 这里存放数据
|
||||
return {
|
||||
queryParam: { courseName: '' },
|
||||
columns: [
|
||||
{ title: '课程名称', width: 'auto', align: 'center', dataIndex: 'courseName', key: 'name' },
|
||||
{ title: '应修学时', width: '100px', align: 'center', dataIndex: 'mustClassHour', key: 'mustClassHour' },
|
||||
{ title: '已修学时', width: '100px', align: 'center', dataIndex: 'alreadyClassHour', key: 'alreadyClassHour' },
|
||||
{ title: '总题量', width: '80px', align: 'center', dataIndex: 'addUpExercises', key: 'addUpExercises' },
|
||||
{ title: '已答题量', width: '100px', align: 'center', dataIndex: 'alreadyExercises', key: 'alreadyExercises' },
|
||||
{ title: '答对题量', width: '90px', align: 'center', dataIndex: 'yesExercises', key: 'yesExercises' },
|
||||
{ title: '答对正确率', width: '90px', align: 'center', dataIndex: 'yesRate', key: 'yesRate' },
|
||||
{
|
||||
title: '完成状态', width: '80px', align: 'center', dataIndex: 'finishState', key: 'finishState', customRender: (text, record, index) => {
|
||||
// 完成状态 0-未完成 1-已完成
|
||||
if (text == 0) return '未完成'; else if (text == 1) return '已完成';
|
||||
}
|
||||
}
|
||||
],
|
||||
loadData: parameter => {
|
||||
this.queryParam.projectId = this.$route.query.projectId;
|
||||
this.queryParam.userId = this.$route.query.userId;
|
||||
return getArchivesProjectUserCourseList(Object.assign(parameter, this.queryParam)).then(res => { return res });
|
||||
},
|
||||
};
|
||||
},
|
||||
// 计算属性 类似于data概念
|
||||
computed: {
|
||||
queryOptions: function () {
|
||||
return [
|
||||
{ type: 'input', placeholder: '课程名称', key: 'courseName' }
|
||||
]
|
||||
}
|
||||
},
|
||||
// 监控data中的数据变化
|
||||
watch: {},
|
||||
// 方法集合
|
||||
methods: {
|
||||
// 返回 按钮
|
||||
close() {
|
||||
this.$router.push({
|
||||
path: '/archives/project/ProjectUser', query: {
|
||||
projectId:this.$route.query.projectId,
|
||||
userId:this.$route.query.userId,
|
||||
|
||||
queryParamState: this.$route.query.queryParamState,
|
||||
queryParamUserName: this.$route.query.queryParamUserName,
|
||||
pageNum1: this.$route.query.pageNum1,
|
||||
|
||||
queryParamTrainClass: this.$route.query.queryParamTrainClass,
|
||||
queryParamTrainWay: this.$route.query.queryParamTrainWay,
|
||||
queryParamProjectName: this.$route.query.queryParamProjectName,
|
||||
pageNum: this.$route.query.pageNum
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
handleRefresh() {
|
||||
this.$refs.table.refresh(true)
|
||||
},
|
||||
|
||||
},
|
||||
// 生命周期 - 创建完成(可以访问当前this实例)
|
||||
created() { },
|
||||
// 生命周期 - 挂载完成(可以访问DOM元素)
|
||||
mounted() { },
|
||||
// 生命周期 - 创建之前
|
||||
beforeCreate() { },
|
||||
// 生命周期 - 挂载之前
|
||||
beforeMount() { },
|
||||
// 生命周期 - 更新之前
|
||||
beforeUpdate() { },
|
||||
// 生命周期 - 更新之后
|
||||
updated() { },
|
||||
// 生命周期 - 销毁之前
|
||||
beforeDestroy() { },
|
||||
// 生命周期 - 销毁完成
|
||||
destroyed() { },
|
||||
// 如果页面有keep-alive缓存功能,这个函数会触发
|
||||
activated() { }
|
||||
};
|
||||
|
||||
</script>
|
||||
<style scoped>
|
||||
</style>
|
|
@ -1,194 +0,0 @@
|
|||
<template>
|
||||
<a-row :gutter="24" >
|
||||
<a-col :md="5" :sm="24">
|
||||
<a-card :bordered="false" :loading="treeLoading">
|
||||
<div v-if="this.orgTree != ''">
|
||||
<a-tree
|
||||
:treeData="orgTree"
|
||||
:onLoadData="orgTree"
|
||||
v-if="orgTree.length"
|
||||
@select="handleClick"
|
||||
:defaultExpandAll="false"
|
||||
:defaultExpandedKeys="expandedKeys"
|
||||
:defaultSelectedKeys="selectedKeys"
|
||||
:replaceFields="replaceFields" />
|
||||
</div>
|
||||
<div v-else>
|
||||
<a-empty :image="simpleImage" />
|
||||
</div>
|
||||
|
||||
</a-card>
|
||||
</a-col>
|
||||
<a-col :md="19" :sm="24">
|
||||
<a-card :bordered="false" title="人员档案">
|
||||
<div class="table-page-search-wrapper">
|
||||
<SearchCom :form="queryParam" :list="queryOptions" :orgTree="orgTreeOptions" @search="handleRefresh" @reset="() => {queryParam = {}, handleRefresh()}"></SearchCom>
|
||||
<div style="width: 100%; height: 32px; margin-bottom: 8px;">
|
||||
<!-- <a-button type="primary" :style="{float: 'right'}">导出</a-button> -->
|
||||
</div>
|
||||
</div>
|
||||
<s-table ref="table" size="small" rowKey="id" :columns="columns" :data="loadData" :pageNum="Number(this.$route.query.archivesUserPageNum) || 1">
|
||||
<template slot="action" slot-scope="text, record">
|
||||
<a-dropdown v-if="hasPerm('archives:user:autotrain:list') || hasPerm('archives:user:terminaltrain:list') || hasPerm('archives:user:selfStudy:list') || hasPerm('archives:user:violation:list')">
|
||||
<a class="ant-dropdown-link">操作
|
||||
<a-icon type="down" />
|
||||
</a>
|
||||
<a-menu slot="overlay">
|
||||
<a-menu-item v-if="hasPerm('archives:user:autotrain:list') || hasPerm('archives:user:terminaltrain:list')">
|
||||
<a href="javascript:;" @click="archivesProject(record)">项目档案</a>
|
||||
</a-menu-item>
|
||||
<!-- <a-menu-item v-if="hasPerm('archives:user:selfStudy:list')">
|
||||
<a href="javascript:;" @click="archivesSelfStudy(record)">自学档案</a>
|
||||
</a-menu-item> -->
|
||||
<a-menu-item v-if="hasPerm('archives:user:violation:list')">
|
||||
<a href="javascript:;" @click="archivesViolation(record)">违章档案</a>
|
||||
</a-menu-item>
|
||||
<!-- <a-menu-item>
|
||||
<a-popconfirm title="确认导出?" cancelText="取消" okText="确认" @confirm="() => handleDelete(record)">
|
||||
<a href="javascript:;"> 导出 </a>
|
||||
</a-popconfirm>
|
||||
</a-menu-item> -->
|
||||
</a-menu>
|
||||
</a-dropdown>
|
||||
</template>
|
||||
</s-table>
|
||||
</a-card>
|
||||
</a-col>
|
||||
</a-row>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { STable, SearchCom } from '@/components'
|
||||
import { getArchivesUserList } from '@/api/archives/user'
|
||||
import { Empty } from 'ant-design-vue'
|
||||
import { orgList } from '@/api/org/org'
|
||||
import { listToTree } from '@/utils/util'
|
||||
|
||||
export default {
|
||||
components: { STable, SearchCom },
|
||||
data() {
|
||||
return {
|
||||
queryParam: { name: this.$route.query.archivesUserName || ''},
|
||||
columns: [
|
||||
{ title: '姓名', width: '100px', align: 'center', dataIndex: 'name', key: 'name' },
|
||||
// { title: '受训角色', width: 'auto', align: 'center', dataIndex: 'roleName', key: 'roleName' },
|
||||
{ title: '单位信息', width: 'auto', align: 'center', dataIndex: 'dwOrgName', key: 'dwOrgName' },
|
||||
{ title: '部门信息', width: 'auto', align: 'center', dataIndex: 'bmOrgName', key: 'bmOrgName' },
|
||||
{ title: '年度学时要求/时', width: 'auto', align: 'center', dataIndex: 'yearClassHourRequire', key: 'yearClassHourRequire' },
|
||||
{ title: '年度学时', width: 'auto', align: 'center', dataIndex: 'yearClassHour', key: 'yearClassHour' },
|
||||
{ title: '累计学时', width: 'auto', align: 'center', dataIndex: 'addUpClassHour', key: 'addUpClassHour' },
|
||||
{ title: '项目学时', width: 'auto', align: 'center', dataIndex: 'projectClassHour', key: 'projectClassHour' },
|
||||
{ title: '操作', width: '70px', key: 'operation', align: 'center', scopedSlots: { customRender: 'action' } }
|
||||
],
|
||||
loadData: parameter => {
|
||||
if (!this.orgId) return []
|
||||
return getArchivesUserList(Object.assign(parameter, this.queryParam, { orgId: this.orgId })).then(res => {
|
||||
return res
|
||||
})
|
||||
},
|
||||
treeLoading: true,
|
||||
orgTree: [],
|
||||
expandedKeys: [],
|
||||
selectedKeys: [],
|
||||
simpleImage: Empty.PRESENTED_IMAGE_SIMPLE,
|
||||
replaceFields: {
|
||||
children: 'children',
|
||||
title: 'name',
|
||||
key: 'id',
|
||||
value: 'id'
|
||||
},
|
||||
orgId: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
queryOptions: function () {
|
||||
return [
|
||||
{ type: 'input', placeholder: '人员姓名', key: 'name' }
|
||||
]
|
||||
},
|
||||
orgTreeOptions: () => {
|
||||
return { ifshow: true, formKey: 'orgId', startOrganizationId: '', defaultOrganizationId: '' };
|
||||
}
|
||||
},
|
||||
created () {
|
||||
this.getOrgTree()
|
||||
},
|
||||
methods: {
|
||||
getOrgTree () {
|
||||
orgList({ orgType: 1 }).then(res => {
|
||||
this.treeLoading = false
|
||||
this.expandedKeys = []
|
||||
this.selectedKeys = []
|
||||
if (!res.code === 200 || !res.data.length) {
|
||||
this.orgTree = []
|
||||
this.$refs.table.refresh(true)
|
||||
return
|
||||
}
|
||||
this.orgTree = listToTree(res.data, [], 0)
|
||||
console.log(this.orgTree)
|
||||
this.orgId = this.orgTree[0].id
|
||||
this.selectedKeys.push(this.orgId)
|
||||
// 默认展开
|
||||
this.orgTree.forEach(item => {
|
||||
this.expandedKeys.push(item.id)
|
||||
})
|
||||
|
||||
this.handleClick(this.orgId)
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 点击左侧机构树查询列表
|
||||
*/
|
||||
handleClick (e) {
|
||||
this.orgId = e.toString()
|
||||
this.$refs.table.refresh(true)
|
||||
},
|
||||
handleRefresh() {
|
||||
this.$refs.table.refresh(true)
|
||||
},
|
||||
// 项目档案 按钮
|
||||
archivesProject(record) {
|
||||
this.$router.push({
|
||||
path: '/archives/user/Project', query: {
|
||||
id: record.id,
|
||||
archivesUserName: this.queryParam.name,
|
||||
archivesUserOrgId: this.orgId,
|
||||
archivesUserPageNum: this.$refs.table.localPagination.current
|
||||
}
|
||||
});
|
||||
},
|
||||
// 自学档案 按钮
|
||||
archivesSelfStudy(record) {
|
||||
this.$router.push({
|
||||
path: '/archives/user/SelfStudy', query: {
|
||||
id: record.id,
|
||||
archivesUserName: this.queryParam.name,
|
||||
archivesUserOrgId: this.orgId,
|
||||
archivesUserPageNum: this.$refs.table.localPagination.current
|
||||
}
|
||||
});
|
||||
},
|
||||
// 违章档案 按钮
|
||||
archivesViolation(record) {
|
||||
this.$router.push({
|
||||
path: '/archives/user/Violation', query: {
|
||||
id: record.id,
|
||||
archivesUserName: this.queryParam.name,
|
||||
archivesUserOrgId: this.orgId,
|
||||
archivesUserPageNum: this.$refs.table.localPagination.current
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style scoped>
|
||||
.table-page-search-wrapper-button-group {
|
||||
width: 100%;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.ant-card-body {
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
|
@ -1,212 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" title="项目档案">
|
||||
<template slot="extra">
|
||||
<a-button size="small" @click="close">返回</a-button>
|
||||
</template>
|
||||
<a-tabs :animated="false" :default-active-key="this.$route.query.defaultActiveKey || '1'" @change="callback" :headStyle="{paddingTop: '0px'}">
|
||||
<a-tab-pane key="1" tab="自主培训">
|
||||
<div class="table-page-search-wrapper">
|
||||
<SearchCom :form="tabs1.queryParam" :list="tabs1QueryOptions" @search="tabs1HandleRefresh" @reset="() => {queryParam = {}, tabs1HandleRefresh()}"></SearchCom>
|
||||
</div>
|
||||
<s-table ref="table1" size="small" rowKey="id" :columns="tabs1.columns" :data="tabs1.loadData" :pageNum="Number(this.$route.query.archivesUserProjectTable1PageNum) || 1">
|
||||
<template slot="action" slot-scope="text, record">
|
||||
<a href="javascript:;" @click="trainDetail(record)" v-if="hasPerm('archives:user:autotrain:detail:list')">培训详情</a>
|
||||
<br v-if="hasPerm('archives:user:autotrain:detail:list') && hasPerm('archives:user:autotrain:answer:list')" />
|
||||
<a href="javascript:;" @click="trainAnswer(record)" v-if="hasPerm('archives:user:autotrain:answer:list')">答题记录</a>
|
||||
</template>
|
||||
</s-table>
|
||||
</a-tab-pane>
|
||||
<a-tab-pane key="2" tab="终端培训" force-render>
|
||||
<div class="table-page-search-wrapper">
|
||||
<SearchCom :form="tabs2.queryParam" :list="tabs2QueryOptions" @search="tabs2HandleRefresh" @reset="() => {queryParam = {}, tabs2HandleRefresh()}"></SearchCom>
|
||||
</div>
|
||||
<s-table ref="table2" size="small" rowKey="id" :columns="tabs2.columns" :data="tabs2.loadData" :pageNum="Number(this.$route.query.archivesUserProjectTable2PageNum) || 1">
|
||||
<template slot="action" slot-scope="text, record">
|
||||
<a href="javascript:;" @click="terminalTrainDetail(record)" v-if="hasPerm('archives:user:terminaltrain:detail')">查看详情</a>
|
||||
</template>
|
||||
</s-table>
|
||||
</a-tab-pane>
|
||||
</a-tabs>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { STable, SearchCom } from '@/components'
|
||||
import { getArchivesUserAutoTrainList, getArchivesUserTerminalTrainList } from '@/api/archives/user'
|
||||
|
||||
export default {
|
||||
components: { STable, SearchCom },
|
||||
data() {
|
||||
return {
|
||||
personId: this.$route.query.id,
|
||||
tabs1: {
|
||||
queryParam: {
|
||||
projectName: this.$route.query.archivesUserProjectTable1ProjectName || '',
|
||||
finishState: this.$route.query.archivesUserProjectTable1FinishState || ''
|
||||
},
|
||||
columns: [
|
||||
{ title: '项目名称', width: 'auto', align: 'center', dataIndex: 'projectName', key: 'projectName' },
|
||||
{
|
||||
title: '项目时间',
|
||||
width: 'auto',
|
||||
align: 'center',
|
||||
dataIndex: 'startDate',
|
||||
key: 'startDate',
|
||||
customRender: (text, record, index) => {
|
||||
return record.startDate + ' - ' + record.endDate
|
||||
},
|
||||
},
|
||||
// { title: '受训角色', width: 'auto', align: 'center', dataIndex: 'roleName', key: 'roleName' },
|
||||
{ title: '应修学时', width: 'auto', align: 'center', dataIndex: 'mustClassHour', key: 'mustClassHour' },
|
||||
{ title: '已修学时', width: 'auto', align: 'center', dataIndex: 'alreadyClassHour', key: 'alreadyClassHour' },
|
||||
{
|
||||
title: '完成状态', width: 'auto', align: 'center', dataIndex: 'finishState', key: 'finishState', customRender: (text, record, index) => {
|
||||
// 完成状态 0-未完成 1-已完成
|
||||
if (text == 0) return '未完成'; else if (text == 1) return '已完成';
|
||||
}
|
||||
},
|
||||
{ title: '总练习题量', width: 'auto', align: 'center', dataIndex: 'addUpExercises', key: 'addUpExercises' },
|
||||
{ title: '已练习题量', width: 'auto', align: 'center', dataIndex: 'alreadyExercises', key: 'alreadyExercises' },
|
||||
{ title: '答对题量', width: 'auto', align: 'center', dataIndex: 'yesTopic', key: 'yesTopic' },
|
||||
{ title: '正确率', width: 'auto', align: 'center', dataIndex: 'yesRate', key: 'yesRate', customRender: (text, record, index) => {
|
||||
if (text) return text; else return '0%';
|
||||
} },
|
||||
{ title: '考试成绩', width: 'auto', align: 'center', dataIndex: 'testResult', key: 'testResult' },
|
||||
// { title: '补考成绩', width: 'auto', align: 'center', dataIndex: 'mendTestResult', key: 'mendTestResult' },
|
||||
{ title: '考试耗时', width: 'auto', align: 'center', dataIndex: 'testTime', key: 'testTime' },
|
||||
{
|
||||
title: '考试状态', width: 'auto', align: 'center', dataIndex: 'testState', key: 'testState', customRender: (text, record, index) => {
|
||||
// 考试状态 0-不合格 1-合格
|
||||
if (text == 0) return '不合格'; else if (text == 1) return '合格';
|
||||
}
|
||||
},
|
||||
{ title: '操作', width: '90px', key: 'operation', align: 'center', scopedSlots: { customRender: 'action' } }
|
||||
],
|
||||
loadData: parameter => { return getArchivesUserAutoTrainList(Object.assign(parameter, this.tabs1.queryParam, {personId : this.personId})).then(res => { return res }) }
|
||||
},
|
||||
tabs2: {
|
||||
queryParam: { projectName: this.$route.query.archivesUserProjectTable2projectName || '' },
|
||||
columns: [
|
||||
{ title: '项目名称', width: 'auto', align: 'center', dataIndex: 'projectName', key: 'projectName' },
|
||||
{
|
||||
title: '项目时间',
|
||||
width: 'auto',
|
||||
align: 'center',
|
||||
dataIndex: 'startDate',
|
||||
key: 'startDate',
|
||||
customRender: (text, record, index) => {
|
||||
return record.startDate + ' - ' + record.endDate
|
||||
},
|
||||
},
|
||||
// { title: '受训角色', width: 'auto', align: 'center', dataIndex: 'roleName', key: 'roleName' },
|
||||
{ title: '培训地址', width: 'auto', align: 'center', dataIndex: 'trainAddr', key: 'trainAddr' },
|
||||
{ title: '签到时间', width: 'auto', align: 'center', dataIndex: 'signInTime', key: 'signInTime' },
|
||||
{
|
||||
title: '完成状态', width: 'auto', align: 'center', dataIndex: 'finishState', key: 'finishState', customRender: (text, record, index) => {
|
||||
// 完成状态 0-未完成 1-已完成
|
||||
if (text == 0) return '未完成'; else if (text == 1) return '已完成';
|
||||
}
|
||||
},
|
||||
{ title: '操作', width: '90px', key: 'operation', align: 'center', scopedSlots: { customRender: 'action' } }
|
||||
],
|
||||
loadData: parameter => { return getArchivesUserTerminalTrainList(Object.assign(parameter, this.tabs2.queryParam, {personId : this.personId})).then(res => { return res }) }
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabs1QueryOptions: function () {
|
||||
return [
|
||||
{ type: 'input', placeholder: '项目名称', key: 'projectName' },
|
||||
{
|
||||
type: 'select', placeholder: '完成状态', key: 'finishState', options: [
|
||||
{ id: '', name: '全部' },
|
||||
{ id: '1', name: '已完成' },
|
||||
{ id: '0', name: '未完成' }
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
tabs2QueryOptions: function () {
|
||||
return [
|
||||
{ type: 'input', placeholder: '项目名称', key: 'projectName' }
|
||||
]
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
callback(key) {
|
||||
if (key === '1') {
|
||||
this.tabs1.queryParam = {};
|
||||
this.tabs1HandleRefresh();
|
||||
} else {
|
||||
this.tabs2.queryParam = {};
|
||||
this.tabs2HandleRefresh();
|
||||
}
|
||||
},
|
||||
tabs1HandleRefresh() {
|
||||
this.$refs.table1.refresh(true)
|
||||
},
|
||||
tabs2HandleRefresh() {
|
||||
this.$refs.table2.refresh(true)
|
||||
},
|
||||
// 培训详情 按钮
|
||||
trainDetail(record) {
|
||||
this.$router.push({
|
||||
path: '/archives/user/ProjectDetail', query: {
|
||||
personId: this.personId,
|
||||
projectId: record.id,
|
||||
archivesUserName: this.$route.query.archivesUserName,
|
||||
archivesUserOrgId: this.$route.query.archivesUserOrgId,
|
||||
archivesUserPageNum: this.$route.query.archivesUserPageNum,
|
||||
archivesUserProjectTable1ProjectName: this.tabs1.queryParam.projectName,
|
||||
archivesUserProjectTable1FinishState: this.tabs1.queryParam.finishState,
|
||||
archivesUserProjectTable1PageNum: this.$refs.table1.localPagination.current,
|
||||
defaultActiveKey: '1'
|
||||
}
|
||||
});
|
||||
},
|
||||
// 答题记录 按钮
|
||||
trainAnswer(record) {
|
||||
this.$router.push({
|
||||
path: '/archives/user/ProjectAnswer', query: {
|
||||
personId: this.personId,
|
||||
projectId: record.id,
|
||||
archivesUserName: this.$route.query.archivesUserName,
|
||||
archivesUserOrgId: this.$route.query.archivesUserOrgId,
|
||||
archivesUserPageNum: this.$route.query.archivesUserPageNum,
|
||||
archivesUserProjectTable1ProjectName: this.tabs1.queryParam.projectName,
|
||||
archivesUserProjectTable1FinishState: this.tabs1.queryParam.finishState,
|
||||
archivesUserProjectTable1PageNum: this.$refs.table1.localPagination.current,
|
||||
defaultActiveKey: '1'
|
||||
}
|
||||
});
|
||||
},
|
||||
// 终端培训详情 按钮
|
||||
terminalTrainDetail(record) {
|
||||
this.$router.push({
|
||||
path: '/archives/user/TerminalTrainDetail', query: {
|
||||
personId: this.personId,
|
||||
projectId: record.id,
|
||||
signInTime: record.signInTime,
|
||||
state: record.finishState,
|
||||
archivesUserName: this.$route.query.archivesUserName,
|
||||
archivesUserOrgId: this.$route.query.archivesUserOrgId,
|
||||
archivesUserPageNum: this.$route.query.archivesUserPageNum,
|
||||
archivesUserProjectTable2projectName: this.tabs2.queryParam.projectName,
|
||||
archivesUserProjectTable2PageNum: this.$refs.table2.localPagination.current,
|
||||
defaultActiveKey: '2'
|
||||
}
|
||||
});
|
||||
},
|
||||
// 返回 按钮
|
||||
close() {
|
||||
this.$router.push({
|
||||
path: '/archives/user/Index', query: {
|
||||
archivesUserName: this.$route.query.archivesUserName,
|
||||
archivesUserOrgId: this.$route.query.archivesUserOrgId,
|
||||
archivesUserPageNum: this.$route.query.archivesUserPageNum
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -1,56 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" title="答题记录">
|
||||
<template slot="extra">
|
||||
<a-button size="small" @click="close">返回</a-button>
|
||||
</template>
|
||||
<s-table ref="table" size="default" rowKey="id" :columns="columns" :data="loadData">
|
||||
<template slot="action" slot-scope="text, record">
|
||||
<a href="javascript:;" @click="trainDetail(record)">答题记录</a>
|
||||
</template>
|
||||
</s-table>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { STable, SearchCom } from '@/components'
|
||||
import { getArchivesUserAutoTrainAnswerList } from '@/api/archives/user'
|
||||
|
||||
export default {
|
||||
components: { STable, SearchCom },
|
||||
data() {
|
||||
return {
|
||||
personId: this.$route.query.personId,
|
||||
projectId: this.$route.query.projectId,
|
||||
queryParam: { personId: this.$route.query.personId, projectId: this.$route.query.projectId },
|
||||
columns: [
|
||||
{ title: '交卷时间', width: 'auto', align: 'center', dataIndex: 'handDate', key: 'handDate' },
|
||||
{ title: '考试时长', width: 'auto', align: 'center', dataIndex: 'testTime', key: 'testTime' },
|
||||
{ title: '考试成绩', width: 'auto', align: 'center', dataIndex: 'testResult', key: 'testResult' },
|
||||
{ title: '操作', width: 'auto', key: 'operation', align: 'center', scopedSlots: { customRender: 'action' } }
|
||||
],
|
||||
loadData: parameter => { return getArchivesUserAutoTrainAnswerList(Object.assign(parameter, this.queryParam)).then(res => { return res }) }
|
||||
}
|
||||
},
|
||||
computed: {},
|
||||
methods: {
|
||||
// 返回 按钮
|
||||
close() {
|
||||
this.$router.push({
|
||||
path: '/archives/user/Project', query: {
|
||||
id: this.$route.query.personId,
|
||||
archivesUserName: this.$route.query.archivesUserName,
|
||||
archivesUserOrgId: this.$route.query.archivesUserOrgId,
|
||||
archivesUserPageNum: this.$route.query.archivesUserPageNum,
|
||||
archivesUserProjectTable1ProjectName: this.$route.query.archivesUserProjectTable1ProjectName,
|
||||
archivesUserProjectTable1FinishState: this.$route.query.archivesUserProjectTable1FinishState,
|
||||
archivesUserProjectTable1PageNum: this.$route.query.archivesUserProjectTable1PageNum,
|
||||
defaultActiveKey: this.$route.query.defaultActiveKey
|
||||
}
|
||||
});
|
||||
},
|
||||
trainDetail (record) {
|
||||
this.$router.push({ path: '/myreport', query: { type: 'exam', reportId: record.reportId } })
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -1,70 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" title="培训详情">
|
||||
<template slot="extra">
|
||||
<a-button size="small" @click="close">返回</a-button>
|
||||
</template>
|
||||
<div class="table-page-search-wrapper">
|
||||
<SearchCom :form="queryParam" :list="queryOptions" @search="handleRefresh" @reset="() => {queryParam = {}, handleRefresh()}"></SearchCom>
|
||||
</div>
|
||||
<s-table ref="table" size="default" rowKey="id" :columns="columns" :data="loadData"></s-table>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { STable, SearchCom } from '@/components'
|
||||
import { getArchivesUserAutoTrainDetailList } from '@/api/archives/user'
|
||||
|
||||
export default {
|
||||
components: { STable, SearchCom },
|
||||
data() {
|
||||
return {
|
||||
queryParam: { personId: this.$route.query.personId, projectId: this.$route.query.projectId, courseName: '' },
|
||||
columns: [
|
||||
{ title: '课程名称', width: 'auto', align: 'center', dataIndex: 'courseName', key: 'courseName' },
|
||||
{ title: '应修学时', width: 'auto', align: 'center', dataIndex: 'mustClassHour', key: 'mustClassHour' },
|
||||
{ title: '已修学时', width: 'auto', align: 'center', dataIndex: 'alreadyClassHour', key: 'alreadyClassHour' },
|
||||
{ title: '总题量', width: 'auto', align: 'center', dataIndex: 'addUpExercises', key: 'addUpExercises' },
|
||||
{ title: '已答题量', width: 'auto', align: 'center', dataIndex: 'alreadyExercises', key: 'alreadyExercises' },
|
||||
{ title: '答对题量', width: 'auto', align: 'center', dataIndex: 'yesExercises', key: 'yesExercises' },
|
||||
{ title: '答对正确率', width: 'auto', align: 'center', dataIndex: 'yesRate', key: 'yesRate' },
|
||||
{
|
||||
title: '完成状态', width: 'auto', align: 'center', dataIndex: 'finishState', key: 'finishState', customRender: (text, record, index) => {
|
||||
// 完成状态 0-未完成 1-已完成
|
||||
if (text == 0) return '未完成'; else if (text == 1) return '已完成';
|
||||
}
|
||||
}
|
||||
],
|
||||
loadData: parameter => { return getArchivesUserAutoTrainDetailList(Object.assign(parameter, this.queryParam)).then(res => { return res }) }
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
queryOptions: function () {
|
||||
return [
|
||||
{ type: 'input', placeholder: '课程名称', key: 'courseName' },
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleRefresh() {
|
||||
this.queryParam.personId = this.$route.query.personId;
|
||||
this.queryParam.projectId = this.$route.query.projectId;
|
||||
this.$refs.table.refresh(true)
|
||||
},
|
||||
// 返回 按钮
|
||||
close() {
|
||||
this.$router.push({
|
||||
path: '/archives/user/Project', query: {
|
||||
id: this.$route.query.personId,
|
||||
archivesUserName: this.$route.query.archivesUserName,
|
||||
archivesUserOrgId: this.$route.query.archivesUserOrgId,
|
||||
archivesUserPageNum: this.$route.query.archivesUserPageNum,
|
||||
archivesUserProjectTable1ProjectName: this.$route.query.archivesUserProjectTable1ProjectName,
|
||||
archivesUserProjectTable1FinishState: this.$route.query.archivesUserProjectTable1FinishState,
|
||||
archivesUserProjectTable1PageNum: this.$route.query.archivesUserProjectTable1PageNum,
|
||||
defaultActiveKey: this.$route.query.defaultActiveKey
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -1,54 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" title="自学档案">
|
||||
<template slot="extra">
|
||||
<a-button size="small" @click="close">返回</a-button>
|
||||
</template>
|
||||
<div class="table-page-search-wrapper">
|
||||
<SearchCom :form="queryParam" :list="queryOptions" @search="handleRefresh" @reset="() => {queryParam = {}, handleRefresh()}"></SearchCom>
|
||||
</div>
|
||||
<s-table ref="table" size="small" rowKey="id" :columns="columns" :data="loadData"></s-table>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { STable, SearchCom } from '@/components'
|
||||
import { getArchivesUserSelfStudyList } from '@/api/archives/user'
|
||||
|
||||
export default {
|
||||
components: { STable, SearchCom },
|
||||
data() {
|
||||
return {
|
||||
queryParam: { personId: this.$route.query.personId, courseName: '' },
|
||||
columns: [
|
||||
{ title: '课程名称', width: 'auto', align: 'center', dataIndex: 'courseName', key: 'courseName' },
|
||||
{ title: '课时(分)', width: 'auto', align: 'center', dataIndex: 'classHour', key: 'classHour' },
|
||||
{ title: '已学学时', width: 'auto', align: 'center', dataIndex: 'alreadyClassHour', key: 'alreadyClassHour' },
|
||||
],
|
||||
loadData: parameter => { return getArchivesUserSelfStudyList(Object.assign(parameter, this.queryParam)).then(res => { return res }) }
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
queryOptions: function () {
|
||||
return [
|
||||
{ type: 'input', placeholder: '课程名称', key: 'courseName' },
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleRefresh() {
|
||||
this.queryParam.personId = this.$route.query.personId;
|
||||
this.$refs.table.refresh(true)
|
||||
},
|
||||
// 返回 按钮
|
||||
close() {
|
||||
this.$router.push({
|
||||
path: '/archives/user/Index', query: {
|
||||
archivesUserName: this.$route.query.archivesUserName,
|
||||
archivesUserOrgId: this.$route.query.archivesUserOrgId,
|
||||
archivesUserPageNum: this.$route.query.archivesUserPageNum
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -1,68 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" title="终端培训详情">
|
||||
<template slot="extra">
|
||||
<a-button size="small" @click="close">返回</a-button>
|
||||
</template>
|
||||
<a-descriptions title="集中培训详情" layout="horizontal" bordered size="small" :column="1">
|
||||
<a-descriptions-item label="培训名称">{{detailData.name}}</a-descriptions-item>
|
||||
<a-descriptions-item label="培训时间">{{detailData.time}}</a-descriptions-item>
|
||||
<a-descriptions-item label="主持人">{{detailData.host}}</a-descriptions-item>
|
||||
<a-descriptions-item label="会议人数">{{detailData.personSize}}</a-descriptions-item>
|
||||
<a-descriptions-item label="学习内容">{{detailData.studyContent}}</a-descriptions-item>
|
||||
<a-descriptions-item label="联系人">{{detailData.contact}}</a-descriptions-item>
|
||||
<a-descriptions-item label="备注">{{detailData.remark}}</a-descriptions-item>
|
||||
</a-descriptions>
|
||||
<br />
|
||||
<a-descriptions title="签到时间" layout="horizontal" bordered size="small" :column="1">
|
||||
<a-descriptions-item label="时间">{{detailData.signInTime}}</a-descriptions-item>
|
||||
</a-descriptions>
|
||||
<br />
|
||||
<a-descriptions title="培训状态" layout="horizontal" bordered size="small" :column="1">
|
||||
<a-descriptions-item label="状态">{{detailData.state}}</a-descriptions-item>
|
||||
</a-descriptions>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getArchivesUserTerminalTrainDetail } from '@/api/archives/user'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
queryParam: { personId: this.$route.query.personId, projectId: this.$route.query.projectId },
|
||||
detailData: {}
|
||||
}
|
||||
},
|
||||
created: function () {
|
||||
let parameter = {};
|
||||
getArchivesUserTerminalTrainDetail(Object.assign(parameter, this.queryParam)).then(res => {
|
||||
this.detailData = res.data
|
||||
this.detailData.signInTime = this.$route.query.signInTime
|
||||
this.detailData.state = this.$route.query.state == 1 ? '已完成' : '未完成'
|
||||
});
|
||||
|
||||
},
|
||||
methods: {
|
||||
close() {
|
||||
this.$router.push({
|
||||
path: '/archives/user/Project', query: {
|
||||
id: this.$route.query.personId,
|
||||
archivesUserName: this.$route.query.archivesUserName,
|
||||
archivesUserOrgId: this.$route.query.archivesUserOrgId,
|
||||
archivesUserPageNum: this.$route.query.archivesUserPageNum,
|
||||
archivesUserProjectTable2projectName: this.$route.query.archivesUserProjectTable2projectName,
|
||||
archivesUserProjectTable2PageNum: this.$route.query.archivesUserProjectTable2PageNum,
|
||||
defaultActiveKey: this.$route.query.defaultActiveKey
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.ant-descriptions-item-label {
|
||||
width: 100px;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
|
@ -1,56 +0,0 @@
|
|||
<template>
|
||||
<a-card :bordered="false" title="违章档案">
|
||||
<template slot="extra">
|
||||
<a-button size="small" @click="close">返回</a-button>
|
||||
</template>
|
||||
<div class="table-page-search-wrapper">
|
||||
<SearchCom :form="queryParam" :list="queryOptions" @search="handleRefresh" @reset="() => {queryParam = {}, handleRefresh()}"></SearchCom>
|
||||
</div>
|
||||
<s-table ref="table" size="small" rowKey="id" :columns="columns" :data="loadData"></s-table>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
import { STable, SearchCom } from '@/components'
|
||||
import { getArchivesUserViolationList } from '@/api/archives/user'
|
||||
|
||||
export default {
|
||||
components: { STable, SearchCom },
|
||||
data() {
|
||||
return {
|
||||
personId: this.$route.query.id,
|
||||
queryParam: { courseName: '' },
|
||||
columns: [
|
||||
{ title: '违章编号', width: 'auto', align: 'center', dataIndex: 'violationCode', key: 'violationCode' },
|
||||
{ title: '违章时间', width: 'auto', align: 'center', dataIndex: 'time', key: 'time' },
|
||||
{ title: '违章内容', width: 'auto', align: 'center', dataIndex: 'content', key: 'content' },
|
||||
{ title: '违章课时', width: 'auto', align: 'center', dataIndex: 'courseName', key: 'courseName' },
|
||||
],
|
||||
loadData: parameter => { return getArchivesUserViolationList(Object.assign(parameter, this.queryParam, {personId : this.personId})).then(res => { return res }) }
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
queryOptions: function () {
|
||||
return [
|
||||
{ type: 'input', placeholder: '课程名称', key: 'courseName' },
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleRefresh() {
|
||||
this.$refs.table.refresh(true)
|
||||
},
|
||||
// 返回 按钮
|
||||
close() {
|
||||
this.$router.push({
|
||||
path: '/archives/user/Index', query: {
|
||||
archivesUserName: this.$route.query.archivesUserName,
|
||||
archivesUserOrgId: this.$route.query.archivesUserOrgId,
|
||||
archivesUserPageNum: this.$route.query.archivesUserPageNum
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,52 @@
|
|||
<template>
|
||||
<div id="bottomLeft">
|
||||
<div class="bg-color-black">
|
||||
<div class="d-flex pt-2 pl-2">
|
||||
<span>
|
||||
<icon name="chart-bar" class="text-icon"></icon>
|
||||
</span>
|
||||
<div class="d-flex">
|
||||
<span class="fs-xl text mx-2">数据统计图</span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<BottomLeftChart />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import BottomLeftChart from '@/components/echart/bottom/bottomLeftChart'
|
||||
export default {
|
||||
components: {
|
||||
BottomLeftChart
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
$box-height: 520px;
|
||||
$box-width: 100%;
|
||||
#bottomLeft {
|
||||
padding: 20px 16px;
|
||||
height: $box-height;
|
||||
width: $box-width;
|
||||
border-radius: 5px;
|
||||
.bg-color-black {
|
||||
height: $box-height - 35px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
.text {
|
||||
color: #c3cbde;
|
||||
}
|
||||
.chart-box {
|
||||
margin-top: 16px;
|
||||
width: 170px;
|
||||
height: 170px;
|
||||
.active-ring-name {
|
||||
padding-top: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,60 @@
|
|||
<template>
|
||||
<div id="bottomRight">
|
||||
<div class="bg-color-black">
|
||||
<div class="d-flex pt-2 pl-2">
|
||||
<span>
|
||||
<icon name="chart-area" class="text-icon"></icon>
|
||||
</span>
|
||||
<div class="d-flex">
|
||||
<span class="fs-xl text mx-2">工单修复以及满意度统计图</span>
|
||||
<div class="decoration2">
|
||||
<dv-decoration-2 :reverse="true" style="width:5px;height:6rem;" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<BottomRightChart />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import BottomRightChart from "@/components/echart/bottom/bottomRightChart";
|
||||
export default {
|
||||
components: {
|
||||
BottomRightChart
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" class>
|
||||
$box-height: 520px;
|
||||
$box-width: 100%;
|
||||
#bottomRight {
|
||||
padding: 14px 16px;
|
||||
height: $box-height;
|
||||
width: $box-width;
|
||||
border-radius: 5px;
|
||||
.bg-color-black {
|
||||
height: $box-height - 30px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
.text {
|
||||
color: #c3cbde;
|
||||
}
|
||||
//下滑线动态
|
||||
.decoration2 {
|
||||
position: absolute;
|
||||
right: 0.125rem;
|
||||
}
|
||||
.chart-box {
|
||||
margin-top: 16px;
|
||||
width: 170px;
|
||||
height: 170px;
|
||||
.active-ring-name {
|
||||
padding-top: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,283 @@
|
|||
<template>
|
||||
<div id="center">
|
||||
<div class="up">
|
||||
<div
|
||||
class="bg-color-black item"
|
||||
v-for="item in titleItem"
|
||||
:key="item.title"
|
||||
>
|
||||
<p class="ml-3 colorBlue fw-b fs-xl">{{ item.title }}</p>
|
||||
<div>
|
||||
<dv-digital-flop
|
||||
class="dv-dig-flop ml-1 mt-2 pl-3"
|
||||
:config="item.number"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="down">
|
||||
<div class="ranking bg-color-black">
|
||||
<span>
|
||||
<icon name="chart-pie" class="text-icon"></icon>
|
||||
</span>
|
||||
<span class="fs-xl text mx-2 mb-1 pl-3">年度负责人组件达标榜</span>
|
||||
<dv-scroll-ranking-board class="dv-scr-rank-board mt-1" :config="ranking" />
|
||||
</div>
|
||||
<div class="percent">
|
||||
<div class="item bg-color-black">
|
||||
<span>今日任务通过率</span>
|
||||
<CenterChart
|
||||
:id="rate[0].id"
|
||||
:tips="rate[0].tips"
|
||||
:colorObj="rate[0].colorData"
|
||||
/>
|
||||
</div>
|
||||
<div class="item bg-color-black">
|
||||
<span>今日任务达标率</span>
|
||||
<CenterChart
|
||||
:id="rate[1].id"
|
||||
:tips="rate[1].tips"
|
||||
:colorObj="rate[1].colorData"
|
||||
/>
|
||||
</div>
|
||||
<div class="water">
|
||||
<dv-water-level-pond class="dv-wa-le-po" :config="water" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import CenterChart from '@/components/echart/center/centerChartRate'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
titleItem: [
|
||||
{
|
||||
title: '今年累计任务建次数',
|
||||
number: {
|
||||
number: [120],
|
||||
toFixed: 1,
|
||||
textAlign: 'left',
|
||||
content: '{nt}',
|
||||
style: {
|
||||
fontSize: 26
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '本月累计任务次数',
|
||||
number: {
|
||||
number: [18],
|
||||
toFixed: 1,
|
||||
textAlign: 'left',
|
||||
content: '{nt}',
|
||||
style: {
|
||||
fontSize: 26
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '今日累计任务次数',
|
||||
number: {
|
||||
number: [2],
|
||||
toFixed: 1,
|
||||
textAlign: 'left',
|
||||
content: '{nt}',
|
||||
style: {
|
||||
fontSize: 26
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '今年失败任务次数',
|
||||
number: {
|
||||
number: [14],
|
||||
toFixed: 1,
|
||||
textAlign: 'left',
|
||||
content: '{nt}',
|
||||
style: {
|
||||
fontSize: 26
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '今年成功任务次数',
|
||||
number: {
|
||||
number: [106],
|
||||
toFixed: 1,
|
||||
textAlign: 'left',
|
||||
content: '{nt}',
|
||||
style: {
|
||||
fontSize: 26
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '今年达标任务个数',
|
||||
number: {
|
||||
number: [100],
|
||||
toFixed: 1,
|
||||
textAlign: 'left',
|
||||
content: '{nt}',
|
||||
style: {
|
||||
fontSize: 26
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
ranking: {
|
||||
data: [
|
||||
{
|
||||
name: '周口',
|
||||
value: 55
|
||||
},
|
||||
{
|
||||
name: '南阳',
|
||||
value: 120
|
||||
},
|
||||
{
|
||||
name: '西峡',
|
||||
value: 78
|
||||
},
|
||||
{
|
||||
name: '驻马店',
|
||||
value: 66
|
||||
},
|
||||
{
|
||||
name: '新乡',
|
||||
value: 80
|
||||
},
|
||||
{
|
||||
name: '新乡2',
|
||||
value: 80
|
||||
},
|
||||
{
|
||||
name: '新乡3',
|
||||
value: 80
|
||||
},
|
||||
{
|
||||
name: '新乡4',
|
||||
value: 80
|
||||
},
|
||||
{
|
||||
name: '新乡5',
|
||||
value: 80
|
||||
},
|
||||
{
|
||||
name: '新乡6',
|
||||
value: 80
|
||||
}
|
||||
],
|
||||
carousel: 'single',
|
||||
unit: '人'
|
||||
},
|
||||
water: {
|
||||
data: [24, 45],
|
||||
shape: 'roundRect',
|
||||
formatter: '{value}%',
|
||||
waveNum: 3
|
||||
},
|
||||
// 通过率和达标率的组件复用数据
|
||||
rate: [
|
||||
{
|
||||
id: 'centerRate1',
|
||||
tips: 60,
|
||||
colorData: {
|
||||
textStyle: '#3fc0fb',
|
||||
series: {
|
||||
color: ['#00bcd44a', 'transparent'],
|
||||
dataColor: {
|
||||
normal: '#03a9f4',
|
||||
shadowColor: '#97e2f5'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'centerRate2',
|
||||
tips: 40,
|
||||
colorData: {
|
||||
textStyle: '#67e0e3',
|
||||
series: {
|
||||
color: ['#faf3a378', 'transparent'],
|
||||
dataColor: {
|
||||
normal: '#ff9800',
|
||||
shadowColor: '#fcebad'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
components: {
|
||||
CenterChart
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
#center {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
.up {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-around;
|
||||
.item {
|
||||
border-radius: 6px;
|
||||
padding-top: 8px;
|
||||
margin-top: 8px;
|
||||
width: 32%;
|
||||
height: 70px;
|
||||
.dv-dig-flop {
|
||||
width: 150px;
|
||||
height: 30px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.down {
|
||||
padding: 6px 4px;
|
||||
padding-bottom: 0;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
height: 255px;
|
||||
justify-content: space-between;
|
||||
.bg-color-black {
|
||||
border-radius: 5px;
|
||||
}
|
||||
.ranking {
|
||||
padding: 10px;
|
||||
width: 59%;
|
||||
.dv-scr-rank-board {
|
||||
height: 225px;
|
||||
}
|
||||
}
|
||||
.percent {
|
||||
width: 40%;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
.item {
|
||||
width: 50%;
|
||||
height: 120px;
|
||||
span {
|
||||
margin-top: 8px;
|
||||
font-size: 14px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
.water {
|
||||
width: 100%;
|
||||
.dv-wa-le-po {
|
||||
height: 120px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,169 @@
|
|||
<template>
|
||||
<div id="centerLeft1">
|
||||
<div class="bg-color-black">
|
||||
<div class="d-flex pt-2 pl-2">
|
||||
<span>
|
||||
<icon name="chart-bar" class="text-icon"></icon>
|
||||
</span>
|
||||
<div class="d-flex">
|
||||
<span class="fs-xl text mx-2">任务通过率</span>
|
||||
<dv-decoration-3 class="dv-dec-3" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex jc-center">
|
||||
<CenterLeft1Chart />
|
||||
</div>
|
||||
<!-- 4个主要的数据 -->
|
||||
<div class="bottom-data">
|
||||
<div
|
||||
class="item-box mt-2"
|
||||
v-for="(item, index) in numberData"
|
||||
:key="index"
|
||||
>
|
||||
<div class="d-flex">
|
||||
<span class="coin">¥</span>
|
||||
<dv-digital-flop class="dv-digital-flop" :config="item.number" />
|
||||
</div>
|
||||
<p class="text" style="text-align: center;">
|
||||
{{ item.text }}
|
||||
<span class="colorYellow">(件)</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import CenterLeft1Chart from '@/components/echart/centerLeft/centerLeft1Chart'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
numberData: [
|
||||
{
|
||||
number: {
|
||||
number: [15],
|
||||
toFixed: 1,
|
||||
textAlign: 'left',
|
||||
content: '{nt}',
|
||||
style: {
|
||||
fontSize: 24
|
||||
}
|
||||
},
|
||||
text: '今日构建总量'
|
||||
},
|
||||
{
|
||||
number: {
|
||||
number: [1144],
|
||||
toFixed: 1,
|
||||
textAlign: 'left',
|
||||
content: '{nt}',
|
||||
style: {
|
||||
fontSize: 24
|
||||
}
|
||||
},
|
||||
text: '总共完成数量'
|
||||
},
|
||||
{
|
||||
number: {
|
||||
number: [361],
|
||||
toFixed: 1,
|
||||
textAlign: 'left',
|
||||
content: '{nt}',
|
||||
style: {
|
||||
fontSize: 24
|
||||
}
|
||||
},
|
||||
text: '正在编译数量'
|
||||
},
|
||||
{
|
||||
number: {
|
||||
number: [157],
|
||||
toFixed: 1,
|
||||
textAlign: 'left',
|
||||
content: '{nt}',
|
||||
style: {
|
||||
fontSize: 24
|
||||
}
|
||||
},
|
||||
text: '未通过数量'
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
components: {
|
||||
CenterLeft1Chart
|
||||
},
|
||||
mounted() {
|
||||
this.changeTiming()
|
||||
},
|
||||
methods: {
|
||||
changeTiming() {
|
||||
setInterval(() => {
|
||||
this.changeNumber()
|
||||
}, 3000)
|
||||
},
|
||||
changeNumber() {
|
||||
this.numberData.forEach((item, index) => {
|
||||
item.number.number[0] += ++index
|
||||
item.number = { ...item.number }
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
$box-width: 300px;
|
||||
$box-height: 410px;
|
||||
|
||||
#centerLeft1 {
|
||||
padding: 16px;
|
||||
height: $box-height;
|
||||
width: $box-width;
|
||||
border-radius: 10px;
|
||||
.bg-color-black {
|
||||
height: $box-height - 30px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
.text {
|
||||
color: #c3cbde;
|
||||
}
|
||||
.dv-dec-3 {
|
||||
position: relative;
|
||||
width: 100px;
|
||||
height: 20px;
|
||||
top: -3px;
|
||||
}
|
||||
|
||||
.bottom-data {
|
||||
.item-box {
|
||||
& > div {
|
||||
padding-right: 5px;
|
||||
}
|
||||
font-size: 14px;
|
||||
float: right;
|
||||
position: relative;
|
||||
width: 50%;
|
||||
color: #d3d6dd;
|
||||
.dv-digital-flop {
|
||||
width: 120px;
|
||||
height: 30px;
|
||||
}
|
||||
// 金币
|
||||
.coin {
|
||||
position: relative;
|
||||
top: 6px;
|
||||
font-size: 20px;
|
||||
color: #ffc107;
|
||||
}
|
||||
.colorYellow {
|
||||
color: yellowgreen;
|
||||
}
|
||||
p {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|