角色模块开发

news2025/1/16 14:51:48

文章目录

  • 🌞 Sun Frame:SpringBoot 的轻量级开发框架(个人开源项目推荐)
    • 🌟 亮点功能
    • 📦 spring cloud模块概览
      • 常用工具
    • 🔗 更多信息
    • 1.easycode生成基础代码
        • 1.配置
        • 2.将dao层代码剪切到mapper层
        • 3.AuthRole.java使用lombok优化
        • 4.AuthRoleDao.java 删除Pageable
        • 5.AuthRoleService.java 删除分页查询接口
        • 6.AuthRoleServiceImpl.java 删除分页查询实现类
    • 2.新增角色
        • 1.编写DTO和BO以及基础转换器
          • 1.sun-club-auth-application-controller模块
            • 1.AuthRoleDTO.java
            • 2.AuthRoleDTOConverter.java
          • 2.sun-club-auth-domain模块
            • 1.AuthRoleBO.java
            • 2.AuthRoleBOConverter.java
        • 2.sun-club-auth-application-controller
          • 1.RoleController.java
        • 3.sun-club-auth-domain
          • 1.AuthRoleDomainService.java
          • 2.AuthRoleDomainServiceImpl.java
        • 4.sun-club-auth-infra
          • 1.AuthRoleService.java
          • 2.AuthRoleServiceImpl.java
        • 5.测试
          • 1.接口设计
          • 2.测试
    • 3.更新角色
        • 1.sun-club-auth-application-controller
          • 1.RoleController.java
        • 2.sun-club-auth-domain
          • 1.AuthRoleDomainService.java
          • 2.AuthRoleDomainServiceImpl.java
        • 3.sun-club-auth-infra
          • 1.AuthRoleService.java
          • 2.AuthRoleServiceImpl.java
        • 4.测试
          • 1.接口设计
          • 2.测试
    • 4.删除角色
        • 1.sun-club-auth-application-controller
          • 1.RoleController.java
        • 2.sun-club-auth-domain
          • 1.AuthRoleDomainService.java
          • 2.AuthRoleDomainServiceImpl.java
        • 3.测试
          • 1.接口设计
          • 2.测试
    • 5.用户角色关联
        • 1.easycode生成用户-角色关联表代码
          • 1.配置
          • 2.将AuthUserRoleDao.java从dao移动到mapper
          • 3.AuthUserRole.java 使用lombok简化
          • 4.AuthUserRoleDao.java删除Pageable
          • 5.AuthUserRoleService.java删除分页查询接口
          • 6.AuthUserRoleServiceImpl.java删除分页查询实现
        • 2.sun-club-auth-domain
          • 1.AuthConstant.java
          • 2.AuthUserDomainServiceImpl.java 新增逻辑,进行用户和角色关联
          • 3.AuthRoleDao.xml 添加selectKey逻辑,插入后将id返回
        • 3.测试

🌞 Sun Frame:SpringBoot 的轻量级开发框架(个人开源项目推荐)

Sun Frame Banner

轻松高效的现代化开发体验

Sun Frame 是我个人开源的一款基于 SpringBoot 的轻量级框架,专为中小型企业设计。它提供了一种快速、简单且易于扩展的开发方式。

我们的开发文档记录了整个项目从0到1的任何细节,实属不易,请给我们一个Star!🌟
您的支持是我们持续改进的动力。

🌟 亮点功能

  • 组件化开发:灵活选择,简化流程。
  • 高性能:通过异步日志和 Redis 缓存提升性能。
  • 易扩展:支持多种数据库和消息队列。

📦 spring cloud模块概览

  • Nacos 服务:高效的服务注册与发现。
  • Feign 远程调用:简化服务间通信。
  • 强大网关:路由与限流。

常用工具

  • 日志管理:异步处理与链路追踪。
  • Redis 集成:支持分布式锁与缓存。
  • Swagger 文档:便捷的 API 入口。
  • 测试支持:SpringBoot-Test 集成。
  • EasyCode:自定义EasyCode模板引擎,一键生成CRUD。

🔗 更多信息

  • 开源地址:Gitee Sun Frame
  • 详细文档:语雀文档
    在这里插入图片描述

1.easycode生成基础代码

