当前位置: 首页 > news >正文

亿级高并发电商项目-- 实战篇 --万达商城项目 六(编写角色管理、用户权限(Spring Security认证授权)、管理员管理等模块)

  

  

专栏:高并发---前后端分布式 

👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者
📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人 

编写角色服务接口

接下来我们编写角色相关的CRUD方法,首先在通用模块编写角色服务接口:

public interface RoleService {// 新增角色void add(Role role);// 修改角色void update(Role role);// 删除角色void delete(Long id);// 根据id查询角色Role findById(Long id);// 查询所有角色List<Role> findAll();// 分页查询角色Page<Role> search(int page, int size);// 修改角色的权限void addPermissionToRole(Long rid, Long[] pids);
}

 编写角色Mapper

1、在管理员服务模块编写角色Mapper

public interface RoleMapper extends BaseMapper<Role> {// 根据id查询角色,包括权限Role findById(Long id);// 删除角色的所有权限void deleteRoleAllPermission(Long rid);// 删除用户_角色表的相关数据void deleteRoleAllAdmin(Long rid);// 给角色添加权限void addPermissionToRole(@Param("rid") Long rid, @Param("pid")Long pid);
}

 2、在 resources 中创建 RoleMapper 的同级包,编写映射文件 RoleMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ittxc.shopping_admin_service.mapper.RoleMapper"><resultMap id="roleMapper" type="com.itbaizhan.shopping_common.pojo.Role"><id property="rid" column="rid"></id><result property="roleName" column="roleName"></result><result property="roleDesc" column="roleDesc"></result><collection property="permissions" column="rid" ofType="com.itbaizhan.shopping_common.pojo.Permission"><id property="pid" column="pid"></id><result property="permissionName" column="permissionName"></result><result property="url" column="url"></result></collection></resultMap><select id="findById" parameterType="long" resultMap="roleMapper">SELECT *FROM bz_roleLEFT JOINbz_role_permissionON bz_role.rid = bz_role_permission.ridLEFT JOIN bz_permissionONbz_role_permission.pid = bz_permission.pidWHERE bz_role.rid = #{rid}</select><delete id="deleteRoleAllPermission" parameterType="long">DELETEFROM bz_role_permissionWHERE rid = #{rid}</delete><delete id="deleteRoleAllAdmin" parameterType="long">DELETEFROM bz_admin_rolewhere rid = #{rid}</delete><insert id="addPermissionToRole">INSERT INTO bz_role_permissionVALUES (#{rid}, #{pid});</insert>
</mapper>

 编写角色服务实现类

管理员服务模块编写角色服务实现类

