From de967d5d54a6eee38221ea14b2472401974608db Mon Sep 17 00:00:00 2001
From: 田源 <lastanimals@163.com>
Date: 星期三, 10 七月 2024 18:25:04 +0800
Subject: [PATCH] 晚上上传组件导入提示、调整默认对话框边距、密码策略查询以及新增修改 密码长度、必填种类、锁定时间等正则校验 完善启动流程默认传参

---
 Source/plt-web/plt-web-ui/src/views/system/user/index.vue |  450 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 433 insertions(+), 17 deletions(-)

diff --git a/Source/plt-web/plt-web-ui/src/views/system/user/index.vue b/Source/plt-web/plt-web-ui/src/views/system/user/index.vue
index 45970cc..cd91554 100644
--- a/Source/plt-web/plt-web-ui/src/views/system/user/index.vue
+++ b/Source/plt-web/plt-web-ui/src/views/system/user/index.vue
@@ -2,6 +2,7 @@
   <basic-container>
     <avue-crud
       ref="userCrud"
+      :before-open="beforeOpen"
       :data="tableData"
       :option="option"
       :page.sync="page"
@@ -14,7 +15,29 @@
       @current-change="currentChange"
       @selection-change="selectChange"
       @row-click="rowClickHandler"
+      @row-save="rowSaveHandler"
+      @row-update="rowUpdateHandler"
     >
+      <!-- 閮ㄩ棬澶撮儴鎼滅储鎻掓Ы  -->
+      <template slot-scope="{disabled,size}" slot="pkDepartmentNameSearch">
+        <div style="display: flex;gap: 5px">
+          <el-select v-model="departSearchValue" clearable placeholder="璇烽�夋嫨閮ㄩ棬">
+            <el-option :label="departSearchObj.name" :value="departSearchObj.oid"></el-option>
+          </el-select>
+          <el-button size="small" type="success" @click="dialogDepartSearchHandler">閫夋嫨閮ㄩ棬</el-button>
+        </div>
+      </template>
+
+      <!-- 瀵硅瘽妗嗛儴闂ㄦ彃妲�     -->
+      <template slot="pkDepartmentNameForm" slot-scope="scope">
+        <div style="display: flex;gap: 5px">
+          <el-select v-model="departValue" clearable placeholder="璇烽�夋嫨閮ㄩ棬">
+            <el-option :label="departObj.name" :value="departObj.oid"></el-option>
+          </el-select>
+          <el-button size="small" type="success" @click="dialogDepartHandler">閫夋嫨閮ㄩ棬</el-button>
+        </div>
+      </template>
+
       <template slot="status" slot-scope="{row}">
         <el-tag v-if="row.status === 0" type="success">鍚敤</el-tag>
         <el-tag v-if="row.status === 1" type="danger">鍋滅敤</el-tag>
@@ -26,40 +49,157 @@
       </template>
 
       <template #menu="{row,index,size}">
-        <el-button size="small" type="text" @click="stopUserHandler(row)">
+        <el-button icon="el-icon-edit" size="small" type="text" @click.stop="rowEditHandler(row,index)">缂栬緫</el-button>
+        <el-button icon="el-icon-delete" size="small" type="text" @click.stop="rowDeleteHandler(row)">鍒犻櫎</el-button>
+        <el-button size="small" type="text" @click.stop="stopUserHandler(row)">
           <span v-if="row.status === 0" style="color: #fa3434"><i class="el-icon-video-pause"></i> 鍋滅敤</span>
-          <span v-if="row.status === 1" style="color: #55b61d"><i class="el-icon-video-pause"></i> 鍚敤</span>
+          <span v-if="row.status === 1" style="color: #55b61d"><i class="el-icon-video-play"></i> 鍚敤</span>
         </el-button>
       </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-upload2" plain size="small" type="primary">瀵煎叆浜哄憳</el-button>
-        <el-button icon="el-icon-download" plain size="small" type="primary">涓嬭浇瀵煎叆妯℃澘</el-button>
+        <el-button icon="el-icon-school" plain size="small" type="primary" @click="departmentHandler">鍒嗛厤閮ㄩ棬</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" @click="uploadUser">瀵煎叆浜哄憳</el-button>
+        <el-button icon="el-icon-download" plain size="small" type="primary" @click="downloadHandler">涓嬭浇瀵煎叆妯℃澘</el-button>
       </template>
     </avue-crud>
