田源
2024-07-03 a1f78d5809d624cd7e4cd3352d9ece858cad2090
成员管管增删改接口调试
已修改4个文件
已添加1个文件
373 ■■■■■ 文件已修改
Source/plt-web/plt-web-ui/README-AVUE.md 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/App.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/api/system/user/api.js 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/system/user/index.vue 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/system/user/option.js 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/README-AVUE.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
## AVUE-CRUD è¡¨æ ¼é…ç½®
```javascript
<avue-crud     :option="option"                 //表格配置属性
               :table-loading="loading"         //表格等待框的控制,加载的时候转圈圈,设置true/false
               :search.sync="search"            //搜索的变量(需要sync修饰符)
               :visible.sync="changeInfo"       //是否显示,设置true/false
               :data="data"                     //表格显示的数据
               :page.sync="page"                //表格分页配置选项(需要sync修饰符)
               :permission="permissionList"     //权限控制
               :before-open="beforeOpen"        //打开前的回调function(file,column)
               v-model="form"                   //数据模型 ç”¨æ¥å­˜å–页面值的
               ref="crud"                       //在普通的 DOM å…ƒç´ ä¸Šä½¿ç”¨ï¼Œå¼•用指向的就是 DOM å…ƒç´ ï¼›
               @cell-click="pageto"             //表格点击运行方法 onclick方法定义
               @row-update="rowUpdate"          //修改数据后点击确定触发该事件
               @row-save="rowSave"              //新增数据后点击确定触发该事件
               @row-del="rowDel"                //行数据删除时触发该事件
               @row-click="handleRowClick"      //单击行运行的方法
               @search-change="searchChange"    //搜索栏变化事件
               @search-reset="searchReset"      //清空搜索栏变化事件
               @selection-change="selectionChange"//选择框变化变化事件
               @current-change="currentChange"  //点击页码会调用current-change方法回调当前页数,返回当前第几页
               @size-change="sizeChange"       //点击每页多少条会调size-change方法回调
               @refresh-change="refreshChange" //点击刷新按钮触发该事件
               @on-load="onLoad">              //打开表格页面的方法,一般用来初始化,返回页面数据
          </avue-crud>
option: {
          height:'auto',                 //表格高度
          emptyText: "暂无数据哦~",       //数据为空的提示
          calcHeight: 30,                //表格高度差(主要用于减去其他部分让表格高度自适应)
          tip: false,                    //提示信息
          searchShow: true,              //首次加载是否显示搜索
          searchMenuSpan: 4,             //搜索按钮长度
          searchSpan:6,                  //搜索框长度  æœ€å¤§é•¿åº¦24
          border: true,                  //表格边框是否显示
          index: true,                   //是否显示序号
          viewBtn: true,                 //是否显示查看按钮
          selection: true,               //搜索框显示
          addBtn:false,                  //是否显示添加按钮
          editBtn:false,                 //是否显示编辑按钮
          delBtn:false,                  //是否显示删除按钮
          excelBtn:false,                //表格导出按钮是否显示
          labelWidth:120,                //表单前面的标题长度
          refreshBtn: false,             //表格上面小的 åˆ·æ–°æŒ‰é’®
          columnBtn: false,              //表格上面小的 åˆ—表按钮
          searchBtn: false,              //表格上面小的 æœç´¢æŒ‰é’®
          menu: true,                    //是否显示操作栏
          defaultExpandAll:true,         //树默认展开
          column:[
             {
              label: "",                 //表单属性名称
              prop: "",                  //属性对应实体类字段
              type: "",                  //输入框类型
              addDisplay: false,         //新增时是否显示
              editDisplay: false,        //编辑时是否显示
              viewDisplay: true,         //详情时是否显示
              hide: true,                //表单查询时是否显示
              display: true,             //在查看,新增,编辑页面是否显示
              labelWidth:'100',             //标题名称宽度
              span: 24,                  //24一条数据占一行,8一行3条数据
              gutter:20,                 //项间距
              addDisabled: true,         //添加的时候不能修改
              editDisabled: true,        //编辑的时候不能修改
              sortable:true,             //排序方式切换,倒序、正序切换
              maxlength: 30,             //字数限制
              showWordLimit:true,        //显示字数限制
              defaultExpandAll:true,     //树默认展开
              search:true,              //查询是否显示
              searchFilterable:true,     //select选择框匹配
              showColumn:false,          //列显隐中是否有
              addDisplay: false,         // æ·»åŠ å¼¹çª—ä¸æ˜¾ç¤º
              editDisplay: false,        // ç¼–辑弹窗不显示
              viewDisplay: false         // æŸ¥çœ‹å¼¹çª—不显示
              disabled:true,             //表单item禁用
              row:'false/true',          //是否单独成行
              rules:Obj,                 //验证规则
              dicData:[],                //字典
              dicUrl:'',                 //远程字典地址
              dicMethod:'get/post'         //字典请求方式
              dicQuery:obj,              //字典请求方式
              props:{
                lable:'字典的名称属性值',
                value:'字典的值属性值',
                children:'字典的子属性值'
              },
            }
```
Source/plt-web/plt-web-ui/src/App.vue
@@ -32,7 +32,7 @@
  margin: 50px auto;
}
.avue-dialog .el-dialog{
  top:50%;
  top:43%;
  max-height: calc(100% - 100px);
  -webkit-transform: translate(-50%, 0);
  transform: translate(-50%, -50%);
Source/plt-web/plt-web-ui/src/api/system/user/api.js
@@ -54,19 +54,19 @@
}
// æ–°å¢žæˆå‘˜
export function addUser(data) {
export function addUser(row) {
  return request({
    url: "/api/roleQueryController/addUser",
    url: "/api/userQueryController/addUser",
    method: "post",
    data:data
    data:row
  });
}
// ä¿®æ”¹æˆå‘˜
export function updateUser(data) {
  return request({
    url: "/api/roleQueryController/updateUser",
    method: "post",
    url: "/api/userQueryController/updateUser",
    method: "put",
    data:data
  });
}
@@ -74,8 +74,30 @@
// åˆ é™¤æˆå‘˜
export function deleteUser(params) {
  return request({
    url: "/api/roleQueryController/deleteUser",
    url: "/api/userQueryController/deleteUser",
    method: "delete",
    params
  });
}
//获取密码策略
export function selectPwdStrategyMap(params) {
  return request({
    url: "/api/passwordStrategyQueryController/selectPwdStrategyMap",
    method: "get",
    params
  });
}
//保存密码策略
export function saveUserPasswordStrateg(params) {
  let formData = new FormData()
  for (let key in params){
    formData.append(key,params[key])
  }
  return request({
    url: "/api/passwordStrategyQueryController/saveUserPasswordStrateg",
    method: "post",
    data:formData
  });
}
Source/plt-web/plt-web-ui/src/views/system/user/index.vue
@@ -14,6 +14,9 @@
      @current-change="currentChange"
      @selection-change="selectChange"
      @row-click="rowClickHandler"
      @row-save="rowSaveHandler"
      @row-update="rowUpdateHandler"
      @row-del="rowDelHandler"
    >
      <template slot="status" slot-scope="{row}">
        <el-tag v-if="row.status === 0" type="success">启用</el-tag>
@@ -33,22 +36,62 @@
      </template>
      <template slot="menuLeft" slot-scope="scope">
        <el-button icon="el-icon-delete" plain size="small" type="danger">删除</el-button>
        <el-button icon="el-icon-delete" plain size="small" type="danger" @click="allDelHandler">删除</el-button>
        <el-button icon="el-icon-user" plain size="small" type="primary" @click="roleHandler">分配角色</el-button>
        <el-button icon="el-icon-school" plain size="small" type="primary">分配部门</el-button>
        <el-button icon="el-icon-key" plain size="small" type="success">设置密码策略</el-button>
        <el-button icon="el-icon-key" plain size="small" type="success" @click="setPwsHandler">设置密码策略</el-button>
        <el-button icon="el-icon-upload2" plain size="small" type="primary">导入人员</el-button>
        <el-button icon="el-icon-download" plain size="small" type="primary">下载导入模板</el-button>
      </template>
    </avue-crud>
    <transfer ref="transfer" :left-role-data="leftRoleData" :right-role-data="rightRoleData" :transferTitle="transferTitle" title="分配角色"
              @transferSend="roleSendHandler"></transfer>
    <!-- åˆ†é…è§’色穿梭框   -->
    <transfer ref="transfer" :left-role-data="leftRoleData" :right-role-data="rightRoleData"
              :transferTitle="transferTitle" title="分配角色"
              @transferSend="roleSendHandler">
    </transfer>
    <!-- è®¾ç½®å¯†ç ç­–略对话框   -->
    <el-dialog
      v-dialogDrag
      v-loading="pwdLoading"
      :destroy-on-close="true"
      :visible.sync="pwdVisible"
      append-to-body="true"
      class="avue-dialog"
      style="margin-top: -20vh !important;"
      title="设置密码策略"
      width="30%"
    >
      <div class="password-strategy-container">
        <div><i class="el-icon-setting"/>设置密码策略:</div>
        <el-select v-model="pwdValue" placeholder="请选择密码策略">
          <el-option v-for="(item,index) in pwdList" :key="index" :label="item.name" :value="item.id"></el-option>
        </el-select>
      </div>
      <div slot="footer" class="dialog-footer">
        <el-button size="small" @click="pwdVisible = false">取 æ¶ˆ</el-button>
        <el-button size="small" type="primary" @click="savePwdHandler">ç¡® å®š</el-button>
      </div>
    </el-dialog>
  </basic-container>
</template>
<script>
import basicOption from '@/util/basic-option'
import {getDataUsers, stopUser, gridRoles, listRoleByUserOid, saveRights, addUser, updateUser, deleteUser} from '@/api/system/user/api'
import {
  getDataUsers,
  stopUser,
  gridRoles,
  listRoleByUserOid,
  saveRights,
  addUser,
  updateUser,
  deleteUser,
  selectPwdStrategyMap,
  saveUserPasswordStrateg
} from '@/api/system/user/api'
import {column} from "./option"
import func from '@/util/func'
@@ -56,10 +99,15 @@
  name: "userManage",
  data() {
    return {
      pwdVisible: false,
      pwdLoading: false,
      pwdValue: '',
      pwdList: [],
      tableLoading: false,
      tableData: [],
      option: {
        ...basicOption,
        dialogWidth: '50%',
        calcHeight: -60,
        column: column
      },
@@ -73,7 +121,7 @@
      selectList: [],
      leftRoleData: [],  // åˆ†é…è§’色穿梭框左侧初始数据
      rightRoleData: [], // åˆ†é…è§’色穿梭框右侧初始数据
      transferTitle:['现有角色', '拥有角色']
      transferTitle: ['现有角色', '拥有角色']
    }
  },
  created() {
@@ -183,7 +231,7 @@
    // ç©¿æ¢­æ¡†ç»„件回填
    roleSendHandler(row) {
      let params = {
        userOid: this.selectList[0].oid,
        userOids: this.selectList[0].oid,
        roleIds: row.join(',')
      }
      saveRights(params).then(res => {
@@ -192,12 +240,130 @@
      }).catch(err => {
        this.$message.error(err)
      })
    },
    // è®¾ç½®å¯†ç ç­–ç•¥
    setPwsHandler() {
      if (this.selectList.length <= 0) {
        this.$message.warning('清先选择人员再进行操作!')
        return;
      }
      this.pwdLoading = false;
      selectPwdStrategyMap().then(res => {
        if (res.data.code === 200) {
          this.pwdList = res.data.data;
          this.pwdValue = res.data.data[0].id;
          console.log(res.data)
          this.pwdVisible = true;
          this.pwdLoading = false;
        } else {
          this.$message.error(res.data.msg);
        }
      })
    },
    // ä¿å­˜å¯†ç ç­–ç•¥
    savePwdHandler() {
      let params = {
        userIds: this.selectList.map(item => item.oid).join(','),
        passwordStrategId: this.pwdValue
      }
      saveUserPasswordStrateg(params).then(res => {
        this.pwdVisible = false;
        this.$message.success(res.data.obj)
      }).catch(err => {
        this.$message.error(err)
      })
    },
    // æ–°å¢ž
    rowSaveHandler(row, done) {
      if (row.password != row.confirmPassword) {
        this.$message.error('请检查两次密码是否输入一致!')
        return this.$refs.userCrud.$refs.dialogForm.$refs.tableForm.allDisabled = false;
      }
      addUser(row).then(res => {
        if (res.data.code === 200) {
          this.$message.success(res.data.obj);
          this.getTableList();
        }
      }).catch(err => {
        console.log(err);
      })
      done()
    },
    // ç¼–辑
    rowUpdateHandler(row, index, done) {
      if (row.password != row.confirmPassword) {
        this.$message.error('请检查两次密码是否输入一致!')
        return this.$refs.userCrud.$refs.dialogForm.$refs.tableForm.allDisabled = false;
      }
      updateUser(row).then(res => {
        if (res.data.code === 200) {
          this.$message.success(res.data.obj);
          this.getTableList();
        }
      }).catch(err => {
        console.log(err);
      });
      done()
    },
    // åˆ é™¤
    rowDelHandler(row) {
      let params = {
        ids: row.oid
      }
      deleteUser(params).then(res => {
        if (res.data.code === 200) {
          this.$message.success(res.data.obj);
          this.getTableList();
        }
      }).catch(err => {
        console.log(err);
      })
    },
    // å¤šé€‰åˆ é™¤
    allDelHandler() {
      let params = {
        ids: this.selectList.map(item => item.oid).join(',')
      }
      if (this.selectList.length <= 0) {
        this.$message.warning('请至少选择一条数据进行删除!')
        return;
      }
      this.$confirm('您确定要删除所选择的成员吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        deleteUser(params).then(res => {
          if (res.data.code === 200) {
            this.$message.success(res.data.obj);
            this.getTableList();
          }
        });
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    }
  }
}
</script>
<style scoped>
<style lang="scss" scoped>
.password-strategy-container {
  padding-left: 20px;
  display: flex;
  //justify-content: center;
  align-items: center;
  gap: 10px;
}
</style>
Source/plt-web/plt-web-ui/src/views/system/user/option.js
@@ -1,16 +1,62 @@
export const column = [
export let column = [
  {
    label: '账号',
    prop: 'id',
    align:'center',
    search:true,
    sortable:true,
    rules: [
      {
        required: true,
        message: '请输入姓名',
        trigger: 'blur'
      }
    ]
  },
  {
    label: '姓名',
    prop: 'name',
    align:'center',
    search:true,
    sortable:true
  }, {
    label: '账号',
    prop: 'id',
    align:'center',
    search:true,
    sortable:true
    sortable:true,
    rules: [
      {
        required: true,
        message: '请输入姓名',
        trigger: 'blur'
      }
    ]
  },
  {
    label: '密码',
    prop: 'password',
    hide:true,
    type:'password',
    change: (val)=>{
      const confirmPasswordColumn = column.find(item => item.prop === 'confirmPassword');
      confirmPasswordColumn.disabled = val.value === "";
    },
    rules: [
      {
        required: true,
        message: '请输入密码',
        trigger: 'blur'
      }
    ]
  },
  {
    label: '确认密码',
    prop: 'confirmPassword',
    hide:true,
    type:'password',
    disabled:true,
    rules: [
      {
        required: true,
        message: '请再次确认密码',
        trigger: 'blur'
      }
    ]
  },
  {
    label: '状态',
@@ -40,6 +86,7 @@
    search:true,
    sortable:true,
    searchslot:true,
    row:true,
  },
  {
    label: '专业',
@@ -88,5 +135,5 @@
    align:'center',
    sortable:true,
    display:false,
  }
  },
];