You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
712 lines
22 KiB
712 lines
22 KiB
<template>
|
|
<div class="app-container">
|
|
<el-row :gutter="20">
|
|
<el-col :span="16">
|
|
<!--工具栏-->
|
|
<div class="head-container">
|
|
<!-- 搜索 -->
|
|
<el-input
|
|
v-model="listQuery.Filter"
|
|
clearable
|
|
size="small"
|
|
placeholder="搜索..."
|
|
style="width: 200px;"
|
|
class="filter-item"
|
|
@keyup.enter.native="handleFilter"
|
|
/>
|
|
<el-button
|
|
class="filter-item searchbutton"
|
|
size="mini"
|
|
type="success"
|
|
icon="el-icon-search"
|
|
@click="handleFilter"
|
|
>搜索</el-button>
|
|
<div class="opts">
|
|
|
|
</div>
|
|
</div>
|
|
<!--表格渲染-->
|
|
<el-table
|
|
ref="multipleTable"
|
|
v-loading="listLoading"
|
|
:data="list"
|
|
size="small"
|
|
style="width: 100%;"
|
|
@sort-change="sortChange"
|
|
@selection-change="handleSelectionChange"
|
|
@row-click="handleRowClick"
|
|
:height="tableHeight"
|
|
@current-change="handleSegalChange"
|
|
>
|
|
<el-table-column type="selection" ></el-table-column>
|
|
<el-table-column label="用户名" prop="userName" sortable="custom" align="center">
|
|
</el-table-column>
|
|
<el-table-column label="邮箱" prop="email" sortable="custom" align="center">
|
|
<template slot-scope="scope">
|
|
<span>{{scope.row.email}}</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column label="电话" prop="phoneNumber" sortable="custom" align="center" >
|
|
<template slot-scope="scope">
|
|
<span>{{scope.row.phoneNumber}}</span>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<pagination
|
|
v-show="totalCount>0"
|
|
:total="totalCount"
|
|
:page.sync="page"
|
|
:limit.sync="listQuery.MaxResultCount"
|
|
@pagination="getList"
|
|
/>
|
|
</el-col>
|
|
<el-col :span="4">
|
|
<div class="head-container">
|
|
<!-- <el-button
|
|
v-permission="['BaseService.UserBranch.Update']"
|
|
:loading="savePerLoading"
|
|
:disabled="multipleSelection.length != 1"
|
|
icon="el-icon-check"
|
|
size="mini"
|
|
style="padding: 6px 9px"
|
|
type="primary"
|
|
@click="saveUserBranch"
|
|
>保存用户角色信息
|
|
</el-button> -->
|
|
<el-tag size="mini" icon="el-icon-check" effect="plain" style="height:25px" >注意:配置角色时必须且只能选择一个组织!</el-tag>
|
|
</div>
|
|
<div class="system-content">
|
|
<div class="system-view-nav"
|
|
:style="{ height: treeHeight + 'px'}"
|
|
style="background: #fff"
|
|
>
|
|
<el-tree
|
|
:data="orgData"
|
|
:load="getOrgs"
|
|
:props="defaultProps"
|
|
default-expand-all
|
|
show-checkbox
|
|
lazy
|
|
@node-click="handleNodeClick"
|
|
@check-change="handleCheckChange"
|
|
style="margin-top:15px"
|
|
ref="treeleft"
|
|
node-key="id"
|
|
/>
|
|
</div></div>
|
|
</el-col>
|
|
<el-col :span="4">
|
|
|
|
<div class="head-container">
|
|
<el-button
|
|
v-permission="['BaseService.UserBranch.Create']"
|
|
:loading="savePerLoading"
|
|
:disabled="multipleSelection.length != 1"
|
|
icon="el-icon-check"
|
|
size="mini"
|
|
style="padding: 6px 9px"
|
|
type="primary"
|
|
@click="saveUserBranch"
|
|
>保存配置信息
|
|
</el-button>
|
|
</div>
|
|
<div class="system-content">
|
|
<div class="system-view-nav"
|
|
:style="{ height: treeHeight + 'px'}"
|
|
style="background: #fff"
|
|
>
|
|
<el-tree
|
|
:data="roleList"
|
|
:props="defaultProps2"
|
|
style="margin-top:15px"
|
|
show-checkbox
|
|
default-expand-all
|
|
node-key="id"
|
|
ref="treeright"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</el-col>
|
|
</el-row>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { isvalidPhone } from "@/utils/validate";
|
|
import Pagination from "@/components/Pagination";
|
|
import permission from "@/directive/permission/index.js";
|
|
import Treeselect from "@riophae/vue-treeselect";
|
|
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
|
|
import { LOAD_CHILDREN_OPTIONS } from "@riophae/vue-treeselect";
|
|
// function validCase(str) {
|
|
// var re =/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{6,}$/;
|
|
// return re.test(str);
|
|
// }
|
|
|
|
const defaultForm = {
|
|
id:undefined,
|
|
orgId:undefined,
|
|
userName:'',
|
|
phoneNumber:'',
|
|
name:'',
|
|
email:'',
|
|
password:'',
|
|
lockoutEnabled:false,
|
|
roleNames:[],
|
|
jobs:[],
|
|
orgIdToName: null,
|
|
}
|
|
export default {
|
|
name: "User",
|
|
components: { Pagination, Treeselect },
|
|
directives: { permission },
|
|
data() {
|
|
const validateNameInput = (rule, value, callback) => {
|
|
if (!value || value <= 0) {
|
|
return callback(new Error('此项必填!'))
|
|
}
|
|
// else if (!validCase(value)) {
|
|
// callback(new Error("密码至少包含一位非字母数字字符., 密码至少包含一位小写字母 ('a'-'z')., 密码至少包含一位大写字母 ('A'-'Z')."));
|
|
// }
|
|
else {
|
|
callback()
|
|
}
|
|
}
|
|
// 自定义验证
|
|
const validPhone = (rule, value, callback) => {
|
|
if (!value) {
|
|
callback(new Error("请输入电话号码"));
|
|
} else if (!isvalidPhone(value)) {
|
|
callback(new Error("请输入正确的11位手机号码"));
|
|
} else {
|
|
callback();
|
|
}
|
|
};
|
|
const validName=(rule, value, callback) => {
|
|
if (!value) {
|
|
callback(new Error("请输入登录名称"));
|
|
} else if(/[\u4E00-\u9FA5]/g.test(value)) {
|
|
callback(new Error("登录名不能输入汉字"));
|
|
} else {
|
|
callback();
|
|
}
|
|
};
|
|
return {
|
|
rules: {
|
|
userName: [
|
|
{ required: true, trigger: "blur",validator: validName },
|
|
{ min: 2, max: 20, message: "长度在 2 到 20 个字符", trigger: "blur" }
|
|
],
|
|
name: [
|
|
{ required: true, trigger: "blur", message: "请输入姓名"},
|
|
{ min: 2, max: 20, message: "长度在 2 到 20 个字符", trigger: "blur" }
|
|
],
|
|
email: [
|
|
{ required: true, message: "请输入邮箱地址", trigger: "blur" },
|
|
{ type: "email", message: "请输入正确的邮箱地址", trigger: "blur" }
|
|
],
|
|
phoneNumber: [
|
|
{ required: true, trigger: "blur", validator: validPhone }
|
|
]
|
|
// ,password:[
|
|
// {required:true,trigger: "blur",minlength:6,validator: validateNameInput}
|
|
// ]
|
|
},
|
|
savePerLoading: false,
|
|
defaultProps2: { children: "children", label: "name", isLeaf: "leaf" },
|
|
defaultProps: {
|
|
children: 'children',
|
|
label: 'label'
|
|
},
|
|
form: Object.assign({}, defaultForm),
|
|
list: null,
|
|
orgName: "",
|
|
orgs: [],
|
|
roleName:'',
|
|
roles:[],
|
|
roleData:[],
|
|
jobData:[],
|
|
orgData: [],
|
|
roleList: [],
|
|
checkedRole: [],
|
|
totalCount: 0,
|
|
listLoading: true,
|
|
formLoading: false,
|
|
listQuery: {
|
|
OrgId: null,
|
|
Filter: "",
|
|
Sorting: "",
|
|
SkipCount: 0,
|
|
MaxResultCount: 10
|
|
},
|
|
listSave:{
|
|
branchId:null,
|
|
userId:null,
|
|
roles:[{
|
|
roleId: ''
|
|
}]
|
|
},
|
|
listSaveOrg:{
|
|
branchId:null,
|
|
userId:null
|
|
},
|
|
page: 1,
|
|
dialogFormVisible: false,
|
|
multipleSelection: [],
|
|
formTitle: "",
|
|
isEdit: false,
|
|
tableHeight: document.documentElement.clientHeight - 270, // 表的高度
|
|
treeHeight: document.documentElement.clientHeight - 150, // 表的3度
|
|
treeHeight2:document.documentElement.clientHeight - 150,
|
|
currentroleMessage:[],
|
|
currentroleMessageOrg:[],
|
|
selectBranch:false
|
|
|
|
};
|
|
},
|
|
created() {
|
|
// this.getList();
|
|
// this.getAllRoles()
|
|
var self = this
|
|
/** 控制table的高度 */
|
|
window.onresize = function() {
|
|
self.tableHeight = document.documentElement.clientHeight - 270
|
|
self.treeHeight = document.documentElement.clientHeight - 150
|
|
self.treeHeight2 = document.documentElement.clientHeight - 150
|
|
}
|
|
},
|
|
mounted(){
|
|
this.getList();
|
|
this.getAllRoles()
|
|
},
|
|
methods: {
|
|
saveUserBranch() {//保存配置信息
|
|
this.savePerLoading = true
|
|
if (this.multipleSelection.length != 1) {
|
|
this.$message({
|
|
message: "保存必须选择一行用户信息!",
|
|
type: "warning"
|
|
});
|
|
return;
|
|
} else {
|
|
var treeNodes=this.$refs.treeleft.getCheckedNodes();
|
|
if(treeNodes.length <=0 || treeNodes.length !=1){
|
|
this.$message({
|
|
message: "保存必须选择组织且只能选中一个!",
|
|
type: "warning"
|
|
});
|
|
this.savePerLoading = false
|
|
return;
|
|
}
|
|
else{
|
|
let checkedKeys = this.$refs.treeright.getCheckedKeys();
|
|
if(checkedKeys.length <=0){//没有选中角色,只保存用户-组织信息
|
|
this.$axios
|
|
.posts(
|
|
"/api/base/userbranch/createUpdate",this.listSaveOrg)
|
|
.then(response => {
|
|
this.$notify({
|
|
title: "成功",
|
|
message: "用户-组织信息添加成功",
|
|
type: "success",
|
|
duration: 2000
|
|
});
|
|
this.savePerLoading = false
|
|
});
|
|
}
|
|
else{
|
|
this.$axios.gets("/api/base/userbranch/userRoles/"+this.listSave.userId+"/"+this.listSave.branchId )
|
|
.then(response => {
|
|
if(response.length===0){//用户-组织-角色表中无当前条件的角色
|
|
//add
|
|
if(checkedKeys.length > 0){
|
|
this.listSave.roles=checkedKeys.map(itemid=>{
|
|
return {
|
|
roleId: itemid
|
|
}
|
|
})
|
|
}
|
|
this.$axios
|
|
.posts(
|
|
"/api/base/userbranch/createUpdate",this.listSave)
|
|
.then(response => {
|
|
this.$notify({
|
|
title: "成功",
|
|
message: "添加成功",
|
|
type: "success",
|
|
duration: 2000
|
|
});
|
|
this.savePerLoading = false
|
|
});
|
|
}
|
|
else{
|
|
//update
|
|
if(response.length >=1 && checkedKeys.length===0){
|
|
//用户-组织-角色表中有至少有一条角色信息,但是界面所有角色全不选操作
|
|
this.listSave.roles=checkedKeys.map(itemid=>{
|
|
return {
|
|
roleId: response
|
|
}
|
|
})
|
|
}
|
|
else{
|
|
if(checkedKeys.length > 0){
|
|
this.listSave.roles=checkedKeys.map(itemid=>{
|
|
return {
|
|
roleId: itemid
|
|
}
|
|
})
|
|
}
|
|
}
|
|
this.$axios
|
|
.posts(
|
|
"/api/base/userbranch/createUpdate",this.listSave)
|
|
.then(response => {
|
|
this.$notify({
|
|
title: "成功",
|
|
message: "更新成功",
|
|
type: "success",
|
|
duration: 2000
|
|
});
|
|
this.savePerLoading = false
|
|
});
|
|
|
|
}
|
|
//
|
|
});
|
|
|
|
}
|
|
}//else-end
|
|
|
|
}
|
|
},
|
|
getOrgs(node, resolve) {
|
|
const params = {};
|
|
if (typeof node !== "object") {
|
|
if (node) {
|
|
params["filter"] = node;
|
|
}
|
|
} else if (node.level !== 0) {
|
|
params["id"] = node.data.id;
|
|
}
|
|
//TODO:仅获取启用机构
|
|
setTimeout(() => {
|
|
this.$axios
|
|
.gets("/api/base/branch/all", params)
|
|
.then((response) => {
|
|
if (resolve) {
|
|
resolve(response.items);
|
|
} else {
|
|
this.orgData = response.items;
|
|
}
|
|
});
|
|
}, 100);
|
|
},
|
|
getOrgNodes() {
|
|
this.$axios.gets("/api/base/branch/children").then((response) => {
|
|
this.loadTree(response);
|
|
});
|
|
},
|
|
// getJobs(){
|
|
// this.$axios.gets('/api/base/job/jobs').then((response)=>{
|
|
// this.jobData=response.items
|
|
// })
|
|
// },
|
|
getList() {
|
|
this.listLoading = true;
|
|
this.listQuery.SkipCount = (this.page - 1) * 10;
|
|
this.$axios.gets("/api/base/user", this.listQuery).then(response => {
|
|
this.list = response.items;
|
|
this.totalCount = response.totalCount;
|
|
this.listLoading = false;
|
|
});
|
|
},
|
|
fetchData(id) {
|
|
this.getAllRoles();
|
|
this.getOrgNodes();
|
|
//this.getJobs()
|
|
this.$axios.gets("/api/base/user/" + id).then(response => {
|
|
this.form = response;
|
|
});
|
|
this.$axios.gets("/api/identity/users/" + id + "/roles").then(data => {
|
|
|
|
data.items.forEach(item=>{
|
|
this.checkedRole.push(item.name)
|
|
})
|
|
});
|
|
},
|
|
loadOrgs({ action, parentNode, callback }) {
|
|
if (action === LOAD_CHILDREN_OPTIONS) {
|
|
this.$axios
|
|
//.gets("/api/base/orgs/loadOrgs", { id: parentNode.id })
|
|
.gets("/api/base/branch/all", { id: parentNode.id })
|
|
.then((response) => {
|
|
parentNode.children = response.items.map(function (obj) {
|
|
if (!obj.leaf) {
|
|
obj.children = null;
|
|
}
|
|
return obj;
|
|
});
|
|
setTimeout(() => {
|
|
callback();
|
|
}, 100);
|
|
});
|
|
}
|
|
},
|
|
getAllRoles(node) {
|
|
const params = {};
|
|
if (typeof node !== "object") {
|
|
if (node) {
|
|
params["filter"] = node;
|
|
}
|
|
}
|
|
this.$axios
|
|
.gets("/api/identity/roles/all",params)
|
|
.then((response) => {
|
|
this.roleList = response.items;
|
|
});
|
|
},
|
|
handleFilter() {
|
|
this.page = 1;
|
|
this.getList();
|
|
},
|
|
handleNodeClick(data) {
|
|
this.listSave.userId=this.multipleSelection[0].id;
|
|
this.listSave.branchId=data.id;
|
|
this.selectBranch=true;
|
|
this.$axios.gets("/api/base/userbranch/userRoles/"+this.listSave.userId+"/"+this.listSave.branchId ).then(response => {
|
|
this.currentroleMessage=response.map(item=>{
|
|
let JSonmessge={
|
|
id:item.roleId,
|
|
label:item.roleId
|
|
}
|
|
return JSonmessge
|
|
})
|
|
this.getRoleRulesInfotwo()
|
|
});
|
|
},
|
|
handleCheckChange(data, checked, indeterminate) {
|
|
// var str=[];
|
|
// str =this.$refs.treeleft.getCheckedKeys();
|
|
// if(str.length<=0){ // 因为vue返回的是选中的key的数组
|
|
// this.$message({
|
|
// message: "保存必须选择组织!",
|
|
// type: "warning"
|
|
// });
|
|
// this.savePerLoading = false
|
|
// return;
|
|
// }
|
|
// str.forEach(item=>{
|
|
// this.listSave.userId=null
|
|
// this.listSave.branchId=null
|
|
// this.listSave.userId=this.multipleSelection[0].id;
|
|
// this.listSave.branchId=item;
|
|
|
|
// });
|
|
|
|
|
|
|
|
// var treeNodes=this.$refs.treeleft.getCheckedNodes();
|
|
// if(treeNodes.length !=1)
|
|
// {
|
|
// this.$message({
|
|
// message: "只能选中一个组织!",
|
|
// type: "warning"
|
|
// });
|
|
// return;
|
|
// }
|
|
|
|
var branchid=data.id
|
|
var userid=this.multipleSelection[0].id
|
|
if(checked){
|
|
this.listSave.branchId=branchid;
|
|
this.listSave.userId=userid;
|
|
this.selectBranch=true;
|
|
this.listSaveOrg.branchId=branchid;
|
|
this.listSaveOrg.userId=userid;
|
|
|
|
}
|
|
else{
|
|
this.selectBranch=false;
|
|
}
|
|
this.$axios.gets("/api/base/userbranch/userRoles/"+userid+"/"+branchid ).then(response => {
|
|
this.currentroleMessage=response.map(item=>{
|
|
let JSonmessge={
|
|
id:item.roleId,
|
|
label:item.roleId
|
|
}
|
|
return JSonmessge
|
|
})
|
|
this.getRoleRulesInfotwo()
|
|
});
|
|
|
|
},
|
|
handleNodeClick2(data) {
|
|
this.listQuery.RolesId = data.id;
|
|
this.getList();
|
|
},
|
|
sortChange(data) {
|
|
const { prop, order } = data;
|
|
if (!prop || !order) {
|
|
this.handleFilter();
|
|
return;
|
|
}
|
|
this.listQuery.Sorting = prop + " " + order;
|
|
this.handleFilter();
|
|
},
|
|
handleSelectionChange(val) {
|
|
this.multipleSelection = val;
|
|
},
|
|
handleRowClick(row, column, event) {
|
|
this.$refs.multipleTable.clearSelection();
|
|
this.$refs.multipleTable.toggleRowSelection(row);
|
|
},
|
|
cancel() {
|
|
this.form = Object.assign({}, defaultForm),
|
|
this.checkedRole=[]
|
|
this.orgs=[]
|
|
this.jobData=[]
|
|
this.dialogFormVisible = false;
|
|
this.$refs.form.clearValidate();
|
|
},
|
|
//TODO:引用公共方法
|
|
loadTree(data) {
|
|
data.items.forEach((element) => {
|
|
if (!element.pid) {
|
|
element.hasChildren = element.leaf ? false : true;
|
|
if (!element.leaf) {
|
|
element.children = [];
|
|
}
|
|
this.orgs.push(element);
|
|
}
|
|
});
|
|
this.setChildren(this.orgs, data.items);
|
|
},
|
|
setChildren(roots, items) {
|
|
roots.forEach((element) => {
|
|
items.forEach((item) => {
|
|
if (item.pid == element.id) {
|
|
if (!element.children) element.children = [];
|
|
element.children.push(item);
|
|
}
|
|
});
|
|
if (element.children) {
|
|
this.setChildren(element.children, items);
|
|
}
|
|
});
|
|
},
|
|
handleSegalChange(val){
|
|
this.currentroleMessage=[]
|
|
this.currentroleMessageOrg=[]
|
|
if(val.userName==="admin"){
|
|
if(val&&val.id){
|
|
this.fetchUserforAdminRole(val.id)
|
|
this.$refs.treeleft.setCheckedNodes([]);
|
|
}
|
|
}
|
|
else{
|
|
if(val&&val.id){
|
|
//this.fetchData(val.id);
|
|
this.fetchUserforRole(val.id)
|
|
this.fetchUserforOrg(val.id)
|
|
this.getRoleRulesInfo()
|
|
}
|
|
}
|
|
// this.currentroleMessage=[]
|
|
// this.currentroleMessageOrg=[]
|
|
// if(val&&val.id){
|
|
// //this.fetchData(val.id);
|
|
// this.fetchUserforRole(val.id)
|
|
// this.fetchUserforOrg(val.id)
|
|
// this.getRoleRulesInfo()
|
|
// }
|
|
},
|
|
//admin-roles
|
|
fetchUserforAdminRole(id){
|
|
this.$axios.gets("/api/identity/users/"+ id+"/roles" ).then(response => {
|
|
this.currentroleMessage=response.items.map(item=>{
|
|
let JSonmessge={
|
|
id:item.id,
|
|
label:item.name,
|
|
disabled: true
|
|
}
|
|
return JSonmessge
|
|
})
|
|
this.getRoleRulesInfotwo()
|
|
});
|
|
},
|
|
//加载用户-组织-角色
|
|
fetchUserforRole(id){
|
|
this.$axios.gets("/api/base/userbranch/"+ id+"/userRoles" ).then(response => {
|
|
this.currentroleMessage=response.map(item=>{
|
|
let JSonmessge={
|
|
id:item.roleId,
|
|
label:item.roleId
|
|
}
|
|
return JSonmessge
|
|
})
|
|
this.getRoleRulesInfotwo()
|
|
});
|
|
},
|
|
|
|
fetchUserforOrg(id){
|
|
this.$axios.gets("/api/base/userbranch/"+id+"/branches" ).then(response => {
|
|
console.log(JSON.stringify(response))
|
|
this.currentroleMessageOrg=response.map(item=>{
|
|
let JSonmessge={
|
|
id:item.branchId,
|
|
label:item.branchName
|
|
}
|
|
return JSonmessge
|
|
})
|
|
this.getRoleRulesInfo()
|
|
});
|
|
},
|
|
/**
|
|
* 获取权限信息
|
|
*/
|
|
getRoleRulesInfo() {
|
|
this.$nextTick(() => {
|
|
console.log(JSON.stringify(this.currentroleMessageOrg))
|
|
// this.$refs.treeleft.setCheckedKeys([1]);
|
|
this.$refs.treeleft.setCheckedNodes(this.currentroleMessageOrg);
|
|
})
|
|
},
|
|
getRoleRulesInfotwo(){
|
|
this.$nextTick(() => {
|
|
console.log(JSON.stringify(this.currentroleMessage))
|
|
this.$refs.treeright.setCheckedNodes(this.currentroleMessage);
|
|
})
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style rel="stylesheet/scss" lang="scss" scoped>
|
|
.opts {
|
|
padding: 6px 0;
|
|
display: -webkit-flex;
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
.leftTree {
|
|
height: calc(100vh - 100px);
|
|
box-sizing: border-box;
|
|
display: flex;
|
|
flex-direction: column;
|
|
.system-content {
|
|
position: relative;
|
|
height: 100%;
|
|
flex: 1;
|
|
display: flex;
|
|
overflow: hidden;
|
|
}
|
|
.system-view-nav {
|
|
width: 100%;
|
|
height: 100%;
|
|
overflow: auto;
|
|
background: #fff;
|
|
border: 1px solid #e6e6e6;
|
|
}
|
|
}
|
|
</style>
|
|
|