This commit is contained in:
8324144
2026-05-18 14:57:00 +08:00
commit cddb096a72
72 changed files with 25365 additions and 0 deletions

13
.env Normal file
View File

@@ -0,0 +1,13 @@
NODE_ENV='production'
VUE_APP_NAME = 'production'
VUE_APP_FLAG = 'pro'
# 生产环境
VUE_APP_IMGAPI='http://10.100.5.9:18089/'
VUE_APP_API='http://10.100.5.9:18089'
VUE_APP_TITLE=''
VUE_APP_YUNXUE_URL='https://dongfeng.yunxuetang.cn/'
outputDir = dist-pro

10
.env.development Normal file
View File

@@ -0,0 +1,10 @@
NODE_ENV='development'
VUE_APP_FLAG = 'dev'
VUE_APP_IMGAPI='http://localhost:8020/'
VUE_APP_API='http://127.0.0.1:8089'
VUE_APP_TITLE='(本地)'
VUE_APP_YUNXUE_URL='https://sdcstest3-phx-ucstable.yunxuetang.com.cn/'
outputDir = dev

13
.env.test Normal file
View File

@@ -0,0 +1,13 @@
NODE_ENV='production'
VUE_APP_NAME = 'production'
VUE_APP_FLAG = 'pro'
# 测试环境
VUE_APP_IMGAPI='http://10.100.5.9:8089/'
VUE_APP_API='http://10.100.5.9:8089'
VUE_APP_TITLE='(测试)'
VUE_APP_YUNXUE_URL='https://sdcstest3-phx-ucstable.yunxuetang.com.cn/'
outputDir = dist-test

27
.gitignore vendored Normal file
View File

@@ -0,0 +1,27 @@
.DS_Store
node_modules
/dist
/dist-pro
/dist-test
/test
/dev
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

28
.project Normal file
View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>vue3.0-element-ui</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.aptana.ide.core.unifiedBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.aptana.projects.webnature</nature>
</natures>
<filteredResources>
<filter>
<id>1623996978192</id>
<name></name>
<type>26</type>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-name-matches-false-false-node_modules</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>

20
README.md Normal file
View File

@@ -0,0 +1,20 @@
# 考试系统
## Project setup
```
yarn install
```
### Compiles and hot-reloads for development
```
yarn serve
```
### Compiles and minifies for production
```
yarn build
```
### Lints and fixes files
```
yarn lint
```

5
babel.config.js Normal file
View File

@@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

18
eslintrc.js Normal file
View File

@@ -0,0 +1,18 @@
module.exports = {
root: true,
env: {
node: true
},
extends: ['plugin:vue/essential', '@vue/standard'],
parserOptions: {
parser: '@babel/eslint-parser'
},
rules: {
indent: ['off', 2],
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'space-before-function-paren': 0,
'vue/multi-word-component-names': 'off',
"no-unused-vars": 'off'
}
}

14201
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

63
package.json Normal file
View File

@@ -0,0 +1,63 @@
{
"name": "qualification",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"test": "vue-cli-service build --mode test"
},
"dependencies": {
"axios": "^0.21.1",
"compression-webpack-plugin": "1.1.12",
"core-js": "^3.6.5",
"element-ui": "^2.15.14",
"globalthis": "^1.0.4",
"moment": "^2.29.4",
"normalize.css": "^8.0.1",
"vue": "^2.6.11",
"vue-pdf": "^4.3.0",
"vue-router": "^3.4.9",
"vuex": "^3.6.0",
"vuex-along": "^1.2.12",
"watermark-dom": "^2.3.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"sass": "^1.32.5",
"sass-loader": "^10.1.1",
"vue-template-compiler": "^2.6.11"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {
"generator-star-spacing": "off",
"no-tabs": "off",
"no-unused-vars": "off",
"no-console": "off",
"no-irregular-whitespace": "off",
"no-debugger": "off"
}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

17
public/index.html Normal file
View File

@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<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 %>favicon.ico">
<title>任职资格管理系统<%= VUE_APP_TITLE %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

206
src/App.vue Normal file
View File

@@ -0,0 +1,206 @@
<template>
<div id="app">
<router-view></router-view>
</div>
</template>
<script>
export default {
name: "App"
};
</script>
<style>
* {
padding: 0px;
margin: 0px;
}
html,
body {
width: 100%;
height: 100%;
box-sizing: border-box;
}
#app {
font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
width: 100%;
height: 100%;
}
button,
input,
select,
textarea {
font-family: inherit;
font-size: inherit;
line-height: inherit;
color: inherit;
}
.colorf {
color: #fff;
}
.color0 {
color: #000;
}
.color3 {
color: #333;
}
.color6 {
color: #666;
}
.color9 {
color: #999;
}
.color10 {
color: #C72C2C;
}
.flex {
display: flex;
}
.align-items {
align-items: center;
}
.justify-content {
justify-content: space-between;
}
.fz14 {
font-size: 14px;
}
.fz16 {
font-size: 16px;
}
.fz18 {
font-size: 18px;
}
.fz20 {
font-size: 20px;
}
.fz22 {
font-size: 22px;
}
.p20 {
padding: 20px;
}
.p10 {
padding: 10px;
}
.lh180 {
line-height: 180%;
}
.shadow {
background: #ffffff;
border-radius: 8px;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.15);
backdrop-filter: blur(5px);
}
.ruleForm {
margin-top: 20px;
}
.textLeft {
text-align: left;
}
.textRight {
text-align: right;
}
.textCenter {
text-align: center;
}
.mt10 {
margin-top: 10px;
}
.mt20 {
margin-top: 20px;
}
.mb0 {
margin-bottom: 0px;
}
.mb10 {
margin-bottom: 10px;
}
.mb20 {
margin-bottom: 20px;
}
.mb30 {
margin-bottom: 30px;
}
.mr20 {
margin-right: 20px;
}
.mr30 {
margin-right: 30px;
}
.mr10 {
margin-right: 10px;
}
.ml50 {
margin-left: 50px;
}
.submenu .el-submenu__title i {
color: #fff !important;
}
.flex-sb {
display: flex;
align-items: center;
justify-content: space-between;
}
.flex-fs {
display: flex;
align-items: center;
justify-content: flex-start;
}
.flex-as {
display: flex;
align-items: flex-start;
justify-content: flex-start;
}
.flex-ad {
display: flex;
align-items: center;
justify-content: flex-end;
}
.flex-wrap {
flex-wrap: wrap;
}
.flex1 {
flex: 1;
}
.flex-column {
flex-direction: column;
}
.shouxing {
cursor: pointer;
}
</style>

138
src/api/axiosFun.js Normal file
View File

@@ -0,0 +1,138 @@
import axios from 'axios';
import Router from '@/router/index';
import { showLoading, hideLoading } from '../utils/loading';
import {MessageBox} from 'element-ui';
const service = axios.create({
baseURL: process.env.VUE_APP_API, // url = base url + request url
withCredentials: true, // send cookies when cross-domain requests
timeout: 50000 // request timeout
})
// 登录请求方法
const reqNull = (method, url, params) => {
return service({
method: method,
url: url,
headers: {
'Content-Type': 'application/json',
},
withCredentials: true,
data: params
}).then(res => {
if(res.data.code===403 || res.data.code===401){
localStorage.clear();
}else{
return res.data;
}
}).catch(error => {
console.log(error,"error11111111111111");
MessageBox.alert("登录失败,请检查网络!", "提示", {
confirmButtonText: "确定",
callback: () => {
window.location.reload();
}
}).then(r => this.load(false));
});
};
// 通用公用方法
const req = (method, url, params) => {
showLoading();
return service({
method: method,
url: url,
headers: {
'Content-Type': 'application/json',
'Authorization': localStorage.getItem("logintoken")
},
withCredentials: true,
// responseType: 'blob',
data: params
}).then(res => {
hideLoading();
if(res.data.code===403 || res.data.code===401){
localStorage.clear();
}else{
return res.data;
}
}).catch(error => {
hideLoading();
localStorage.clear();
window.location.reload();
});
};
const downloadFile = (method, url, params, filename) =>{
return service({
method: method,
url: url,
headers: {
'Authorization': localStorage.getItem("logintoken")
},
responseType: 'blob',
data: params
}).then((response) => {
// 创建一个新的 Blob 对象,并使用响应数据
const blob = new Blob([response.data]);
const link = document.createElement('a'); // 创建一个新的 a 标签
link.href = window.URL.createObjectURL(blob); // 创建下载链接
link.download = filename; // 设置文件名
link.click(); // 触发点击,实现下载
window.URL.revokeObjectURL(link.href); // 释放 URL 对象
}).catch((error) => {
console.error('下载文件失败:', error); // 错误处理
}).catch(error => {
hideLoading();
localStorage.clear();
window.location.reload();
});
};
const openFile = (method, url, params, filename, fileType) =>{
return service({
method: method,
url: url,
headers: {
'Authorization': localStorage.getItem("logintoken")
},
responseType: 'blob',
data: params
}).then((response) => {
// 创建一个新的 Blob 对象,并使用响应数据
let options ={}
if(fileType === 'pdf' || fileType === 'PDF'){
options.type = 'application/pdf'
}
if(fileType === 'png' || fileType === 'PNG' ||
fileType === 'jpg' || fileType === 'JPG' ||
fileType === 'jpeg' || fileType === 'JPEG'){
options.type = 'image/'+fileType
}
if(fileType == 'mp4' || fileType == 'MP4' ||
fileType == 'mp3' || fileType == 'MP3' ||
fileType == 'avi' || fileType == 'AVI' ||
fileType == 'wmv' || fileType == 'WMV' ||
fileType == 'rmvb' || fileType == 'RMVB' ||
fileType == 'rm' || fileType == 'RM' ){
options.type = 'video/'+fileType
}
const blob = new Blob([response.data], options);
const url = URL.createObjectURL(blob); // 创建URL
window.open(url);
}).catch((error) => {
console.error('下载文件失败:', error); // 错误处理
}).catch(error => {
hideLoading();
localStorage.clear();
window.location.reload();
});
};
export {
reqNull,
req,
downloadFile,
openFile
}

210
src/api/userMG.js Normal file
View File

@@ -0,0 +1,210 @@
import axios from 'axios';
import {
openFile, downloadFile,
req,
reqNull
} from './axiosFun';
let url = process.env.VUE_APP_API;
let title = process.env.VUE_APP_TITLE;
let yunxueUrl = process.env.VUE_APP_YUNXUE_URL;
export const baseUrl = url;
export const titleName = title;
export const yunUrl = yunxueUrl;
// -----------------------------------------
// 登录
export const login = (params) => {
return reqNull("post", url + "/qualifications-service/users/login", params)
}
//获取单位列表
export const getDeptList = () => {
return reqNull("get", url + "/qualifications-service/users/getDeptList")
}
// 任职资格序列列表
export const getQualificationSequenceList = (params) => {
return req("get", url + "/qualifications-service/job-applications/getQualificationSequenceList?orgCode="+params.orgCode)
}
//获取绩点规则
export const getPerformanceRuleList = (params) => {
return req("post", url + "/qualifications-service/job-applications/getPerformanceRuleList", params)
}
//获取任职申请校验规则
export const getAppCheck = (params) => {
return req("post", url + "/qualifications-service/job-applications/getAppCheck", params)
}
//获取课程清单
export const getCourseList = (params) => {
return req("post", url + "/qualifications-service/job-applications/courseList", params)
}
// 提交任职申请
export const submitQualificationApplication = (params) => {
return req("post", url + "/qualifications-service/job-applications/submitQualificationApplication", params)
}
// 获取信息内置列表
export const getInternalInformationList = (params) => {
return req("post", url + "/qualifications-service/internal-informations/getInternalInformationList",params)
}
// 新增信息内置列表
export const addPositionSequenceLevel = (params) => {
return req("post", url + "/qualifications-service/internal-informations/addPositionSequenceLevel",params)
}
// 修改信息内置列表
export const editInternalInformation = (params) => {
return req("post", url + "/qualifications-service/internal-informations/modifyPositionSequenceLevel",params)
}
// 删除信息内置列表
export const deletePositionSequenceLevel = (params) => {
return req("post", url + "/qualifications-service/internal-informations/deletePositionSequenceLevel",params)
}
// 获取已申报任职资格列表
export const getDeclaredQualificationList = (params) => {
return req("post", url + "/qualifications-service/job-applications/getDeclaredQualificationList",params)
}
// 获取资格审核列表
export const getQualificationAuditList = (params) => {
return req("post", url + "/qualifications-service/job-applications/getQualificationAuditList",params)
}
//发送修改密码验证码
export const sendCode = (params) => {
return req("post", url + "/qualifications-service/users/captcha",params)
}
//修改密码
export const updatePwd = (params) => {
return req("post", url + "/qualifications-service/users/updatePwd",params)
}
// 获取是否有学习考试进行中
export const isLearningExamInProgress = (params) => {
return req("post", url + "/qualifications-service/job-applications/isLearningExamInProgress",params)
}
// 获取员工基本信息
export const queryBasicInformation = (params) => {
return req("post", url + "/qualifications-service/job-applications/queryBasicInformation",params)
}
// 获取专业回馈类型列表
export const getProfessionalFeedbackCategoryList = (params) => {
return req("post", url + "/qualifications-service/professional-feedbacks/getProfessionalFeedbackCategoryList",params)
}
//获取专业回馈定义列表
export const getProfessionalFeedbackDefineList = (params) => {
return req("post", url + "/qualifications-service/professional-feedbacks/getProfessionalFeedbackDefineList",params)
}
// 获取专业回馈类型结构
export const getProfessionalFeedbackCategoryStruct = (params) => {
return req("post", url + "/qualifications-service/professional-feedbacks/getProfessionalFeedbackCategoryStruct",params)
}
// 获取专业回馈单位列表
export const getProfessionalFeedbackUnitList = (params) => {
return req("post", url + "/qualifications-service/professional-feedbacks/getProfessionalFeedbackUnitList",params)
}
// 获取专业回馈角色列表
export const getProfessionalFeedbackRoleList = (params) => {
return req("post", url + "/qualifications-service/professional-feedbacks/getProfessionalFeedbackRoleList",params)
}
//获取专业回馈层级列表
export const getProfessionalFeedbackHierarchyList = (params) => {
return req("post", url + "/qualifications-service/professional-feedbacks/getProfessionalFeedbackHierarchyList",params)
}
// 获取专业回馈列表
export const getProfessionalFeedbackList = (params) => {
return req("post", url + "/qualifications-service/professional-feedbacks/getProfessionalFeedbackList",params)
}
// 根据角色获取专业回馈列表
export const getProfessionalFeedbackByRoleList = (params) => {
return req("post", url + "/qualifications-service/professional-feedbacks/getProfessionalFeedbackByRoleList",params)
}
//提交专业回馈
export const submitProfessionalFeedback = (params) => {
return req("post", url + "/qualifications-service/professional-feedbacks/addProfessionalFeedbackInfo",params)
}
//专业回馈审核通过
export const professionalFeedbackAuditApproval = (params) => {
return req("post", url + "/qualifications-service/professional-feedbacks/professionalFeedbackAuditApproval",params)
}
//专业回馈审核驳回
export const professionalFeedbackAuditRejection = (params) => {
return req("post", url + "/qualifications-service/professional-feedbacks/professionalFeedbackAuditRejection",params)
}
// 获取任职资格管理办法
export const getQualificationManagementMeasures = (params) => {
return req("post", url + "/qualifications-service/internal-informations/getQualificationManagementMeasures",params)
}
// 下载任职资格管理办法最新
export const downloadQualificationManagementMeasures = (params, filename) => {
return downloadFile("post", url + "/qualifications-service/internal-informations/downloadQualificationManagementMeasures",params,filename)
}
//下载任职资格标准
export const downloadQualificationStandard = (params, filename) => {
return downloadFile("post", url + "/qualifications-service/internal-informations/downloadQualificationStandard",params, filename)
}
//取消预览
export const cancelPreview = (params) => {
return req("post", url + "/qualifications-service/users/cancelPreview",params)
}
//获取字典信息
export const getDictionary = (params) => {
return req("post", url + "/qualifications-service/dictionary/getDictionary",params)
}
//下载专业回馈附件
export const downloadProfessionalFeedbackAttachment = (params, filename) => {
return downloadFile("post", url + "/qualifications-service/professional-feedbacks/downloadProfessionalFeedbackAttachment",params, filename)
}
//浏览器打开专业回馈附件
export const openProfessionalFeedbackAttachment = (params, filename, fileType) => {
return openFile("post", url + "/qualifications-service/professional-feedbacks/downloadProfessionalFeedbackAttachment",params, filename,fileType)
}
//下载个人行为举证附件
export const downloadPersonalBehaviorEvidenceAttachment = (params, filename) => {
return downloadFile("post", url + "/qualifications-service/behavior-evidences/downloadPersonalBehaviorEvidenceAttachment",params, filename)
}
export const openPersonalBehaviorEvidenceAttachment = (params, filename, fileType) => {
return openFile("post", url + "/qualifications-service/behavior-evidences/downloadPersonalBehaviorEvidenceAttachment",params, filename,fileType)
}
//提交个人行为举证
export const addPersonalBehaviorEvidence = (params) => {
return req("post", url + "/qualifications-service/behavior-evidences/addPersonalBehaviorEvidence",params)
}
//获取个人行为举证
export const getPersonalBehaviorEvidenceList = (params) => {
return req("post", url + "/qualifications-service/behavior-evidences/getPersonalBehaviorEvidenceList",params)
}
//资格审核
export const qualificationAuditStatus = (params) => {
return req("post", url + "/qualifications-service/job-applications/qualificationAuditStatus",params)
}

BIN
src/assets/bg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
src/assets/empty_msg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Binary file not shown.

