From f3d6f63f95f708cdb9a751d575174492a5d0aa3f Mon Sep 17 00:00:00 2001 From: smallchill Date: Sat, 9 Mar 2019 11:02:12 +0800 Subject: [PATCH] =?UTF-8?q?:zap:=20=E5=A2=9E=E5=8A=A0=E5=A4=9A=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/system/dept.js | 7 +- src/api/system/role.js | 7 +- src/api/system/tenant.js | 38 ++++ src/api/user.js | 3 +- src/lang/en.js | 3 +- src/lang/zh.js | 1 + src/page/login/userlogin.vue | 14 ++ src/store/modules/user.js | 365 +++++++++++++++++------------------ src/views/system/dept.vue | 12 ++ src/views/system/role.vue | 37 ++++ src/views/system/tenant.vue | 210 ++++++++++++++++++++ src/views/system/user.vue | 61 +++++- 12 files changed, 564 insertions(+), 194 deletions(-) create mode 100644 src/api/system/tenant.js create mode 100644 src/views/system/tenant.vue diff --git a/src/api/system/dept.js b/src/api/system/dept.js index 0a111a0..df1a538 100644 --- a/src/api/system/dept.js +++ b/src/api/system/dept.js @@ -46,10 +46,13 @@ export const getDept = (id) => { } }) } -export const getDeptTree = () => { +export const getDeptTree = (tenantCode) => { return request({ url: '/api/blade-system/dept/tree', - method: 'get' + method: 'get', + params: { + tenantCode, + } }) } diff --git a/src/api/system/role.js b/src/api/system/role.js index 0b56214..b4773ed 100644 --- a/src/api/system/role.js +++ b/src/api/system/role.js @@ -66,9 +66,12 @@ export const getRole = (roleIds) => { }) } -export const getRoleTree = () => { +export const getRoleTree = (tenantCode) => { return request({ url: '/api/blade-system/role/tree', - method: 'get' + method: 'get', + params: { + tenantCode, + } }) } diff --git a/src/api/system/tenant.js b/src/api/system/tenant.js new file mode 100644 index 0000000..1ce915b --- /dev/null +++ b/src/api/system/tenant.js @@ -0,0 +1,38 @@ +import request from '@/router/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/api/blade-system/tenant/list', + method: 'get', + params: { + ...params, + current, + size, + } + }) +} +export const remove = (ids) => { + return request({ + url: '/api/blade-system/tenant/remove', + method: 'post', + params: { + ids, + } + }) +} + +export const add = (row) => { + return request({ + url: '/api/blade-system/tenant/submit', + method: 'post', + data: row + }) +} + +export const update = (row) => { + return request({ + url: '/api/blade-system/tenant/submit', + method: 'post', + data: row + }) +} diff --git a/src/api/user.js b/src/api/user.js index 244167c..2bf81d4 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -1,10 +1,11 @@ import request from '@/router/axios'; import {baseUrl} from '@/config/env'; -export const loginByUsername = (account, password, type) => request({ +export const loginByUsername = (tenantCode, account, password, type) => request({ url: '/api/blade-auth/token', method: 'post', params: { + tenantCode, account, password, type diff --git a/src/lang/en.js b/src/lang/en.js index 1173d24..99df88f 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -66,6 +66,7 @@ export default { login: { title: 'Login ', info: 'Enterprise Development Platform', + tenantCode: 'Please input tenantCode', username: 'Please input username', password: 'Please input a password', wechat: 'Wechat', @@ -98,4 +99,4 @@ export default { closeOthers: 'Close Others', closeAll: 'Close All' } -} \ No newline at end of file +} diff --git a/src/lang/zh.js b/src/lang/zh.js index 269b7ac..a2bd366 100644 --- a/src/lang/zh.js +++ b/src/lang/zh.js @@ -66,6 +66,7 @@ export default { login: { title: '登录 ', info: '企业级开发平台', + tenantCode: '请输入租户编号', username: '请输入账号', password: '请输入密码', wechat: '微信', diff --git a/src/page/login/userlogin.vue b/src/page/login/userlogin.vue index 86c2ad4..15d7015 100644 --- a/src/page/login/userlogin.vue +++ b/src/page/login/userlogin.vue @@ -5,6 +5,16 @@ ref="loginForm" :model="loginForm" label-width="0"> + + + + + { - addPath(child); - }) - } + const menu = webiste.menu; + const propsConfig = menu.props; + const propsDefault = { + label: propsConfig.label || 'name', + path: propsConfig.path || 'path', + icon: propsConfig.icon || 'icon', + children: propsConfig.children || 'children' + } + const icon = ele[propsDefault.icon]; + ele[propsDefault.icon] = validatenull(icon) ? menu.iconDefault : icon; + const isChild = ele[propsDefault.children] && ele[propsDefault.children].length !== 0; + if (!isChild) ele[propsDefault.children] = []; + if (!isChild && first && !isURL(ele[propsDefault.path])) { + ele[propsDefault.path] = ele[propsDefault.path] + '/index' + } else { + ele[propsDefault.children].forEach(child => { + addPath(child); + }) + } } - const user = { - state: { - userInfo: getStore({name: 'userInfo'}) || [], - permission: getStore({name: 'permission'}) || {}, - roles: [], - menu: getStore({name: 'menu'}) || [], - menuAll: [], - token: getStore({name: 'token'}) || '', - }, - actions: { - //根据用户名登录 - LoginByUsername({commit}, userInfo) { - return new Promise((resolve) => { - loginByUsername(userInfo.username, userInfo.password, userInfo.type).then(res => { - const data = res.data.data; - commit('SET_TOKEN', data.accessToken); - commit('SET_USERIFNO', data); - commit('DEL_ALL_TAG'); - commit('CLEAR_LOCK'); - resolve(); - }) - }) + state: { + userInfo: getStore({ name: 'userInfo' }) || [], + permission: getStore({ name: 'permission' }) || {}, + roles: [], + menu: getStore({ name: 'menu' }) || [], + menuAll: [], + token: getStore({ name: 'token' }) || '', }, - GetButtons({commit}) { - return new Promise((resolve) => { - getButtons().then(res => { - const data = res.data.data; - commit('SET_PERMISSION', data); - resolve(); - }) - }) + actions: { + //根据用户名登录 + LoginByUsername({ commit }, userInfo) { + return new Promise((resolve) => { + loginByUsername(userInfo.tenantCode, userInfo.username, userInfo.password, userInfo.type).then(res => { + const data = res.data.data; + commit('SET_TOKEN', data.accessToken); + commit('SET_USERIFNO', data); + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + resolve(); + }) + }) + }, + GetButtons({ commit }) { + return new Promise((resolve) => { + getButtons().then(res => { + const data = res.data.data; + commit('SET_PERMISSION', data); + resolve(); + }) + }) + }, + //根据手机号登录 + LoginByPhone({ commit }, userInfo) { + return new Promise((resolve) => { + loginByUsername(userInfo.phone, userInfo.code).then(res => { + const data = res.data.data; + commit('SET_TOKEN', data); + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + resolve(); + }) + }) + }, + GetUserInfo({ commit }) { + return new Promise((resolve, reject) => { + getUserInfo().then((res) => { + const data = res.data.data; + commit('SET_ROLES', data.roles); + resolve(data); + }).catch(err => { + reject(err); + }) + }) + }, + //刷新token + RefeshToken({ state, commit }) { + return new Promise((resolve, reject) => { + refeshToken(state.refeshToken).then(res => { + const data = res.data.data; + commit('SET_TOKEN', data); + resolve(data); + }).catch(error => { + reject(error) + }) + }) + }, + // 登出 + LogOut({ commit }) { + return new Promise((resolve, reject) => { + logout().then(() => { + commit('SET_TOKEN', '') + commit('SET_MENU', []) + commit('SET_ROLES', []) + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + removeToken() + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + //注销session + FedLogOut({ commit }) { + return new Promise(resolve => { + commit('SET_TOKEN', '') + commit('SET_MENU', []) + commit('SET_ROLES', []) + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + removeToken() + resolve() + }) + }, + GetTopMenu() { + return new Promise(resolve => { + getTopMenu().then((res) => { + const data = res.data.data || [] + resolve(data) + }) + }) + }, + //获取系统菜单 + GetMenu({ commit, dispatch }, parentId) { + return new Promise(resolve => { + getMenu(parentId).then((res) => { + const data = res.data.data + let menu = deepClone(data); + menu.forEach(ele => { + addPath(ele, true); + }) + commit('SET_MENU', menu) + dispatch('GetButtons'); + resolve(menu) + }) + }) + }, }, - //根据手机号登录 - LoginByPhone({commit}, userInfo) { - return new Promise((resolve) => { - loginByUsername(userInfo.phone, userInfo.code).then(res => { - const data = res.data.data; - commit('SET_TOKEN', data); - commit('DEL_ALL_TAG'); - commit('CLEAR_LOCK'); - resolve(); - }) - }) - }, - GetUserInfo({commit}) { - return new Promise((resolve, reject) => { - getUserInfo().then((res) => { - const data = res.data.data; - commit('SET_ROLES', data.roles); - resolve(data); - }).catch(err => { - reject(err); - }) - }) - }, - //刷新token - RefeshToken({state, commit}) { - return new Promise((resolve, reject) => { - refeshToken(state.refeshToken).then(res => { - const data = res.data.data; - commit('SET_TOKEN', data); - resolve(data); - }).catch(error => { - reject(error) - }) - }) - }, - // 登出 - LogOut({commit}) { - return new Promise((resolve, reject) => { - logout().then(() => { - commit('SET_TOKEN', '') - commit('SET_MENU', []) - commit('SET_ROLES', []) - commit('DEL_ALL_TAG'); - commit('CLEAR_LOCK'); - removeToken() - resolve() - }).catch(error => { - reject(error) - }) - }) - }, - //注销session - FedLogOut({commit}) { - return new Promise(resolve => { - commit('SET_TOKEN', '') - commit('SET_MENU', []) - commit('SET_ROLES', []) - commit('DEL_ALL_TAG'); - commit('CLEAR_LOCK'); - removeToken() - resolve() - }) - }, - GetTopMenu() { - return new Promise(resolve => { - getTopMenu().then((res) => { - const data = res.data.data || [] - resolve(data) - }) - }) - }, - //获取系统菜单 - GetMenu({commit, dispatch}, parentId) { - return new Promise(resolve => { - getMenu(parentId).then((res) => { - const data = res.data.data - let menu = deepClone(data); - menu.forEach(ele => { - addPath(ele, true); - }) - commit('SET_MENU', menu) - dispatch('GetButtons'); - resolve(menu) - }) - }) - }, - }, - mutations: { - SET_TOKEN: (state, token) => { - setToken(token) - state.token = token; - setStore({name: 'token', content: state.token, type: 'session'}) - }, - SET_USERIFNO: (state, userInfo) => { - state.userInfo = userInfo; - setStore({name: 'userInfo', content: state.userInfo}) - }, - SET_MENU: (state, menu) => { - state.menu = menu - setStore({name: 'menu', content: state.menu, type: 'session'}) - }, - SET_MENU_ALL: (state, menuAll) => { - state.menuAll = menuAll; - }, - SET_ROLES: (state, roles) => { - state.roles = roles; - }, - SET_PERMISSION: (state, permission) => { - let result = []; + mutations: { + SET_TOKEN: (state, token) => { + setToken(token) + state.token = token; + setStore({ name: 'token', content: state.token, type: 'session' }) + }, + SET_USERIFNO: (state, userInfo) => { + state.userInfo = userInfo; + setStore({ name: 'userInfo', content: state.userInfo }) + }, + SET_MENU: (state, menu) => { + state.menu = menu + setStore({ name: 'menu', content: state.menu, type: 'session' }) + }, + SET_MENU_ALL: (state, menuAll) => { + state.menuAll = menuAll; + }, + SET_ROLES: (state, roles) => { + state.roles = roles; + }, + SET_PERMISSION: (state, permission) => { + let result = []; + function getCode(list) { + list.forEach(ele => { + if (typeof (ele) === 'object') { + const chiildren = ele.children; + const code = ele.code; + if (chiildren) { + getCode(chiildren) + } else { + result.push(code); + } + } - function getCode(list) { - list.forEach(ele => { - if (typeof (ele) === 'object') { - const chiildren = ele.children; - const code = ele.code; - if (chiildren) { - getCode(chiildren) - } else { - result.push(code); + }) } - } - - }) - } - - getCode(permission); - state.permission = {}; - result.forEach(ele => { - state.permission[ele] = true; - }); - setStore({name: 'permission', content: state.permission, type: 'session'}) + getCode(permission); + state.permission = {}; + result.forEach(ele => { + state.permission[ele] = true; + }); + setStore({ name: 'permission', content: state.permission, type: 'session' }) + } } - } } export default user diff --git a/src/views/system/dept.vue b/src/views/system/dept.vue index ce6bd44..14065fd 100644 --- a/src/views/system/dept.vue +++ b/src/views/system/dept.vue @@ -73,6 +73,18 @@ trigger: "blur" }] }, + { + label: "租户编号", + prop: "tenantCode", + search: true, + addDisplay: false, + editDisplay: false, + rules: [{ + required: true, + message: "请输入租户编号", + trigger: "blur" + }] + }, { label: "部门全称", prop: "fullName", diff --git a/src/views/system/role.vue b/src/views/system/role.vue index d61e15c..b5b0c6d 100644 --- a/src/views/system/role.vue +++ b/src/views/system/role.vue @@ -92,11 +92,14 @@ export default { index: true, selection: true, viewBtn: true, + dialogWidth: 300, + dialogHeight: 400, column: [ { label: "角色名称", prop: "roleName", search: true, + span: 24, rules: [ { required: true, @@ -105,10 +108,42 @@ export default { } ] }, + { + label: "租户编号", + prop: "tenantCode", + addDisplay: false, + editDisplay: false, + span: 24, + rules: [{ + required: true, + message: "请输入租户编号", + trigger: "blur" + }] + }, + { + label: "所属租户", + prop: "tenantCode", + type: "tree", + dicUrl: "/api/blade-system/tenant/select", + addDisplay: false, + editDisplay: false, + span: 24, + props: { + label: "tenantName", + value: "tenantCode" + }, + search: true, + rules: [{ + required: true, + message: "请输入所属租户", + trigger: "click" + }] + }, { label: "角色别名", prop: "roleAlias", search: true, + span: 24, rules: [ { required: true, @@ -123,6 +158,7 @@ export default { dicData: [], type: "tree", hide: true, + span: 24, props: { label: "title" }, @@ -138,6 +174,7 @@ export default { label: "角色排序", prop: "sort", type: "number", + span: 24, rules: [ { required: true, diff --git a/src/views/system/tenant.vue b/src/views/system/tenant.vue new file mode 100644 index 0000000..9ee8635 --- /dev/null +++ b/src/views/system/tenant.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/src/views/system/user.vue b/src/views/system/user.vue index cf58b1e..c98a88d 100644 --- a/src/views/system/user.vue +++ b/src/views/system/user.vue @@ -51,6 +51,8 @@ add, resetPassword } from "@/api/system/user"; + import {getDeptTree} from "@/api/system/dept"; + import {getRoleTree} from "@/api/system/role"; import {mapGetters} from "vuex"; export default { @@ -80,6 +82,10 @@ currentPage: 1, total: 0 }, + init: { + roleTree: [], + deptTree: [], + }, option: { tip: false, border: true, @@ -91,7 +97,6 @@ { label: "登录账号", prop: "account", - span: 24, search: true, rules: [{ required: true, @@ -99,6 +104,29 @@ trigger: "blur" }] }, + { + label: "租户编号", + prop: "tenantCode", + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: "所属租户", + prop: "tenantCode", + type: "tree", + dicUrl: "/api/blade-system/tenant/select", + props: { + label: "tenantName", + value: "tenantCode" + }, + search: true, + rules: [{ + required: true, + message: "请输入所属租户", + trigger: "click" + }] + }, { label: '密码', prop: 'password', @@ -139,7 +167,7 @@ prop: "roleId", multiple: true, type: "tree", - dicUrl: "/api/blade-system/role/tree", + dicData: [], props: { label: "title" }, @@ -155,7 +183,7 @@ prop: "deptId", type: "tree", multiple: true, - dicUrl: "/api/blade-system/dept/tree", + dicData: [], props: { label: "title" }, @@ -174,6 +202,7 @@ { label: "电子邮箱", prop: "email", + hide: true, overHidden: true }, { @@ -201,11 +230,13 @@ type: "date", prop: "birthday", format: "yyyy-MM-dd hh:mm:ss", - valueFormat: "yyyy-MM-dd hh:mm:ss" + valueFormat: "yyyy-MM-dd hh:mm:ss", + hide: true }, { label: "账号状态", prop: "statusName", + hide: true, display: false } ] @@ -213,6 +244,20 @@ data: [] }; }, + watch: { + 'form.tenantCode'() { + if (this.form.tenantCode !== '') { + getDeptTree(this.form.tenantCode).then(res => { + const index = this.$refs.crud.findColumnIndex("deptId"); + this.option.column[index].dicData = res.data.data; + }); + getRoleTree(this.form.tenantCode).then(res => { + const index = this.$refs.crud.findColumnIndex("roleId"); + this.option.column[index].dicData = res.data.data; + }); + } + } + }, computed: { ...mapGetters(["permission"]), permissionList() { @@ -347,6 +392,14 @@ this.page.total = data.total; this.data = data.records; }); + getDeptTree(this.form.tenantCode).then(res => { + const index = this.$refs.crud.findColumnIndex("deptId"); + this.option.column[index].dicData = res.data.data; + }); + getRoleTree(this.form.tenantCode).then(res => { + const index = this.$refs.crud.findColumnIndex("roleId"); + this.option.column[index].dicData = res.data.data; + }); } } };