@DubboService
public class RoleServiceImpl implements RoleService {@Autowiredprivate RoleMapper roleMapper;@Overridepublic void add(Role role) {roleMapper.insert(role);}@Overridepublic void update(Role role) {roleMapper.updateById(role);}@Overridepublic void delete(Long id) {// 删除角色roleMapper.deleteById(id);// 删除角色的所有权限roleMapper.deleteRoleAllPermission(id);// 删除用户_角色中间表的相关数据roleMapper.deleteRoleAllAdmin(id);}@Overridepublic Role findById(Long id) {return roleMapper.findById(id);}@Overridepublic List<Role> findAll() {return roleMapper.selectList(null);}@Overridepublic Page<Role> search(int page, int size) {return roleMapper.selectPage(new Page(page,size),null);}@Overridepublic void addPermissionToRole(Long rid, Long[] pids) {// 删除角色的所有权限roleMapper.deleteRoleAllPermission(rid);// 给角色添加权限for (Long pid : pids) {roleMapper.addPermissionToRole(rid,pid);}}
}

编写角色控制器

后台管理Api模块编写角色控制器:

/**
* 后台角色
*/
@RestController
@RequestMapping("/role")
public class RoleController {@DubboReferenceprivate RoleService roleService;/*** 新增角色** @param role 角色对象* @return 执行结果*/@PostMapping("/add")public BaseResult add(@RequestBody Role role) {roleService.add(role);return BaseResult.ok();}/*** 修改角色** @param role 角色对象* @return 执行结果*/@PutMapping("/update")public BaseResult update(@RequestBody Role role) {roleService.update(role);return BaseResult.ok();}/*** 删除角色** @param rid 角色id* @return 执行结果*/@DeleteMapping("/delete")public BaseResult delete(Long rid) {roleService.delete(rid);return BaseResult.ok();}/*** 根据id查询角色** @param rid* @return 查询到的角色*/@GetMapping("/findById")public BaseResult<Role> findById(Long rid) {Role role = roleService.findById(rid);return BaseResult.ok(role);}/*** 分页查询角色** @param page 页码* @param size 每页条数* @return 查询结果*/@GetMapping("/search")public BaseResult<Page<Role>> search(int page, int size) {Page<Role> page1 = roleService.search(page, size);return BaseResult.ok(page1);}/*** 查询所有角色* @return 查询结果*/@GetMapping("/findAll")public BaseResult<List<Role>> findAll() {List<Role> all = roleService.findAll();return BaseResult.ok(all);}/*** 修改角色的权限** @param rid 角色id* @param pids 权限id* @return 执行结果*/@PutMapping("/updatePermissionToRole")public BaseResult updatePermissionToRole(Long rid, Long[] pids) {roleService.addPermissionToRole(rid,pids);return BaseResult.ok();}
}

 启动服务,测试角色控制器方法

编写权限服务接口

接下来我们编写权限相关的CRUD方法,首先在通用模块编写权限服务接口:

public interface PermissionService {// 新增权限void add(Permission permission);// 修改权限void update(Permission permission);// 删除权限void delete(Long id);// 根据id查询权限Permission findById(Long id);// 分页查询权限Page<Permission> search(int page, int size);// 查询所有权限List<Permission> findAll();
}

编写权限Mapper

1、在管理员服务模块编写权限Mapper

public interface PermissionMapper extends BaseMapper<Permission> {// 删除角色_权限表中的相关数据void deletePermissionAllRole(Long pid)
}

 2、编写权限Mapper映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ittxc.shopping_admin_service.mapper.PermissionMapper"><delete id="deletePermissionAllRole" parameterType="long">DELETEFROM bz_role_permissionWHERE pid = #{pid}</delete>
</mapper>

编写权限服务实现类

管理员服务模块编写权限服务实现类 

@DubboService
public class PermissionServiceImpl implements PermissionService {@Autowiredprivate PermissionMapper permissionMapper;@Overridepublic void add(Permission permission) {permissionMapper.insert(permission);}@Overridepublic void update(Permission permission) {permissionMapper.updateById(permission);}@Overridepublic void delete(Long id) {// 删除权限permissionMapper.deleteById(id);// 删除角色_权限表中的相关数据permissionMapper.deletePermissionAllRole(id);}@Overridepublic Permission findById(Long id) {return permissionMapper.selectById(id);}@Overridepublic Page<Permission> search(int page, int size) {return permissionMapper.selectPage(new Page(page,size),null);}@Overridepublic List<Permission> findAll() {return permissionMapper.selectList(null);}
}