16
src/assets/icon_query.svg Normal file
View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="46px" height="16px" viewBox="0 0 46 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>编组</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="编组" transform="translate(0.000000, -3.000000)" fill="#EC2944">
<g id="放大镜" transform="translate(0.000000, 4.000000)" fill-rule="nonzero">
<path d="M14.2348622,13.4218925 L11.0861085,10.2731388 C11.9678283,9.19720006 12.4972039,7.82391722 12.4972039,6.32688422 C12.4972039,2.88766147 9.69907565,0.087814464 6.25813414,0.087814464 C2.81891139,0.087814464 0.019064384,2.88594272 0.019064384,6.32688422 C0.019064384,9.76782573 2.81719264,12.565954 6.25813414,12.565954 C7.75344838,12.565954 9.12844998,12.0365784 10.2043887,11.1548586 L13.3531424,14.3036123 C13.4751738,14.4256436 13.6350177,14.4858 13.7948617,14.4858 C13.9547056,14.4858 14.1145495,14.4256436 14.2365809,14.3036123 C14.478925,14.0595495 14.478925,13.6642365 14.2348622,13.4218925 L14.2348622,13.4218925 Z M1.26687834,6.32688422 C1.26687834,3.57516227 3.50641219,1.33562842 6.25813414,1.33562842 C9.0098561,1.33562842 11.24939,3.57516227 11.24939,6.32688422 C11.24939,9.07860618 9.0098561,11.31814 6.25813414,11.31814 C3.50641219,11.31814 1.26687834,9.07860618 1.26687834,6.32688422 Z" id="形状"></path>
</g>
<text id="查询" font-family="STYuanti-SC-Regular, Yuanti SC" font-size="14" font-weight="normal">
<tspan x="18" y="15">查询</tspan>
</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 685 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 KiB

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="10px" height="14px" viewBox="0 0 10 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>路径</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="画板" transform="translate(-792.000000, -277.000000)" fill="#F55E73">
<polygon id="路径" points="792 279.906469 802 277 792 291"></polygon>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 597 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="10px" height="14px" viewBox="0 0 10 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>路径备份</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="画板" transform="translate(-827.000000, -277.000000)" fill="#F3F3F3">
<polygon id="路径备份" transform="translate(832.000000, 284.000000) scale(-1, 1) translate(-832.000000, -284.000000) " points="827 279.906469 837 277 827 291"></polygon>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 705 B

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="13px" height="14px" viewBox="0 0 13 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.3 (57544) - http://www.bohemiancoding.com/sketch -->
<title>形状</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M11.4744143,5.9826098 L10.494087,5.9826098 L10.497029,3.09436003 C10.497029,1.37586117 8.71212716,-0.0165067969 6.5054313,-0.0165067969 C4.30164547,-0.0165067969 2.51383359,1.37586117 2.51383359,3.09436003 L2.49527019,5.9826098 L1.49346941,5.9826098 C0.941811438,5.9826098 0.517059406,6.42736425 0.517059406,6.85747264 L0.495569969,13.1070274 C0.495569969,13.5366402 0.963284859,13.9818903 1.51495883,13.9818903 L11.4978544,13.9818903 C12.0475937,13.9818903 12.4722978,13.5366402 12.4722978,13.1070274 L12.4937872,6.85747264 C12.4937872,6.42738023 12.0241536,5.9826098 11.4744143,5.9826098 Z M8.48070008,5.9826098 L4.49497041,5.9826098 L4.49497041,2.98305948 C4.49497041,2.12576873 5.40694409,1.53847092 6.50543131,1.53847092 C7.60487789,1.53847092 8.49437081,2.12575275 8.49437081,2.98305948 L8.48070008,5.9826098 Z" id="形状" fill="#999999" fill-rule="nonzero"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="15px" height="15px" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.3 (57544) - http://www.bohemiancoding.com/sketch -->
<title>路径</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M8.51036025,15 L8.08902638,12.5224438 L8.61838159,12.0036589 C8.82448294,11.8016566 8.82448294,11.4741719 8.61838159,11.2721695 L7.87198786,10.54068 C7.66586964,10.3386942 7.33171237,10.3386942 7.12559415,10.54068 L6.37920042,11.2721695 C6.17309907,11.4741718 6.17309907,11.8016565 6.37920042,12.0036589 L6.90855563,12.5224438 L6.48722177,15 L1.05557105,15 C0.472593368,15 -1.64939243e-08,14.5368435 0,13.965507 C0,13.8342683 0.0254862797,13.7042371 0.075074834,13.5823277 C0.322004879,12.9754604 0.74921241,12.4814048 1.3567143,12.1001278 C2.89687924,11.1335037 5.58142904,11.0203943 5.58142904,9.48979457 C5.58142904,9.08216726 5.42157433,8.57142149 5.10186491,8.11223493 C4.78215549,7.65304839 4.62230078,7.49999172 4.14275353,6.88283575 C3.6631894,6.26567978 3.50333469,5.35713221 3.50333469,4.89796221 C3.50333469,4.43877567 3.82304411,4.59183233 3.82304411,4.28740621 C3.80076471,2.65448197 4.02561788,1.43500756 5.58142904,0.612243205 C5.89987258,0.443852752 6.65421601,0.355042502 7.01438279,0.355042502 C7.40898139,0.315475714 7.01831544,0 7.88883245,0 C8.75934946,0 9.96998177,0.375868009 10.5486386,1.53928392 C11.1272954,2.70271639 11.1762764,3.97958912 11.1762764,4.28570247 C11.1762764,4.59183235 11.4959858,4.43875913 11.4959858,4.89794567 C11.4959858,5.35713221 11.3580729,6.26567976 10.8675547,6.8828192 C10.3770197,7.49997517 10.217165,7.65303185 9.89745556,8.11221839 C9.57774614,8.57140493 9.41789143,9.07206053 9.41789143,9.48977802 C9.41789143,11.0203943 12.0899175,11.1335037 13.6387917,12.1001113 C14.2501587,12.4816529 14.6789528,12.9761552 14.9251571,13.5836014 C15.1403727,14.1145772 14.8756192,14.7159859 14.3338246,14.926904 C14.2098167,14.9751873 14.0775907,14.9999853 13.9441545,14.9999834 L8.51036025,15 Z" id="路径" fill="#999999"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="15px" viewBox="0 0 14 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>验证码</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="验证码" fill="#999999" fill-rule="nonzero">
<path d="M13.1956003,3.59700008 C13.1507256,3.15640187 12.8260103,2.79543409 12.3926003,2.70435006 C11.5139514,2.56621728 10.646109,2.36644078 9.79550021,2.10650005 C8.96251778,1.76489318 8.18145561,1.30836336 7.47505016,0.750200016 C7.10462434,0.483568154 6.60522595,0.483568154 6.23480014,0.750200016 C5.56609952,1.36865987 4.76711252,1.82914403 3.89675008,2.09770005 C3.09084175,2.43092445 2.23949925,2.64134992 1.37115003,2.72195006 C0.928232298,2.79351829 0.596507629,3.16636395 0.576950013,3.61460008 C0.576950013,3.61460008 0.550000012,5.85475013 0.550000012,7.82650017 C0.550000012,11.3960002 4.7619001,14.8500003 6.86840015,14.8500003 C8.97435019,14.8500003 12.5444003,12.4135003 13.1153003,7.88040017 C13.2583003,5.20300011 13.1593003,3.60580008 13.1593003,3.60580008 L13.1956003,3.59645008 L13.1956003,3.59700008 Z M10.9021002,6.35415014 L6.50210014,10.5039002 C6.30410014,10.6925502 6.00160013,10.7222502 5.77060013,10.5754002 L5.65510012,10.4769502 L3.22740007,7.95190017 C3.00064575,7.70555355 3.01652845,7.32202947 3.26287507,7.09527515 C3.50922169,6.86852084 3.89274577,6.88440354 4.11950009,7.13075015 L6.11875013,9.2279002 L10.0809502,5.47965012 C10.2404068,5.33296579 10.4660059,5.28249295 10.6727665,5.34724423 C10.8795272,5.4119955 11.0360375,5.58213364 11.0833415,5.79356924 C11.1306456,6.00500484 11.0615568,6.22561582 10.9021002,6.37230014 L10.9021002,6.35415014 L10.9021002,6.35415014 Z" id="形状"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>待提交指标</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="个人信息_0.3.3_191122_待审核" transform="translate(-738.000000, -509.000000)" fill="#399AFB" fill-rule="nonzero">
<g id="待提交指标" transform="translate(738.000000, 509.000000)">
<path d="M7.90568165,15.3031005 C3.80471615,15.3031005 0.459722813,12.0425118 0.320271637,7.97457419 C0.169811158,3.53415517 3.72765102,-0.0255195792 8.16807004,0.126775784 C12.2360076,0.264392076 15.4965963,3.61122029 15.4965963,7.71218579 C15.4965963,11.9012257 12.0965565,15.3031005 7.90568165,15.3031005 L7.90568165,15.3031005 Z M4.72582786,6.76355082 L3.49645565,6.76355082 C3.31113238,6.76355082 3.16250679,6.9140113 3.16250679,7.09749969 L3.16250679,8.3268719 C3.16250679,8.51219517 3.31296726,8.66082076 3.49645565,8.66082076 L4.72582786,8.66082076 C4.91115113,8.66082076 5.05977673,8.51036029 5.05977673,8.3268719 L5.05977673,7.09749969 C5.05977673,6.9140113 4.91115113,6.76355082 4.72582786,6.76355082 L4.72582786,6.76355082 Z M8.52036775,6.76355082 L7.29099554,6.76355082 C7.10567227,6.76355082 6.95704667,6.9140113 6.95704667,7.09749969 L6.95704667,8.3268719 C6.95704667,8.51219517 7.10750715,8.66082076 7.29099554,8.66082076 L8.52036775,8.66082076 C8.70569102,8.66082076 8.85433322,8.51036029 8.85433322,8.3268719 L8.85433322,7.09749969 C8.8561515,6.9140113 8.70569102,6.76355082 8.52036775,6.76355082 L8.52036775,6.76355082 Z M12.3167425,6.76355082 L11.0873703,6.76355082 C10.902047,6.76355082 10.7534214,6.9140113 10.7534214,7.09749969 L10.7534214,8.3268719 C10.7534214,8.51219517 10.9038819,8.66082076 11.0873703,8.66082076 L12.3167425,8.66082076 C12.5020658,8.66082076 12.6506914,8.51036029 12.6506914,8.3268719 L12.6506914,7.09749969 C12.6506914,6.9140113 12.5002309,6.76355082 12.3167425,6.76355082 L12.3167425,6.76355082 Z" id="形状"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="15px" viewBox="0 0 16 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>下载失败</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="个人信息_0.3.3_191122_审核失败" transform="translate(-720.000000, -610.000000)" fill="#EC2944" fill-rule="nonzero">
<g id="下载失败" transform="translate(720.000000, 610.000000)">
<path d="M8.02956023,0 C4.01478012,0 0.729960021,3.2848201 0.729960021,7.29960021 C0.729960021,11.3143803 4.01478012,14.5992004 8.02956023,14.5992004 C12.0443404,14.5992004 15.3291604,11.3143803 15.3291604,7.29960021 C15.3291604,3.2848201 12.0443404,0 8.02956023,0 Z M8.02956023,11.2101003 C7.61244022,11.2101003 7.24746021,10.8451203 7.24746021,10.4280003 C7.24746021,10.0108803 7.61244022,9.64590028 8.02956023,9.64590028 C8.44668025,9.64590028 8.81166026,10.0108803 8.81166026,10.4280003 C8.81166026,10.8451203 8.44668025,11.2101003 8.02956023,11.2101003 Z M8.70738025,8.18598024 C8.70738025,8.70738025 8.49882025,9.12450027 8.02956023,9.12450027 C7.56030022,9.12450027 7.35174021,8.70738025 7.35174021,8.18598024 L7.09104021,4.32762013 C7.09104021,3.80622011 7.50816022,3.3891001 7.97742023,3.3891001 C8.44668025,3.3891001 8.91594026,3.80622011 8.91594026,4.32762013 L8.70738025,8.18598024 Z" id="形状"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="14px" viewBox="0 0 16 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>待提交订单</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="个人信息_0.3.3_191122_待审核" transform="translate(-738.000000, -561.000000)" fill="#F16C3D" fill-rule="nonzero">
<g id="待提交订单" transform="translate(738.000000, 561.000000)">
<path d="M0.221204114,0.210595863 L0.221204099,0.210595882 C0.259538926,0.16065137 0.310368714,0.121701349 0.368564818,0.0976758347 C0.504068928,0.0197609718 0.646913284,-1.95399252e-14 0.756445331,-1.95399252e-14 C0.868800866,-1.95399252e-14 0.946151084,0.020890261 0.946151084,0.020890261 L15.3897776,6.5262123 C15.3897776,6.5262123 15.8200031,6.76729714 15.7906435,7.23760888 C15.7612842,7.70509805 15.3056512,7.87560695 15.3056512,7.87560695 L10.4241157,9.28033729 L9.5049466,13.0552515 C9.5049466,13.0552515 9.3163696,13.5046739 8.85565563,13.53855 L8.8556556,13.53855 C8.83423404,13.54006 8.81276591,13.5408084 8.79129115,13.5408084 C8.37743858,13.5408084 8.19620183,13.2472157 8.19620183,13.2472157 L6.48885005,10.5631095 L2.13408674,12.0113097 L2.13408682,12.0113097 C2.09603067,12.0156124 2.05777154,12.0178741 2.0194735,12.0180849 C1.39502583,12.0180849 1.27420089,11.4150916 1.27420089,11.4150916 C1.27420089,11.4150916 0.0416772175,1.12242972 0.0055436705,0.823751665 C-0.031155315,0.525642625 0.126368212,0.328032906 0.126368212,0.328032906 C0.15572748,0.282864914 0.187909706,0.244471995 0.221221089,0.210595967 L0.221204114,0.210595863 Z M0.221204114,0.210595863 L0.221204098,0.210595883 C0.119837629,0.343088202 0.124538987,0.528321261 0.232496143,0.655500601 L6.51537443,7.65033124 L6.5153744,7.65033121 C6.64354065,7.80111129 6.86924392,7.82050796 7.02125597,7.69380553 L7.021256,7.69380551 C7.1715994,7.56833254 7.19176093,7.34473952 7.06628835,7.1943948 C7.06558469,7.19355165 7.0648771,7.19271178 7.06416564,7.1918752 L0.781856366,0.197044564 L0.781856383,0.197044584 C0.680345808,0.0776273526 0.513425918,0.03726486 0.368568849,0.0971103029 C0.317754808,0.126469571 0.268069924,0.163168556 0.22120813,0.210594994 L0.221204114,0.210595863 Z" id="形状"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>等待 (5)</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="个人信息_0.3.3_191122_待审核" transform="translate(-738.000000, -611.000000)" fill="#FEAB4F" fill-rule="nonzero">
<g id="等待-(5)" transform="translate(738.000000, 611.000000)">
<path d="M7.80246914,0 C3.6471619,0 0.278659612,3.36821027 0.278659612,7.52380952 C0.278659612,11.6788076 3.6471619,15.047619 7.80246914,15.047619 C11.9577764,15.047619 15.3262787,11.6788076 15.3262787,7.52380952 C15.3262787,3.36821027 11.9577764,0 7.80246914,0 Z M10.5033106,11.3879385 C10.2587181,11.6347126 9.85705318,11.6347126 9.6125809,11.3879385 L7.38859089,9.15188976 C7.22251741,8.98475125 7.23753066,8.75208001 7.23753066,8.39816895 C7.23753066,8.04363948 7.15729387,3.94620374 7.15729387,3.94620374 C7.15729387,3.59476625 7.43850914,3.31004675 7.78534301,3.31004675 C8.13219407,3.31004675 8.41339215,3.59476625 8.41339215,3.94620374 L8.41339215,8.39816895 C8.41339215,8.41653185 10.5082062,10.4934297 10.5082062,10.4934297 C10.7526613,10.7401694 10.7477657,11.1405975 10.5033106,11.3879385 Z" id="形状"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="46px" height="16px" viewBox="0 0 46 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>编组</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="编组" transform="translate(0.000000, -3.000000)" fill="#EC2944">
<g id="放大镜" transform="translate(0.000000, 4.000000)" fill-rule="nonzero">
<path d="M14.2348622,13.4218925 L11.0861085,10.2731388 C11.9678283,9.19720006 12.4972039,7.82391722 12.4972039,6.32688422 C12.4972039,2.88766147 9.69907565,0.087814464 6.25813414,0.087814464 C2.81891139,0.087814464 0.019064384,2.88594272 0.019064384,6.32688422 C0.019064384,9.76782573 2.81719264,12.565954 6.25813414,12.565954 C7.75344838,12.565954 9.12844998,12.0365784 10.2043887,11.1548586 L13.3531424,14.3036123 C13.4751738,14.4256436 13.6350177,14.4858 13.7948617,14.4858 C13.9547056,14.4858 14.1145495,14.4256436 14.2365809,14.3036123 C14.478925,14.0595495 14.478925,13.6642365 14.2348622,13.4218925 L14.2348622,13.4218925 Z M1.26687834,6.32688422 C1.26687834,3.57516227 3.50641219,1.33562842 6.25813414,1.33562842 C9.0098561,1.33562842 11.24939,3.57516227 11.24939,6.32688422 C11.24939,9.07860618 9.0098561,11.31814 6.25813414,11.31814 C3.50641219,11.31814 1.26687834,9.07860618 1.26687834,6.32688422 Z" id="形状"></path>
</g>
<text id="查询" font-family="STYuanti-SC-Regular, Yuanti SC" font-size="14" font-weight="normal">
<tspan x="18" y="15">查询</tspan>
</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="35px" height="23px" viewBox="0 0 35 23" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.3 (57544) - http://www.bohemiancoding.com/sketch -->
<title>Group</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Group" fill-rule="nonzero">
<path d="M5,0 L30,0 C32.7614237,-5.07265313e-16 35,2.23857625 35,5 L35,23 L0,23 L0,5 C-3.38176876e-16,2.23857625 2.23857625,5.07265313e-16 5,0 Z" id="Rectangle-2" fill="#EC2944"></path>
<g id="放大镜" transform="translate(11.000000, 5.000000)" fill="#FFFFFF">
<path d="M5.60628635,11.2050123 C2.51704139,11.2050123 0.00375167785,8.69454525 0.00375167785,5.60883911 C0.00375167785,2.52317654 2.51704139,0.0126949721 5.60630089,0.0126949721 C8.6955604,0.0126949721 11.2089519,2.52317654 11.2089519,5.60883911 C11.2089519,8.69453073 8.6955604,11.2050123 5.60630089,11.2050123 L5.60628635,11.2050123 Z M5.60628635,1.39014302 C3.27739597,1.39014302 1.38279866,3.28265251 1.38279866,5.60883911 C1.38279866,7.93504022 3.27739597,9.82757877 5.60630089,9.82757877 C7.93517673,9.82757877 9.82989038,7.93504022 9.82989038,5.60883911 C9.82989038,3.28265251 7.93517673,1.39014302 5.60630089,1.39014302 L5.60628635,1.39014302 Z" id="Shape"></path>
<path d="M12.1498814,12.9924179 C11.9326331,12.9924179 11.7155302,12.9096246 11.5497584,12.7441832 L8.6227226,9.82063575 C8.29133893,9.48960782 8.29133893,8.95288939 8.6227226,8.62178883 C8.95425168,8.29086257 9.49148322,8.29086257 9.82296868,8.62178883 L12.7500045,11.5453363 C13.0814027,11.8763642 13.0814027,12.4130682 12.7500045,12.7441542 C12.5842327,12.9096246 12.3671298,12.9924179 12.1498814,12.9924179" id="Shape"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="35px" height="23px" viewBox="0 0 35 23" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.3 (57544) - http://www.bohemiancoding.com/sketch -->
<title>Group</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Group" fill-rule="nonzero">
<path d="M5,0 L30,0 C32.7614237,-5.07265313e-16 35,2.23857625 35,5 L35,23 L0,23 L0,5 C-3.38176876e-16,2.23857625 2.23857625,5.07265313e-16 5,0 Z" id="Rectangle-2" fill="#EC2944"></path>
<g id="放大镜" transform="translate(11.000000, 5.000000)" fill="#FFFFFF">
<path d="M5.60628635,11.2050123 C2.51704139,11.2050123 0.00375167785,8.69454525 0.00375167785,5.60883911 C0.00375167785,2.52317654 2.51704139,0.0126949721 5.60630089,0.0126949721 C8.6955604,0.0126949721 11.2089519,2.52317654 11.2089519,5.60883911 C11.2089519,8.69453073 8.6955604,11.2050123 5.60630089,11.2050123 L5.60628635,11.2050123 Z M5.60628635,1.39014302 C3.27739597,1.39014302 1.38279866,3.28265251 1.38279866,5.60883911 C1.38279866,7.93504022 3.27739597,9.82757877 5.60630089,9.82757877 C7.93517673,9.82757877 9.82989038,7.93504022 9.82989038,5.60883911 C9.82989038,3.28265251 7.93517673,1.39014302 5.60630089,1.39014302 L5.60628635,1.39014302 Z" id="Shape"></path>
<path d="M12.1498814,12.9924179 C11.9326331,12.9924179 11.7155302,12.9096246 11.5497584,12.7441832 L8.6227226,9.82063575 C8.29133893,9.48960782 8.29133893,8.95288939 8.6227226,8.62178883 C8.95425168,8.29086257 9.49148322,8.29086257 9.82296868,8.62178883 L12.7500045,11.5453363 C13.0814027,11.8763642 13.0814027,12.4130682 12.7500045,12.7441542 C12.5842327,12.9096246 12.3671298,12.9924179 12.1498814,12.9924179" id="Shape"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="70px" height="70px" viewBox="0 0 70 70" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>编组 10</title>
<desc>Created with Sketch.</desc>
<defs>
<circle id="path-1" cx="35" cy="35" r="35"></circle>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="首页_0.2_20191129" transform="translate(-1298.000000, -118.000000)">
<g id="编组-10" transform="translate(1298.000000, 118.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="椭圆形" fill="#ECECEC" xlink:href="#path-1"></use>
<g id="默认头像" mask="url(#mask-2)" fill="#B7B7B7" fill-rule="nonzero">
<g transform="translate(10.514286, 16.000000)" id="路径">
<path d="M31.7397683,36.01 C31.5411197,33.995 31.6073359,32.5 31.6073359,30.615 C32.5343629,30.095 35.8451737,26.975 36.1100386,24.375 C36.838417,24.31 38.0303089,23.595 38.36139,20.735 C38.5600386,19.24 37.8316602,18.33 37.3681467,18.07 C38.5600386,14.495 39.0897683,3.315 30.7465251,2.21 C29.8857143,0.78 27.7005792,0 24.8532819,0 C13.4640927,0.195 10.0870656,8.58 12.6032819,18.135 C12.1397683,18.395 11.41139,19.24 11.6100386,20.8 C11.9411197,23.66 13.1330116,24.375 13.86139,24.44 C14.1262548,27.105 17.4370656,30.225 18.3640927,30.68 C18.3640927,32.565 18.4303089,33.995 18.2316602,36.075 C15.9803089,42.055 1.21409266,38.935 0.485714286,52 C11.2009673,53.3333333 19.3723958,54 25,54 C30.2612847,54 38.4231895,53.3333333 49.4857143,52 C49.088417,38.74 33.9911197,42.055 31.7397683,36.01 Z"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="219px" height="107px" viewBox="0 0 219 107" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>编组</title>
<desc>Created with Sketch.</desc>
<defs>
<polygon id="path-1" points="0 106.314947 183.073844 106.314947 183.073844 1.63997242 0 1.63997242"></polygon>
</defs>
<g id="设计" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="东风_App_首页检索_2.0_20200426" transform="translate(-78.000000, -333.000000)">
<g id="编组" transform="translate(78.000000, 333.000000)">
<line x1="82.3587786" y1="64" x2="77.3587786" y2="84" id="Stroke-1" stroke="#B3B3B3" stroke-width="9"></line>
<g transform="translate(0.358779, 0.000000)">
<path d="M40.7164525,105.458514 C42.5086263,91.5586988 30.8560269,102.270409 35.7480291,83.3547688 C40.6403229,64.4391289 69.7312724,75.6585669 73.4041004,66.7474446 C77.0770742,57.8363223 76.4008727,41.1655937 83.9087646,22.7935143 C90.1006947,7.6423443 110.825199,-5.76652617 131.000026,3.96142286 C153.562767,14.8407228 149.057478,26.8049971 158.384365,38.5377794 C167.711397,50.2707268 210.169097,33.4655941 217.813425,69.5704255 C222.136654,89.9891125 206.016218,105.458514 206.016218,105.458514 L40.7164525,105.458514 Z" id="Fill-2" fill="#EAEEF6"></path>
<path d="M25.980394,103.688389 C25.574355,99.7055762 177.73989,95.4937144 177.73989,89.6769158 C177.73989,84.9874037 66.7275548,78.3875566 66.7275548,78.3875566 L66.9126003,81.6244319 C66.9126003,81.6244319 154.546057,83.161931 154.546057,88.8253655 C154.546057,94.0775232 16.7027809,92.5082339 0.341704168,102.103404 C-0.397151506,102.536761 0.170188838,103.766867 1.0180821,103.883254 C6.48335905,104.633182 26.3305877,107.123454 25.980394,103.688389" id="Fill-4" fill="#D8E3FF"></path>
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Clip-7"></g>
<polygon id="Fill-6" fill="#CDDCFD" mask="url(#mask-2)" points="37.6658541 100.8783 39.2999588 100.8783 39.2999588 36.5130975 37.6658541 36.5130975"></polygon>
<path d="M0.296205515,103.520833 C0.296205515,106.985959 65.5249578,106.249465 126.990056,106.249465 C176.824081,106.249465 176.673394,103.688429 176.673394,103.688429 C176.673394,103.688429 0.296205515,97.7146751 0.296205515,103.520833" id="Fill-9" fill="#D8E3FF" mask="url(#mask-2)"></path>
<path d="M38.352393,101.025918 C38.352393,101.025918 35.6692989,99.5151545 36.3133105,98.2122906 C36.9571894,96.9092937 39.1037176,97.963556 39.1037176,97.963556 C39.1037176,97.963556 33.0132653,93.7778978 34.6609002,90.8558646 C36.2013546,88.1240403 43.3965089,91.5032397 43.3965089,91.5032397 C43.3965089,91.5032397 41.0965056,87.1324272 43.2198203,85.2867365 C44.8687816,83.8533867 49.5519593,87.0048675 49.5519593,87.0048675 C49.5519593,87.0048675 48.0519629,79.0985651 51.4853204,79.1830285 C54.809773,79.2649646 56.1608044,84.6303165 56.1608044,84.6303165 C56.1608044,84.6303165 59.5651118,78.5308649 63.0352131,80.2970137 C66.5053144,82.0631625 63.6780308,87.8602752 63.6780308,87.8602752 C63.6780308,87.8602752 67.8371118,86.1249855 69.8096044,90.3969692 C71.1396772,93.2772362 70.5659697,95.9813938 70.5659697,95.9813938 C70.5659697,95.9813938 72.5823692,95.6827793 73.030458,96.7539343 C73.4785467,97.8252223 71.4734224,98.4823073 71.4734224,98.4823073 C71.4734224,98.4823073 75.4860587,99.1852819 75.4860587,101.425224 L38.352393,101.025918 Z" id="Fill-81" fill="#D8E3FF" mask="url(#mask-2)"></path>
<path d="M44.1954281,29.3822352 C44.1954281,32.5458203 41.6379528,35.1104471 38.4830258,35.1104471 C35.3279662,35.1104471 32.7703582,32.5458203 32.7703582,29.3822352 C32.7703582,26.2186501 35.3279662,23.6540233 38.4830258,23.6540233 C41.6379528,23.6540233 44.1954281,26.2186501 44.1954281,29.3822352" id="Fill-82" fill="#FFFFFF" mask="url(#mask-2)"></path>
<path d="M44.1955608,29.3825544 C44.1955608,32.5457405 41.6382181,35.1101012 38.4826279,35.1101012 C37.8477691,35.1101012 37.238379,35.006484 36.6678551,34.814679 C39.7957216,34.784618 42.3230856,32.2323614 42.3230856,29.0871322 C42.3230856,26.5594831 40.690838,24.4142468 38.4246602,23.6550076 C38.443629,23.6538105 38.463659,23.6538105 38.4826279,23.6538105 C41.6382181,23.6538105 44.1955608,26.2183043 44.1955608,29.3825544" id="Fill-83" fill="#E6EDFF" mask="url(#mask-2)"></path>
<path d="M39.5467525,36.5131773 L37.4642937,36.5131773 C37.1066717,36.5131773 36.7904361,36.2809363 36.6824598,35.9392255 L36.2493603,34.5682588 L40.7164525,34.5682588 L40.3357495,35.9151501 C40.2357321,36.2689651 39.91366,36.5131773 39.5467525,36.5131773" id="Fill-92" fill="#CDDCFD" mask="url(#mask-2)"></path>
<path d="M139.805481,20.6099114 C138.471187,20.6099114 136.622952,21.3965287 135.865645,23.5740469 C135.86507,23.5754062 135.864304,23.5767654 135.864304,23.5783189 C135.864304,23.5775422 135.864304,23.5767654 135.86507,23.5761829 C136.513533,20.4139852 136.653804,18.4112276 134.555305,17.6139305 C133.055255,17.0442106 130.049405,19.5133851 128.870329,21.8588678 C129.375073,18.0679199 128.825105,15.3993241 126.042309,14.6354257 C122.982421,13.7957976 118.214377,19.3504693 116.923774,24.4839676 L127.827691,24.4839676 L128.403336,24.4839676 L135.628987,24.4839676 L141.111222,24.4839676 C141.640685,23.0893773 141.319328,20.6099114 139.805481,20.6099114" id="Fill-93" fill="#FFFFFF" mask="url(#mask-2)"></path>
<polygon id="Fill-94" fill="#C3D3F4" mask="url(#mask-2)" points="84.3557226 31.8555085 51.6274672 31.8555085 49.1846008 19.7616857 81.9129888 19.7616857"></polygon>
<polygon id="Fill-95" fill="#D8E3FF" mask="url(#mask-2)" points="83.4638429 31.8555085 50.7355875 31.8555085 48.2927211 19.7616857 81.0209765 19.7616857"></polygon>
<polygon id="Fill-96" fill="#E1E7F7" mask="url(#mask-2)" points="56.3495376 31.8555085 55.8032885 34.0794886 53.514693 31.8555085"></polygon>
<polygon id="Fill-97" fill="#C3D3F4" mask="url(#mask-2)" points="80.6393449 13.7337686 47.9110895 13.7337686 45.4683557 1.63994582 78.1966111 1.63994582"></polygon>
<polygon id="Fill-98" fill="#D8E3FF" mask="url(#mask-2)" points="79.7474652 13.7337686 47.0192098 13.7337686 44.5763434 1.63994582 77.3045988 1.63994582"></polygon>
<polygon id="Fill-99" fill="#E1E7F7" mask="url(#mask-2)" points="77.6744245 13.7337686 77.1281754 15.9577487 74.8395799 13.7337686"></polygon>
<polygon id="Fill-100" fill="#CDDCFD" mask="url(#mask-2)" points="60.5185274 22.8575671 60.773877 24.1217242 69.033408 24.1217242 68.7238049 22.8575671"></polygon>
<polygon id="Fill-101" fill="#CDDCFD" mask="url(#mask-2)" points="60.9285194 25.1765319 61.183869 26.440689 73.6642953 26.440689 73.3546923 25.1765319"></polygon>
<polygon id="Fill-102" fill="#CDDCFD" mask="url(#mask-2)" points="61.3789295 27.4369842 61.6342791 28.7010083 79.4961482 28.7010083 79.1864124 27.4369842"></polygon>
<polygon id="Fill-103" fill="#CDDCFD" mask="url(#mask-2)" points="53.1505446 9.38790935 53.4058942 10.6520665 68.2530464 10.6520665 67.9435759 9.38790935"></polygon>
<polygon id="Fill-104" fill="#CDDCFD" mask="url(#mask-2)" points="49.6710915 7.05479197 49.9264411 8.31894907 67.7883101 8.31894907 67.4785744 7.05479197"></polygon>
<polygon id="Fill-105" fill="#CDDCFD" mask="url(#mask-2)" points="49.2487897 4.72160808 49.5041393 5.98576518 67.3660084 5.98576518 67.0564053 4.72160808"></polygon>
<polygon id="Fill-106" fill="#FFFFFF" mask="url(#mask-2)" points="57.6265376 22.3816327 50.9589289 22.3816327 52.375091 29.3821155 59.0064865 29.3821155"></polygon>
<polygon id="Fill-107" fill="#FFFFFF" mask="url(#mask-2)" points="75.7010167 4.18656263 69.033408 4.18656263 70.4495701 11.1870454 77.0809656 11.1870454"></polygon>
<polygon id="Fill-108" fill="#8CBFE5" mask="url(#mask-2)" points="143.219956 84.0744146 142.05596 83.8086543 147.281009 60.7885983 148.445138 61.0543586"></polygon>
<path d="M153.959217,86.148848 L133.687378,86.148848 L132.019315,81.7341411 L152.233319,81.7341411 C153.186536,81.7341411 153.959217,82.5089428 153.959217,83.4645094 L153.959217,86.148848 Z" id="Fill-109" fill="#8CBFE5" mask="url(#mask-2)"></path>
<polygon id="Fill-110" fill="#8CBFE5" mask="url(#mask-2)" points="74.3750427 82.2122304 73.2110465 81.9464701 78.4360959 58.926414 79.6002247 59.1921743"></polygon>
<polygon id="Fill-111" fill="#8CBFE5" mask="url(#mask-2)" points="52.3337841 103.349232 51.1697879 103.083472 55.5448216 83.8086676 56.7088178 84.0744279"></polygon>
<polygon id="Fill-112" fill="#8CBFE5" mask="url(#mask-2)" points="129.431172 103.234016 128.245156 103.098609 130.427101 83.8738175 131.613117 84.0092249"></polygon>
<path d="M134.219368,83.7507138 L133.687445,86.1489411 L53.0833313,86.1489411 L53.0833313,83.6775566 C53.0833313,82.6041403 53.9521831,81.7342342 55.0226616,81.7342342 L132.606487,81.7342342 C133.6637,81.7342342 134.448851,82.7158714 134.219368,83.7507138" id="Fill-113" fill="#ABD2F4" mask="url(#mask-2)"></path>
<polygon id="Fill-114" fill="#ABD2F4" mask="url(#mask-2)" points="153.876709 73.9716393 152.844699 78.3875433 64.862508 78.3875433 65.9930766 73.9716393"></polygon>
<polygon id="Fill-115" fill="#ABD2F4" mask="url(#mask-2)" points="155.743122 65.9894262 154.711112 70.4041331 66.727462 70.4041331 67.7897162 65.9894262"></polygon>
<polygon id="Fill-116" fill="#ABD2F4" mask="url(#mask-2)" points="157.588285 58.097742 156.556275 62.5124489 68.4691583 62.5124489 69.3971717 58.097742"></polygon>
<polygon id="Fill-119" fill="#8CBFE5" mask="url(#mask-2)" points="157.588033 58.0974893 158.667929 58.0974893 157.659133 62.5120631 156.556023 62.5120631"></polygon>
<polygon id="Fill-120" fill="#8CBFE5" mask="url(#mask-2)" points="155.696748 65.9890405 156.776645 65.9890405 155.767981 70.4037474 154.664738 70.4037474"></polygon>
<polygon id="Fill-121" fill="#8CBFE5" mask="url(#mask-2)" points="153.805583 73.9719053 154.885479 73.9719053 153.876682 78.3864792 152.773572 78.3864792"></polygon>
<polygon id="Fill-122" fill="#8CBFE5" mask="url(#mask-2)" points="147.992725 103.297663 141.247649 84.5672816 142.370524 84.1606604 149.1156 102.891042"></polygon>
<polygon id="Fill-123" fill="#8CBFE5" mask="url(#mask-2)" points="69.5970872 102.898624 62.8520114 86.4427672 63.9748863 86.0857599 70.7199621 102.54135"></polygon>
<path d="M176.673829,103.688004 L146.508089,103.65475 C146.508089,103.65475 143.823271,99.9463433 145.720021,97.9551363 C145.880526,97.7863426 146.058276,97.6480089 146.246771,97.5361448 C148.204672,96.3617716 151.457096,97.9551363 151.457096,97.9551363 C151.457096,97.9551363 149.61062,90.9587769 152.150984,89.0420572 C152.209217,88.9981629 152.269041,88.9582589 152.331254,88.9222124 C154.931309,87.4006748 160.471931,92.7092301 160.471931,92.7092301 C160.471931,92.7092301 162.165993,83.1721863 166.351073,83.1627424 C166.496855,83.1627424 166.636269,83.1707232 166.770245,83.1881479 C171.605305,83.7839139 169.486766,94.9837552 169.486766,94.9837552 C169.486766,94.9837552 174.10163,91.6344838 176.83964,92.5082472 C177.200446,92.6227716 177.527957,92.8103201 177.807979,93.0883176 C180.177093,95.436 176.420469,100.306809 176.23874,100.539582 L176.232107,100.547696 C176.232107,100.547696 178.249701,100.231125 178.753767,101.558463 C179.257701,102.886067 176.673829,103.688004 176.673829,103.688004" id="Fill-124" fill="#70BB92" mask="url(#mask-2)"></path>
<path d="M151.829973,99.6909846 C149.322904,97.2342315 146.35289,97.5242002 146.246771,97.5361714 C148.204672,96.3617982 151.457096,97.9551629 151.457096,97.9551629 L151.829973,99.6909846 Z" id="Fill-125" fill="#4D996D" mask="url(#mask-2)"></path>
<path d="M163.839508,103.821402 C163.833008,103.821402 163.826243,103.82087 163.819743,103.819939 C163.747184,103.809032 163.697308,103.741196 163.708185,103.668703 L165.504785,91.690469 C165.515795,91.6178438 165.583313,91.568895 165.655607,91.5786049 C165.728166,91.589512 165.778042,91.6573487 165.767165,91.7299739 L163.970565,103.708075 C163.960617,103.774183 163.903975,103.821402 163.839508,103.821402" id="Fill-126" fill="#F2F2F2" mask="url(#mask-2)"></path>
<path d="M159.205861,103.802182 C159.154394,103.802182 159.105579,103.771988 159.083957,103.721709 L156.199767,96.9831293 C156.170849,96.9156916 156.201889,96.8374799 156.269275,96.808483 C156.336661,96.7792201 156.414526,96.8106112 156.443576,96.8781819 L159.327766,103.616629 C159.356683,103.684199 159.325511,103.762411 159.258258,103.791408 C159.241146,103.798857 159.223371,103.802182 159.205861,103.802182" id="Fill-127" fill="#F2F2F2" mask="url(#mask-2)"></path>
<path d="M168.756466,103.802182 C168.72861,103.802182 168.700621,103.793536 168.676612,103.775313 C168.618246,103.731153 168.606573,103.647754 168.650745,103.588962 L173.142377,97.6191982 C173.186417,97.5604064 173.269455,97.5487012 173.328219,97.5931276 C173.386584,97.637288 173.398258,97.7206873 173.354085,97.7794791 L168.862453,103.749376 C168.836454,103.783959 168.796792,103.802182 168.756466,103.802182" id="Fill-128" fill="#F2F2F2" mask="url(#mask-2)"></path>
<path d="M171.749362,99.8242638 C171.685293,99.8242638 171.628917,99.7775762 171.61857,99.7122668 L171.178706,96.9517116 C171.167165,96.8790864 171.216378,96.8109836 171.288672,96.7994115 C171.362558,96.7875733 171.42928,96.8373203 171.440688,96.9096794 L171.88042,99.6702346 C171.89196,99.7428598 171.842747,99.8109625 171.770454,99.8225347 C171.763291,99.8237318 171.75626,99.8242638 171.749362,99.8242638" id="Fill-129" fill="#F2F2F2" mask="url(#mask-2)"></path>
<path d="M165.165999,94.9781155 C165.119439,94.9781155 165.074471,94.953641 165.050197,94.9100127 C165.014249,94.8460334 165.037064,94.7648954 165.101134,94.7291148 L166.705923,93.8279506 C166.769993,93.7917711 166.850776,93.8147823 166.886458,93.8788947 C166.922274,93.943007 166.899458,94.024012 166.835521,94.0599256 L165.230599,94.9610898 C165.210171,94.9726619 165.187886,94.9781155 165.165999,94.9781155" id="Fill-130" fill="#F2F2F2" mask="url(#mask-2)"></path>
<path d="M157.336716,99.5291342 L155.306653,99.5291342 C155.233431,99.5291342 155.174004,99.4696773 155.174004,99.3961211 C155.174004,99.3225648 155.233431,99.2631079 155.306653,99.2631079 L157.336716,99.2631079 C157.410071,99.2631079 157.469365,99.3225648 157.469365,99.3961211 C157.469365,99.4696773 157.410071,99.5291342 157.336716,99.5291342" id="Fill-131" fill="#F2F2F2" mask="url(#mask-2)"></path>
<path d="M157.634142,100.130034 C157.616897,100.130034 157.599388,100.126709 157.582408,100.119526 C157.515155,100.090929 157.483452,100.01285 157.511972,99.9451462 L159.083731,96.2150581 C159.112251,96.1476204 159.189585,96.1158303 159.257502,96.1444281 C159.324887,96.1730259 159.356458,96.2511046 159.328071,96.3188083 L157.756311,100.048896 C157.734955,100.099574 157.685875,100.130034 157.634142,100.130034" id="Fill-132" fill="#F2F2F2" mask="url(#mask-2)"></path>
<path d="M150.790017,103.821402 C150.743722,103.821402 150.698887,103.797194 150.674479,103.753965 L148.758893,100.365588 C148.722813,100.301608 148.74523,100.22047 148.808902,100.184158 C148.872706,100.147978 148.953489,100.170457 148.989835,100.234304 L150.905289,103.622814 C150.941502,103.68666 150.919084,103.767931 150.85528,103.804111 C150.834719,103.815816 150.812169,103.821402 150.790017,103.821402" id="Fill-133" fill="#F2F2F2" mask="url(#mask-2)"></path>
<path d="M149.484378,101.511988 L148.394267,101.511988 C148.320912,101.511988 148.261618,101.452531 148.261618,101.378975 C148.261618,101.305419 148.320912,101.245962 148.394267,101.245962 L149.484378,101.245962 C149.557733,101.245962 149.617027,101.305419 149.617027,101.378975 C149.617027,101.452531 149.557733,101.511988 149.484378,101.511988" id="Fill-134" fill="#F2F2F2" mask="url(#mask-2)"></path>
<path d="M169.486806,94.983702 L168.031645,95.9041531 C169.948823,85.5994904 166.770284,83.1880947 166.770284,83.1880947 C171.605345,83.7839937 169.486806,94.983702 169.486806,94.983702" id="Fill-135" fill="#4D996D" mask="url(#mask-2)"></path>
<path d="M176.2387,100.539595 L176.232067,100.547709 L174.902923,101.107695 C178.3067,95.8814744 176.836948,92.5082605 176.836948,92.5082605 L176.839601,92.5082605 C177.200406,92.6226519 177.52805,92.8103334 177.807939,93.0881979 C180.177053,95.4360133 176.420429,100.306822 176.2387,100.539595" id="Fill-136" fill="#4D996D" mask="url(#mask-2)"></path>
<path d="M160.279099,94.3944936 C154.982419,87.961977 152.331294,88.9235292 152.331294,88.9235292 L152.331294,88.9221991 C154.931349,87.4006615 160.471971,92.7092168 160.471971,92.7092168 L160.279099,94.3944936 Z" id="Fill-137" fill="#4D996D" mask="url(#mask-2)"></path>
</g>
<g transform="translate(50.358779, 35.000000)">
<path d="M40.9073922,16.4286116 L31.7716783,16.7585967 L3.78285684,17.7712637 C2.12192735,17.8313825 0.722018257,16.5461771 0.640449383,14.8882355 L0.072141652,3.22118951 C-0.0161131957,1.41495497 1.48675988,-0.0666382979 3.29344359,0.0455833746 L40.5971631,2.37819099 C42.0787747,2.47037308 43.2662036,3.61663731 43.4253298,5.07418308 C43.4320157,5.13430183 43.4373645,5.19575656 43.4399052,5.25721128 L43.8291626,13.2503335 C43.9120686,14.9376665 42.5976063,16.3671569 40.9073922,16.4286116" id="Fill-138" fill="#BDDBFF"></path>
<polygon id="Fill-140" fill="#FFFFFF" points="5.36360813 3.37880752 5.51203674 5.61041564 28.1478005 6.25488867 28.0920395 4.66334488"></polygon>
<polygon id="Fill-142" fill="#FFFFFF" points="5.76725371 7.84317269 5.88506056 9.554286 19.5695096 9.63711628 19.5695096 8.17689857"></polygon>
<polygon id="Fill-144" fill="#FFFFFF" points="6.07595847 11.3300069 6.11206273 13.1712439 22.4790579 12.9648362 22.4790579 11.6315359"></polygon>
<path d="M40.9073922,16.4286116 L31.7716783,16.7585967 C31.4385831,16.071907 31.1831789,15.3331143 31.0201749,14.5542425 C30.5347732,12.2216348 30.9292457,9.8462761 32.1313837,7.86502919 C33.3522424,5.85572687 35.2562739,4.49169916 37.4921971,4.0267808 C38.0337609,3.91322316 38.5860223,3.85711232 39.1369465,3.85711232 C40.6760575,3.85711232 42.1469717,4.29798318 43.4253298,5.07418308 C43.4320157,5.13430183 43.4373645,5.19575656 43.4399052,5.25721128 L43.8291626,13.2503335 C43.9120686,14.9376665 42.5976063,16.3671569 40.9073922,16.4286116" id="Fill-146" fill="#8CBFE5"></path>
<path d="M58.5103545,15.7519812 C60.0778092,23.2250003 55.6579416,30.4612978 48.6380377,31.9142039 C41.6186195,33.3673512 34.6572552,28.4869285 33.0900434,21.0139094 C31.5225887,13.5408903 35.9424563,6.30483413 42.9618745,4.85168676 C49.9817784,3.39878069 56.9428998,8.27896211 58.5103545,15.7519812" id="Fill-148" fill="#FFFFFF"></path>
<path d="M46.5664321,32.2808459 C46.5664321,32.2808459 44.827598,34.879156 41.8358058,36 C41.8358058,36 42.5126937,33.184977 41.3733453,31.3666091 C40.0800603,29.3027829 46.5664321,32.2808459 46.5664321,32.2808459" id="Fill-150" fill="#FFFFFF"></path>
</g>
<path d="M89.3587786,53.5 C89.3587786,54.3262904 90.0457903,55 90.8883956,55 C91.7310008,55 92.4180505,54.3262904 92.4180505,53.5 C92.4180505,52.6737096 91.7310008,52 90.8883956,52 C90.0457903,52 89.3587786,52.6737096 89.3587786,53.5 M95.9587786,53.5 C95.9587786,54.3262904 96.6457903,55 97.4883956,55 C98.3310008,55 99.0180505,54.3262904 99.0180505,53.5 C99.0180505,52.6737096 98.3310008,52 97.4883956,52 C96.6457903,52 95.9587786,52.6737096 95.9587786,53.5 M102.299545,53.5 C102.299545,54.3262904 102.986556,55 103.829162,55 C104.671729,55 105.358779,54.3262904 105.358779,53.5 C105.358779,52.6737096 104.671767,52 103.829162,52 C102.986556,52 102.299507,52.6737096 102.299507,53.5" id="形状" fill="#FFBD00" fill-rule="nonzero"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

