优化登录/切换公司

This commit is contained in:
xielue 2022-12-14 16:05:06 +08:00
parent 2a0c34f7ad
commit f7399f0c6a
10 changed files with 273 additions and 123 deletions

View File

@ -1,4 +1,4 @@
VUE_APP_API_BASE_URL=http://zxx4.f3322.net:46000 VUE_APP_API_BASE_URL=http://192.168.31.166:46000
VUE_APP_USER_MODEL2=AdminUser VUE_APP_USER_MODEL2=AdminUser
VUE_APP_USER_MODEL=BaseAdmin VUE_APP_USER_MODEL=BaseAdmin

View File

@ -0,0 +1,44 @@
<template>
<vxe-modal v-model="value" @confirm="confirmEvent" width="600" show-footer>
<template #title>
<span>选择公司</span>
</template>
<template #default>
<vxe-table ref="xTable" show-overflow auto-resize height="300" :rowConfig="{ isCurrent: true, isHover: true }"
:data="data">
<vxe-column type="seq" width="60"></vxe-column>
<vxe-column field="title" title="公司名"></vxe-column>
<vxe-column field="desc" title="描述"></vxe-column>
</vxe-table>
</template>
</vxe-modal>
</template>
<script>
export default {
name: "switchCompany",
props: {
value : {
type: Boolean,
default: false
},
data : {
type: Array
}
},
data() {
return {
};
},
methods: {
confirmEvent(){
let row = this.$refs.xTable.getCurrentRecord();
this.$emit("confirm",{row});
}
}
};
</script>

View File

@ -8,6 +8,7 @@ import VXETable from 'vxe-table'
import MkGridSelect from './components/editors/MkGridSelect.vue' import MkGridSelect from './components/editors/MkGridSelect.vue'
import MkGridDataSelector from './components/editors/MkGridDataSelector.vue' import MkGridDataSelector from './components/editors/MkGridDataSelector.vue'
import MkFormDataSelector from './components/editors/MkFormDataSelector.vue' import MkFormDataSelector from './components/editors/MkFormDataSelector.vue'
import switchCompany from './components/switchCompany/switchCompany'
import XEUtils from 'xe-utils' import XEUtils from 'xe-utils'
// 创建一个下拉表格渲染 // 创建一个下拉表格渲染
@ -99,6 +100,7 @@ var mk = {
Vue.component(MkGridDataSelector.name, MkGridDataSelector) Vue.component(MkGridDataSelector.name, MkGridDataSelector)
Vue.component(MkGridSelect.name, MkGridSelect) Vue.component(MkGridSelect.name, MkGridSelect)
Vue.component(switchCompany.name, switchCompany)
}, },

View File

@ -0,0 +1,104 @@
<template>
<div>
</div>
</template>
<script>
import { getUserInfo, getRoutesConfig, getPermission, getSettings, getCompany } from '@/services/base/user'
import { setAuthorization, setCompany } from '@/utils/request'
import { loadRoutes } from '@/utils/routerUtil'
import { mapMutations } from 'vuex'
import Cookie from 'js-cookie'
import { USER_MODEL } from '@/services/base/api.js';
//
export default {
name: 'loginActions',
components: { },
data() {
return {
logging: false,
error: '',
form: this.$form.createForm(this),
user: {
mobile: '18192398883',
password: '888888'
},
Project: [],
companyShow: false,
companyData: [],
company: Cookie.get('company'),
loginResult: null
}
},
computed: {
},
beforeMount() {
},
created() {
},
methods: {
...mapMutations('account', ['setUid', 'setUser', 'setPermissions', 'setRoutesConfig', 'setSettings', 'setCompany', 'setProject']),
isMiddleAdmin() {
return USER_MODEL == "AdminUser";
},
afterLoginSuccess({ token, access_expire, uid, msg = '登录成功',pushTo = '/dashboard/workplace' }) {
setAuthorization({ token: token, expireAt: new Date(access_expire * 1000) }) // token
this.setUid(uid) // id
getUserInfo().then(result => { //
if (result.data.data != null) {
const UserInfo = result.data.data.user_info
this.setUser(UserInfo)
}
})
getPermission().then(result => { //
if (result.data.data != null) {
const Permission = result.data.data.setPermissions
this.setPermissions(Permission)
}
})
getRoutesConfig().then(result => { //
if (result.data.data != null) {
const routesConfig = result.data.data
this.setRoutesConfig(routesConfig)
loadRoutes([routesConfig])
this.$router.push(pushTo)
this.$message.success(msg, 3)
}
})
getSettings().then(result => { //
if (result.data.data != null) {
const settings = result.data.data
this.setSettings(settings)
}
})
getCompany().then(result => { //
if (result.data.data != null) {
const company = result.data.data
this.setCompany(company) // vuex
setCompany(company.company_info) // cookies
}
})
}
}
}
</script>
<style lang="less" scoped>
</style>

