xy 2 years ago
parent f4897c4ea2
commit 1a5823e903

@ -1,30 +1,30 @@
import request from '@/utils/request';
import qs from 'qs';
export function index (params) {
import request from '@/utils/request'
import qs from 'qs'
export function index(params) {
return request({
url: "/api/backend/module",
method: "get",
url: '/api/backend/module',
method: 'get',
params
})
}
export function save (data) {
export function save(data) {
return request({
url: "/api/backend/module/save",
method: "post",
url: '/api/backend/module/save',
method: 'post',
data
})
}
export function destroy (data) {
export function destroy(data) {
return request({
url: "/api/backend/module/delete",
method: "post",
url: '/api/backend/module/delete',
method: 'post',
data
})
}
export function menu (params) {
export function menu(params) {
return request({
method: 'get',
url: '/api/backend/module/menu',
@ -32,7 +32,7 @@ export function menu (params) {
})
}
export function menuSave (data) {
export function menuSave(data) {
return request({
method: 'post',
url: '/api/backend/module/menu/save',
@ -40,7 +40,7 @@ export function menuSave (data) {
})
}
export function menuDestroy (data) {
export function menuDestroy(data) {
return request({
method: 'post',
url: '/api/backend/module/menu/delete',
@ -48,7 +48,7 @@ export function menuDestroy (data) {
})
}
export function role (params) {
export function role(params) {
return request({
method: 'get',
url: '/api/backend/module/role',
@ -56,7 +56,7 @@ export function role (params) {
})
}
export function roleSave (data) {
export function roleSave(data) {
return request({
method: 'post',
url: '/api/backend/module/role/save',
@ -64,14 +64,14 @@ export function roleSave (data) {
})
}
export function roleDestroy (data) {
export function roleDestroy(data) {
return request({
method: 'post',
url: '/api/backend/module/role/delete',
data
})
}
export function getPermissions (params) {
export function getPermissions(params) {
return request({
method: 'get',
url: '/api/backend/module/role/get-permissions',
@ -79,7 +79,7 @@ export function getPermissions (params) {
})
}
export function setPermissions (data) {
export function setPermissions(data) {
return request({
method: 'post',
url: '/api/backend/module/role/set-permissions',
@ -95,18 +95,18 @@ export function grant(params) {
})
}
export function setRoles (data) {
export function setRoles(data) {
return request({
method: 'post',
url: '/api/backend/module/grant/set-roles',
data: (() => {
const serializerStr = qs.stringify(data,{ arrayFormat: 'brackets' })?.split('&') || []
const formData = new FormData();
const serializerStr = qs.stringify(data, { arrayFormat: 'brackets' })?.split('&') || []
const formData = new FormData()
serializerStr.forEach(item => {
let [key,value] = window.decodeURIComponent(item)?.split('=')
formData.append(key,value)
const [key, value] = window.decodeURIComponent(item)?.split('=')
formData.append(key, value)
})
return formData;
return formData
})(),
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
@ -118,6 +118,14 @@ export function getRoles(params) {
return request({
method: 'get',
url: '/api/backend/module/grant/get-roles',
params,
params
})
}
export function batchRoles(data) {
return request({
url: '/api/backend/module/grant/batch-set-roles',
method: 'post',
data
})
}

@ -1,41 +1,49 @@
import request from '@/utils/request';
import request from '@/utils/request'
export function index (params) {
export function index(params) {
return request({
url: "/api/backend/role",
method: "get",
url: '/api/backend/role',
method: 'get',
params
})
}
export function save (data) {
export function save(data) {
return request({
url: "/api/backend/role/save",
method: "post",
url: '/api/backend/role/save',
method: 'post',
data
})
}
export function destroy (data) {
export function destroy(data) {
return request({
url: "/api/backend/role/delete",
method: "post",
url: '/api/backend/role/delete',
method: 'post',
data
})
}
export function getPermissions (params) {
export function getPermissions(params) {
return request({
url: "/api/backend/role/get-permissions",
method: "get",
url: '/api/backend/role/get-permissions',
method: 'get',
params
})
}
export function setPermissions (data) {
export function setPermissions(data) {
return request({
url: "/api/backend/role/set-permissions",
method: "post",
url: '/api/backend/role/set-permissions',
method: 'post',
data
})
}
export function batchUser(data) {
return request({
url: '/api/backend/role/batch-user',
method: 'post',
data
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 983 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

@ -45,14 +45,14 @@
</div>
</template>
<theme-picker class="tool-item" />
<el-badge :is-dot="device === 'mobile'" :max="99" :value="12" class="tool-item">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M10 5a2 2 0 1 1 4 0a7 7 0 0 1 4 6v3a4 4 0 0 0 2 3h-16a4 4 0 0 0 2 -3v-3a7 7 0 0 1 4 -6" /><path d="M9 17v1a3 3 0 0 0 6 0v-1" /></svg>
</el-badge>
<!-- <el-badge :is-dot="device === 'mobile'" :max="99" :value="12" class="tool-item">-->
<!-- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M10 5a2 2 0 1 1 4 0a7 7 0 0 1 4 6v3a4 4 0 0 0 2 3h-16a4 4 0 0 0 2 -3v-3a7 7 0 0 1 4 -6" /><path d="M9 17v1a3 3 0 0 0 6 0v-1" /></svg>-->
<!-- </el-badge>-->
</div>
<div class="nav-item">
<el-dropdown @command="userCommandHandle">
<a class="nav-link d-flex lh-1 text-reset p-0 nav-info">
<img class="avatar avatar-sm" style="" src="@/assets/face.jpg" alt="">
<img class="avatar avatar-sm" style="" src="@/assets/face.png" alt="">
<div class="d-none d-xl-block ps-2">
<div>{{ name }}</div>
<div class="mt-1 small" style="color: #eee;">{{ (department && department.name) ? department.name : '暂无部门' }}</div>
@ -179,7 +179,7 @@ export default {
methods: {
toggleIframeSidebarOpened() {
const iframe = document.querySelector('#iframe-cpn')
if (iframe) {
if (iframe && document.querySelector('.sidebar-container')) {
iframe.contentWindow.toggleSideBar()
this.isIframeSidebarOpened = Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true
} else {

@ -1,7 +1,7 @@
module.exports = {
title: 'Vue Admin Template',
copyright: '常州环境监测中心',
title: '内控管理平台',
copyright: '内控管理平台',
/**
* @type {boolean} true | false

@ -67,3 +67,14 @@ div:focus {
#nprogress .bar {
background: var(--theme-color) !important;
}
.vue-treeselect__multi-value-item,.vue-treeselect__value-remove {
color: var(--theme-color) !important;
}
.vue-treeselect__checkbox--checked {
background-color: var(--theme-color) !important;
border-color: var(--theme-color) !important;
}
.vxe-loading--default-icon,.vxe-loading--text {
color: var(--theme-color) !important;;
}

@ -38,11 +38,20 @@
}
.navbar-module {
flex: 1;
overflow: hidden;
overflow-y: hidden;
.modules__toggler {
color: #fff;
}
#navbar-menu {
overflow-x: scroll;
&::-webkit-scrollbar {
background-color: transparent;
height: 0;
width: 0;
}
}
}
.navbar-nav {
display: flex;

@ -1,7 +1,6 @@
<template>
<el-card id="todo-card" class="box-card" shadow="hover">
<div slot="header" class="clearfix">
<el-button @click="test">aa</el-button>
<SvgIcon style="color: var(--theme-color);width: 22px;height: 22px;" icon-class="notice" />
<span
style="padding-left: 15px"
@ -203,9 +202,9 @@ export default {
try {
const data = JSON.parse(row.data)
if (data.from === 'ht') {
this.modalUrl = `/${data.from}?auth_token=${window.encodeURIComponent(getToken())}&module_name=${data.from}&to=${window.encodeURIComponent('/contract/contractList?keyword=' + (/\[(.*?)]/.exec(data.title) ? /\[(.*?)]/.exec(data.title)[1] : ''))}`
this.modalUrl = `/${data.from}/#/contract/contractList?auth_token=${window.encodeURIComponent(getToken())}&module_name=${data.from}&keyword=${(/\[(.*?)]/.exec(data.title) ? /\[(.*?)]/.exec(data.title)[1] : '')}`
} else if (data.from === 'oa') {
this.modalUrl = `/${data.from}?auth_token=${window.encodeURIComponent(getToken())}&module_name=${data.from}&to=${window.encodeURIComponent(`/flow/create?flow_id=${data.other?.flow_id}`)}`
this.modalUrl = `/${data.from}/#/flow/create?auth_token=${window.encodeURIComponent(getToken())}&module_name=${data.from}&flow_id=${data.other?.flow_id}`
}
console.log(this.modalUrl)
this.isShowModal = true

@ -1,36 +1,40 @@
<template>
<div>
<vxe-modal :value="isShow"
show-footer
title="部门"
show-confirm-button
:width="600"
:height="400"
esc-closable
@input="e => $emit('update:isShow',e)">
<vxe-modal
:value="isShow"
show-footer
title="部门"
show-confirm-button
:width="600"
:height="400"
esc-closable
@input="e => $emit('update:isShow',e)"
>
<el-form ref="elForm" :model="form" :rules="rules" label-position="top" label-width="100">
<el-form-item label="部门名称" prop="name" required>
<el-input v-model="form.name" clearable></el-input>
<el-input v-model="form.name" clearable />
</el-form-item>
<el-form-item label="父级部门" prop="pid">
<Treeselect v-model="form.pid"
:options="formatList"
noChildrenText="无子部门"
:normalizer="node => ({
id: node.id,
label: node.name,
children: node.children,
isDefaultExpanded: true
})"></Treeselect>
<Treeselect
v-model="form.pid"
:options="formatList"
no-children-text="无子部门"
:normalizer="node => ({
id: node.id,
label: node.name,
children: node.children,
isDefaultExpanded: true
})"
/>
</el-form-item>
<el-form-item label="分管领导" prop="manager_id">
<user-picker width="100%" v-model="form.manager_id"></user-picker>
<el-form-item label="分管负责人" prop="manager_id">
<user-picker v-model="form.manager_id" width="100%" />
</el-form-item>
<el-form-item label="主要负责人" prop="leader_id">
<user-picker width="100%" v-model="form.leader_id"></user-picker>
<el-form-item label="主要领导" prop="leader_id">
<user-picker v-model="form.leader_id" width="100%" />
</el-form-item>
<el-form-item label="排序" prop="sortnumber">
<el-input-number controls-position="right" :precision="0" v-model="form.sortnumber"></el-input-number>
<el-input-number v-model="form.sortnumber" controls-position="right" :precision="0" />
</el-form-item>
</el-form>
@ -43,7 +47,7 @@
<script>
import UserPicker from '@/components/UserPicker/index.vue'
import { save } from "@/api/department"
import { save } from '@/api/department'
export default {
components: {
UserPicker
@ -63,48 +67,48 @@ export default {
return {
loading: false,
form: {
name: "",
name: '',
pid: 0,
manager_id: "",
leader_id: "",
manager_id: '',
leader_id: '',
sortnumber: 0
},
rules: {
name: [
{ required: true, message: "请输入模块名称" }
{ required: true, message: '请输入模块名称' }
]
}
}
},
computed: {
formatList() {
return [
{
name: '#根部门',
id: 0
},
...this.list
]
}
},
methods: {
submit () {
this.$refs["elForm"].validate(async valid => {
submit() {
this.$refs['elForm'].validate(async valid => {
if (valid) {
this.loading = true
try {
await save(this.form)
this.$message.success("新增成功")
this.$message.success('新增成功')
this.$emit('refresh')
this.$emit('update:isShow',false)
this.$emit('update:isShow', false)
this.loading = false
this.$refs["elForm"].resetFields()
this.$refs['elForm'].resetFields()
} catch (err) {
this.loading = false
}
}
})
}
},
computed: {
formatList() {
return [
{
name: "#根部门",
id: 0
},
...this.list
]
}
}
}
</script>

@ -0,0 +1,174 @@
<template>
<div>
<vxe-modal
:value="isShow"
show-footer
title="绑定用户"
show-confirm-button
:width="600"
:height="600"
esc-closable
@input="e => $emit('update:isShow',e)"
>
<template>
<vxe-table
ref="table"
stripe
style="margin-top: 10px;"
keep-source
show-overflow
:row-config="{ keyField: 'id' }"
:column-config="{ resizable: true }"
:checkbox-config="{ trigger: 'row', highlight: true, reserve: true }"
:data="tableData"
>
<vxe-column type="checkbox" width="60" fixed="left" />
<vxe-column type="seq" width="58" align="center" />
<vxe-column field="name" width="140" title="姓名" />
<vxe-column field="department.name" width="160" align="center" title="部门" />
<vxe-column field="position" width="140" title="职位" align="center" />
<vxe-column field="mobile" width="140" align="center" title="手机号" />
</vxe-table>
<el-pagination
style="margin-top: 10px;"
:current-page="select.page"
:page-sizes="[20, 30, 40, 50]"
:page-size="select.rows"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="e => {
select.rows = e;
select.page = 1;
getUsers();
}"
@current-change="e => {
select.page = e;
getUsers();
}"
/>
</template>
<template #footer>
<el-button type="primary" :loading="loading" @click="submit"></el-button>
</template>
</vxe-modal>
</div>
</template>
<script>
import { index } from '@/api/user'
import { batchUser } from '@/api/role'
export default {
props: {
isShow: {
type: Boolean,
default: false,
required: true
}
},
data() {
return {
loading: false,
select: {
page: 1,
rows: 20,
keyword: ''
},
tableData: [],
total: 0,
form: {
id: '',
user_ids: []
}
}
},
computed: {},
watch: {
'form.user_ids': function(val, oldVal) {
this.setSelectRow()
},
isShow(newVal) {
if (newVal) {
this.getRoleUsers()
}
}
},
created() {
this.getUsers()
},
methods: {
/**
* @param {array[string]} keys
* @param {array[all]} values
* @returns {void}
*/
setForm(keys = [], values = []) {
keys.forEach((key, index) => {
this.form[key] = values[index]
})
},
setSelectRow() {
this.$nextTick(() => {
if (this.$refs['table']) {
this.$refs['table'].clearCheckboxRow()
this.$refs['table'].setCheckboxRow(
this.tableData.filter(row => this.form.user_ids.findIndex(j => j === row.id) !== -1),
true
)
}
})
},
async getUsers() {
const res = await index(this.select)
this.tableData = res.data
this.total = res.total
},
async getRoleUsers() {
try {
const res = await index({
page: 1,
rows: 9999,
role_id: this.form.id
})
this.form.user_ids = res.data?.map(i => i.id)
} catch (err) {
console.error(err)
}
},
async submit() {
if (this.$refs['table']) {
this.loading = true
const selectRecords = this.$refs['table'].getCheckboxRecords()
try {
batchUser({
id: this.form.id,
user_ids: selectRecords.map(row => row.id)
})
//
setTimeout(() => {
this.loading = false
this.$emit('update:isShow', false)
this.$emit('refresh')
}, 500)
} catch (err) {
this.loading = false
}
}
}
}
}
</script>
<style scoped lang="scss">
.total {
color: #666;
text-align: right;
line-height: 3;
}
</style>

@ -1,26 +1,29 @@
<template>
<div>
<vxe-modal :value="isShow"
show-footer
title="绑定角色"
show-confirm-button
:width="600"
:height="600"
esc-closable
@input="e => $emit('update:isShow',e)">
<vxe-modal
:value="isShow"
show-footer
title="绑定角色"
show-confirm-button
:width="600"
:height="600"
esc-closable
@input="e => $emit('update:isShow',e)"
>
<template>
<vxe-table
ref="table"
stripe
style="margin-top: 10px;"
ref="table"
keep-source
show-overflow
:column-config="{ resizable: true }"
:checkbox-config="{ trigger: 'row', highlight: true }"
:data="tableData">
<vxe-column type="checkbox" width="60" fixed="left"></vxe-column>
<vxe-column type="seq" width="58" align="center"></vxe-column>
<vxe-column field="name" width="160" title="角色"></vxe-column>
:data="tableData"
>
<vxe-column type="checkbox" width="60" fixed="left" />
<vxe-column type="seq" width="58" align="center" />
<vxe-column field="name" width="160" title="角色" />
<vxe-column field="permissions" title="权限菜单" min-width="200" show-overflow="tooltip">
<template #default="{ row }">
<div>
@ -28,7 +31,7 @@
</div>
</template>
</vxe-column>
<vxe-column field="sortnumber" width="80" title="排序" align="center"></vxe-column>
<vxe-column field="sortnumber" width="80" title="排序" align="center" />
</vxe-table>
<p class="total" type="primary"> {{ total }} 条数据</p>
</template>
@ -41,7 +44,7 @@
</template>
<script>
import { setRoles, getRoles } from "@/api/user"
import { setRoles, getRoles } from '@/api/user'
export default {
props: {
isShow: {
@ -57,24 +60,33 @@ export default {
tableData: [],
total: 0,
form: {
id: "",
id: '',
role_id: []
}
}
},
computed: {},
watch: {
'form.role_id': function(val, oldVal) {
this.setSelectRow()
}
},
created() {
this.getRoles()
},
methods: {
/**
* @param {array[string]} keys
* @param {array[all]} values
* @returns {void}
*/
setForm (keys = [],values = []) {
setForm(keys = [], values = []) {
keys.forEach((key, index) => {
this.form[key] = values[index]
})
},
setSelectRow () {
setSelectRow() {
this.$nextTick(() => {
if (this.$refs['table']) {
this.$refs['table'].clearCheckboxRow()
@ -86,41 +98,32 @@ export default {
})
},
async getRoles () {
async getRoles() {
const res = await getRoles()
this.tableData = res;
this.total = res.length;
this.tableData = res
this.total = res.length
},
async submit () {
async submit() {
if (this.$refs['table']) {
this.loading = true;
this.loading = true
const selectRecords = this.$refs['table'].getCheckboxRecords()
try {
setRoles({
id: this.form.id,
role_id: selectRecords.map(row => row.id)
})
//
//
setTimeout(() => {
this.loading = false;
this.$emit("update:isShow",false)
this.$emit("refresh")
},500)
this.loading = false
this.$emit('update:isShow', false)
this.$emit('refresh')
}, 500)
} catch (err) {
this.loading = false;
this.loading = false
}
}
}
},
computed: {},
watch: {
"form.role_id": function(val, oldVal) {
this.setSelectRow()
}
},
created() {
this.getRoles()
}
}
</script>

@ -125,6 +125,7 @@
<el-button size="small" type="primary" plain @click="cancelRowEvent(row,'roleTable')"></el-button>
</template>
<template v-else>
<el-button size="small" type="primary" @click="$refs['ModuleBatchUsers'].setForm(['role_id'], [row.id]),isShowBatchUsers = true">绑定用户</el-button>
<el-button size="small" type="success" @click="bindPermission(row)"></el-button>
<el-button size="small" type="warning" @click="editRowEvent(row)"></el-button>
<el-button size="small" type="danger" @click="destroyRoleRowEvent(row,'roleTable')"></el-button>
@ -198,6 +199,7 @@
<ModuleAuthAddRole ref="ModuleAuthAddRole" :is-show.sync="isShowAddRole" :module-id="moduleId" @refresh="getRole" />
<ModuleAuthBindPermissions ref="ModuleAuthBindPermissions" :is-show.sync="isShowBindPermissions" :module-id="moduleId" @refresh="getRole" />
<ModuleAuthBindRole ref="ModuleAuthBindRole" :is-show.sync="isShowBindRoles" :module-id="moduleId" @refresh="getUsers" />
<ModuleBatchUsers ref="ModuleBatchUsers" :is-show.sync="isShowBatchUsers" :module-id="moduleId" @refresh="getRole" />
</div>
</template>
@ -208,6 +210,7 @@ import ModuleAuthAddRole from './ModuleAuthAddRole.vue'
import Icon from '@/layout/components/Navbar/Icon.vue'
import ModuleAuthBindPermissions from './ModuleAuthBindPermissions.vue'
import ModuleAuthBindRole from './ModuleAuthBindRole.vue'
import ModuleBatchUsers from './ModuleBatchUsers.vue'
import { menu, menuSave, menuDestroy, role, roleDestroy, roleSave, grant } from '@/api/module'
import { deepCopy } from '@/utils'
export default {
@ -217,6 +220,7 @@ export default {
ModuleAuthAddMenu,
ModuleAuthAddRole,
ModuleAuthBindRole,
ModuleBatchUsers,
SvgIcon
},
props: {
@ -259,6 +263,7 @@ export default {
sortnumber: 0
},
isShowBatchUsers: false,
isShowAddRole: false,
roles: [],
roleTotal: 0,
@ -324,7 +329,8 @@ export default {
},
methods: {
bindPermission(row) {
this.$refs['ModuleAuthBindPermissions'].setForm(['permission_id'], [row.permissions?.map(i => i.id) || []])
console.log(row.id)
this.$refs['ModuleAuthBindPermissions'].setForm(['id', 'permission_id'], [row.id, row.permissions?.map(i => i.id) || []])
this.isShowBindPermissions = true
},
bindRole(row) {

@ -1,28 +1,32 @@
<template>
<div>
<vxe-modal :value="isShow"
show-footer
:z-index="zIndex"
title="绑定权限"
show-confirm-button
:width="600"
:height="600"
esc-closable
@input="e => $emit('update:isShow',e)">
<vxe-modal
:value="isShow"
show-footer
:z-index="zIndex"
title="绑定权限"
show-confirm-button
:width="600"
:height="600"
esc-closable
@input="e => $emit('update:isShow',e)"
>
<template>
<Treeselect v-model="form.permission_id"
:options="tableData"
flat
always-open
multiple
clearable
noChildrenText="无子菜单"
:normalizer="node => ({
id: node.id,
label: node.name,
children: node.children,
isDefaultExpanded: true
})"></Treeselect>
<Treeselect
v-model="form.permission_id"
:options="tableData"
flat
always-open
multiple
clearable
no-children-text="无子菜单"
:normalizer="node => ({
id: node.id,
label: node.name,
children: node.children,
isDefaultExpanded: true
})"
/>
</template>
<template #footer>
@ -33,11 +37,11 @@
</template>
<script>
import { setPermissions, getPermissions } from "@/api/module"
import { setPermissions, getPermissions } from '@/api/module'
import { PopupManager } from 'element-ui/lib/utils/popup'
export default {
props: {
moduleId: [String,Number],
moduleId: [String, Number],
isShow: {
type: Boolean,
default: false,
@ -52,54 +56,53 @@ export default {
tableData: [],
total: 0,
form: {
id: "",
id: '',
permission_id: []
}
}
},
computed: {},
watch: {
isShow(newVal) {
if (newVal) {
this.getPermission()
this.zIndex = PopupManager.nextZIndex()
}
}
},
created() {
this.getPermission()
},
methods: {
/**
* @param {array[string]} keys
* @param {array[all]} values
* @returns {void}
*/
setForm (keys = [],values = []) {
setForm(keys = [], values = []) {
keys.forEach((key, index) => {
this.form[key] = values[index]
})
},
async getPermission () {
async getPermission() {
const res = await getPermissions({
module_id: this.moduleId
})
this.tableData = res;
this.tableData = res
},
async submit () {
this.loading = true;
async submit() {
this.loading = true
try {
this.form.id = this.moduleId
await setPermissions(this.form)
this.$emit("update:isShow",false)
this.$emit("refresh")
this.loading = false;
this.$emit('update:isShow', false)
this.$emit('refresh')
this.loading = false
} catch (err) {
this.loading = false;
this.loading = false
}
}
},
watch: {
isShow(newVal) {
if (newVal) {
this.getPermission()
this.zIndex = PopupManager.nextZIndex()
}
},
},
computed: {},
created() {
this.getPermission()
}
}
</script>

@ -1,27 +1,30 @@
<template>
<div>
<vxe-modal :value="isShow"
:z-index="zIndex"
show-footer
title="绑定角色"
show-confirm-button
:width="600"
:height="600"
esc-closable
@input="e => $emit('update:isShow',e)">
<vxe-modal
:value="isShow"
:z-index="zIndex"
show-footer
title="绑定角色"
show-confirm-button
:width="600"
:height="600"
esc-closable
@input="e => $emit('update:isShow',e)"
>
<template>
<vxe-table
ref="table"
stripe
style="margin-top: 10px;"
ref="table"
keep-source
show-overflow
:column-config="{ resizable: true }"
:checkbox-config="{ trigger: 'row', highlight: true }"
:data="tableData">
<vxe-column type="checkbox" width="60" fixed="left"></vxe-column>
<vxe-column type="seq" width="58" align="center"></vxe-column>
<vxe-column field="name" width="160" title="角色"></vxe-column>
:data="tableData"
>
<vxe-column type="checkbox" width="60" fixed="left" />
<vxe-column type="seq" width="58" align="center" />
<vxe-column field="name" width="160" title="角色" />
<vxe-column field="permissions" title="权限菜单" min-width="200" show-overflow="tooltip">
<template #default="{ row }">
<div>
@ -29,7 +32,7 @@
</div>
</template>
</vxe-column>
<vxe-column field="sortnumber" width="80" title="排序" align="center"></vxe-column>
<vxe-column field="sortnumber" width="80" title="排序" align="center" />
</vxe-table>
<p class="total" type="primary"> {{ total }} 条数据</p>
</template>
@ -42,11 +45,11 @@
</template>
<script>
import { setRoles, getRoles } from "@/api/module"
import { setRoles, getRoles } from '@/api/module'
import { PopupManager } from 'element-ui/lib/utils/popup'
export default {
props: {
moduleId: [String,Number],
moduleId: [String, Number],
isShow: {
type: Boolean,
default: false,
@ -61,24 +64,38 @@ export default {
tableData: [],
total: 0,
form: {
id: "",
id: '',
role_id: []
}
}
},
computed: {},
watch: {
'form.role_id': function(val, oldVal) {
this.setSelectRow()
},
isShow(newVal) {
if (newVal) {
this.getRoles()
this.zIndex = PopupManager.nextZIndex()
}
}
},
created() {
},
methods: {
/**
* @param {array[string]} keys
* @param {array[all]} values
* @returns {void}
*/
setForm (keys = [],values = []) {
setForm(keys = [], values = []) {
keys.forEach((key, index) => {
this.form[key] = values[index]
})
},
setSelectRow () {
setSelectRow() {
this.$nextTick(() => {
if (this.$refs['table']) {
this.$refs['table'].clearCheckboxRow()
@ -90,18 +107,18 @@ export default {
})
},
async getRoles () {
async getRoles() {
const res = await getRoles({
module_id: this.moduleId,
data_only: 1
})
this.tableData = res;
this.total = res.length;
this.tableData = res
this.total = res.length
},
async submit () {
async submit() {
if (this.$refs['table']) {
this.loading = true;
this.loading = true
const selectRecords = this.$refs['table'].getCheckboxRecords()
try {
setRoles({
@ -109,31 +126,17 @@ export default {
module_id: this.moduleId,
role_id: selectRecords.map(row => row.id)
})
//
//
setTimeout(() => {
this.loading = false;
this.$emit("update:isShow",false)
this.$emit("refresh")
},500)
this.loading = false
this.$emit('update:isShow', false)
this.$emit('refresh')
}, 500)
} catch (err) {
this.loading = false;
this.loading = false
}
}
}
},
computed: {},
watch: {
"form.role_id": function(val, oldVal) {
this.setSelectRow()
},
isShow(newVal) {
if (newVal) {
this.getRoles()
this.zIndex = PopupManager.nextZIndex()
}
},
},
created() {
}
}
</script>

@ -0,0 +1,187 @@
<template>
<div>
<vxe-modal
:z-index="zIndex"
:value="isShow"
show-footer
title="绑定用户"
show-confirm-button
:width="600"
:height="600"
esc-closable
@input="e => $emit('update:isShow',e)"
>
<template>
<vxe-table
ref="table"
stripe
style="margin-top: 10px;"
keep-source
show-overflow
:row-config="{ keyField: 'id' }"
:column-config="{ resizable: true }"
:checkbox-config="{ trigger: 'row', highlight: true, reserve: true }"
:data="tableData"
>
<vxe-column type="checkbox" width="60" fixed="left" />
<vxe-column type="seq" width="58" align="center" />
<vxe-column field="name" width="140" title="姓名" />
<vxe-column field="department.name" width="160" align="center" title="部门" />
<vxe-column field="position" width="140" title="职位" align="center" />
<vxe-column field="mobile" width="140" align="center" title="手机号" />
</vxe-table>
<el-pagination
style="margin-top: 10px;"
:current-page="select.page"
:page-sizes="[20, 30, 40, 50]"
:page-size="select.rows"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="e => {
select.rows = e;
select.page = 1;
getUsers();
}"
@current-change="e => {
select.page = e;
getUsers();
}"
/>
</template>
<template #footer>
<el-button type="primary" :loading="loading" @click="submit"></el-button>
</template>
</vxe-modal>
</div>
</template>
<script>
import { index } from '@/api/user'
import { batchRoles } from '@/api/module'
import { PopupManager } from 'element-ui/lib/utils/popup'
export default {
props: {
isShow: {
type: Boolean,
default: false,
required: true
},
moduleId: {
type: [Number, String],
default: '',
required: true
}
},
data() {
return {
zIndex: PopupManager.nextZIndex(),
loading: false,
select: {
page: 1,
rows: 20,
module_id: '',
keyword: ''
},
tableData: [],
total: 0,
form: {
role_id: '',
module_id: '',
user_ids: []
}
}
},
computed: {},
watch: {
'form.user_ids': function(val, oldVal) {
this.setSelectRow()
},
isShow(newVal) {
if (newVal) {
this.zIndex = PopupManager.nextZIndex()
this.getRoleUsers()
}
}
},
created() {
this.getUsers()
},
methods: {
/**
* @param {array[string]} keys
* @param {array[all]} values
* @returns {void}
*/
setForm(keys = [], values = []) {
keys.forEach((key, index) => {
this.form[key] = values[index]
})
},
setSelectRow() {
this.$nextTick(() => {
if (this.$refs['table']) {
this.$refs['table'].clearCheckboxRow()
this.$refs['table'].setCheckboxRow(
this.tableData.filter(row => this.form.user_ids.findIndex(j => j === row.id) !== -1),
true
)
}
})
},
async getUsers() {
const res = await index(this.select)
this.tableData = res.data
this.total = res.total
},
async getRoleUsers() {
try {
const res = await index({
page: 1,
rows: 9999,
module_role_id: this.form.role_id,
module_id: this.moduleId
})
this.form.user_ids = res.data?.map(i => i.id)
} catch (err) {
console.error(err)
}
},
async submit() {
if (this.$refs['table']) {
this.loading = true
const selectRecords = this.$refs['table'].getCheckboxRecords()
try {
batchRoles({
...this.form,
module_id: this.moduleId,
user_ids: selectRecords.map(row => row.id)
})
//
setTimeout(() => {
this.loading = false
this.$emit('update:isShow', false)
this.$emit('refresh')
}, 500)
} catch (err) {
this.loading = false
}
}
}
}
}
</script>
<style scoped lang="scss">
.total {
color: #666;
text-align: right;
line-height: 3;
}
</style>

@ -22,12 +22,12 @@
>
<vxe-column type="seq" width="58" align="center" />
<vxe-column field="name" width="160" title="部门名称" :edit-render="{ name: 'input', attrs: { type: 'text'} }" />
<vxe-column field="manager.name" width="180" title="分管领导" :edit-render="{}">
<vxe-column field="manager.name" width="180" title="分管负责人" :edit-render="{}">
<template #edit="{ row }">
<UserPicker v-model="row.manager_id" size="small" />
</template>
</vxe-column>
<vxe-column field="leader.name" width="180" title="主要负责人" :edit-render="{}">
<vxe-column field="leader.name" width="180" title="主要领导" :edit-render="{}">
<template #edit="{ row }">
<UserPicker v-model="row.leader_id" size="small" />
</template>

@ -37,6 +37,7 @@
<el-button size="small" type="primary" plain @click="cancelRowEvent(row)"></el-button>
</template>
<template v-else>
<el-button type="primary" size="small" @click="$refs['BatchUser'].setForm(['id'],[row.id]),isShowBatchUser = true">绑定用户</el-button>
<el-button size="small" type="success" @click="bind(row)"></el-button>
<el-button size="small" type="warning" @click="editRowEvent(row)"></el-button>
<el-button size="small" type="danger" @click="destroyRowEvent(row)"></el-button>
@ -50,10 +51,12 @@
<add-role ref="AddRole" :is-show.sync="isShowAdd" @refresh="getList" />
<bind-permissions ref="BindPermissions" :is-show.sync="isShowBind" @refresh="getList" />
<BatchUser ref="BatchUser" :is-show.sync="isShowBatchUser" @refresh="getList"></BatchUser>
</div>
</template>
<script>
import BatchUser from './components/BatchUser.vue'
import BindPermissions from './components/BindPermissions.vue'
import AddRole from './components/AddRole.vue'
import { deepCopy } from '@/utils'
@ -61,10 +64,12 @@ import { index, save, destroy } from '@/api/role'
export default {
components: {
AddRole,
BindPermissions
BindPermissions,
BatchUser
},
data() {
return {
isShowBatchUser: false,
isShowBind: false,
isShowAdd: false,

@ -57,7 +57,7 @@ export default {
// this.isLoading = true
this.props.module_name = this.module_name
this.props.auth_token = getToken()
this.auth_uri = `${newVal}?auth_token=${window.encodeURIComponent(getToken())}&module_name=${this.module_name}&theme=${window.encodeURIComponent(Cookies.get('defaultTheme'))}`
this.auth_uri = `${newVal}/#/?auth_token=${window.encodeURIComponent(getToken())}&module_name=${this.module_name}&theme=${window.encodeURIComponent(Cookies.get('defaultTheme'))}`
// this.$nextTick(() => {
// this.$refs['program'].onload = this.postMessage
// console.log(loadedModels)

Loading…
Cancel
Save