From 9c7901f526aa1fefd35da044b73c1a77e4d67ff0 Mon Sep 17 00:00:00 2001
From: RuoYi <yzz_ivy@163.com>
Date: 星期四, 01 七月 2021 18:01:36 +0800
Subject: [PATCH] 用户管理新增分配角色功能
---
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java | 10 +
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java | 38 ++++++
ruoyi-ui/src/views/system/user/authRole.vue | 117 +++++++++++++++++++
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java | 8 +
ruoyi-ui/src/views/system/user/index.vue | 49 +++++--
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java | 27 ++++
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java | 25 ++++
ruoyi-ui/src/router/index.js | 13 ++
ruoyi-ui/src/api/system/user.js | 17 ++
ruoyi-ui/src/assets/styles/ruoyi.scss | 18 +++
10 files changed, 306 insertions(+), 16 deletions(-)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index 03461ca..692bd5c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -202,4 +202,31 @@
user.setUpdateBy(SecurityUtils.getUsername());
return toAjax(userService.updateUserStatus(user));
}
+
+ /**
+ * 鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇鎺堟潈瑙掕壊
+ */
+ @PreAuthorize("@ss.hasPermi('system:user:query')")
+ @GetMapping("/authRole/{userId}")
+ public AjaxResult authRole(@PathVariable("userId") Long userId)
+ {
+ AjaxResult ajax = AjaxResult.success();
+ SysUser user = userService.selectUserById(userId);
+ List<SysRole> roles = roleService.selectRolesByUserId(userId);
+ ajax.put("user", user);
+ ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+ return ajax;
+ }
+
+ /**
+ * 鐢ㄦ埛鎺堟潈瑙掕壊
+ */
+ @PreAuthorize("@ss.hasPermi('system:user:edit')")
+ @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.GRANT)
+ @PutMapping("/authRole")
+ public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
+ {
+ userService.insertUserAuth(userId, roleIds);
+ return success();
+ }
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
index 4a4bee2..846ef6e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
@@ -20,7 +20,15 @@
public List<SysRole> selectRoleList(SysRole role);
/**
- * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊
+ * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊鍒楄〃
+ *
+ * @param userId 鐢ㄦ埛ID
+ * @return 瑙掕壊鍒楄〃
+ */
+ public List<SysRole> selectRolesByUserId(Long userId);
+
+ /**
+ * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊鏉冮檺
*
* @param userId 鐢ㄦ埛ID
* @return 鏉冮檺鍒楄〃
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
index 00afa00..5bf1488 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -96,6 +96,14 @@
* @return 缁撴灉
*/
public int updateUser(SysUser user);
+
+ /**
+ * 鐢ㄦ埛鎺堟潈瑙掕壊
+ *
+ * @param userId 鐢ㄦ埛ID
+ * @param roleIds 瑙掕壊缁�
+ */
+ public void insertUserAuth(Long userId, Long[] roleIds);
/**
* 淇敼鐢ㄦ埛鐘舵��
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
index cecc6a2..409baf0 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
@@ -56,6 +56,31 @@
}
/**
+ * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊
+ *
+ * @param userId 鐢ㄦ埛ID
+ * @return 瑙掕壊鍒楄〃
+ */
+ @Override
+ public List<SysRole> selectRolesByUserId(Long userId)
+ {
+ List<SysRole> userRoles = roleMapper.selectRolePermissionByUserId(userId);
+ List<SysRole> roles = selectRoleAll();
+ for (SysRole role : roles)
+ {
+ for (SysRole userRole : userRoles)
+ {
+ if (role.getRoleId().longValue() == userRole.getRoleId().longValue())
+ {
+ role.setFlag(true);
+ break;
+ }
+ }
+ }
+ return roles;
+ }
+
+ /**
* 鏍规嵁鐢ㄦ埛ID鏌ヨ鏉冮檺
*
* @param userId 鐢ㄦ埛ID
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index 065ae48..3da7490 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -243,6 +243,18 @@
}
/**
+ * 鐢ㄦ埛鎺堟潈瑙掕壊
+ *
+ * @param userId 鐢ㄦ埛ID
+ * @param roleIds 瑙掕壊缁�
+ */
+ public void insertUserAuth(Long userId, Long[] roleIds)
+ {
+ userRoleMapper.deleteUserRoleByUserId(userId);
+ insertUserRole(userId, roleIds);
+ }
+
+ /**
* 淇敼鐢ㄦ埛鐘舵��
*
* @param user 鐢ㄦ埛淇℃伅
@@ -357,6 +369,32 @@
}
/**
+ * 鏂板鐢ㄦ埛瑙掕壊淇℃伅
+ *
+ * @param userId 鐢ㄦ埛ID
+ * @param roleIds 瑙掕壊缁�
+ */
+ public void insertUserRole(Long userId, Long[] roleIds)
+ {
+ if (StringUtils.isNotNull(roleIds))
+ {
+ // 鏂板鐢ㄦ埛涓庤鑹茬鐞�
+ List<SysUserRole> list = new ArrayList<SysUserRole>();
+ for (Long roleId : roleIds)
+ {
+ SysUserRole ur = new SysUserRole();
+ ur.setUserId(userId);
+ ur.setRoleId(roleId);
+ list.add(ur);
+ }
+ if (list.size() > 0)
+ {
+ userRoleMapper.batchUserRole(list);
+ }
+ }
+ }
+
+ /**
* 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛
*
* @param userId 鐢ㄦ埛ID
diff --git a/ruoyi-ui/src/api/system/user.js b/ruoyi-ui/src/api/system/user.js
index 7f8db39..85bdc19 100644
--- a/ruoyi-ui/src/api/system/user.js
+++ b/ruoyi-ui/src/api/system/user.js
@@ -125,3 +125,20 @@
method: 'get'
})
}
+
+// 鏌ヨ鎺堟潈瑙掕壊
+export function getAuthRole(userId) {
+ return request({
+ url: '/system/user/authRole/' + userId,
+ method: 'get'
+ })
+}
+
+// 淇濆瓨鎺堟潈瑙掕壊
+export function updateAuthRole(data) {
+ return request({
+ url: '/system/user/authRole',
+ method: 'put',
+ params: data
+ })
+}
diff --git a/ruoyi-ui/src/assets/styles/ruoyi.scss b/ruoyi-ui/src/assets/styles/ruoyi.scss
index c40c9fb..5927b6c 100644
--- a/ruoyi-ui/src/assets/styles/ruoyi.scss
+++ b/ruoyi-ui/src/assets/styles/ruoyi.scss
@@ -53,6 +53,13 @@
margin-left: 20px;
}
+.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+
.el-dialog:not(.is-fullscreen){
margin-top: 6vh !important;
}
@@ -120,6 +127,17 @@
width: inherit;
}
+/** 琛ㄦ牸鏇村鎿嶄綔涓嬫媺鏍峰紡 */
+.el-table .el-dropdown-link {
+ cursor: pointer;
+ color: #1890ff;
+ margin-left: 5px;
+}
+
+.el-table .el-dropdown, .el-icon-arrow-down {
+ font-size: 12px;
+}
+
.el-tree-node__content > .el-checkbox {
margin-right: 8px;
}
diff --git a/ruoyi-ui/src/router/index.js b/ruoyi-ui/src/router/index.js
index 3f14fd3..67fca82 100644
--- a/ruoyi-ui/src/router/index.js
+++ b/ruoyi-ui/src/router/index.js
@@ -81,6 +81,19 @@
]
},
{
+ path: '/auth',
+ component: Layout,
+ hidden: true,
+ children: [
+ {
+ path: 'role/:userId(\\d+)',
+ component: (resolve) => require(['@/views/system/user/authRole'], resolve),
+ name: 'AuthRole',
+ meta: { title: '鍒嗛厤瑙掕壊'}
+ }
+ ]
+ },
+ {
path: '/dict',
component: Layout,
hidden: true,
diff --git a/ruoyi-ui/src/views/system/user/authRole.vue b/ruoyi-ui/src/views/system/user/authRole.vue
new file mode 100644
index 0000000..e0cd7bc
--- /dev/null
+++ b/ruoyi-ui/src/views/system/user/authRole.vue
@@ -0,0 +1,117 @@
+<template>
+ <div class="app-container">
+ <h4 class="form-header h4">鍩烘湰淇℃伅</h4>
+ <el-form ref="form" :model="form" label-width="80px">
+ <el-row>
+ <el-col :span="8" :offset="2">
+ <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
+ <el-input v-model="form.nickName" disabled />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8" :offset="2">
+ <el-form-item label="鐧诲綍璐﹀彿" prop="phonenumber">
+ <el-input v-model="form.userName" disabled />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+
+ <h4 class="form-header h4">瑙掕壊淇℃伅</h4>
+ <el-table v-loading="loading" :row-key="getRowKey" @row-click="clickRow" ref="table" @selection-change="handleSelectionChange" :data="roles.slice((pageNum-1)*pageSize,pageNum*pageSize)">
+ <el-table-column label="搴忓彿" type="index" align="center">
+ <template slot-scope="scope">
+ <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
+ </template>
+ </el-table-column>
+ <el-table-column type="selection" :reserve-selection="true" width="55"></el-table-column>
+ <el-table-column label="瑙掕壊缂栧彿" align="center" prop="roleId" />
+ <el-table-column label="瑙掕壊鍚嶇О" align="center" prop="roleName" />
+ <el-table-column label="鏉冮檺瀛楃" align="center" prop="roleKey" />
+ <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+ <template slot-scope="scope">
+ <span>{{ parseTime(scope.row.createTime) }}</span>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <pagination v-show="total>0" :total="total" :page.sync="pageNum" :limit.sync="pageSize" />
+
+ <el-form label-width="100px">
+ <el-form-item style="text-align: center;margin-left:-120px;margin-top:30px;">
+ <el-button type="primary" @click="submitForm()">鎻愪氦</el-button>
+ <el-button @click="close()">杩斿洖</el-button>
+ </el-form-item>
+ </el-form>
+ </div>
+</template>
+
+<script>
+import { getAuthRole, updateAuthRole } from "@/api/system/user";
+
+export default {
+ name: "AuthRole",
+ data() {
+ return {
+ // 閬僵灞�
+ loading: true,
+ // 鍒嗛〉淇℃伅
+ total: 0,
+ pageNum: 1,
+ pageSize: 10,
+ // 閫変腑瑙掕壊缂栧彿
+ roleIds:[],
+ // 瑙掕壊淇℃伅
+ roles: [],
+ // 鐢ㄦ埛淇℃伅
+ form: {}
+ };
+ },
+ created() {
+ const userId = this.$route.params && this.$route.params.userId;
+ if (userId) {
+ this.loading = true;
+ getAuthRole(userId).then((response) => {
+ this.form = response.user;
+ this.roles = response.roles;
+ this.total = this.roles.length;
+ this.$nextTick(() => {
+ this.roles.forEach((row) => {
+ if (row.flag) {
+ this.$refs.table.toggleRowSelection(row);
+ }
+ });
+ });
+ this.loading = false;
+ });
+ }
+ },
+ methods: {
+ /** 鍗曞嚮閫変腑琛屾暟鎹� */
+ clickRow(row) {
+ this.$refs.table.toggleRowSelection(row);
+ },
+ // 澶氶�夋閫変腑鏁版嵁
+ handleSelectionChange(selection) {
+ this.roleIds = selection.map((item) => item.roleId);
+ },
+ // 淇濆瓨閫変腑鐨勬暟鎹紪鍙�
+ getRowKey(row) {
+ return row.roleId;
+ },
+ /** 鎻愪氦鎸夐挳 */
+ submitForm() {
+ const userId = this.form.userId;
+ const roleIds = this.roleIds.join(",");
+ updateAuthRole({ userId: userId, roleIds: roleIds }).then((response) => {
+ this.msgSuccess("鎺堟潈鎴愬姛");
+ this.close();
+ });
+ },
+ /** 鍏抽棴鎸夐挳 */
+ close() {
+ this.$store.dispatch("tagsView/delView", this.$route);
+ this.$router.push({ path: "/system/user" });
+ },
+ },
+};
+</script>
\ No newline at end of file
diff --git a/ruoyi-ui/src/views/system/user/index.vue b/ruoyi-ui/src/views/system/user/index.vue
index b2c00ef..7f419c9 100644
--- a/ruoyi-ui/src/views/system/user/index.vue
+++ b/ruoyi-ui/src/views/system/user/index.vue
@@ -175,21 +175,19 @@
@click="handleUpdate(scope.row)"
v-hasPermi="['system:user:edit']"
>淇敼</el-button>
- <el-button
- v-if="scope.row.userId !== 1"
- size="mini"
- type="text"
- icon="el-icon-delete"
- @click="handleDelete(scope.row)"
- v-hasPermi="['system:user:remove']"
- >鍒犻櫎</el-button>
- <el-button
- size="mini"
- type="text"
- icon="el-icon-key"
- @click="handleResetPwd(scope.row)"
- v-hasPermi="['system:user:resetPwd']"
- >閲嶇疆</el-button>
+ <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)">
+ <span class="el-dropdown-link">
+ <i class="el-icon-d-arrow-right el-icon--right"></i>鏇村鎿嶄綔
+ </span>
+ <el-dropdown-menu slot="dropdown">
+ <el-dropdown-item command="handleDelete" v-if="scope.row.userId !== 1" icon="el-icon-delete"
+ v-hasPermi="['system:user:remove']">鍒犻櫎鐢ㄦ埛</el-dropdown-item>
+ <el-dropdown-item command="handleResetPwd" icon="el-icon-key"
+ v-hasPermi="['system:user:resetPwd']">閲嶇疆瀵嗙爜</el-dropdown-item>
+ <el-dropdown-item command="handleAuthRole" icon="el-icon-circle-check"
+ v-hasPermi="['system:user:edit']">鍒嗛厤瑙掕壊</el-dropdown-item>
+ </el-dropdown-menu>
+ </el-dropdown>
</template>
</el-table-column>
</el-table>
@@ -561,6 +559,22 @@
this.single = selection.length != 1;
this.multiple = !selection.length;
},
+ // 鏇村鎿嶄綔瑙﹀彂
+ handleCommand(command, row) {
+ switch (command) {
+ case "handleDelete":
+ this.handleDelete(row);
+ break;
+ case "handleResetPwd":
+ this.handleResetPwd(row);
+ break;
+ case "handleAuthRole":
+ this.handleAuthRole(row);
+ break;
+ default:
+ break;
+ }
+ },
/** 鏂板鎸夐挳鎿嶄綔 */
handleAdd() {
this.reset();
@@ -603,6 +617,11 @@
});
}).catch(() => {});
},
+ /** 鍒嗛厤瑙掕壊鎿嶄綔 */
+ handleAuthRole: function(row) {
+ const userId = row.userId;
+ this.$router.push("/auth/role/" + userId);
+ },
/** 鎻愪氦鎸夐挳 */
submitForm: function() {
this.$refs["form"].validate(valid => {
--
Gitblit v1.9.3