1.配置

image-20240606143040423

2.将dao层代码剪切到mapper层

image-20240606143234619

3.AuthRole.java使用lombok优化

image-20240606143432735

4.AuthRoleDao.java 删除Pageable

image-20240606143634478

5.AuthRoleService.java 删除分页查询接口
6.AuthRoleServiceImpl.java 删除分页查询实现类

2.新增角色

1.编写DTO和BO以及基础转换器
1.sun-club-auth-application-controller模块
1.AuthRoleDTO.java
package com.sunxiansheng.auth.application.dto;

import lombok.Data;

import java.io.Serializable;

/**
 * (AuthRole)dto
 *
 * @author makejava
 * @since 2024-06-06 14:30:38
 */
@Data
public class AuthRoleDTO implements Serializable {

    private Long id;
    /**
     * 角色名称
     */
    private String roleName;
    /**
     * 角色唯一标识
     */
    private String roleKey;

    /**
     * 是否被删除 0未删除 1已删除
     */
    private Integer isDeleted;

}
2.AuthRoleDTOConverter.java
package com.sunxiansheng.auth.application.convert;

import com.sunxiansheng.auth.application.dto.AuthRoleDTO;
import com.sunxiansheng.auth.domain.entity.AuthRoleBO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * Description: DTO转换
 * @Author sun
 * @Create 2024/6/5 15:39
 * @Version 1.0
 */
@Mapper
public interface AuthRoleDTOConverter {
    AuthRoleDTOConverter INSTANCE = Mappers.getMapper(AuthRoleDTOConverter.class);

    // 将DTO转换为BO
    AuthRoleBO convertDTO2BO(AuthRoleDTO authRoleDTO);
    // 将BO转换为DTO
    AuthRoleDTO convertBO2DTO(AuthRoleBO authRoleBO);
    // 将DTO集合转换为BO集合
    List<AuthRoleBO> convertDTOList2BOList(List<AuthRoleDTO> authRoleDTOList);
    // 将BO集合转换为DTO集合
    List<AuthRoleDTO> convertBOList2DTOList(List<AuthRoleBO> authRoleBOList);
}
2.sun-club-auth-domain模块
1.AuthRoleBO.java
package com.sunxiansheng.auth.domain.entity;

import lombok.Data;

import java.io.Serializable;

/**
 * (AuthRole)bo
 *
 * @author makejava
 * @since 2024-06-06 14:30:38
 */
@Data
public class AuthRoleBO implements Serializable {

    private Long id;
    /**
     * 角色名称
     */
    private String roleName;
    /**
     * 角色唯一标识
     */
    private String roleKey;

    /**
     * 是否被删除 0未删除 1已删除
     */
    private Integer isDeleted;

}
2.AuthRoleBOConverter.java
package com.sunxiansheng.auth.domain.convert;

import com.sunxiansheng.auth.basic.entity.AuthRole;
import com.sunxiansheng.auth.domain.entity.AuthRoleBO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * Description: BO转换
 * @Author sun
 * @Create 2024/5/24 9:18
 * @Version 1.0
 */
@Mapper // mapstruct的注解
public interface AuthRoleBOConverter {

    AuthRoleBOConverter INSTANCE = Mappers.getMapper(AuthRoleBOConverter.class);

    // 将BO转换Entity
    AuthRole convertBO2Entity(AuthRoleBO authRoleBO);
    // 将Entity转换BO
    AuthRoleBO convertEntity2BO(AuthRole authRole);
    // 将BO集合转换Entity集合
    List<AuthRole> convertBOList2EntityList(List<AuthRoleBO> authRoleBOList);
    // 将Entity集合转换BO集合
    List<AuthRoleBO> convertEntityList2BOList(List<AuthRole> authRoleList);

}
2.sun-club-auth-application-controller
1.RoleController.java
package com.sunxiansheng.auth.application.controller;

import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import com.sunxiansheng.auth.application.convert.AuthRoleDTOConverter;
import com.sunxiansheng.auth.application.dto.AuthRoleDTO;
import com.sunxiansheng.auth.common.eneity.Result;
import com.sunxiansheng.auth.domain.entity.AuthRoleBO;
import com.sunxiansheng.auth.domain.service.AuthRoleDomainService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
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;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/2 17:25
 * @Version 1.0
 */
