diff --git a/.gitignore b/.gitignore index 5845921..8d62e9b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,16 @@ .DS_Store node_modules /dist + *.zip # local env files .env.local .env.*.local - +vue.config.js +.elslintignore +.gitignore # Log files npm-debug.log* yarn-debug.log* @@ -15,6 +18,7 @@ yarn-error.log* pnpm-debug.log* # Editor directories and files + .idea .vscode *.suo @@ -23,4 +27,5 @@ pnpm-debug.log* *.sln *.sw? *.lock -*-lock.json \ No newline at end of file +*-lock.json + diff --git a/package.json b/package.json index 9fe9a00..5e0eb38 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "vueui": "vue ui" }, "dependencies": { + "@johmun/vue-tags-input": "^2.1.0", "axios": "^0.24.0", "core-js": "^3.19.1", "echarts": "^5.2.2", diff --git a/src/api/modules/permissionProcess.js b/src/api/modules/permissionProcess.js new file mode 100644 index 0000000..d7a7641 --- /dev/null +++ b/src/api/modules/permissionProcess.js @@ -0,0 +1,12 @@ + +import { instance as request } from '@/utils/request' + +export default { + getReportLisy (data) { + return request({ + url: '/api/report/addReportPage', + method: 'post', + data: data + }) + }, +} diff --git a/src/api/modules/process.js b/src/api/modules/process.js new file mode 100644 index 0000000..80f9b1d --- /dev/null +++ b/src/api/modules/process.js @@ -0,0 +1,112 @@ +import { instance as request } from '@/utils/request' + +export default { + getRoleAndUserByOrgIdPage (data) { + return request({ + url: '/api/sys/user/list', + method: 'get', + params: data + }) + }, + + // 获取审批历史 + getHistory (data) { + return request({ + url: '/api/task/get_list_by_instance', + method: 'get', + params: data + }) + }, + //部署接口 + deploy (data) { + return request({ + url: '/api/deploy', + method: 'get', + params: data + }) + }, + //获取流程配置列表 + getModelListPage (data){ + return request({ + url: '/api/modelListPage', + method: 'get', + params: data + }) + }, + //新增模板 + addModel (data){ + return request({ + url: '/api/createModel', + method: 'get', + params: data + }) + }, + //删除模板 + deleteModel (data){ + return request({ + url: '/api/deleteModel', + method: 'get', + params: data + }) + }, + //转办 + changeAssignee (data){ + return request({ + url: '/api/changeAssigneeNew', + method: 'get', + params: data + }) + }, + // 获取一般的数据 + getAlreadData(data) { + return request({ + url: '/api/haveFinishedFlowDetail', + method: 'get', + params: data + }) + }, + // 催办 + urgePerson(data) { + return request({ + url: '/api/person/personMsg/saveNew', + method: 'post', + data: data + }) + }, + // 导出 + exportStandard(data) { + return request({ + url: '/api/task/historyExport', + method: 'get', + params: data , + responseType:'blob' + }) + }, + // 通用流程提交 + completeTask(data){ + return request({ + url: '/api/completeTask', + method: 'post', + data: data + }) + }, + // 通用流程详细信息查询 + getProcessDetail( data ){ + return request({ + url: '/api/queryDetail', + method: 'get', + params: data + + }) + }, + // 停用流程发起 + startProcess(data) { + return request({ + url: '/api/startProcess', + method: 'post', + data: data + + }) + } + +} diff --git a/src/api/modules/processCenter.js b/src/api/modules/processCenter.js index 156c7ec..e7543f5 100644 --- a/src/api/modules/processCenter.js +++ b/src/api/modules/processCenter.js @@ -1,19 +1,58 @@ import { instance as request } from '@/utils/request' -export default{ - //查询 - search(data){ - return request({ - url: '', - method: 'POST', - data - }) - }, - //重置 - reset(data){ - return request({ - url: '', - method: 'POST', - data - }) - } -} \ No newline at end of file +export default { + finishProcessPage (data) { + return request({ + url: '/api/doneProcess', + method: 'post', + data: data + }) + }, + gencyProcessPage(data) { + return request({ + url: '/api/todoTaskList', + method: 'post', + data: data + }) + }, + monitorProcessesPage(data) { + return request({ + url: '/api/allProcess', + method: 'post', + data: data + }) + }, + sentProcessPage(data) { + return request({ + url: '/api/issuedProcess', + method: 'post', + data: data + }) + }, + + + // 获取监控流程详情 + getMonitorPageList(data){ + return request({ + url: '/api/task/get_list_by_instance', + method: 'GET', + params: data + }) + }, + // 获取监控流程详情 + getMonitorImg(data){ + return request({ + url: '/api/instance/getImg', + method: 'GET', + params: data, + responseType: 'blob', + }) + }, + //强制撤回 + getBack(data){ + return request({ + url: '/api/forceRecall', + method: 'GET', + params: data + }) + } +} diff --git a/src/api/modules/report.js b/src/api/modules/report.js index f590359..ee23838 100644 --- a/src/api/modules/report.js +++ b/src/api/modules/report.js @@ -18,10 +18,10 @@ export default { params: data }) }, - // 标签管理 + // 标签增加 labelAdd (data) { return request({ - url: '/api/label/add', + url: 'api/tree-label/add', method: 'POST', data }) @@ -29,7 +29,7 @@ export default { // 标签列表 labelList (data) { return request({ - url: '/api/label/list', + url: 'api/tree-label/list', method: 'GET', params: data }) @@ -37,10 +37,25 @@ export default { // 标签删除|单个 labelDeleteId (data) { return request({ - url: `/api/label/delete/${data.id}`, + url: `api/tree-label/delete/${data.id}`, method: 'POST' }) }, + // 标签列表 + labelNodeList (id) { + return request({ + url: `api/tree-label/labelList/${id}`, + method: 'GET', + params: id + }) + }, +labelUpdate(data){ + return request({ + url: 'api/tree-label/update', + method: 'POST', + data + }) +}, // 新增或编辑报告 reportAdd (data) { @@ -85,6 +100,14 @@ export default { data }) }, + // 报告管理列表 + reportListManager (data) { + return request({ + url: '/api/report/list-auth', + method: 'POST', + data + }) + }, // 获取报告日期列表 reportDateList (data) { return request({ @@ -129,4 +152,5 @@ export default { params: data }) } + // } diff --git a/src/assets/css/common.scss b/src/assets/css/common.scss new file mode 100644 index 0000000..3434b9c --- /dev/null +++ b/src/assets/css/common.scss @@ -0,0 +1,47 @@ +.tag-btns { + padding-right: 15px; +} +.search-area { + padding: 0; + + .el-form-item__label { + line-height: 35px; + } + + .el-form-item__content { + line-height: 35px; + + .el-input__inner { + height: 25px; + line-height: 35px; + } + } +} +.search-new { + //width: 100%; + background: #FFF; + padding: 10px 10px 0; + + .el-button + .el-button { + margin-left: 10px; + } + + .el-form--inline .el-form-item { + display: flex; + margin-right: 0; + + input.el-input__inner { + width: 100%; + } + + .el-form-item__content { + //width: 100%; + flex: 1; + + .el-select, + .el-range-editor { + width: 100% !important; + } + } + } +} diff --git a/src/assets/css/process.scss b/src/assets/css/process.scss new file mode 100644 index 0000000..77daf1c --- /dev/null +++ b/src/assets/css/process.scss @@ -0,0 +1,65 @@ +//流程样式 +.process{ + background-color: #fff; + width:100%; + height: 100%; + padding: 10px 20px; + overflow: auto; +} +.process_box{ + padding: 10px 30px; + border: 1px solid #e8f6fe; +} +.procedure{ + +} +.process_content{ + margin-top: 25px; + width:100%; + padding: 10px 30px; + border: 1px solid rgb(242,242,242); +} +.base_title{ + display: inline-block; + font-size: 18px; + font-weight: 700; + color: #555; + line-height: 40px; + border-bottom: 3px solid #409eff; + margin-bottom: 20px; +} +.pagination{ + margin-top: 20px; +} + +// 表单的样式 +.label-input-form{ + padding-right: 80px; + .el-form-item .el-form-item__label{ + line-height: 40px; + font-size: 15px; + color:#555 !important; + } + .el-form-item .el-input__inner { + height: 40px; + line-height: 40px; + font-size: 15px; + } + .el-select{ + width: 100%; + } + .add-form-item{ + .el-input{ + width: 100%; + } + .el-input__inner{ + height: 40px; + line-height: 40px; + } + } +} +.blurcolor{ + color: #1890FF ; + cursor: pointer; +} + diff --git a/src/components/Header.vue b/src/components/Header.vue index 3f9db45..a257652 100644 --- a/src/components/Header.vue +++ b/src/components/Header.vue @@ -46,6 +46,7 @@ + + diff --git a/src/components/ProcessApprovalHistory.vue b/src/components/ProcessApprovalHistory.vue new file mode 100644 index 0000000..26ac6e1 --- /dev/null +++ b/src/components/ProcessApprovalHistory.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/src/components/ProcessChooseTree.vue b/src/components/ProcessChooseTree.vue new file mode 100644 index 0000000..4f40979 --- /dev/null +++ b/src/components/ProcessChooseTree.vue @@ -0,0 +1,771 @@ + + + + + + diff --git a/src/components/ProcessFooter.vue b/src/components/ProcessFooter.vue new file mode 100644 index 0000000..f037d29 --- /dev/null +++ b/src/components/ProcessFooter.vue @@ -0,0 +1,402 @@ + + + + + + diff --git a/src/components/ProcessHeader.vue b/src/components/ProcessHeader.vue new file mode 100644 index 0000000..78b0ebe --- /dev/null +++ b/src/components/ProcessHeader.vue @@ -0,0 +1,62 @@ + + + + + + diff --git a/src/components/ProcessMixin.vue b/src/components/ProcessMixin.vue new file mode 100644 index 0000000..49b7ceb --- /dev/null +++ b/src/components/ProcessMixin.vue @@ -0,0 +1,129 @@ + + diff --git a/src/main.js b/src/main.js index e116a79..26b2d10 100644 --- a/src/main.js +++ b/src/main.js @@ -2,7 +2,9 @@ import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' - +// 流程公共样式 +import './assets/css/process.scss' +import './assets/css/common.scss' import config from '@/utils/config' // VXETable import 'xe-utils' @@ -10,6 +12,7 @@ import VXETable from 'vxe-table' import 'vxe-table/lib/style.css' // ElementUI import ElementUI from 'element-ui' + import './assets/css/element-variables.scss' // ECharts import 'echarts' @@ -27,6 +30,7 @@ import '@/utils/waterMark' import JSEncrypt from '../src/assets/js/jsencrypt.min.js' // 富文本引用 import VueQuillEditor from 'vue-quill-editor' + // require styles 引入样式 import 'quill/dist/quill.core.css' import 'quill/dist/quill.snow.css' @@ -71,5 +75,8 @@ Vue.config.productionTip = false new Vue({ router, store, + beforeCreate(){ + Vue.prototype.$bus = this //安装全局事件总线 + }, render: h => h(App) }).$mount('#app') diff --git a/src/router/modules/permission.js b/src/router/modules/permission.js new file mode 100644 index 0000000..63b2cdd --- /dev/null +++ b/src/router/modules/permission.js @@ -0,0 +1,27 @@ +const routes = [ + { + path: '/permission', + name: '', + component: () => import('../../views/Layout.vue'), + children: [ + { + path: 'launch', + name: 'urlIndex', + component: () => import('../../views/permissionApplication/launch'), + meta: { + crumb: ['权限申请'] + } + }, + { + path: 'examine', + name: 'urlIndex', + component: () => import('../../views/permissionApplication/examine'), + meta: { + crumb: ['权限申请'] + } + } + ] + } +] + +export default routes diff --git a/src/router/modules/processCenter.js b/src/router/modules/processCenter.js new file mode 100644 index 0000000..6924959 --- /dev/null +++ b/src/router/modules/processCenter.js @@ -0,0 +1,42 @@ +const routes = [ + // 用户中心管理 + { + path: '/userCenter', + name: 'userCenter', + component: () => import('../../views/Layout.vue'), + children: [ + // 流程中心 + { + path: 'processCenter', + name: 'processCenter', + component: () => import('../../views/userCenter/processCenter.vue'), + meta: { + crumb: ['流程中心'] + } + }, + // 流程配置 + { + path: 'processConfig', + name: 'processConfig', + component: () => import('../../views/userCenter/processConfig/index.vue'), + meta: { + crumb: ['流程配置'] + } + }, + { + path:'monitorViews', + name:'monitorViews', + component: () => import('../../views/userCenter/processCenter/monitorProcesses/monitorDetail.vue') + }, + + ], + + }, + { + path:'/processMapping', + name:'processMapping', + component: () => import('../../views/userCenter/processConfig/ProcessMapping') + } + ] + + export default routes diff --git a/src/router/modules/userCenter.js b/src/router/modules/userCenter.js deleted file mode 100644 index f169ad5..0000000 --- a/src/router/modules/userCenter.js +++ /dev/null @@ -1,22 +0,0 @@ -const routes = [ - // 用户中心管理 - { - path: '/userCenter', - name: 'userCenter', - component: () => import('../../views/Layout.vue'), - children: [ - // 流程中心 - { - path: 'processCenter', - name: 'processCenter', - component: () => import('../../views/userCenter/processCenter.vue'), - meta: { - crumb: ['流程中心'] - } - }, - ] - } - ] - - export default routes - \ No newline at end of file diff --git a/src/store/index.js b/src/store/index.js index 8074c0e..ab2cfcb 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -11,13 +11,24 @@ export default new Vuex.Store({ rememberData: null, menuData: [], pathUrl: '', - menuName: '' + menuName: '', + activeTab: '', + handleProcess: '' }, getters: { menuData: (state) => state.menuData, - menuName: (state) => state.menuName + menuName: (state) => state.menuName, + userInfo: (state) => state.userInfo, + activeTab: (state) =>state.activeTab, + handleProcess: (state) =>state.handleProcess }, mutations: { + setHandleProcess(state, data){ + state.handleProcess = data + }, + setActiveTabIndex(state, data){ + state.activeTab = data + }, saveUserInfo (state, data) { state.userInfo = data }, diff --git a/src/utils/Enum/enum.js b/src/utils/Enum/enum.js new file mode 100644 index 0000000..33f93ca --- /dev/null +++ b/src/utils/Enum/enum.js @@ -0,0 +1,8 @@ +// 定义枚举 +import Esenum from './index.js' +// 权限申请 +export const PERMISSION = new Esenum([ + { label: '预览', value: "1" }, + { label: '预览+下载', value: "2" } +]) + diff --git a/src/utils/Enum/index.js b/src/utils/Enum/index.js new file mode 100644 index 0000000..e58e16b --- /dev/null +++ b/src/utils/Enum/index.js @@ -0,0 +1,103 @@ +export default class EsEunm { + constructor (obj) { + if (!obj) { + return + } + Object.keys(obj).forEach(key => { + const item = obj[key] + this.addAll(key, item) + }) + return this + } + + /** + * 添加枚举 + * @param key + * @param item + */ + addAll (key, item) { + this[key] = item + } + + /** + * 获取到所有的枚举值列表 + * @return {Array} list集合 + */ + getItemList () { + const optionList = [] + for (const key in this) { + const item = this[key] + const option = {} + Object.assign(option, item) + option.key = key + optionList.push(option) + } + optionList.sort((a, b) => { + const value1 = a.index + const value2 = b.index + return value1 - value2 + }) + return optionList + } + + /** + * 过滤掉不需要的值 + * @params {Array,String} val 需要过滤掉的枚举对象的name值 + * @return {Array} list集合 + */ + getFilterItemList (val = []) { + let filterList = [] + let valueArr = [] // 接受参数的整理 + if (Array.isArray(val)) { + valueArr = val + } else { + valueArr.push(val) + } + const optionList = this.getItemList() // 得到的是list + filterList = optionList.filter(item => { + if (valueArr.includes(item.name)) { + return false + } + return true + }) + return filterList + } + + /** + * 根据name获取到index + * @params {String} name 枚举的name值 + * @return {Number} name对应的index值 + */ + nameOfIndex (uname) { + if (!uname) { + return null + } + let index = '' + const optionList = this.getItemList() + optionList.forEach(item => { + if (uname.toString() === item.name.toString()) { + index = +item.index + } + }) + return index + } + + /** + * 根据index获取到name + * @params {Number} index 枚举的index值 + * @return {String} index对应的name值 + */ + indexOfName (index) { + if (index == undefined) { + return null + } + let uname = '' + const optionList = this.getItemList() + optionList.forEach(item => { + if (item.index !== undefined && item.index !== null && item.index == index) { + uname = item.name + } + }) + return uname + } +} diff --git a/src/utils/date.js b/src/utils/date.js index 463ce10..6d7bb58 100644 --- a/src/utils/date.js +++ b/src/utils/date.js @@ -29,6 +29,7 @@ export function formatDate (value, fmt) { return fmt } else { value = value.trim() + value = value.replace('T', ' ') return value.substr(0, fmt.length) } } diff --git a/src/utils/request.js b/src/utils/request.js index caf522c..ce4c35d 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -46,8 +46,14 @@ instance.interceptors.response.use(function (response) { // 登录超时 if (response.data.respCode === '401') { store.commit('saveUserInfo', null) + store.commit('saveUserInfo', null) + store.commit('savePathUrl', null) + store.commit('saveMenuName', null) + store.commit('saveMenuData', null) router.push('/login') Message.error('登录超时过期') + //清除vuex + // var url = 'http://192.168.144.22:9966/login?loginType=1' // // var url = 'http://10.64.23.30:7766/home' // @@ -81,6 +87,28 @@ instance.interceptors.response.use(function (response) { // 登录过期 if (error.response.status === 401) { store.commit('saveUserInfo', null) + store.commit('saveUserInfo', null) + store.commit('savePathUrl', null) + store.commit('saveMenuName', null) + store.commit('saveMenuData', null) + store.commit('setHandleProcess', null) + router.push('/login') + Message.error('登录超时过期') + // window.open(BASE_URL.BASE_CHANGAN + "/logout?service=" + BASE_URL.BASE_LOCAL + "/login?loginType=1", '_self'); + // var url = 'http://192.168.144.22:9966/login?loginType=1' + // // var url = 'http://10.64.23.30:7766/home' + // + // return window.open('http://192.168.144.29:9090/cas/login?service='+url, '_self'); + // // return window.open('https://caddmuat.changan.com.cn/cas/login?service='+url, '_self'); + } + // 登录过期 + if (error.response.status === 500) { + store.commit('saveUserInfo', null) + store.commit('saveUserInfo', null) + store.commit('savePathUrl', null) + store.commit('saveMenuName', null) + store.commit('saveMenuData', null) + store.commit('setHandleProcess', null) router.push('/login') Message.error('登录超时过期') // window.open(BASE_URL.BASE_CHANGAN + "/logout?service=" + BASE_URL.BASE_LOCAL + "/login?loginType=1", '_self'); diff --git a/src/views/Layout.vue b/src/views/Layout.vue index 6212af6..ed38b00 100644 --- a/src/views/Layout.vue +++ b/src/views/Layout.vue @@ -81,7 +81,7 @@ export default { this.menuData = this.addLevel(treeData, 1) }, getSysMenu () { - this.$api.menu.getSysMenu({ roleId: this.$store.state.userInfo.roleIdList[0] }).then(({ data }) => { + this.$api.menu.getSysMenu({ roleId: this.$store.getters.userInfo.roleIdList[0] }).then(({ data }) => { if (data === null) { data = [] } diff --git a/src/views/Login.vue b/src/views/Login.vue index ff3026a..8fb29b8 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue @@ -107,6 +107,9 @@ export default { this.verifyCode() return this.$message.error(res.data.message) } + res.data.roleIdList=res.data.roleEOList.map(item=>{ + return item.id + }) this.$message.success('登录成功') this.$store.commit('saveUserInfo', res.data) this.$router.push({ path: '/report/list', query: { id: 'AEHJB8YNJ3' } }) diff --git a/src/views/Report/ReportList.vue b/src/views/Report/ReportList.vue index eaf98bc..f046d9a 100644 --- a/src/views/Report/ReportList.vue +++ b/src/views/Report/ReportList.vue @@ -5,9 +5,15 @@