View File

@ -1,59 +1,116 @@
<template> <template>
<a-dropdown> <div>
<div class="header-avatar" style="cursor: pointer">
<a-avatar class="avatar" size="small" shape="circle" :src="user.avatar"/> <a-dropdown>
<span class="name">{{user.nickname}}</span> <div class="header-avatar" style="cursor: pointer">
</div> <a-avatar class="avatar" size="small" shape="circle" :src="user.avatar" />
<a-menu :class="['avatar-menu']" slot="overlay"> <span class="name">{{ user.nickname }}</span>
<a-menu-item @click="adminUser"> </div>
<a-icon type="user"/> <a-menu :class="['avatar-menu']" slot="overlay">
<span>用户管理</span> <a-menu-item @click="adminUser">
</a-menu-item> <a-icon type="user" />
<a-menu-divider /> <span>用户管理</span>
<a-menu-item @click="logout"> </a-menu-item>
<a-icon style="margin-right: 8px;" type="poweroff" />
<span>退出登录</span> <a-menu-item @click="showCompany" v-if="!isMiddleAdmin()">
</a-menu-item> <a-icon type="compass" />
</a-menu> <span>切换公司</span>
</a-dropdown> </a-menu-item>
<a-menu-divider />
<a-menu-item @click="logout">
<a-icon style="margin-right: 8px;" type="poweroff" />
<span>退出登录</span>
</a-menu-item>
</a-menu>
</a-dropdown>
<switch-company v-model="companyShow" :data="companyData" @confirm="companyconfirm"
ref="switchCompany"></switch-company>
<login-actions ref="loginActions"></login-actions>
</div>
</template> </template>
<script> <script>
import {mapGetters} from 'vuex' // vuexmapGetters import { mapGetters } from 'vuex' // vuexmapGetters
import {logout} from '@/services/base/user' // 退 import { logout } from '@/services/base/user' // 退
import LoginActions from '@/components/login/loginActions.vue'
import { switchCompany, companyList } from '@/services/base/user'
import { USER_MODEL } from '@/services/base/api.js';
export default { export default {
name: 'HeaderAvatar', // name: 'HeaderAvatar', //
components: { LoginActions },
computed: { computed: {
...mapGetters('account', ['user']), // ...mapGetters('account', ['user']), //
}, },
data() {
return {
companyShow: false,
companyData: []
};
},
methods: { methods: {
adminUser(){ adminUser() {
this.$router.push('/AdminUser/AdminUserList'); this.$router.push('/AdminUser/AdminUserList');
}, },
logout() { // 退 logout() { // 退
logout() // 退 logout() // 退
this.$router.push('/login') // this.$router.push('/login') //
},
showCompany() {
this.companyShow = true;
companyList().then(result => {
result = result.data;
this.companyData = result.data.company_switch;
});
},
isMiddleAdmin() {
return USER_MODEL == "AdminUser";
},
companyconfirm({ row }) {
if (!row) {
return;
}
this.companyShow = false;
switchCompany(row.id).then(result => {
result = result.data;
this.$refs.loginActions.afterLoginSuccess({
token: result.data.access_token,
access_expire: result.data.access_expire,
uid: result.data.uid,
msg: "切换成功"
});
});
} }
} }
} }
</script> </script>
<style lang="less"> <style lang="less">
.header-avatar{ .header-avatar {
display: inline-flex; display: inline-flex;
.avatar, .name{
align-self: center; .avatar,
} .name {
.avatar{ align-self: center;
margin-right: 8px;
}
.name{
font-weight: 500;
}
}
.avatar-menu{
width: 150px;
} }
.avatar {
margin-right: 8px;
}
.name {
font-weight: 500;
}
}
.avatar-menu {
width: 150px;
}
</style> </style>

View File