@RestController
@RequestMapping("/role/")
@Slf4j
public class RoleController {

    @Resource
    private AuthRoleDomainService authRoleDomainService;

    /**
     * 新增角色
     * @param authRoleDTO
     * @return
     */
    @RequestMapping("add")
    public Result<Boolean> add(@RequestBody AuthRoleDTO authRoleDTO) {
        try {
            // 日志
            if (log.isInfoEnabled()) {
                log.info("RoleController add AuthRoleDTO, authRoleDTO:{}", JSON.toJSONString(authRoleDTO));
            }
            // 参数校验
            Preconditions.checkArgument(!StringUtils.isBlank(authRoleDTO.getRoleKey()), "角色唯一标识不能为空");
            Preconditions.checkArgument(!StringUtils.isBlank(authRoleDTO.getRoleName()), "角色名称不能为空");
            // 转换DTO为BO
            AuthRoleBO authRoleBO = AuthRoleDTOConverter.INSTANCE.convertDTO2BO(authRoleDTO);
            // 调用领域服务
            // 新增角色
            Boolean res = authRoleDomainService.add(authRoleBO);
            return Result.ok(res);
        } catch (Exception e) {
            // error日志
            log.error("RoleController add error:{}", e.getMessage(), e);
            return Result.fail("新增角色失败");
        }
    }

}
3.sun-club-auth-domain
1.AuthRoleDomainService.java
package com.sunxiansheng.auth.domain.service;

import com.sunxiansheng.auth.domain.entity.AuthRoleBO;

/**
 * Description:
 * @Author sun
 * @Create 2024/5/24 9:03
 * @Version 1.0
 */
public interface AuthRoleDomainService {

    /**
     * 添加
     * @param authRoleBO
     * @return
     */
    Boolean add(AuthRoleBO authRoleBO);

}
2.AuthRoleDomainServiceImpl.java
package com.sunxiansheng.auth.domain.service.impl;

import com.sunxiansheng.auth.basic.entity.AuthRole;
import com.sunxiansheng.auth.basic.service.AuthRoleService;
import com.sunxiansheng.auth.common.enums.IsDeleteFlagEnum;
import com.sunxiansheng.auth.domain.convert.AuthRoleBOConverter;
import com.sunxiansheng.auth.domain.entity.AuthRoleBO;
import com.sunxiansheng.auth.domain.service.AuthRoleDomainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * Description:
 * @Author sun
 * @Create 2024/5/24 9:03
 * @Version 1.0
 */
@Service
@Slf4j
public class AuthRoleDomainServiceImpl implements AuthRoleDomainService {
    @Resource
    private AuthRoleService authRoleService;


    @Override
    public Boolean add(AuthRoleBO authRoleBO) {
        // BO转换为Entity
        AuthRole authRole = AuthRoleBOConverter.INSTANCE.convertBO2Entity(authRoleBO);

        // 调用基础服务
        // 设置逻辑删除
        authRole.setIsDeleted(IsDeleteFlagEnum.UN_DELETED.getCode());
        // 新增角色
        Integer count = authRoleService.insert(authRole);
        return count > 0;
    }

}
4.sun-club-auth-infra
1.AuthRoleService.java

image-20240606151746705

2.AuthRoleServiceImpl.java

image-20240606151804262

5.测试
1.接口设计

image-20240606151834328

2.测试

image-20240606151846251

image-20240606151857054

3.更新角色

1.sun-club-auth-application-controller
1.RoleController.java
/**
 * 修改角色信息
 * @param authRoleDTO
 * @return
 */
@RequestMapping("update")
public Result<Boolean> update(@RequestBody AuthRoleDTO authRoleDTO) {
    try {
        // 日志
        if (log.isInfoEnabled()) {
            log.info("RoleController update AuthRoleDTO, authRoleDTO:{}", JSON.toJSONString(authRoleDTO));
        }
        // 参数校验
        Preconditions.checkNotNull(authRoleDTO.getId(), "角色ID不能为空");
        // 转换DTO为BO
        AuthRoleBO authRoleBO = AuthRoleDTOConverter.INSTANCE.convertDTO2BO(authRoleDTO);
        // 调用领域服务
        // 更新用户信息
        Boolean res = authRoleDomainService.update(authRoleBO);
        return Result.ok(res);
    } catch (Exception e) {
        // error日志
        log.error("RoleController update error:{}", e.getMessage(), e);
        return Result.fail("修改角色信息失败");
    }
}
2.sun-club-auth-domain
1.AuthRoleDomainService.java
/**
 * 修改
 * @param authRoleBO
 * @return
 */
