diff --git a/ant-design-vue-jeecg/README.md b/ant-design-vue-jeecg/README.md index 64a1c06690a88e175cf99bf773f6eb5060b483b4..e001cd0847f8cf1f067e6fcef2bdb5858cd815f9 100644 --- a/ant-design-vue-jeecg/README.md +++ b/ant-design-vue-jeecg/README.md @@ -1,13 +1,13 @@ Ant Design Jeecg Vue ==== -当前最新版本: 2.1.3(发布日期:20191226) +当前最新版本: 2.0.4(发布日期:20200224) Overview ---- 基于 [Ant Design of Vue](https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn/) 实现的 Ant Design Pro Vue 版 -Jeecg-boot 的前端UI框架,采用前后端分离框架,提供强大代码生成器的快速开发平台。 +Jeecg-boot 的前段UI框架,采用前后端分离方案,提供强大代码生成器的快速开发平台。 前端页面代码和后端功能代码一键生成,不需要写任何代码,保持jeecg一贯的强大!! diff --git a/ant-design-vue-jeecg/package.json b/ant-design-vue-jeecg/package.json index 26e2d650d79983441580850c3f5acc13c3c1fed6..92a4afe3d99dc72bfd48a8e050c12158569ed764 100644 --- a/ant-design-vue-jeecg/package.json +++ b/ant-design-vue-jeecg/package.json @@ -1,6 +1,6 @@ { "name": "vue-antd-jeecg", - "version": "2.1.3", + "version": "2.1.4", "private": true, "scripts": { "pre": "cnpm install || yarn --registry https://registry.npm.taobao.org || npm install --registry https://registry.npm.taobao.org ", @@ -10,7 +10,7 @@ }, "dependencies": { "@antv/data-set": "^0.10.2", - "@jeecg/antd-online-re": "2.1.3", + "@jeecg/antd-online-214": "^2.1.4", "@tinymce/tinymce-vue": "^2.0.0", "ant-design-vue": "^1.4.0", "apexcharts": "^3.6.5", @@ -24,7 +24,7 @@ "lodash.pick": "^4.4.0", "md5": "^2.2.1", "nprogress": "^0.2.0", - "tinymce": "^5.0.2", + "tinymce": "^5.1.4", "viser-vue": "^2.4.4", "vue": "^2.6.10", "vue-apexcharts": "^1.3.2", @@ -51,12 +51,12 @@ "babel-eslint": "^10.0.1", "eslint": "^5.16.0", "eslint-plugin-vue": "^5.1.0", + "html-webpack-plugin": "^4.0.0-beta.11", "less": "^3.9.0", "less-loader": "^4.1.0", "node-sass": "^4.11.0", "sass-loader": "^7.0.1", - "vue-template-compiler": "^2.6.10", - "html-webpack-plugin": "^4.0.0-beta.11" + "vue-template-compiler": "^2.6.10" }, "eslintConfig": { "root": true, diff --git a/ant-design-vue-jeecg/public/index.html b/ant-design-vue-jeecg/public/index.html index 532145fd9a7246e4fc5bac8c5da733800783224b..8982a460ecc0fb56253fa4c4f7d7fb7b7c15b955 100644 --- a/ant-design-vue-jeecg/public/index.html +++ b/ant-design-vue-jeecg/public/index.html @@ -5,9 +5,9 @@ - Jeecg-Boot 快速开发平台 + Jeecg-Boot 企业级快速开发平台 - + \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/components/jeecg/JImportModal.vue b/ant-design-vue-jeecg/src/components/jeecg/JImportModal.vue index 50df1c4d1db9f1048313e8ccad61d9c66822d9b9..d69f5964b23c6f6543d26f4bfc48400a38fa3ca1 100644 --- a/ant-design-vue-jeecg/src/components/jeecg/JImportModal.vue +++ b/ant-design-vue-jeecg/src/components/jeecg/JImportModal.vue @@ -42,6 +42,11 @@ type: String, default: '', required: false + }, + biz:{ + type: String, + default: '', + required: false } }, data(){ @@ -49,7 +54,8 @@ visible:false, uploading:false, fileList:[], - uploadAction:'' + uploadAction:'', + foreignKeys:'' } }, watch: { @@ -67,10 +73,11 @@ handleClose(){ this.visible=false }, - show(){ + show(arg){ this.fileList = [] this.uploading = false this.visible = true + this.foreignKeys = arg; }, handleRemove(file) { const index = this.fileList.indexOf(file); @@ -85,6 +92,12 @@ handleImport() { const { fileList } = this; const formData = new FormData(); + if(this.biz){ + formData.append('isSingleTableImport',this.biz); + } + if(this.foreignKeys && this.foreignKeys.length>0){ + formData.append('foreignKeys',this.foreignKeys); + } fileList.forEach((file) => { formData.append('files[]', file); }); diff --git a/ant-design-vue-jeecg/src/components/jeecg/JModal/index.vue b/ant-design-vue-jeecg/src/components/jeecg/JModal/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..b982131d0281a4ab0eebe230db58d4c4202cae19 --- /dev/null +++ b/ant-design-vue-jeecg/src/components/jeecg/JModal/index.vue @@ -0,0 +1,209 @@ + + + + + \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/components/jeecg/JSuperQuery.vue b/ant-design-vue-jeecg/src/components/jeecg/JSuperQuery.vue index 71610c1df98e4b9c132bdd9371903910cbfdc013..31066fec6f81d4256e47aaaa2dfb5aa2b8727e41 100644 --- a/ant-design-vue-jeecg/src/components/jeecg/JSuperQuery.vue +++ b/ant-design-vue-jeecg/src/components/jeecg/JSuperQuery.vue @@ -1,15 +1,22 @@ \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/components/tools/HeaderNotice.vue b/ant-design-vue-jeecg/src/components/tools/HeaderNotice.vue index b703d52e546a063b28978a1f08ab318cf8fdfba4..b298d4bbad65ce504c38b5c6771035a1a7eb0dab 100644 --- a/ant-design-vue-jeecg/src/components/tools/HeaderNotice.vue +++ b/ant-design-vue-jeecg/src/components/tools/HeaderNotice.vue @@ -72,6 +72,7 @@ + @@ -79,11 +80,13 @@ import { getAction,putAction } from '@/api/manage' import ShowAnnouncement from './ShowAnnouncement' import store from '@/store/' + import DynamicNotice from './DynamicNotice' export default { name: "HeaderNotice", components: { + DynamicNotice, ShowAnnouncement, }, data () { @@ -105,6 +108,8 @@ websock: null, lockReconnect:false, heartCheck:null, + formData:{}, + openPath:'' } }, computed:{ @@ -172,7 +177,13 @@ } }); this.hovered = false; - this.$refs.ShowAnnouncement.detail(record); + if(record.openType==='component'){ + this.openPath = record.openPage; + this.formData = {id:record.busId}; + this.$refs.showDynamNotice.detail(record.openPage); + }else{ + this.$refs.ShowAnnouncement.detail(record); + } }, toMyAnnouncement(){ diff --git a/ant-design-vue-jeecg/src/components/tools/ShowAnnouncement.vue b/ant-design-vue-jeecg/src/components/tools/ShowAnnouncement.vue index ee7f8fbd9a29ce50baf79a7b27ed9f001bd7cd54..0e7b6a67770e41b6a732d4ac2cb543da5394da19 100644 --- a/ant-design-vue-jeecg/src/components/tools/ShowAnnouncement.vue +++ b/ant-design-vue-jeecg/src/components/tools/ShowAnnouncement.vue @@ -5,11 +5,14 @@ :visible="visible" :bodyStyle ="bodyStyle" @cancel="handleCancel" - destroyOnClose - :footer="null"> + destroyOnClose> + diff --git a/ant-design-vue-jeecg/src/components/tools/UserMenu.vue b/ant-design-vue-jeecg/src/components/tools/UserMenu.vue index ec846efb992ee06af0c579d08f4dd76607bc28ac..6acc105aafbb25eb6a69f3ea8ff4cc20a0d24a5b 100644 --- a/ant-design-vue-jeecg/src/components/tools/UserMenu.vue +++ b/ant-design-vue-jeecg/src/components/tools/UserMenu.vue @@ -5,7 +5,8 @@ - + + - {{site.meta.title}} + {{site.meta.title}} - - + + + - + @@ -95,9 +100,11 @@ mixins: [mixinDevice], data(){ return{ - //菜单搜索 - search:[], - shows:false + // update-begin author:sunjianlei date:20200219 for: 头部菜单搜索规范命名 -------------- + searchMenuOptions:[], + searchMenuComp: 'span', + searchMenuVisible: false, + // update-begin author:sunjianlei date:20200219 for: 头部菜单搜索规范命名 -------------- } }, components: { @@ -116,10 +123,8 @@ /* update_begin author:zhaoxin date:20191129 for: 做头部菜单栏导航*/ created() { let lists = [] - console.log("permissionMenuList: ",this.permissionMenuList) this.searchMenus(lists,this.permissionMenuList) - this.search=[...lists] - console.log(this.search) + this.searchMenuOptions=[...lists] }, computed: { ...mapState({ @@ -129,10 +134,21 @@ }) }, /* update_end author:zhaoxin date:20191129 for: 做头部菜单栏导航*/ + watch: { + // update-begin author:sunjianlei date:20200219 for: 菜单搜索改为动态组件,在手机端呈现出弹出框 + device: { + immediate: true, + handler() { + this.searchMenuVisible = false + this.searchMenuComp = this.isMobile() ? 'a-modal' : 'span' + }, + }, + // update-end author:sunjianlei date:20200219 for: 菜单搜索改为动态组件,在手机端呈现出弹出框 + }, methods: { /* update_begin author:zhaoxin date:20191129 for: 做头部菜单栏导航*/ - showClick(){ - this.shows = !this.shows + showClick() { + this.searchMenuVisible = true }, hiddenClick(){ this.shows = false @@ -141,8 +157,8 @@ ...mapActions(["Logout"]), ...mapGetters(["nickname", "avatar","userInfo"]), getAvatar(){ - console.log('url = '+ window._CONFIG['imgDomainURL']+"/"+this.avatar()) - return window._CONFIG['imgDomainURL']+"/"+this.avatar() + console.log('url = '+ window._CONFIG['staticDomainURL']+"/"+this.avatar()) + return window._CONFIG['staticDomainURL']+"/"+this.avatar() }, handleLogout() { const that = this @@ -189,10 +205,17 @@ filterOption(input, option) { return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0 }, - searchMethods(value){ - let jump = this.search.filter(item=>item.id==value) - this.$router.push({ path:jump[0].path}) + // update_begin author:sunjianlei date:20191230 for: 解决外部链接打开失败的问题 + searchMethods(value) { + let route = this.searchMenuOptions.filter(item => item.id === value)[0] + if (route.meta.internalOrExternal === true || route.component.includes('layouts/IframePageView')) { + window.open(route.meta.url, '_blank') + } else { + this.$router.push({ path: route.path }) + } + this.searchMenuVisible = false } + // update_end author:sunjianlei date:20191230 for: 解决外部链接打开失败的问题 /*update_end author:zhaoxin date:20191129 for: 做头部菜单栏导航*/ } } @@ -203,7 +226,7 @@ /* update-begin author:sunjianlei date:20191220 for: 解决全局样式冲突问题 */ .user-wrapper .search-input { width: 180px; - color: white; + color: inherit; /deep/ { .ant-select-selection { diff --git a/ant-design-vue-jeecg/src/main.js b/ant-design-vue-jeecg/src/main.js index 2ea3f91714c6d60e7292966f5f3a42a7fe24102b..186beec59b9e5af14c937d8782dc44679e7ab23e 100644 --- a/ant-design-vue-jeecg/src/main.js +++ b/ant-design-vue-jeecg/src/main.js @@ -18,8 +18,8 @@ import VueApexCharts from 'vue-apexcharts' import preview from 'vue-photo-preview' import 'vue-photo-preview/dist/skin.css' -import "@jeecg/antd-online-re" -import '@jeecg/antd-online-re/dist/OnlineForm.css' +import "@jeecg/antd-online-214" +import '@jeecg/antd-online-214/dist/OnlineForm.css' import { ACCESS_TOKEN, diff --git a/ant-design-vue-jeecg/src/mixins/JeecgListMixin.js b/ant-design-vue-jeecg/src/mixins/JeecgListMixin.js index 4333b22a5c2df884b43ec1e7d2e201a70f78b49a..855babaf35a33877fc6ba2f5ab52adca44c6b74d 100644 --- a/ant-design-vue-jeecg/src/mixins/JeecgListMixin.js +++ b/ant-design-vue-jeecg/src/mixins/JeecgListMixin.js @@ -236,9 +236,9 @@ export const JeecgListMixin = { return } if (typeof window.navigator.msSaveBlob !== 'undefined') { - window.navigator.msSaveBlob(new Blob([data]), fileName+'.xls') + window.navigator.msSaveBlob(new Blob([data],{type: 'application/vnd.ms-excel'}), fileName+'.xls') }else{ - let url = window.URL.createObjectURL(new Blob([data])) + let url = window.URL.createObjectURL(new Blob([data],{type: 'application/vnd.ms-excel'})) let link = document.createElement('a') link.style.display = 'none' link.href = url @@ -286,7 +286,7 @@ export const JeecgListMixin = { if(text && text.indexOf(",")>0){ text = text.substring(0,text.indexOf(",")) } - return window._CONFIG['imgDomainURL']+"/"+text + return window._CONFIG['staticDomainURL']+"/"+text }, /* 文件下载 */ uploadFile(text){ @@ -297,7 +297,7 @@ export const JeecgListMixin = { if(text.indexOf(",")>0){ text = text.substring(0,text.indexOf(",")) } - window.open(window._CONFIG['domianURL'] + "/sys/common/download/"+text); + window.open(window._CONFIG['staticDomainURL']+ "/"+text); }, } diff --git a/ant-design-vue-jeecg/src/mixins/OnlAutoListMixin.js b/ant-design-vue-jeecg/src/mixins/OnlAutoListMixin.js new file mode 100644 index 0000000000000000000000000000000000000000..7c94140eecf08486fcfd81a778c374953d87d5f1 --- /dev/null +++ b/ant-design-vue-jeecg/src/mixins/OnlAutoListMixin.js @@ -0,0 +1,78 @@ +export const HrefJump = { + data() { + return { + fieldHrefSlots: [], + hrefComponent: { + model: { + title: '', + width: '100%', + visible: false, + destroyOnClose: true, + style: { + top: 0, + left: 0, + height: '100%', + margin: 0, + padding: 0 + }, + bodyStyle: { padding: '8px', height: 'calc(100vh - 108px)', overflow: 'auto', overflowX: 'hidden' }, + // 隐藏掉取消按钮 + cancelButtonProps: { style: { display: 'none' } }, + afterClose: () => { + // 恢复body的滚动 + document.body.style.overflow = null + } + }, + on: { + ok: () => this.hrefComponent.model.visible = false, + cancel: () => this.hrefComponent.model.visible = false + }, + is: null, + params: {}, + } + } + }, + methods: { + //支持链接href跳转 + handleClickFieldHref(field, record) { + let href = field.href + let urlPattern = /(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?/ + let compPattern = /\.vue(\?.*)?$/ + if (typeof href === 'string') { + href = href.trim().replace(/\${([^}]+)?}/g, (s1, s2) => record[s2]) + if (urlPattern.test(href)) { + window.open(href, '_blank') + } else if (compPattern.test(href)) { + this.openHrefCompModal(href) + } else { + this.$router.push(href) + } + } + }, + openHrefCompModal(href) { + // 解析 href 参数 + let index = href.indexOf('?') + let path = href + if (index !== -1) { + path = href.substring(0, index) + let paramString = href.substring(index + 1, href.length) + let paramArray = paramString.split('&') + let params = {} + paramArray.forEach(paramObject => { + let paramItem = paramObject.split('=') + params[paramItem[0]] = paramItem[1] + }) + this.hrefComponent.params = params + } else { + this.hrefComponent.params = {} + } + this.hrefComponent.model.visible = true + this.hrefComponent.model.title = '@/views/' + path + this.hrefComponent.is = () => import('@/views/' + (path.startsWith('/')?path.slice(1):path)) + // 禁止body滚动,防止滚动穿透 + setTimeout(() => { + document.body.style.overflow = 'hidden' + }, 300) + }, + } +} \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/store/modules/user.js b/ant-design-vue-jeecg/src/store/modules/user.js index c81403507a493f51103b100666a31822faba28eb..8e6617f738c5279ec8817826eb6b39eb0e6fb11b 100644 --- a/ant-design-vue-jeecg/src/store/modules/user.js +++ b/ant-design-vue-jeecg/src/store/modules/user.js @@ -120,6 +120,19 @@ const user = { sessionStorage.setItem(USER_AUTH,JSON.stringify(authData)); sessionStorage.setItem(SYS_BUTTON_AUTH,JSON.stringify(allAuthData)); if (menuData && menuData.length > 0) { + //update--begin--autor:qinfeng-----date:20200109------for:JEECG-63 一级菜单的子菜单全部是隐藏路由,则一级菜单不显示------ + menuData.forEach((item, index) => { + if (item["children"]) { + let hasChildrenMenu = item["children"].filter((i) => { + return !i.hidden || i.hidden == false + }) + if (hasChildrenMenu == null || hasChildrenMenu.length == 0) { + item["hidden"] = true + } + } + }) + console.log(" menu show json ", menuData) + //update--end--autor:qinfeng-----date:20200109------for:JEECG-63 一级菜单的子菜单全部是隐藏路由,则一级菜单不显示------ commit('SET_PERMISSIONLIST', menuData) } else { reject('getPermissionList: permissions must be a non-null array !') diff --git a/ant-design-vue-jeecg/src/utils/authFilter.js b/ant-design-vue-jeecg/src/utils/authFilter.js index c4c4183a000edd54686ac4100c63d606677089b9..ed5aa350e8f2ca6d3d4d83021dc0b65de997980d 100644 --- a/ant-design-vue-jeecg/src/utils/authFilter.js +++ b/ant-design-vue-jeecg/src/utils/authFilter.js @@ -1,4 +1,3 @@ - import { USER_AUTH,SYS_BUTTON_AUTH } from "@/store/mutation-types" export function disabledAuthFilter(code,formData) { @@ -10,27 +9,30 @@ export function disabledAuthFilter(code,formData) { } function nodeDisabledAuth(code,formData){ - console.log("页面权限禁用--NODE--开始"); - var permissionList = []; + let permissionList = []; try { - var obj = formData; //console.log("页面权限禁用--NODE--开始",obj); - if (obj) { - let bpmList = obj.permissionList; - for (var bpm of bpmList) { - if(bpm.type == '2') { - permissionList.push(bpm); - } - } + if (formData) { + let bpmList = formData.permissionList; + permissionList = bpmList.filter(item=>item.type=='2') + // for (let bpm of bpmList) { + // if(bpm.type == '2') { + // permissionList.push(bpm); + // } + // } + }else{ + return false; } } catch (e) { //console.log("页面权限异常----", e); } - if (permissionList === null || permissionList === "" || permissionList === undefined||permissionList.length<=0) { + if (permissionList.length == 0) { return false; } + + console.log("流程节点页面权限禁用--NODE--开始"); let permissions = []; - for (var item of permissionList) { + for (let item of permissionList) { if(item.type == '2') { permissions.push(item.action); } @@ -39,9 +41,9 @@ function nodeDisabledAuth(code,formData){ if (!permissions.includes(code)) { return false; }else{ - for (var item2 of permissionList) { + for (let item2 of permissionList) { if(code === item2.action){ - console.log("页面权限禁用--NODE--生效"); + console.log("流程节点页面权限禁用--NODE--生效"); return true; } } @@ -50,21 +52,21 @@ function nodeDisabledAuth(code,formData){ } function globalDisabledAuth(code){ - console.log("页面禁用权限--Global--开始"); + //console.log("全局页面禁用权限--Global--开始"); var permissionList = []; var allPermissionList = []; //let authList = Vue.ls.get(USER_AUTH); let authList = JSON.parse(sessionStorage.getItem(USER_AUTH) || "[]"); - for (var auth of authList) { + for (let auth of authList) { if(auth.type == '2') { permissionList.push(auth); } } //console.log("页面禁用权限--Global--",sessionStorage.getItem(SYS_BUTTON_AUTH)); let allAuthList = JSON.parse(sessionStorage.getItem(SYS_BUTTON_AUTH) || "[]"); - for (var gauth of allAuthList) { + for (let gauth of allAuthList) { if(gauth.type == '2') { allPermissionList.push(gauth); } @@ -73,7 +75,7 @@ function globalDisabledAuth(code){ var gFlag = false;//禁用命中 var invalidFlag = false;//无效命中 if(allPermissionList != null && allPermissionList != "" && allPermissionList != undefined && allPermissionList.length > 0){ - for (var itemG of allPermissionList) { + for (let itemG of allPermissionList) { if(code === itemG.action){ if(itemG.status == '0'){ invalidFlag = true; @@ -92,7 +94,7 @@ function globalDisabledAuth(code){ return gFlag; } let permissions = []; - for (var item of permissionList) { + for (let item of permissionList) { if(item.type == '2') { permissions.push(item.action); } @@ -101,9 +103,9 @@ function globalDisabledAuth(code){ if (!permissions.includes(code)) { return gFlag; }else{ - for (var item2 of permissionList) { + for (let item2 of permissionList) { if(code === item2.action){ - console.log("页面权限解除禁用--Global--生效"); + console.log("全局页面权限解除禁用--Global--生效"); gFlag = false; } } @@ -134,12 +136,12 @@ function hasColoum(item,authList){ //权限无效时不做控制,有效时控制,只能控制 显示不显示 //根据授权码前缀获取未授权的列信息 function getNoAuthCols(pre){ - var permissionList = []; - var allPermissionList = []; + let permissionList = []; + let allPermissionList = []; //let authList = Vue.ls.get(USER_AUTH); let authList = JSON.parse(sessionStorage.getItem(USER_AUTH) || "[]"); - for (var auth of authList) { + for (let auth of authList) { //显示策略,有效状态 if(auth.type == '1'&&startWith(auth.action,pre)) { permissionList.push(substrPre(auth.action,pre)); @@ -147,7 +149,7 @@ function getNoAuthCols(pre){ } //console.log("页面禁用权限--Global--",sessionStorage.getItem(SYS_BUTTON_AUTH)); let allAuthList = JSON.parse(sessionStorage.getItem(SYS_BUTTON_AUTH) || "[]"); - for (var gauth of allAuthList) { + for (let gauth of allAuthList) { //显示策略,有效状态 if(gauth.type == '1'&&gauth.status == '1'&&startWith(gauth.action,pre)) { allPermissionList.push(substrPre(gauth.action,pre)); diff --git a/ant-design-vue-jeecg/src/utils/commonUploadFile.js b/ant-design-vue-jeecg/src/utils/commonUploadFile.js index 4c5ab5b698cabd481eb44783bd91083fe42b677f..d4632e2de1d73822f87310d5f37ba343d24c5dce 100644 --- a/ant-design-vue-jeecg/src/utils/commonUploadFile.js +++ b/ant-design-vue-jeecg/src/utils/commonUploadFile.js @@ -38,7 +38,7 @@ const getUploadFileList=(paths)=>{ uid:uidGenerator(), name:getFileName(arr[a]), status: 'done', - url: window._CONFIG['domianURL']+"/sys/common/view/"+arr[a], + url: window._CONFIG['staticDomainURL']+"/"+arr[a], response:{ status:"history", message:arr[a] diff --git a/ant-design-vue-jeecg/src/utils/hasPermission.js b/ant-design-vue-jeecg/src/utils/hasPermission.js index e8cb5cfcb71be0ed63f69ef8a67c2d7801d2fb92..860a0a8ab2804179baa4fc47ade0976f594af661 100644 --- a/ant-design-vue-jeecg/src/utils/hasPermission.js +++ b/ant-design-vue-jeecg/src/utils/hasPermission.js @@ -2,35 +2,37 @@ import { USER_AUTH,SYS_BUTTON_AUTH } from "@/store/mutation-types" const hasPermission = { install (Vue, options) { - console.log(options); + //console.log(options); Vue.directive('has', { inserted: (el, binding, vnode)=>{ - console.log("页面权限控制----"); + //console.log("页面权限控制----"); + console.time() //节点权限处理,如果命中则不进行全局权限处理 if(!filterNodePermission(el, binding, vnode)){ filterGlobalPermission(el, binding, vnode); } + console.timeEnd() //计时结束并输出时长 } }); } }; /** - * 全局权限控制 + * 流程节点权限控制 */ export function filterNodePermission(el, binding, vnode) { - console.log("页面权限--NODE--"); - - var permissionList = []; + let permissionList = []; try { - var obj = vnode.context.$props.formData; + let obj = vnode.context.$props.formData; if (obj) { let bpmList = obj.permissionList; - for (var bpm of bpmList) { + for (let bpm of bpmList) { if(bpm.type != '2') { permissionList.push(bpm); } } + }else{ + return false; } } catch (e) { //console.log("页面权限异常----", e); @@ -39,8 +41,10 @@ export function filterNodePermission(el, binding, vnode) { //el.parentNode.removeChild(el) return false; } + + console.log("流程节点页面权限--NODE--"); let permissions = []; - for (var item of permissionList) { + for (let item of permissionList) { if(item.type != '2') { permissions.push(item.action); } @@ -51,7 +55,7 @@ export function filterNodePermission(el, binding, vnode) { //el.parentNode.removeChild(el) return false; }else{ - for (var item2 of permissionList) { + for (let item2 of permissionList) { if(binding.value === item2.action){ return true; } @@ -64,29 +68,29 @@ export function filterNodePermission(el, binding, vnode) { * 全局权限控制 */ export function filterGlobalPermission(el, binding, vnode) { - console.log("页面权限--Global--"); + console.log("全局页面权限--Global--"); - var permissionList = []; - var allPermissionList = []; + let permissionList = []; + let allPermissionList = []; //let authList = Vue.ls.get(USER_AUTH); let authList = JSON.parse(sessionStorage.getItem(USER_AUTH) || "[]"); - for (var auth of authList) { + for (let auth of authList) { if(auth.type != '2') { permissionList.push(auth); } } //console.log("页面权限--Global--",sessionStorage.getItem(SYS_BUTTON_AUTH)); let allAuthList = JSON.parse(sessionStorage.getItem(SYS_BUTTON_AUTH) || "[]"); - for (var gauth of allAuthList) { + for (let gauth of allAuthList) { if(gauth.type != '2') { allPermissionList.push(gauth); } } //设置全局配置是否有命中 - var invalidFlag = false;//无效命中 + let invalidFlag = false;//无效命中 if(allPermissionList != null && allPermissionList != "" && allPermissionList != undefined && allPermissionList.length > 0){ - for (var itemG of allPermissionList) { + for (let itemG of allPermissionList) { if(binding.value === itemG.action){ if(itemG.status == '0'){ invalidFlag = true; @@ -103,7 +107,7 @@ export function filterGlobalPermission(el, binding, vnode) { return; } let permissions = []; - for (var item of permissionList) { + for (let item of permissionList) { if(item.type != '2'){ permissions.push(item.action); } diff --git a/ant-design-vue-jeecg/src/utils/request.js b/ant-design-vue-jeecg/src/utils/request.js index 5fd05c51e56365a4ec77f748a336a515e05656c1..56fa57845bb540f8cf3c9b4e15493518db40f6ac 100644 --- a/ant-design-vue-jeecg/src/utils/request.js +++ b/ant-design-vue-jeecg/src/utils/request.js @@ -5,9 +5,16 @@ import { VueAxios } from './axios' import {Modal, notification} from 'ant-design-vue' import { ACCESS_TOKEN } from "@/store/mutation-types" +//自动设置后台服务 baseURL (也可以手工指定写死项目名字) +let baseDomain = window._CONFIG['domianURL']; +let baseProject = baseDomain.substring(baseDomain.lastIndexOf("/")); +console.log("baseDomain= ",baseDomain) +console.log("baseProject= ",baseProject) + // 创建 axios 实例 const service = axios.create({ - baseURL: '/jeecg-boot', // api base_url + //baseURL: '/jeecg-boot', + baseURL: baseProject, // api base_url timeout: 9000 // 请求超时时间 }) diff --git a/ant-design-vue-jeecg/src/utils/util.js b/ant-design-vue-jeecg/src/utils/util.js index 73445faab1c65b8a5ffaa38de0c906b249861885..20418f0d93acbc97060b9181fa0c434f07a9e77c 100644 --- a/ant-design-vue-jeecg/src/utils/util.js +++ b/ant-design-vue-jeecg/src/utils/util.js @@ -257,6 +257,62 @@ export function cssExpand(css, id) { document.head.appendChild(style) } + +/** 用于js增强事件,运行JS代码,可以传参 */ +// options 所需参数: +// 参数名 类型 说明 +// vm VueComponent vue实例 +// event Object event对象 +// jsCode String 待执行的js代码 +// errorMessage String 执行出错后的提示(控制台) +export function jsExpand(options = {}) { + + // 绑定到window上的keyName + let windowKeyName = 'J_CLICK_EVENT_OPTIONS' + if (typeof window[windowKeyName] != 'object') { + window[windowKeyName] = {} + } + + // 随机生成JS增强的执行id,防止冲突 + let id = randomString(16, 'qwertyuioplkjhgfdsazxcvbnm'.toUpperCase()) + // 封装按钮点击事件 + let code = ` + (function (o_${id}) { + try { + (function (globalEvent, vm) { + ${options.jsCode} + })(o_${id}.event, o_${id}.vm) + } catch (e) { + o_${id}.error(e) + } + o_${id}.done() + })(window['${windowKeyName}']['EVENT_${id}']) + ` + // 创建script标签 + const script = document.createElement('script') + // 将需要传递的参数挂载到window对象上 + window[windowKeyName]['EVENT_' + id] = { + vm: options.vm, + event: options.event, + // 当执行完成时,无论如何都会调用的回调事件 + done() { + // 执行完后删除新增的 script 标签不会撤销执行结果(已产生的结果不会被撤销) + script.outerHTML = '' + delete window[windowKeyName]['EVENT_' + id] + }, + // 当js运行出错的时候调用的事件 + error(e) { + console.group(`${options.errorMessage || '用户自定义JS增强代码运行出错'}(${new Date()})`) + console.error(e) + console.groupEnd() + } + } + // 将事件挂载到document中 + script.innerHTML = code + document.body.appendChild(script) +} + + /** * 重复值验证工具方法 * @@ -270,12 +326,39 @@ export function cssExpand(css, id) { * @param callback */ export function validateDuplicateValue(tableName, fieldName, fieldVal, dataId, callback) { - let params = { tableName, fieldName, fieldVal, dataId } - api.duplicateCheck(params).then(res => { - res['success'] ? callback() : callback(res['message']) - }).catch(err => { - callback(err.message || err) - }) + if (fieldVal) { + let params = { tableName, fieldName, fieldVal, dataId } + api.duplicateCheck(params).then(res => { + res['success'] ? callback() : callback(res['message']) + }).catch(err => { + callback(err.message || err) + }) + } else { + callback() + } +} + +/** + * 根据编码校验规则code,校验传入的值是否合法 + * + * 使用示例: + * { validator: (rule, value, callback) => validateCheckRule('common', value, callback) } + * + * @param ruleCode 编码校验规则 code + * @param value 被验证的值 + * @param callback + */ +export function validateCheckRule(ruleCode, value, callback) { + if (ruleCode && value) { + value = encodeURIComponent(value) + api.checkRuleByCode({ ruleCode, value }).then(res => { + res['success'] ? callback() : callback(res['message']) + }).catch(err => { + callback(err.message || err) + }) + } else { + callback() + } } /** @@ -295,4 +378,40 @@ export function pushIfNotExist(array, value, key) { } array.push(value) return true +} + +/** + * 可用于判断是否成功 + * @type {symbol} + */ +export const succeedSymbol = Symbol() +/** + * 可用于判断是否失败 + * @type {symbol} + */ +export const failedSymbol = Symbol() + +/** + * 使 promise 无论如何都会 resolve,除非传入的参数不是一个Promise对象或返回Promise对象的方法 + * 一般用在 Promise.all 中 + * + * @param promise 可传Promise对象或返回Promise对象的方法 + * @returns {Promise} + */ +export function alwaysResolve(promise) { + return new Promise((resolve, reject) => { + let p = promise + if (typeof promise === 'function') { + p = promise() + } + if (p instanceof Promise) { + p.then(data => { + resolve({ type: succeedSymbol, data }) + }).catch(error => { + resolve({ type: failedSymbol, error }) + }) + } else { + reject('alwaysResolve: 传入的参数不是一个Promise对象或返回Promise对象的方法') + } + }) } \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/account/center/Index.vue b/ant-design-vue-jeecg/src/views/account/center/Index.vue index 3658dc6e57a1ccde16c30b99338732201f1a867a..09edddad9bb6ae4d87b8c74ab5e3cb7d71c66b18 100644 --- a/ant-design-vue-jeecg/src/views/account/center/Index.vue +++ b/ant-design-vue-jeecg/src/views/account/center/Index.vue @@ -133,7 +133,7 @@ methods: { ...mapGetters(["nickname", "avatar"]), getAvatar(){ - return window._CONFIG['imgDomainURL']+"/"+this.avatar(); + return window._CONFIG['staticDomainURL']+"/"+this.avatar(); }, getTeams() { this.$http.get('/api/workplace/teams') diff --git a/ant-design-vue-jeecg/src/views/dashboard/IndexChart.vue b/ant-design-vue-jeecg/src/views/dashboard/IndexChart.vue index ca3f6c7f752708df473ca29fd567206d7f22816e..1621e6e3935be4a0cc84c30bf7f7429320a8184a 100644 --- a/ant-design-vue-jeecg/src/views/dashboard/IndexChart.vue +++ b/ant-design-vue-jeecg/src/views/dashboard/IndexChart.vue @@ -20,14 +20,14 @@ - +
- +
@@ -85,7 +85,7 @@ - + @@ -101,10 +101,10 @@ - + - + @@ -112,7 +112,7 @@ - + @@ -120,7 +120,7 @@ - + diff --git a/ant-design-vue-jeecg/src/views/dashboard/Workplace.vue b/ant-design-vue-jeecg/src/views/dashboard/Workplace.vue index 96c764b91642789a8ab40a5912ed40046a50e373..10040f7602aed8138a02eac8bea5ba1cd231334b 100644 --- a/ant-design-vue-jeecg/src/views/dashboard/Workplace.vue +++ b/ant-design-vue-jeecg/src/views/dashboard/Workplace.vue @@ -185,7 +185,7 @@ }, created() { this.user = this.userInfo - this.avatar = window._CONFIG['imgDomainURL'] +"/"+ this.userInfo.avatar + this.avatar = window._CONFIG['staticDomainURL'] +"/"+ this.userInfo.avatar console.log('this.avatar :'+ this.avatar) getRoleList().then(res => { diff --git a/ant-design-vue-jeecg/src/views/jeecg/SelectDemo.vue b/ant-design-vue-jeecg/src/views/jeecg/SelectDemo.vue index 21030fd25102f4e3ce27a43ea80af67ffd4dae0c..cfc787d353b43ace1ad12e5d55e5d9aafcad6b79 100644 --- a/ant-design-vue-jeecg/src/views/jeecg/SelectDemo.vue +++ b/ant-design-vue-jeecg/src/views/jeecg/SelectDemo.vue @@ -9,7 +9,7 @@ - + @@ -176,34 +176,28 @@ - - 最大化弹窗 + + 点击弹出JModal + 全屏化: + 允许切换全屏: + 锁定Body滚动: + - - - + - + @@ -217,10 +211,10 @@ - + - + 选中的值(v-model):{{ formData.treeDict }} @@ -262,6 +256,45 @@ + + + + + + + + + + + + + + + 高级查询 + + + + + + + + + + + 选中的值(v-model):{{ imgList }} + + + + + + + + + 选中的值(v-model): + + + + @@ -286,10 +319,15 @@ import JTreeDict from "../../components/jeecg/JTreeDict.vue"; import JCron from "@/components/jeecg/JCron.vue"; import JTreeSelect from '@/components/jeecg/JTreeSelect' + import JSuperQuery from '@/components/jeecg/JSuperQuery' + import JUpload from '@/components/jeecg/JUpload' + import JImageUpload from '@/components/jeecg/JImageUpload' export default { name: 'SelectDemo', components: { + JImageUpload, + JUpload, JTreeDict, JDictSelectTag, JSelectDepart, @@ -299,7 +337,7 @@ JCheckbox, JCodeEditor, JDate, JEditor, JEllipsis, JGraphicCode, JSlider, JSelectMultiple, - JCron, JTreeSelect + JCron, JTreeSelect, JSuperQuery }, data() { return { @@ -352,11 +390,20 @@ sayHi('hello, world!')` modal: { title: '这里是标题', visible: false, - width: '100%', - style: { top: '20px' }, - fullScreen: true + lockScroll: true, + fullscreen: true, + switchFullscreen: true, }, cron: '', + superQuery: { + fieldList: [ + { type: 'input', value: 'name', text: '姓名', }, + { type: 'select', value: 'sex', text: '性别', dictCode: 'sex' }, + { type: 'number', value: 'age', text: '年龄', } + ] + }, + fileList:[], + imgList:[], } }, computed: { @@ -399,18 +446,6 @@ sayHi('hello, world!')` handleJSliderSuccess(value) { this.jslider.value = value }, - /** 切换全屏显示 */ - handleClickToggleFullScreen() { - let mode = !this.modal.fullScreen - if (mode) { - this.modal.width = '100%' - this.modal.style.top = '20px' - } else { - this.modal.width = '1200px' - this.modal.style.top = '50px' - } - this.modal.fullScreen = mode - }, setCorn(data){ this.$nextTick(() => { this.form.cronExpression = data; diff --git a/ant-design-vue-jeecg/src/views/jeecg/helloworld.vue b/ant-design-vue-jeecg/src/views/jeecg/helloworld.vue index 31a8dbcc53a506a55052ca00dcc030ae6cb65aac..1a3ec195b8fe61842bb41362ebaa768ef1b15ead 100644 --- a/ant-design-vue-jeecg/src/views/jeecg/helloworld.vue +++ b/ant-design-vue-jeecg/src/views/jeecg/helloworld.vue @@ -19,11 +19,13 @@ - - - Submit - - + + + + Submit + + +
@@ -68,4 +70,4 @@ }) } } - + \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/jeecg/modules/JeecgDemoModal.vue b/ant-design-vue-jeecg/src/views/jeecg/modules/JeecgDemoModal.vue index f4c7ef440f90031bf238569dbc1599922ebc7606..7d4658d1ccce014019c2282779389d3de09e6b81 100644 --- a/ant-design-vue-jeecg/src/views/jeecg/modules/JeecgDemoModal.vue +++ b/ant-design-vue-jeecg/src/views/jeecg/modules/JeecgDemoModal.vue @@ -35,12 +35,13 @@ - - 请选择性别 - 男性 - 女性 - + label="性别"> + + - + 按年统计 diff --git a/ant-design-vue-jeecg/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue b/ant-design-vue-jeecg/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue index 1b9cdb824a43c1707fab2712db05bc4f50733670..cce54ea67228130d14256a6e834e13b59a4c2ff8 100644 --- a/ant-design-vue-jeecg/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue +++ b/ant-design-vue-jeecg/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue @@ -43,24 +43,7 @@ :wrapperCol="wrapperCol" label="身份证扫描件" hasFeedback> - - - - upload - - - - example - - -
+
{ this.form.setFieldsValue(pick(this.model, 'id', 'name', 'sex', 'idcard','telphone', 'orderId', 'createBy', 'createTime', 'updateBy', 'updateTime')) }); + setTimeout(() => { + this.fileList = record.idcardPic + }, 5) } else { this.addStatus = false; this.editStatus = true; @@ -262,7 +246,7 @@ let formData = Object.assign(this.model, values); console.log(formData); formData.orderId = this.orderId; - formData.idcardPic = getFilePaths(this.fileList) + formData.idcardPic = this.fileList; httpAction(httpurl, formData, method).then((res) => { if (res.success) { that.$message.success(res.message); diff --git a/ant-design-vue-jeecg/src/views/modules/online/cgform/OnlCgformCopyList.vue b/ant-design-vue-jeecg/src/views/modules/online/cgform/OnlCgformCopyList.vue index bfe9249f799eb728f56e53e9813fd03efd026fcd..44d776a472cc1a34dba4ec38e1b0a08624271555 100644 --- a/ant-design-vue-jeecg/src/views/modules/online/cgform/OnlCgformCopyList.vue +++ b/ant-design-vue-jeecg/src/views/modules/online/cgform/OnlCgformCopyList.vue @@ -6,13 +6,13 @@ - + - + 查询 重置 @@ -25,10 +25,10 @@
- 自定义按钮 - JS增强 - SQL增强 - Java增强 + 自定义按钮 + JS增强 + SQL增强 + Java增强 @@ -37,7 +37,7 @@ 删除 - 批量操作 + 批量操作 @@ -348,6 +348,9 @@ } } + \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/modules/online/cgform/util/TableUtils.js b/ant-design-vue-jeecg/src/views/modules/online/cgform/util/TableUtils.js index 782ad840d7ba31d699905590a6fe0c97461bd419..5d6cfc1bdaaf2709603bc74f2067f6d0968e73e0 100644 --- a/ant-design-vue-jeecg/src/views/modules/online/cgform/util/TableUtils.js +++ b/ant-design-vue-jeecg/src/views/modules/online/cgform/util/TableUtils.js @@ -109,6 +109,7 @@ export function getMasterTableInitialData() { // table2 isShowForm: '0', isShowList: '0', + isReadOnly: '1', fieldShowType: 'text', fieldLength: '120', queryMode: 'single', diff --git a/ant-design-vue-jeecg/src/views/modules/oss/OSSFileList.vue b/ant-design-vue-jeecg/src/views/modules/oss/OSSFileList.vue index 58d216071342eecbdb064543bb15075cf9550ed4..7a5729f355981440e8f696127a20729c508b3652 100644 --- a/ant-design-vue-jeecg/src/views/modules/oss/OSSFileList.vue +++ b/ant-design-vue-jeecg/src/views/modules/oss/OSSFileList.vue @@ -31,7 +31,21 @@ @change="handleChange"> - 文件上传 + OSS文件上传 + + + + + + + MINIO文件上传
@@ -58,7 +72,9 @@ @change="handleTableChange"> - 删除 + 预览 + + 删除 @@ -108,14 +124,18 @@ url: { upload: "/oss/file/upload", list: "/oss/file/list", - delete: "/oss/file/delete" + delete: "/oss/file/delete", + minioUpload: "/sys/upload/uploadMinio" } } }, computed: { uploadAction() { return window._CONFIG['domianURL'] + this.url.upload; - } + }, + minioUploadAction() { + return window._CONFIG['domianURL'] + this.url.minioUpload; + }, }, methods: { beforeUpload(file) { @@ -139,10 +159,10 @@ this.loadData() this.$message.success(`${info.file.name} 上传成功!`); } else { - this.$message.error(`${info.file.name} 上传失败.`); + this.$message.error(`${info.file.response.message}`); } } else if (info.file.status === 'error') { - this.$message.error(`${info.file.name} 上传失败.`); + this.$message.error(`${info.file.response.message}`); } }, ossDelete(id) { @@ -154,11 +174,17 @@ that.handleDelete(id) } }); + }, + handlePreview(record) { + if (record && record.url) { + let url = window._CONFIG['onlinePreviewDomainURL'] + '?url=' + encodeURIComponent(record.url) + window.open(url, '_blank') + } } } } diff --git a/ant-design-vue-jeecg/src/views/system/DepartList.vue b/ant-design-vue-jeecg/src/views/system/DepartList.vue index 44ccb75cb819e05f2edf93e5693468660d2487c9..cd4dd547f25143f766eff380f30345905a23c4b8 100644 --- a/ant-design-vue-jeecg/src/views/system/DepartList.vue +++ b/ant-design-vue-jeecg/src/views/system/DepartList.vue @@ -17,8 +17,7 @@
- 当前选择: - {{ getCurrSelectedTitle() }} + 当前选择:{{ getCurrSelectedTitle() }} 取消选择
@@ -72,82 +71,90 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- 重置 - 修改并保存 -
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 重置 + 修改并保存 +
+
+
+ + + +
+
@@ -158,6 +165,7 @@ import {queryDepartTreeList, searchByKeywords, deleteByDepartId} from '@/api/api' import {httpAction, deleteAction} from '@/api/manage' import {JeecgListMixin} from '@/mixins/JeecgListMixin' + import DepartAuthModal from './modules/DepartAuthModal' // 表头 const columns = [ { @@ -201,6 +209,7 @@ name: 'DepartList', mixins: [JeecgListMixin], components: { + DepartAuthModal, DepartModal }, data() { @@ -403,7 +412,7 @@ this.selectedKeys = [record.key] this.model.parentId = record.parentId this.setValuesToForm(record) - + this.$refs.departAuth.show(record.id); }, // 触发onSelect事件时,为部门树右侧的form表单赋值 @@ -425,6 +434,7 @@ this.currSelected = {} this.form.resetFields() this.selectedKeys = [] + this.$refs.departAuth.departId = '' }, handleNodeTypeChange(val) { this.currSelected.nodeType = val diff --git a/ant-design-vue-jeecg/src/views/system/DepartUserList.vue b/ant-design-vue-jeecg/src/views/system/DepartUserList.vue index 6166366bc64eb0a8c941f3e29cc197b1fef870dc..9bb72b2c2bf397e12bf401bb8402d7aa09d89b66 100644 --- a/ant-design-vue-jeecg/src/views/system/DepartUserList.vue +++ b/ant-design-vue-jeecg/src/views/system/DepartUserList.vue @@ -6,7 +6,7 @@ - @@ -54,11 +55,13 @@ import { getAction,putAction } from '@/api/manage' import ShowAnnouncement from '@/components/tools/ShowAnnouncement' import {JeecgListMixin} from '@/mixins/JeecgListMixin' + import DynamicNotice from '../../components/tools/DynamicNotice' export default { name: "UserAnnouncementList", mixins: [JeecgListMixin], components: { + DynamicNotice, ShowAnnouncement }, data () { @@ -130,6 +133,7 @@ readAllMsg:"sys/sysAnnouncementSend/readAll", }, loading:false, + openPath:'' } }, methods: { @@ -143,7 +147,13 @@ this.loadData(); } }); - this.$refs.ShowAnnouncement.detail(record); + if(record.openType==='component'){ + this.openPath = record.openPage; + this.formData = {id:record.busId}; + this.$refs.showDynamNotice.detail(); + }else{ + this.$refs.ShowAnnouncement.detail(record); + } }, readAll(){ var that = this; diff --git a/ant-design-vue-jeecg/src/views/system/UserList.vue b/ant-design-vue-jeecg/src/views/system/UserList.vue index 8b452e2c93ce47fff2302b046fc63601584791cb..847dd2aad990dc4ffade01d2a65ec4935bd33b60 100644 --- a/ant-design-vue-jeecg/src/views/system/UserList.vue +++ b/ant-design-vue-jeecg/src/views/system/UserList.vue @@ -66,10 +66,12 @@
添加用户 + 同步流程 导出 导入 + 回收站 @@ -171,17 +173,22 @@ + + + + + \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/modules/AddressListLeft.vue b/ant-design-vue-jeecg/src/views/system/modules/AddressListLeft.vue index 0043c4a2f37a17c91e00b5309b5cd3683a6115b6..29cde8406b6fc334274dc110b840281f92d39fa9 100644 --- a/ant-design-vue-jeecg/src/views/system/modules/AddressListLeft.vue +++ b/ant-design-vue-jeecg/src/views/system/modules/AddressListLeft.vue @@ -1,7 +1,7 @@ @@ -104,11 +108,13 @@ import {getAction, postAction, deleteAction} from '@/api/manage' import SelectUserModal from './SelectUserModal' import UserModal from './UserModal' + import DeptRoleUserModal from './DeptRoleUserModal' export default { name: "DeptUserInfo", mixins: [JeecgListMixin], components: { + DeptRoleUserModal, SelectUserModal, UserModal }, @@ -127,6 +133,21 @@ align: "center", dataIndex: 'realname' }, + { + title: '性别', + align: "center", + dataIndex: 'sex_dictText' + }, + { + title: '电话', + align: "center", + dataIndex: 'phone' + }, + { + title: '部门', + align: "center", + dataIndex: 'orgCode' + }, { title: '操作', dataIndex: 'action', @@ -146,7 +167,12 @@ }, methods: { - + searchReset() { + this.queryParam = {} + this.currentDeptId = ''; + this.loadData(1); + this.$emit('clearSelectedDepartKeys') + }, loadData(arg) { if (!this.url.list) { this.$message.error("请设置url.list属性!") @@ -156,11 +182,11 @@ if (arg === 1) { this.ipagination.current = 1; } - if (this.currentDeptId === '') return; - var params = this.getQueryParams();//查询条件 + //if (this.currentDeptId === '') return; + let params = this.getQueryParams();//查询条件 params.depId = this.currentDeptId; getAction(this.url.list, params).then((res) => { - if (res.success) { + if (res.success && res.result) { this.dataSource = res.result.records; this.ipagination.total = res.result.total; } @@ -172,6 +198,11 @@ this.$message.error("请设置url.deleteBatch属性!") return } + if (!this.currentDeptId) { + this.$message.error("未选中任何部门,无法取消部门与用户的关联!") + return + } + if (this.selectedRowKeys.length <= 0) { this.$message.warning('请选择一条记录!'); return; @@ -183,12 +214,12 @@ var that = this; console.log(this.currentDeptId); this.$confirm({ - title: "确认删除", - content: "是否删除选中数据?", + title: "确认取消", + content: "是否取消用户与选中部门的关联?", onOk: function () { deleteAction(that.url.deleteBatch, {depId: that.currentDeptId, userIds: ids}).then((res) => { if (res.success) { - that.$message.success(res.message); + that.$message.success("删除用户与选中部门关系成功!"); that.loadData(); that.onClearSelected(); } else { @@ -204,10 +235,15 @@ this.$message.error("请设置url.delete属性!") return } + if (!this.currentDeptId) { + this.$message.error("未选中任何部门,无法取消部门与用户的关联!") + return + } + var that = this; deleteAction(that.url.delete, {depId: this.currentDeptId, userId: id}).then((res) => { if (res.success) { - that.$message.success(res.message); + that.$message.success("删除用户与选中部门关系成功!"); if (this.selectedRowKeys.length>0){ for(let i =0; i + + \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/modules/SysCheckRuleTestModal.vue b/ant-design-vue-jeecg/src/views/system/modules/SysCheckRuleTestModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..d9ede26df0e662383e53f441baa6820af6d74eda --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/modules/SysCheckRuleTestModal.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/modules/SysDataSourceModal.vue b/ant-design-vue-jeecg/src/views/system/modules/SysDataSourceModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..8ae463ba61dafa2994d6a5b3a97c48d671092054 --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/modules/SysDataSourceModal.vue @@ -0,0 +1,227 @@ + + + + + \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/modules/SysDepartRoleModal.vue b/ant-design-vue-jeecg/src/views/system/modules/SysDepartRoleModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..ac982f834d70194067db0169799a02636c227435 --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/modules/SysDepartRoleModal.vue @@ -0,0 +1,162 @@ + + + + + \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/modules/UserModal.vue b/ant-design-vue-jeecg/src/views/system/modules/UserModal.vue index 070caf1bb3315c8c25c8b756a1b96be820ee0980..994f3bfe057526a32fb5c4cd0d59d084d537881f 100644 --- a/ant-design-vue-jeecg/src/views/system/modules/UserModal.vue +++ b/ant-design-vue-jeecg/src/views/system/modules/UserModal.vue @@ -36,8 +36,8 @@ - - + + @@ -71,23 +71,33 @@ 选择 - - + + + 普通用户 + 上级 + + + + - 头像 -
- -
上传
-
-
+ {{item.title}} + +
+ + + @@ -145,10 +155,12 @@ import {addUser,editUser,queryUserRole,queryall } from '@/api/api' import { disabledAuthFilter } from "@/utils/authFilter" import {duplicateCheck } from '@/api/api' + import JImageUpload from '../../../components/jeecg/JImageUpload' export default { name: "UserModal", components: { + JImageUpload, departWindow, JSelectPosition }, @@ -164,6 +176,7 @@ checkedDepartKeys:[], checkedDepartNames:[], // 保存部门的名称 =>title checkedDepartNameString:"", // 保存部门的名称 =>title + resultDepartOptions:[], userId:"", //保存用户id disableSubmit:false, userDepartModel:{userId:'',departIdList:[]}, // 保存SysUserDepart的用户部门中间表数据需要的对象 @@ -213,6 +226,8 @@ ] } }, + departIdShow:false, + departIds:[], //负责部门id title:"操作", visible: false, model: {}, @@ -233,11 +248,13 @@ picUrl: "", url: { fileUpload: window._CONFIG['domianURL']+"/sys/common/upload", - imgerver: window._CONFIG['domianURL']+"/sys/common/view", + imgerver: window._CONFIG['staticDomainURL'], userWithDepart: "/sys/user/userDepartList", // 引入为指定用户查看部门信息需要的url userId:"/sys/user/generateUserId", // 引入生成添加用户情况下的url syncUserByUserName:"/process/extActProcess/doSyncUserByUserName",//同步用户到工作流 }, + identity:"1", + fileList:[], } }, created () { @@ -287,6 +304,9 @@ this.checkedDepartNames=[]; this.checkedDepartNameString = ""; this.userId="" + this.resultDepartOptions=[]; + this.departId=[]; + this.departIdShow=false; }, add () { this.picUrl = ""; @@ -301,7 +321,9 @@ that.form.resetFields(); if(record.hasOwnProperty("id")){ that.loadUserRoles(record.id); - this.picUrl = "Has no pic url yet"; + setTimeout(() => { + this.fileList = record.avatar; + }, 5) } that.userId = record.id; that.visible = true; @@ -309,6 +331,14 @@ that.$nextTick(() => { that.form.setFieldsValue(pick(this.model,'username','sex','realname','email','phone','activitiSync','workNo','telephone','post')) }); + //身份为上级显示负责部门,否则不显示 + if(this.model.identity=="2"){ + this.identity="2"; + this.departIdShow=true; + }else{ + this.identity="1"; + this.departIdShow=false; + } // 调用查询用户对应的部门信息的方法 that.checkedDepartKeys = []; that.loadCheckedDeparts(); @@ -320,10 +350,25 @@ getAction(that.url.userWithDepart,{userId:that.userId}).then((res)=>{ that.checkedDepartNames = []; if(res.success){ + var depart=[]; + var departId=[]; for (let i = 0; i < res.result.length; i++) { that.checkedDepartNames.push(res.result[i].title); this.checkedDepartNameString = this.checkedDepartNames.join(","); that.checkedDepartKeys.push(res.result[i].key); + //新增负责部门选择下拉框 + depart.push({ + key:res.result[i].key, + title:res.result[i].title + }) + departId.push(res.result[i].key) + } + that.resultDepartOptions=depart; + //判断部门id是否存在,不存在择直接默认当前所在部门 + if(this.model.departIds){ + this.departIds=this.model.departIds.split(","); + }else{ + this.departIds=departId; } that.userDepartModel.departIdList = that.checkedDepartKeys }else{ @@ -341,6 +386,11 @@ this.checkedDepartNameString=''; this.checkedDepartKeys = []; this.selectedDepartKeys = []; + this.resultDepartOptions=[]; + this.departIds=[]; + this.departIdShow=false; + this.identity="1"; + this.fileList=[]; }, moment, handleSubmit () { @@ -350,17 +400,22 @@ this.form.validateFields((err, values) => { if (!err) { that.confirmLoading = true; - let avatar = that.model.avatar; if(!values.birthday){ values.birthday = ''; }else{ values.birthday = values.birthday.format(this.dateFormat); } let formData = Object.assign(this.model, values); - formData.avatar = avatar; + formData.avatar = that.fileList; formData.selectedroles = this.selectedRole.length>0?this.selectedRole.join(","):''; formData.selecteddeparts = this.userDepartModel.departIdList.length>0?this.userDepartModel.departIdList.join(","):''; - + formData.identity=this.identity; + //如果是上级择传入departIds,否则为空 + if(this.identity==="2"){ + formData.departIds=this.departIds.join(","); + }else{ + formData.departIds=""; + } // that.addDepartsToUser(that,formData); // 调用根据当前用户添加部门信息的方法 let obj; if(!this.model.id){ @@ -380,7 +435,6 @@ that.confirmLoading = false; that.checkedDepartNames = []; that.userDepartModel.departIdList = {userId:'',departIdList:[]}; - that.close(); }) @@ -528,9 +582,6 @@ } } }, - getAvatarView(){ - return this.url.imgerver +"/"+ this.model.avatar; - }, // 搜索用户对应的部门API onSearch(){ this.$refs.departWindow.add(this.checkedDepartKeys,this.userId); @@ -543,11 +594,21 @@ this.checkedDepartNameString = ''; this.userId = formData.userId; this.userDepartModel.userId = formData.userId; + this.departIds=[]; + this.resultDepartOptions=[]; + var depart=[]; for (let i = 0; i < formData.departIdList.length; i++) { this.selectedDepartKeys.push(formData.departIdList[i].key); this.checkedDepartNames.push(formData.departIdList[i].title); this.checkedDepartNameString = this.checkedDepartNames.join(","); + //新增部门选择,如果上面部门选择后不为空直接付给负责部门 + depart.push({ + key:formData.departIdList[i].key, + title:formData.departIdList[i].title + }) + this.departIds.push(formData.departIdList[i].key) } + this.resultDepartOptions=depart; this.userDepartModel.departIdList = this.selectedDepartKeys; this.checkedDepartKeys = this.selectedDepartKeys //更新当前的选择keys }, @@ -560,6 +621,13 @@ this.drawerWidth = 700; } }, + identityChange(e){ + if(e.target.value==="1"){ + this.departIdShow=false; + }else{ + this.departIdShow=true; + } + } } } diff --git a/ant-design-vue-jeecg/src/views/system/modules/UserRecycleBinModal.vue b/ant-design-vue-jeecg/src/views/system/modules/UserRecycleBinModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..0bbc79f4b397c26527f24a973e6d40473019c867 --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/modules/UserRecycleBinModal.vue @@ -0,0 +1,191 @@ + + + + + \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/modules/UserRoleModal.vue b/ant-design-vue-jeecg/src/views/system/modules/UserRoleModal.vue index 29c4d38d8d0b2f6ca941960fe5765266a2b14b61..523f92b23560370fc5c7b39b85f966058aee1314 100644 --- a/ant-design-vue-jeecg/src/views/system/modules/UserRoleModal.vue +++ b/ant-design-vue-jeecg/src/views/system/modules/UserRoleModal.vue @@ -45,7 +45,8 @@ 取消 - 提交 + 仅保存 + 保存并关闭
@@ -134,7 +135,7 @@ handleCancel () { this.close() }, - handleSubmit(){ + handleSubmit(exit) { let that = this; let params = { roleId:that.roleId, @@ -147,18 +148,20 @@ if(res.success){ that.$message.success(res.message); that.loading = false; - that.close(); + if (exit) { + that.close() + } }else { that.$message.error(res.message); that.loading = false; - that.close(); + if (exit) { + that.close() + } } + this.loadData(); }) }, - }, - watch: { - visible () { - if (this.visible) { + loadData(){ queryTreeListForRole().then((res) => { this.treeData = res.result.treeList this.allTreeKeys = res.result.ids @@ -170,6 +173,12 @@ }) }) } + }, + watch: { + visible () { + if (this.visible) { + this.loadData(); + } } } } diff --git a/ant-design-vue-jeecg/src/views/user/Alteration.vue b/ant-design-vue-jeecg/src/views/user/Alteration.vue index c032d74ea93ece5b032cc14b8a9b6e97fe1db0fd..26f746f65e0bf13e94122b2d13d4e13d0bc9060b 100644 --- a/ant-design-vue-jeecg/src/views/user/Alteration.vue +++ b/ant-design-vue-jeecg/src/views/user/Alteration.vue @@ -1,13 +1,13 @@