天天看點

【學生管理系統】權限管理之使用者管理

目錄

​​6. 權限管理​​

​​6.1 環境搭建​​

​​6.1.1 資料庫​​

​​6.1.2 後端環境​​

​​6.2 使用者管理​​

​​6.2.1 查詢所有使用者(關聯角色)​​

​​6.2.2 核心1:給使用者授予角色​​

6. 權限管理

6.1 環境搭建

6.1.1 資料庫

  • 權限管理的5張表的關系
  • 【學生管理系統】權限管理之使用者管理
  • 添加4張表
  • 【學生管理系統】權限管理之使用者管理
# 權限表(菜單表)
CREATE TABLE `sys_permission`  (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `permName` varchar(50) ,
  `parent_id` int(11) ,
  `path` varchar(255) ,
  PRIMARY KEY (`id`) USING BTREE
);

INSERT INTO `sys_permission` VALUES (1, '班級管理', 0, '/classes');
INSERT INTO `sys_permission` VALUES (2, '添加班級', 1, '/classes/classesAdd');
INSERT INTO `sys_permission` VALUES (3, '班級清單', 1, '/classes/classesList');

INSERT INTO `sys_permission` VALUES (4, '學生管理', 0, '/student');
INSERT INTO `sys_permission` VALUES (5, '學生清單', 4, '/student/studentList');

INSERT INTO `sys_permission` VALUES (6, '權限管理', 0, '/perm');
INSERT INTO `sys_permission` VALUES (7, '權限清單', 6, '/perm/permissionList');
INSERT INTO `sys_permission` VALUES (8, '角色清單', 6, '/perm/roleList');
INSERT INTO `sys_permission` VALUES (9, '使用者清單', 6, '/perm/userList');


# 角色表
CREATE TABLE `sys_role`  (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `roleName` varchar(50),
  `roleDesc` varchar(50),
  PRIMARY KEY (`id`) USING BTREE
) ;

INSERT INTO `sys_role` VALUES (1, 'admin', '超級管理者');
INSERT INTO `sys_role` VALUES (2, 'sms_admin', 'sms管理者');
INSERT INTO `sys_role` VALUES (3, 'user', '普通使用者');