Boolean update(AuthRoleBO authRoleBO);
2.AuthRoleDomainServiceImpl.java
@Override
public Boolean update(AuthRoleBO authRoleBO) {
    // BO转换为Entity
    AuthRole authRole = AuthRoleBOConverter.INSTANCE.convertBO2Entity(authRoleBO);
    // 调用基础服务
    // 修改角色
    Integer count = authRoleService.update(authRole);
    // 有任何的更新,都要与缓存进行同步的修改,要把当前用户的角色和权限都放到redis里
    return count > 0;
}
3.sun-club-auth-infra
1.AuthRoleService.java

image-20240606153045982

2.AuthRoleServiceImpl.java

image-20240606153100095

4.测试
1.接口设计

image-20240606153137714

2.测试

image-20240606153148837

image-20240606153201889

4.删除角色

1.sun-club-auth-application-controller
1.RoleController.java
/**
 * 删除角色信息
 * @param authRoleDTO
 * @return
 */
@RequestMapping("delete")
public Result<Boolean> delete(@RequestBody AuthRoleDTO authRoleDTO) {
    try {
        // 日志
        if (log.isInfoEnabled()) {
            log.info("RoleController delete AuthRoleDTO, authRoleDTO:{}", JSON.toJSONString(authRoleDTO));
        }
        // 参数校验
        Preconditions.checkNotNull(authRoleDTO.getId(), "角色ID不能为空");
        // 转换DTO为BO
        AuthRoleBO authRoleBO = AuthRoleDTOConverter.INSTANCE.convertDTO2BO(authRoleDTO);
        // 调用领域服务
        // 删除用户信息
        Boolean res = authRoleDomainService.delete(authRoleBO);
        return Result.ok(res);
    } catch (Exception e) {
        // error日志
        log.error("RoleController delete error:{}", e.getMessage(), e);
        return Result.fail("删除角色信息失败");
    }
}
2.sun-club-auth-domain
1.AuthRoleDomainService.java
/**
 * 删除
 * @param authRoleBO
 * @return
 */
Boolean delete(AuthRoleBO authRoleBO);
2.AuthRoleDomainServiceImpl.java
@Override
public Boolean delete(AuthRoleBO authRoleBO) {
    // BO转换为Entity
    AuthRole authRole = AuthRoleBOConverter.INSTANCE.convertBO2Entity(authRoleBO);
    // 设置逻辑删除
    authRole.setIsDeleted(IsDeleteFlagEnum.DELETED.getCode());
    // 更新
    Integer count = authRoleService.update(authRole);
    return count > 0;
}
3.测试
1.接口设计

image-20240606154103438

2.测试

image-20240606154116272

image-20240606154137267

5.用户角色关联

1.easycode生成用户-角色关联表代码
1.配置

image-20240606154631537

2.将AuthUserRoleDao.java从dao移动到mapper

image-20240606163333294

3.AuthUserRole.java 使用lombok简化

image-20240606154749895

4.AuthUserRoleDao.java删除Pageable

image-20240606154817214

5.AuthUserRoleService.java删除分页查询接口
6.AuthUserRoleServiceImpl.java删除分页查询实现
2.sun-club-auth-domain
1.AuthConstant.java
package com.sunxiansheng.auth.domain.constants;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/6 15:54
 * @Version 1.0
 */
public enum AuthConstant {

    /*
    普通用户
     */
    NORMAL_USER("normal_user"),
    ;

    private String value;

