优化角色管理
This commit is contained in:
parent
0abff1e576
commit
2812f1eef3
@ -70,6 +70,13 @@ export default {
|
||||
return await http.post(this.url, params);
|
||||
},
|
||||
},
|
||||
sort:{
|
||||
url: `${config.API_URL}/roles.sort`,
|
||||
name: "角色排序",
|
||||
post: async function (params) {
|
||||
return await http.post(this.url, params);
|
||||
},
|
||||
},
|
||||
users:{
|
||||
url: `${config.API_URL}/roles.users`,
|
||||
name: "角色成员",
|
||||
@ -336,6 +343,13 @@ export default {
|
||||
return await http.post(this.url, params);
|
||||
},
|
||||
},
|
||||
userType:{
|
||||
url: `${config.API_URL}/user.type.list`,
|
||||
name: "用户类型常量",
|
||||
post: async function (params) {
|
||||
return await http.post(this.url, params);
|
||||
},
|
||||
},
|
||||
status:{
|
||||
url: `${config.API_URL}/user.status.update`,
|
||||
name: "用户状态",
|
||||
@ -343,6 +357,20 @@ export default {
|
||||
return await http.post(this.url, params);
|
||||
},
|
||||
},
|
||||
auditStatus:{
|
||||
url: `${config.API_URL}/user.audit.status.list`,
|
||||
name: "用户审核常量",
|
||||
post: async function (params) {
|
||||
return await http.post(this.url, params);
|
||||
}
|
||||
},
|
||||
audit:{
|
||||
url: `${config.API_URL}/user.audit`,
|
||||
name: "用户审核",
|
||||
post: async function (params) {
|
||||
return await http.post(this.url, params);
|
||||
}
|
||||
},
|
||||
allocatRole: {
|
||||
url: `${config.API_URL}/auth.user.role`,
|
||||
name: "用户分配角色",
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
<el-switch v-model="item.sortable"></el-switch>
|
||||
</span>
|
||||
<span class="fixed_b">
|
||||
<el-switch v-model="item.fixed"></el-switch>
|
||||
<el-switch v-model="item.fix"></el-switch>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
@ -114,7 +114,7 @@
|
||||
.setting-column__list li.ghost {opacity: 0.3;}
|
||||
|
||||
.setting-column__bottom {border-top: 1px solid #EBEEF5;padding-top:15px;text-align: right;}
|
||||
|
||||
|
||||
.dark .setting-column__title {border-color: var(--el-border-color-light);}
|
||||
.dark .setting-column__bottom {border-color: var(--el-border-color-light);}
|
||||
</style>
|
||||
|
||||
@ -13,8 +13,8 @@
|
||||
<el-table v-bind="$attrs" :header-cell-style="{'background': '#F5F7FA','color':'#606266'}" :data="tableData" :row-key="rowKey" :key="toggleIndex" ref="scTable" :height="height=='auto'?null:'100%'" :size="config.size" :border="config.config.border" :stripe="config.config.stripe" :summary-method="remoteSummary?remoteSummaryMethod:summaryMethod" @sort-change="sortChange" @filter-change="filterChange">
|
||||
<slot></slot>
|
||||
<template v-for="(item, index) in userColumn" :key="index">
|
||||
<!-- item.showOverflowTooltip-->
|
||||
<el-table-column v-if="!item.hide" :column-key="item.prop" :label="item.label" :prop="item.prop" :width="item.width" :sortable="item.sortable" :fixed="item.fixed" :filters="item.filters" :filter-method="remoteFilter||!item.filters?null:filterHandler" :show-overflow-tooltip="true">
|
||||
<!--item.showOverflowTooltip-->
|
||||
<el-table-column v-if="!item.hide" :column-key="item.prop" :label="item.label" :prop="item.prop" :width="item.width" :sortable="item.sortable" :fixed="item.fix" :filters="item.filters" :filter-method="remoteFilter||!item.filters?null:filterHandler" :show-overflow-tooltip="true">
|
||||
<template #default="scope">
|
||||
<slot :name="item.prop" v-bind="scope">
|
||||
{{scope.row[item.prop]}}
|
||||
@ -28,6 +28,9 @@
|
||||
</template>
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="scTable-total" v-if="!hideTotal">
|
||||
<slot name="total" :params="total_count_item"></slot>
|
||||
</div>
|
||||
<div class="scTable-page" v-if="!hidePagination || !hideDo">
|
||||
<div class="scTable-pagination">
|
||||
<el-pagination v-if="!hidePagination && showPagination" background :small="true" :layout="paginationLayout" :total="total" :page-size="scPageSize" :page-sizes="pageSizes" v-model:currentPage="currentPage" @current-change="paginationChange" @update:page-size="pageSizeChange"></el-pagination>
|
||||
@ -92,6 +95,7 @@
|
||||
hidePagination: { type: Boolean, default: false },
|
||||
showPagination: { type: Boolean, default: true },
|
||||
hideDo: { type: Boolean, default: false },
|
||||
hideTotal: { type: Boolean, default: true },
|
||||
hideRefresh: { type: Boolean, default: false },
|
||||
hideSetting: { type: Boolean, default: false },
|
||||
paginationLayout: { type: String, default: config.paginationLayout },
|
||||
@ -117,7 +121,7 @@
|
||||
return Number(this.height)?Number(this.height)+'px':this.height
|
||||
},
|
||||
_table_height() {
|
||||
return this.hidePagination && this.hideDo ? "100%" : "calc(100% - 51px)"
|
||||
return this.hidePagination && this.hideDo ? "100%" : this.hideTotal? "calc(100% - 51px)": "calc(100% - 83px)"
|
||||
}
|
||||
},
|
||||
data() {
|
||||
@ -127,6 +131,10 @@
|
||||
emptyText: "暂无数据",
|
||||
toggleIndex: 0,
|
||||
tableData: [],
|
||||
total_count_item:{
|
||||
total_quantity:0,
|
||||
total_cost:0
|
||||
},
|
||||
total: 0,
|
||||
currentPage: 1,
|
||||
prop: null,
|
||||
@ -234,6 +242,9 @@
|
||||
if(response.data.tableConfig && response.data.tableConfig.size){
|
||||
this.config = response.data.tableConfig;
|
||||
}
|
||||
if(response.data.count_item){
|
||||
this.total_count_item = response.data.count_item;
|
||||
}
|
||||
this.total = response.total || 0;
|
||||
this.summary = response.summary || {};
|
||||
this.loading = false;
|
||||
@ -453,6 +464,7 @@
|
||||
.scTable {}
|
||||
.scTable-table {height: calc(100% - 50px);}
|
||||
.scTable-page {height:50px;display: flex;align-items: center;justify-content: space-between;padding:0 15px;}
|
||||
.scTable-total{background: var(--el-fill-color-light);height: 32px;display: flex;align-items: center;padding: 0 15px;border-bottom: var(--el-table-border);}
|
||||
.scTable-do {white-space: nowrap;}
|
||||
.scTable ::v-deep .el-table__footer .cell {font-weight: bold;}
|
||||
.scTable ::v-deep .el-table__body-wrapper .el-scrollbar__bar.is-horizontal {height: 12px;border-radius: 12px;}
|
||||
|
||||
@ -31,6 +31,7 @@
|
||||
--el-menu-item-height:50px;
|
||||
--el-component-size-small:28px;
|
||||
|
||||
--el-order-color-0:#909399;
|
||||
--el-order-color-1:#E8641B;
|
||||
--el-order-color-2:#3072FF;
|
||||
--el-order-color-3:#0DA525;
|
||||
@ -68,7 +69,7 @@
|
||||
--el-tabs-header-height:42px;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-direction: column-reverse;
|
||||
.el-tabs__active-bar{
|
||||
bottom: 0;
|
||||
}
|
||||
@ -108,6 +109,9 @@
|
||||
.el-main.treeMain{border-radius: 0;}
|
||||
.el-main.nopadding {padding:0;background: #fff;display: flex;flex-direction: column;}
|
||||
.el-main.nopadding .scTable{flex: 1;overflow: hidden;}
|
||||
.el-main.nopadding .scTable .scTable-total .totalView{display: flex;align-items: center;}
|
||||
.el-main.nopadding .scTable .scTable-total .totalView .total-item{margin: 0 6px;}
|
||||
.el-main.nopadding .scTable .scTable-total .totalView .total-item .text{margin-right: 4px;}
|
||||
|
||||
/** 列表上面的检索 */
|
||||
.el-main.nopadding .searchMain{display: flex;flex-wrap: wrap;align-items: self-end;padding-bottom: 10px;margin: 15px 0 0 0; border-bottom: 1px solid var(--el-border-color-light);}
|
||||
|
||||
@ -29,7 +29,7 @@
|
||||
<el-button :size="size" type="info" icon="el-icon-RefreshRight" @click="reset">重置</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<scTable ref="table" :apiObj="list.apiObj" :column="list.column" row-key="id" stripe :size="size" @selection-change="selectionChange">
|
||||
<scTable ref="table" :apiObj="list.apiObj" :column="list.column" row-key="id" stripe :size="size" @selection-change="selectionChange" :hideTotal="false">
|
||||
<el-table-column type="selection" align="center" width="40"></el-table-column>
|
||||
<sc-table-column label="序号" align="center" type="index"></sc-table-column>
|
||||
<template #logo="scope">
|
||||
@ -62,6 +62,19 @@
|
||||
</el-dropdown>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template #total="{params}">
|
||||
<div class="totalView">
|
||||
<span class="name">汇总合计:</span>
|
||||
<div class="total-item">
|
||||
<span class="text">数量</span>
|
||||
<span class="num">{{params.total_quantity}}单</span>
|
||||
</div>
|
||||
<div class="total-item">
|
||||
<span class="text">金额</span>
|
||||
<span class="num">{{params.total_cost}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</scTable>
|
||||
</el-main>
|
||||
</el-container>
|
||||
|
||||
@ -108,7 +108,7 @@
|
||||
},
|
||||
methods: {
|
||||
async getYzm() {
|
||||
const validate = await this.$refs.stepForm_0.validateField("mobile").catch(() => {});
|
||||
const validate = await this.$refs.stepForm_1.validateField("mobile").catch(() => {});
|
||||
if (!validate) {
|
||||
return false
|
||||
}
|
||||
|
||||
@ -10,25 +10,14 @@
|
||||
|
||||
</div>
|
||||
</el-header>
|
||||
<el-container class="mainBox" style="border-radius: 0;">
|
||||
<el-container class="mainBox" style="border-radius: 0;padding-left: 0;padding-right: 0;">
|
||||
<el-aside width="200px" v-loading="showGroupLoading">
|
||||
<el-container>
|
||||
<el-header>
|
||||
<el-input placeholder="输入关键字进行过滤" :size="size" v-model="groupFilterText" clearable></el-input>
|
||||
</el-header>
|
||||
<!-- <el-header>-->
|
||||
<!-- <el-input placeholder="输入关键字进行过滤" :size="size" v-model="groupFilterText" clearable></el-input>-->
|
||||
<!-- </el-header>-->
|
||||
<el-main class="treeMain nopadding">
|
||||
<!-- :default-checked-keys="roleCheckList" @check-change="groupChange"-->
|
||||
<el-tree ref="group" class="menu" node-key="id" :data="group" :current-node-key="role_id" :highlight-current="true" :expand-on-click-node="false" :filter-node-method="groupFilterNode" @node-click="groupClick">
|
||||
<template #default="{ node, data }">
|
||||
<span class="custom-tree-node">
|
||||
<span>{{ node.label }}</span>
|
||||
<span class="btnBox">
|
||||
<el-icon class="btn" v-auth="'disableRoles'" @click="table_edit(data)"><sc-icon-Edit/></el-icon>
|
||||
<el-icon class="btn" v-auth="'delRoles'" @click="table_del(data)"><sc-icon-Delete/></el-icon>
|
||||
</span>
|
||||
</span>
|
||||
</template>
|
||||
</el-tree>
|
||||
<role-sort ref="roleSort" :role_id="role_id" :column="group" @roleChange="groupChange" @roleClick="roleClick" @roleEdit="table_edit" @roleDelete="table_del"></role-sort>
|
||||
</el-main>
|
||||
</el-container>
|
||||
</el-aside>
|
||||
@ -112,6 +101,7 @@
|
||||
import dataPermissions from "./dataPermissions";
|
||||
import members from "./members";
|
||||
import treeUser from "./tree"
|
||||
import roleSort from "./roleSort";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
@ -120,7 +110,8 @@
|
||||
dataTree,
|
||||
dataPermissions,
|
||||
members,
|
||||
treeUser
|
||||
treeUser,
|
||||
roleSort
|
||||
},
|
||||
watch:{
|
||||
groupFilterText(val) {
|
||||
@ -282,17 +273,21 @@
|
||||
if (!value) return true;
|
||||
return data.label.indexOf(value) !== -1;
|
||||
},
|
||||
//树选中事件
|
||||
// groupChange(data,isCheck){
|
||||
// let list = JSON.parse(JSON.stringify(this.roleCheckList));
|
||||
// if(isCheck){
|
||||
// this.roleCheckList.push(data.id);
|
||||
// }else{
|
||||
// this.roleCheckList = list.filter(em=>em != data.id);
|
||||
// }
|
||||
// },
|
||||
//角色拖动事件
|
||||
groupChange(data){
|
||||
let params = {
|
||||
sort_info:data.map((item,index)=>({
|
||||
id:item.id,
|
||||
sort:index+1
|
||||
}))
|
||||
}
|
||||
const res = this.$API.system.role.sort.post(params);
|
||||
if(res.code === 200){
|
||||
this.$message.success('保存成功');
|
||||
}
|
||||
},
|
||||
//树点击事件
|
||||
groupClick(data){
|
||||
roleClick(data){
|
||||
this.role_id = data.id;
|
||||
this.getMenu();
|
||||
this.getRoleList();
|
||||
|
||||
107
src/views/setting/role/roleSort.vue
Normal file
107
src/views/setting/role/roleSort.vue
Normal file
@ -0,0 +1,107 @@
|
||||
<template>
|
||||
<div v-if="roleColumn.length>0" class="setting-column" v-loading="isSave">
|
||||
<div class="setting-column__list" ref="list">
|
||||
<ul>
|
||||
<li v-for="item in roleColumn" :key="item.id" :class="item.id == id?'liCheck':''" @click="liClick(item)">
|
||||
<span class="move_b">
|
||||
<el-tag class="move" size="small" style="cursor: move;"><el-icon-d-caret style="width: 1em; height: 1em;"/></el-tag>
|
||||
</span>
|
||||
<span class="name_b">{{ item.role_name }}</span>
|
||||
<span class="btnBox">
|
||||
<el-icon class="btn edit" size="14px" v-auth="'disableRoles'" @click.stop="table_edit(item)"><sc-icon-Edit/></el-icon>
|
||||
<el-icon class="btn del" size="14px" v-auth="'delRoles'" @click.stop="table_del(item)"><sc-icon-Delete/></el-icon>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<el-empty v-else description="暂无可配置的列" :image-size="80"></el-empty>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Sortable from 'sortablejs'
|
||||
export default {
|
||||
components: {
|
||||
Sortable
|
||||
},
|
||||
props:{
|
||||
column:{type:Array},
|
||||
role_id:{type:Number}
|
||||
},
|
||||
watch:{
|
||||
column: {
|
||||
handler(val){
|
||||
this.roleColumn = JSON.parse(JSON.stringify(val));
|
||||
this.$nextTick(()=>{
|
||||
this.roleColumn.length>0 && this.rowDrop();
|
||||
})
|
||||
},
|
||||
},
|
||||
role_id:{
|
||||
handler(val){
|
||||
this.id = val;
|
||||
},
|
||||
deep: true
|
||||
},
|
||||
roleColumn:{
|
||||
handler(newVal,oldVal){
|
||||
if(oldVal && oldVal.length>0){
|
||||
this.$emit('roleChange', this.roleColumn)
|
||||
}
|
||||
},
|
||||
deep: true
|
||||
}
|
||||
},
|
||||
data(){
|
||||
return{
|
||||
isSave: false,
|
||||
id:0,
|
||||
roleColumn: JSON.parse(JSON.stringify(this.column || []))
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
|
||||
},
|
||||
methods:{
|
||||
rowDrop(){
|
||||
const tbody = this.$refs.list.querySelector('ul')
|
||||
Sortable.create(tbody, {
|
||||
handle: ".move",
|
||||
animation: 300,
|
||||
ghostClass: "ghost",
|
||||
onEnd:({ newIndex, oldIndex })=> {
|
||||
const tableData = this.roleColumn
|
||||
const currRow = tableData.splice(oldIndex, 1)[0]
|
||||
tableData.splice(newIndex, 0, currRow)
|
||||
}
|
||||
})
|
||||
},
|
||||
liClick(item){
|
||||
this.$emit('roleClick',item);
|
||||
},
|
||||
table_edit(item){
|
||||
this.$emit('roleEdit',item);
|
||||
},
|
||||
table_del(item){
|
||||
this.$emit('roleDelete',item);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.setting-column__list {}
|
||||
.setting-column__list li {list-style: none;margin:0;padding: 10px 0 10px 10px;display: flex;align-items: center;}
|
||||
.setting-column__list li .name_b{margin-left: 10px;flex: 1;}
|
||||
.setting-column__list li.liCheck{background: #E7F3FF;}
|
||||
.setting-column__list li:hover{background: #E7F3FF;cursor: pointer;}
|
||||
.setting-column__list li:hover .btnBox{display: flex;align-items: center;}
|
||||
|
||||
.btnBox{
|
||||
display: none;
|
||||
margin-right: 10px;
|
||||
.btn{margin: 0 5px;}
|
||||
.btn.edit{color: var(--el-color-primary)}
|
||||
.btn.del{color: var(--el-color-danger)}
|
||||
}
|
||||
</style>
|
||||
@ -1,15 +1,15 @@
|
||||
<template>
|
||||
<el-container class="mainBox">
|
||||
<el-aside width="200px" v-loading="showGroupLoading">
|
||||
<el-container>
|
||||
<el-header>
|
||||
<el-input placeholder="输入关键字进行过滤" :size="size" v-model="groupFilterText" clearable></el-input>
|
||||
</el-header>
|
||||
<el-main class="treeMain nopadding">
|
||||
<el-tree ref="group" class="menu" node-key="id" :data="group" :current-node-key="''" :highlight-current="true" :expand-on-click-node="false" :filter-node-method="groupFilterNode" @node-click="groupClick"></el-tree>
|
||||
</el-main>
|
||||
</el-container>
|
||||
</el-aside>
|
||||
<!-- <el-aside width="200px" v-loading="showGroupLoading">-->
|
||||
<!-- <el-container>-->
|
||||
<!-- <el-header>-->
|
||||
<!-- <el-input placeholder="输入关键字进行过滤" :size="size" v-model="groupFilterText" clearable></el-input>-->
|
||||
<!-- </el-header>-->
|
||||
<!-- <el-main class="treeMain nopadding">-->
|
||||
<!-- <el-tree ref="group" class="menu" node-key="id" :data="group" :current-node-key="''" :highlight-current="true" :expand-on-click-node="false" :filter-node-method="groupFilterNode" @node-click="groupClick"></el-tree>-->
|
||||
<!-- </el-main>-->
|
||||
<!-- </el-container>-->
|
||||
<!-- </el-aside>-->
|
||||
<el-container class="mainHeaderNoBorderPadding">
|
||||
<el-header style="padding-left: 10px;">
|
||||
<div class="left-panel">
|
||||
@ -63,6 +63,20 @@
|
||||
</span>
|
||||
</span>
|
||||
</template>
|
||||
<template #is_online="scope">
|
||||
<span class="online" v-if="scope.row.online_info" :style="{color:`var(--el-order-color-2)`}"><span class="round" :style="{background:`var(--el-order-color-2)`}"></span> 在线</span>
|
||||
<span class="online" v-else :style="{color:`var(--el-order-color-0)`}"><span class="round" :style="{background:`var(--el-order-color-0)`}"></span> 离线</span>
|
||||
</template>
|
||||
<template #user_type="scope">
|
||||
<span v-for="(item,index) in userTypeList" :key="index">
|
||||
<span v-if="item.value == scope.row.user_type">{{item.label}}</span>
|
||||
</span>
|
||||
</template>
|
||||
<template #approve_status="scope">
|
||||
<span v-for="(item,index) in auditStatusList" :key="index">
|
||||
<span v-if="item.value == scope.row.approval_status" :style="{color: item.value==0?`var(--el-order-color-2)`: item.value==1?`var(--el-order-color-3)`:`var(--el-order-color-5)`}">{{item.label}}</span>
|
||||
</span>
|
||||
</template>
|
||||
<template #active_status="scope">
|
||||
<el-switch :size="size" v-model="scope.row.active_status" @change="changeSwitch($event, scope.row)" :loading="scope.row.$switch_status" :active-value="true" :inactive-value="false"></el-switch>
|
||||
</template>
|
||||
@ -76,6 +90,9 @@
|
||||
<div v-auth="'updateMe'">
|
||||
<el-dropdown-item @click="table_edit(scope.row, 'edit')" icon="sc-icon-Edit">编辑用户</el-dropdown-item>
|
||||
</div>
|
||||
<div v-auth="'userAudit'" v-if="scope.row.approval_status == 0">
|
||||
<el-dropdown-item @click="table_review(scope.row)" icon="sc-icon-OrderReview">审核用户</el-dropdown-item>
|
||||
</div>
|
||||
<div v-auth="'viewUserPermissions'">
|
||||
<el-dropdown-item @click="table_empower(scope.row)" icon="sc-icon-AbilityAuthorization" divided>查看权限</el-dropdown-item>
|
||||
</div>
|
||||
@ -93,6 +110,7 @@
|
||||
</el-container>
|
||||
|
||||
<save-dialog v-if="dialog.save" ref="saveDialog" @success="handleSuccess" @closed="dialog.save=false"></save-dialog>
|
||||
<review-dialog v-if="dialog.review" ref="reviewDialog" @success="handleSuccess" @closed="dialog.review=false"></review-dialog>
|
||||
<re-pwd-dialog v-if="dialog.rePwdD" ref="rePwdDialog" @success="handleSuccess" @closed="dialog.rePwdD=false"></re-pwd-dialog>
|
||||
<dis-role-dialog v-if="dialog.role" ref="diRoleDialog" @success="handleSuccess" @closed="dialog.role=false"></dis-role-dialog>
|
||||
|
||||
@ -100,24 +118,28 @@
|
||||
|
||||
<script>
|
||||
import saveDialog from './save'
|
||||
import reviewDialog from './review'
|
||||
import rePwdDialog from './rePwd'
|
||||
import disRoleDialog from './role'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
saveDialog, rePwdDialog, disRoleDialog
|
||||
saveDialog, rePwdDialog, disRoleDialog, reviewDialog
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
size:'small',
|
||||
dialog: {
|
||||
save: false,
|
||||
review: false,
|
||||
rePwdD: false,
|
||||
role: false
|
||||
},
|
||||
showGroupLoading: false,
|
||||
groupFilterText: '',
|
||||
group: [],
|
||||
auditStatusList:[],
|
||||
userTypeList:[],
|
||||
list:{
|
||||
apiObj: this.$API.system.user.list,
|
||||
column:[]
|
||||
@ -141,7 +163,9 @@
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getGroup()
|
||||
// this.getGroup()
|
||||
this.auditStatus();
|
||||
this.userType();
|
||||
},
|
||||
methods: {
|
||||
searchShowClick(){
|
||||
@ -273,6 +297,13 @@
|
||||
|
||||
})
|
||||
},
|
||||
// 审核用户
|
||||
table_review(row){
|
||||
this.dialog.review = true
|
||||
this.$nextTick(() => {
|
||||
this.$refs.reviewDialog.open('show').setData(row)
|
||||
})
|
||||
},
|
||||
// 查看用户权限
|
||||
table_empower(row){
|
||||
this.$router.push({
|
||||
@ -287,17 +318,31 @@
|
||||
selectionChange(selection){
|
||||
this.selection = selection;
|
||||
},
|
||||
//加载树数据
|
||||
async getGroup(){
|
||||
this.showGroupLoading = true;
|
||||
const res = await this.$API.system.dept.active.post();
|
||||
// 加载用户审核常量
|
||||
async auditStatus() {
|
||||
const res = await this.$API.system.user.auditStatus.post();
|
||||
if(res.code == 200){
|
||||
const allNode = {id: '', label: '所有'};
|
||||
res.data.unshift(allNode);
|
||||
this.group = res.data;
|
||||
this.auditStatusList = res.data;
|
||||
}
|
||||
this.showGroupLoading = false;
|
||||
},
|
||||
// 加载用户类型常量
|
||||
async userType() {
|
||||
const res = await this.$API.system.user.userType.post();
|
||||
if (res.code == 200) {
|
||||
this.userTypeList = res.data;
|
||||
}
|
||||
},
|
||||
//加载树数据
|
||||
// async getGroup(){
|
||||
// this.showGroupLoading = true;
|
||||
// const res = await this.$API.system.dept.active.post();
|
||||
// if(res.code == 200){
|
||||
// const allNode = {id: '', label: '所有'};
|
||||
// res.data.unshift(allNode);
|
||||
// this.group = res.data;
|
||||
// }
|
||||
// this.showGroupLoading = false;
|
||||
// },
|
||||
//树过滤
|
||||
groupFilterNode(value, data){
|
||||
if (!value) return true;
|
||||
@ -363,5 +408,9 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
<style lang="scss" scoped>
|
||||
.online{
|
||||
display: flex;align-items: center;
|
||||
.round{width: 10px;height: 10px;display: inline-block;border-radius: 50%;margin-right: 4px;}
|
||||
}
|
||||
</style>
|
||||
|
||||
143
src/views/setting/user/review.vue
Normal file
143
src/views/setting/user/review.vue
Normal file
@ -0,0 +1,143 @@
|
||||
<template>
|
||||
<el-dialog :title="titleMap[mode]" v-model="visible" :width="500" draggable destroy-on-close @closed="$emit('closed')">
|
||||
<el-form class="form" :model="form" :rules="rules" ref="dialogForm" label-width="100px" label-position="right">
|
||||
<div class="cardBoxForm">
|
||||
<div class="comBox">
|
||||
<el-form-item label="用户头像" prop="avatar">
|
||||
<ossImgUpload :url="form.avatar" disabled />
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cardBoxForm">
|
||||
<div class="title">用户信息</div>
|
||||
<div class="comBox">
|
||||
<el-form-item label="姓名/工号" required>
|
||||
<el-row :gutter="24" justify="space-between">
|
||||
<el-col :span="12">
|
||||
<el-form-item prop="name">
|
||||
<el-input v-model="form.name" placeholder="请填写真实姓名" disabled clearable></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item prop="emp_id">
|
||||
<el-input v-model="form.emp_id" placeholder="请填写工号" disabled clearable></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form-item>
|
||||
<el-form-item label="登录账号" prop="login_name">
|
||||
<el-input v-model="form.login_name" placeholder="请填写登录账号" disabled clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="公司名称" prop="company_full_name">
|
||||
<el-input v-model="form.company_full_name" placeholder="请填写公司名称" disabled clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="审核意见" prop="opinion">
|
||||
<el-input v-model="form.opinion" type="textarea" :row="2" placeholder="请填写审核意见" clearable></el-input>
|
||||
<p class="el-form-item-msg">如果审核拒绝,请填写审核意见</p>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="visible=false">取 消</el-button>
|
||||
<el-button type="danger" :loading="passLoading" @click="approve_pass(2)">拒 绝</el-button>
|
||||
<el-button type="primary" :loading="isSave" @click="approve_pass(1)">通 过</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
emits: ['success', 'closed'],
|
||||
data() {
|
||||
return {
|
||||
mode: "show",
|
||||
titleMap: {
|
||||
show: '用户审核',
|
||||
},
|
||||
visible: false,
|
||||
passLoading:false,
|
||||
isSave: false,
|
||||
//表单数据
|
||||
form: {
|
||||
id:"",
|
||||
avatar:"",
|
||||
login_name: "",
|
||||
name:"",
|
||||
approval_status:"",
|
||||
company_full_name:"",
|
||||
opinion:"",
|
||||
},
|
||||
//验证规则
|
||||
rules: {
|
||||
avatar:[
|
||||
{required: true, message: '请上传头像'}
|
||||
],
|
||||
login_name:[
|
||||
{required: true, message: '账号不能为空'}
|
||||
],
|
||||
},
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
|
||||
},
|
||||
methods: {
|
||||
//显示
|
||||
open(mode='add'){
|
||||
this.mode = mode;
|
||||
this.visible = true;
|
||||
return this
|
||||
},
|
||||
//表单提交方法 num 1 通过 2 拒绝
|
||||
approve_pass(num){
|
||||
this.$refs.dialogForm.validate(async (valid) => {
|
||||
if (valid) {
|
||||
this.form.approval_status = num;
|
||||
if(num == 2){
|
||||
this.passLoading = true;
|
||||
}else{
|
||||
this.isSave = true;
|
||||
}
|
||||
const res = await this.$API.system.user.audit.post(this.form);
|
||||
if(num == 2){
|
||||
this.passLoading = false;
|
||||
}else{
|
||||
this.isSave = false;
|
||||
}
|
||||
if(res.code == 200){
|
||||
this.$emit('success', this.form, this.mode)
|
||||
this.visible = false;
|
||||
this.$message.success("操作成功")
|
||||
}
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
})
|
||||
},
|
||||
//表单注入数据
|
||||
setData(data){
|
||||
this.form.id = data.id
|
||||
this.form.login_name = data.login_name;
|
||||
this.form.name = data.name;
|
||||
this.form.avatar = data.avatar && data.avatar!==""?data.avatar:'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png';
|
||||
this.form.company_full_name = data.company_info?data.company_info.full_name:''
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.form{
|
||||
.cardBoxForm{
|
||||
border-bottom: 1px solid #f7f7f7;
|
||||
.title{
|
||||
padding: 15px 0 8px 18px;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.cardBoxForm:last-child{
|
||||
border-bottom: 0;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -39,21 +39,21 @@
|
||||
<el-form-item label="电子邮件" prop="email">
|
||||
<el-input v-model="form.email" placeholder="请填写电子邮件" clearable></el-input>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cardBoxForm">
|
||||
<div class="title">角色和部门</div>
|
||||
<div class="comBox">
|
||||
<el-form-item label="分配角色" prop="role_ids">
|
||||
<el-select v-model="form.role_ids" multiple filterable placeholder="请选择角色" style="width: 100%">
|
||||
<el-option v-for="item in groups" :key="item.id" :label="item.label" :value="item.id"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="所属部门" prop="dept_id">
|
||||
<el-cascader v-model="form.dept_id" :options="depts" :props="deptsProps" placeholder="请选择部门" clearable style="width: 100%;"></el-cascader>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="cardBoxForm">-->
|
||||
<!-- <div class="title">角色和部门</div>-->
|
||||
<!-- <div class="comBox">-->
|
||||
<!-- <el-form-item label="所属部门" prop="dept_id">-->
|
||||
<!-- <el-cascader v-model="form.dept_id" :options="depts" :props="deptsProps" placeholder="请选择部门" clearable style="width: 100%;"></el-cascader>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="visible=false" >取 消</el-button>
|
||||
@ -85,7 +85,7 @@
|
||||
email:"",
|
||||
avatar: "",
|
||||
password:"",
|
||||
dept_id: "",
|
||||
// dept_id: "",
|
||||
role_ids: []
|
||||
},
|
||||
//验证规则
|
||||
@ -127,9 +127,9 @@
|
||||
}
|
||||
}}
|
||||
],
|
||||
dept_id: [
|
||||
{required: true, message: '请选择所属部门'}
|
||||
],
|
||||
// dept_id: [
|
||||
// {required: true, message: '请选择所属部门'}
|
||||
// ],
|
||||
role_ids: [
|
||||
{required: true, message: '请选择所属角色', trigger: 'change'}
|
||||
]
|
||||
@ -141,17 +141,17 @@
|
||||
multiple: true,
|
||||
checkStrictly: true
|
||||
},
|
||||
depts: [],
|
||||
deptsProps: {
|
||||
value: "id",
|
||||
checkStrictly: false,
|
||||
emitPath:false
|
||||
}
|
||||
// depts: [],
|
||||
// deptsProps: {
|
||||
// value: "id",
|
||||
// checkStrictly: false,
|
||||
// emitPath:false
|
||||
// }
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getGroup()
|
||||
this.getDept()
|
||||
// this.getDept()
|
||||
},
|
||||
methods: {
|
||||
//显示
|
||||
@ -167,12 +167,12 @@
|
||||
this.groups = res.data.rows;
|
||||
}
|
||||
},
|
||||
async getDept(){
|
||||
const res = await this.$API.system.dept.active.post();
|
||||
if(res.code == 200){
|
||||
this.depts = res.data;
|
||||
}
|
||||
},
|
||||
// async getDept(){
|
||||
// const res = await this.$API.system.dept.active.post();
|
||||
// if(res.code == 200){
|
||||
// this.depts = res.data;
|
||||
// }
|
||||
// },
|
||||
parentParams(item){
|
||||
this.form.avatar = item;
|
||||
},
|
||||
@ -202,7 +202,7 @@
|
||||
this.form.mobile = data.mobile
|
||||
this.form.email = data.email
|
||||
this.form.avatar = data.avatar
|
||||
this.form.dept_id = data.dept_id
|
||||
// this.form.dept_id = data.dept_id
|
||||
this.form.group = data.group
|
||||
this.form.role_ids = data.user_roles && data.user_roles.role_ids?data.user_roles.role_ids:[]
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user