BIN
src/assets/images/pdf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
src/assets/logo_bak.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
src/assets/logo_bak2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
src/assets/logo_test.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
src/assets/study.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
src/assets/study_bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 KiB

3311
src/assets/style/custom.scss Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
src/assets/yanjing.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

129
src/main.js Normal file
View File

@@ -0,0 +1,129 @@
import Vue from 'vue'
import ElementUI, {
MessageBox
} from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
import App from './App.vue'
import router from './router'
import store from './vuex/store'
// 引入icon
import './assets/icon/iconfont.css'
import './assets/style/custom.scss'
// 引入加载
import {
showLoading,
hideLoading
} from './utils/loading';
import 'element-ui/lib/theme-chalk/base.css';
import ElCollapseTransition from 'element-ui/lib/transitions/collapse-transition';
Vue.component(ElCollapseTransition.name, ElCollapseTransition)
import axios from 'axios';
Vue.prototype.$axios = axios;
Vue.prototype.$baseApiUrl = process.env.VUE_APP_API;
Vue.prototype.$baseImgUrl = process.env.VUE_APP_IMGAPI;
// 引入utils的方法
import * as utils from './utils/utils'
Vue.prototype.$utils = utils;
// 防重复点击(指令实现)
Vue.directive('throttle', {
inserted(el, binding) {
el.addEventListener('click', () => {
el.style.pointerEvents = 'none';
if (!el.disabled) {
setTimeout(() => {
el.style.pointerEvents = 'auto';
}, binding.value || 3000);
}
});
}
});
//响应拦截器
axios.interceptors.response.use(response => {
if (response.data.code === 401) {
hideLoading();
localStorage.clear();
MessageBox.alert("登录超时请重新登录!", "提示", {
confirmButtonText: "确定",
showClose: false,
callback: () => {
router.push("/login");
window.location.reload();
}
}).then(r => this.load(false));
}
return response;
}, function (error) {
hideLoading();
router.push("/login");
return Promise.reject(error)
});
// 路由拦截器
router.beforeEach((to, from, next) => {
// if(to.name){
// document.title = to.name
// }
if (JSON.parse(localStorage.getItem("userdata")) == null) {
window.localStorage.clear();
}
if (to.matched.length != 0) {
if (to.meta.requireAuth) { // 判断该路由是否需要登录权限
if (Boolean(localStorage.getItem("userInfo"))) { // 通过vuex state获取当前的user是否存在
next();
} else {
next({
path: '/login',
query: {
redirect: to.fullPath
} // 将跳转的路由path作为参数登录成功后跳转到该路由
})
}
} else {
if (Boolean(localStorage.getItem("userInfo"))) { // 判断是否登录
if (document.URL.indexOf("?") > 0) {
localStorage.clear()
next();
} else {
if (to.path != "/" && to.path != "/login") { //判断是否要跳到登录界面
next();
} else {
/**
* 防刷新,如果登录,修改路由跳转到登录页面,修改路由为登录后的首页
*/
next({
path: '/home/index'
})
}
}
} else {
next();
}
}
} else {
next({
path: '/login',
query: {
redirect: to.fullPath
} // 将跳转的路由path作为参数登录成功后跳转到该路由
})
}
})
Vue.config.productionTip = false
new Vue({
render: h => h(App),
store,
router
}).$mount('#app')

106
src/router/index.js Normal file
View File

@@ -0,0 +1,106 @@
// 导入组件
import Vue from 'vue';
import Router from 'vue-router';
// 登录
import login from '@/views/login';
// 首页
import index from '@/views/index';
// 启用路由
Vue.use(Router);
// 导出路由
export default new Router({
routes: [{
path: '/',
redirect: '/qualification/jobApplication',
name: '',
component: index,
hidden: true,
meta: {
requireAuth: false
}
},
{
path: '/login',
name: '登录',
component: login,
hidden: true,
meta: {
requireAuth: false
}
},
{
path: '/qualification/jobApplication/:mode/:id',
name: '首页',
component: index,
iconCls: 'el-icon-tickets',
children: [
{
path: '/qualification/jobApplication',
name: "任职申请",
component: resolve => require(["@/views/qualification/jobApplication.vue"], resolve),
meta: {
requireAuth: true
}
},
{
path: '/qualification/studyExam',
name: "学习考试",
component: resolve => require(["@/views/qualification/studyExam"], resolve),
meta: {
requireAuth: true
}
},
{
path: '/qualification/professional',
name: "专业回馈",
component: resolve => require(["@/views/qualification/professional"], resolve),
meta: {
requireAuth: true
}
},
{
path: '/qualification/evidence',
name: "个人行为举证",
component: resolve => require(["@/views/qualification/evidence"], resolve),
meta: {
requireAuth: true
}
},
{
path: '/qualification/appliedList',
name: "已申报任职资格",
component: resolve => require(["@/views/qualification/appliedList"], resolve),
meta: {
requireAuth: true
}
},
{
path: '/management/professionalManagement',
name: "专业回馈审核",
component: resolve => require(["@/views/management/professionalManagement"], resolve),
meta: {
requireAuth: true
}
},
{
path: '/management/qualificationReview',
name: "资格审核",
component: resolve => require(["@/views/management/qualificationReview"], resolve),
meta: {
requireAuth: true
}
},
{
path: '/management/setting',
name: "信息内置",
component: resolve => require(["@/views/management/setting"], resolve),
meta: {
requireAuth: true
}
},
]
}
]
})

34
src/utils/loading.js Normal file
View File

@@ -0,0 +1,34 @@
import { Loading } from 'element-ui';
let loadingCount = 0;
let loading;
const startLoading = () => {
loading = Loading.service({
lock: true,
text: '加载中……',
background: 'rgba(0, 0, 0, 0.7)',
customClass:"loadingModel",//自定义类名
});
};
const endLoading = () => {
loading.close();
};
export const showLoading = () => {
if (loadingCount === 0) {
startLoading();
}
loadingCount += 1;
};
export const hideLoading = () => {
if (loadingCount <= 0) {
return;
}
loadingCount -= 1;
if (loadingCount === 0) {
endLoading();
}
};

138
src/utils/utils.js Normal file
View File

