Browse Source

部门管理/角色管理 03-29

master
xuhuajiao 2 years ago
parent
commit
9dedaa60eb
  1. BIN
      src/assets/images/icon/tip-icon.png
  2. 10
      src/assets/styles/archives-manage.scss
  3. 407
      src/assets/styles/yxk-admin.scss
  4. 68
      src/components/Crud/CRUD.operation.vue
  5. 258
      src/views/system/dept/index.vue
  6. 173
      src/views/system/role/index.vue
  7. 101
      src/views/system/user/index.vue

BIN
src/assets/images/icon/tip-icon.png

After

Width: 200  |  Height: 200  |  Size: 6.5 KiB

10
src/assets/styles/archives-manage.scss

@ -764,8 +764,8 @@
color: #666;
}
}
//其他
.delMsg{
color: #fff;
font-size: 16px;
}
// //其他
// .delMsg{
// color: #fff;
// font-size: 16px;
// }

407
src/assets/styles/yxk-admin.scss

@ -1,3 +1,40 @@
.elect-cont-left{
width: 265px;
margin-right: 20px;
@include bg_color;
@include box_padding;
.head-container{
margin-bottom: 20px;
}
.container-left{
@include tree_height_min;
}
}
.elect-cont-right{
// padding: 20px;
@include bg_color;
@include box_padding;
.head-container{
margin-bottom: 20px;
}
.container-right{
@include table_height_min;
}
}
.hideSidebar{
// siderbar-收起 54 + 间距 60 + treeLeft 265
.elect-cont-right{
width: calc(100vw - 379px);
}
}
.openSidebar{
// siderbar-展开 256 + 间距 60 + treeLeft 265
.elect-cont-right{
width: calc(100vw - 581px);
}
}
.head-container {
// padding: 20px;
@ -27,6 +64,9 @@
height: 30px !important;
width: 230px !important;
}
.icon-zhuangtai{
font-size: 14px;
}
}
.el-tabs{
@ -136,27 +176,27 @@
.el-button--mini{
padding: 7px 10px;
}
.el-message-box,
.el-popover{
.el-button{
border-color: #dcdfe6;
color: #606266;
}
// .el-message-box,
// .el-popover{
// .el-button{
// border-color: #dcdfe6;
// color: #606266;
// }
.el-button:focus,
.el-button:hover {
color: #1890ff;
border-color: #badeff;
background-color: #e8f4ff;
}
.el-button--primary,
.el-button--primary:focus,
.el-button--primary:hover {
background: #46a6ff;
border-color: #46a6ff;
color: #fff;
}
}
// .el-button:focus,
// .el-button:hover {
// color: #1890ff;
// border-color: #badeff;
// background-color: #e8f4ff;
// }
// .el-button--primary,
// .el-button--primary:focus,
// .el-button--primary:hover {
// background: #46a6ff;
// border-color: #46a6ff;
// color: #fff;
// }
// }
.header-container-wrap{
min-height: auto;
@ -335,7 +375,8 @@
}
.el-icon-arrow-right:before{
color: #fff;
// color: #fff;
@include icon_color;
}
.el-picker-panel__icon-btn:before{
color: #303133;
@ -414,13 +455,22 @@
// 弹框
.el-dialog{
position: relative;
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
margin-top: 0 !important;
width: 736px;
padding: 0 20px;
border-radius: 6px;
box-shadow: 0px 14px 21px 0px rgba(0,0,0,0.17);
.el-dialog__header{
padding: 17px 0;
border-bottom: 1px solid #E6E8ED;
.el-dialog__title{
font-size: 16px;
color: #000;
}
.el-dialog__close{
font-family: "iconfont" !important;
@ -437,6 +487,9 @@
.el-dialog__body{
padding: 30px 0;
.el-form-item{
&:nth-child(odd){
margin-right: 40px;
}
.el-form-item__label{
color: #0C0E1E;
}
@ -458,6 +511,12 @@
line-height: 32px;
}
}
.vue-treeselect--focused{
.vue-treeselect__control{
border-radius: 5px;
border-color: #0348F3;
}
}
.el-icon-close{
border-radius: 0;
font-family: "iconfont" !important;
@ -494,6 +553,9 @@
}
.selecct-dropdown{
.el-select-dropdown{
position: absolute !important;
top: 36px !important;
left: 0 !important;
padding: 6px 0;
margin-top: 0;
.el-select-dropdown__item{
@ -502,28 +564,48 @@
}
}
}
}
.dialog-footer{
display: flex;
justify-content: flex-end;
margin-top: 60px;
.el-button{
width: 76px;
height: 32px;
line-height: 32px;
padding: 0;
border-color: #E6E8ED;
background-color: transparent;
color: #545B65;
font-weight: normal;
&.el-button--primary{
color: #fff;
background-color: #0348F3;
border-color: #0348F3;
.el-input-number{
width: 225px;
.el-input__inner{
text-align: left;
}
.el-input-number__increase,
.el-input-number__decrease{
background-color: transparent !important;
&.is-disabled{
background-color: #E3E7EE !important;
}
}
.el-icon-arrow-down,
.el-icon-arrow-up{
font-family: "iconfont" !important;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-size: 12px;
color: #545B65;
transform: scale(0.5);
}
.el-icon-arrow-down:before{
content: "\E629";
}
.el-icon-arrow-up:before{
content: "\E62c";
}
}
// .el-input-number.is-controls-right {
// .el-input-number__decrease,
// .el-input-number__increase{
// display: none;
// }
// .el-input__inner{
// padding-left: 0;
// padding-right: 0;
// }
// }
}
// position: relative;
// position: fixed;
// width: 620px;
@ -651,6 +733,29 @@
// }
// }
}
.dialog-footer,
.el-message-box__btns{
display: flex;
justify-content: flex-end;
margin-top: 60px;
.el-button{
width: 76px;
height: 32px;
line-height: 32px;
padding: 0;
border-color: #E6E8ED;
background-color: transparent;
color: #545B65;
font-weight: normal;
&.el-button--primary{
color: #fff;
background-color: #0348F3;
border-color: #0348F3;
}
}
}
// .el-dialog,
// .right-preview{
// .el-form{
@ -903,10 +1008,31 @@
}
}
}
// 提示框-dialog
.tip-dialog{
.el-dialog{
width: 504px;
.setting-dialog{
padding: 0 10px;
}
.tip-content{
padding-left: 34px;
font-size: 14px;
line-height: 24px;
color: #0C0E1E;
background: url("~@/assets/images/icon/tip-icon.png") no-repeat left top;
background-size: 24px 24px;
span{
font-size: 12px;
color: #ED4A41;
}
}
}
.dialog-footer{
margin-top: 27px;
}
}
.setting-dialog{
z-index: 100;
position: relative;
color: #fff;
.des-form{
width: 100% !important;
margin-top: 0 !important;
@ -956,86 +1082,140 @@ input[type ='number'] {
}
// 弹框-删除等提示
.setting-dialog{
.dialog-delt{
line-height: 26px;
color: #fff;
margin-bottom: 20px;
}
.delt-tip{
margin-top: 10px;
color: #EF3147;
}
}
// .setting-dialog{
// // .dialog-delt{
// // line-height: 26px;
// // color: #fff;
// // margin-bottom: 20px;
// // }
// // .delt-tip{
// // margin-top: 10px;
// // color: #EF3147;
// // }
// }
// alert 样式
// .el-message-box{
// position: relative;
// width: 588px;
// border: 2px solid $mainColor;
// border-bottom: none;
// border-radius: 4px 4px 0 0;
// background-color: $boxBg;
// overflow: visible;
// &::after{
// position: absolute;
// left: -2px;
// bottom: -30px;
// content: "";
// width: 589px;
// height: 30px;
// background: url(~@/assets/images/alert_bottom.png) no-repeat;
// background-size: contain;
// }
// .el-message-box__header{
// padding: 18px 60px;
// background-color: $mainColor;
// .el-message-box__title{
// font-weight: bold;
// color: #fff;
// }
// .el-message-box__headerbtn{
// top: -36px;
// right: -16px;
// }
// .el-icon-close{
// font-family: "iconfont" !important;
// font-style: normal;
// -webkit-font-smoothing: antialiased;
// -moz-osx-font-smoothing: grayscale;
// font-size: 24px;
// color: $mainColor;
// &::before{
// content: "\E61b";
// }
// }
// }
// .el-message-box__content{
// height: 110px;
// padding: 35px 60px 15px 60px;
// color: #fff;
// }
// }
// .el-message-box .el-button,
// .el-popover .el-button{
// color: #fff;
// border-color: $mainColor;
// background-color: transparent;
// }
// .el-message-box .el-button:hover,
// .el-popover .el-button:focus{
// color: #fff;
// background-color: #02255F;
// border-color: $mainColor;
// }
// .el-message-box .el-button--primary,
// .el-message-box .el-button--primary:focus,
// .el-message-box .el-button--primary:hover {
// background: #46a6ff;
// border-color: #46a6ff;
// color: #fff;
// }
.el-message-box{
position: relative;
width: 588px;
border: 2px solid $mainColor;
border-bottom: none;
border-radius: 4px 4px 0 0;
background-color: $boxBg;
overflow: visible;
&::after{
position: absolute;
left: -2px;
bottom: -30px;
content: "";
width: 589px;
height: 30px;
background: url(~@/assets/images/alert_bottom.png) no-repeat;
background-size: contain;
}
width: 504px;
padding: 0 20px 30px 20px;
.el-message-box__header{
padding: 18px 60px;
background-color: $mainColor;
padding: 17px 0;
border-bottom: 1px solid #E6E8ED;
.el-message-box__title{
font-weight: bold;
color: #fff;
font-size: 16px;
line-height: 24px;
color: #000;
}
.el-message-box__headerbtn{
top: -36px;
right: -16px;
}
.el-icon-close{
font-family: "iconfont" !important;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-size: 24px;
color: $mainColor;
&::before{
content: "\E61b";
top: 20px;
right: 0;
.el-icon-close{
font-family: "iconfont" !important;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-size: 16px;
color: #545b65;
&::before{
content: "\E61b";
}
}
}
}
.el-message-box__content{
height: 110px;
padding: 35px 60px 15px 60px;
color: #fff;
padding: 26px 10px 10px 10px;
.el-message-box__status{
top: 12px;
&.el-icon-warning{
color: #ED4A41;
}
}
.el-message-box__message{
p{
color: #0C0E1E;
span{
display: block;
font-size: 12px;
color: #ED4A41;
}
}
}
}
.el-message-box__btns{
padding: 0;
margin-top: 27px;
}
}
.el-message-box .el-button,
.el-popover .el-button{
color: #fff;
border-color: $mainColor;
background-color: transparent;
}
.el-message-box .el-button:hover,
.el-popover .el-button:focus{
color: #fff;
background-color: #02255F;
border-color: $mainColor;
}
.el-message-box .el-button--primary,
.el-message-box .el-button--primary:focus,
.el-message-box .el-button--primary:hover {
background: #46a6ff;
border-color: #46a6ff;
color: #fff;
}
.el-table__header-wrapper{
@include elTable-style;
}
@ -1315,6 +1495,9 @@ input[type ='number'] {
background: url('~@/assets/images/warehouse_arrow_right.png') no-repeat;
}
}
.el-switch .el-switch__core{
@include switch-disabled;
}
.el-switch.is-checked .el-switch__core{
@include switch-style;
@ -1324,6 +1507,8 @@ input[type ='number'] {
@include switch-disabled;
}
.vue-treeselect--open-below .vue-treeselect__menu{
padding: 6px 0;
top: 4px !important;
@ -1346,5 +1531,5 @@ input[type ='number'] {
}
}
}
}
}

68
src/components/Crud/CRUD.operation.vue

@ -9,20 +9,26 @@
新增
</el-button>
<!-- type="success" -->
<el-button v-if="crud.optShow.edit" v-permission="permission.edit" size="mini" icon="el-icon-edit" :disabled="crud.selections.length !== 1" @click="crud.toEdit(crud.selections[0])">
修改
<el-button v-if="crud.optShow.edit" v-permission="permission.edit" size="mini" :disabled="crud.selections.length !== 1" @click="crud.toEdit(crud.selections[0])">
<i class="iconfont icon-bianji" />
编辑
</el-button>
<slot name="middle" />
<!-- type="danger" -->
<el-button v-if="crud.optShow.del" slot="reference" v-permission="permission.del" icon="el-icon-delete" size="mini" :loading="crud.delAllLoading" :disabled="crud.selections.length === 0" @click="delVisible=true">
<el-button v-if="crud.optShow.del" slot="reference" v-permission="permission.del" size="mini" :loading="crud.delAllLoading" :disabled="crud.selections.length === 0" @click="toDelete(crud.selections)">
<i class="iconfont icon-shanchu" />
删除
</el-button>
<!-- type="warning" -->
<el-button v-if="crud.optShow.download" :loading="crud.downloadLoading" :disabled="!crud.data.length" size="mini" icon="el-icon-download" @click="crud.doExport">导出</el-button>
<el-button v-if="crud.optShow.download" :loading="crud.downloadLoading" :disabled="!crud.data.length" size="mini" @click="exportVisible=true">
<i class="iconfont icon-daochu" />
导出
</el-button>
<!--右侧-->
<slot name="right" />
</div>
<!-- 删除弹窗 -->
<el-dialog :visible.sync="delVisible" title="确认删除">
<!-- <el-dialog :visible.sync="delVisible" title="确认删除">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
@ -31,6 +37,19 @@
<el-button type="primary" :loading="crud.delAllLoading" @click="toDelete(crud.selections)">确定</el-button>
</div>
</div>
</el-dialog> -->
<!-- 导出dialog -->
<el-dialog class="tip-dialog" :visible.sync="exportVisible" :modal-append-to-body="false" :close-on-click-modal="false" title="提示">
<div class="setting-dialog">
<div class="tip-content">
<p class="tipMsg">此操作将导出所选数据</p>
<span>你是否还要继续?</span>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="exportVisible = false">取消</el-button>
<el-button type="primary" @click="toExport(crud.selections)">继续</el-button>
</div>
</div>
</el-dialog>
<!-- <el-button-group v-if="crud.optShow.group" class="crud-opts-right">
<el-button size="mini" plain type="info" icon="el-icon-search" @click="toggleSearch()" />
@ -92,8 +111,8 @@ export default {
tableUnwatcher: null,
//
ignoreNextTableColumnsChange: false,
delVisible: false
// delVisible: false,
exportVisible: false
}
},
watch: {
@ -142,15 +161,23 @@ export default {
this.tableColumns = columns
},
toDelete(datas) {
// this.$confirm(this.crud.confirmDeleteMsg ? this.crud.confirmDeleteMsg : `${datas.length}?`, '', {
// confirmButtonText: '',
// cancelButtonText: ''
// }).then(() => {
this.crud.delAllLoading = true
this.delVisible = false
this.crud.doDelete(datas)
// }).catch(() => {
// })
// his.crud.confirmDeleteMsg ? this.crud.confirmDeleteMsg : `${datas.length}?`,
console.log(this.crud)
this.$confirm('此操作将删除当前所选' + this.crud.title + '<span>你是否还要继续?</span>', '提示', {
confirmButtonText: '继续',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true
}).then(() => {
this.crud.delAllLoading = true
this.crud.doDelete(datas)
}).catch(() => {
})
},
toExport() {
this.crud.downloadLoading = true
this.exportVisible = false
this.crud.doExport()
},
handleCheckAllChange(val) {
if (val === false) {
@ -222,11 +249,10 @@ export default {
.crud-opts .crud-opts-right span {
float: left;
}
.delMsg{
color: #fff;
font-size: 16px;
}
.iconfont{
font-size: 12px !important;
font-weight: normal;
}
.icon-xinzeng{
font-size: 14px !important;
}
</style>

258
src/views/system/dept/index.vue

@ -1,109 +1,137 @@
<template>
<div>
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle" class="head-search">
<!-- 搜索 -->
<el-input v-model="query.name" clearable size="small" placeholder="输入部门名称搜索" prefix-icon="el-icon-search" style="width: 200px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<date-range-picker v-model="query.createTime" class="date-item" />
<el-select v-model="query.enabled" clearable size="small" placeholder="状态" class="filter-item" style="width: 100px" @change="crud.toQuery">
<i slot="prefix" class="iconfont icon-zhuangtai-fanbai" />
<el-option v-for="item in enabledTypeOptions" :key="item.key" :label="item.display_name" :value="item.key" />
</el-select>
<rrOperation />
<div class="app-container">
<div class="container-main" style="justify-content: flex-start;">
<!--侧边部门数据-->
<div class="elect-cont-left">
<div class="head-container">
<el-input v-model="deptName" clearable size="small" placeholder="输入部门名称搜索" prefix-icon="el-icon-search" class="filter-item" @input="getDeptDatas" />
</div>
<!-- <div class="container-left">
<span class="right-top-line" />
<span class="left-bottom-line" />
<el-tree :data="deptDatas" :load="getDeptDatas" :props="defaultProps" :expand-on-click-node="false" lazy @node-click="handleNodeClick" />
</div> -->
</div>
<crudOperation :permission="permission" />
</div>
<!--表单组件-->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form ref="form" inline :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="部门名称" prop="name">
<el-input v-model="form.name" style="width: 370px;" />
</el-form-item>
<el-form-item label="部门排序" prop="deptSort">
<el-input-number
v-model.number="form.deptSort"
:min="0"
:max="999"
controls-position="right"
style="width: 370px;"
/>
</el-form-item>
<el-form-item label="顶级部门">
<el-radio-group v-model="form.isTop" style="width: 140px">
<el-radio label="1"></el-radio>
<el-radio label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="状态" prop="enabled">
<el-radio v-for="item in dict.dept_status" :key="item.id" v-model="form.enabled" :label="item.value">{{ item.label }}</el-radio>
</el-form-item>
<el-form-item v-if="form.isTop === '0'" style="margin-bottom: 0;" label="上级部门" prop="pid">
<treeselect
v-model="form.pid"
:load-options="loadDepts"
:options="depts"
style="width: 370px;"
placeholder="选择上级类目"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
<!--用户数据-->
<div class="elect-cont-right">
<!--工具栏-->
<div class="head-container">
<div class="head-search">
<!-- 搜索 -->
<el-input v-model="query.name" clearable size="small" placeholder="输入部门名称搜索" prefix-icon="el-icon-search" style="width: 200px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<date-range-picker v-model="query.createTime" class="date-item" />
<el-select v-model="query.enabled" clearable size="small" placeholder="状态" class="filter-item" style="width: 100px" @change="crud.toQuery">
<i slot="prefix" class="iconfont icon-zhuangtai" />
<el-option v-for="item in enabledTypeOptions" :key="item.key" :label="item.display_name" :value="item.key" />
</el-select>
<rrOperation />
</div>
<crudOperation :permission="permission" />
</div>
<!--表单组件-->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form ref="form" inline :model="form" :rules="rules" size="small" label-width="90px">
<el-form-item label="所属全宗" prop="dept">
<treeselect v-model="form.dept" :options="depts" placeholder="选择全宗" />
</el-form-item>
<el-form-item label="部门编码" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="部门名称" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="部门简称" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="顶级部门">
<el-radio-group v-model="form.isTop">
<el-radio label="1"></el-radio>
<el-radio label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="排序" prop="deptSort">
<el-input-number
v-model.number="form.deptSort"
:min="0"
:max="999"
controls-position="right"
/>
</el-form-item>
<el-form-item v-if="form.isTop === '0'" label="上级部门" prop="pid">
<treeselect
v-model="form.pid"
:load-options="loadDepts"
:options="depts"
placeholder="选择上级类目"
/>
</el-form-item>
<el-form-item label="状态" prop="enabled" :style="form.isTop === '0'? 'margin-left:0': 'margin:0 0 0 360px'">
<el-radio v-for="item in dict.dept_status" :key="item.id" v-model="form.enabled" :label="item.value">{{ item.label }}</el-radio>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
</div>
</div>
</el-dialog>
<!--表格渲染-->
<div class="container-right">
<span class="right-top-line" />
<span class="left-bottom-line" />
<el-table
ref="table"
v-loading="crud.loading"
lazy
:load="getDeptDatas"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
:data="crud.data"
row-key="id"
@select="crud.selectChange"
@select-all="crud.selectAllChange"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column :selectable="checkboxT" type="selection" align="center" width="55" />
<el-table-column label="部门名称" prop="name" />
<el-table-column label="部门编码" prop="name" />
<el-table-column label="部门人数" prop="name" />
<el-table-column label="排序" prop="deptSort" />
<el-table-column label="所属全宗" prop="deptSort" />
<el-table-column label="状态" align="center" prop="enabled">
<template slot-scope="scope">
<el-switch
v-model="scope.row.enabled"
:disabled="scope.row.id === 1"
active-color="#409EFF"
inactive-color="#F56C6C"
@change="changeEnabled(scope.row, scope.row.enabled,)"
/>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建日期">
<template slot-scope="scope">
<div>{{ scope.row.createTime | parseTime }}</div>
</template>
</el-table-column>
<!-- <el-table-column v-if="checkPer(['admin','dept:edit','dept:del'])" label="操作" width="130px" align="center" fixed="right">
<template slot-scope="scope">
<udOperation
:data="scope.row"
:permission="permission"
:disabled-dle="scope.row.id === 1"
msg="确定删除吗,如果存在下级节点则一并删除,此操作不能撤销!"
/>
</template>
</el-table-column> -->
</el-table>
<!--分页组件-->
<pagination />
</div>
</div>
</el-dialog>
<!--表格渲染-->
<div class="app-container container-wrap" style="margin-top:0;min-height: calc(100vh - 292px);">
<span class="right-top-line" />
<span class="left-bottom-line" />
<el-table
ref="table"
v-loading="crud.loading"
lazy
:load="getDeptDatas"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
:data="crud.data"
row-key="id"
@select="crud.selectChange"
@select-all="crud.selectAllChange"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column :selectable="checkboxT" type="selection" align="center" width="55" />
<el-table-column label="名称" prop="name" />
<el-table-column label="排序" prop="deptSort" />
<el-table-column label="状态" align="center" prop="enabled">
<template slot-scope="scope">
<el-switch
v-model="scope.row.enabled"
:disabled="scope.row.id === 1"
active-color="#409EFF"
inactive-color="#F56C6C"
@change="changeEnabled(scope.row, scope.row.enabled,)"
/>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建日期">
<template slot-scope="scope">
<div>{{ scope.row.createTime | parseTime }}</div>
</template>
</el-table-column>
<el-table-column v-if="checkPer(['admin','dept:edit','dept:del'])" label="操作" width="130px" align="center" fixed="right">
<template slot-scope="scope">
<udOperation
:data="scope.row"
:permission="permission"
:disabled-dle="scope.row.id === 1"
msg="确定删除吗,如果存在下级节点则一并删除,此操作不能撤销!"
/>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
@ -116,13 +144,14 @@ import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
// import udOperation from '@crud/UD.operation'
import DateRangePicker from '@/components/DateRangePicker'
import pagination from '@crud/Pagination'
const defaultForm = { id: null, name: null, isTop: '1', subCount: 0, pid: null, deptSort: 999, enabled: 'true' }
export default {
name: 'Dept',
components: { Treeselect, crudOperation, rrOperation, udOperation, DateRangePicker },
components: { Treeselect, crudOperation, rrOperation, DateRangePicker, pagination },
cruds() {
return CRUD({ title: '部门', url: 'api/dept', crudMethod: { ...crudDept }})
},
@ -140,6 +169,9 @@ export default {
{ required: true, message: '请输入序号', trigger: 'blur', type: 'number' }
]
},
deptName: '', deptDatas: [], jobs: [], level: 3, roles: [],
jobDatas: [], roleDatas: [], // 使
defaultProps: { children: 'children', label: 'name', isLeaf: 'leaf' },
permission: {
add: ['admin', 'dept:add'],
edit: ['admin', 'dept:edit'],
@ -233,10 +265,11 @@ export default {
},
//
changeEnabled(data, val) {
this.$confirm('此操作将 "' + this.dict.label.dept_status[val] + '" ' + data.name + '部门, 是否继续?', '提示', {
confirmButtonText: '确定',
this.$confirm('此操作将禁用 / 启用部门 “' + data.name + '”' + '<span>你是否还要继续?</span>', '提示', {
confirmButtonText: '继续',
cancelButtonText: '取消',
type: 'warning'
type: 'warning',
dangerouslyUseHTMLString: true
}).then(() => {
crudDept.edit(data).then(res => {
this.crud.notify(this.dict.label.dept_status[val] + '成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
@ -255,14 +288,5 @@ export default {
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
::v-deep .vue-treeselect__control,::v-deep .vue-treeselect__placeholder,::v-deep .vue-treeselect__single-value {
height: 30px;
line-height: 30px;
}
</style>
<style rel="stylesheet/scss" lang="scss" scoped>
::v-deep .el-input-number .el-input__inner {
text-align: left;
}
<style lang="scss" scoped>
</style>

173
src/views/system/role/index.vue

@ -1,94 +1,91 @@
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle" class="head-search">
<!-- 搜索 -->
<el-input v-model="query.blurry" size="small" clearable placeholder="输入名称或者描述搜索" prefix-icon="el-icon-search" style="width: 200px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<date-range-picker v-model="query.createTime" class="date-item" />
<rrOperation />
</div>
<crudOperation :permission="permission" />
</div>
<!-- 表单渲染 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="角色名称" prop="name">
<el-input v-model="form.name" style="width: 380px;" />
</el-form-item>
<el-form-item label="角色级别" prop="level">
<el-input-number v-model.number="form.level" :min="1" controls-position="right" style="width: 145px;" />
</el-form-item>
<el-form-item label="数据范围" prop="dataScope">
<el-select v-model="form.dataScope" style="width: 140px" placeholder="请选择数据范围" @change="changeScope">
<el-option
v-for="item in dateScopes"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item v-if="form.dataScope === '自定义'" label="数据权限" prop="depts">
<treeselect
v-model="deptDatas"
:load-options="loadDepts"
:options="depts"
multiple
style="width: 380px"
placeholder="请选择"
/>
</el-form-item>
<el-form-item label="描述信息" prop="description">
<el-input v-model="form.description" style="width: 380px;" rows="5" type="textarea" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
<div class="container-main" style="justify-content: flex-start;">
<!--侧边部门数据-->
<div class="elect-cont-right">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle" class="head-search">
<!-- 搜索 -->
<el-input v-model="query.blurry" size="small" clearable placeholder="输入部门名称搜索" prefix-icon="el-icon-search" style="width: 200px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<date-range-picker v-model="query.createTime" class="date-item" />
<rrOperation />
</div>
<crudOperation :permission="permission" />
</div>
</div>
</el-dialog>
<el-row :gutter="15">
<!--角色管理-->
<el-col :xs="15" :sm="17" :md="18" :lg="19" :xl="19">
<el-card class="box-card" shadow="never">
<div class="container-right">
<span class="right-top-line" />
<span class="left-bottom-line" />
<div slot="header" class="clearfix">
<span class="role-span">角色列表</span>
</div>
<el-table ref="table" v-loading="crud.loading" highlight-current-row style="width: 100%;" height="calc(100vh - 400px)" :data="crud.data" @selection-change="crud.selectionChangeHandler" @current-change="handleCurrentChange">
<!-- 表单渲染 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="角色名称" prop="name">
<el-input v-model="form.name" style="width: 380px;" />
</el-form-item>
<el-form-item label="角色级别" prop="level">
<el-input-number v-model.number="form.level" :min="1" controls-position="right" style="width: 145px;" />
</el-form-item>
<el-form-item label="数据范围" prop="dataScope">
<el-select v-model="form.dataScope" style="width: 140px" placeholder="请选择数据范围" @change="changeScope">
<el-option
v-for="item in dateScopes"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item v-if="form.dataScope === '自定义'" label="数据权限" prop="depts">
<treeselect
v-model="deptDatas"
:load-options="loadDepts"
:options="depts"
multiple
style="width: 380px"
placeholder="请选择"
/>
</el-form-item>
<el-form-item label="描述信息" prop="description">
<el-input v-model="form.description" style="width: 380px;" rows="5" type="textarea" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
</div>
</div>
</el-dialog>
<el-table ref="table" v-loading="crud.loading" highlight-current-row style="width: 100%;" :data="crud.data" @selection-change="crud.selectionChangeHandler" @current-change="handleCurrentChange">
<el-table-column :selectable="checkboxT" type="selection" align="center" width="55" />
<el-table-column prop="name" label="名称" />
<el-table-column prop="dataScope" label="数据权限" />
<el-table-column prop="level" label="角色级别" />
<el-table-column :show-overflow-tooltip="true" prop="description" label="描述" />
<el-table-column :show-overflow-tooltip="true" width="135px" prop="createTime" label="创建日期">
<el-table-column prop="name" label="角色名称" />
<!-- <el-table-column prop="dataScope" label="数据权限" /> -->
<!-- <el-table-column prop="level" label="角色级别" /> -->
<el-table-column :show-overflow-tooltip="true" prop="description" label="描述信息" />
<el-table-column prop="number" label="人数" />
<el-table-column :show-overflow-tooltip="true" prop="createTime" label="创建日期">
<template slot-scope="scope">
<div>{{ scope.row.createTime | parseTime }}</div>
</template>
</el-table-column>
<el-table-column v-if="checkPer(['admin','roles:edit','roles:del'])" label="操作" width="130px" align="center" fixed="right">
<template slot-scope="scope">
<udOperation
v-if="scope.row.level >= level"
:data="scope.row"
:permission="permission"
/>
</template>
</el-table-column>
<!-- <el-table-column v-if="checkPer(['admin','roles:edit','roles:del'])" label="操作" width="130px" align="center" fixed="right">
<template slot-scope="scope">
<udOperation
v-if="scope.row.level >= level"
:data="scope.row"
:permission="permission"
/>
</template>
</el-table-column> -->
</el-table>
<!--分页组件-->
<pagination />
</el-card>
</el-col>
<!-- 菜单授权 -->
<el-col :xs="9" :sm="7" :md="6" :lg="5" :xl="5">
<el-card class="box-card" shadow="never" style="min-height:calc(100vh - 292px)">
</div>
</div>
<div class="elect-cont-left" style="margin: 0 0 0 20px;">
<div class="container-left">
<span class="right-top-line" />
<span class="left-bottom-line" />
<div slot="header" class="clearfix">
@ -118,9 +115,9 @@
node-key="id"
@check="menuChange"
/>
</el-card>
</el-col>
</el-row>
</div>
</div>
</div>
</div>
</template>
@ -131,7 +128,7 @@ import { getMenusTree, getChild } from '@/api/system/menu'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
// import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
@ -141,7 +138,7 @@ import DateRangePicker from '@/components/DateRangePicker'
const defaultForm = { id: null, name: null, depts: [], description: null, dataScope: '全部', level: 3 }
export default {
name: 'Role',
components: { Treeselect, pagination, crudOperation, rrOperation, udOperation, DateRangePicker },
components: { Treeselect, pagination, crudOperation, rrOperation, DateRangePicker },
cruds() {
return CRUD({ title: '角色', url: 'api/roles', sort: 'level,asc', crudMethod: { ...crudRoles }})
},
@ -350,14 +347,14 @@ export default {
}
</script>
<style rel="stylesheet/scss" lang="scss">
<!-- <style rel="stylesheet/scss" lang="scss">
.role-span {
font-weight: bold;color: #303133;
font-size: 15px;
}
</style>
</style> -->
<style rel="stylesheet/scss" lang="scss" scoped>
<!-- <style rel="stylesheet/scss" lang="scss" scoped>
.head-container{
padding: 0 0 20px 0;
}
@ -377,5 +374,5 @@ export default {
}
::v-deep .el-table__header{
border-top: 1px solid #113D72;
}
</style>
} -->
<!-- </style> -->

101
src/views/system/user/index.vue

@ -4,7 +4,7 @@
<!--侧边部门数据-->
<div class="elect-cont-left">
<div class="head-container">
<el-input v-model="deptName" clearable size="small" placeholder="输入部门名称搜索" prefix-icon="el-icon-search" class="filter-item" @input="getDeptDatas" />
<el-input v-model="deptName" clearable size="small" placeholder="输入全宗名称搜索" prefix-icon="el-icon-search" class="filter-item" @input="getDeptDatas" />
</div>
<div class="container-left">
<span class="right-top-line" />
@ -16,7 +16,7 @@
<div class="elect-cont-right">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle" class="head-search">
<div class="head-search">
<!-- 搜索 -->
<el-input v-model="query.blurry" clearable size="small" placeholder="输入名称或者邮箱搜索" prefix-icon="el-icon-search" style="width: 200px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<date-range-picker v-model="query.createTime" class="date-item" />
@ -26,8 +26,8 @@
</el-select>
<rrOperation />
</div>
<crudOperation show="" :permission="permission">
<el-button slot="right" icon="el-icon-refresh-left" size="mini" :disabled="!crud.selections.length" @click="handlePwdReset(crud.selections)">密码重置</el-button>
<crudOperation :permission="permission">
<el-button slot="right" icon="el-icon-refresh-left" size="mini" :disabled="crud.selections.length !== 1" @click="handlePwdReset(crud.selections)">密码重置</el-button>
</crudOperation>
</div>
<div class="container-right">
@ -74,7 +74,7 @@
</el-radio-group>
</el-form-item>
<el-form-item style="margin-bottom: 0;" label="角色" prop="roles" class="is-required selecct-dropdown">
<el-select v-model="roleDatas" style="width: 558px" multiple placeholder="请选择" :popper-append-to-body="false" @remove-tag="deleteTag" @change="changeRole">
<el-select v-model="roleDatas" style="width: 584x" multiple placeholder="请选择" :popper-append-to-body="false" @remove-tag="deleteTag" @change="changeRole">
<el-option v-for="item in roles" :key="item.name" :disabled="level !== 1 && item.level <= level" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
@ -85,14 +85,29 @@
</div>
</div>
</el-dialog>
<!-- 密码 -->
<el-dialog :visible.sync="resetVisible" title="确认密码重置">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<!-- 删除dialog -->
<!-- <el-dialog class="tip-dialog" :visible.sync="delVisible" :modal-append-to-body="false" :close-on-click-modal="false" title="提示">
<div class="setting-dialog">
<p class="delMsg">确认重置所选{{ crud.selections.length }}个用户的密码用户默认密码为123456</p>
<div class="tip-content">
<p class="tipMsg">此操作将删除当前所选用户</p>
<span>你是否还要继续?</span>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="delVisible = false">取消</el-button>
<el-button type="primary" @click="handleDelConfirm">继续</el-button>
</div>
</div>
</el-dialog> -->
<!-- 密码重置dialog -->
<el-dialog class="tip-dialog" :visible.sync="resetVisible" :modal-append-to-body="false" :close-on-click-modal="false" title="提示">
<div class="setting-dialog">
<div class="tip-content">
<p class="tipMsg">此操作将重置所选用户密码为"123456"</p>
<span>你是否还要继续?</span>
</div>
<div slot="footer" class="dialog-footer">
<el-button v-loading="btnLoading" type="primary" @click="pwdReset(crud.selections)">确定</el-button>
<el-button type="text" @click="resetVisible = false">取消</el-button>
<el-button v-loading="btnLoading" type="primary" @click="pwdReset(crud.selections)">继续</el-button>
</div>
</div>
</el-dialog>
@ -130,6 +145,7 @@
</div>
</div>
</div>
</div>
</template>
@ -187,6 +203,8 @@ export default {
},
btnLoading: false,
resetVisible: false,
// delVisible: false,
// deleteData: {},
height: document.documentElement.clientHeight - 180 + 'px;',
deptName: '', depts: [], deptDatas: [], jobs: [], level: 3, roles: [],
jobDatas: [], roleDatas: [], // 使
@ -434,10 +452,12 @@ export default {
},
//
changeEnabled(data, val) {
this.$confirm('此操作将 "' + this.dict.label.user_status[val] + '" ' + data.username + ', 是否继续?', '提示', {
confirmButtonText: '确定',
// ' "' + this.dict.label.user_status[val] + '" ' + data.username + ', ',
this.$confirm('此操作将禁用 / 启用用户 “' + data.username + '”' + '<span>你是否还要继续?</span>', '提示', {
confirmButtonText: '继续',
cancelButtonText: '取消',
type: 'warning'
type: 'warning',
dangerouslyUseHTMLString: true
}).then(() => {
crudUser.edit(data).then(res => {
this.crud.notify(this.dict.label.user_status[val] + '成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
@ -469,50 +489,21 @@ export default {
checkboxT(row, rowIndex) {
return row.id !== this.user.id
}
// handleClose() {
// this.delVisible = false
// },
// toDelete(data) {
// this.deleteData = data
// this.delVisible = true
// },
// handleDelConfirm() {
// this.delVisible = false
// this.crud.delAllLoading = true
// this.crud.doDelete(this.deleteData)
// }
}
}
</script>
<style lang="scss" scoped>
@import "~@/assets/styles/mixin.scss";
@import "~@/assets/styles/variables.scss";
.elect-cont-left{
width: 265px;
margin-right: 20px;
@include bg_color;
@include box_padding;
.head-container{
margin-bottom: 20px;
}
.container-left{
@include tree_height_min;
}
}
.elect-cont-right{
// padding: 20px;
@include bg_color;
@include box_padding;
.head-container{
margin-bottom: 20px;
}
.container-right{
@include table_height_min;
}
}
.hideSidebar{
// siderbar- 54 + 60 + treeLeft 265
.elect-cont-right{
width: calc(100vw - 379px);
}
}
.openSidebar{
// siderbar- 256 + 60 + treeLeft 265
.elect-cont-right{
width: calc(100vw - 581px);
}
}
.icon-zhuangtai{
font-size: 14px;
}
</style>
Loading…
Cancel
Save