diff --git a/package.json b/package.json index b3743f0b96a93bef6155dbd4647eedd06d34111e..4f3947cca90b9ffb9e16e3ee570d57f862992c6f 100755 --- a/package.json +++ b/package.json @@ -14,10 +14,8 @@ }, "dependencies": { "@antv/data-set": "^0.11.8", - "@antv/g2": "^4.2.10", "@antv/g2plot": "^2.4.31", - "@antv/g6": "^5.0.45", - "@antv/g6-extension-3d": "^0.1.19", + "@antv/g6": "5.0.45", "@antv/l7": "^2.18.3", "@antv/l7-component": "^2.18.3", "@antv/l7-district": "^2.3.12", @@ -65,6 +63,7 @@ "lodash": "^4.17.21", "marked": "^7.0.1", "mavon-editor": "^2.10.4", + "moment": "^2.30.1", "navigator": "^1.0.1", "neatlogic-ui": "^1.0.7", "particles.vue": "^2.42.2", diff --git a/src/resources/api/framework/extramenu/extramenu.js b/src/resources/api/framework/extramenu/extramenu.js index 33b2da9128cb711d549ed58fc99bb574311619da..1adf72bcbd605dbe5f1c54ecfbacfc8bb40b0e3a 100644 --- a/src/resources/api/framework/extramenu/extramenu.js +++ b/src/resources/api/framework/extramenu/extramenu.js @@ -4,17 +4,20 @@ const extramenu = { getMenuTreeList(params) { return axios.post('/api/rest/extramenu/tree', params); }, + getMenuById(id) { + return axios.post('/api/rest/extramenu/get', {id: id}); + }, getMenuTreeNode(params) { return axios.post('/api/rest/extramenu/get', params); }, - deleteMenuTreeNode(params) { - return axios.post('/api/rest/extramenu/delete', params); + deleteMenuTreeNode(id) { + return axios.post('/api/rest/extramenu/delete', {id: id}); }, saveMenuTreeNode(params) { return axios.post('/api/rest/extramenu/save', params); }, - getMenuList(params) { //获取拥有权限的附加菜单列表 - return axios.post('/api/rest/extramenu/list', params); + getMenuList() { //获取拥有权限的附加菜单列表 + return axios.post('/api/rest/extramenu/list', {}); }, moveExtramenu(params) { //拖拽排序 return axios.post('/api/rest/extramenu/move', params); diff --git a/src/resources/api/framework/users/user.js b/src/resources/api/framework/users/user.js index ff966c90623b99edc03790eb9c40604ae1bed412..6ec8671254b3254fda7eb5bef443510953977307 100644 --- a/src/resources/api/framework/users/user.js +++ b/src/resources/api/framework/users/user.js @@ -20,6 +20,10 @@ export default { deleteUser(data) { return axios.post('/api/rest/user/delete', data); }, + //删除用户会话Api + deleteUserSession(data) { + return axios.post('/api/rest/user/session/delete', data); + }, //保存用户信息Api saveUser(data) { return axios.post('/api/rest/user/save', data); diff --git a/src/resources/assets/css/theme.less b/src/resources/assets/css/theme.less index 9e26d735edbb52128b02c7265b7d0fb345721666..a91d544f103e35126c99c1f8b7476e6d638be02c 100644 --- a/src/resources/assets/css/theme.less +++ b/src/resources/assets/css/theme.less @@ -1692,6 +1692,7 @@ background-color: @error-color; } + .bg-gray { background-color: @tip-color; } diff --git a/src/resources/assets/languages/page/en.json b/src/resources/assets/languages/page/en.json index d380abd16b72dc9cbb8d1c7f9c54c3405c0f5201..67a16552c9562ab07ad05dbfed6abc6016804436 100644 --- a/src/resources/assets/languages/page/en.json +++ b/src/resources/assets/languages/page/en.json @@ -1082,5 +1082,7 @@ "mailserver": "mail serve", "beforeconfig": "Pre conversion configuration", "dataconfig": "data configuration", - "datachange": "data conversion" + "datachange": "data conversion", + "childmenucount": "Number of submenus", + "systemmenuauth": "System menu permissions" } \ No newline at end of file diff --git a/src/resources/assets/languages/page/zh.json b/src/resources/assets/languages/page/zh.json index 096c9a0544d593ba9b9d10c83c7adeaab98855a0..3faa76327d7e0867d3b3172df626bd93d7765503 100644 --- a/src/resources/assets/languages/page/zh.json +++ b/src/resources/assets/languages/page/zh.json @@ -1084,5 +1084,7 @@ "mailserver": "邮件服务", "beforeconfig": "转换前配置", "dataconfig": "数据配置", - "datachange": "数据转换" + "datachange": "数据转换", + "childmenucount": "子菜单数量", + "systemmenuauth": "系统菜单权限" } \ No newline at end of file diff --git a/src/resources/assets/languages/term/en.json b/src/resources/assets/languages/term/en.json index a215bf0f4baade897d592d70250497b718823fdc..f0d56b6155e40081ad16c886df7d543b980275b3 100644 --- a/src/resources/assets/languages/term/en.json +++ b/src/resources/assets/languages/term/en.json @@ -631,7 +631,8 @@ "seeprocessconfig": "View the current work order process configuration", "editprocessconfig": "Edit the current work order process configuration", "stepishandledby": "Step Handling Human", - "sercalendar": "Service Calendar" + "sercalendar": "Service Calendar", + "flowauthuserupdatetip": "The processor includes all step handlers" }, "autoexec": { "addrootdirectory": "Add root directory", @@ -1357,7 +1358,12 @@ "versionremarks": "Version Remarks", "heartbeaturl": "Backend server address", "runnergrouptips": "The request for login authentication needs to carry a header as a rule expression (note that the header parameter in the expression must be all lowercase and the prefix must be {prefix}). If the value of the expression after execution is true, the executor group will take effect, and false and syntax exceptions will not take effect. For example:", - "batchdeletetagenttooltip": "Tagent in connected state cannot be deleted" + "batchdeletetagenttooltip": "Tagent in connected state cannot be deleted", + "deletesession": "Force logout", + "suredeletesession": "Are you sure to log off the user: {target}", + "usersessiondeletetitle": "Confirm forced offline", + "batchdeleteusersession": "Batch forced offline", + "usersessiondeletetip": "Users will be forced to log off after 15 minutes of cache expiration" }, "knowledge": { "document": "Document", @@ -2885,5 +2891,14 @@ }, "runnergroup": { "ruletips": "The request for login authentication needs to carry a header as a rule expression (note that the header parameter in the expression is all lowercase). If the value of the expression after execution is true, the executor group will take effect, and false and syntax exceptions will not take effect. For example: ${env}==\\ bit \\&&(${test}==\\ 1 \\ | | ${test2}==\\ aaa \\)" + }, + "informant": { + "last5dump": "Last 5 snapshots", + "threaddump": "Thread snapshot", + "pid": "Process ID", + "servicetopo": "Service Relationship Diagram" + }, + "infromant": { + "report": "analysis report" } } \ No newline at end of file diff --git a/src/resources/assets/languages/term/zh.json b/src/resources/assets/languages/term/zh.json index 2dd79e0b208213402694bdc75a53c2410d6cf5b6..de31e51c94977ec85c352a64b51e0c442b6c38b7 100644 --- a/src/resources/assets/languages/term/zh.json +++ b/src/resources/assets/languages/term/zh.json @@ -631,7 +631,8 @@ "seeprocessconfig": "查看当前工单流程配置", "editprocessconfig": "编辑当前工单流程配置", "stepishandledby": "步骤处理人为", - "sercalendar": "服务日历" + "sercalendar": "服务日历", + "flowauthuserupdatetip": "处理人包含所有步骤处理人" }, "autoexec": { "addrootdirectory": "添加根目录", @@ -1357,7 +1358,12 @@ "versionremarks": "版本备注", "heartbeaturl": "后端服务器地址", "runnergrouptips": "登录认证的请求需要携带Header做规则表达式(注意表达式中header参数全小写,且前缀必须为{prefix}),如果表达式执行后的值为true则该执行器组生效,false和语法异常都不生效。如:", - "batchdeletetagenttooltip": "已连接状态的tagent不能删除" + "batchdeletetagenttooltip": "已连接状态的tagent不能删除", + "deletesession": "强制下线", + "suredeletesession": "是否确认强制下线{target}", + "usersessiondeletetitle": "确认强制下线", + "batchdeleteusersession": "批量强制下线", + "usersessiondeletetip": "用户将在15分钟缓存失效后强制用户下线" }, "knowledge": { "document": "文档", @@ -2882,5 +2888,14 @@ "joinalert": "归并到告警", "uniquekey": "唯一键", "alertsign": "告警特征" + }, + "informant": { + "last5dump": "最近5次快照", + "threaddump": "线程快照", + "pid": "进程id", + "servicetopo": "服务关系图" + }, + "infromant": { + "report": "分析报告" } } \ No newline at end of file diff --git a/src/views/components/topnav/topnav-extramenu.vue b/src/views/components/topnav/topnav-extramenu.vue index 1a95f49743686d9548af7b156c36df9eb2cff14f..1ac21c481ff1e9e72d4e19e907f942a62a5a61bc 100644 --- a/src/views/components/topnav/topnav-extramenu.vue +++ b/src/views/components/topnav/topnav-extramenu.vue @@ -11,7 +11,7 @@ >
{{ extramenu.name }}
- + diff --git a/src/views/pages/cmdb/asset/advanced-mode-search.vue b/src/views/pages/cmdb/asset/advanced-mode-search.vue index baac5c18b2df560ab8a2f7bed924c7a27bfd4c0c..0507d02d8f507e577a465844eecaba39707710a9 100644 --- a/src/views/pages/cmdb/asset/advanced-mode-search.vue +++ b/src/views/pages/cmdb/asset/advanced-mode-search.vue @@ -654,6 +654,7 @@ export default { getConditionList() { this.conditionList = []; this.searchConditionList = []; + this.canSearch = true; this.$api.autoexec.action.getValueconverttextList(this.value).then(res => { if (res.Status == 'OK') { let conditionConfig = res.Return; diff --git a/src/views/pages/deploy/version/version-center-manage.vue b/src/views/pages/deploy/version/version-center-manage.vue index a4f08d76277a1d10acb4fd61460c2d0905051227..13158cda44d5bb90c84f9648654b6202cc2a85c6 100644 --- a/src/views/pages/deploy/version/version-center-manage.vue +++ b/src/views/pages/deploy/version/version-center-manage.vue @@ -351,6 +351,8 @@ export default { }, searchVersion() { this.loading = true; + let authParam = { authorityActionList: ['versionAndProductManager'] }; + this.searchParam = {...authParam, ...this.searchParam}; this.$api.deploy.version.searchVersion(this.searchParam).then(res => { if (res.Status == 'OK') { this.versionData = res.Return; diff --git a/src/views/pages/extramenu/config.js b/src/views/pages/extramenu/config.js new file mode 100644 index 0000000000000000000000000000000000000000..842e3c17c2f61666851069c8a562d762bc516ad4 --- /dev/null +++ b/src/views/pages/extramenu/config.js @@ -0,0 +1,6 @@ +import {$t} from '@/resources/init.js'; +export const config = { + module: 'extramenu', + menuType: { + } +}; diff --git a/src/views/pages/extramenu/detail.vue b/src/views/pages/extramenu/detail.vue new file mode 100644 index 0000000000000000000000000000000000000000..fed4e33ee585075f04acc1dcb5ad7e13a8a74dbb --- /dev/null +++ b/src/views/pages/extramenu/detail.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/views/pages/extramenu/extramenu.js b/src/views/pages/extramenu/extramenu.js new file mode 100644 index 0000000000000000000000000000000000000000..3ffe652b4fbacf20c8ea74bfb031f744cad23a32 --- /dev/null +++ b/src/views/pages/extramenu/extramenu.js @@ -0,0 +1,39 @@ +import Vue from 'vue'; +import VueRouter from 'vue-router'; +import extramenu from './extramenu.vue'; +import routers from './router.js'; +import store from '@/resources/store'; +import VueI18n from 'vue-i18n'; +import CompareUtil from '@/resources/assets/js/compareUtil.js'; +import api from '@/resources/api/api.js'; +import LocalStore from '@/resources/assets/js/localStore.js'; +import State from '@/resources/assets/js/state.js'; + +//公共的全局组件、样式等 +import '@/resources/base.js'; +import {initRouter, initI18n} from '@/resources/init.js'; + +Vue.use(VueRouter); +Vue.use(VueI18n); +Vue.use(CompareUtil);//必须要在use router之后执行 + +import {config} from './config.js'; +MODULEID = config.module; +MENULIST = routers; +MENUTYPE = config.menuType; + +let router = initRouter(VueRouter, store);//路由拦截处理 +let i18n = initI18n(VueI18n, {});//语言包配置 + +Vue.prototype.$tsrouter = router; +Vue.config.productionTip = false; +Vue.prototype.$api = api; +Vue.prototype.$localStore = new LocalStore('extramenu', router); +Vue.prototype.$state = new State('extramenu'); + +new Vue({ + router, + store, + i18n, + render: h => h(extramenu) +}).$mount('#index'); diff --git a/src/views/pages/extramenu/extramenu.vue b/src/views/pages/extramenu/extramenu.vue new file mode 100644 index 0000000000000000000000000000000000000000..c09a72162aed476860e0d6f3daa3784fadea5bf2 --- /dev/null +++ b/src/views/pages/extramenu/extramenu.vue @@ -0,0 +1,56 @@ + + diff --git a/src/views/pages/extramenu/router.js b/src/views/pages/extramenu/router.js new file mode 100644 index 0000000000000000000000000000000000000000..51e4d3e043f5d4f41dc493ae5c9829cf7de64c55 --- /dev/null +++ b/src/views/pages/extramenu/router.js @@ -0,0 +1,56 @@ +const refresh = () => import('@/views/pages/common/refresh.vue'); +const noAuthority = () => import('@/views/pages/common/no-authority.vue'); +const welcome = () => import('@/views/pages/common/welcome.vue'); +const detail = () => import('@/views/pages/extramenu/detail.vue'); +import { $t } from '@/resources/init.js'; + +export default [ + { + path: '/', + beforeEnter: (to, from, next) => { + let defaultPage = ''; + try { + const moduleList = JSON.parse(localStorage.getItem('moduleList')); + defaultPage = + moduleList.find(module => { + return module.moduleId === MODULEID; + }).defaultPage || '/welcome'; + } catch { + defaultPage = '/welcome'; + } + if (from.path === defaultPage) { + //通过跳转到中间路由,并立刻返回原路由,实现刷新路由页面的效果 + next({ name: 'refresh', replace: true, query: { path: defaultPage } }); + } else { + next({ path: defaultPage, replace: true }); + } + } + }, + { + path: '/refresh', + name: 'refresh', + component: refresh + }, + { + path: '/no-authority', + name: 'no-authority', + component: noAuthority, + meta: { + title: $t('router.common.pagenoexist') + } + }, + { + path: '/welcome', + name: 'welcome', + component: welcome + }, + { + path: '/detail', + name: 'detail', + component: detail, + meta: { + title: 'detail' + } + } + +]; diff --git a/src/views/pages/framework/extramenu/extramenu-detail.vue b/src/views/pages/framework/extramenu/extramenu-detail.vue new file mode 100644 index 0000000000000000000000000000000000000000..9b098209f115402ae86934b6aeaf252a6c223b77 --- /dev/null +++ b/src/views/pages/framework/extramenu/extramenu-detail.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/views/pages/framework/extramenu/extramenu-manage-bak.vue b/src/views/pages/framework/extramenu/extramenu-manage-bak.vue new file mode 100644 index 0000000000000000000000000000000000000000..7192b6ceeff8a8d58daa5d56a7682aedc7b322ab --- /dev/null +++ b/src/views/pages/framework/extramenu/extramenu-manage-bak.vue @@ -0,0 +1,595 @@ + + + diff --git a/src/views/pages/framework/extramenu/extramenu-manage.vue b/src/views/pages/framework/extramenu/extramenu-manage.vue index 7192b6ceeff8a8d58daa5d56a7682aedc7b322ab..7dca73edd627450e2d2d403a04fb050c7a6f4db0 100644 --- a/src/views/pages/framework/extramenu/extramenu-manage.vue +++ b/src/views/pages/framework/extramenu/extramenu-manage.vue @@ -1,595 +1,115 @@ @@ -122,8 +123,8 @@ export default { name: 'UserManage', components: { + CombineSearcher: () => import('@/resources/components/CombineSearcher/CombineSearcher.vue'), TsTable: () => import('@/resources/components/TsTable/TsTable'), - InputSearcher: () => import('@/resources/components/InputSearcher/InputSearcher.vue'), UserCard: () => import('@/resources/components/UserCard/UserCard.vue'), CommonAuth: () => import('./common/common-auth.vue') }, @@ -176,6 +177,7 @@ export default { tabledata: null, //table的正文数据 select: null, //选中哪些 vipLevel: null, //VIP等级 + isOnline: null, //是否在线 formSetting: [], //弹窗表单对应的数组 isImmediately: true, //立即授权 isBatch: false, //是否批量授权 @@ -193,7 +195,46 @@ export default { authGroup: '', auth: '', roleName: '' - } + }, + searchConfig: { + search: true, + placeholder: this.$t('form.placeholder.pleaseinput', { target: this.$t('page.keyword') }), + searchList: [ + { + type: 'radio', + dataList: [ + { + text: '是', + value: '1' + } + ], + name: 'vipLevel', + label: 'Vip', + transfer: true, + filterable: true, + allowToggle: true + }, + { + type: 'radio', + dataList: [ + { + text: '是', + value: '1' + }, + { + text: '否', + value: '0' + } + ], + name: 'isOnline', + label: '在线', + transfer: true, + filterable: true, + allowToggle: true + } + ] + }, + searchValue: {} }; }, created() {}, @@ -215,20 +256,18 @@ export default { this.vipLevel = this.vipLevel ? null : 1; this.getTable(); }, + changeIsOnline() { + this.isOnline = this.isOnline ? null : 1; + this.getTable(); + }, getTable() { this.loadingShow = true; - let data = { - keyword: this.keyword, - vipLevel: this.$AuthUtils.hasRole('VIP_VIEW') ? this.vipLevel : 0, - currentPage: this.searchParams.currentPage, - pageSize: this.searchParams.pageSize - }; - this.$addHistoryData('keyword', data.keyword); - this.$addHistoryData('vipLevel', data.vipLevel); - this.$addHistoryData('currentPage', data.currentPage); - this.$addHistoryData('pageSize', data.pageSize); + const param = { ...this.searchParams, ...this.searchValue }; + this.$addHistoryData('searchValue', this.searchValue); + this.$addHistoryData('searchParam', this.searchParam); + this.$api.framework.user - .searchUser(data) + .searchUser(param) .then(res => { if (res.Status == 'OK') { this.tabledata = res.Return; @@ -238,10 +277,12 @@ export default { }); }, restoreHistory(historyData) { - this.keyword = historyData['keyword']; - this.vipLevel = historyData['vipLevel']; - this.searchParams.currentPage = historyData['currentPage']; - this.searchParams.pageSize = historyData['pageSize']; + if (historyData['searchParam']) { + this.searchParam = historyData['searchParam']; + } + if (historyData['searchValue']) { + this.searchValue = historyData['searchValue']; + } }, getSelect(li, selection) { this.select = selection; @@ -325,6 +366,39 @@ export default { }); } }); + }, //删除 + deleteSession(row) { + let key = row instanceof Array; + let userUuidList = []; + if (key && row.length > 0) { + row.forEach(item => { + userUuidList.push(item.uuid); + }); + } else { + userUuidList = [row.uuid]; + } + let param = { + userUuidList: userUuidList + }; + let content = userUuidList.length > 1 ? this.$t('term.framework.suredeletesession', {target: this.$t('page.user') + ':' + row.map(r => { return r.userName; }).join('、')}) : key ? this.$t('term.framework.suredeletesession', {target: this.$t('page.user') + ':' + row[0].userName}) : this.$t('term.framework.suredeletesession', {target: this.$t('page.user') + ':' + row.userName}); + this.$createDialog({ + title: this.$t('term.framework.usersessiondeletetitle'), + content: content + '
' + this.$t('term.framework.usersessiondeletetip') + '', + btnType: 'error', + 'on-ok': vnode => { + this.$api.framework.user + .deleteUserSession(param) + .then(res => { + if (res && res.Status == 'OK') { + this.$Message.success(this.$t('message.executesuccess')); + vnode.isShow = false; + this.tabledata.currentPage = 1; + this.select = []; + this.getTable(); + } + }); + } + }); }, //获取用户组下拉列表 getUserList: function() { diff --git a/src/views/pages/process/flow/flowedit/components/nodesetting/authority-setting.vue b/src/views/pages/process/flow/flowedit/components/nodesetting/authority-setting.vue index b632e9db827969ba96bf7c51c595577bd17c9482..b794f3c53a51fa5e57bc6f462a40f2404043ba8b 100644 --- a/src/views/pages/process/flow/flowedit/components/nodesetting/authority-setting.vue +++ b/src/views/pages/process/flow/flowedit/components/nodesetting/authority-setting.vue @@ -23,15 +23,14 @@
-
{{ item.text }}
-
+ -
+
@@ -42,7 +41,8 @@ export default { name: 'AuthoritySetting', components: { TsFormSwitch: () => import('@/resources/plugins/TsForm/TsFormSwitch'), - UserSelect: () => import('@/resources/components/UserSelect/UserSelect') + UserSelect: () => import('@/resources/components/UserSelect/UserSelect'), + TsFormItem: () => import('@/resources/plugins/TsForm/TsFormItem') }, mixins: [itemmixin], props: { @@ -67,7 +67,10 @@ export default { data() { return { isActive: this.defaultIsActive, - authorityList: this.list + authorityList: this.list, + authorityTipMap: { + update: this.$t('term.process.flowauthuserupdatetip') + } }; }, beforeCreate() {}, diff --git a/src/views/pages/process/task/processdetail/workorder/common/button-bar.vue b/src/views/pages/process/task/processdetail/workorder/common/button-bar.vue index 4b28b7ec6b122d8befdea4af2b906dfc65115a9f..edbd3bfbe2007255fd0494f7895ed5134bd555a5 100644 --- a/src/views/pages/process/task/processdetail/workorder/common/button-bar.vue +++ b/src/views/pages/process/task/processdetail/workorder/common/button-bar.vue @@ -103,10 +103,16 @@ {{ actionConfig.copyprocesstask }} - - - {{ $t('dialog.title.edittarget',{'target':$t('page.form')}) }} - + + {{ $t('term.process.converttoknowdoc') }} @@ -171,7 +177,12 @@ @click="doBtnBarAction('redoTask')" >{{ getRedoText }} - + @@ -201,7 +212,8 @@ export default { isShowFormModal: false, isShowProcessTaskTopo: false, isShowTransfereoastep: false, - isShowReactivateStep: false + isShowReactivateStep: false, + isNeedFormSceneUuid: false //是否需要表单场景uuid }; }, beforeCreate() {}, @@ -218,7 +230,8 @@ export default { doBtnBarAction(actionName, ...args) { this.$emit('doAction', actionName, ...args); }, - editForm() { + editForm(isNeedFormSceneUuid) { + this.isNeedFormSceneUuid = isNeedFormSceneUuid; this.isShowFormModal = true; }, closeFormDialog() { diff --git a/src/views/pages/process/task/processdetail/workorder/common/form-edit-dialog.vue b/src/views/pages/process/task/processdetail/workorder/common/form-edit-dialog.vue index d6a104991fea85af7e55cde81a7ee8cde3e1351f..0fe63214c653575d2db7c105dd19a0b5be1a4bbb 100644 --- a/src/views/pages/process/task/processdetail/workorder/common/form-edit-dialog.vue +++ b/src/views/pages/process/task/processdetail/workorder/common/form-edit-dialog.vue @@ -9,14 +9,15 @@ @on-close="closeDialog" >