浏览代码

新权限+新用户管理

yuhan 9 月之前
父节点
当前提交
c017c84e61

+ 184 - 0
src/views/module_interLock/systemUser/SystemUserList.vue

@@ -0,0 +1,184 @@
+<template>
+  <div style="height: 100%;">
+    <div class="iotmenu-content-header">
+      <a-icon type="file-text" />
+      <span>用户管理</span>
+    </div>
+    <a-card :bordered="false">
+      <!-- 查询区域 -->
+      <div class="table-page-search-wrapper">
+        <a-form layout="inline" @keyup.enter.native="searchQuery">
+          <a-row :gutter="24">
+          </a-row>
+        </a-form>
+      </div>
+      <!-- 查询区域-END -->
+
+      <!-- 操作按钮区域 -->
+      <div class="table-operator">
+        <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+        <!-- <a-button type="primary" icon="download" @click="handleExportXls('联锁管理系统用户表')">导出</a-button> -->
+        <!-- <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+          <a-button type="primary" icon="import">导入</a-button>
+        </a-upload> -->
+        <!-- 高级查询区域 -->
+        <!-- <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+        <a-dropdown v-if="selectedRowKeys.length > 0">
+          <a-menu slot="overlay">
+            <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+          </a-menu>
+          <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+        </a-dropdown> -->
+      </div>
+
+      <!-- table区域-begin -->
+      <div>
+        <!-- <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+          <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+          <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+        </div> -->
+
+        <a-table
+          ref="table"
+          size="middle"
+          :scroll="{x:true}"
+          rowKey="id"
+          :columns="columns"
+          :dataSource="dataSource"
+          :pagination="ipagination"
+          :loading="loading"
+          @change="handleTableChange">
+          <!-- class="j-table-force-nowrap" -->
+          <!-- :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" -->
+          
+          <span slot="role" slot-scope="text, record">
+            <a-tag v-if="record.role === '0'" color="blue">是</a-tag>
+            <a-tag v-else>否</a-tag>
+          </span>
+
+          <span slot="action" slot-scope="text, record">
+            <a-tooltip style="margin-right: 10px;">
+              <template slot="title"> 设置 </template>
+              <span class="edit-btn" @click="handleDetail(record)"></span>
+            </a-tooltip>
+            <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record)">
+              <a-tooltip>
+                <template slot="title"> 删除 </template>
+                <span class="delete-btn"></span>
+              </a-tooltip>
+            </a-popconfirm>
+            <!-- <a @click="handleEdit(record)">编辑</a>
+
+            <a-divider type="vertical" />
+            <a-dropdown>
+              <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+              <a-menu slot="overlay">
+                <a-menu-item>
+                  <a @click="handleDetail(record)">详情</a>
+                </a-menu-item>
+                <a-menu-item>
+                  <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                    <a>删除</a>
+                  </a-popconfirm>
+                </a-menu-item>
+              </a-menu>
+            </a-dropdown> -->
+          </span>
+
+        </a-table>
+      </div>
+
+      <system-user-modal ref="modalForm" @ok="modalFormOk"></system-user-modal>
+    </a-card>
+  </div>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import SystemUserModal from './modules/SystemUserModal'
+
+  export default {
+    name: 'InterlockUserList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      SystemUserModal
+    },
+    data () {
+      return {
+        description: '联锁管理系统用户表管理页面',
+        // 表头
+        columns: [
+          {
+            title: '序号',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'登陆账号名',
+            align:"center",
+            dataIndex: 'username'
+          },
+          {
+            title:'描述',
+            align:"center",
+            dataIndex: 'remark'
+          },
+          {
+            title:'系统管理员', // (0系统管理员1其他角色)
+            align:"center",
+            dataIndex: 'role',
+            scopedSlots: { customRender: 'role' }
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            // fixed:"right",
+            // width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/interlockUser/interlockUser/list",
+          delete: "/interlockUser/interlockUser/delete",
+          deleteBatch: "/interlockUser/interlockUser/deleteBatch",
+          exportXlsUrl: "/interlockUser/interlockUser/exportXls",
+          importExcelUrl: "interlockUser/interlockUser/importExcel",
+          
+        },
+        dictOptions:{},
+        superFieldList:[],
+      }
+    },
+    created() {
+    this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'username',text:'登陆账号名',dictCode:''})
+        fieldList.push({type:'string',value:'remark',text:'描述',dictCode:''})
+        fieldList.push({type:'string',value:'role',text:'当前用户角色(0系统管理员1其他角色)',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  /* @import '~@assets/less/common.less'; */
+</style>

+ 307 - 0
src/views/module_interLock/systemUser/modules/SystemUserForm.vue

@@ -0,0 +1,307 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="24">
+            <a-form-model-item label="用户名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="username">
+              <a-input v-model="model.username" placeholder="请输入用户名称"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="描述" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
+              <a-input v-model="model.remark" placeholder="请输入描述"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="是否为系统管理员" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="role">
+              <a-switch v-model="model.isSystem" checked-children="是" un-checked-children="否" @change="roleChange"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="所拥有的权限" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="role">
+              <a-table
+                v-if="tpmTreeData && tpmTreeData.length"
+                ref="table"
+                size="middle"
+                :scroll="{x:true}"
+                bordered
+                rowKey="interlockSystemId"
+                :columns="columns"
+                :dataSource="tpmTreeData"
+                :loading="loading"
+                :pagination="false"
+                defaultExpandAllRows
+                class="interlock-user-limit"
+                >
+                <!-- class="j-table-force-nowrap" -->
+                <!-- @change="handleTableChange" -->
+                <span slot="manage" slot-scope="text, record">
+                  <span v-if="record.interlockType === '0'">-</span>
+                  <a-checkbox v-if="record.interlockType === '1'" v-model="record.manage" :disabled="model.isSystem"/>
+                </span>
+                <span slot="view" slot-scope="text, record">
+                  <span v-if="record.interlockType === '0'">-</span>
+                  <a-checkbox v-if="record.interlockType === '1'" v-model="record.view" :disabled="model.isSystem"/>
+                </span>
+              </a-table>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import { validateDuplicateValue } from '@/utils/util'
+
+  export default {
+    name: 'InterlockUserForm',
+    components: {
+    },
+    props: {
+      //表单禁用
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      }
+    },
+    data () {
+      return {
+        model:{
+        },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+          username: [{
+            required: true, message: '请输入用户名称!',
+          }],
+        },
+        url: {
+          add: "/interlockUser/interlockUser/addUser",
+          edit: "/interlockUser/interlockUser/editUser",
+          queryById: "/interlockUser/interlockUser/queryUserById"
+        },
+        // 权限树-装置系统
+        loading: false,
+        tpmTreeData: [],
+        expandedRowKeys: [],
+        columns: [
+          {
+            title:'',
+            dataIndex: 'interlockName'
+          },
+          {
+            title:'管理',
+            align:"center",
+            dataIndex: 'manage',
+            width:147,
+            scopedSlots: { customRender: 'manage' },
+            customCell: (record, index)=>{ return this.customCell(record, index, 'manage')}
+          },
+          {
+            title:'查看',
+            align:"center",
+            dataIndex: 'view',
+            width:147,
+            scopedSlots: { customRender: 'view' },
+            customCell: (record, index)=>{ return this.customCell(record, index, 'view')}
+          },
+        ],
+      }
+    },
+    computed: {
+      formDisabled(){
+        return this.disabled
+      },
+    },
+    created () {
+       //备份model原始值
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      async add () {
+        this.confirmLoading = true
+        // var interlockOrgData = []
+        await getAction(`/base/interlockBase/list`).then(res=>{
+          // interlockOrgData = res
+          // if(res.success){
+          // }
+          var arr = res.map(item => {
+            var reValue = {}
+            reValue.interlockName = item.interlockName
+            reValue.interlockApparatusId = item.pid
+            reValue.interlockSystemId = item.id
+            reValue.interlockType = item.interlockType
+            reValue.limitType = ''
+            reValue.manage = false
+            reValue.view = false
+            return reValue
+          })
+          this.tpmTreeData = this.handleTree(arr, "interlockSystemId", "interlockApparatusId")
+          this.confirmLoading = false
+        })
+      },
+      async edit (record) {
+        this.confirmLoading = true
+        var interlockOrgData = []
+        await getAction(`/base/interlockBase/list`).then(res=>{
+          interlockOrgData = res
+          // if(res.success){
+          // }
+        })
+        getAction(this.url.queryById, {id: record.id}).then(response => {
+          this.model = Object.assign({}, response.result);
+          this.model.isSystem = this.model.role === '0' ? true : false
+          console.log('model', this.model)
+          var systemLimitList = response.result.systemLimitList
+          // data.forEach(element => {
+          //   var index = interlockOrgData.findIndex(item => element.interlockSystemId === item.id)
+          //   if(index !== -1){
+          //     // interlockOrgData[index].limitType = element.limitType
+          //     interlockOrgData[index].manage = element.limitType==='0'?true:false
+          //     interlockOrgData[index].view = element.limitType==='1'?true:false
+          //   }
+          // })
+          var arr = interlockOrgData.map(ele => {
+            var value = systemLimitList.find(item => item.interlockSystemId === ele.id)
+            var reValue = {}
+            reValue.interlockName = ele.interlockName
+            reValue.interlockApparatusId = ele.pid
+            reValue.interlockSystemId = ele.id
+            reValue.interlockType = ele.interlockType
+            reValue.limitType = ''
+            reValue.manage = false
+            reValue.view = false
+            console.log(value)
+            if(this.model.role === '0'){
+              reValue.manage = true
+            }
+            if(this.model.role !== '0' && value){
+              reValue.id = value.id
+              reValue.limitType = value.limitType
+              reValue.manage = value.limitType === '0' ? true : false
+              reValue.view = value.limitType === '1' ? true : false
+            }
+            return reValue
+          })
+          // console.log(arr)
+          this.tpmTreeData = this.handleTree(arr, "interlockSystemId", "interlockApparatusId")
+          // console.log(this.tpmTreeData)
+          this.visible = true;
+          this.confirmLoading = false
+        })
+      },
+      // 角色切换时
+      roleChange(e){
+        // this.$set(this.model, 'isSystem', e)
+        this.model = {...this.model}
+        if(e){
+          // 当前为管理员
+          for (let i = 0; i < this.tpmTreeData.length; i++) {
+            const element = this.tpmTreeData[i];
+            if(element.children && element.children.length > 0){
+              element.children.forEach(item => {
+                item.manage = true
+                item.view = false
+              })
+            }
+          }
+        } else {
+          // 当前为管理员
+          for (let i = 0; i < this.tpmTreeData.length; i++) {
+            const element = this.tpmTreeData[i];
+            if(element.children && element.children.length > 0){
+              element.children.forEach(item => {
+                item.manage = false
+                item.view = false
+              })
+            }
+          }
+        }
+      },
+      customCell(record, rowIndex, value){
+        return {
+          props: {
+          },
+          on: { // 事件
+            click: (event) => {
+              // console.log(record, rowIndex, value)
+              if(value === 'manage' && event.target.type === 'checkbox' && !record.manage){
+                record.view = false
+              }
+              if(value === 'view' && event.target.type === 'checkbox' && !record.view){
+                record.manage = false
+              }
+            },
+          },
+        };
+      },
+      submitForm () {
+        const that = this;
+        // 触发表单验证
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            // console.log(this.tpmTreeData)
+            // 二维转一维
+            var arr = []
+            this.tpmTreeData.forEach(item => {
+              if(item.children){
+                arr.push(...item.children)
+              }
+            })
+            // console.log(arr)
+            this.model.systemLimitList = arr.map(item => {
+              if(item.manage){item.limitType = '0'}
+              if(item.view){item.limitType = '1'}
+              return item
+            })
+            this.model.role = this.model.isSystem ? '0' : '1'
+            // console.log(su)
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+         
+        })
+      },
+    }
+  }
+</script>
+<style lang="less">
+  .interlock-user-limit{
+    tr{
+      td{
+        padding: 5px 8px !important;
+      }
+    }
+  }
+</style>

+ 84 - 0
src/views/module_interLock/systemUser/modules/SystemUserModal.Style#Drawer.vue

@@ -0,0 +1,84 @@
+<template>
+  <a-drawer
+    :title="title"
+    :width="width"
+    placement="right"
+    :closable="false"
+    @close="close"
+    destroyOnClose
+    :visible="visible">
+    <system-user-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></system-user-form>
+    <div class="drawer-footer">
+      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
+      <a-button v-if="!disableSubmit"  @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
+    </div>
+  </a-drawer>
+</template>
+
+<script>
+
+  import SystemUserForm from './SystemUserForm'
+
+  export default {
+    name: 'InterlockUserModal',
+    components: {
+      SystemUserForm
+    },
+    data () {
+      return {
+        title:"操作",
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        });
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+  .drawer-footer{
+    position: absolute;
+    bottom: -8px;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 60 - 0
src/views/module_interLock/systemUser/modules/SystemUserModal.vue

@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <system-user-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></system-user-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import SystemUserForm from './SystemUserForm'
+  export default {
+    name: 'InterlockUserModal',
+    components: {
+      SystemUserForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>