 编写权限控制器

后台管理Api模块编写权限控制器:

/**
* 后台权限
*/
@RestController
@RequestMapping("/permission")
public class PermissionController {@DubboReferenceprivate PermissionService permissionService;/*** 新增权限* @param permission 权限对象* @return 执行结果*/@PostMapping("/add")public BaseResult add(@RequestBody Permission permission){permissionService.add(permission);return BaseResult.ok();}/*** 修改权限* @param permission 权限对象* @return 执行结果*/@PutMapping("/update")public BaseResult update(@RequestBody Permission permission){permissionService.update(permission);return BaseResult.ok();}/*** 删除权限* @param pid 权限id* @return 执行结果*/@DeleteMapping("/delete")public BaseResult delete(Long pid){permissionService.delete(pid);return BaseResult.ok();}/*** 根据id查询权限* @param pid 权限id* @return 查询结果*/@GetMapping("/findById")public BaseResult<Permission> findById(Long pid){Permission permission = permissionService.findById(pid);return BaseResult.ok(permission);}/*** 分页查询权限* @param page 页面* @param size 每页条数* @return 查询结果*/@GetMapping("/search")public BaseResult<Page<Permission>> search(int page,int size){Page<Permission> permissionPage = permissionService.search(page, size);return BaseResult.ok(permissionPage);}/*** 查询所有权限* @return 所有权限*/@GetMapping("/findAll")public BaseResult<List<Permission>> findAll(){List<Permission> all = permissionService.findAll();return BaseResult.ok(all);}
}

 启动服务,测试权限控制器方法

编写Security处理器

接下来我们使用Spring Security编写管理员认证和授权功能。 Spring Security在访问接口时进行认证和授权,所以Spring Security的相关代码编写在管理员API模块。 之前使用Spring Security时,登录后会配置跳转页面。但百战商城 是前后端分离项目,所有认证和授权的结果,只是返回json字符串 让前端去处理。所以我们要创建 认证成功处理器 、 认证失败处理器 、 未登录处理 器 、 权限不足处理器 、 登出成功处理器 处理不同的结果,Spring Security通过 实现接口编写结果处理器。

1、在管理员API模块引入Spring Security的依赖 

<!-- spring security -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

2、编写认证成功、认证失败处理器

// 登录成功处理器
public class MyLoginSuccessHandler
implements AuthenticationSuccessHandler {@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,Authentication authentication) throws IOException, ServletException {response.setContentType("text/json;charset=utf-8");BaseResult result = new BaseResult(200, "登录成功", null);response.getWriter().write(JSON.toJSONString(result));}
}
// 登录失败处理器
public class MyLoginFailureHandler implements AuthenticationFailureHandler {@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {response.setContentType("text/json;charset=utf-8");BaseResult result = new BaseResult(402, "用户名或密码错误", null);response.getWriter().write(JSON.toJSONString(result));}
}

3、编写未登录处理器

// 未登录处理器
public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {@Overridepublic void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {response.setContentType("text/json;charset=utf-8");BaseResult result = new BaseResult(401, "用户名未登录", null);response.getWriter().write(JSON.toJSONString(result));}
}

4、编写权限不足处理器

// 权限不足处理器
public class MyAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response,AccessDeniedException accessDeniedException) throws IOException, ServletException {response.setContentType("text/json;charset=utf-8");BaseResult result = new BaseResult(403, "权限不足", null);response.getWriter().write(JSON.toJSONString(result));}
}

5、编写登出成功处理器

// 登出成功处理器
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {@Overridepublic void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response,Authentication authentication) throws IOException, ServletException {response.setContentType("text/json;charset=utf-8");BaseResult result = new BaseResult(200, "注销成功", null);response.getWriter().write(JSON.toJSONString(result));}
}

编写Security配置类

后台管理API模块编写Spring Security配置类

// Security配置类
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {// Spring Security配置@Overrideprotected void configure(HttpSecurity http) throws Exception {// 自定义表单登录http.formLogin().usernameParameter("username") // 用户名项.passwordParameter("password") // 密码项.loginProcessingUrl("/admin/login") // 登录提交路径.successHandler(new MyLoginSuccessHandler()) // 登录成功处理器.failureHandler(new MyLoginFailureHandler()); // 登录失败处理器// 权限拦截配置http.authorizeRequests().antMatchers("/login").permitAll() // 登录页不需要认证.antMatchers("/admin/login").permitAll() //登录请求不需要认证.anyRequest().authenticated(); // 其余请求都需要认证// 退出登录配置http.logout().logoutUrl("/admin/logout")// 注销的路径.logoutSuccessHandler(new MyLogoutSuccessHandler()) // 登出成功处理器.clearAuthentication(true)// 清除认证数据.invalidateHttpSession(true);  // 清除session// 异常处理http.exceptionHandling().authenticationEntryPoint(new MyAuthenticationEntryPoint()) // 未登录处理器.accessDeniedHandler(new MyAccessDeniedHandler()); // 权限不足处理器// 关闭csrf防护http.csrf().disable();// 开启跨域访问http.cors();}@Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}
}