-    <transfer ref="transfer" :left-role-data="leftRoleData" :right-role-data="rightRoleData" 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: -15vh !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>
+
+    <!-- 瀵煎叆浜哄憳   -->
+    <upload-file ref="upload" :tipList="tipList" :fileType="upFileType" :fileUrl="fileUrl" title="瀵煎叆浜哄憳" @updata="getTableList"></upload-file>
+
+    <!-- 鍒嗛厤閮ㄩ棬瀵硅瘽妗�    -->
+    <el-dialog
+      v-dialogDrag
+      v-loading="departLoading"
+      :destroy-on-close="true"
+      :visible.sync="departVisible"
+      append-to-body="true"
+      class="avue-dialog"
+      title="鍒嗛厤閮ㄩ棬"
+      width="50%"
+    >
+      <avue-crud
+        ref="departCrud"
+        :data="departData"
+        :option="departOption"
+        @current-row-change="handleCurrentRowChange"
+      >
+      </avue-crud>
+      <div slot="footer" class="dialog-footer">
+        <el-button size="small" @click="departVisible = false">鍙� 娑�</el-button>
+        <el-button size="small" type="primary" @click="saveDepartHandler">纭� 瀹�</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,
+  download,
+  departmentQueryController,
+  saveUsersDepts
+} from '@/api/system/user/api'
 import {column} from "./option"
 import func from '@/util/func'
 
 export default {
   name: "userManage",
-  data() {
+  data: function () {
     return {
+      departSearchObj:{},
+      departSearchValue:'',
+      loadKey: 0,
+      departStatus: '', // 鍖哄垎涓嶅悓鏂瑰紡鎵撳紑閮ㄩ棬瀵硅瘽妗�
+      departValue: '', // 閮ㄩ棬瀵硅瘽妗嗕笅鎷夋缁戝畾鍊�
+      departObj: {},  // 閮ㄩ棬瀵硅瘽妗嗕笅鎷夋閫夐」缁戝畾鍊�
+      departCurrenRow: {},
+      departOption: {
+        ...basicOption,
+        rowKey: 'oid',
+        rowParentKey: 'parentId',
+        selection: false,
+        highlightCurrentRow: true,
+        stripe: false,
+        menu: false,
+        refreshBtn: false,
+        gridBtn: false,
+        column: [
+          {
+            label: '鍚嶇О',
+            prop: 'name',
+          },
+          {
+            label: '缂栧彿',
+            prop: 'id',
+          },
+          {
+            label: '鎻忚堪',
+            prop: 'description',
+          },
+        ]
+      },
+      departData: [],
+      departLoading: false,
+      departVisible: false,
+      upFileType: ['xls', 'xlsx'],
+      fileUrl: 'api/userQueryController/importUser',
+      pwdVisible: false,
+      pwdLoading: false,
+      pwdValue: '',
+      pwdList: [],
       tableLoading: false,
       tableData: [],
       option: {
         ...basicOption,
+        editBtn: false,
+        delBtn: false,
+        dialogWidth: '50%',
         calcHeight: -60,
         column: column
       },
@@ -71,13 +211,23 @@
       },
       searchParams: {},
       selectList: [],
-      leftRoleData: [],  // 鍒嗛厤瑙掕壊绌挎妗嗗乏渚ч粯璁ゆ暟鎹�
-      rightRoleData: [], // 鍒嗛厤瑙掕壊绌挎妗嗗彸渚ч粯璁ゆ暟鎹�
+      leftRoleData: [],  // 鍒嗛厤瑙掕壊绌挎妗嗗乏渚у垵濮嬫暟鎹�
+      rightRoleData: [], // 鍒嗛厤瑙掕壊绌挎妗嗗彸渚у垵濮嬫暟鎹�
+      transferTitle: ['鐜版湁瑙掕壊', '鎷ユ湁瑙掕壊'],
+      tipList:["瀵煎叆妯℃澘涓爣鏄庣孩鑹插瓧浣撶殑涓哄繀杈撻」","閮ㄩ棬鍒椾笂涓嬬骇鍏崇郴蹇呴』鎸夌収鍙嶆枩鏉犻殧寮�(/)"]
     }
   },
   created() {
   },
   methods: {
+    // 鏂板鎴栦慨鏀瑰璇濇鎵撳紑鍓�
+    beforeOpen(done, type) {
+      if(type == 'add'){
+        this.departObj = {};
+        this.departValue = "";
+      }
+      done();
+    },
     // 琛ㄦ牸璇锋眰
     getTableList() {
       this.tableLoading = true;
@@ -98,6 +248,11 @@
 
     // 鎼滅储鏌ヨ
     handleSearch(params, done) {
+      this.searchParams = {};
+      if(this.departSearchObj && this.departSearchValue){
+        this.searchParams['conditionMap["pkDepartment"]'] = this.departSearchValue;
+      }
+
       if (!func.isEmptyObject(params)) {
         for (let key in params) {
           if (params.hasOwnProperty(key)) {
@@ -106,15 +261,20 @@
             this.searchParams[`conditionMap["${newKey}"]`] = params[key];
           }
         }
-      } else {
+      }
+
+      if (func.isEmptyObject(params) && !this.departSearchValue) {
         this.searchParams = {};
       }
+
       this.getTableList();
       done();
     },
 
     // 閲嶇疆鎼滅储鏉′欢
     handleReset() {
+      this.departSearchObj = {};
+      this.departSearchValue = "";
       this.searchParams = {};
       this.getTableList();
     },
@@ -182,7 +342,7 @@
     // 绌挎妗嗙粍浠跺洖濉�
     roleSendHandler(row) {
       let params = {
-        userOid: this.selectList[0].oid,
+        userOids: this.selectList[0].oid,
         roleIds: row.join(',')
       }
       saveRights(params).then(res => {
@@ -191,12 +351,268 @@
       }).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,loading) {
+      if (row.password != row.confirmPassword) {
+        this.$message.error('璇锋鏌ヤ袱娆″瘑鐮佹槸鍚﹁緭鍏ヤ竴鑷达紒')
+        return this.$refs.userCrud.$refs.dialogForm.$refs.tableForm.allDisabled = false;
+      }
+      row.pkDepartment = this.departValue; // 灏嗗綋鍓嶈鐨勯儴闂ㄥ弬鏁皃kDepartment 璧嬪�间负涓嬫媺妗嗙粦瀹氱殑鍊�
+      addUser(row).then(res => {
+        if (res.data.code === 200) {
+          this.$message.success(res.data.obj);
+          this.getTableList();
+          done();
+        }
+      }).catch(err => {
+        loading()
+        console.log(err);
+      })
+    },
+
+    // 鎿嶄綔鏍忕紪杈�
+    rowEditHandler(row, index) {
+      let obj = { name: row.pkDepartmentName, oid: row.pkDepartment, rowOid: row.oid };
+      this.departValue = row.pkDepartment;
+      this.departObj = obj;
+
+      if (this.departObj.rowOid) {
+        this.$refs.userCrud.rowEdit(row, index);
+      }
+
+    },
+
+    // 缂栬緫
+    rowUpdateHandler(row, index, done,loading) {
+      if (row.password != row.confirmPassword) {
+        this.$message.error('璇锋鏌ヤ袱娆″瘑鐮佹槸鍚﹁緭鍏ヤ竴鑷达紒')
+        return this.$refs.userCrud.$refs.dialogForm.$refs.tableForm.allDisabled = false;
+      }
+      row.pkDepartment = this.departValue; // 灏嗗綋鍓嶈鐨勯儴闂ㄥ弬鏁皃kDepartment 璧嬪�间负涓嬫媺妗嗙粦瀹氱殑鍊�
+      updateUser(row).then(res => {
+        if (res.data.code === 200) {
+          this.$message.success(res.data.obj);
+          this.getTableList();
+          done()
+        }
+      }).catch(err => {
+        loading()
+        console.log(err);
+      });
+    },
+
+    // 鍒犻櫎
+    rowDeleteHandler(row) {
+      let params = {
+        ids: row.oid
+      }
+
+      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: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+
+    // 澶氶�夊垹闄�
+    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: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+
+    // 涓嬭浇瀵煎叆妯℃澘
+    downloadHandler() {
+      download().then(res => {
+        console.log(res);
+        func.downloadFileByBlobHandler(res);
+        this.$message.success('涓嬭浇鎴愬姛')
+      }).catch(err => {
+        this.$message.error(err);
+      })
+    },
+
+    // 瀵煎叆浜哄憳
+    uploadUser() {
+      this.$refs.upload.visible = true;
+    },
+
+    // 鍒嗛厤閮ㄩ棬
+    departmentHandler() {
+      if (this.selectList.length <= 0) {
+        this.$message.warning('娓呭厛閫夋嫨浜哄憳鍐嶈繘琛屾搷浣滐紒')
+        return;
+      }
+      this.departStatus = 'default'; // 鍖哄垎涓嶅悓鏂瑰紡鎵撳紑閮ㄩ棬瀵硅瘽妗�
+      this.departmentQueryOnLoad();
+    },
+
+    // 鍒嗛厤閮ㄩ棬琛ㄦ牸鍒濆鍖栬姹�
+    departmentQueryOnLoad() {
+      departmentQueryController({queryAllLevel: true}).then(res => {
+        const data = res.data.treeData;
+        this.departData = this.departDtaFormAtter(data);
+        this.departVisible = true;
+      }).catch(err => {
+        this.$message.error(err);
+      })
+    },
+
+    // 鍒嗛厤閮ㄩ棬鏁版嵁杞崲
+    departDtaFormAtter(items) {
+      return items.map(item => {
+        // 杞崲褰撳墠鑺傜偣鐨勫睘鎬�
+        const formList = {
+          oid: item.oid,
+          id: item.attributes.id,
+          name: item.attributes.name,
+          description: item.attributes.description,
+          parentId: item.parentId,
+          parentName: item.parentName,
+          parentBtmName: item.parentBtmName,
+          // 濡傛灉children瀛樺湪涓斾笉涓虹┖锛屽垯閫掑綊杞崲children
+          children: item.children && item.children.length > 0 ? this.departDtaFormAtter(item.children) : undefined
+        };
+        return formList;
+      });
+    },
+
+    // 鍒嗛厤閮ㄩ棬 琛屽崟閫�
+    handleCurrentRowChange(row) {
+      this.departCurrenRow = row;
+    },
+
+    // 鍒嗛厤閮ㄩ棬 淇濆瓨
+    saveDepartHandler() {
+      if (func.isEmptyObject(this.departCurrenRow)) {
+        this.$message.warning('璇烽�夋嫨閮ㄩ棬鑺傜偣锛�')
+        return;
+      }
+
+      if (this.departStatus == 'default') {
+        let params = {
+          userOIds: this.selectList.map(item => item.oid).join(','),
+          deptId: this.departCurrenRow.oid,
+        };
+        saveUsersDepts(params).then(res => {
+          if (res.data.code === 200) {
+            this.departVisible = false;
+            this.getTableList();
+            this.$message.success('鍒嗛厤鎴愬姛锛�')
+          }
+        }).catch(err => {
+          console.log(err);
+        })
+        return;
+      }
+
+      if (this.departStatus == 'handle') {
+        this.departObj = this.departCurrenRow;
+        this.departValue = this.departCurrenRow.oid;
+        this.departVisible = false;
+        return;;
+      }
+
+      if(this.departStatus == 'search'){
+        this.departSearchObj =  this.departCurrenRow;
+        this.departSearchValue =  this.departCurrenRow.oid;
+        this.departVisible = false;
+        return;
+      }
+    },
+
+    // 瀵硅瘽妗嗗垎閰嶉儴闂ㄦ寜閽�
+    dialogDepartHandler() {
+      this.departmentQueryOnLoad();
+      this.departStatus = 'handle'; // 鍖哄垎涓嶅悓鏂瑰紡鎵撳紑閮ㄩ棬瀵硅瘽妗�
+    },
+
+    // 鎼滅储瀵硅瘽妗嗗垎閰嶉儴闂ㄦ寜閽�
+    dialogDepartSearchHandler(){
+      this.departmentQueryOnLoad();
+      this.departStatus = 'search'; // 鍖哄垎涓嶅悓鏂瑰紡鎵撳紑閮ㄩ棬瀵硅瘽妗�
+    },
   }
 
 }
 </script>
 
-<style scoped>
+<style lang="scss" scoped>
+.password-strategy-container {
+  padding-left: 20px;
+  display: flex;
+  //justify-content: center;
+  align-items: center;
+  gap: 10px;
+}
 
 </style>

--
Gitblit v1.9.3