@ -37,6 +37,7 @@
</a-badge> </a-badge>
</span> </span>
</a-dropdown> </a-dropdown>
</template> </template>
<script> <script>

View File

@ -29,9 +29,6 @@
</a-input> </a-input>
</a-form-item> </a-form-item>
<a-form-item v-if="false">
<a-input-search placeholder="选择公司" enter-button @search="onCompanySearch" />
</a-form-item>
@ -74,45 +71,29 @@
</div> </div>
</a-form> </a-form>
<vxe-modal v-model="companyShow" @confirm="confirmEvent" width="600" show-footer> <switch-company v-model="companyShow" :data="companyData" @confirm="companyconfirm" ref="switchCompany" ></switch-company>
<template #title>
<span>选择公司</span>
</template>
<template #default>
<vxe-table ref="xTable" show-overflow auto-resize height="300" :rowConfig="{ isCurrent: true, isHover: true }"
:data="companyData">
<vxe-column type="seq" width="60"></vxe-column>
<vxe-column field="title" title="公司名"></vxe-column>
<vxe-column field="desc" title="描述"></vxe-column>
</vxe-table>
</template>
</vxe-modal>
</div> </div>
<login-actions ref="loginActions"></login-actions>
</common-layout> </common-layout>
</template> </template>
<script> <script>
import CommonLayout from '@/layouts/CommonLayout' import CommonLayout from '@/layouts/CommonLayout'
import { login, switchCompany, getUserInfo, getRoutesConfig, getPermission, getSettings, getCompany, getProject } from '@/services/base/user' import { login, switchCompany, getProject } from '@/services/base/user'
import { setAuthorization, setCompany } from '@/utils/request' import { setAuthorization } from '@/utils/request'
import { loadRoutes } from '@/utils/routerUtil'
import { mapMutations } from 'vuex' import { mapMutations } from 'vuex'
import Cookie from 'js-cookie' import Cookie from 'js-cookie'
import { USER_MODEL } from '@/services/base/api.js'; import { USER_MODEL } from '@/services/base/api.js';
import LoginActions from '@/components/login/loginActions.vue'
export default { export default {
name: 'Login', name: 'Login',
components: { CommonLayout }, components: { CommonLayout, LoginActions },
data() { data() {
return { return {
logging: false, logging: false,
@ -163,12 +144,8 @@ export default {
...mapMutations('account', ['setUid', 'setUser', 'setPermissions', 'setRoutesConfig', 'setSettings', 'setCompany', 'setProject']), ...mapMutations('account', ['setUid', 'setUser', 'setPermissions', 'setRoutesConfig', 'setSettings', 'setCompany', 'setProject']),
onCompanySearch() { companyconfirm({row}) {
this.companyShow = true; this.companyShow = false;
},
confirmEvent() {
let row = this.$refs.xTable.getCurrentRecord();
// //
if (!row || row.id == this.companyData[0].id) { if (!row || row.id == this.companyData[0].id) {
this.afterLoginSuccess({ this.afterLoginSuccess({
@ -201,7 +178,6 @@ export default {
}, },
isMiddleAdmin() { isMiddleAdmin() {
console.log(USER_MODEL)
return USER_MODEL == "AdminUser"; return USER_MODEL == "AdminUser";
}, },
onSubmit(e) { onSubmit(e) {
@ -237,56 +213,15 @@ export default {
} else { } else {
console.log("登录失败") console.log("登录失败")
this.error = loginRes.message this.error = loginRes.message || loginRes.msg
} }
}, },
afterLoginSuccess({ token, access_expire, uid, loginResMsg }) { afterLoginSuccess({ token, access_expire, uid, loginResMsg }) {
setAuthorization({ token: token, expireAt: new Date(access_expire * 1000) }) // token this.$refs.loginActions.afterLoginSuccess({ token, access_expire, uid, msg :loginResMsg});
this.setUid(uid) // id
getUserInfo().then(result => { //
if (result.data.data != null) {
const UserInfo = result.data.data.user_info
this.setUser(UserInfo)
}
})
getPermission().then(result => { //
if (result.data.data != null) {
const Permission = result.data.data.setPermissions
this.setPermissions(Permission)
}
})
getRoutesConfig().then(result => { //
if (result.data.data != null) {
const routesConfig = result.data.data
this.setRoutesConfig(routesConfig)
loadRoutes([routesConfig])
this.$router.push('/dashboard/workplace')
this.$message.success(loginResMsg, 3)
}
})
getSettings().then(result => { //
if (result.data.data != null) {
const settings = result.data.data
this.setSettings(settings)
}
})
getCompany().then(result => { //
if (result.data.data != null) {
const company = result.data.data
this.setCompany(company) // vuex
setCompany(company.company_info) // cookies
}
})
} }
} }
} }

View File

@ -16,6 +16,7 @@ module.exports = {
}, // 获取项目信息 }, // 获取项目信息
LOGIN: {url:`${BASE_URL}/${USER_MODEL}/v1/login`, method:METHOD.POST}, // 登录 LOGIN: {url:`${BASE_URL}/${USER_MODEL}/v1/login`, method:METHOD.POST}, // 登录
SWITCHCOMPANY: {url:`${BASE_URL}/${USER_MODEL}/v1/switch/company`, method:METHOD.POST}, // 登录 SWITCHCOMPANY: {url:`${BASE_URL}/${USER_MODEL}/v1/switch/company`, method:METHOD.POST}, // 登录
COMPANYLIST: {url:`${BASE_URL}/${USER_MODEL}/v1/user/company/list`, method:METHOD.POST}, // 登录
ROUTERS: {url:`${BASE_URL}/${USER_MODEL}/v1/routers`, method:METHOD.POST}, // 获取路由配置 ROUTERS: {url:`${BASE_URL}/${USER_MODEL}/v1/routers`, method:METHOD.POST}, // 获取路由配置
USERINFO: {url:`${BASE_URL}/${USER_MODEL}/v1/userinfo`, method:METHOD.POST}, // 获取用户信息 USERINFO: {url:`${BASE_URL}/${USER_MODEL}/v1/userinfo`, method:METHOD.POST}, // 获取用户信息
COMPANY: {url:`${BASE_URL}/${USER_MODEL}/v1/company`, method:METHOD.POST}, // 获取公司信息 COMPANY: {url:`${BASE_URL}/${USER_MODEL}/v1/company`, method:METHOD.POST}, // 获取公司信息

View File

@ -1,4 +1,4 @@
import { LOGIN, SWITCHCOMPANY , ROUTERS, USERINFO, PERMISSION, SETTINGS, PROJECT, COMPANY } from '@/services/base/api' import { LOGIN, SWITCHCOMPANY ,COMPANYLIST , ROUTERS, USERINFO, PERMISSION, SETTINGS, PROJECT, COMPANY } from '@/services/base/api'
import { request, removeAuthorization } from '@/utils/request' import { request, removeAuthorization } from '@/utils/request'
/** /**
* 登录服务 * 登录服务
@ -35,7 +35,10 @@ export async function switchCompany(company_id) { // 获取用户信息
company_id: company_id company_id: company_id
}) })
} }
export async function companyList() { // 获取用户信息
return request(COMPANYLIST.url, COMPANYLIST.method, {
})
}
/** /**
* 获取路由配置 * 获取路由配置
* @param uid * @param uid
@ -118,5 +121,6 @@ export default {
getSettings, getSettings,
getProject, getProject,
getCompany, getCompany,
switchCompany switchCompany,
companyList
} }

View File

@ -74,8 +74,10 @@ async function request(url, method, params, config) { // 请求方法
function setAuthorization(auth, authType = AUTH_TYPE.BEARER) { // 设置认证信息 function setAuthorization(auth, authType = AUTH_TYPE.BEARER) { // 设置认证信息
switch (authType) { switch (authType) {
case AUTH_TYPE.BEARER: case AUTH_TYPE.BEARER:
Cookie.set(xsrfHeaderName, 'Bearer ' + auth.token, {expires: auth.expireAt}) // 设置cookie中的认证信息// 设置axios请求头 Cookie.set(xsrfHeaderName, 'Bearer ' + auth.token, {expires: auth.expireAt}) // 设置cookie中的认证信息// 设置axios请求头
// 如果 xsrfHeaderName 存在于 cookie 中,则设置到 axios 的请求头中 // 如果 xsrfHeaderName 存在于 cookie 中,则设置到 axios 的请求头中
axios.defaults.headers.common[xsrfHeaderName] = Cookie.get(xsrfHeaderName) axios.defaults.headers.common[xsrfHeaderName] = Cookie.get(xsrfHeaderName)
break break