#中間表:角色權限表
CREATE TABLE `sys_role_permission`  (
  `role_id` int(10),
  `perm_id` int(10),
  INDEX `FK_Reference_3`(`role_id`) USING BTREE,
  INDEX `FK_Reference_4`(`perm_id`) USING BTREE,
  CONSTRAINT `sys_role_permission_ibfk_1` FOREIGN KEY (`perm_id`) REFERENCES `sys_permission` (`id`) ,
  CONSTRAINT `sys_role_permission_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`id`) 
);


INSERT INTO `sys_role_permission` VALUES (1, 1);
INSERT INTO `sys_role_permission` VALUES (1, 2);
INSERT INTO `sys_role_permission` VALUES (1, 3);
INSERT INTO `sys_role_permission` VALUES (1, 4);
INSERT INTO `sys_role_permission` VALUES (1, 5);
INSERT INTO `sys_role_permission` VALUES (1, 6);
INSERT INTO `sys_role_permission` VALUES (1, 7);
INSERT INTO `sys_role_permission` VALUES (1, 8);
INSERT INTO `sys_role_permission` VALUES (1, 9);

INSERT INTO `sys_role_permission` VALUES (2, 1);
INSERT INTO `sys_role_permission` VALUES (2, 2);
INSERT INTO `sys_role_permission` VALUES (2, 3);
INSERT INTO `sys_role_permission` VALUES (2, 4);
INSERT INTO `sys_role_permission` VALUES (2, 5);


# 中間表:使用者角色表
CREATE TABLE `sys_user_role`  (
  `user_id` VARCHAR(32),
  `role_id` INT(10) ,
  INDEX `FK_Reference_1`(`user_id`) USING BTREE,
  INDEX `FK_Reference_2`(`role_id`) USING BTREE,
  CONSTRAINT `sys_user_role_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`id`),
  CONSTRAINT `sys_user_role_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`u_id`)
);

INSERT INTO `sys_user_role` VALUES ('u001', 1);
INSERT INTO `sys_user_role` VALUES ('u001', 2);
INSERT INTO `sys_user_role` VALUES ('u002', 2);      

6.1.2 後端環境

  • 基本内容:JavaBean、Mapper、Service、Controller
  • JavaBean
  • 【學生管理系統】權限管理之使用者管理
  • 基本結構
  • 【學生管理系統】權限管理之使用者管理

6.2 使用者管理

6.2.1 查詢所有使用者(關聯角色)

1)後端

  • 修改javaBean:​

    ​List<SysRole> roleList​

  • 編寫Mapper:使用注解的方式查詢關聯資料
  • 編寫Service
  • 編寫Controller
  • 修改javaBean:​

    ​List<SysRole> roleList​

  • 【學生管理系統】權限管理之使用者管理
  • 編寫Mapper:使用注解的方式查詢關聯資料
• • package com.czxy.classes.mapper;
• ​
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.czxy.domain.TbUser;
import org.apache.ibatis.annotations.*;
​
import java.util.List;
​
/**
 * @author 桐叔
 * @email [email protected]
 * @description
 */
@Mapper
public interface TbUserMapper extends BaseMapper<TbUser> {
​
    @Select("SELECT * FROM tb_user")
    @Results({
            @Result(property = "uid", column = "u_id"),
            @Result(property = "userName", column = "user_name"),
            @Result(property = "password", column = "password"),
            @Result(property = "gender", column = "gender"),
            @Result(property = "image", column = "image"),
            @Result(property = "roleList", many = @Many(select = "com.czxy.classes.mapper.SysRoleMapper.findAllByUid") , column = "u_id")
    })
    public List<TbUser> findAll();
}
​      
  • 修改UserMapper:查詢所有,含角色
  • 【學生管理系統】權限管理之使用者管理
• • package com.czxy.classes.mapper;
• ​
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.czxy.sys.SysRole;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
​
import java.util.List;
​
/**
 * @author 桐叔
 * @email [email protected]
 * @description
 */
@Mapper
public interface SysRoleMapper extends BaseMapper<SysRole> {
    /**
     * 查詢指定使用者的所有角色
     * @author 桐叔
     * @email [email protected]
     * @return
     */
    @Select("SELECT r.* FROM sys_role r, sys_user_role ur WHERE r.id = ur.role_id AND ur.user_id = #{uid}")
    public List<SysRole> findAllByUid(@Param("uid") String uid);
}
​      
  • 修改RoleMapper:查詢指定使用者的角色
  • 【學生管理系統】權限管理之使用者管理
• 編寫Servicepackage com.czxy.classes.service;
​
import com.baomidou.mybatisplus.extension.service.IService;
import com.czxy.domain.TbUser;
​
import java.util.List;
​
/**
 * @author 桐叔
 * @email [email protected]
 * @description
 */
public interface TbUserService extends IService<TbUser> {
​
    public List<TbUser> findAll();
}
​package com.czxy.classes.service.impl;
​
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.czxy.domain.TbUser;
import com.czxy.classes.mapper.TbUserMapper;
import com.czxy.classes.service.TbUserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
​
import java.util.List;
​
/**
 * @author 桐叔
 * @email [email protected]
 * @description
 */
@Service
@Transactional
public class TbUserServiceImpl extends ServiceImpl<TbUserMapper, TbUser> implements TbUserService {
​
    @Override
    public List<TbUser> findAll() {
        return baseMapper.findAll();
    }
}
​
• 編寫Controllerpackage com.czxy.classes.controller;
​
import com.czxy.classes.config.JwtProperties;
import com.czxy.classes.utils.JwtUtils;
import com.czxy.domain.TbUser;
import com.czxy.classes.service.TbUserService;
import com.czxy.vo.BaseResult;
import org.springframework.web.bind.annotation.*;
​
import javax.annotation.Resource;
import java.util.List;
​
/**
 * @author 桐叔
 * @email [email protected]
 * @description
 */
@RestController
@RequestMapping("/user")
public class TbUserController {
    @Resource
    private TbUserService tbUserService;
​
    @GetMapping
    public BaseResult findAll() {
        List<TbUser> list = tbUserService.findAll();
        return BaseResult.ok("查詢成功", list);
    }
​
​
}
​      

2)前端

<template>
  <div>
    <!-- 清單start -->
    <el-table
      :data="userList"
      stripe
      style="width: 100%">
      <el-table-column
        type="selection"
        width="55">
      </el-table-column>
      <el-table-column
        prop="uid"
        label="使用者ID"
        fixed
        width="80">
      </el-table-column>
      <el-table-column
        prop="userName"
        label="姓名"
        fixed
        width="100">
      </el-table-column>
      <el-table-column
        prop="gender"
        label="性别"
        width="80">
        <template slot-scope="scope">
          {{scope.row.gender == 1 ? '男': '女'}}
        </template>
      </el-table-column>
      <el-table-column
        prop="image"
        label="頭像"
        width="80">
        <template slot-scope="scope">
          <el-avatar size="20" :src="scope.row.image"></el-avatar>
        </template>
      </el-table-column>
      <el-table-column
        label="角色"
        width="300">
        <template slot-scope="scope">
          <el-tag v-for="(role,index) in scope.row.roleList" :key="index" closable>{{role.roleName}}</el-tag>
        </template>
      </el-table-column>
      <el-table-column
        label="操作" 
        fixed="right">
        <template slot-scope="scope">
          <el-button size="mini">編輯</el-button>
          <el-button size="mini" type="danger">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 清單end -->
  </div>
</template>

<script>
export default {
  data() {
    return {
      userList: []
    }
  },
  methods: {
    async findAllUser() {
      // ajax
      let { data: baseResult } = await this.$axios.get('/user-service/user')
      // 處理
      if(baseResult.code == 20000) {
        this.userList = baseResult.data
      } else {
        this.$message.error(baseResult.message)
      }
    },
  },
  mounted() {
    // 查詢所有的使用者
    this.findAllUser()
  },
}
</script>

<style>

</style>      

6.2.2 核心1:給使用者授予角色

1)分析

  • 前置功能:查詢所有的角色
  • 後端:查詢所有
  • 前端:下拉清單展示
  • 核心:給使用者授予角色
  • 完成修改的部分功能,将使用者選擇的角色更新到資料庫(先删除、後添加)
  • 後端:使用者角色直接操作,給一個使用者,添加一組角色
  • 前端:彈出框,直接使用table中的資料填充前端額下拉清單

2)前置功能:查詢所有的角色-後端

【學生管理系統】權限管理之使用者管理
package com.czxy.classes.controller;

import com.czxy.classes.service.SysRoleService;
import com.czxy.sys.SysRole;
import com.czxy.vo.BaseResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author 桐叔
 * @email [email protected]
 * @description
 */
@RestController
@RequestMapping("/role")
public class SysRoleController {
    @Resource
    private SysRoleService sysRoleService;

    @GetMapping
    public BaseResult findAll() {
        List<SysRole> list = sysRoleService.list();
        return BaseResult.ok("查詢成功", list);
    }


}      

3)核心:給使用者授予角色-後端

  • 使用者角色直接操作,給一個使用者,添加一組角色
  • 編寫mapper:通過uid删除關聯資訊
  • 編寫service:先删除後,後添加
  • 編寫controller
• • package com.czxy.classes.mapper;
• ​
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.czxy.sys.SysRole;
import com.czxy.sys.SysUserRole;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
​
/**
 * @author 桐叔
 * @email [email protected]
 * @description
 */
@Mapper
public interface SysUserRoleMapper extends BaseMapper<SysUserRole> {
    @Delete("DELETE FROM sys_user_role WHERE user_id = #{uid}")
    int deleteByUid(@Param("uid") String uid);
}
​      
  • 編寫mapper:通過uid删除關聯資訊
  • 【學生管理系統】權限管理之使用者管理
package com.czxy.classes.service;
​
import com.baomidou.mybatisplus.extension.service.IService;
import com.czxy.domain.TbUser;
import com.czxy.sys.SysUserRole;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
​
/**
 * @author 桐叔
 * @email [email protected]
 * @description
 */
@Service
@Transactional
public interface SysUserRoleService extends IService<SysUserRole> {
    /**
     * 給指定使用者收取角色
     * @author 桐叔
     * @email [email protected]
     * @return
     */
    void addRoleWithUser(TbUser tbUser);
}
​package com.czxy.classes.service.impl;
​
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.czxy.classes.mapper.SysUserRoleMapper;
import com.czxy.classes.service.SysUserRoleService;
import com.czxy.domain.TbUser;
import com.czxy.sys.SysUserRole;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
​
/**
 * @author 桐叔
 * @email [email protected]
 * @description
 */
@Service
@Transactional
public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements SysUserRoleService {
​
    @Override
    public void addRoleWithUser(TbUser tbUser) {
​
        //1 删除
        baseMapper.deleteByUid(tbUser.getUid());
​
        //2 添加
        for (Integer roleId : tbUser.getRoleIds()) {
            SysUserRole sysUserRole = new SysUserRole(tbUser.getUid(), roleId);
            baseMapper.insert(sysUserRole);
        }
    }
}      
  • 編寫service:先删除後,後添加
  • 【學生管理系統】權限管理之使用者管理
• • package com.czxy.classes.controller;
• ​
import com.czxy.classes.service.SysUserRoleService;
import com.czxy.domain.TbUser;
import com.czxy.vo.BaseResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
import javax.annotation.Resource;
​
/**
 * @author 桐叔
 * @email [email protected]
 * @description
 */
@RestController
@RequestMapping("/userRole")
public class SysUserRoleController {
    @Resource
    private SysUserRoleService sysUserRoleService;
​
    @PostMapping("/addRoleWithUser")
    public BaseResult addRoleWithUser(@RequestBody TbUser tbUser) {
        // 給使用者添加角色
        sysUserRoleService.addRoleWithUser(tbUser);
        return BaseResult.ok("授權成功");
    }
​
​
}
​      
  • 編寫controller
  • 【學生管理系統】權限管理之使用者管理
<template>
  <div>
    <!-- 清單start -->
    <el-table
      :data="userList"
      stripe
      style="width: 100%">
      <el-table-column
        type="selection"
        width="55">
      </el-table-column>
      <el-table-column
        prop="uid"
        label="使用者ID"
        fixed
        width="80">
      </el-table-column>
      <el-table-column
        prop="userName"
        label="姓名"
        fixed
        width="100">
      </el-table-column>
      <el-table-column
        prop="gender"
        label="性别"
        width="80">
        <template slot-scope="scope">
          {{scope.row.gender == 1 ? '男': '女'}}
        </template>
      </el-table-column>
      <el-table-column
        prop="image"
        label="頭像"
        width="80">
        <template slot-scope="scope">
          <el-avatar :size="20" :src="scope.row.image"></el-avatar>
        </template>
      </el-table-column>
      <el-table-column
        label="角色"
        width="300">
        <template slot-scope="scope">
          <el-tag v-for="(role,index) in scope.row.roleList" :key="index" closable>{{role.roleName}}</el-tag>
        </template>
      </el-table-column>
      <el-table-column
        label="操作" 
        fixed="right">
        <template slot-scope="scope">
          <el-button size="mini" @click="openRoleDialog(scope.row)">授權</el-button>
          <el-button size="mini">編輯</el-button>
          <el-button size="mini" type="danger">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 清單end -->

    
    <!-- 彈出框 start -->
    <el-dialog title="授權" :visible.sync="dialogRoleVisible">
      <el-form :model="user" label-width="80px">
        <el-form-item label="角色清單">
          <el-select v-model="user.roleIds" multiple placeholder="請選擇角色">
            <el-option v-for="(role,index) in roleList" :key="index" :label="role.roleName" :value="role.id"></el-option>
          </el-select>
        </el-form-item>
      </el-form>
      {{user}}
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogRoleVisible = false">取 消</el-button>
        <el-button type="primary" @click="addRoleWithUser">确 定</el-button>
      </div>
    </el-dialog>
    <!-- 彈出框 end -->
  </div>
</template>

<script>
export default {
  data() {
    return {
      userList: [],
      dialogRoleVisible: false,
      user: {},
      roleList: []
    }
  },
  methods: {
    async findAllUser() {
      // ajax
      let { data: baseResult } = await this.$axios.get('/user-service/user')
      // 處理
      if(baseResult.code == 20000) {
        this.userList = baseResult.data
      } else {
        this.$message.error(baseResult.message)
      }
    },
    async findAllRole() {
      // ajax
      let { data: baseResult } = await this.$axios.get('/user-service/role')
      // 處理
      if(baseResult.code == 20000) {
        this.roleList = baseResult.data
      } else {
        this.$message.error(baseResult.message)
      }
    },
    openRoleDialog(user) {
      // 查詢所有角色
      this.findAllRole()
      // 填充表單
      this.user.uid = user.uid
      // 處理資料:從role對象過濾出role.id
      // this.user.roleIds = user.roleList.map(role => role.id)   //隻能回顯,不能操作
      this.$set(this.user, 'roleIds', user.roleList.map(role => role.id))
      // 打開彈出框
      this.dialogRoleVisible = true
    },
    async addRoleWithUser() {
      // ajax
      let { data: baseResult } = await this.$axios.post('/user-service/userRole/addRoleWithUser', this.user)
      // 處理
      if(baseResult.code == 20000) {
        // 成功
        this.$message.success(baseResult.message)
        // 重新整理頁面
        this.findAllUser()
        // 關閉彈出框
        this.dialogRoleVisible = false
      } else {
        this.$message.error(baseResult.message)
      }
    }
  },
  mounted() {
    // 查詢所有的使用者
    this.findAllUser()
  },
}
</script>

<style>

</style>