@@ -0,0 +1,138 @@
// 时间插件
import moment from "moment"
/**
* 存储localStorage
*/
const setStore = (name, content) => {
if (!name) return;
if (typeof content !== 'string') {
content = JSON.stringify(content);
}
window.localStorage.setItem(name, content);
}
/**
* 获取localStorage
*/
const getStore = name => {
if (!name) return;
return window.localStorage.getItem(name);
}
/**
* 删除localStorage
*/
const removeStore = name => {
if (!name) return;
window.localStorage.removeItem(name);
}
/**
* 设置cookie
**/
function setCookie(name, value, day) {
let date = new Date();
date.setDate(date.getDate() + day);
document.cookie = name + '=' + value + ';expires=' + date;
};
/**
* 获取cookie
**/
function getCookie(name) {
let reg = RegExp(name + '=([^;]+)');
let arr = document.cookie.match(reg);
if (arr) {
return arr[1];
} else {
return '';
}
};
/**
* 删除cookie
**/
function delCookie(name) {
setCookie(name, null, -1);
};
// 下载不同源图片到本地
function downloadIamge(imgsrc, name) {//下载图片地址和图片名
var image = new Image();
// 解决跨域 Canvas 污染问题
image.setAttribute("crossOrigin", "anonymous");
image.onload = function() {
var canvas = document.createElement("canvas");
canvas.width = image.width;
canvas.height = image.height;
var context = canvas.getContext("2d");
context.drawImage(image, 0, 0, image.width, image.height);
var url = canvas.toDataURL("image/png"); //得到图片的base64编码数据
var a = document.createElement("a"); // 生成一个a元素
var event = new MouseEvent("click"); // 创建一个单击事件
a.download = name || "photo"; // 设置图片名称
a.href = url; // 将生成的URL设置为a.href属性
a.dispatchEvent(event); // 触发a的单击事件
};
image.src = imgsrc;
}
// 判断是图片类型
function isImage(str) {
var reg = /\.(png|jpg|jpeg)$/;
return reg.test(str);
}
// 过滤时间格式
// 短时间
const shortTime = function (value) {
return moment(value).format('YYYY-MM-DD');
}
// 长时间
const time = function (value) {
return moment(value).format('YYYY-MM-DD HH:mm:ss');
}
//过滤秒
const leaveTime = function (value) {
return moment(value).format('YYYY-MM-DD HH:mm');
}
// 年月
const monthTime = function (value) {
return moment(value).format('YYYY-MM');
}
// 时分
const secondsTime = function (value) {
return moment(value).format('HH:mm');
}
// 中国标准时间的转化
const filterTime = (time, type = 'short') => {
if (type == 'short') {
return moment(time).format('YYYY-MM-DD')
} else {
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
}
export {
setStore,
getStore,
removeStore,
setCookie,
getCookie,
delCookie,
downloadIamge,
isImage,
shortTime,
time,
leaveTime,
monthTime,
secondsTime,
filterTime
}

378
src/views/index.vue Normal file
View File

@@ -0,0 +1,378 @@
<template>
<el-container class="index-con ">
<div :class="{ 'first-logo': isProEnv, 'flex-sb':true, 'first-logo-test': !isProEnv }">
<p> </p>
<el-dropdown class="user-dropdown">
<span class="el-dropdown-link">
{{ username }}<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="showEditPwd = true" >修改密码</el-dropdown-item>
<el-dropdown-item @click.native="exit" >退出</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<!-- <div>-->
<!-- <p style="position: absolute;width: 100%; left: 91%; font-size: 22px;">{{username}}</p>-->
<!-- <p style="position: absolute;width: 100%; left: 91%" @click="exit()">-->
<!-- <i class=" el-icon-switch-button" style="color:#000;font-size:28px;cursor: pointer;"></i>-->
<!-- </p>-->
<!-- </div>-->
</div>
<el-aside :class="showclass">
<el-menu :collapse="collapsed" :collapse-transition="true" router :default-active="$route.path" unique-opened class="el-menu-vertical-demo" background-color="#fff" text-color="#333" active-text-color="#C72C2C">
<el-menu-item index="/qualification/jobApplication" route="/qualification/jobApplication">
<i class="iconfont li-icon-zhifupeizhi1" style="font-size: 12px;"></i>
<span slot="title">任职申请</span>
</el-menu-item>
<el-menu-item index="/qualification/studyExam" route="/qualification/studyExam">
<i class="iconfont icon-order-manage" style="font-size: 15px;"></i>
<span slot="title">学习考试</span>
</el-menu-item>
<el-menu-item index="/qualification/professional" route="/qualification/professional">
<i class="iconfont li-icon-gongsiguanli" style="font-size: 15px;"></i>
<span slot="title">专业回馈</span>
</el-menu-item>
<el-menu-item index="/qualification/evidence" route="/qualification/evidence">
<i class="el-icon-s-ticket" style="font-size: 15px; margin-right: 0;width: 17px;"></i>
<span slot="title">个人行为举证</span>
</el-menu-item>
<el-menu-item index="/qualification/appliedList" route="/qualification/appliedList">
<i class="iconfont icon-news-manage" style="font-size: 15px;"></i>
<span slot="title">已申报任职资格</span>
</el-menu-item>
<el-submenu v-if="hasProfessionalMenu" index="1">
<template slot="title">
<i class="iconfont li-icon-xitongguanli" style="font-size: 15px;"></i>
<span>专业回馈管理</span>
</template>
<el-menu-item index="/management/professionalManagement" route="/management/professionalManagement">专业回馈审核</el-menu-item>
<!-- 在这里添加更多的二级菜单项 -->
</el-submenu>
<el-submenu v-if="hasSettingMenu" index="2">
<template slot="title">
<i class="iconfont icon-promotion-manage" style="font-size: 15px;"></i>
<span>后台管理</span>
</template>
<el-menu-item index="/management/qualificationReview" route="/management/qualificationReview">资格审核</el-menu-item>
<el-menu-item index="/management/setting" route="/management/setting">信息内置</el-menu-item>
<!-- 在这里添加更多的二级菜单项 -->
</el-submenu>
</el-menu>
<div style="position: absolute;bottom: 9%; padding-left: 20px; cursor: pointer;" @click="showPreview =!showPreview">
<i class="el-icon-collection" style="font-size: 15px; margin-right: 0;width: 17px;"></i>
<span slot="title">任职资格管理办法</span>
</div>
</el-aside>
<el-container class="main-con">
<el-main>
<router-view></router-view>
<!-- <button class="buttonimg" @click="aaa()">aaa</button>-->
<!--任职资格序列等级新增弹框-->
<el-dialog v-if="showEditPwd" visible center title="修改密码" top="5vh" width="600px" :show-close="true" :before-close="closeEditPwdDialog" :close-on-click-modal="false">
<el-form label-width="120px" label-position="left" size="small">
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="旧密码" :rules="[{required: true, message: '请填写旧密码', trigger: ['blur', 'change']}]">
<el-input v-model.trim="editPwdData.password" ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="15">
<el-form-item label="验证码" :rules="[{required: true, message: '请填写任职资格序列', trigger: ['blur', 'change']}]">
<el-input v-model.trim="editPwdData.randomCode" ></el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-button type="primary" style="width: 90px;" size="small" @click="getCaptcha" :disabled="captchaBtnText === '获取验证码' ? false : true">{{ captchaBtnText }}</el-button>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="新密码" :rules="[{required: true, message: '请填写新密码', trigger: ['blur', 'change']}]">
<el-input v-model.trim="editPwdData.newPwd" ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="再次确认密码" :rules="[{required: true, message: '请再次确认密码', trigger: ['blur', 'change']}]">
<el-input v-model.trim="editPwdData.confirmPwd" ></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer">
<el-button size="small" class="button-md" @click="closeEditPwdDialog" type="primary" plain>取消</el-button>
<el-button size="small" class="button-md" type="primary" @click="submitEditPwd">确定</el-button>
</span>
</el-dialog>
<!--PDF预览-->
<el-dialog v-if="showPreview" visible center title="任职资格管理办法预览" top="5vh" width="600px" :show-close="true" :before-close="closePreviewDialog" :close-on-click-modal="false">
<Preview style="height: 500px" @changeTip="changeTip"></Preview>
</el-dialog>
</el-main>
</el-container>
<div class="footer">
<p class="footer-text">Copyright©2025 东风汽车集团股份有限公司东风人事共享服务中心</p>
</div>
</el-container>
</template>
<script>
import watermark from "watermark-dom";
import {cancelPreview, sendCode, titleName, updatePwd} from "@/api/userMG";
import Preview from './tools/preview.vue';
export default {
name: "index",
provide() {
return {
reload: this.reload
};
},
data() {
return {
isProEnv: titleName ==='',
roles:JSON.parse(localStorage.getItem('userdata')).roles,
username: JSON.parse(localStorage.getItem('userdata')).username,
hasProfessionalMenu: false,
hasSettingMenu: false,
showclass: "asideshow",
collapsed: false,
showEditPwd: false,
showtype: false,
editPwdData: {
password: "",
newPwd: "",
confirmPwd: "",
randomCode: ""
},
captchaBtnText: "获取验证码",
websock: null,
showPreview: true,
cancelTip: false,
};
},
// 注册组件
components: {
// navcon,
Preview
},
mounted() {
let userData = JSON.parse(localStorage.getItem('userdata'))
// watermark.load({watermark_txt: userData.username});
},
methods: {
changeTip(val) {
this.cancelTip = val;
console.log(val);
},
// 退出登录
exit() {
console.log("退出登录");
setTimeout(() => {
this.$store.commit("logout", "false");
this.$router.push({ path: "/login" });
localStorage.clear();
this.$message({
type: "success",
message: "已退出登录!"
});
}, 1000);
},
closeEditPwdDialog(){
this.showEditPwd = false
},
closePreviewDialog(){
this.showPreview = false
if(this.cancelTip){
cancelPreview({}).then(res => {
localStorage.setItem("showTip", "1");
})
}
},
submitEditPwd(){
updatePwd(this.editPwdData).then(res => {
console.log(res);
let {code, data, msg} = res;
if(code == '200'){
this.$message({
type: "success",
message: msg
});
this.showEditPwd = false
}else{
this.$message({
type: "error",
message: msg
});
}
})
},
getCaptcha(){
console.log("获取验证码");
sendCode({}).then(res => {
console.log(res);
let {code, data, msg} = res;
if(code == '200'){
this.$message({
type: "success",
message: msg
});
}else{
this.$message({
type: "error",
message: msg
});
}
})
//设置60秒倒计时
let time = 60;
let timer = setInterval(() => {
time--;
this.captchaBtnText = "请"+time + "s后重试";
if (time <= 0) {
clearInterval(timer);
this.editPwdData.captcha = "";
this.captchaBtnText = "获取验证码";
}
}, 1000);
},
},
created() {
for (let role of this.roles) {
if (role.userType === "2") {
this.hasProfessionalMenu = true;
}
if (role.userType === "3") {
this.hasSettingMenu = true;
}
}
this.showPreview = localStorage.getItem('showTip') == "0";
}
};
</script>
<style>
/* .el-main{} */
.el-submenu .el-menu-item {
height: 50px;
line-height: 50px;
padding: 0 45px;
min-width: 200px;
}
.first-logo {
height: 60px;
width: 100%;
box-sizing: border-box;
background: url(../assets/logo.png);
background-repeat: no-repeat;
padding: 4px 30px;
position: fixed;
top: 25px;
left: 0px;
font-size: 40px;
/* font-weight: 600; */
color: #000;
}
.first-logo-test {
height: 60px;
width: 100%;
box-sizing: border-box;
background: url(../assets/logo_test.png);
background-repeat: no-repeat;
padding: 4px 30px;
position: fixed;
top: 25px;
left: 0px;
font-size: 40px;
/* font-weight: 600; */
color: #000;
}
.index-con {
height: 100%;
width: 100%;
padding: 100px 0px 0px;
}
.main-con {
background: #f5f7fc;
/* border-top-right-radius: 20px;
border-bottom-right-radius: 20px; */
overflow: hidden;
margin-bottom: 3%;
}
.aside {
width: 60px !important;
height: 100%;
background-color: #fff;
margin: 0px;
}
.asideshow {
width: 220px !important;
height: 93%;
background-color: #fff;
margin: 0px;
}
.el-main {
padding: 0;
}
.index-header,
.index-main {
padding: 0px;
}
.el-menu {
/* padding-top: 20px !important; */
border-right: none !important;
}
.el-dialog__body {
padding: 10px 20px !important;
}
.el-menu.el-menu--horizontal {
border-bottom: 0 !important;
}
.el-submenu.is-active .el-submenu__title {
border-bottom-color: #010d24;
}
.el-aside {
box-shadow: 0px -1px 4px 0px rgba(0, 0, 0, 0.12);
overflow-x: hidden;
}
.buttonimg {
padding: 10px 20px;
text-align: right;
}
.user-dropdown{
font-size: 22px;
}
.footer {
position: fixed;
bottom: 0;
width: 100%;
height: 5%;
background: #fff;
box-shadow: 0px -1px 4px 0px rgba(0, 0, 0, 0.12);
z-index: 999;
}
.footer-text {
width: 100%;
text-align: center;
padding-top: 14px;
font-size: 12px;
color: #999;
}
</style>

318
src/views/login.vue Normal file
View File

@@ -0,0 +1,318 @@
<template>
<div class="login-wrap">
<h2 class="title" style="color:#fff">任职资格管理系统{{titleName}}</h2>
<el-form label-position="left" :model="ruleForm" :rules="rules" ref="ruleForm" label-width="0px"
class="demo-ruleForm login-container" v-if="loginFlag">
<h3 class="title">用户登录</h3>
<el-form-item prop="userNo">
<el-input type="text" v-model="ruleForm.userNo" auto-complete="off" placeholder="账号"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input :type="flag ? 'password' : 'text'" v-model="ruleForm.password" auto-complete="off"
placeholder="密码" @keyup.native.enter="submitForm('ruleForm')">
<template #suffix>
<img class="yanjing" :src="flag ? icon2:icon1" alt="" @click="checkEye">
</template>
</el-input>
</el-form-item>
<el-form-item prop="orgCode">
<el-select v-model="ruleForm.orgCode" placeholder="请选择部门" style="width:100%">
<el-option v-for="item in deptList" :key="item.code" :label="item.name" :value="item.code">
</el-option>
</el-select>
</el-form-item>
<el-checkbox class="remember" v-model="rememberpwd">记住密码</el-checkbox>
<el-form-item style="width:100%;">
<el-button type="primary" style="width:100%;" @click="submitForm('ruleForm')"
:loading="logining">登录</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import {
titleName,
getDeptList,
login
} from "../api/userMG";
import {
setCookie,
getCookie,
delCookie
} from "../utils/utils";
export default {
name: "login",
data() {
return {
titleName: titleName,
icon1:require('../assets/yanjing.png'),
icon2:require('../assets/yanjing-yincang.png'),
yijiangtPCD: {},
orgCode: "",
deptList: [],
logining: false,
rememberpwd: false,
loginFlag:true,
forgeFlag:false,
ruleForm: {
userNo: "",
password: ""
},
editForm: {
userNo: "",
password: ""
},
rules: {
userNo: [{
required: true,
message: "请输入账号",
trigger: "blur"
}],
password: [{
required: true,
message: "请输入密码",
trigger: "blur"
}]
},
flag: true,
};
},
created() {
// 获取存在本地的用户名密码
this.getuserpwd();
this.getDataFun();
// 获取部门列表
this.getDeptList();
},
methods: {
// 切换显示密码的事件
checkEye() {
this.flag = !this.flag
},
getDeptList() {
getDeptList().then(res => {
if (res.code == 200) {
this.deptList = res.data
}
console.log("获取部门列表");
});
},
getDataFun() {
if (document.URL.indexOf("?") < 0) return; //获取当前url地址,如果没参数.直接返回
const str = document.URL.split("?")[1];
const obj = {};
let arr;
//当有多个参数时
arr = str.split("&");
let arr1;
for (var i = 0; i < arr.length; i++) {
arr1 = arr[i].split("=");
obj[arr1[0]] = arr1[1];
}
this.yijiangtPCD = obj
this.ruleForm.userNo = this.yijiangtPCD.userNo
this.ruleForm.password = this.yijiangtPCD.password
},
// 获取用户名密码
getuserpwd() {
// 如果缓存里面有记录,就直接获取登录
if (getCookie("user") != "" && getCookie("pwd") != "") {
this.ruleForm.userNo = getCookie("user");
this.ruleForm.password = getCookie("pwd");
this.rememberpwd = true;
}
},
// 登录方法封装
// async loginFun() {
// const res = await login(this.ruleForm);
// console.log(res, "res登录");
// if (res.code == 200) {
// if (this.rememberpwd == true) {
// //保存帐号到cookie有效期7天
// setCookie("user", this.ruleForm.userNo, 7);
// //保存密码到cookie有效期7天
// setCookie("pwd", this.ruleForm.password, 7);
// } else {
// delCookie("user");
// delCookie("pwd");
// }
// setTimeout(() => {
// this.logining = false;
// // 缓存用户个人信息
// localStorage.setItem("userdata", JSON.stringify(res.data));
// this.$store.commit("login", "true");
// if (res.data.roleName == '公司管理员') {
// this.$router.push("/home/index");
// }
// else {
// this.$router.push("/accountManagement/companyGroup");
// }
// // 弹出登录成功
// this.$message({
// message: "登录成功",
// type: "success"
// });
// }, 1000);
// } else {
// this.$message.error(res.msg);
// this.logining = false;
// return false;
// }
// },
// 结束
//获取info列表
submitForm(ruleForm) {
this.$refs[ruleForm].validate(valid => {
if (valid) {
this.logining = true;
login(this.ruleForm).then(res => {
console.log(res, "res登录");
if (res.code == 200) {
if (this.rememberpwd == true) {
//保存帐号到cookie有效期7天
setCookie("user", this.ruleForm.userNo, 7);
//保存密码到cookie有效期7天
setCookie("pwd", this.ruleForm.password, 7);
} else {
delCookie("user");
delCookie("pwd");
}
//如果请求成功就让他2秒跳转路由
setTimeout(() => {
this.logining = false;
// 缓存token
console.log(res.data.token)
localStorage.setItem('logintoken', res.data.token)
// 缓存用户个人信息
localStorage.setItem("userdata", JSON.stringify(res.data));
localStorage.setItem("showTip", res.data.showTip);
this.$store.commit("login", "true");
this.$router.push({ path: "/qualification/jobApplication" });
// 弹出登录成功
this.$message({
message: "登录成功",
type: "success"
});
}, 1000);
} else {
this.$message.error(res.msg);
this.logining = false;
return false;
}
});
// 调用登录接口
// this.loginFun();
} else {
this.$message.error("请输入用户名密码!");
this.logining = false;
return false;
}
});
},
// enter注册
// loginIn() {
// let keyCode = window.event.keyCode;
// console.log(this.$route.path, "登录path")
// if (keyCode == 13 && this.$route.path == "/login") {
// this.$refs.ruleForm.validate(valid => {
// if (valid) {
// this.logining = true;
// this.loginFun();
// } else {
// this.$message.error("请输入用户名密码!");
// this.logining = false;
// return false;
// }
// });
// } else {
// return;
// }
// },
//忘记密码
editPwd() {
this.loginFlag = false
this.forgeFlag = true
},
//切换登录
loginChange() {
this.loginFlag = true
this.forgeFlag = false
}
},
// mounted() {
// window.addEventListener('keydown', this.loginIn);
// },
// destroyed() {
// window.removeEventListener('keydown', this.loginIn, false);
// }
};
</script>
<style scoped>
.login-wrap {
box-sizing: border-box;
width: 100%;
height: 100%;
padding-top: 10%;
background-image: url("../assets/bg.jpg");
background-repeat: no-repeat;
background-size: cover;
}
.login-container {
border-radius: 10px;
margin: 0px auto;
width: 350px;
padding: 30px 35px 15px 35px;
background: #fff;
border: 1px solid #eaeaea;
text-align: left;
box-shadow: 0 0 20px 2px rgba(0, 0, 0, 0.1);
}
.title {
margin: 0px auto 40px auto;
text-align: center;
color: #505458;
}
.remember {
margin: 0px 0px 35px 0px;
}
.code-box {
text-align: right;
}
.el-button--primary {
color: #FFF;
background-color: #C72C2C;
border-color: #C72C2C;
}
.copyright {
position: absolute;
bottom: 2%;
left: 50%;
transform: translateX(-50%);
color: #fff;
font-size: 14px;
}
.yanjing{
width: 30px;
height: 20px
;
}
::v-deep .el-input__suffix{
top: 5px !important
}
</style>

View File

@@ -0,0 +1,787 @@
<template>
<div class="home">
<!--内容页面-->
<el-card class="base-info">
<!-- 查询条件 -->
<el-card shadow="never" class="s-query" :class="!isToggle?'s-query--is-close':''"
style="position: relative;">
<el-collapse-transition>
<div v-show="isToggle">
<el-form :model="searchData" ref="searchData" label-width="140px" label-position="left"
size="small">
<el-row :gutter="35">
<el-col :span="8">
<el-form-item label="类别" prop="categoryCode">
<el-select v-model="searchData.condition.categoryCode" placeholder="请选择" style="width: 100%;" >
<el-option
v-for="item in typeList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="定义" prop="defineCode">
<el-select v-model="searchData.condition.defineCode" placeholder="请选择" style="width: 100%;" >
<el-option
v-for="item in defineList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="任务名" prop="employeeCode">
<el-input v-model="searchData.condition.specificTask" clearable></el-input>
</el-form-item>
</el-col>
</el-row>
<div class="s-button-group s-button-group--center">
<el-button size="medium" type="primary" class="button-md" @click="search">查询</el-button>
<el-button size="medium" type="primary" plain class="button-md" @click="clear">清空</el-button>
</div>
</el-form>
</div>
</el-collapse-transition>
<div v-if="!isToggle" class="s-query-toggle" @click="toggle"></div>
<div v-else class="s-close-toggle" @click="toggle"><i class="el-icon-arrow-up"></i></div>
</el-card>
<!-- 查询结果 -->
<el-card shadow="never" class="s-table">
<div class="s-table-header">
<div class="s-table-header__title" style="font-size: 14px;"></div>
<div class="s-table-header__btn">
</div>
</div>
<el-table :data="tableData" ref="doLayout" stripe v-loading="loading" @sort-change="tableSort" :cell-style="cellStyle" >
<template slot="empty"><el-empty :image-size="80"></el-empty></template>
<el-table-column v-if="fixColumns.index" label="序号" :width="fixColumnsWidth.width" prop="index" header-align="center"></el-table-column>
<el-table-column
header-align="center"
v-for="column in dynamicColumns"
:key="column.prop"
:prop="column.prop"
:label="column.label"
:min-width="column.width">
<template slot-scope="scope">
<span v-if="column.prop == 'categoryCode'">
{{getCategoryCode(scope.row.categoryCode)}}
</span>
<span v-else-if="column.prop == 'defineCode'">
{{getDefineCode(scope.row.defineCode)}}
</span>
<span v-else-if="column.prop == 'startTime'">
{{dateFormatter(scope.row.startTime)}}
</span>
<span v-else-if="column.prop == 'endTime' ">
{{dateFormatter(scope.row.endTime)}}
</span>
<span v-else-if="column.prop == 'auditDate'">
{{dateFormatter(scope.row.auditDate)}}
</span>
<span v-else-if="column.prop == 'number'">
{{scope.row.number }}
</span>
<span v-else-if="column.prop == 'roleCode'">
{{roleFormatter(scope.row.roleCode)}}
</span>
<span v-else-if="column.prop == 'levelCode'">
{{levelFormatter(scope.row.levelCode)}}
</span>
<span v-else-if="column.prop == 'auditStatus'">
{{statusFormatter(scope.row.auditStatus)}}
</span>
<span v-else-if="column.prop == 'proofMaterial'">
<el-button type="text" size="small" @click="downloadProfessionalFeedbackAttachment(scope.row.proofMaterial)">
{{filenameFormatter(scope.row.proofMaterial)}}
</el-button>
</span>
<span v-else>{{scope.row[column.prop]}}</span>
</template>
</el-table-column>
<el-table-column
header-align="center"
align="center"
fixed="right"
width="200"
label="操作">
<template slot-scope="scope">
<!-- <el-button type="text"-->
<!-- icon="el-icon-view" size="mini" @click="view(scope.row.id)">-->
<!-- 查看-->
<!-- </el-button>-->
<el-button type="text" v-if="scope.row.auditStatus == '0'"
icon="el-icon-check" size="mini" @click="pass(scope.row.id)">
通过
</el-button>
<el-button type="text" v-if="scope.row.auditStatus == '0'"
size="mini" icon="el-icon-close" @click="reject(scope.row.id)">
驳回
</el-button>
</template>
</el-table-column>
</el-table>
<div class="s-pagination" v-if="pageInfo.totalCount > 0">
<div class="s-pagination__total">显示第<span
class="s-pagination__text">{{(pageInfo.pageNo - 1) * pageInfo.pageSize + 1}}</span>条到第<span
class="s-pagination__text">{{(pageInfo.pageNo - 1) * pageInfo.pageSize + tableData.length}}</span><span
class="s-pagination__text">{{pageInfo.totalCount}}</span>
</div>
<el-pagination class="s-pagination__list" background
:page-size="searchData.pageSize"
:page-sizes="[10, 20, 50, 100]"
:current-page="searchData.pageNo"
layout="sizes, prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="searchData.totalCount">
</el-pagination>
</div>
</el-card>
</el-card>
</div>
</template>
<script>
import {
baseUrl,
getProfessionalFeedbackCategoryList,
getProfessionalFeedbackDefineList,
getProfessionalFeedbackRoleList,
getProfessionalFeedbackHierarchyList,
getProfessionalFeedbackUnitList,
getInternalInformationList,
getProfessionalFeedbackList,
getProfessionalFeedbackByRoleList,
addPositionSequenceLevel,
submitProfessionalFeedback,
getDictionary,
downloadProfessionalFeedbackAttachment,
professionalFeedbackAuditApproval,
professionalFeedbackAuditRejection
} from "@/api/userMG";
export default {
// 注册组件
components: {},
data() {
return {
sequence: '',
level: '',
isToggle: false,
importPermission: false,
exportPermission: false,
exportLoading: false,
showDisabled: false,
showAddDialog: false,
addData: {
categoryCode: '',
specificTask: '',
time: '',
startTime: '',
endTime: '',
number: '',
unitCode: '',
initiatingDepartment: '',
roleCode: '',
levelCode: '',
proofMaterial: '',
remarks: '',
},
typeList: [
],
defineList:[
],
roleList: [
],
levelList: [
],
unitList: [
],
statusList:[],
orderCidList: [],
orderCidList2: [],
messageInfo: '',
fixColumns: {
index: true,
pro_code: true,
company_name: true,
ticket_no: true,
},
fixColumnsWidth: {
index: 60,
pro_code: 120,
company_name: 120,
ticket_no: 120,
},
dynamicColumns: [
{
prop: 'userNo',
label: '申请人工号',
width: 120,
},
{
prop: 'username',
label: '申请人',
width: 120,
},
{
prop: 'categoryCode',
label: '类别',
width: 120,
},
{
prop: 'defineCode',
label: '定义',
width: 120,
},
{
prop: 'specificTask',
label: '具体任务',
width: 120,
},
{
prop: 'startTime',
label: '开始时间',
width: 120,
},
{
prop: 'endTime',
label: '结束时间',
width: 120,
},
// {
// prop: 'number',
// label: '数量',
// width: 120,
// },
{
prop: 'initiatingDepartment',
label: '任务发起单位',
width: 120,
},
{
prop: 'roleCode',
label: '担当角色',
width: 120,
},
{
prop: 'levelCode',
label: '层级',
width: 120,
},
{
prop: 'proofMaterial',
label: '证明材料',
width: 120,
},
{
prop: 'remarks',
label: '备注',
width: 120,
},
{
prop: 'score',
label: '积分',
width: 120,
},
{
prop: 'auditStatus',
label: '状态',
width: 120,
},
{
prop: 'auditor',
label: '审核人',
width: 120,
},
{
prop: 'auditDate',
label: '审核日期',
width: 120,
},
],
tableData: [
],
pageInfo: {
pageNo: 1,
pageSize: 10,
totalCount: 2,
},
searchData: {
pageNo: 1,
pageSize: 10,
totalCount: 0,
condition: {}
},
loading: false,
cellStyle: {
'text-align': 'center',
},
formData: {
companyName: '',
employeeCode: '',
employeeName: '',
},
pickerOptions: {
shortcuts: [{
text: '最近一周',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit('pick', [start, end]);
}
}]
},
};
},
methods: {
// 通过
pass(id) {
this.$confirm('此操作将通过该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
}).then(() => {
professionalFeedbackAuditApproval({id:id}).then(res => {
let { code, msg, data } = res;
if (code == 200) {
this.$message({
type: 'success',
message: '操作成功!',
});
this.getData();
}else {
this.$message({
type: 'error',
message: '操作失败!',
});
}
})
}).catch(() => {
})
},
// 驳回
reject(id) {
this.$confirm('此操作将驳回该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
}).then(() => {
professionalFeedbackAuditRejection({id:id}).then(res => {
let { code, msg, data } = res;
if (code == 200) {
this.$message({
type: 'success',
message: '操作成功!',
});
this.getData();
}else {
this.$message({
type: 'error',
message: '操作失败!',
});
}
})
}).catch(() => {})
},
// 格式化日期
dateFormatter(time){
if(!time) return ''
return /\d{4}-\d{1,2}-\d{1,2}/g.exec(time)[0]
},
// 单位转换
unitFomatter(code) {
return this.unitList.find(item => item.value == code).label;
},
// 角色转换
roleFormatter(code) {
return this.roleList.find(item => item.value == code).label;
},
// 层级转换
levelFormatter(code) {
return this.levelList.find(item => item.value == code).label;
},
// 状态转换
statusFormatter(code) {
return this.statusList.find(item => item.value == code).label;
},
downloadProfessionalFeedbackAttachment(filePath) {
let filename = filePath.split('\\')[filePath.split('\\').length - 1];
downloadProfessionalFeedbackAttachment({proofMaterial: filePath}, filename).then(res => {});
},
filenameFormatter(filePath) {
let filename = filePath.split('\\')[filePath.split('\\').length - 1];
let result = ''
filename.split('_').forEach((item, index) => {
if(index !== 0) {
result += item + '_'
}
});
result = result.substring(0, result.length - 1);
return result;
},
// 转义类别
getCategoryCode(code) {
return this.typeList.find(item => item.value == code).label;
},
// 转义定义
getDefineCode(code) {
console.log(code)
return this.defineList.find(item => item.value == code).label;
},
//获取定义
getDefineList() {
getProfessionalFeedbackDefineList({}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.defineList.push({value: item.code, label: item.value});
});
}
});
},
// 获取类别
getTypeList() {
getProfessionalFeedbackCategoryList({}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.typeList.push({value: item.code, label: item.value});
});
}
});
},
// 获取单位
getUnitList() {
getProfessionalFeedbackUnitList({}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.unitList.push({value: item.code, label: item.value});
});
}
})
},
// 获取角色
getRoleList() {
getProfessionalFeedbackRoleList({}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.roleList.push({value: item.code, label: item.value});
})
}
})
},
// 获取层级
getLevelList() {
getProfessionalFeedbackHierarchyList({}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.levelList.push({value: item.code, label: item.value});
})
}
})
},
// 获取状态
getStatusList() {
getDictionary({"type":"professional_status"}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.statusList.push({value: item.code, label: item.value});
})
}
})
},
// 缩放查询条件
toggle() {
this.isToggle = !this.isToggle;
},
// 查询
search() {
this.loading = true;
this.searchData.pageNo = 1;
this.getData()
},
// 清空
clear() {
this.searchData.condition = {}
this.searchData.pageNo = 1;
this.loading = true;
this.getData()
},
// 分页
handleSizeChange(val) {
this.searchData.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.searchData.pageNo = val;
this.getData();
},
// 排序
tableSort(val) {
console.log(val);
},
//获取列表
getData(){
let param = this.searchData;
param.orgCode = JSON.parse(localStorage.getItem('userdata')).orgCode
getProfessionalFeedbackByRoleList(param).then(res => {
console.log(res);
let { code, data, msg } = res
if (code == '200') {
this.tableData = data.list;
this.tableData.forEach((item, index) => {
item.index = ((data.pageNum-1) * data.pageSize) + index + 1;
})
this.pageInfo = {
pageNo: data.pageNum,
pageSize: data.pageSize,
totalCount: data.total
};
this.searchData.totalCount = data.total;
}
});
this.loading = false;
},
// 查看
view(id) {
this.$router.push({
path: '/professional/view',
query: {
id: id,
},
});
},
// 修改
edit(id) {
this.$router.push({
path: '/professional/edit',
query: {
id: id,
},
});
},
// 删除
del(id) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
this.$axios.get(baseUrl + "/qualification/professional/delete", {
params: {
id: id,
},
}).then(res => {
this.$message({
type: 'success',
message: '删除成功!',
});
this.search();
}).catch(err => {
console.log(err);
});
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除',
});
});
},
},
created() {
this.getTypeList();
this.getDefineList();
this.getUnitList();
this.getRoleList();
this.getLevelList();
this.getStatusList();
this.getData();
}
};
</script>
<style lang="scss" scoped>
.home {
margin-left: 2%;
margin-right: 2%;
width: 96%;
}
.task-process {
//width: 100%;
justify-content: space-between;
margin-top: 20px;
padding-bottom: 20px;
padding-left: 15%;
//height: 65px;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
background-color: white;
}
.task-item {
float: left;
flex-direction: column;
align-items: center;
}
.task-icon {
text-align: center;
font-size: 30px;
color: #999;
margin-bottom: 5px;
}
.task-text {
font-size: 14px;
color: #666;
width: 90px;
text-align: center;
}
.line-horizontal {
float: left;
width: 15%;
height: 1px;
background-color: #999;
margin: 20px 0;
position: relative;
}
.line-horizontal::after {
content: "";
position: absolute;
top: -4px;
right: -10px;
border: 5px solid transparent;
border-left-color: #999;
transform: rotate(0deg);
}
.active .task-icon {
color: orangered;
}
.active .task-text {
color: orangered;
}
.circle {
display: inline-block;
width: 24px;
height: 24px;
border-radius: 50%;
background-color: #FFFFFF;
color: #999;
text-align: center;
line-height: 24px;
}
.active .circle {
background-color: orangered;
color: #fff;
}
.page-title {
text-align: center;
padding-top: 20px;
padding-bottom: 20px;
}
.base-info {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.job-application {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-rule {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-item {
padding-bottom: 10px;
}
.el-icon-success {
color: green;
}
.el-icon-error {
color: red;
}
.el-table__header .cell {
color: #324C99;
font-weight: bold;
}
.submit-btn {
margin-top: 10px;
margin-left: 45%;
}
.el-button--primary {
color: #FFF;
background-color: orangered;
border-color: orangered;
}
.el-button--primary.is-plain {
background: #FFF;
color: orangered;
border-color: orangered;
}
::v-deep .el-select-dropdown .el-select-dropdown__item.selected {
color: orangered !important;
}
::v-deep .el-pagination.is-background .el-pager li:not(.disabled).active {
background-color: orangered;
color: #FFF;
}
::v-deep .el-range-editor.is-active, .el-range-editor.is-active:hover, .el-select .el-input.is-focus .el-input__inner {
border-color: orangered;
}
</style>

View File

@@ -0,0 +1,762 @@
<template>
<div class="home">
<!--内容页面-->
<el-card class="base-info">
<!-- 查询条件 -->
<el-card shadow="never" class="s-query" :class="!isToggle?'s-query--is-close':''"
style="position: relative;">
<el-collapse-transition>
<div v-show="isToggle">
<el-form :model="searchData" ref="searchData" label-width="140px" label-position="left"
size="small">
<el-row :gutter="35">
<el-col :span="8">
<el-form-item label="姓名" prop="username">
<el-input v-model.trim="searchData.condition.username" placeholder="请输入" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工号" prop="userNo">
<el-input v-model.trim="searchData.condition.userNo" placeholder="请输入" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="任职资格序列" prop="positionName">
<el-select v-model.trim="searchData.condition.positionName" clearable placeholder="请选择" @change="changeSequence" @clear="clearSequence">
<el-option v-for="item in qualificationInfo.sequence" :label="item.name"
:value="item.name" :key="item.code">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="8">
<el-form-item label="任职资格等级" prop="level">
<el-select v-model.trim="searchData.condition.level" clearable placeholder="请选择">
<el-option v-for="item in qualificationInfo.level" :label="item.name"
:value="item.code" :key="item.code">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="状态" prop="status">
<el-select v-model.trim="searchData.condition.status" clearable placeholder="请选择">
<el-option v-for="item in statusList" :label="item.label"
:value="item.value" :key="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<div class="s-button-group s-button-group--center">
<el-button size="medium" type="primary" class="button-md" @click="search">查询</el-button>
<el-button size="medium" type="primary" plain class="button-md" @click="clear">清空</el-button>
</div>
</el-form>
</div>
</el-collapse-transition>
<div v-if="!isToggle" class="s-query-toggle" @click="toggle"></div>
<div v-else class="s-close-toggle" @click="toggle"><i class="el-icon-arrow-up"></i></div>
</el-card>
<!-- 查询结果 -->
<el-card shadow="never" class="s-table">
<div class="s-table-header">
<div class="s-table-header__title" style="font-size: 14px;"></div>
<div class="s-table-header__btn">
<!-- <el-button type="primary" size="small" plain @click="exportExcel" :loading="exportLoading" :disabled="showDisabled">手动同步</el-button>-->
</div>
</div>
<el-table :data="tableData" ref="doLayout" stripe v-loading="loading" @sort-change="tableSort" :cell-style="cellStyle" >
<template slot="empty"><el-empty :image-size="80"></el-empty></template>
<el-table-column v-if="fixColumns.index" label="序号" :width="fixColumnsWidth.width" prop="index" header-align="center"></el-table-column>
<el-table-column
header-align="center"
v-for="column in dynamicColumns"
:key="column.prop"
:prop="column.prop"
:label="column.label"
:min-width="column.width">
<template slot-scope="scope">
<span v-if="column.prop == 'status'">
<i v-if="scope.row.status == 5" class="el-icon-success"></i>
<i v-else-if="scope.row.status == 6 || scope.row.status == 4" class="el-icon-error"></i>
<i v-else-if="scope.row.status == 0 ||scope.row.status == 1 ||scope.row.status == 2 ||scope.row.status == 3 " class="el-icon-video-play"></i>
{{statusFormatter(scope.row.status)}}
</span>
<span v-else-if="column.prop == 'createdAt'">
{{dateFormatter(scope.row.createdAt)}}
</span>
<span v-else-if="column.prop == 'reviewTime'">
{{dateFormatter(scope.row.reviewTime)}}
</span>
<span v-else-if="column.prop == 'professionalScore'">
{{scope.row.professionalScore}}
<el-tooltip v-if="scope.row.professionalTip !== null && scope.row.professionalTip !==''" class="item" effect="dark" :content="'存在未完成的必选专业回馈:'+scope.row.professionalTip" placement="top-start">
<el-icon class="el-icon-warning" />
</el-tooltip>
</span>
<span v-else>{{scope.row[column.prop]}}</span>
</template>
</el-table-column>
<el-table-column
header-align="center"
align="center"
fixed="right"
width="200"
label="操作">
<template slot-scope="scope">
<!-- <el-button type="text"-->
<!-- icon="el-icon-view" size="mini" @click="view(scope.row.id)">-->
<!-- 查看-->
<!-- </el-button>-->
<!-- <el-button type="text"-->
<!-- icon="el-icon-tickets" size="mini" @click="edit(scope.row.id)">-->
<!-- 查看专业回馈-->
<!-- </el-button>-->
<el-button type="text" v-if="scope.row.status == 2"
size="mini" icon="el-icon-check" @click="pass(scope.row.id)">
通过
</el-button>
<el-button type="text" v-if="scope.row.status == 0 || scope.row.status == 1 || scope.row.status == 2"
size="mini" icon="el-icon-close" @click="reject(scope.row.id)">
驳回
</el-button>
<el-button type="text" v-if="scope.row.status == 3"
size="mini" icon="el-icon-check" @click="showScoreDialog(scope.row)">
线下评审分数录入
</el-button>
<el-button type="text" v-if="scope.row.status == 3"
size="mini" icon="el-icon-close" @click="reject2(scope.row.id)">
驳回
</el-button>
</template>
</el-table-column>
</el-table>
<div class="s-pagination" v-if="pageInfo.totalCount > 0">
<div class="s-pagination__total">显示第<span
class="s-pagination__text">{{(pageInfo.pageNo - 1) * pageInfo.pageSize + 1}}</span>条到第<span
class="s-pagination__text">{{(pageInfo.pageNo - 1) * pageInfo.pageSize + tableData.length}}</span><span
class="s-pagination__text">{{pageInfo.totalCount}}</span>
</div>
<el-pagination class="s-pagination__list" background
:page-size="searchData.pageSize"
:page-sizes="[10, 20, 50, 100]"
:current-page="searchData.pageNo"
layout="sizes, prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="searchData.totalCount">
</el-pagination>
</div>
</el-card>
</el-card>
<el-dialog v-if="showScore" visible center title="线下评审分数录入" top="5vh" width="600px" :show-close="true" :before-close="closeScoreDialog" :close-on-click-modal="false">
<el-form label-width="120px" label-position="left" size="small">
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="姓名" :rules="[{required: true, message: '请填写姓名', trigger: ['blur', 'change']}]">
<el-input v-model.trim="offlineScore.username" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="工号" :rules="[{required: true, message: '请填写工号', trigger: ['blur', 'change']}]">
<el-input v-model.trim="offlineScore.userNo" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="任职资格序列" :rules="[{required: true, message: '请填写任职资格序列', trigger: ['blur', 'change']}]">
<el-input v-model.trim="offlineScore.positionName" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="任职资格等级" :rules="[{required: true, message: '请填写任职资格等级', trigger: ['blur', 'change']}]">
<el-input v-model.trim="offlineScore.qualificationLevel" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="分数" :rules="[{required: true, message: '请填写分数', trigger: ['blur', 'change']}]">
<el-input v-model.trim="offlineScore.score" ></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer">
<el-button size="small" class="button-md" @click="closeScoreDialog" type="primary" plain>取消</el-button>
<el-button size="small" class="button-md" type="primary" @click="submitOfflineScore">确定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {
baseUrl,
getQualificationAuditList,
getDictionary,
qualificationAuditStatus,
getQualificationSequenceList,
} from "@/api/userMG";
export default {
// 注册组件
components: {},
data() {
return {
showScore:false,
offlineScore:{
score:''
},
sequence: '',
level: '',
isToggle: false,
importPermission: false,
exportPermission: false,
exportLoading: false,
showDisabled: false,
messageInfo: '',
fixColumns: {
index: true,
pro_code: true,
company_name: true,
ticket_no: true,
},
fixColumnsWidth: {
index: 60,
pro_code: 120,
company_name: 120,
ticket_no: 120,
},
qualificationInfo:{
sequenceBase:[],
sequence:[
],
level:[
]
},
dynamicColumns: [
{
prop: 'username',
label: '姓名',
width: 120,
},
{
prop: 'userNo',
label: '工号',
width: 120,
},
{
prop: 'positionName',
label: '任职资格序列',
width: 120,
},
{
prop: 'qualificationLevel',
label: '任职资格等级',
width: 120,
},
{
prop: 'status',
label: '状态',
width: 120,
},
{
prop: 'reviewTime',
label: '审核日期',
width: 120,
},
{
prop: 'compulsoryCourseScore',
label: '必修课学分',
width: 120,
},
{
prop: 'electiveCourseScore',
label: '选修课学分',
width: 120,
},
{
prop: 'professionalScore',
label: '专业回馈积分',
width: 120,
},
{
prop: 'offlineScore',
label: '线下评审得分',
width: 120,
},
{
prop: 'createdAt',
label: '申请日期',
width: 120,
},
],
tableData: [
],
pageInfo: {
pageNo: 1,
pageSize: 10,
totalCount: 2,
},
searchData: {
pageNo: 1,
pageSize: 10,
totalCount: 0,
condition: {
},
},
loading: false,
cellStyle: {
'text-align': 'center',
},
formData: {
companyName: '',
employeeCode: '',
employeeName: '',
},
statusList: [],
orgCode: JSON.parse(localStorage.getItem('userdata')).orgCode,
};
},
methods: {
closeScoreDialog(){
this.showScore = false
},
changeSequence(val) {
//清空
this.qualificationInfo.level = []
this.level = ''
let levelList = this.qualificationInfo.sequenceBase.filter(item => item.positionName === val)
levelList.forEach(item => {
this.qualificationInfo.level.push({code:item.qualificationLevel,name:item.qualificationLevel})
})
},
clearSequence() {
this.qualificationInfo.level = []
},
// 获取任职序列列表
getQualificationSequenceList(){
getQualificationSequenceList({orgCode:this.orgCode}).then(res => {
console.log(res);
if (res.code == 200) {
let sequence = [];
this.qualificationInfo.sequenceBase = res.data;
res.data.forEach(item => {
sequence.push(item.positionName);
})
//去重
sequence = Array.from(new Set(sequence));
sequence.forEach(item => {
this.qualificationInfo.sequence.push({code:item,name:item})
})
}
});
},
pass(id) {
this.$confirm('此操作将通过该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
qualificationAuditStatus({id: id,status:"3"}).then(res => {
let { code, msg, data } = res;
if (code == 200) {
this.$message({
type: 'success',
message: '通过成功!',
});
this.search();
}
})
}).catch(() => {
// this.$message({
// type: 'info',
// message: '已取消通过',
// });
});
},
reject(id) {
this.$confirm('此操作将驳回该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
qualificationAuditStatus({id: id,status:"4"}).then(res => {
let { code, msg, data } = res;
if (code == 200) {
this.$message({
type: 'success',
message: '驳回成功!',
});
this.search();
}
})
}).catch(() => {
// this.$message({
// type: 'info',
// message: '已取消驳回',
// });
});
},
showScoreDialog(info){
this.showScore = true
this.offlineScore.username = info.username
this.offlineScore.userNo = info.userNo
this.offlineScore.positionName = info.positionName
this.offlineScore.qualificationLevel = info.qualificationLevel
this.offlineScore.id = info.id
},
submitOfflineScore() {
this.$confirm('请确认线下评分, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
qualificationAuditStatus({id: this.offlineScore.id,offlineScore: this.offlineScore.score}).then(res => {
let { code, msg, data } = res;
if (code == 200) {
this.$message({
type: 'success',
message: '通过成功!',
});
this.search();
}
})
this.showScore = false
this.getData()
}).catch(() => {
// this.$message({
// type: 'info',
// message: '已取消通过',
// });
});
},
reject2(id) {
this.$confirm('此操作将驳回该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
qualificationAuditStatus({id: id,status:"6"}).then(res => {
let { code, msg, data } = res;
if (code == 200) {
this.$message({
type: 'success',
message: '驳回成功!',
});
this.search();
}
})
}).catch(() => {
// this.$message({
// type: 'info',
// message: '已取消驳回',
// });
});
},
getData(){
let param = this.searchData;
param.orgCode = JSON.parse(localStorage.getItem('userdata')).orgCode
getQualificationAuditList(param).then(res => {
console.log(res);
let { code, data } = res
if (code == '200') {
this.tableData = data.list;
this.tableData.forEach((item, index) => {
item.index = ((data.pageNum-1) * data.pageSize) + index + 1;
})
this.pageInfo = {
pageNo: data.pageNum,
pageSize: data.pageSize,
totalCount: data.total
};
this.searchData.totalCount = data.total;
}
});
this.loading = false;
},
// 格式化日期
dateFormatter(time){
if(!time) return ''
return /\d{4}-\d{1,2}-\d{1,2}/g.exec(time)[0]
},
// 状态转换
statusFormatter(code) {
return this.statusList.find(item => item.value == code).label;
},
// 获取状态
getStatusList() {
getDictionary({"type":"application_status"}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.statusList.push({value: item.code, label: item.value});
})
}
})
},
// 缩放查询条件
toggle() {
this.isToggle = !this.isToggle;
},
// 查询
search() {
this.loading = true;
this.searchData.pageNo = 1;
this.getData()
},
// 清空
clear() {
this.searchData.positionName = '';
this.searchData.pageNo = 1;
this.loading = true;
this.getData()
},
// 分页
handleSizeChange(val) {
this.searchData.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.searchData.pageNo = val;
this.getData();
},
// 排序
tableSort(val) {
console.log(val);
},
// 导出
exportExcel() {
this.exportLoading = true;
this.$axios.get(baseUrl + "/qualification/professional/export", {}
).then(res => {
this.exportLoading = false;
console.log(res);
}).catch(err => {
this.exportLoading = false;
console.log(err);
});
},
// 查看
view(id) {
this.$router.push({
path: '/professional/view',
query: {
id: id,
},
});
},
// 修改
edit(id) {
this.$router.push({
path: '/professional/edit',
query: {
id: id,
},
});
},
// 删除
del(id) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
this.$axios.get(baseUrl + "/qualification/professional/delete", {
params: {
id: id,
},
}).then(res => {
this.$message({
type: 'success',
message: '删除成功!',
});
this.search();
}).catch(err => {
console.log(err);
});
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除',
});
});
},
},
created() {
this.getQualificationSequenceList();
this.getStatusList();
this.getData();
}
};
</script>
<style lang="scss" scoped>
.home {
margin-left: 2%;
margin-right: 2%;
width: 96%;
}
.task-process {
//width: 100%;
justify-content: space-between;
margin-top: 20px;
padding-bottom: 20px;
padding-left: 15%;
//height: 65px;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
background-color: white;
}
.task-item {
float: left;
flex-direction: column;
align-items: center;
}
.task-icon {
text-align: center;
font-size: 30px;
color: #999;
margin-bottom: 5px;
}
.task-text {
font-size: 14px;
color: #666;
width: 90px;
text-align: center;
}
.line-horizontal {
float: left;
width: 15%;
height: 1px;
background-color: #999;
margin: 20px 0;
position: relative;
}
.line-horizontal::after {
content: "";
position: absolute;
top: -4px;
right: -10px;
border: 5px solid transparent;
border-left-color: #999;
transform: rotate(0deg);
}
.active .task-icon {
color: orangered;
}
.active .task-text {
color: orangered;
}
.circle {
display: inline-block;
width: 24px;
height: 24px;
border-radius: 50%;
background-color: #FFFFFF;
color: #999;
text-align: center;
line-height: 24px;
}
.active .circle {
background-color: orangered;
color: #fff;
}
.page-title {
text-align: center;
padding-top: 20px;
padding-bottom: 20px;
}
.base-info {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.job-application {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-rule {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-item {
padding-bottom: 10px;
}
.el-icon-success {
color: green;
}
.el-icon-error {
color: red;
}
.el-table__header .cell {
color: #324C99;
font-weight: bold;
}
.submit-btn {
margin-top: 10px;
margin-left: 45%;
}
.el-button--primary {
color: #FFF;
background-color: orangered;
border-color: orangered;
}
.el-button--primary.is-plain {
background: #FFF;
color: orangered;
border-color: orangered;
}
::v-deep .el-select-dropdown .el-select-dropdown__item.selected {
color: orangered !important;
}
::v-deep .el-pagination.is-background .el-pager li:not(.disabled).active {
background-color: orangered;
color: #FFF;
}
::v-deep .el-range-editor.is-active, .el-range-editor.is-active:hover, .el-select .el-input.is-focus .el-input__inner {
border-color: orangered;
}
</style>

View File

@@ -0,0 +1,720 @@
<template>
<div class="home">
<!--内容页面-->
<el-card class="base-info">
<div class="s-title">
任职资格序列及等级
</div>
<!-- 查询条件 -->
<el-card shadow="never" class="s-query" :class="!isToggle?'s-query--is-close':''"
style="position: relative;">
<el-collapse-transition>
<div v-show="isToggle">
<el-form :model="searchData" ref="searchData" label-width="140px" label-position="left"
size="small">
<el-row :gutter="35">
<el-col :span="8">
<el-form-item label="任职资格序列" prop="positionName">
<el-input v-model="searchData.condition.positionName" clearable></el-input>
</el-form-item>
</el-col>
</el-row>
<div class="s-button-group s-button-group--center">
<el-button size="medium" type="primary" class="button-md" @click="search">查询</el-button>
<el-button size="medium" type="primary" plain class="button-md" @click="clear">清空</el-button>
</div>
</el-form>
</div>
</el-collapse-transition>
<div v-if="!isToggle" class="s-query-toggle" @click="toggle"></div>
<div v-else class="s-close-toggle" @click="toggle"><i class="el-icon-arrow-up"></i></div>
</el-card>
<!-- 查询结果 -->
<el-card shadow="never" class="s-table">
<div class="s-table-header">
<div class="s-table-header__title" style="font-size: 14px;"></div>
<div class="s-table-header__btn">
<el-button type="primary" size="small" plain @click="addSetting" :loading="exportLoading" :disabled="showDisabled">新增</el-button>
</div>
</div>
<el-table :data="tableData" ref="doLayout" stripe v-loading="loading" @sort-change="tableSort" :cell-style="cellStyle" >
<template slot="empty"><el-empty :image-size="80"></el-empty></template>
<el-table-column v-if="fixColumns.index" label="序号" :width="fixColumnsWidth.width" prop="index" header-align="center"></el-table-column>
<el-table-column
header-align="center"
v-for="column in dynamicColumns"
:key="column.prop"
:prop="column.prop"
:label="column.label"
:min-width="column.width">
<template slot-scope="scope">
<span v-if="column.prop == 'qualificationCriteria'">
<el-button v-if="scope.row.qualificationLevel === 'L1'" type="text" size="small" @click="downloadStandardFile(scope.row.qualificationCriteria)">
{{filenameFormatter(scope.row.qualificationCriteria)}}
</el-button>
</span>
<span v-else>{{scope.row[column.prop]}}</span>
</template>
</el-table-column>
<el-table-column
header-align="center"
align="center"
fixed="right"
width="300"
label="操作">
<template slot-scope="scope">
<el-button type="text"
icon="el-icon-edit" size="mini" @click="edit(scope.row)">
修改
</el-button>
<el-button type="text"
icon="el-icon-delete" size="mini" @click="deleteAttr(scope.row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<div class="s-pagination" v-if="pageInfo.totalCount > 0">
<div class="s-pagination__total">显示第<span
class="s-pagination__text">{{(pageInfo.pageNo - 1) * pageInfo.pageSize + 1}}</span>条到第<span
class="s-pagination__text">{{(pageInfo.pageNo - 1) * pageInfo.pageSize + tableData.length}}</span><span
class="s-pagination__text">{{pageInfo.totalCount}}</span>
</div>
<el-pagination class="s-pagination__list" background
:page-size="searchData.pageSize"
:page-sizes="[10, 20, 50, 100]"
:current-page="searchData.pageNo"
layout="sizes, prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="searchData.totalCount">
</el-pagination>
</div>
</el-card>
</el-card>
<el-card class="management_info">
<div class="s-title">
任职资格序列管理办法
</div>
<el-upload
class="custom-upload"
:action="uploadUrl()"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
:headers="{authorization:token}"
:accept="'.pdf'"
:limit="1"
:on-exceed="handleExceed"
:file-list="fileList">
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
</el-card>
<!--任职资格序列等级新增弹框-->
<el-dialog v-if="showAddDialog" visible center title="新增任职资格序列" top="5vh" width="600px" :show-close="true" :before-close="closeAddDialog" :close-on-click-modal="false">
<el-form label-width="120px" label-position="left" size="small">
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="任职资格序列" :rules="[{required: true, message: '请填写任职资格序列', trigger: ['blur', 'change']}]">
<el-input v-model.trim="addData.positionName" ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="任职资格等级" :rules="[{required: true, message: '请填写任职资格等级', trigger: ['blur', 'change']}]">
<el-input v-model.trim="addData.qualificationLevel" ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="任职资格标准" :rules="[{required: true, message: '请填写任职资格标准', trigger: ['blur', 'change']}]">
<el-upload
class="custom-demo"
drag
:action="uploadUrl2()"
:on-success="handleSuccess2"
:on-remove="handleRemove2"
:before-remove="beforeRemove2"
:before-upload="beforeUpload2"
:headers="uploadHeaders2()"
:limit="1"
:accept="'.pdf'"
:on-exceed="handleExceed2"
:file-list="fileList2">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
</el-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer">
<el-button size="small" class="button-md" @click="closeAddDialog" type="primary" plain>取消</el-button>
<el-button size="small" class="button-md" type="primary" @click="submitAddAttr">确定</el-button>
</span>
</el-dialog>
<!--任职资格序列等级修改弹框-->
<el-dialog v-if="showEditDialog" visible center title="修改任职资格序列" top="5vh" width="600px" :show-close="true" :before-close="closeAddDialog" :close-on-click-modal="false">
<el-form label-width="120px" label-position="left" size="small">
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="任职资格序列" :rules="[{required: true, message: '请填写任职资格序列', trigger: ['blur', 'change']}]">
<el-input v-model.trim="editData.positionName" ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="任职资格等级" :rules="[{required: true, message: '请填写任职资格等级', trigger: ['blur', 'change']}]">
<el-input v-model.trim="editData.qualificationLevel" ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item label="任职资格标准" :rules="[{required: true, message: '请填写任职资格标准', trigger: ['blur', 'change']}]">
<el-upload
class="custom-demo"
drag
:action="uploadUrl3()"
:on-success="handleSuccess3"
:on-remove="handleRemove3"
:before-remove="beforeRemove3"
:before-upload="beforeUpload3"
:headers="uploadHeaders3()"
:limit="1"
:accept="'.pdf'"
:on-exceed="handleExceed3"
:file-list="fileList3">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
</el-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer">
<el-button size="small" class="button-md" @click="closeEditDialog" type="primary" plain>取消</el-button>
<el-button size="small" class="button-md" type="primary" @click="submitEditAttr">确定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {
addPositionSequenceLevel,
baseUrl,
deletePositionSequenceLevel,
editInternalInformation,
getInternalInformationList,
getQualificationManagementMeasures,
downloadQualificationManagementMeasures,
downloadQualificationStandard,
} from "@/api/userMG";
export default {
// 注册组件
components: {},
data() {
return {
token: localStorage.getItem("logintoken"),
fileList: [],
fileList2: [],
fileList3: [],
sequence: '',
qualificationLevel: '',
isToggle: false,
importPermission: false,
exportPermission: false,
exportLoading: false,
showDisabled: false,
showAddDialog: false,
showEditDialog: false,
addData: {
},
editData: {},
orderCidList: [],
orderCidList2: [],
messageInfo: '',
fixColumns: {
index: true,
pro_code: true,
company_name: true,
ticket_no: true,
},
fixColumnsWidth: {
index: 60,
pro_code: 120,
company_name: 120,
ticket_no: 120,
},
dynamicColumns: [
{
prop: 'positionName',
label: '任职资格序列',
width: 120,
},
{
prop: 'qualificationLevel',
label: '任职资格等级',
width: 120,
},
{
prop: 'qualificationCriteria',
label: '任职资格标准仅L1有效',
width: 120,
},
],
tableData: [
],
pageInfo: {
},
searchData: {
pageNo: 1,
pageSize: 10,
totalCount: 0,
condition: {
positionName: '',
},
},
loading: false,
cellStyle: {
'text-align': 'center',
},
};
},
methods: {
downloadStandardFile(filePath) {
if(filePath === undefined || filePath == null){
return
}
let filename = filePath.split('\\')[filePath.split('\\').length - 1];
downloadQualificationStandard({qualificationCriteria: filePath}, filename).then(res => {});
},
filenameFormatter(filePath) {
if(filePath === undefined || filePath == null){
return ""
}
let filename = filePath.split('\\')[filePath.split('\\').length - 1];
let result = ''
filename.split('_').forEach((item, index) => {
if(index !== 0) {
result += item + '_'
}
});
result = result.substring(0, result.length - 1);
return result;
},
handleRemove3(file, fileList) {
return false;
},
uploadUrl3: function() {
let path = this.editData.positionName + this.editData.qualificationLevel;
return baseUrl+ "/qualifications-service/internal-informations/uploadQualificationStandard/"+ path;
},
beforeUpload3: function(file) {
if(this.editData.qualificationLevel === undefined || this.editData.qualificationLevel === '' ||
this.editData.positionName === undefined || this.editData.positionName === '') {
this.$message.warning("请先填写任职资格序列和任职资格等级");
return false;
}else {
return true;
}
},
uploadHeaders3: function() {
return {Authorization: this.token}
},
handleExceed3(files, fileList) {
this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
beforeRemove3(file, fileList) {
return true;
},
handleSuccess3(response, file, fileList) {
let { code, msg, data } = response;
this.editData.qualificationCriteria =data;
},
handleRemove2(file, fileList) {
return false;
},
uploadUrl2: function() {
let path = this.addData.positionName + this.addData.qualificationLevel;
return baseUrl+ "/qualifications-service/internal-informations/uploadQualificationStandard/"+ path;
},
beforeUpload2: function(file) {
if(this.addData.qualificationLevel === undefined || this.addData.qualificationLevel === '' ||
this.addData.positionName === undefined || this.addData.positionName === '') {
this.$message.warning("请先填写任职资格序列和任职资格等级");
return false;
}else {
return true;
}
},
uploadHeaders2: function() {
return {Authorization: this.token}
},
handleExceed2(files, fileList) {
this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
beforeRemove2(file, fileList) {
return true;
},
handleSuccess2(response, file, fileList) {
let { code, msg, data } = response;
this.addData.qualificationCriteria =data;
},
//获取任职资格序列等级标准列表
getData(){
let param = this.searchData;
param.orgCode = JSON.parse(localStorage.getItem('userdata')).orgCode
getInternalInformationList(param).then(res => {
console.log(res);
let { code, data } = res
if (code == '200') {
this.tableData = data.list;
this.tableData.forEach((item, index) => {
item.index = ((data.pageNum-1) * data.pageSize) + index + 1;
})
this.pageInfo = {
pageNo: data.pageNum,
pageSize: data.pageSize,
totalCount: data.total
};
this.searchData.totalCount = data.total;
}
});
this.loading = false;
},
//获取任职资格管理办法
getQualificationManagementMeasures(){
getQualificationManagementMeasures({}).then(res => {
let { code, data } = res
this.fileList.push({name: "任职资格序列管理办法.pdf", url:data.value});
console.log(this.fileList);
});
},
handleRemove(file, fileList) {
return false;
},
uploadUrl: function() {
return (
baseUrl+ "/qualifications-service/internal-informations/uploadQualificationManagementMeasures"
);
},
handlePreview(file) {
downloadQualificationManagementMeasures({}, file.name).then(res => {
});
},
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
console.log(this.fileList);
},
beforeRemove(file, fileList) {
return true;
},
// 任职资格序列等级弹窗
addSetting() {
this.showAddDialog = true;
},
// 关闭任职资格序列等级弹窗
closeAddDialog() {
this.showAddDialog = false;
this.showEditDialog = false;
},
// 关闭任职资格序列等级弹窗
closeEditDialog() {
this.showAddDialog = false;
this.showEditDialog = false;
},
// 提交任职资格序列等级
submitAddAttr() {
let param = this.addData;
param.orgCode = JSON.parse(localStorage.getItem('userdata')).orgCode
addPositionSequenceLevel(param).then(res => {
let { code, data, msg } = res
if (code == '200') {
this.$message.success(msg)
}else {
this.$message.error(msg)
}
})
this.closeAddDialog();
this.getData();
},
// 提交任职资格序列等级修改
submitEditAttr() {
let param = this.editData;
editInternalInformation(param).then(res => {
let { code, data, msg } = res
if (code == '200') {
this.$message.success(msg)
console.log(this.fileList);
}else {
this.$message.error(msg)
}
})
this.closeEditDialog();
},
// 导入权限弹窗
importPermissionDialog() {
this.importPermission = true;
},
// 导出权限弹窗
exportPermissionDialog() {
this.exportPermission = true;
},
// 缩放查询条件
toggle() {
this.isToggle = !this.isToggle;
},
// 查询
search() {
this.loading = true;
this.searchData.pageNo = 1;
this.getData()
},
// 清空
clear() {
this.searchData.condition = {}
this.searchData.pageNo = 1;
this.loading = true;
this.getData()
},
// 分页
handleSizeChange(val) {
this.searchData.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.searchData.pageNo = val;
this.getData();
},
// 排序
tableSort(val) {
console.log(val);
},
// 导出
exportExcel() {
this.exportLoading = true;
this.$axios.get(baseUrl + "/qualification/professional/export", {}
).then(res => {
this.exportLoading = false;
console.log(res);
}).catch(err => {
this.exportLoading = false;
console.log(err);
});
},
// 编辑
edit(row) {
this.editData = row;
this.showEditDialog=true;
},
// 删除
deleteAttr(row) {
this.$confirm('此操作将删除该任职资格序列等级, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
deletePositionSequenceLevel(row).then(res => {
let { code, data, msg } = res
if (code == '200') {
this.$message.success(msg)
}else {
this.$message.error(msg)
}
})
this.search();
})
}
},
created() {
this.getData();
this.getQualificationManagementMeasures();
}
};
</script>
<style lang="scss" scoped>
.home {
margin-left: 2%;
margin-right: 2%;
width: 96%;
}
.task-process {
//width: 100%;
justify-content: space-between;
margin-top: 20px;
padding-bottom: 20px;
padding-left: 15%;
//height: 65px;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
background-color: white;
}
.task-item {
float: left;
flex-direction: column;
align-items: center;
}
.task-icon {
text-align: center;
font-size: 30px;
color: #999;
margin-bottom: 5px;
}
.task-text {
font-size: 14px;
color: #666;
width: 90px;
text-align: center;
}
.line-horizontal {
float: left;
width: 15%;
height: 1px;
background-color: #999;
margin: 20px 0;
position: relative;
}
.line-horizontal::after {
content: "";
position: absolute;
top: -4px;
right: -10px;
border: 5px solid transparent;
border-left-color: #999;
transform: rotate(0deg);
}
.active .task-icon {
color: orangered;
}
.active .task-text {
color: orangered;
}
.circle {
display: inline-block;
width: 24px;
height: 24px;
border-radius: 50%;
background-color: #FFFFFF;
color: #999;
text-align: center;
line-height: 24px;
}
.active .circle {
background-color: orangered;
color: #fff;
}
.page-title {
text-align: center;
padding-top: 20px;
padding-bottom: 20px;
}
.base-info {
justify-content: space-between;
margin-top: 20px;
//padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.s-title{
padding-top: 0;
margin-bottom: 20px;
font-weight: bold;
font-size: 16px;
}
.management_info {
justify-content: space-between;
margin-top: 20px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.job-application {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-rule {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-item {
padding-bottom: 10px;
}
.el-icon-success {
color: green;
}
.el-icon-error {
color: red;
}
.el-table__header .cell {
color: #324C99;
font-weight: bold;
}
.submit-btn {
margin-top: 10px;
margin-left: 45%;
}
.el-button--primary {
color: #FFF;
background-color: orangered;
border-color: orangered;
}
.el-button--primary.is-plain {
background: #FFF;
color: orangered;
border-color: orangered;
}
//::v-deep .el-upload-list__item:hover .el-icon-close {
// display: none!important;
//}
::v-deep .el-select-dropdown .el-select-dropdown__item.selected {
color: orangered !important;
}
::v-deep .el-pagination.is-background .el-pager li:not(.disabled).active {
background-color: orangered;
color: #FFF;
}
::v-deep .el-range-editor.is-active, .el-range-editor.is-active:hover, .el-select .el-input.is-focus .el-input__inner {
border-color: orangered;
}
</style>

View File

@@ -0,0 +1,470 @@
<template>
<div class="home">
<!--内容页面-->
<el-card class="base-info">
<!-- 查询条件 -->
<el-card shadow="never" class="s-query" :class="!isToggle?'s-query--is-close':''"
style="position: relative;">
<el-collapse-transition>
<div v-show="isToggle">
<el-form :model="searchData" ref="searchData" label-width="140px" label-position="left"
size="small">
<el-row :gutter="35">
<el-col :span="8">
<el-form-item label="任职资格序列" prop="employeeCode">
<el-select v-model.trim="searchData.condition.positionName" clearable placeholder="请选择" @change="changeSequence" @clear="clearSequence">
<el-option v-for="item in qualificationInfo.sequence" :label="item.name"
:value="item.name" :key="item.code">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="任职资格等级" prop="employeeName">
<el-select v-model.trim="searchData.condition.level" clearable placeholder="请选择">
<el-option v-for="item in qualificationInfo.level" :label="item.name"
:value="item.code" :key="item.code">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<div class="s-button-group s-button-group--center">
<el-button size="medium" type="primary" class="button-md" @click="search">查询</el-button>
<el-button size="medium" type="primary" plain class="button-md" @click="clear">清空</el-button>
</div>
</el-form>
</div>
</el-collapse-transition>
<div v-if="!isToggle" class="s-query-toggle" @click="toggle"></div>
<div v-else class="s-close-toggle" @click="toggle"><i class="el-icon-arrow-up"></i></div>
</el-card>
<!-- 查询结果 -->
<el-card shadow="never" class="s-table">
<el-table :data="tableData" ref="doLayout" stripe v-loading="loading" @sort-change="tableSort" :cell-style="cellStyle" >
<template slot="empty"><el-empty :image-size="80"></el-empty></template>
<el-table-column v-if="fixColumns.index" label="序号" :width="fixColumnsWidth.width" prop="index" header-align="center"></el-table-column>
<el-table-column
header-align="center"
v-for="column in dynamicColumns"
:key="column.prop"
:prop="column.prop"
:label="column.label"
:min-width="column.width">
<template slot-scope="scope">
<span v-if="column.prop == 'status'">
<i v-if="scope.row.status == 5" class="el-icon-success"></i>
<i v-else-if="scope.row.status == 6 || scope.row.status == 4" class="el-icon-error"></i>
<i v-else-if="scope.row.status == 0 ||scope.row.status == 1 ||scope.row.status == 2 ||scope.row.status == 3 "
class="el-icon-video-play" ></i>
{{statusFormatter(scope.row.status)}}
</span>
<span v-else-if="column.prop == 'createdAt'">
{{dateFormatter(scope.row.createdAt)}}
</span>
<span v-else-if="column.prop == 'reviewTime'">
{{dateFormatter(scope.row.reviewTime)}}
</span>
<span v-else-if="column.prop == 'professionalScore'">
{{scope.row.professionalScore}}
<el-tooltip v-if="scope.row.professionalTip !== null && scope.row.professionalTip !==''" class="item" effect="dark" :content="'存在未完成的必选专业回馈:'+scope.row.professionalTip" placement="top-start">
<el-icon class="el-icon-warning" />
</el-tooltip>
</span>
<span v-else>{{scope.row[column.prop]}}</span>
</template>
</el-table-column>
</el-table>
<div class="s-pagination" v-if="pageInfo.totalCount > 0">
<div class="s-pagination__total">显示第<span
class="s-pagination__text">{{(pageInfo.pageNo - 1) * pageInfo.pageSize + 1}}</span>条到第<span
class="s-pagination__text">{{(pageInfo.pageNo - 1) * pageInfo.pageSize + tableData.length}}</span><span
class="s-pagination__text">{{pageInfo.totalCount}}</span>
</div>
<el-pagination class="s-pagination__list" background
:page-size="searchData.pageSize"
:page-sizes="[10, 20, 50, 100]"
:current-page="searchData.pageNo"
layout="sizes, prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="searchData.totalCount">
</el-pagination>
</div>
</el-card>
</el-card>
</div>
</template>
<script>
import {
baseUrl, getDeclaredQualificationList, getInternalInformationList, getQualificationSequenceList,
getDictionary,
} from "@/api/userMG";
export default {
// 注册组件
components: {},
data() {
return {
orgCode: JSON.parse(localStorage.getItem('userdata')).orgCode,
qualificationInfo:{
sequenceBase:[],
sequence:[
],
level:[
]
},
isToggle: false,
importPermission: false,
exportPermission: false,
exportLoading: false,
showDisabled: false,
messageInfo: '',
fixColumns: {
index: true,
pro_code: true,
company_name: true,
ticket_no: true,
},
fixColumnsWidth: {
index: 60,
pro_code: 120,
company_name: 120,
ticket_no: 120,
},
dynamicColumns: [
//任职资格序列、任职资格等级、状态、申请日期
{
prop: 'positionName',
label: '任职资格序列',
width: 120,
},
{
prop: 'qualificationLevel',
label: '任职资格等级',
width: 120,
},
{
prop: 'status',
label: '状态',
width: 120,
},
{
prop: 'reviewTime',
label: '审核日期',
width: 120,
},
{
prop: 'compulsoryCourseScore',
label: '必修课学分',
width: 120,
},
{
prop: 'electiveCourseScore',
label: '选修课学分',
width: 120,
},
{
prop: 'professionalScore',
label: '专业回馈积分',
width: 120,
},
{
prop: 'offlineScore',
label: '线下评审得分',
width: 120,
},
{
prop: 'createdAt',
label: '申请日期',
width: 120,
},
],
tableData: [
],
pageInfo: {
pageNo: 1,
pageSize: 10,
totalCount: 2,
},
searchData: {
pageNo: 1,
pageSize: 10,
totalCount: 0,
condition:{},
},
loading: false,
cellStyle: {
'text-align': 'center',
},
statusList: [],
};
},
methods: {
getData(){
let param = this.searchData;
param.orgCode = JSON.parse(localStorage.getItem('userdata')).orgCode
getDeclaredQualificationList(param).then(res => {
console.log(res);
let { code, data } = res
if (code == '200') {
this.tableData = data.list;
this.tableData.forEach((item, index) => {
item.index = ((data.pageNum-1) * data.pageSize) + index + 1;
})
this.pageInfo = {
pageNo: data.pageNum,
pageSize: data.pageSize,
totalCount: data.total
};
this.searchData.totalCount = data.total;
}
});
this.loading = false;
},
// 缩放查询条件
toggle() {
this.isToggle = !this.isToggle;
},
// 查询
search() {
this.loading = true;
this.searchData.pageNo = 1;
this.getData()
},
// 清空
clear() {
this.searchData.positionName = '';
this.searchData.pageNo = 1;
this.loading = true;
this.getData()
},
// 分页
handleSizeChange(val) {
this.searchData.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.searchData.pageNo = val;
this.getData();
},
// 格式化日期
dateFormatter(time){
if(!time) return ''
return /\d{4}-\d{1,2}-\d{1,2}/g.exec(time)[0]
},
// 状态转换
statusFormatter(code) {
return this.statusList.find(item => item.value == code).label;
},
// 获取状态
getStatusList() {
getDictionary({"type":"application_status"}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.statusList.push({value: item.code, label: item.value});
})
}
})
},
// 排序
tableSort(val) {
console.log(val);
},
// 获取任职序列列表
getQualificationSequenceList(){
getQualificationSequenceList({orgCode:this.orgCode}).then(res => {
console.log(res);
if (res.code == 200) {
let sequence = [];
this.qualificationInfo.sequenceBase = res.data;
res.data.forEach(item => {
sequence.push(item.positionName);
})
//去重
sequence = Array.from(new Set(sequence));
sequence.forEach(item => {
this.qualificationInfo.sequence.push({code:item,name:item})
})
}
});
},
changeSequence(val) {
//清空
this.qualificationInfo.level = []
this.level = ''
let levelList = this.qualificationInfo.sequenceBase.filter(item => item.positionName === val)
levelList.forEach(item => {
this.qualificationInfo.level.push({code:item.qualificationLevel,name:item.qualificationLevel})
})
},
clearSequence() {
this.qualificationInfo.level = []
},
},
created() {
this.getStatusList();
this.getQualificationSequenceList()
this.getData();
}
};
</script>
<style lang="scss" scoped>
.home {
margin-left: 2%;
margin-right: 2%;
width: 96%;
}
.task-process {
//width: 100%;
justify-content: space-between;
margin-top: 20px;
padding-bottom: 20px;
padding-left: 15%;
//height: 65px;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
background-color: white;
}
.task-item {
float: left;
flex-direction: column;
align-items: center;
}
.task-icon {
text-align: center;
font-size: 30px;
color: #999;
margin-bottom: 5px;
}
.task-text {
font-size: 14px;
color: #666;
width: 90px;
text-align: center;
}
.line-horizontal {
float: left;
width: 15%;
height: 1px;
background-color: #999;
margin: 20px 0;
position: relative;
}
.line-horizontal::after {
content: "";
position: absolute;
top: -4px;
right: -10px;
border: 5px solid transparent;
border-left-color: #999;
transform: rotate(0deg);
}
.active .task-icon {
color: orangered;
}
.active .task-text {
color: orangered;
}
.circle {
display: inline-block;
width: 24px;
height: 24px;
border-radius: 50%;
background-color: #FFFFFF;
color: #999;
text-align: center;
line-height: 24px;
}
.active .circle {
background-color: orangered;
color: #fff;
}
.page-title {
text-align: center;
padding-top: 20px;
padding-bottom: 20px;
}
.base-info {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.job-application {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-rule {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-item {
padding-bottom: 10px;
}
.el-icon-success {
color: green;
}
.el-icon-error {
color: red;
}
.el-table__header .cell {
color: #324C99;
font-weight: bold;
}
.submit-btn {
margin-top: 10px;
margin-left: 45%;
}
.el-button--primary {
color: #FFF;
background-color: orangered;
border-color: orangered;
}
.el-button--primary.is-plain {
background: #FFF;
color: orangered;
border-color: orangered;
}
::v-deep .el-select-dropdown .el-select-dropdown__item.selected {
color: orangered !important;
}
::v-deep .el-pagination.is-background .el-pager li:not(.disabled).active {
background-color: orangered;
color: #FFF;
}
::v-deep .el-range-editor.is-active, .el-range-editor.is-active:hover, .el-select .el-input.is-focus .el-input__inner {
border-color: orangered;
}
</style>

View File

@@ -0,0 +1,604 @@
<template>
<div class="home">
<!-- 任务进度条 -->
<el-card class="task-process">
<div class="task-item active">
<div class="task-icon">
<span class="circle">1</span>
</div>
<div class="task-text">任职申请</div>
</div>
<div class="line-horizontal"></div>
<div class="task-item active">
<div class="task-icon">
<span class="circle">2</span>
</div>
<div class="task-text">学习考试</div>
</div>
<div class="line-horizontal"></div>
<div class="task-item active">
<div class="task-icon">
<span class="circle">3</span>
</div>
<div class="task-text">专业回馈</div>
</div>
<div class="line-horizontal"></div>
<div class="task-item active" >
<div class="task-icon">
<span class="circle">4</span>
</div>
<div class="task-text">个人行为举证</div>
</div>
</el-card>
<!--内容页面-->
<el-card class="base-info">
<!-- 查询条件 -->
<el-card shadow="never" class="s-query" :class="!isToggle?'s-query--is-close':''"
style="position: relative;">
<el-collapse-transition>
<div v-show="isToggle">
<el-form :model="searchData" ref="searchData" label-width="140px" label-position="left"
size="small">
<el-row :gutter="35">
<el-col :span="8">
<el-form-item label="证据编码" prop="companyName">
<el-input v-model="searchData.condition.evidenceNo" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="证据名称" prop="employeeCode">
<el-input v-model="searchData.condition.evidenceName" clearable></el-input>
</el-form-item>
</el-col>
</el-row>
<div class="s-button-group s-button-group--center">
<el-button size="medium" type="primary" class="button-md" @click="search">查询</el-button>
<el-button size="medium" type="primary" plain class="button-md" @click="clear">清空</el-button>
</div>
</el-form>
</div>
</el-collapse-transition>
<div v-if="!isToggle" class="s-query-toggle" @click="toggle"></div>
<div v-else class="s-close-toggle" @click="toggle"><i class="el-icon-arrow-up"></i></div>
</el-card>
<!-- 查询结果 -->
<el-card shadow="never" class="s-table">
<div class="s-table-header">
<div class="s-table-header__title" style="font-size: 14px;"></div>
<div class="s-table-header__btn">
<el-button type="primary" size="small" plain @click="addProfessional" :loading="exportLoading" :disabled="showDisabled">新增</el-button>
</div>
</div>
<el-table :data="tableData" ref="doLayout" stripe v-loading="loading" @sort-change="tableSort" :cell-style="cellStyle" >
<template slot="empty"><el-empty :image-size="80"></el-empty></template>
<el-table-column v-if="fixColumns.index" label="序号" :width="fixColumnsWidth.width" prop="index" header-align="center"></el-table-column>
<el-table-column
header-align="center"
v-for="column in dynamicColumns"
:key="column.prop"
:prop="column.prop"
:label="column.label"
:min-width="column.width">
<template slot-scope="scope">
<span v-if="column.prop == 'createdAt' ">
{{dateFormatter(scope.row.createdAt)}}
</span>
<span v-else-if="column.prop == 'evidenceAttachment'">
<el-button type="text" size="small" @click="downloadPersonalBehaviorEvidenceAttachment(scope.row.evidenceAttachment)">
{{filenameFormatter(scope.row.evidenceAttachment)}}
</el-button>
</span>
<span v-else>{{scope.row[column.prop]}}</span>
</template>
</el-table-column>
</el-table>
<div class="s-pagination" v-if="pageInfo.totalCount > 0">
<div class="s-pagination__total">显示第<span
class="s-pagination__text">{{(pageInfo.pageNo - 1) * pageInfo.pageSize + 1}}</span>条到第<span
class="s-pagination__text">{{(pageInfo.pageNo - 1) * pageInfo.pageSize + tableData.length}}</span><span
class="s-pagination__text">{{pageInfo.totalCount}}</span>
</div>
<el-pagination class="s-pagination__list" background
:page-size="searchData.pageSize"
:page-sizes="[10, 20, 50, 100]"
:current-page="searchData.pageNo"
layout="sizes, prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="searchData.totalCount">
</el-pagination>
</div>
</el-card>
</el-card>
<!--专业回馈弹窗-->
<el-dialog v-if="showAddDialog" visible center title="新增个人行为举证" top="5vh" width="600px" :show-close="true" :before-close="closeAddDialog" :close-on-click-modal="false">
<el-form :model="addData" ref="addData" label-width="120px" label-position="left" size="small">
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="evidenceNo" label="证据编号" :rules="[{required: true, message: '请填写证据编号', trigger: ['blur', 'change']}]">
<el-input v-model.trim="addData.evidenceNo"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="evidenceName" label="证据名称" :rules="[{required: true, message: '请填写证据名称', trigger: ['blur', 'change']}]">
<el-input v-model.trim="addData.evidenceName"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="evidenceWitness" label="证明人" :rules="[{required: false, message: '请填写证明人', trigger: ['blur', 'change']}]">
<el-input v-model.trim="addData.evidenceWitness"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="evidenceAttachment" label="证据附件" :rules="[{required: true, message: '请填写证据附件', trigger: ['blur', 'change']}]">
<el-upload
class="custom-demo"
drag
:action="uploadUrl()"
:on-success="handleSuccess"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
:headers="uploadHeaders()"
multiple
:limit="1"
:on-exceed="handleExceed"
:file-list="fileList">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="remarks" label="备注" :rules="[{required: false, message: '请填写备注', trigger: ['blur', 'change']}]">
<el-input v-model.trim="addData.remarks"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer">
<el-button size="small" class="button-md" @click="closeAddDialog" type="primary" plain>取消</el-button>
<el-button size="small" class="button-md" type="primary" @click="submitAddAttr">确定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {
addPersonalBehaviorEvidence,
baseUrl,
downloadPersonalBehaviorEvidenceAttachment,
downloadProfessionalFeedbackAttachment,
getPersonalBehaviorEvidenceList,
openPersonalBehaviorEvidenceAttachment,
openProfessionalFeedbackAttachment,
submitProfessionalFeedback,
} from "@/api/userMG";
export default {
// 注册组件
components: {},
data() {
return {
sequence: '',
level: '',
fileList: [],
token: localStorage.getItem("logintoken"),
isToggle: false,
importPermission: false,
exportPermission: false,
exportLoading: false,
showDisabled: false,
messageInfo: '',
fixColumns: {
index: true,
pro_code: true,
company_name: true,
ticket_no: true,
},
fixColumnsWidth: {
index: 60,
pro_code: 120,
company_name: 120,
ticket_no: 120,
},
dynamicColumns: [
{
prop: 'evidenceNo',
label: '证据编码',
width: 120,
},
{
prop: 'evidenceName',
label: '证据名称',
width: 120,
},
{
prop: 'evidenceWitness',
label: '证据证明人',
width: 120,
},
{
prop: 'evidenceAttachment',
label: '证据附件',
width: 120,
},
{
prop: 'remarks',
label: '备注',
width: 120,
},
{
prop: 'createdAt',
label: '上传日期',
width: 120,
},
],
tableData: [
],
pageInfo: {
pageNo: 1,
pageSize: 10,
totalCount: 2,
},
searchData: {
pageNo: 1,
pageSize: 10,
totalCount: 0,
condition:{},
},
loading: false,
cellStyle: {
'text-align': 'center',
},
formData: {
companyName: '',
employeeCode: '',
employeeName: '',
},
addData: {
evidenceNo: '', // 证据编号
evidenceName: '', // 证据名称
evidenceWitness: '', // 证明人
evidenceAttachment: '', // 证据附件,建议用字符串保存上传的文件名或 URL
remarks: '', // 备注
},
showAddDialog: false,
};
},
methods: {
//获取列表
getData(){
let param = this.searchData;
getPersonalBehaviorEvidenceList(param).then(res => {
let { code, data, msg } = res
console.log(data);
if (code == '200') {
this.tableData = data.list;
this.tableData.forEach((item, index) => {
item.index = ((data.pageNum-1) * data.pageSize) + index + 1;
})
this.pageInfo = {
pageNo: data.pageNum,
pageSize: data.pageSize,
totalCount: data.total
};
this.searchData.totalCount = data.total;
}
});
this.loading = false;
},
downloadPersonalBehaviorEvidenceAttachment(filePath) {
let filename = filePath.split('\\')[filePath.split('\\').length - 1];
let fileType = filePath.split('.')[filePath.split('.').length - 1];
if(fileType == 'pdf' || fileType == 'PDF' ||
fileType == 'png' || fileType == 'PNG' ||
fileType == 'jpg' || fileType == 'JPG' ||
fileType == 'jpeg' || fileType == 'JPEG' ||
fileType == 'gif' || fileType == 'GIF'){
openPersonalBehaviorEvidenceAttachment({evidenceAttachment: filePath}, filename, fileType).then(res => {});
}else {
downloadPersonalBehaviorEvidenceAttachment({evidenceAttachment: filePath}, filename).then(res => {
});
}
},
filenameFormatter(filePath) {
let filename = filePath.split('\\')[filePath.split('\\').length - 1];
let result = ''
filename.split('_').forEach((item, index) => {
if(index !== 0) {
result += item + '_'
}
});
result = result.substring(0, result.length - 1);
return result;
},
handleRemove(file, fileList) {
return false;
},
uploadUrl: function() {
console.log(this.token);
return baseUrl+ "/qualifications-service/behavior-evidences/uploadPersonalBehaviorEvidenceAttachment";
},
uploadHeaders: function() {
console.log(this.token);
return {Authorization: this.token}
},
handlePreview(file) {
downloadPersonalBehaviorEvidenceAttachment({}, file.name).then(res => {
});
},
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
beforeRemove(file, fileList) {
return true;
},
handleSuccess(response, file, fileList) {
let { code, msg, data } = response;
this.addData.evidenceAttachment = data;
},
// 格式化日期
dateFormatter(time){
if(!time) return ''
return /\d{4}-\d{1,2}-\d{1,2}/g.exec(time)[0]
},
// 新增专业回馈
addProfessional() {
this.showAddDialog = true;
},
//
// 新增
add() {
this.showAddDialog = true;
},
// 关闭弹窗
closeAddDialog() {
this.showAddDialog = false;
},
// 提交新增
submitAddAttr() {
this.$refs['addData'].validate(valid => {
if (valid) {
let param = this.addData;
param.orgCode = JSON.parse(localStorage.getItem('userdata')).orgCode
addPersonalBehaviorEvidence(param).then(res => {
let {code, data, msg} = res
if (code == '200') {
this.$message.success(msg)
this.addData = {
evidenceNo: '',
evidenceName: '',
evidenceWitness: '',
evidenceAttachment: '',
remarks: ''
}
} else {
this.$message.error(msg)
}
})
this.closeAddDialog();
this.getData();
}
});
},
handleUploadSuccess(response, file) {
// 处理成功上传的文件
this.addData.evidenceAttachment = file.name; // 或者可以保存文件的 URL
console.log("File uploaded successfully:", file.name);
},
resetForm() {
// 重置 addData 对象,以清空表单
this.addData = {
evidenceNo: '',
evidenceName: '',
evidenceWitness: '',
evidenceAttachment: '',
remarks: '',
};
},
// 缩放查询条件
toggle() {
this.isToggle = !this.isToggle;
},
// 查询
search() {
this.loading = true;
this.searchData.pageNo = 1;
this.getData()
},
// 清空
clear() {
this.searchData.condition = {}
this.searchData.pageNo = 1;
this.loading = true;
this.getData()
},
// 分页
handleSizeChange(val) {
this.searchData.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.searchData.pageNo = val;
this.getData();
},
// 排序
tableSort(val) {
console.log(val);
},
},
created() {
this.getData();
}
};
</script>
<style lang="scss" scoped>
.home {
margin-left: 2%;
margin-right: 2%;
width: 96%;
}
.task-process {
//width: 100%;
justify-content: space-between;
margin-top: 20px;
padding-bottom: 20px;
padding-left: 15%;
//height: 65px;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
background-color: white;
}
.task-item {
float: left;
flex-direction: column;
align-items: center;
}
.task-icon {
text-align: center;
font-size: 30px;
color: #999;
margin-bottom: 5px;
}
.task-text {
font-size: 14px;
color: #666;
width: 90px;
text-align: center;
}
.line-horizontal {
float: left;
width: 15%;
height: 1px;
background-color: #999;
margin: 20px 0;
position: relative;
}
.line-horizontal::after {
content: "";
position: absolute;
top: -4px;
right: -10px;
border: 5px solid transparent;
border-left-color: #999;
transform: rotate(0deg);
}
.active .task-icon {
color: orangered;
}
.active .task-text {
color: orangered;
}
.circle {
display: inline-block;
width: 24px;
height: 24px;
border-radius: 50%;
background-color: #FFFFFF;
color: #999;
text-align: center;
line-height: 24px;
}
.active .circle {
background-color: orangered;
color: #fff;
}
.page-title {
text-align: center;
padding-top: 20px;
padding-bottom: 20px;
}
.base-info {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.job-application {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-rule {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-item {
padding-bottom: 10px;
}
.el-icon-success {
color: green;
}
.el-icon-error {
color: red;
}
.el-table__header .cell {
color: #324C99;
font-weight: bold;
}
.submit-btn {
margin-top: 10px;
margin-left: 45%;
}
.el-button--primary {
color: #FFF;
background-color: orangered;
border-color: orangered;
}
.el-button--primary.is-plain {
background: #FFF;
color: orangered;
border-color: orangered;
}
::v-deep .el-select-dropdown .el-select-dropdown__item.selected {
color: orangered !important;
}
::v-deep .el-pagination.is-background .el-pager li:not(.disabled).active {
background-color: orangered;
color: #FFF;
}
::v-deep .el-range-editor.is-active, .el-range-editor.is-active:hover, .el-select .el-input.is-focus .el-input__inner {
border-color: orangered;
}
</style>

View File

@@ -0,0 +1,688 @@
<template>
<div class="home">
<!-- 任务进度条 -->
<el-card class="task-process">
<div class="task-item active">
<div class="task-icon">
<span class="circle">1</span>
</div>
<div class="task-text">任职申请</div>
</div>
<div class="line-horizontal"></div>
<div class="task-item">
<div class="task-icon">
<span class="circle">2</span>
</div>
<div class="task-text">学习考试</div>
</div>
<div class="line-horizontal"></div>
<div class="task-item">
<div class="task-icon">
<span class="circle">3</span>
</div>
<div class="task-text">专业回馈</div>
</div>
<div class="line-horizontal"></div>
<div class="task-item">
<div class="task-icon">
<span class="circle">4</span>
</div>
<div class="task-text">个人行为举证</div>
</div>
</el-card>
<!-- <H2 class="page-title">任职申请</H2>-->
<!-- 任职申请基本信息 -->
<el-card class="base-info">
<div class="s-title">
<i class="el-icon-s-order"></i>
基本信息
</div>
<div >
<div class="application-item" v-for="(item, index) in baseInfoList" :key="index" :style="{float:'left', width:item.width, marginLeft:'90px',marginBottom:'10px'}">
<div style="display: inline-block; width: 30%; vertical-align: top;" >
<label style="color: #000000; margin-right: 20px;border-left: 3px solid orangered;padding-left: 3px;">{{item.label}}</label>
</div>
<div style="display: inline-block; width: 70%;">
<label v-if="item.label !== '专业领域经历' && item.label !== '已获得任职资格序列及等级'" style="color: lightslategray">{{item.value}}</label>
</div>
<!-- 现任职资格薛烈等级表格 -->
<el-table v-if="item.label === '已获得任职资格序列及等级'" :data="sequenceLevel"
:cell-style="{ color: 'lightslategray' }" :header-cell-style="{color: '#000000',fontWeight: 'normal' }" border
style="margin-top:10px;width: 70%;height: 5%;">
<el-table-column prop="sequence" label="任职资格序列" min-width="50%"></el-table-column>
<el-table-column prop="level" label="任职资格等级" min-width="50%"></el-table-column>
<el-table-column prop="startTime" label="获得时间" min-width="50%">
<template #default="scope">
<span v-if="scope.row.status === '7'"></span>
<span v-else>{{scope.row.startTime}}</span>
</template>
</el-table-column>
<el-table-column prop="endTime" label="有效期" min-width="50%">
<template #default="scope">
<span v-if="scope.row.status === '7'"></span>
<span v-else>{{scope.row.endTime}}</span>
</template>
</el-table-column>
<el-table-column prop="status" label="状态" min-width="50%">
<template #default="scope">
<el-tag v-if="scope.row.status === '7'" type="success">初始化</el-tag>
<el-tag v-else-if="scope.row.status !== '7' && scope.row.validTime <=2 " type="success">有效</el-tag>
<el-tag v-else type="danger">失效</el-tag>
</template>
</el-table-column>
</el-table>
<!-- 专业领域经历表格 -->
<el-table v-if="item.label === '专业领域经历'" :data="experience"
:cell-style="{ color: 'lightslategray' }" :header-cell-style="{color: '#000000',fontWeight: 'normal' }" border
style="margin-top:10px;width: 70%;height: 5%;">
<el-table-column prop="time" label="起止时间" min-width="35%"></el-table-column>
<el-table-column prop="orgName" label="单位" min-width="35%"></el-table-column>
<el-table-column prop="positionName" label="岗位" min-width="30%"></el-table-column>
</el-table>
</div>
</div>
</el-card>
<!-- 任职申请申报任职资格序列+等级 -->
<el-card class="job-application">
<div class="s-title">
<i class="el-icon-s-order"></i>
任职申请
</div>
<div class="application-item" style="float:left;width:45%; margin-left:90px">
<label style="color: #000000;margin-right: 20px" >申报任职资格序列</label>
<el-select v-model.trim="sequence" clearable placeholder="请选择" style="width: 40%" @change="changeSequence" @clear="clearSequence">
<el-option v-for="item in qualificationInfo.sequence" :label="item.name"
:value="item.name" :key="item.code">
</el-option>
</el-select>
<el-tooltip class="item" effect="dark" content="点击查看任职资格标准" placement="top-start">
<i class="el-icon-info" style="margin-left: 10px;color: #999; font-size: 25px;" @click="showStandardFile"></i>
</el-tooltip>
</div>
<div class="application-item" style="float:left;width:45%">
<label style="color: #000000; margin-right: 20px">申报任职资格等级</label>
<el-select v-model.trim="level" clearable placeholder="请选择" style="width: 40%" @change="changeLevel" @clear="clearLevel">
<el-option v-for="item in qualificationInfo.level" :label="item.name"
:value="item.code" :key="item.code">
</el-option>
</el-select>
</div>
<!-- <div class="application-item" style="width:90%; margin-left:90px">-->
<!-- <label style="color: #000000; width:40%;margin-right: 20px;">任职资格标准</label>-->
<!-- <div style="background-color:red; display: inline-block; width: 70%;height: 500px;">-->
<!-- <Preview style="height: 50px" :parentUrl="'/qualifications-service/internal-informations/downloadQualificationStandard'"-->
<!-- :params='{"qualificationCriteria":"D:\\upload\\standard\\规划与运营管理L12\\1742532193505_任职资格标准表-党群室人事室-安全与后勤管理.pdf"}'></Preview>-->
<!-- </div>-->
<!-- </div>-->
<div class="application-item" style="width:90%; margin-left:90px">
<label style="color: #000000;margin-right: 70px;float: left">课程清单</label>
<!-- <el-input-->
<!-- type="textarea"-->
<!-- :rows="4"-->
<!-- placeholder="请输入内容"-->
<!-- v-model="courseList"-->
<!-- style="width:74%">-->
<!-- </el-input>-->
<div style="width: 71%; float: left; border: 1px solid #EBEEF5; margin-bottom: 20px" >
<div style="height:300px;overflow:auto">
<el-tree
class="filter-tree"
:data="courseList"
:props="defaultProps"
default-expand-all
ref="tree">
</el-tree>
</div>
</div>
</div>
</el-card>
<!-- 任职申请规则校验 -->
<el-card class="application-rule">
<div class="s-title">
<i class="el-icon-s-order"></i>
申请规则校验情况
</div>
<div style="margin-left:90px">
<div class="application-item" v-for="(item, index) in applicationRule" :key="index" style="margin-left: 10%">
<label style="color: #9BB9F1;">{{item.label}}</label>
<i v-if="item.isPass === '1'" class="el-icon-success"></i>
<i v-if="item.isPass === '0'" class="el-icon-error"></i>
</div>
</div>
</el-card>
<!--提交按钮-->
<el-button class="submit-btn" type="primary" @click="submitApplication" :disabled="submitDisabled">提交申请</el-button>
<!--PDF预览-->
<el-dialog v-if="showStandard" visible center title="任职资格标准预览" top="5vh" width="600px" :show-close="true" :before-close="closeStandardDialog" :close-on-click-modal="false">
<Preview style="height: 500px" :parentUrl="'/qualifications-service/internal-informations/downloadQualificationStandard'"
:params=standardParams>
</Preview>
</el-dialog>
</div>
</template>
<script>
import {
getQualificationSequenceList, queryBasicInformation, submitQualificationApplication,
getPerformanceRuleList, getAppCheck, baseUrl, getCourseList
} from "@/api/userMG";
import {left} from "core-js/internals/array-reduce";
import Preview from "@/views/tools/preview.vue";
import router from "@/router";
export default {
// 注册组件
components: {
Preview
},
data() {
return {
showStandard:false,
baseInfoList: [],
sequenceLevel:[],
experience:[],
orgCode: JSON.parse(localStorage.getItem('userdata')).orgCode,
qualificationInfo:{
sequenceBase:[],
sequence:[
],
level:[
]
},
applicationRule: [
],
sequence:'',
level:'',
preformanceScore:0,
maxSYear:0,
maxLevel:'',
maxLevelYear:0,
performanceRuleDict:{},
submitDisabled:true,
standardParams:{},
currentSequenceUrl:'',
isInit:false,
courseList: [],
projectId: 0,
defaultProps: {
children: 'children',
label: 'label'
}
};
},
methods: {
baseUrl() {
return baseUrl
},
left,
submitApplication() {
// 在这里实现提交逻辑
let params = {
orgCode:this.orgCode,
currentDepartment: "现任职部门",
qualificationStandardsId:this.level,
userNo:JSON.parse(localStorage.getItem('userdata')).userNo,
projectId:this.projectId
}
// 提交任职申请
submitQualificationApplication(params).then(res => {
if (res.code == 200) {
this.$message({
type: "success",
message: "提交成功!"
});
router.push("/qualification/appliedList")
}else {
this.$message.error(res.msg);
}
})
},
changeSequence(val) {
//清空
this.qualificationInfo.level = []
this.level = ''
this.currentSequenceUrl =''
this.courseList = []
this.projectId = 0
let levelList = this.qualificationInfo.sequenceBase.filter(item => item.positionName === val)
levelList.forEach(item => {
this.qualificationInfo.level.push({code:item.id,name:item.qualificationLevel})
if(item.qualificationLevel === 'L1'){
this.currentSequenceUrl = item.qualificationCriteria
}
})
},
clearSequence() {
this.qualificationInfo.level = []
this.currentSequenceUrl =''
this.applicationRule =[]
this.submitDisabled = true
this.courseList = []
this.projectId = 0
},
changeLevel(val) {
let level = this.qualificationInfo.level.find(item => item.code === val).name
let degree = this.baseInfoList.find(item => item.label === '最高学历').value
this.applicationRule = []
let eQualification = this.qualificationInfo.sequenceBase.filter(item => item.id === val)
if(this.isInit){
let sequence = this.sequenceLevel.filter(item => item.sequence === eQualification[0].positionName)
if(sequence === undefined || sequence.length === 0){
this.applicationRule.push( {label:'初始化阶段只能选择初始化任职资格序列及等级',isPass:'0' })
}else {
if(sequence[0].level !== level){
this.applicationRule.push( {label:'初始化阶段只能选择初始化任职资格序列及等级',isPass:'0' })
}else {
this.applicationRule.push( {label:'初始化任职资格序列及等级符合规则',isPass:'1' })
}
}
this.submitDisabled = this.applicationRule.find(item => item.isPass === '0')
}else {
getAppCheck({level:level,degree:degree}).then(res => {
let { code, msg, data } = res;
if (code == 200) {
if(data.jx >= 99){
this.applicationRule.push( {label:'最高学历不符合申报条件',isPass:'0' })
}else {
//绩效规则校验
if (this.preformanceScore < data.jx) {
this.applicationRule.push({label: '近两年绩效未满足要求', isPass: '0'})
} else {
this.applicationRule.push({label: '近两年绩效满足要求', isPass: '1'})
}
//跨级申报
if(level.substr(1) - this.maxLevel <=1 ){
console.log(level.substr(1) - this.maxLevel)
//现任职资格校验
if(this.maxLevel < level.substr(1)){
if (this.maxLevelYear < data.pYear) {
this.applicationRule.push({label: '现任职资格等级停留年份不足', isPass: '0'})
}else {
this.applicationRule.push({label: '现任职资格等级停留年份满足要求', isPass: '1'})
}
}else {
this.applicationRule.push({label: '允许申报低等级或同等级序列', isPass: '1'})
}
this.applicationRule.push({label: '申请序列等级符合规则', isPass: '1'})
} else {
this.applicationRule.push({label: '申请序列等级不允许跨等级申报', isPass: '0'})
}
//专业年限
if (this.maxSYear < data.sYear) {
this.applicationRule.push({label: '专业年限不足', isPass: '0'})
}else {
this.applicationRule.push({label: '专业年限满足要求', isPass: '1'})
}
}
}else{
this.applicationRule =[]
this.applicationRule.push({label: '获取任职资格审核规则失败,请联系管理员', isPass: '0'})
}
this.submitDisabled = this.applicationRule.find(item => item.isPass === '0')
})
}
//获取课程清单
let projectName = eQualification[0].positionName+'-'+eQualification[0].qualificationLevel
getCourseList({"projectName": projectName}).then(res => {
let { code, msg, data } = res;
if (code == 200) {
console.log(data)
let courseList = []
if(data !== undefined && data !== null && data.tasks !== undefined && data.tasks !== null){
for (let i = 0; i < data.tasks.length; i++) {
let courseItem = {}
let item = data.tasks[i]
courseItem.label = item.name
courseItem.children = []
if(item.kngs !==undefined && item.kngs !== null){
for (let j = 0; j < item.kngs.length; j++) {
let kng = item.kngs[j]
let kngLabel = kng.kngTitle
courseItem.children.push({label:kngLabel})
}
}
courseList.push(courseItem)
}
this.projectId = data.projectId
}else {
courseList.push({label:'暂无课程信息'})
}
this.courseList = [{label:projectName,children:courseList}]
}else{
this.$message.error(res.msg);
}
})
},
clearLevel() {
this.applicationRule =[]
this.submitDisabled = true
this.courseList = []
this.projectId = 0
},
// 获取任职序列列表
getQualificationSequenceList(){
getQualificationSequenceList({orgCode:this.orgCode}).then(res => {
console.log(res);
if (res.code == 200) {
let sequence = [];
this.qualificationInfo.sequenceBase = res.data;
res.data.forEach(item => {
sequence.push(item.positionName);
})
//去重
sequence = Array.from(new Set(sequence));
sequence.forEach(item => {
this.qualificationInfo.sequence.push({code:item,name:item})
})
}
});
},
// 获取绩效规则
getPerformanceRuleList(){
let params = {}
getPerformanceRuleList(params).then(res => {
let { code, msg, data } = res;
if (code == 200) {
for (let i = 0; i < data.length; i++) {
this.performanceRuleDict[data[i].jxName] = data[i].score
}
}
})
},
dealInfo(res){
let keys= ['userName', 'curDepartment', 'curPosition', 'highestDegree', 'major', 'startWorkTime', 'joinTime', 'performance']
let labels= ['姓名', '现任部门', '现任岗位', '最高学历', '所学专业', '参加工作时间', '加入中心时间', '近两年绩效']
let { code, msg, data } = res;
if (code == 200) {
this.baseInfoList = []
for (let i = 0; i < keys.length; i++) {
let item = {}
item.width = '40%'
item.label = labels[i]
item.value = data[keys[i]]
this.baseInfoList.push(item)
}
//绩效积分计算
this.calculatePerformance(data.performanceList)
// 已获得任职资格序列及等级
let nowDate = new Date((new Date).getTime() + 8*60*60*1000);
let nowDateStr = nowDate.toJSON().split('T').join(' ').substr(0,19);
let earliestLevelTime = nowDateStr
let maxLevel = '1'
this.baseInfoList.push({label:'已获得任职资格序列及等级',value:'已获得任职资格序列及等级', width:'90%' })
data.sequenceLevel.forEach(item => {
this.sequenceLevel.push({sequence:item.sequence,level:item.level, startTime:item.startTime, endTime: item.endTime, status: item.status, validTime: item.validTime})
if(item.status === '7'){
this.isInit = true;
}
if(item.level.substr(1) >= maxLevel){
if(maxLevel != item.level.substr(1)){
earliestLevelTime = item.time
}else {
if(item.time < earliestLevelTime){
earliestLevelTime = item.time
}
}
maxLevel = item.level.substr(1)
}
});
// 专业领域经历
this.baseInfoList.push({label:'专业领域经历',value:'专业领域经历', width:'90%' })
let earliest =nowDateStr
data.experience.forEach(item => {
this.experience.push({time:item.startDate+'至'+item.endDate,orgName:item.orgName,positionName:item.positionName})
if(earliest > item.startDate){
earliest = item.startDate
}
});
//专业年限年数
this.maxSYear = this.calculateDiff(earliest, nowDateStr)
//最高任职资格等级停留年份
this.maxLevelYear = this.calculateDiff(earliestLevelTime, nowDateStr)
//最高的任职资格等级
this.maxLevel = maxLevel
}
},
//获取员工基本信息
getEmployeeBaseInfo(){
let userNo = JSON.parse(localStorage.getItem('userdata')).userNo
if(userNo === '8888888'){
let res = {"code":"200","msg":"获取任职申请基本信息成功!","data":{"userName":"admin","curDepartment":"无","curPosition":"无","curDeptTime":"无","highestDegree":"大学本科","major":"无","startWorkTime":"2013/07","joinTime":"2024/01/10","performance":"无","qualification":null,"sequenceLevel":[{"sequence":"其他","level":"L3","time":"2022-01-31"}],"experience":[{"startDate":"2024/01/10","endDate":"","orgName":"东风人事共享服务中心","positionName":""}],"performanceList":[{"performanceYear":"","performanceSelf":"C"},{"performanceYear":"","performanceSelf":"C"}]}}
this.dealInfo(res)
}else {
queryBasicInformation({}).then(res => {
this.dealInfo(res)
});
}
},
//计算两个时间相差的年数
calculateDiff(startDateStr, endDateStr){
const startDate = new Date(startDateStr);
const endDate = new Date(endDateStr);
const diffInMilliseconds = endDate - startDate;
const daysInMonth = (year, month) => {
const date = new Date(year, month, 0);
return date.getDate();
};
let diffInDays = Math.floor(diffInMilliseconds / (1000 * 60 * 60 * 24));
let years = 0, months = 0, days = 0;
while (diffInDays >= 365) {
const isLeapYear = (startDate.getFullYear() % 4 === 0 && startDate.getFullYear() % 100 !== 0) || startDate.getFullYear() % 400 === 0;
const daysInYear = isLeapYear ? 366 : 365;
if (diffInDays >= daysInYear) {
years++;
diffInDays -= daysInYear;
startDate.setFullYear(startDate.getFullYear() + 1);
} else {
break;
}
}
while (diffInDays >= daysInMonth(startDate.getFullYear(), startDate.getMonth())) {
months++;
diffInDays -= daysInMonth(startDate.getFullYear(), startDate.getMonth());
startDate.setMonth(startDate.getMonth() + 1);
}
days = diffInDays;
// const formatDiff = (years, months, days) => {
// return `${years}年${months}个月${days}天`;
// };
//
// return formatDiff(years, months, days);
return years
},
//计算绩效点数
calculatePerformance(performanceList){
this.preformanceScore = 0
if(performanceList ===undefined || performanceList.length === 0){
this.preformanceScore = 6
return
}else if(performanceList.length === 1){
this.preformanceScore = 3
}
performanceList.forEach(item => {
let performance = this.performanceRuleDict[item.performanceSelf]
if(performance === undefined){
this.preformanceScore += 3
}else {
this.preformanceScore += performance
}
})
console.log(this.preformanceScore)
},
showStandardFile() {
if(this.currentSequenceUrl ===''){
this.$message.warning('请先选择任职资格序列')
return
}
this.standardParams = {"qualificationCriteria":this.currentSequenceUrl}
this.showStandard = true
},
closeStandardDialog(){
this.showStandard = false
},
},
created() {
this.getPerformanceRuleList()
this.getQualificationSequenceList()
this.getEmployeeBaseInfo()
}
};
</script>
<style lang="scss" scoped>
.home {
margin-left: 2%;
margin-right: 2%;
width: 96%;
//height: 1800px;
}
.task-process {
//width: 100%;
//display: flex;
justify-content: space-between;
margin-top: 20px;
padding-bottom: 20px;
padding-left: 15%;
//height: 65px;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
background-color: white;
}
.task-item {
float: left;
//display: flex;
flex-direction: column;
align-items: center;
}
.task-icon {
text-align: center;
font-size: 30px;
color: #999;
margin-bottom: 5px;
}
.circle {
display: inline-block;
width: 24px;
height: 24px;
border-radius: 50%;
background-color: #FFFFFF;
color: #999;
text-align: center;
line-height: 24px;
}
.active .circle {
background-color: orangered;
color: #fff;
}
.task-text {
font-size: 14px;
color: #666;
width: 90px;
text-align: center;
}
.active .task-icon {
color: orangered;
}
.active .task-text {
color: orangered;
}
.line-horizontal {
float: left;
width: 15%;
height: 1px;
background-color: #999;
margin: 20px 0;
position: relative;
}
.line-horizontal::after {
content: "";
position: absolute;
top: -4px;
right: -10px;
border: 5px solid transparent;
border-left-color: #999;
transform: rotate(0deg);
}
.base-info{
display: flex;
justify-content: space-between;
margin-top: 20px;
//padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.s-title{
padding-top: 0;
margin-bottom: 20px;
font-weight: bold;
font-size: 16px;
}
.job-application{
//display: flex;
justify-content: space-between;
margin-top: 20px;
//padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-rule {
justify-content: space-between;
margin-top: 20px;
//padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.el-icon-success{
color: green;
}
.el-icon-error{
color: red;
}
.application-item{
padding-bottom: 10px;
}
.el-table__header .cell{
color: #000000;
font-weight: bold;
}
.el-button--primary.is-disabled{
cursor: not-allowed;
background-color: indianred;
border-color: indianred;
}
.submit-btn{
margin-top: 10px;
margin-left: 45%;
background-color: orangered;
border-color: orangered;
}
.submit-btn:not(.is-disabled):hover{
cursor: pointer;
}
.el-button--primary {
color: #FFF;
background-color: orangered;
border-color: orangered;
}
.el-button--primary.is-plain {
background: #FFF;
color: orangered;
border-color: orangered;
}
::v-deep .el-select-dropdown .el-select-dropdown__item.selected {
color: orangered !important;
}
</style>

View File

@@ -0,0 +1,962 @@
<template>
<div class="home">
<!-- 任务进度条 -->
<el-card class="task-process">
<div class="task-item active">
<div class="task-icon">
<span class="circle">1</span>
</div>
<div class="task-text">任职申请</div>
</div>
<div class="line-horizontal"></div>
<div class="task-item active">
<div class="task-icon">
<span class="circle">2</span>
</div>
<div class="task-text">学习考试</div>
</div>
<div class="line-horizontal"></div>
<div class="task-item active">
<div class="task-icon">
<span class="circle">3</span>
</div>
<div class="task-text">专业回馈</div>
</div>
<div class="line-horizontal"></div>
<div class="task-item" >
<div class="task-icon">
<span class="circle">4</span>
</div>
<div class="task-text">个人行为举证</div>
</div>
</el-card>
<!--内容页面-->
<el-card class="base-info">
<!-- 查询条件 -->
<el-card shadow="never" class="s-query" :class="!isToggle?'s-query--is-close':''"
style="position: relative;">
<el-collapse-transition>
<div v-show="isToggle">
<el-form :model="searchData" ref="searchData" label-width="140px" label-position="left"
size="small">
<el-row :gutter="35">
<el-col :span="8">
<el-form-item label="类别" prop="categoryCode">
<el-select v-model="searchData.condition.categoryCode" placeholder="请选择" style="width: 100%;" >
<el-option
v-for="item in typeList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="定义" prop="defineCode">
<el-select v-model="searchData.condition.defineCode" placeholder="请选择" style="width: 100%;" >
<el-option
v-for="item in defineList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="任务名" prop="employeeCode">
<el-input v-model="searchData.condition.specificTask" clearable></el-input>
</el-form-item>
</el-col>
</el-row>
<div class="s-button-group s-button-group--center">
<el-button size="medium" type="primary" class="button-md" @click="search">查询</el-button>
<el-button size="medium" type="primary" plain class="button-md" @click="clear">清空</el-button>
</div>
</el-form>
</div>
</el-collapse-transition>
<div v-if="!isToggle" class="s-query-toggle" @click="toggle"></div>
<div v-else class="s-close-toggle" @click="toggle"><i class="el-icon-arrow-up"></i></div>
</el-card>
<!-- 查询结果 -->
<el-card shadow="never" class="s-table">
<div class="s-table-header">
<div class="s-table-header__title" style="font-size: 14px;"></div>
<div class="s-table-header__btn">
<el-button type="primary" size="small" plain @click="addProfessional" :loading="exportLoading" :disabled="showDisabled">新增</el-button>
</div>
</div>
<el-table :data="tableData" ref="doLayout" stripe v-loading="loading" @sort-change="tableSort" :cell-style="cellStyle" >
<template slot="empty"><el-empty :image-size="80"></el-empty></template>
<el-table-column v-if="fixColumns.index" label="序号" :width="fixColumnsWidth.width" prop="index" header-align="center"></el-table-column>
<el-table-column
header-align="center"
v-for="column in dynamicColumns"
:key="column.prop"
:prop="column.prop"
:label="column.label"
:min-width="column.width">
<template slot-scope="scope">
<span v-if="column.prop == 'categoryCode'">
{{getCategoryCode(scope.row.categoryCode)}}
</span>
<span v-else-if="column.prop == 'defineCode'">
{{getDefineCode(scope.row.categoryCode)}}
</span>
<span v-else-if="column.prop == 'startTime'">
{{dateFormatter(scope.row.startTime)}}
</span>
<span v-else-if="column.prop == 'endTime' ">
{{dateFormatter(scope.row.endTime)}}
</span>
<span v-else-if="column.prop == 'auditDate'">
{{dateFormatter(scope.row.auditDate)}}
</span>
<span v-else-if="column.prop == 'number'">
<!-- {{scope.row.number + unitFomatter(scope.row.unitCode)}}-->
{{scope.row.number}}
</span>
<span v-else-if="column.prop == 'roleCode'">
{{roleFormatter(scope.row.roleCode)}}
</span>
<span v-else-if="column.prop == 'levelCode'">
{{levelFormatter(scope.row.levelCode)}}
</span>
<span v-else-if="column.prop == 'auditStatus'">
{{statusFormatter(scope.row.auditStatus)}}
</span>
<span v-else-if="column.prop == 'proofMaterial'">
<el-button type="text" size="small" @click="downloadProfessionalFeedbackAttachment(scope.row.proofMaterial)">
{{filenameFormatter(scope.row.proofMaterial)}}
</el-button>
</span>
<span v-else-if="column.prop == 'score'">
{{scoreFormatter(scope.row)}}
</span>
<span v-else>{{scope.row[column.prop]}}</span>
</template>
</el-table-column>
</el-table>
<div class="s-pagination" v-if="pageInfo.totalCount > 0">
<div class="s-pagination__total">显示第<span
class="s-pagination__text">{{(pageInfo.pageNo - 1) * pageInfo.pageSize + 1}}</span>条到第<span
class="s-pagination__text">{{(pageInfo.pageNo - 1) * pageInfo.pageSize + tableData.length}}</span><span
class="s-pagination__text">{{pageInfo.totalCount}}</span>
</div>
<el-pagination class="s-pagination__list" background
:page-size="searchData.pageSize"
:page-sizes="[10, 20, 50, 100]"
:current-page="searchData.pageNo"
layout="sizes, prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="searchData.totalCount">
</el-pagination>
</div>
</el-card>
</el-card>
<!--专业回馈弹窗-->
<el-dialog v-if="showAddDialog" visible center title="新增专业回馈" top="5vh" width="600px" :show-close="true" :before-close="closeAddDialog" :close-on-click-modal="false">
<el-form :model="addData" ref="addData" label-width="120px" label-position="left" size="small">
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="categoryCode" label="类别" :rules="[{required: true, message: '请填写类别', trigger: ['blur', 'change']}]">
<el-select style="width:100%;" v-model.trim="addData.categoryCode" clearable placeholder="请选择" @change="categoryChange" >
<el-option v-for="item in categoryList" :label="item.label"
:value="item.value" :key="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="defineCode" label="定义" :rules="[{required: true, message: '请填写定义', trigger: ['blur', 'change']}]">
<el-select style="width:100%;" v-model.trim="addData.defineCode" clearable placeholder="请选择" @change="defineChange" >
<el-option v-for="item in needDefineList" :label="item.label"
:value="item.value" :key="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="specificTask" label="具体任务" :rules="[{required: true, message: '请填写具体任务', trigger: ['blur', 'change']}]">
<el-input v-model.trim="addData.specificTask" ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="time" label="时间段" :rules="[{required: true, message: '请填写时间段', trigger: ['blur', 'change']}]">
<el-date-picker
v-model="addData.time"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
:picker-options="pickerOptions"
value-format="yyyy-MM-dd"
:clearable="false"
:disabled="false"
>
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<!-- <el-row :gutter="35">-->
<!-- <el-col :span="20">-->
<!-- <el-form-item label="数量" :rules="[{required: true, message: '请填写数量', trigger: ['blur', 'change']}]">-->
<!-- <el-input-number v-model="addData.number" :min="1" :max="10" label="描述文字" ></el-input-number>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="initiatingDepartment" label="任务发起单位" :rules="[{required: true, message: '请填写任务发起单位', trigger: ['blur', 'change']}]">
<el-input v-model.trim="addData.initiatingDepartment" ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="roleCode" label="担当角色" :rules="[{required: true, message: '请填写担当角色', trigger: ['blur', 'change']}]">
<el-select style="width:100%;" v-model.trim="addData.roleCode" clearable placeholder="请选择" >
<el-option v-for="item in needRoleList" :label="item.roleName"
:value="item.roleCode" :key="item.roleCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="levelCode" label="层级" :rules="[{required: true, message: '请填写层级', trigger: ['blur', 'change']}]">
<el-select style="width:100%;" v-model.trim="addData.levelCode" clearable placeholder="请选择" >
<el-option v-for="item in needLevelList" :label="item.levelName"
:value="item.levelCode" :key="item.levelCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="proofMaterial" label="证明材料" :rules="[{required: true, message: '请填写证明材料', trigger: ['blur', 'change']}]">
<el-upload
class="custom-demo"
drag
:action="uploadUrl()"
:on-success="handleSuccess"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
:headers="uploadHeaders()"
multiple
:limit="1"
:on-exceed="handleExceed"
:file-list="fileList">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="35">
<el-col :span="20">
<el-form-item prop="remarks" label="备注" :rules="[{required: false, message: '请填写备注', trigger: ['blur', 'change']}]">
<el-input v-model.trim="addData.remarks" ></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer">
<el-button size="small" class="button-md" @click="closeAddDialog" type="primary" plain>取消</el-button>
<el-button size="small" class="button-md" type="primary" @click="submitAddAttr">确定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {
baseUrl,
getProfessionalFeedbackCategoryList,
getProfessionalFeedbackDefineList,
getProfessionalFeedbackCategoryStruct,
getProfessionalFeedbackRoleList,
getProfessionalFeedbackHierarchyList,
getProfessionalFeedbackUnitList,
getInternalInformationList,
getProfessionalFeedbackList,
addPositionSequenceLevel,
submitProfessionalFeedback,
getDictionary,
downloadQualificationManagementMeasures,
downloadProfessionalFeedbackAttachment, openProfessionalFeedbackAttachment
} from "@/api/userMG";
export default {
// 注册组件
components: {},
data() {
return {
sequence: '',
level: '',
isToggle: false,
importPermission: false,
exportPermission: false,
exportLoading: false,
showDisabled: false,
showAddDialog: false,
addData: {
categoryCode: '',
defineCode: '',
specificTask: '',
time: '',
startTime: '',
endTime: '',
number: '',
unitCode: '',
initiatingDepartment: '',
roleCode: '',
levelCode: '',
proofMaterial: '',
remarks: '',
},
typeList: [
],
categoryList: [
],
needDefineList:[],
needRoleList:[],
needLevelList:[],
defineList:[
],
roleList: [
],
levelList: [
],
unitList: [
],
fileList: [],
token: localStorage.getItem("logintoken"),
statusList: [],
orderCidList: [],
orderCidList2: [],
messageInfo: '',
fixColumns: {
index: true,
pro_code: true,
company_name: true,
ticket_no: true,
},
fixColumnsWidth: {
index: 60,
pro_code: 120,
company_name: 120,
ticket_no: 120,
},
dynamicColumns: [
{
prop: 'categoryCode',
label: '类别',
width: 120,
},
{
prop: 'defineCode',
label: '定义',
width: 120,
},
{
prop: 'specificTask',
label: '具体任务',
width: 120,
},
{
prop: 'startTime',
label: '开始时间',
width: 120,
},
{
prop: 'endTime',
label: '结束时间',
width: 120,
},
// {
// prop: 'number',
// label: '数量',
// width: 120,
// },
{
prop: 'initiatingDepartment',
label: '任务发起单位',
width: 120,
},
{
prop: 'roleCode',
label: '担当角色',
width: 120,
},
{
prop: 'levelCode',
label: '层级',
width: 120,
},
{
prop: 'proofMaterial',
label: '证明材料',
width: 120,
},
{
prop: 'remarks',
label: '备注',
width: 120,
},
{
prop: 'score',
label: '积分',
width: 120,
},
{
prop: 'auditStatus',
label: '状态',
width: 120,
},
{
prop: 'auditor',
label: '审核人',
width: 120,
},
{
prop: 'auditDate',
label: '审核日期',
width: 120,
},
],
tableData: [
],
pageInfo: {
pageNo: 1,
pageSize: 10,
totalCount: 2,
},
searchData: {
pageNo: 1,
pageSize: 10,
totalCount: 0,
condition:{},
},
loading: false,
cellStyle: {
'text-align': 'center',
},
pickerOptions: {
shortcuts: [{
text: '最近一周',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit('pick', [start, end]);
}
}]
},
};
},
methods: {
categoryChange(val) {
let type = this.categoryList.find(item => item.value === val);
if(type == null || type == undefined){
this.needDefineList = []
this.needRoleList = []
this.needLevelList = []
}else{
this.needDefineList = type.defineList
}
},
defineChange(val){
let define = this.needDefineList.find(item => item.value === val);
if(define == null || define == undefined){
this.needRoleList = []
this.needLevelList = []
}else{
this.needRoleList = define.roles;
this.needLevelList = define.levels;
}
},
downloadProfessionalFeedbackAttachment(filePath) {
let filename = filePath.split('\\')[filePath.split('\\').length - 1];
let fileType = filePath.split('.')[filePath.split('.').length - 1];
if(fileType == 'pdf' || fileType == 'PDF' ||
fileType == 'png' || fileType == 'PNG' ||
fileType == 'jpg' || fileType == 'JPG' ||
fileType == 'jpeg' || fileType == 'JPEG' ||
fileType == 'gif' || fileType == 'GIF' ||
fileType == 'mp4' || fileType == 'MP4' ||
fileType == 'mp3' || fileType == 'MP3' ||
fileType == 'avi' || fileType == 'AVI' ||
fileType == 'wmv' || fileType == 'WMV' ||
fileType == 'rmvb' || fileType == 'RMVB' ||
fileType == 'rm' || fileType == 'RM' ){
openProfessionalFeedbackAttachment({proofMaterial: filePath}, filename, fileType).then(res => {});
}else{
downloadProfessionalFeedbackAttachment({proofMaterial: filePath}, filename).then(res => {});
}
},
filenameFormatter(filePath) {
let filename = filePath.split('\\')[filePath.split('\\').length - 1];
let result = ''
filename.split('_').forEach((item, index) => {
if(index !== 0) {
result += item + '_'
}
});
result = result.substring(0, result.length - 1);
return result;
},
scoreFormatter(val) {
if(val.auditStatus == '1'){
return val.score
}else{
return ''
}
},
handleRemove(file, fileList) {
return false;
},
uploadUrl: function() {
return baseUrl+ "/qualifications-service/professional-feedbacks/uploadProfessionalFeedbackAttachment";
},
uploadHeaders: function() {
return {Authorization: this.token}
},
handlePreview(file) {
downloadProfessionalFeedbackAttachment({}, file.name).then(res => {
});
},
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
beforeRemove(file, fileList) {
return true;
},
handleSuccess(response, file, fileList) {
let { code, msg, data } = response;
this.addData.proofMaterial = data;
},
// 专业回馈弹窗
addProfessional() {
this.showAddDialog = true;
},
//获取类别结构
getCategoryStruct() {
getProfessionalFeedbackCategoryStruct({}).then(res => {
let {code, msg, data} = res;
if (res.code == 200) {
data.forEach(item => {
let temp = this.categoryList.filter(i => i.value == item.categoryCode);
if (temp.length == 0) {
this.categoryList.push({
value: item.categoryCode,
label: item.categoryName,
defineList: [{value: item.defineCode, label: item.defineName, roles: item.roleList, levels: item.levelList}]
});
} else {
temp[0].defineList.push({value: item.defineCode, label: item.defineName, roles: item.roleList, levels: item.levelList});
}
});
}
});
},
// 关闭专业回馈弹窗
closeAddDialog() {
this.showAddDialog = false;
},
// 自动填充姓名
autoFillUserNameAddDialog() {
if (this.addData.employeeCode) {
this.$axios.get(baseUrl + "/qualification/professional/autoFillUserName", {
params: {
employeeCode: this.addData.employeeCode,
}
}).then(res => {
this.addData.employeeName = res.data.data.employeeName;
}).catch(err => {
console.log(err);
});
}
},
// 格式化日期
dateFormatter(time){
if(!time) return ''
return /\d{4}-\d{1,2}-\d{1,2}/g.exec(time)[0]
},
// 单位转换
unitFomatter(code) {
return this.unitList.find(item => item.value == code).label;
},
// 角色转换
roleFormatter(code) {
return this.roleList.find(item => item.value == code).label;
},
// 层级转换
levelFormatter(code) {
return this.levelList.find(item => item.value == code).label;
},
// 状态转换
statusFormatter(code) {
return this.statusList.find(item => item.value == code).label;
},
// 转义类别
getCategoryCode(code) {
return this.typeList.find(item => item.value == code).label;
},
// 转义定义
getDefineCode(code) {
return this.defineList.find(item => item.value == code).label;
},
// 获取类别
getTypeList() {
getProfessionalFeedbackCategoryList({}).then(res => {
let {code, msg, data} = res;
if (res.code == 200) {
data.forEach(item => {
this.typeList.push({value: item.code, label: item.value});
});
}
});
},
//获取定义
getDefineList() {
getProfessionalFeedbackDefineList({}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.defineList.push({value: item.code, label: item.value});
});
}
});
},
// 获取单位
getUnitList() {
getProfessionalFeedbackUnitList({}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.unitList.push({value: item.code, label: item.value});
});
}
})
},
// 获取角色
getRoleList() {
getProfessionalFeedbackRoleList({}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.roleList.push({value: item.code, label: item.value});
})
}
})
},
// 获取层级
getLevelList() {
getProfessionalFeedbackHierarchyList({}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.levelList.push({value: item.code, label: item.value});
})
}
})
},
// 获取状态
getStatusList() {
getDictionary({"type":"professional_status"}).then(res => {
let { code, msg, data } = res;
if (res.code == 200) {
data.forEach(item => {
this.statusList.push({value: item.code, label: item.value});
})
}
})
},
// 提交专业回馈
submitAddAttr() {
this.$refs['addData'].validate(valid => {
if (valid) {
let param = this.addData;
param.startTime = this.addData.time[0];
param.endTime = this.addData.time[1];
param.orgCode = JSON.parse(localStorage.getItem('userdata')).orgCode
submitProfessionalFeedback(param).then(res => {
let {code, data, msg} = res
if (code == '200') {
this.$message.success(msg)
this.addData = {
categoryCode: '',
defineCode: '',
specificTask: '',
time: '',
startTime: '',
endTime: '',
number: '',
unitCode: '',
initiatingDepartment: '',
roleCode: '',
levelCode: '',
proofMaterial: '',
remarks: '',
};
} else {
this.$message.error(msg)
}
this.closeAddDialog();
this.getData();
})
}
});
},
// 缩放查询条件
toggle() {
this.isToggle = !this.isToggle;
},
// 查询
search() {
this.loading = true;
this.searchData.pageNo = 1;
this.getData()
},
// 清空
clear() {
this.searchData.condition = {}
this.searchData.pageNo = 1;
this.loading = true;
this.getData()
},
// 分页
handleSizeChange(val) {
this.searchData.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.searchData.pageNo = val;
this.getData();
},
// 排序
tableSort(val) {
console.log(val);
},
//获取列表
getData(){
let param = this.searchData;
getProfessionalFeedbackList(param).then(res => {
let { code, data, msg } = res
if (code == '200') {
this.tableData = data.list;
this.tableData.forEach((item, index) => {
item.index = ((data.pageNum-1) * data.pageSize) + index + 1;
})
this.pageInfo = {
pageNo: data.pageNum,
pageSize: data.pageSize,
totalCount: data.total
};
this.searchData.totalCount = data.total;
}
});
this.loading = false;
},
},
created() {
this.getCategoryStruct();
this.getTypeList();
this.getDefineList();
this.getUnitList();
this.getRoleList();
this.getLevelList();
this.getStatusList();
this.getData();
}
};
</script>
<style lang="scss" scoped>
.home {
margin-left: 2%;
margin-right: 2%;
width: 96%;
}
.task-process {
//width: 100%;
justify-content: space-between;
margin-top: 20px;
padding-bottom: 20px;
padding-left: 15%;
//height: 65px;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
background-color: white;
}
.task-item {
float: left;
flex-direction: column;
align-items: center;
}
.task-icon {
text-align: center;
font-size: 30px;
color: #999;
margin-bottom: 5px;
}
.task-text {
font-size: 14px;
color: #666;
width: 90px;
text-align: center;
}
.line-horizontal {
float: left;
width: 15%;
height: 1px;
background-color: #999;
margin: 20px 0;
position: relative;
}
.line-horizontal::after {
content: "";
position: absolute;
top: -4px;
right: -10px;
border: 5px solid transparent;
border-left-color: #999;
transform: rotate(0deg);
}
.active .task-icon {
color: orangered;
}
.active .task-text {
color: orangered;
}
.circle {
display: inline-block;
width: 24px;
height: 24px;
border-radius: 50%;
background-color: #FFFFFF;
color: #999;
text-align: center;
line-height: 24px;
}
.active .circle {
background-color: orangered;
color: #fff;
}
.page-title {
text-align: center;
padding-top: 20px;
padding-bottom: 20px;
}
.base-info {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.job-application {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-rule {
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-item {
padding-bottom: 10px;
}
.el-icon-success {
color: green;
}
.el-icon-error {
color: red;
}
.el-table__header .cell {
color: #324C99;
font-weight: bold;
}
.submit-btn {
margin-top: 10px;
margin-left: 45%;
background-color: orangered;
border-color: orangered;
}
.el-button--primary {
color: #FFF;
background-color: orangered;
border-color: orangered;
}
.el-button--primary.is-plain {
background: #FFF;
color: orangered;
border-color: orangered;
}
::v-deep .el-select-dropdown .el-select-dropdown__item.selected {
color: orangered !important;
}
::v-deep .el-pagination.is-background .el-pager li:not(.disabled).active {
background-color: orangered;
color: #FFF;
}
::v-deep .el-range-editor.is-active, .el-range-editor.is-active:hover, .el-select .el-input.is-focus .el-input__inner {
border-color: orangered;
}
</style>

View File

@@ -0,0 +1,267 @@
<template>
<div class="home">
<!-- 任务进度条 -->
<el-card class="task-process">
<div class="task-item active">
<div class="task-icon">
<span class="circle">1</span>
</div>
<div class="task-text">任职申请</div>
</div>
<div class="line-horizontal"></div>
<div class="task-item active">
<div class="task-icon">
<span class="circle">2</span>
</div>
<div class="task-text">学习考试</div>
</div>
<div class="line-horizontal"></div>
<div class="task-item">
<div class="task-icon">
<span class="circle">3</span>
</div>
<div class="task-text">专业回馈</div>
</div>
<div class="line-horizontal"></div>
<div class="task-item" >
<div class="task-icon">
<span class="circle">4</span>
</div>
<div class="task-text">个人行为举证</div>
</div>
</el-card>
<!--申报页面-->
<el-card v-if="isDeclared" class="declared-content">
<div style="margin-bottom:20px;width: 100%;float: left">
<label style="color: #000000; padding-top:8px; margin-bottom:40px; float: left">已经完成任职资格申请请前往v学苑进行学习考试(点击右侧图标进入V学苑)</label>
<label style="color: #000000;margin-right: 20px;float: left">
<a :href="yunUrl" target="_blank">
<img src="@/assets/study.png" style="width: 36px"/>
</a>
</label>
</div>
<label style="color: #000000;margin-right: 20px;vertical-align: top; float: left">课程清单</label>
<div style="width: 81%; float: left; border: 1px solid #EBEEF5; margin-bottom: 20px" >
<div style="height:300px;overflow:auto">
<el-tree
class="filter-tree"
:data="courseList"
:props="defaultProps"
default-expand-all
ref="tree">
</el-tree>
</div>
</div>
</el-card>
<!--未申报页面-->
<el-card v-else class="undeclared-content">
暂时未有需学习的任职资格序列申请请先完成任职资格申请
</el-card>
</div>
</template>
<script>
import {baseUrl, isLearningExamInProgress, yunUrl} from "@/api/userMG";
export default {
computed: {
},
// 注册组件
components: {
},
data() {
return {
yunUrl:yunUrl,
url: baseUrl,
sequence:'',
level:'',
isDeclared:true,
courseList: [],
defaultProps: {
children: 'children',
label: 'label'
}
};
},
methods: {
// 是否有学习中的任职资格申报
isLearningExam() {
isLearningExamInProgress({}).then(res => {
let { code, msg, data } = res;
if(code == 200) {
this.isDeclared = true;
const keys = Object.keys(data);
for (let key = 0; key < keys.length; key++) {
let dataItem = data[keys[key]]
let courseList = []
if(dataItem !== undefined && dataItem !== null && dataItem.tasks !== undefined && dataItem.tasks !== null){
for (let i = 0; i < dataItem.tasks.length; i++) {
let courseItem = {}
let item = dataItem.tasks[i]
courseItem.label = item.name
courseItem.children = []
if(item.kngs !==undefined && item.kngs !== null){
for (let j = 0; j < item.kngs.length; j++) {
let kng = item.kngs[j]
let kngLabel = kng.kngTitle
courseItem.children.push({label:kngLabel})
}
}
courseList.push(courseItem)
}
}else {
courseList.push({label:'暂无课程信息'})
}
this.courseList.push({label:keys[key],children:courseList})
}
}else {
this.isDeclared = false;
}
});
}
},
created() {
this.isLearningExam();
}
};
</script>
<style lang="scss" scoped>
.home {
margin-left: 2%;
margin-right: 2%;
width: 96%;
}
.task-process {
//width: 100%;
//display: flex;
justify-content: space-between;
margin-top: 20px;
padding-bottom: 20px;
padding-left: 15%;
//height: 65px;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
background-color: white;
}
.task-item {
float: left;
//display: flex;
flex-direction: column;
align-items: center;
}
.task-icon {
text-align: center;
font-size: 30px;
color: #999;
margin-bottom: 5px;
}
.task-text {
font-size: 14px;
color: #666;
width: 90px;
text-align: center;
}
.line-horizontal {
float: left;
width: 15%;
height: 1px;
background-color: #999;
margin: 20px 0;
position: relative;
}
.line-horizontal::after {
content: "";
position: absolute;
top: -4px;
right: -10px;
border: 5px solid transparent;
border-left-color: #999;
transform: rotate(0deg);
}
.active .task-icon {
color: orangered;
}
.active .task-text {
color: orangered;
}
.circle {
display: inline-block;
width: 24px;
height: 24px;
border-radius: 50%;
background-color: #FFFFFF;
color: #999;
text-align: center;
line-height: 24px;
}
.active .circle {
background-color: orangered;
color: #fff;
}
.page-title{
text-align: center;
padding-top: 20px;
padding-bottom: 20px;
}
.declared-content{
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.undeclared-content{
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.job-application{
//display: flex;
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-rule{
display: flex;
justify-content: space-between;
margin-top: 20px;
padding-top: 30px;
background-color: white;
border-radius: 10px; /* 增加圆角 */
overflow: hidden; /* 防止圆角处内容溢出 */
}
.application-item{
padding-bottom: 10px;
}
.el-icon-success{
color: green;
}
.el-icon-error{
color: red;
}
.el-table__header .cell{
color: #324C99;
font-weight: bold;
}
.submit-btn{
margin-top: 10px;
margin-left: 45%;
}
</style>

147
src/views/tools/preview.vue Normal file
View File

@@ -0,0 +1,147 @@
<template>
<div class="pdf-box">
<div class="pdf-tab">
<div style="height: 500px;">
<div style="height: 460px;">
<pdf
:src="pdfData"
:page="pageNum"
@num-pages="pageCount = $event"
:style="{ height: customHeight + 'px', width: width + '%' }"
@link-clicked="page = $event"
/>
</div>
<div class="pdf-tab-button" style="background-color: #FFFFFF;height: 50px;width: 560px;position: fixed">
<div class="btn-def btn-pre" @click.stop="prePage" style="cursor: pointer;margin-right: 14px;">上一页</div>
<div class="btn-def btn-next" @click.stop="nextPage" style="cursor: pointer;margin-right: 14px;">下一页</div>
<div class="btn-def btn-scaled" @click.stop="scaleD" style="cursor: pointer;margin-right: 14px;">放大</div>
<div class="btn-def btn-scalex" @click.stop="scaleX" style="cursor: pointer;">缩小</div>
<div class="page-size">{{ pageNum }}/{{ pageCount }}</div>
<el-checkbox v-if="parentUrl ===undefined" v-model="cancelTip" @change="changeTip">取消提醒</el-checkbox>
</div>
</div>
</div>
</div>
</template>
<script>
import pdf from 'vue-pdf'
import axios from 'axios'
import {baseUrl, downloadQualificationManagementMeasures} from "@/api/userMG";
export default {
components: { pdf },
data() {
return {
pdfData: null, // 存储 PDF 文件数据
customHeight: 500,
width: 100,
pageNum: 1,
pageCount: 1,
cancelTip: false,
}
},
async created() {
// 在组件创建时获取 PDF 文件
await this.fetchPdfWithAuth();
},
props: ["parentUrl", "params"],
methods: {
changeTip() {
this.$emit('changeTip', this.cancelTip);
},
//上一页
prePage() {
var p = this.pageNum;
if(p > 1){
p = p - 1;
}
// p = p > 1 ? p - 1 : this.pageCount;
this.pageNum = p;
},
// 下一页
nextPage() {
var p = this.pageNum;
if(p < this.pageCount){
p = p + 1;
}
this.pageNum = p;
},
// 缩放
scaleD() {
this.width += 5;
},
// 缩小
scaleX() {
if(this.width > 100){
this.width -= 5;
}
},
async fetchPdfWithAuth() {
const token = localStorage.getItem('logintoken'); // 你的 Token
let url = baseUrl + '/qualifications-service/internal-informations/downloadQualificationManagementMeasures'; // PDF 文件的 URL
let params = {}
if (this.parentUrl !== undefined) {
url = baseUrl + this.parentUrl;
params = this.params;
}
console.log(url)
try {
// 使用 axios 发送请求
const response = await axios.post(url,params, {
headers: {
Authorization: token // 添加 Authorization 头部
},
responseType: 'blob' // 确保响应类型是 Blob
});
// 将 Blob 转换为 Object URL
this.pdfData = URL.createObjectURL(response.data);
} catch (error) {
console.error('Error fetching PDF:', error);
}
}
}
}
</script>
<style lang="scss" scoped>
.pdf-box {
width: 100%;
height: 800px;
.pdf-tab {
width: 100%;
height: 800px;
display: flex;
flex-direction: column;
align-items: center;
.pdf-tab-button {
width: 100%;
display: flex;
align-items: center;
justify-content: space-around;
.btn-def {
width: 160px;
height: 40px;
line-height: 40px;
text-align: center;
color: #fff;
background-color: orangered;
border-color: orangered;
border-radius: 5px;
font-size: 18px;
}
}
.page-size {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
}
}
}
</style>

22
src/vuex/store.js Normal file
View File

@@ -0,0 +1,22 @@
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
user: false,
content:{},
},
mutations: {
login(state, user) {
state.user = user;
localStorage.setItem("userInfo", user);
},
logout(state, user) {
state.user = "";
localStorage.setItem("userInfo", "");
}
},
actions: {
},
})

80
vue.config.js Normal file
View File

@@ -0,0 +1,80 @@
// 在vue-config.js 中加入
const Timestamp = new Date().getTime();
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const productionGzipExtensions = ['js', 'css'];
const isProduction = process.env.NODE_ENV === 'production';
module.exports = {
publicPath: process.env.NODE_ENV === "production" ? "./" : "./", // 部署应用时的根路径(默认'/'),也可用相对路径(存在使用限制)
outputDir: process.env.outputDir, //process.env.outputDir 运行时生成的生产环境构建文件的目录(默认''dist'',构建之前会被清除)
assetsDir: "static", //放置生成的静态资源(s、css、img、fonts)的(相对于 outputDir 的)目录(默认'')
lintOnSave: false, // 是否开启eslint保存检测
productionSourceMap: false, // 是否在构建生产包时生成sourcdeMap
devServer: {
/* 本地ip地址 */
host: "0.0.0.0",
port: "8020",
hot: true,
/* 自动打开浏览器 */
open: false,
overlay: {
warning: false,
error: true
}, // 错误、警告在页面弹出
/* 跨域代理 */
proxy: {
"/api": {
/* 目标代理服务器地址 */
// target: process.env.VUE_APP_API,
target: 'http://127.0.0.1:8089',
/* 允许跨域 */
changeOrigin: true,
ws: true,
pathRewrite: {
"^/api": ""
}
}
}
},
configureWebpack: config => {
if (isProduction) {
config.plugins.push(new CompressionWebpackPlugin({
algorithm: 'gzip',
test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
threshold: 10240,
minRatio: 0.8
}))
}
config["externals"] = {
// 'vue': 'Vue',
// 'vue-router': 'VueRouter',
// 'vuex': 'Vuex',
// 'axios': 'axios'
}
config["performance"] = {
hints: 'warning',
// 入口起点的最大体积 整数类型(以字节为单位)
maxEntrypointSize: 50000000,
// 生成文件的最大体积 整数类型(以字节为单位 300k
maxAssetSize: 30000000,
// 只给出 js 文件的性能提示
assetFilter: function (assetFilename) {
return assetFilename.endsWith('.js')
}
},
// 输出重构
config.output.filename = `js/[name].${Timestamp}.js`
config.output.chunkFilename = `js/[name].${Timestamp}.js`
},
css: {
extract: {
filename: `css/[name].${Timestamp}.css`,
chunkFilename: `css/[name].${Timestamp}.css`
}
},
chainWebpack: config => {
// 移除prefetch插件
config.plugins.delete("prefetch");
config.plugins.delete('preload');
}
}