编写认证授权相关的服务方法

1、在管理员服务接口添加 根据用户名查询管理员根据用户名查询权限 方法

// 根据名字查询管理员
Admin findByAdminName(String username);
// 根据名字查询管理员所有权限
List<Permission> findAllPermission(String username);

 2、在管理员服务模块编写管理员Mapper

// 根据管理员名查询权限
List<Permission> findAllPermission(String username);

编写AdminMapper.xml

<select id="findAllPermission" resultType="com.itbaizhan.shopping_pojo.pojo.Permission" parameterType="string">SELECTDISTINCT bz_permission.*FROMbz_adminLEFT JOIN bz_admin_roleON bz_admin.aid =bz_admin_role.aidLEFT JOIN bz_roleON bz_admin_role.rid = bz_role.ridLEFT JOIN bz_role_permissionON bz_role.rid = bz_role_permission.ridLEFT JOIN bz_permissionONbz_role_permission.pid = bz_permission.pidWHERE bz_admin.username = #{username}
</select>

3、在管理员服务模块编写管理员服务接口实现类

@Override
public Admin findByAdminName(String username) {QueryWrapper<Admin> wrapper = new QueryWrapper();wrapper.eq("username", username);Admin admin = adminMapper.selectOne(wrapper);return admin;
}
@Override
public List<Permission> findAllPermission(String username) {return adminMapper.findAllPermission(username);
}

编写认证授权逻辑

后台管理API模块编写认证和授权逻辑

@Service
public class MyUserDetailService implements
UserDetailsService {@DubboReferenceprivate AdminService adminService;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// 1.认证Admin admin = adminService.findByAdminName(username);if(admin == null){throw new UsernameNotFoundException("用户不存在");}// 2.授权List<Permission> permissions = adminService.findAllPermission(username);List<GrantedAuthority> grantedAuthorities = new ArrayList<>();for (Permission permission : permissions) {grantedAuthorities.add(new SimpleGrantedAuthority(permission.getUrl()));}// 3.封装为UserDetails对象UserDetails userDetails = User.withUsername(admin.getUsername()).password(admin.getPassword()).authorities(grantedAuthorities).build();// 4.返回封装好的UserDetails对象return userDetails;}
}

编写接口鉴权配置

我们要对接口进行鉴权配置,即用户拥有权限才能访问接口。

1、开启鉴权配置注解

// Security配置类
@Configuration
// 开启鉴权配置注解
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter{}

2、在需要鉴权的接口上方添加鉴权注解

/*** 分页查询管理员* @param page 页码* @param size 每天条数* @return 查询结果*/
@GetMapping("/search")
@PreAuthorize("hasAnyAuthority('/admin/all')")
public BaseResult<Page<Admin>> search(int page, int size){
Page<Admin> adminPage = adminService.search(page, size);return BaseResult.ok(adminPage);
}
/*** 分页查询角色* @param page 页码* @param size 每页条数* @return 查询结果*/
@GetMapping("/search")
@PreAuthorize("hasAnyAuthority('/role/all')")
public BaseResult<Page<Role>> search(int page, int size){Page<Role> rolePage = roleService.search(page, size);return BaseResult.ok(rolePage);
}

3、使用不同权限的用户登录,查看他们是否能访问这些接口