    AuthConstant(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}
2.AuthUserDomainServiceImpl.java 新增逻辑,进行用户和角色关联

image-20240606170606356

3.AuthRoleDao.xml 添加selectKey逻辑,插入后将id返回
# 在新增之后会将id返回给对象
<selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER">
    SELECT LAST_INSERT_ID()
</selectKey>

image-20240606171203987

3.测试

image-20240606171406674

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计师的救星,效率插件大合集!有了它设计效率翻倍

作为一名设计师&#xff0c;我相信大家都有这样的痛苦经历&#xff1a;为了完成一个设计项目&#xff0c;得下载一堆工具&#xff0c;像 snipaste、pureref、eagle 等&#xff0c;每个都要单独下载、单独打开使用。还有一些效率工具&#xff0c;比如 utools 或 hapigo&#xff…

OpenCV图像滤波(6)高斯滤波函数GaussianBlur()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 函数使用高斯滤波器对图像进行模糊处理。 该函数使用指定的高斯核对源图像进行卷积。支持原位过滤。 高斯模糊是一种有效的图像平滑技术&#xf…

实验23.硬盘分区,并编写硬盘驱动程序

已完成实验 已完成实验链接 简介 实验 23. 硬盘分区&#xff0c;并编写硬盘驱动程序 总结 创建硬盘并分区 加载硬盘分区 实现 printk 使能硬盘中断 interrupt.c idel 线程,主线程阻塞后此线程保底 thread.c sleep 函数 timer.c 加载分区信息 ide.c 创建硬盘 fdisk …

[Web服务器] 简易静态Web服务器的搭建

什么是Web服务器 可以为发出请求的浏览器提供静态文档的程序。 平时我们浏览百度新闻数据的时候&#xff0c;每天的新闻数据都会发生变化&#xff0c;那访问的这个页面就是动态的&#xff0c;而我们开发的是静态的&#xff0c;每天访问我们自己的静态web服务器&#xff0c;页面…

宠物托运网站如何搭建?5步帮你吸引70%顾客!

引言 随着人们生活水平的提高和宠物文化的普及&#xff0c;越来越多的宠物主人开始选择带着自己的宠物一同旅行或搬迁至新的城市。这一趋势催生了宠物托运服务行业的快速发展&#xff0c;而一个专业、高效的宠物托运网站则成为了连接宠物主人与托运服务提供商之间不可或缺的桥…

七夕情人节送什么礼物?四款好物分享,情侣必看!

在浪漫的七夕情人节&#xff0c;为心爱的人挑选一份特别的礼物是每对情侣表达爱意的重要方式。市场上琳琅满目的选择让人眼花缭乱&#xff0c;究竟什么样的礼物能触动TA的心弦&#xff1f;本篇分享将为您精选四款既实用又充满情意的好物&#xff0c;无论是甜蜜的开始还是长久的…

【区块链+医疗健康】医链 - 区块链医疗信息管理系统 | FISCO BCOS应用案例

根据《“十四五”规划和 2035 远景目标纲要》&#xff0c;我国在“十四五”时期将全面推进医疗信息化建设。工信部等部 门联合发布《关于加快推动区块链技术应用和产业发展的指导意见》&#xff0c;促进区块链在医疗健康等公共服务领域开 展应用&#xff0c;促进业务协同办理。…

1. dact-admin 中如何发布一个表并添加到导航栏

1.页面脚手架中根据自己需求选择生成的文件例如模型、控制器、翻译文件、数据库迁移文件等 访问 http://【你的域名】/admin/helpers/scaffold 例如&#xff1a; http://localhost:8000/admin/helpers/scaffold 2. 新建好之后来到路由文件 路径随便写&#xff0c;当然按照惯…

[C++] 模板进阶:特化与编译链接全解析

文章目录 非类型模板类型形参非类型模板参数代码示例 **模板的特化**为什么要有模板的特化函数模板特化使用场景与示例函数模板特化的实现细节 类模板特化全特化示例 偏特化部分优化通过进一步限制模板参数进行特化偏特化为指针类型示例&#xff1a;偏特化为引用类型示例&#…

红酒与午后:悠闲时光的惬意选择

阳光透过窗棂&#xff0c;轻轻洒在木质的茶几上&#xff0c;斑驳的光影交织出一幅静谧而温暖的画面。在这宁静的午后&#xff0c;一瓶洒派红酒&#xff08;Bold & Generous&#xff09;静静地摆放在那里&#xff0c;仿佛正等待着与你一同开启一段悠闲的品酒时光。 一、午后…

【往届均已完成EI、SCOPUS检索】第四届电气工程与计算机技术国际学术会议(ICEECT 2024,9月27-29)

第四届电气工程与计算机技术国际学术会议&#xff08;ICEECT2024&#xff09;将于9月27日-29日在哈尔滨举办。 会议主要围绕"电路与系统"、“电气工程材料”、“计算机视觉”、“计算机技术”等专业研究领域展开讨论。旨在为气工程、计算机技术等领域的专家学者及企业…

Figma汉化教程

Figma汉化教程&#xff0c;需要 5 步 第一步&#xff1a;我们打开一个Figma中文社区网站 https://www.figma.cool/cn。我们点击左上角的Figma汉化&#xff0c;进入Figma汉化安装的页面。 第二步&#xff1a;在Figma 软件汉化页面中&#xff0c;选择谷歌浏览器汉化&#xff0c;点…

Litestar GET function blocks OpenAI

题意&#xff1a;Litestar GET 函数阻塞 OpenAI 问题背景&#xff1a; When I transfer function to litestar, it suddenly stops OpenAI from returning a completion. I can print to console every declared variable except answer: 当我将函数传递给 litestar 时&#…

解析蚂蚁T21 190T 算力与能效的新突破

蚂蚁T21 190T 的参数如下&#xff1a; ● 产生币种&#xff1a;B & T & C ● 额定算力&#xff1a;190T ● 额定功耗&#xff1a;3610W ● 功耗比&#xff1a;19.0J/T ● 额定电压&#xff1a;380~415V ● 芯片参数&#xff1a;采用全新的5nm芯片技术&#xff08…

Linux笔记 --- Linux内核链表

Linux 内核链表 经过上一小节的分析&#xff0c;我们知道了传统链表的先天缺陷&#xff1a;没有将具体的数据从组织这些数据的逻辑结构中剥离&#xff0c;而Linux内核链表的思路&#xff0c;正是从一方面着手&#xff0c;追根溯源直抵病灶&#xff0c;彻底颠覆了传统链表&…

Linux内网环境部署thingsboard(离线部署)

先说明一下内网部署的环境,我这里是安装的thingsboard3.6.4 下面所有环境包的版本都是基于这个版本 我们需要安装jdk11,postgres数据库&#xff0c;这里注意下jdk必须使用rpm方式安装&#xff0c;要不后面安装Thingsboard会提示你没有检测到jdk. 下面我们就一步一步来 1.先下…

同城货运软件开发货运搬家系统源码基于Java开发的货运平台

一.管理端配置及操作 1.服务配置 添加:服务,给服务添加车型和车厢,以及收费金额 2.用户中心 分为普通用户 师傅用户 和推广员用户; 推广员用户的一二级分佣不为0,可给推广员设置一二级佣金 3.车厢/车型管理 给服务添加车厢 和车型,选择 服务后,只能选择该服务关联的车型和…

Tomato靶机~文件包含日志

寻找网站上传点并把 php 恶意代码文件改成 jpg 上传到网站上在本地包含引入恶意代码&#xff0c;当文件被引入后代码就被执行&#xff1b; 0x01信息收集 # 环境准备&#xff1a; Target IP&#xff1a;192.168.66.143 Attack IP&#xff1a;192.168.66.84 靶机目标&#xff1…

无缝协作的艺术:Codigger 视频会议(Meeting)的用户体验

在当今数字化的时代&#xff0c;远程协作已经成为工作和学习中不可或缺的一部分。然而&#xff0c;远程协作也面临着诸多挑战&#xff0c;如沟通不畅、信息同步不及时、协作工具的复杂性等。而 Codigger 视频会议&#xff08;Meeting&#xff09;作为一款创新的工具&#xff0c…

伦敦银和伦敦金的关系是怎么样的?

在贵金属投资市场中&#xff0c;有两个品种是经常被投资者讨论的&#xff0c;一个是伦敦银&#xff0c;而另外一个是伦敦金&#xff0c;他们的名字很相似&#xff0c;那实际上他们有何关系呢&#xff1f;下面我们就来简单地讨论一下。 伦敦银其实也叫国际现货白银&#xff0c;是…