【学生管理系统】权限管理之角色管理

目录

6.3 角色管理

6.3.1 查询所有角色

6.3.2 核心2:给角色授予权限(菜单)

6.3.3 添加角色

6.3 角色管理

6.3.1 查询所有角色

1)后端【已有】

2)前端

  • 要求:左右分屏

<template><div><el-row><el-col :span="16"><el-card class="role-list-card"><div slot="header" class="clearfix"><span>角色列表</span></div><!-- 角色列表 start --><el-table:data="roleList"stripestyle="width: 100%"><el-table-columnprop="id"label="角色ID"fixedwidth="80"></el-table-column><el-table-columnprop="roleName"label="角色名称"fixedwidth="180"></el-table-column><el-table-columnprop="roleDesc"label="角色描述"width="200"></el-table-column><el-table-columnlabel="操作" 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 --></el-card></el-col><el-col :span="8" style="padding-left: 10px;"><el-card class="perm-list-card"><div slot="header" class="clearfix"><span>权限展示</span><el-button type="primary" style="float: right; padding: 3px 0">授权</el-button></div><!-- 权限展示 start --><!-- 权限展示 end --></el-card></el-col></el-row></div>
</template>
​
<script>
export default {data() {return {roleList: []}},methods: {async findAllRole() {// ajaxlet { data: baseResult } = await this.$axios.get('/user-service/role')// 处理if(baseResult.code == 20000) {this.roleList = baseResult.data} else {this.$message.error(baseResult.message)}}},mounted() {// 查询所有的角色this.findAllRole()},
}
</script>
​
<style>.role-list-card {height: 100%;}.perm-list-card {height: 100%;}
</style>

6.3.2 核心2:给角色授予权限(菜单)

1)后端:查询所有的权限(含孩子)

  • 方式1:在controller中排序查询所有,然后使用Map进行缓存处理,将所有权限拼凑成父子关系。

  • 方式2:使用mapper注解版

    1. 编写PermMapper:查询指定父id的所有权限,需配置关联项(当前权限的所有的孩子)

    2. 编写service:查询所有

    3. 编写controller:查询所有

  1. 编写PermMapper:查询指定父id的所有权限,需配置关联项(当前权限的所有的孩子)

    package com.czxy.classes.mapper;
    ​
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.czxy.sys.SysPermission;
    import org.apache.ibatis.annotations.*;
    ​
    import java.util.List;
    ​
    /*** @author 桐叔* @email liangtong@itcast.cn* @description*/
    @Mapper
    public interface SysPermissionMapper extends BaseMapper<SysPermission> {/*** 通过父id查询所有的权限* @author 桐叔* @email liangtong@itcast.cn* @return*/@Select("SELECT * FROM sys_permission WHERE parent_id = #{parentId}")@Results({@Result(property = "id", column = "id"),@Result(property = "permName", column = "permName"),@Result(property = "parentId", column = "parent_id"),@Result(property = "path", column = "path"),@Result(property = "children", many = @Many(select = "com.czxy.classes.mapper.SysPermissionMapper.findAllByParentId"), column = "id")})public List<SysPermission> findAllByParentId(@Param("parentId") Integer parentId) ;
    ​
    ​
    }
    ​

  2. 编写service:查询所有

    • 接口

      @Service
      @Transactional
      public interface SysPermissionService extends IService<SysPermission> {
      ​
      ​public List<SysPermission> findAllByParentId(Integer parentId) ;
      }
      ​

    • 实现类

      package com.czxy.classes.service.impl;
      ​
      import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
      import com.czxy.classes.mapper.SysPermissionMapper;
      import com.czxy.classes.service.SysPermissionService;
      import com.czxy.sys.SysPermission;
      import org.springframework.stereotype.Service;
      import org.springframework.transaction.annotation.Transactional;
      ​
      import java.util.List;
      ​
      /*** @author 桐叔* @email liangtong@itcast.cn* @description*/
      @Service
      @Transactional
      public class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, SysPermission> implements SysPermissionService {
      ​@Overridepublic List<SysPermission> findAllByParentId(Integer parentId) {return baseMapper.findAllByParentId(parentId);}
      }
      ​

  3. 编写controller:查询所有

    package com.czxy.classes.controller;
    ​
    import com.czxy.classes.service.SysPermissionService;
    import com.czxy.sys.SysPermission;
    import com.czxy.vo.BaseResult;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    ​
    import javax.annotation.Resource;
    import java.util.List;
    ​
    /*** @author 桐叔* @email liangtong@itcast.cn* @description*/
    @RestController
    @RequestMapping("/perm")
    public class SysPermissionController {@Resourceprivate SysPermissionService sysPermissionService;
    ​
    ​/*** 查询所有,含孩子* @author 桐叔* @email liangtong@itcast.cn* @return*/@GetMapping("/parent/{parentId}")public BaseResult findAllByParentId(@PathVariable("parentId") Integer parentId) {// 查询List<SysPermission> list = sysPermissionService.findAllByParentId(parentId);return BaseResult.ok("查询成功", list);}
    ​
    }
    ​

2)后端:查询指定角色的所有的权限

  • 提交数据:roleId = 1

  • 获得数据:[ {roleId: 1, permId: 1}, {roleId: 1, permId: 2}, ...] --> [1,2,3,4]

package com.czxy.classes.controller;
​
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.czxy.classes.service.SysRolePermissionService;
import com.czxy.sys.SysRolePermission;
import com.czxy.vo.BaseResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
​
/*** @author 桐叔* @email liangtong@itcast.cn* @description*/
@RestController
@RequestMapping("/rolePerm")
public class SysRolePermissionController {@Resourceprivate SysRolePermissionService sysRolePermissionService;
​@GetMapping("/role/{roleId}")public BaseResult findAllByRoleId(@PathVariable("roleId") Integer roleId) {//1 条件 roleId = 1QueryWrapper<SysRolePermission> queryWrapper = new QueryWrapper<>();queryWrapper.eq("role_id", roleId);
​//2 查询所有- 角色权限对象List<SysRolePermission> list = sysRolePermissionService.list(queryWrapper);
​//3 处理数据,只需要权限idList<Integer> roleIdList = list.stream().map(sysRolePermission -> sysRolePermission.getPermId()).collect(Collectors.toList());
​//4 返回return BaseResult.ok("查询成功", roleIdList);}
​
​
}
​

3)前端:展示所有的权限

  • 编写变量、发送ajax查询、页面加载成功时调用

  • 使用tree进行展示

<template><div><el-row><el-col :span="16"><el-card class="role-list-card"><div slot="header" class="clearfix"><span>角色列表</span></div><!-- 角色列表 start --><el-table:data="roleList"stripestyle="width: 100%"><el-table-columnprop="id"label="角色ID"fixedwidth="80"></el-table-column><el-table-columnprop="roleName"label="角色名称"fixedwidth="180"></el-table-column><el-table-columnprop="roleDesc"label="角色描述"width="200"></el-table-column><el-table-columnlabel="操作" 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 --></el-card></el-col><el-col :span="8" style="padding-left: 10px;"><el-card class="perm-list-card"><div slot="header" class="clearfix"><span>权限展示</span><el-button type="primary" style="float: right; padding: 3px 0">授权</el-button></div><!-- 权限展示 start --><el-tree:data="permList"show-checkboxdefault-expand-allnode-key="id"ref="permTree"highlight-current:props="defaultProps"></el-tree><!-- 权限展示 end --></el-card></el-col></el-row></div>
</template>
​
<script>
export default {data() {return {roleList: [],               //角色列表permList: [],               //权限列表defaultProps: {             //tree提供的数据 与 所需数据 对应关系children: 'children',label: 'permName'}}},methods: {async findAllRole() {// ajaxlet { data: baseResult } = await this.$axios.get('/user-service/role')// 处理if(baseResult.code == 20000) {this.roleList = baseResult.data} else {this.$message.error(baseResult.message)}},async findAllPerm(parentId) {// ajaxlet { data: baseResult } = await this.$axios.get(`/user-service/perm/parent/${parentId}`)// 处理if(baseResult.code == 20000) {this.permList = baseResult.data} else {this.$message.error(baseResult.message)}}},mounted() {// 查询所有的角色this.findAllRole()// 查询所有的一级权限this.findAllPerm(0)},
}
</script>
​
<style>.role-list-card {height: 100%;}.perm-list-card {height: 100%;}
</style>

4)前端:回显指定角色的权限

  • 表格行的点击,并获得当前行的数据

  • 查询当前角色对应的所有选线,并回显到tree中

    async findAllPermByRoleId(row, column, event) {// ajax 查询   /user-service/rolePerm/role/1let { data: baseResult } = await this.$axios.get(`/user-service/rolePerm/role/${row.id}`)// 处理if(baseResult.code == 20000) {// 查询成功,将查询的结果填充到右侧tree中this.$refs.permTree.setCheckedKeys(baseResult.data);} else {this.$message.error(baseResult.message)}}

<template><div><el-row><el-col :span="16"><el-card class="role-list-card"><div slot="header" class="clearfix"><span>角色列表</span></div><!-- 角色列表 start --><el-table:data="roleList"stripe@row-click="findAllPermByRoleId"style="width: 100%"><el-table-columnprop="id"label="角色ID"fixedwidth="80"></el-table-column><el-table-columnprop="roleName"label="角色名称"fixedwidth="180"></el-table-column><el-table-columnprop="roleDesc"label="角色描述"width="200"></el-table-column><el-table-columnlabel="操作" 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 --></el-card></el-col><el-col :span="8" style="padding-left: 10px;"><el-card class="perm-list-card"><div slot="header" class="clearfix"><span>权限展示</span><el-button type="primary" style="float: right; padding: 3px 0">授权</el-button></div><!-- 权限展示 start --><el-tree:data="permList"show-checkboxdefault-expand-allnode-key="id"ref="permTree"highlight-current:props="defaultProps"></el-tree><!-- 权限展示 end --></el-card></el-col></el-row></div>
</template>
​
<script>
export default {data() {return {roleList: [],               //角色列表permList: [],               //权限列表defaultProps: {             //tree提供的数据 与 所需数据 对应关系children: 'children',label: 'permName'}}},methods: {async findAllRole() {// ajaxlet { data: baseResult } = await this.$axios.get('/user-service/role')// 处理if(baseResult.code == 20000) {this.roleList = baseResult.data} else {this.$message.error(baseResult.message)}},async findAllPerm(parentId) {// ajaxlet { data: baseResult } = await this.$axios.get(`/user-service/perm/parent/${parentId}`)// 处理if(baseResult.code == 20000) {this.permList = baseResult.data} else {this.$message.error(baseResult.message)}},async findAllPermByRoleId(row, column, event) {// ajax 查询   /user-service/rolePerm/role/1let { data: baseResult } = await this.$axios.get(`/user-service/rolePerm/role/${row.id}`)// 处理if(baseResult.code == 20000) {// 查询成功,将查询的结果填充到右侧tree中this.$refs.permTree.setCheckedKeys(baseResult.data);} else {this.$message.error(baseResult.message)}}},mounted() {// 查询所有的角色this.findAllRole()// 查询所有的一级权限this.findAllPerm(0)},
}
</script>
​
<style>.role-list-card {height: 100%;}.perm-list-card {height: 100%;}
</style>

5)前端:提交授权表单

<template><div><el-row><el-col :span="16"><el-card class="role-list-card"><div slot="header" class="clearfix"><span>角色列表</span></div><!-- 角色列表 start --><el-table:data="roleList"stripe@row-click="findAllPermByRoleId"style="width: 100%"><el-table-columnprop="id"label="角色ID"fixedwidth="80"></el-table-column><el-table-columnprop="roleName"label="角色名称"fixedwidth="180"></el-table-column><el-table-columnprop="roleDesc"label="角色描述"width="200"></el-table-column><el-table-columnlabel="操作" 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 --></el-card></el-col><el-col :span="8" style="padding-left: 10px;"><el-card class="perm-list-card"><div slot="header" class="clearfix"><span>权限展示</span><el-button type="primary" @click="addPermWithRoleId" style="float: right; padding: 3px 0">授权</el-button></div><!-- 权限展示 start --><el-tree:data="permList"show-checkboxdefault-expand-allnode-key="id"ref="permTree"highlight-current:props="defaultProps"></el-tree><!-- 权限展示 end --></el-card></el-col></el-row></div>
</template>
​
<script>
export default {data() {return {roleList: [],               //角色列表permList: [],               //权限列表defaultProps: {             //tree提供的数据 与 所需数据 对应关系children: 'children',label: 'permName'},role: {id: '',         //角色idpermIds: []     //所选权限的id}}},methods: {async findAllRole() {// ajaxlet { data: baseResult } = await this.$axios.get('/user-service/role')// 处理if(baseResult.code == 20000) {this.roleList = baseResult.data} else {this.$message.error(baseResult.message)}},async findAllPerm(parentId) {// ajaxlet { data: baseResult } = await this.$axios.get(`/user-service/perm/parent/${parentId}`)// 处理if(baseResult.code == 20000) {this.permList = baseResult.data} else {this.$message.error(baseResult.message)}},async findAllPermByRoleId(row, column, event) {// ajax 查询   /user-service/rolePerm/role/1let { data: baseResult } = await this.$axios.get(`/user-service/rolePerm/role/${row.id}`)// 处理if(baseResult.code == 20000) {// 查询成功,将查询的结果填充到右侧tree中this.$refs.permTree.setCheckedKeys(baseResult.data);// 记录已有数据this.role.id = row.idthis.role.permIds = baseResult.dataconsole.info(this.role)} else {this.$message.error(baseResult.message)}},async addPermWithRoleId() {// 判断是否选择角色if(! this.role.id) {this.$message.warning('请先选择角色')return;}// 更新所选权限this.role.permIds = this.$refs.permTree.getCheckedKeys()// ajax 提交let { data: baseResult } = await this.$axios.post('/user-service/rolePerm/addPerm', this.role)// 提示if(baseResult.code == 20000) {this.$message.success(baseResult.message)} else {this.$message.error(baseResult.message)}}},mounted() {// 查询所有的角色this.findAllRole()// 查询所有的一级权限this.findAllPerm(0)},
}
</script>
​
<style>.role-list-card {height: 100%;}.perm-list-card {height: 100%;}
</style>

6)后端:授权

  • 编写controller

  • 编写service

  • 编写controller

        @PostMapping("/addPerm")public BaseResult addPermWithRoleId(@RequestBody SysRole sysRole) {try {// 添加权限sysRolePermissionService.addPermWithRoleId(sysRole);
    ​// 提示return BaseResult.ok("授权成功");} catch (Exception e) {return BaseResult.error("授权失败");}
    ​}

  • 编写service

    • 接口

      @Service
      @Transactional
      public interface SysRolePermissionService extends IService<SysRolePermission> {void addPermWithRoleId(SysRole sysRole);
      }

    • 实现类

      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.classes.mapper.SysRolePermissionMapper;
      import com.czxy.classes.service.SysRolePermissionService;
      import com.czxy.sys.SysRole;
      import com.czxy.sys.SysRolePermission;
      import org.springframework.stereotype.Service;
      import org.springframework.transaction.annotation.Transactional;
      ​
      /*** @author 桐叔* @email liangtong@itcast.cn* @description*/
      @Service
      @Transactional
      public class SysRolePermissionServiceImpl extends ServiceImpl<SysRolePermissionMapper, SysRolePermission> implements SysRolePermissionService {
      ​@Overridepublic void addPermWithRoleId(SysRole sysRole) {// 1 删除QueryWrapper<SysRolePermission> queryWrapper = new QueryWrapper<>();queryWrapper.eq("role_id", sysRole.getId());baseMapper.delete(queryWrapper);
      ​// 2 添加for (Integer permId : sysRole.getPermIds()) {SysRolePermission sysRolePermission = new SysRolePermission(sysRole.getId(), permId);baseMapper.insert(sysRolePermission);}}
      }
      ​

6.3.3 添加角色

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497751.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArrayList 和LinkedList的区别比较

前言 ‌ArrayList和LinkedList的主要区别在于它们的底层数据结构、性能特点以及适用场景。‌ArrayList和LinkedList从名字分析&#xff0c;他们一个是Array&#xff08;动态数组&#xff09;的数据结构&#xff0c;一个是Linked&#xff08;链表&#xff09;的数据结构&#x…

深度学习笔记(4)——视频理解

视频理解 视频理解的问题:视频太大了 解决方案:在切片上训练,低FPS,低分辨率 测试的时候:在不同的clips上运行模型,取平均预测结果 视频由图片序列组成: 单帧CNN模型 训练普通的2D CNN模型,对每一帧进行分类&#xff0c;通常是视频分类的一个非常强的基线方法。 Late Fusio…

前端项目 npm报错解决记录

1.首先尝试解决思路 npm报错就切换yarn &#xff0c; yarn报错就先切换npm删除 node_modules 跟 package-lock.json文件重新下载依 2. 报错信息&#xff1a; Module build failed: Error: Missing binding D:\vue-element-admin\node_modules\node-sass\vendor\win32-x64-8…

【AI大模型】探索GPT模型的奥秘:引领自然语言处理的新纪元

目录 &#x1f354; GPT介绍 &#x1f354; GPT的架构 &#x1f354; GPT训练过程 3.1 无监督的预训练语言模型 3.2 有监督的下游任务fine-tunning &#x1f354; 小结 学习目标 了解什么是GPT.掌握GPT的架构.掌握GPT的预训练任务. &#x1f354; GPT介绍 GPT是OpenAI公…

elasticsearch-java客户端jar包中各模块的应用梳理

最近使用elasticsearch-java客户端实现对elasticsearch服务的Api请求&#xff0c;现对elasticsearch-java客户端jar包中各模块的应用做个梳理。主要是对co.elastic.clients.elasticsearch路径下的各子包的简单说明。使用的版本为&#xff1a;co.elastic.clients:elasticsearch-…

前后端分离(前后端交互步骤)

1.设计数据库 /*Navicat Premium Data Transfer ​Source Server : localhost_3306Source Server Type : MySQLSource Server Version : 80037 (8.0.37)Source Host : localhost:3306Source Schema : studymysql ​Target Server Type : MySQL…

【VulnOSv2靶场渗透】

文章目录 一、基础信息 二、信息收集 三、漏洞探测 四、提权 一、基础信息 Kali IP: 192.168.20.146 靶机IP&#xff1a;192.168.20.152 二、信息收集 nmap -sS -sV -p- -A 192.168.20.152 开放了22、80、6667等端口 22端口&#xff1a;openssh 6.6.1p1 80端口&…

无需训练!多提示视频生成最新SOTA!港中文腾讯等发布DiTCtrl:基于MM-DiT架构

文章链接&#xff1a;https://arxiv.org/pdf/2412.18597 项目链接&#xff1a;https://github.com/TencentARC/DiTCtrl 亮点直击 DiTCtrl&#xff0c;这是一种基于MM-DiT架构的、首次无需调优的多提示视频生成方法。本文的方法结合了新颖的KV共享机制和隐混合策略&#xff0c;使…

SpringBoot对静态资源的映射规则

目录 什么是SpringBoot静态资源映射&#xff1f; 如何实现SpringBoot静态资源映射&#xff1f; 1. webjars&#xff1a;以jar包的方式引入静态资源 示例&#xff1a; 2. /** 访问当前项目的任何资源 示例一&#xff1a; 示例二&#xff1a; 3. 静态首页&#xff08;欢…

【EtherCATBasics】- KRTS C++示例精讲(2)

EtherCATBasics示例讲解 目录 EtherCATBasics示例讲解结构说明代码讲解 项目打开请查看【BaseFunction精讲】。 结构说明 EtherCATBasics&#xff1a;应用层程序&#xff0c;主要用于人机交互、数据显示、内核层数据交互等&#xff1b; EtherCATBasics.h &#xff1a; 数据定义…

【论文阅读】Reducing Activation Recomputation in Large Transformer Models

创新点&#xff1a; 针对Transformer结构&#xff0c;通过序列并行和选择性重计算激活值&#xff0c;在节省显存空间占用的情况下&#xff0c;不带来明显通信开销&#xff0c;同时减少重计算成本。 总的来说&#xff0c;就是在原有的张量并行的基础上&#xff0c;对LayerNorm和…

Linux arm 编译安装glibc-2.29

重要的话说三遍&#xff1a; &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;不要轻易自己去安装glibc&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;不要轻易自己去安装glibc&a…

STM32完全学习——FLASH上FATFS文件管理系统

一、需要移植的接口 我们通过看官网的手册&#xff0c;可以看到我们只要完成下面函数的实现&#xff0c;就可以完成移植。我们这里只移植前5个函数&#xff0c;获取时间的函数我们不在这里移植。 二、移植接口函数 DSTATUS disk_status (BYTE pdrv /* Physical drive nmuber…

Docker使用——国内Docker的安装办法

文章目录 参考资料前言Mac安装办法Homebrew 安装1. 直接下报错2. 安装homebrew&#xff0c; 用国内镜像3. 安装Docker4. 启动docker服务5. 测试是否安装成功 参考资料 鸣谢大佬文章。 macOS系统中&#xff1a;Docker的安装&#xff1a;https://blog.csdn.net/sulia1234567890…

Java-38 深入浅出 Spring - AOP切面增强 核心概念 相关术语 Proxy配置

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…

iOS 苹果开发者账号: 查看和添加设备UUID 及设备数量

参考链接&#xff1a;苹果开发者账号下添加新设备UUID - 简书 如果要添加新设备到 Profiles 证书里&#xff1a; 1.登录开发者中心 Sign In - Apple 2.找到证书设置&#xff1a; Certificate&#xff0c;Identifiers&Profiles > Profiles > 选择对应证书 edit &g…

【HENU】河南大学计院2024 计算机网络 期末复习知识点

和光同尘_我的个人主页 一直游到海水变蓝。 计网复习 第一章互联网组成类别交换方式分组交换的要点&#xff1a;分组交换的优点&#xff1a; 网络性能指标体系结构网络协议五层协议 第二章&#xff1a;物理层物理层的主要任务&#xff08;四大特性&#xff09;通信的三种方式…

Kafka中的Topic和Partition有什么关系?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka中的Topic和Partition有什么关系&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka中的Topic和Partition有什么关系&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Apache Kafka 中&#…

一文读懂变分自编码(VAE)

一文读懂变分自编码(VAE) 概述 变分自编码器&#xff08;Variational Autoencoder, VAE&#xff09;是一种生成模型&#xff0c;用于学习数据的潜在表示并生成与原始数据分布相似的新数据。它是一种概率模型&#xff0c;通过结合深度学习和变分推断的思想&#xff0c;解决了传…