测试时,当用户权限不足时,系统会抛出500异常,这是由于全 局异常处理器先处理了异常,使得异常没有交由 AccessDeniedHandler 。此时我们需要在管理员API模块添加异常处理 器,当捕获到 AccessDeniedException 异常时,直接抛出,此时异常就 会交给 AccessDeniedHandler 处理。

// 统一异常处理器
@RestControllerAdvice
public class AccessDeniedExceptionHandler
{// 处理权限不足异常,捕获到异常后再次抛出,交给 AccessDeniedHandler处理@ExceptionHandler(AccessDeniedException.class)public void defaultExceptionHandler(AccessDeniedException e) throws AccessDeniedException{throw e;}
}

 修改新增/修改管理员方法

接下来修改新增用户和修改用户方法,对密码进行加密:

@RestController
@RequestMapping("/admin")
public class AdminController {@Autowiredprivate PasswordEncoder encoder;/*** 新增管理员* @param admin 管理员对象* @return 执行结果*/@PostMapping("/add")public BaseResult add(@RequestBody Admin admin) {String password = admin.getPassword();password = encoder.encode(password);admin.setPassword(password);adminService.add(admin);return BaseResult.ok();}/*** 修改管理员* @param admin 管理员对象* @return 执行结果*/@PutMapping("/update")public BaseResult update(@RequestBody Admin admin) {String password = admin.getPassword();if (StringUtils.hasText(password)){// 密码不为空加密password = encoder.encode(password);admin.setPassword(password);}adminService.update(admin);return BaseResult.ok();}
}
@DubboService
public class AdminServiceImpl implements
AdminService {@Overridepublic void update(Admin admin) {// 如果前端传来空密码,则密码还是原来的密码if(!StringUtils.hasText(admin.getPassword())){// 查询原来的密码String password = adminMapper.selectById(admin.getAid()).getPassword();admin.setPassword(password);}adminMapper.updateById(admin);}
}

编写获取登录管理员名方法

/**
* 获取登录管理员名
*
* @return 管理员名
*/
@GetMapping("/getUsername")
public BaseResult<String> getUsername() {// 1.获取会话对象SecurityContext context = SecurityContextHolder.getContext();// 2.获取认证对象Authentication authentication = context.getAuthentication();// 3.获取登录用户信息UserDetails userDetails = (UserDetails)authentication.getPrincipal();String username = userDetails.getUsername();return BaseResult.ok(username);
}

相关文章:

亿级高并发电商项目-- 实战篇 --万达商城项目 六(编写角色管理、用户权限(Spring Security认证授权)、管理员管理等模块)

专栏&#xff1a;高并发---前后端分布式 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信…...

博视像元获近5000万元融资,主攻半导体前道及锂电高端部件供应

这两年各大车企与电池厂商都在快速新建产能&#xff0c;尤其上游原材料成本大增&#xff0c;反映到产业链上巨头都在寻求增效&#xff0c;高端制造技术投入也大幅增长。比如这家&#xff0c;高端工业相机提供商「博视像元」近期宣布完成近5000万的天使加轮融资&#xff0c;投资…...

SpringCloud-断路器Hystrix

一、降级使用1、添加依赖<!--hystrix--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>2、启动类添加注解EnableCircuitBreakerSpringBoot…...

JavaScript精简笔记

文章目录基础语法函数1.1、函数的使用预解析对象1.1、创建对象基础语法 函数 1.1、函数的使用 函数在使用时分为两步&#xff1a;声明函数和调用函数 ①声明函数 //声明函数 function 函数名(){//函数体代码 }function 是声明函数的关键字,必须小写由于函数一般是为了实现…...

MySQL常用函数汇总

1 MySQL 字符串函数函数描述实例ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。返回 CustomerName 字段第一个字母的 ASCII 码&#xff1a;SELECT ASCII(CustomerName) AS NumCodeOfFirstCharFROM Customers;CHAR_LENGTH(s)返回字符串 s 的字符数返回字符串 RUNOOB 的字符数S…...

100M网口客户电脑插上网线就断线,自己工厂正常,是什么问题导致?

Hqst&#xff08;华强盛科技&#xff09;导读&#xff1a;物联工程师100M网口产品出现客户电脑插上网线就显示断线&#xff0c;无法通信&#xff0c;在自己工厂又正常使用&#xff0c;是什么问题&#xff1f;问&#xff1a;100M 网口&#xff0c; 使用改电路&#xff0c; 产品出…...

从零开始学习无人机 00 硬件配置

遥控器 型号 乐迪Radiolink AT9S Pro 固件更新 对遥控器固件作更新 乐迪Radiolink AT9S Pro 固件更新 光流传感器 型号 思动智能ThoneFlow-3901U 开发文档 Pmw3901光流传感器PX4开发文档 距离传感器 型号 空循环Nooploop TOFSense-F Pro 开发文档 TOFSense-F官方…...

免翻在Chrome上使用新必应(New Bing)聊天机器人

这里不讲如何加入New Bing内测 文章目录免翻使用New Bing用Chrome(非Edge)使用新必应聊天机器人免翻使用New Bing 第一个是免翻&#xff0c;需要一个浏览器插件Header Editor&#xff0c;扩展商店或者百度自行下载安装吧。打开该插件&#xff0c;添加一个规则 为方便填写&…...

LA@特征值和特征向量

文章目录特征值和特征向量例例求解方阵的特征值和特征向量&#x1f388;特征多项式特征方程方阵特征值和特征向量的性质证明推论衍生特征值更一般的转置和特征值其他结论(方阵多项式的特征值与方阵本身特征值的关系)特征向量线性相关性特征值和特征向量 许多定量分析模型中,常常…...

transpose代码学习

论文&#xff1a;TransPose: Keypoint Localization via Transformer Sen Yang Zhibin Quan Mu Nie Wankou Yang* School of Automation, Southeast University, Nanjing 210096, China {yangsenius, 101101872, niemu, wkyang}seu.edu.cn 下载地址&#xff1a;https://arxiv.o…...

【Redis】Redis 常用数据类型操作 ② ( 数据库操作 | 切换数据库 | 查询当前数据库键个数 | 清空当前数据库 | 清空所有数据库 )

文章目录一、Redis 数据库操作1、切换数据库2、查询当前数据库键个数3、清空当前数据库4、清空所有数据库一、Redis 数据库操作 在之前的博客 【Redis】Redis 数据库 安装、配置、访问 ( Redis 简介 | 下载 Redis 安装包 | 安装 Redis 数据库 | 命令行访问 Redis | 使用可视化工…...

最简单的物体识别例子

第一步下载百度EASYDL工具。 网址EasyDL 图像 然后下载本地训练工具包&#xff1a; 本地下载&#xff0c;运行。 首先创建数据集&#xff0c; 完成&#xff0c;创建目标任务。 选择物体检测创建任务 选择训练&#xff0c;将数据集引入 通用型小型设备SDK 选择这个可以本地直…...

指针——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰学习的内容是指针&#xff0c;这次只会讲一些很简单的知识点&#xff0c;更详细的指针知识会在以后的博客中逐步剖析清楚&#xff0c;那么现在&#xff0c;就让我们进入指针的世界吧 指针是什么 指针和指针类型 野指…...

学习 Linux 内核书籍推荐

原文链接&#xff0c;欢迎关注&#xff1a; 你为什么学习 Linux 内核&#xff1f; - CodeAllen的回答 - 知乎 https://www.zhihu.com/question/31369673/answer/2894981254 主要是工作需要&#xff0c;其实对于我自己的工作来说&#xff0c;在Linux开发的具体业务和算法才是重…...

深圳硬件黑客松活动,开放报名!

开源社KAIYUANSHE近期微信公众号订阅功能做调整啦&#xff01;没有被星标的账号在信息流里可能不显示大图了&#xff01;快星标⭐我们&#xff0c;就可以及时看到发布的文章啦&#xff01;STEP01 点击右上角标志STEP02 点击【设为星标】近年来&#xff0c;创客文化越来越受到人…...

力扣sql简单篇练习(十七)

力扣sql简单篇练习(十七) 1 销售分析| 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 可以考虑使用all函数 SELECT seller_id FROM Sales GROUP BY seller_id HAVING sum(price)>all(SELECT sum(price)FROM SalesGROUP BY seller_id )1.3 运行…...

Linux网络技术学习(六)—— 网络设备初始化(II)

文章目录初始化选项模块选项设备处理层初始化&#xff1a;net_dev_init用户空间辅助程序kmod解析热插拔虚拟设备虚拟设备范例通过/proc文件系统调整初始化选项 内核内建的组件以及模块加载的组件都能输入参数&#xff0c;使用户调整组件所实现的功能、重写默认值等 模块选项&…...

一手教你如何搭建Hadoop基于Zookeeper的集群(5台主机)

文章目录一、设计集群图二、准备五台虚拟机2.1、下载安装文件2.2、创建虚拟机2.3、配置网络2.4、修改主机名称2.5、关闭防火墙2.6、同步时间2.7、设置/etc/hosts文件2.8、设置免密登录2.9、为后面可以主备替换安装psmisc三、安装JDK3.1、安装jdk3.2、测试jdk是否安装成功3.3、将…...

Spring Cloud是什么?怎么理解Spring Cloud?

简介Spring Cloud项目的官方网址&#xff1a;https://projects.spring.io/spring-cloud/ Spring Cloud 并不是一个项目&#xff0c;而是一组项目的集合。在 Spring Cloud中包含了很多的子项目&#xff0c;每一个子项目都是一种微服务开发过程中遇到的问题的一种解决方案。它利…...

robotframework + selenium自动化测试常见的问题

1、 插入中文数据提示 FAIL UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 92-107: ordinal not in range(25 DataBaseLibrary插入中文乱码的解决&#xff1a;修改D:\Python27\Lib\site-packages\DatabaseLibrary\connection_manager.py里的co…...

2023春招java面试题及答案

2023春招java面试题及答案总结1.以下Dubbo服务负载均衡策略中&#xff0c;哪一个策略的功能是相同参数的请求总是发到同一个提供者&#xff08;&#xff09;2.如下代码&#xff1a;请问编译运行的结果是什么&#xff1f;3.给出如下代码&#xff1a;请问编译运行的结果是什么&am…...

QT+OpenGL光照

QTOpenGL光照 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 颜色 现实生活中看到的物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的颜色 太阳光能被看见的白光是多找演的的组合…...

OpenCV-PyQT项目实战(7)项目案例03:鼠标框选

欢迎关注『OpenCV-PyQT项目实战 Youcans』系列&#xff0c;持续更新中 OpenCV-PyQT项目实战&#xff08;1&#xff09;安装与环境配置 OpenCV-PyQT项目实战&#xff08;2&#xff09;QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战&#xff08;3&#xff09;信号与槽机制 …...

vue2版本《后台管理模式》(上)

后台管理模式项目开发经验总结如下&#xff0c;希望对你们有些帮助&#xff1a; 文章目录一、app 出口位置二 、 index.js 路由配置三、package.json 文件四、 main.js 既然安装插件那就需要引入五、 跨域问题总结首先需要一个完整的v2版本的项目 vue2版本思路&#xff1a;首先…...

C++与C基础重叠部分

Cmake CPP程序开发过程 计算机硬件—>机器语言—>汇编—>cppcpp—>机器(gcc)Make(makefile)—>本地智能批处理翻译机制Cmake—>跨平台生成不同设备上的makefile进行执行 Cpp基础学习 基本知识 基本格式 #include<iostream> using namespace std;…...

神经网络基础部件-卷积层详解

前言 在全连接层构成的多层感知机网络中&#xff0c;我们要通过将图像数据展平成一维向量来送入模型&#xff0c;但这会忽略了每个图像的空间结构信息。理想的策略应该是要利用相近像素之间的相互关联性&#xff0c;将图像数据二维矩阵送给模型中学习。 卷积神经网络(convolu…...

【计算机网络】HTTPS协议原理

文章目录一、认识HTTPS协议二、为什么要发明HTTPS三、HTTP与HTTPS的区别四、常见的加密方式1. 对称加密2. 非对称加密3. 数据摘要4. 数字签名五、HTTPS的原理探究方案1&#xff1a;只使用对称加密方案2&#xff1a;只使用非对称加密方案3&#xff1a;双方都使用非对称加密方案4…...

21岁,华科博士在读,我的赛事Top经验

Datawhale干货 作者&#xff1a;vaew&#xff0c;华中科技大学&#xff0c;博士二年级在读简介笔者vaew&#xff0c;21岁&#xff0c;现为华中科技大学机械科学与工程学院陶波教授课题组博士二年级学生。主要研究方向是基于视触融合的机器人灵巧操作。学业之余的研究兴趣包括图…...

基于ThinkPHP6.0+Vue+uni-app的多商户商城系统好用吗?

likeshop多商户商城系统适用于B2B2C、多商户、商家入驻、平台商城场景。完美契合平台自营联营加盟等多种经营方式使用&#xff0c;系统拥有丰富的营销玩法&#xff0c;强大的分销能力&#xff0c;支持官方旗舰店&#xff0c;商家入驻&#xff0c;平台抽佣商家独立结算&#xff…...

Linux中断

文章目录 前言一、Linux 中断介绍二、中断上文和中断下文三、中断相关函数1 获取中断号相关函数2.申请中断3.释放中断4.中断处理函数四.中断下文之 tasklet1.概念2.Linux 内核中的 tasklet 结构体:3.使用步骤4.相关函数a.初始化 tasklet结构体b.调度 taskletc.杀死 tasklet总结…...

做算命网站赚钱吗/商品热搜词排行榜

Loadrunner在场景中添加多个负载机报错&#xff1a;Action.c(38): Error -26488: Could not obtain information about submitted解决方法参考文章&#xff1a; &#xff08;1&#xff09;Loadrunner在场景中添加多个负载机报错&#xff1a;Action.c(38): Error -26488: Could…...

做网络推广自己建网站/品牌推广策划方案怎么写

2333213...

wordpress 发布脚本/给公司做网站要多少钱

Mitchell J. Feigenbaum洛克菲勒大学数学物理实验室 Toyota 教授美国纽约获奖原因&#xff1a;混沌理论和非线性领域的先驱&#xff0c;发现了费根鲍姆常数Rashid A. Sunyaev1982-2002 年担任莫斯科俄罗斯科学院空间研究所高能天体物理系主任&#xff0c;并于 1992 年开始担任首…...

百色网站建设/优化设计七年级下册语文答案

有限单群(有限群G只有两个平凡的正规子群,定义和素数很像) 当G的子群H是正规子群时&#xff0c;则可考虑G模H的商群&#xff0c;H不是正规子群做商只能得到陪集&#xff0c;不是群 G为有限交换群&#xff1a; 则G是单群iff G的阶为P &#xff08;结合之前的结论素数阶群一定是…...

江苏网站建设多少钱/网站运营

简介 SymPy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统&#xff0c;同时保持代码简 洁、易于理解和扩展。它完全由Python写成&#xff0c;不依赖于外部库。SymPy支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何…...

地方网站不让做吗/智慧营销系统平台

其它说明&#xff1a;windows2000下IIS安装和Windows2003下IIS安装可以参照该教程&#xff0c;大同小异 安装步骤&#xff1a; 1、插入windows xp安装光盘&#xff0c;打开控制面板&#xff0c;然后打开其中的“添加/删除程序” 2、在添加或删除程序窗口左边点击“添加…...