恒合仓库 - 用户管理、用户列表、为用户分配角色

news2024/11/28 1:29:26

文章目录

  • 用户管理
  • 一、用户列表
    • 1.1 实体类
      • 1.1.1 分页实体类
      • 1.1.2 用户信息实体类
    • 1.2 业务实现
      • 1.2.1 UserMapper
      • 1.2.2 Service层
      • 1.2.3 Controller层
      • 1.2.4 效果图
  • 二、用户增删改查
    • 2.1 添加用户业务实现
      • 2.1.1 Mapper
      • 2.1.2 Service
      • 2.1.3 Controller
      • 2.1.4 效果图
    • 2.2 删除用户业务实现
      • 2.2.1 Mapper
      • 2.2.2 Service
      • 2.2.3 Controller
      • 2.2.4 效果图
    • 2.3 修改用户业务实现
      • 2.3.1 Mapper
      • 2.3.2 Service
      • 2.3.3 Controller
      • 2.3.4 效果图
    • 2.4 修改密码
      • 2.4.1 Mapper
      • 2.4.2 Service
      • 2.4.3 Controller
      • 2.4.5 效果图
  • 三、启动或禁用用户
    • 3.1 业务实现
      • 3.1.1 Mapper
      • 3.1.2 Service
      • 3.1.3 Controller
      • 3.1.4 效果图
  • 四、为用户分配角色
    • 4.1 实体类
      • 4.1.1 角色表实体类
    • 4.2 获取所有角色
      • 4.2.1 开启Redis注解版缓存
      • 4.2.2 Mapper
      • 4.2.3 Service
      • 4.2.4 Controller
      • 4.2.5 效果图
    • 4.3 角色回显效果
      • 4.3.1 Mapper
      • 4.3.2 Service
      • 4.3.3 Controller
      • 4.3.4 效果图
    • 4.4 分配角色
      • 4.4.1 Dto类
      • 4.4.2 Mapper
      • 4.4.3 Service
      • 4.4.4 Controller
      • 4.4.5 效果图

用户管理

一、用户列表

分页查询用户

1.1 实体类

1.1.1 分页实体类

/**
 * 分页信息实体类:
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Page {

    //当前页码
    private Integer pageNum;

    //每页显示行数
    private Integer pageSize;

    //总行数
    private Integer totalNum;

    //总页数
    private Integer pageCount;

    //limit函数参数一每页起始行
    private Integer limitIndex;

    //存储当前页查询到的数据的List<?>集合
    private List<?> resultList;

    //计算总页数
    public Integer getPageCount() {
        return totalNum%pageSize==0 ? totalNum/pageSize : totalNum/pageSize+1;
    }

    //计算limit函数参数一每页起始行
    public Integer getLimitIndex() {
        return pageSize * (pageNum-1);
    }
}

1.1.2 用户信息实体类

/**
 * user_info表的实体类:
 */
@Data
@ToString
public class User {

   private int userId;//用户id

   private String userCode;//账号

   private String userName;//用户名

   private String userPwd;//用户密码

   private String userType;//用户类型

   private String userState;//用户状态

   private String isDelete;//删除状态

   private int createBy;//创建人

   //返回前端时,自动将Date转换成指定格式的json字符串
   @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
   private Date createTime;//创建时间

   private int updateBy;//修改人

   private Date updateTime;//修改时间

   private String getCode; //追加的属性,数据库没有:用户创建人

   public User() {

   }

   public User(int userId, String userCode, String userName, String userPwd,
         String userType, String userState, String isDelete, int createBy,
         Date createTime, int updateBy, Date updateTime) {
      this.userId = userId;
      this.userCode = userCode;
      this.userName = userName;
      this.userPwd = userPwd;
      this.userType = userType;
      this.userState = userState;
      this.isDelete = isDelete;
      this.createBy = createBy;
      this.createTime = createTime;
      this.updateBy = updateBy;
      this.updateTime = updateTime;
   }
}

1.2 业务实现

1.2.1 UserMapper

Mybatis - 基础_我爱布朗熊的博客-CSDN博客

//  查询用户总行数的方法
    public Integer findRowCount(User user);

//  分页查询用户的方法。
//  为参数对象起别名是为了在拼接SQL时好区分
    public List<User> findUserByPage(@Param("page") Page page,@Param("user") User user);

编写SQL

 <!--查询用户行数的方法-->
    <select id="findRowCount" resultType="java.lang.Integer">
        select count(*)
        from user_info
        <where>
            is_delete=0
            <if test="userCode !=null and userCode!=''">
                and user_code like concat('%', #{userCode}, '%')
            </if>
            <if test="userType!=null and userType!='' ">
                and user_type = #{userType}
            </if>
            <if test="userState !=null and userState!='' ">
                and user_state = #{userState}
            </if>
        </where>
    </select>

    <!--分页查询,里面有一个内连接-->
    <select id="findUserByPage" resultType="com.pn.entity.User">
        select t1.*,t2.user_code as getCode
        from user_info t1,user_info t2
        <where>
            t1.create_by = t2.user_id
            and t1.is_delete =0
            <if test="user.userCode !=null and user.userCode!=''">
                and t1.user_code like  concat('%', #{user.userCode}, '%')
            </if>
            <if test="user.userType!=null and user.userType!='' ">
                and t1.user_type = #{user.userType}
            </if>
            <if test="user.userState !=null and user.userState!='' ">
                and t1.user_state = #{user.userState}
            </if>
        </where>
        order by t1.create_time desc
        limit #{page.limitIndex}, #{page.pageSize}
    </select>

1.2.2 Service层

    //分页查询的用户方法
    @Override
    public Page queryUserByPage(Page page, User user) {
        Integer rowCount = userMapper.findRowCount(user);
//      设定数据总行数
        page.setTotalNum(rowCount);
//      设定一共多少页
        page.setPageCount(page.getPageCount());
//      设定每一页的起始行
        page.setLimitIndex(page.getLimitIndex());

        List<User> userByPage = userMapper.findUserByPage(page, user);

        page.setResultList(userByPage);

        return page;
    }

1.2.3 Controller层

//  分页查询用户url接口,接收的参数不是JSON类型
//  Page接收参数pageNum、pageSize ;
//  User接收参数 userCode、userType、userState
    @RequestMapping("/user-list")
    public Result getUserList(Page page, User user){
       return Result.ok(userService.queryUserByPage(page,user));
    }

1.2.4 效果图

image-20230811225518688

二、用户增删改查

2.1 添加用户业务实现

一个表单而已

image-20230811230908577

2.1.1 Mapper

//  添加用户
    public int addUser(User user);

主键虽然自增,我们也用null占位

<!--添加用户的方法-->
<insert id="addUser">
    insert into user_info
        value (#{userCode},#{userName},#{userPwd},null,0,0,#{createBy},now(),null,null)
</insert>
//  根据账号查询用户信息的方法啊
    public User findUserByCode(String userCode);
<!--不需要编写,他会根据上下文自己去匹配-->
<select id="findUserByCode" resultType="com.pn.entity.User">
    select *
    from user_info
    where user_code = #{userCode}
      and is_delete = '0'
</select>

2.1.2 Service

    //添加用户的业务
    @Override
    public Result saveUser(User user) {
//      对密码加密
        String password = DigestUtil.hmacSign(user.getUserPwd());
        user.setUserPwd(password);
        int success = userMapper.addUser(user);
        
        return success>0? Result.ok("添加成功") : Result.err(Result.CODE_ERR_BUSINESS,"添加用户失败");
    }

2.1.3 Controller

//  利用token获取是谁添加的用户
    @RequestMapping("/addUser")
    public Result addUser(@RequestBody User user, @RequestHeader("Token") String token){
        CurrentUser currentUser = tokenUtils.getCurrentUser(token);
        user.setCreateBy(currentUser.getUserId());
        return userService.saveUser(user);
    }

2.1.4 效果图

image-20230811234153942

2.2 删除用户业务实现

删除的时候可以批量删除,也可以单个删除

删除用户的时候记得删除用户对应的角色关系表中的内容(不删除也行,等恢复账户的时候也能恢复之前的角色信息)

2.2.1 Mapper

//  根据用户ids修改用户为删除状态的方法
    public int setIsDeleteByUids(List<Integer> userIdList);

Mybatis参数的都是被一个Map集合封装的

如果参数是List集合的话,那默认的键就是纯小写的“list”(如果指定名称的话例外)

<!--根据id集合批量删除用户-->
<!--如果方法的参数是一个List集合,默认是以键list,值就是我们真正的List集合,
    保存到我们的Mybatis封装方法参数的那个Map集合
 -->
<update id="setIsDeleteByUids">
    update user_info set is_delete=1 where user_id in

    <foreach collection="list" item="id" separator="," open="(" close=")">
        #{id}
    </foreach>

</update>

2.2.2 Service

//  批量删除用户
    @Override
    public Result deleteUserByIds(List<Integer> userIdList) {
        int success = userMapper.setIsDeleteByUids(userIdList);
        return success>0? Result.ok("删除用户成功") : Result.err(Result.CODE_ERR_BUSINESS,"删除用户失败");
    }

2.2.3 Controller

//根据用户id删除单个用户的URL接口
@RequestMapping("/deleteUser/{userId}")
public Result deleteUserById(@PathVariable Integer userId) {
    return userService.deleteUserByIds(Collections.singletonList(userId));
}

//根据用户ids批量删除用户的url接口
@RequestMapping("/deleteUserList")
public Result deleteUserById(@RequestBody List<Integer> userIdList) {
    return userService.deleteUserByIds(userIdList);
}

2.2.4 效果图

image-20230813195942442

2.3 修改用户业务实现

只能修改昵称

image-20230813200810531

2.3.1 Mapper

//  修改用户昵称的方法
    public int setUserNameByUid(@Param("userId")Integer userId,@Param("userName")String userName, @Param("updateBy")int updateBy );
<!--修改用户昵称的方法-->
<update id="setUserNameByUid">
    update user_info
    set user_name=#{userName},
        update_by=#{updateBy},
        update_time=now()
    where user_id = #{userId}
</update>

2.3.2 Service

//  修改用户昵称
    @Override
    public Result setUserById(Integer userId, String userName, int updateBy) {
        int success = userMapper.setUserNameByUid(userId, userName, updateBy);

        return success>0? Result.ok("删除用户成功") : Result.err(Result.CODE_ERR_BUSINESS,"删除用户失败");
    }

2.3.3 Controller

//修改用户昵称
@RequestMapping("/updateUser")
public Result updateUser(@RequestBody User user, @RequestHeader("Token") String token){
    return userService.setUserById(user.getUserId(), user.getUserName(),, tokenUtils.getCurrentUser(token).getUserId());
}

2.3.4 效果图

image-20230813202544282

改完名称后

image-20230813202614407

2.4 修改密码

将用户的密码重置为123456

2.4.1 Mapper

//  根据用户id修改密码的方法
    public int setPwdByUid(@Param("userId")Integer userId,@Param("password")String password);
<update id="setPwdByUid">
    update user_info
    set user_pwd = #{password}
    where user_id = #{userId}
</update>

2.4.2 Service

    @Override
    public Result setPwdByUid(Integer userId) {
        String password = DigestUtil.hmacSign("123456");
        int success = userMapper.setPwdByUid(userId, password);

        return success>0? Result.ok("重置密码成功") : Result.err(Result.CODE_ERR_BUSINESS,"重置密码失败");
    }

2.4.3 Controller

    //根据用户id初始化用户密码
    @RequestMapping("/updatePwd/{userId}")
    public Result resetPassword(@PathVariable("userId") Integer userId){
        return userService.setPwdByUid(userId);
    }

2.4.5 效果图

image-20230813204327239

三、启动或禁用用户

3.1 业务实现

3.1.1 Mapper

//  根据用户id修改用户的状态
    public int updateStateByUid(@Param("userId") int userId,@Param("userState") String userState);
<!--根据用户id修改用户状态-->
<update id="updateStateByUid">
    update user_info
    set user_state = #{userState}
    where user_id = #{userId}
</update>

3.1.2 Service

//启动或禁用用户
@Override
public Result setUserState(User user) {
    int success = userMapper.updateStateByUid(user.getUserId(), user.getUserState());

    return success>0? Result.ok("修改成功"):Result.err(Result.CODE_ERR_BUSINESS,"修改失败");
}

3.1.3 Controller

//  启动或禁用用户
    @RequestMapping("/updateState")
    public Result updateState(@RequestBody User user){
        return  userService.setUserState(user);
    }

3.1.4 效果图

将下面的用户进行禁用

image-20230812183423806

禁用后如下图所示

image-20230812183447909

四、为用户分配角色

也就是下面红框中的内容

image-20230812184122455

image-20230812184139912

4.1 实体类

4.1.1 角色表实体类

/**
 * 角色表的实体类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Role  implements Serializable {

    private int roleId;//角色id

    private String roleName;//角色名称

    private String roleDesc;//角色描述

    private String roleCode;//角色标识

    private String roleState;//角色状态

    private int createBy;//创建角色的用户id

    //json转换的日期格式
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;//创建时间

    private int updateBy;//修改角色的用户id

    private Date updateTime;//修改时间

    private String getCode;//追加的属性--创建角色的用户的用户名
}

4.2 获取所有角色

Springboot操作Redis注解形式缓存

4.2.1 开启Redis注解版缓存

①在启动类上添加@EnableCaching开启Redis注解版缓存

//mapper接口扫描器,然后会自动为Mapper接口创建代理对象并加入到IOC容器
@MapperScan(basePackages = "com.pn.mapper")
@SpringBootApplication
@EnableCaching//开启Redis注解版缓存
public class WarehouseApplication {

    public static void main(String[] args) {
        SpringApplication.run(WarehouseApplication.class, args);
    }

}

②在我们所需的类上添加@CacheConfig注解指定缓存的名称(数据保存到redis中的键的前缀)

//指定缓存的名称(数据保存到redis中的键的前缀)
@CacheConfig(cacheNames = "com.pn.service.impl.RoleServiceImpl")
@Service
public class RoleServiceImpl implements RoleService {
.....
}

③在我们所需要的方法上标注注解@Cacheable指定缓存的键

@Cacheable(key = "'all:role'")
@Override
public List<Role> getAllRole() {
    return roleMapper.getAllRole();
}

4.2.2 Mapper

@Mapper
public interface RoleMapper {
//  查询所有角色的方法
    public List<Role> getAllRole();
    
}
<select id="getAllRole" resultType="com.pn.entity.Role">
    select *
    from role
    where role_state = 1
</select>

4.2.3 Service

//指定缓存的名称(数据保存到redis中的键的前缀)
@CacheConfig(cacheNames = "com.pn.service.impl.RoleServiceImpl")
@Service
public class RoleServiceImpl implements RoleService {
    @Autowired
    private RoleMapper roleMapper;


    @Cacheable(key = "'all:role'")
    @Override
    public List<Role> getAllRole() {
        return roleMapper.getAllRole();
    }

}

4.2.4 Controller

@RestController
@RequestMapping("/role")
public class RoleController {
    //注入RoleService
    @Autowired
    private RoleService roleService;

    //查询所有角色
    @RequestMapping("/role-list")
    public Result roleList() {
        return Result.ok(roleService.getAllRole());
    }

}

4.2.5 效果图

image-20230812230932457

image-20230812231029485

4.3 角色回显效果

我们某个用户已经有角色了,但是他并没有打上"√"

下面就来实现一下角色回显

image-20230812230932457

4.3.1 Mapper

//  根据userId查询对应角色
    public  List<Role> getRoleByUserId(@Param("userId") Integer userId);
    <select id="getRoleByUserId" resultType="com.pn.entity.Role">
        select r.*
        from user_role u1,
             role r
        where u1.user_id = #{userId}
          and u1.role_id = r.role_id
          and r.role_state= 1
    </select>

4.3.2 Service

@Override
public List<Role> getRoleByUserId(Integer userId) {
    return roleMapper.getRoleByUserId(userId);
}

4.3.3 Controller

    @Autowired
    private RoleService roleService;
    
//  获取用户已经分配的角色
    @RequestMapping("/user-role-list/{userId}")
    public Result userRoleList(@PathVariable("userId") Integer userId){
          return Result.ok(roleService.getRoleByUserId(userId));
    }

4.3.4 效果图

image-20230812232701472

4.4 分配角色

处理的逻辑也很简单,把之前分配的角色删除,然后重新分配,这样就不用判断用户是否有某个角色了

4.4.1 Dto类

/**
 * 接收给用户分配角色前端传递的数据的Dto类:
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class AssignRoleDto {

    //接收请求参数userId -- 用户id
    private Integer userId;

    //接收请求参数roleCheckList -- 给用户分配的所有角色名
    private List<String> roleCheckList;
}

4.4.2 Mapper

①根据角色名查询角色id

//  根据角色名查询角色id
    public Integer findRoleIdByName(String roleName);
<!-- 根据角色名查询角色id-->
<select id="findRoleIdByName" resultType="java.lang.Integer">
    select role.role_id
    from role
    where role.role_name = #{roleName}
</select>

②删除已经用户分配的角色

删除关系表的信息即可

//  根据用户Id删除用户已经分配的角色关系
    public int removeUserRoleByUid(Integer userId);
<!--根据用户Id删除用户已经分配的角色关系-->
<delete id="removeUserRoleByUid">
    delete
    from user_role
    where user_id = #{userId}
</delete>

③向user_role表添加用户角色对应关系

//  向user_role表添加用户角色对应关系
    public int insertUserRole(@Param("userId") Integer userId,@Param("roleId")Integer roleId);
<insert id="insertUserRole">
    insert into user_role values(null,#{roleId},#{userId})
</insert>

4.4.3 Service

    //  给用户修改角色信息
    @Override
    public Result changeUserRole(AssignRoleDto assignRoleDto) {
//      将之前的关系删除掉
        roleMapper.removeUserRoleByUid(assignRoleDto.getUserId());

//      获取我们要添加的角色的ID
        List<String> roleNameList = assignRoleDto.getRoleCheckList();
        for(String role:roleNameList){
            Integer roleId = roleMapper.findRoleIdByName(role);
            roleMapper.insertUserRole(assignRoleDto.getUserId(),roleId);
        }

        return Result.ok("更改角色成功");
    }

4.4.4 Controller

//  给用户分配角色
    @RequestMapping("/assignRole")
    public Result assignRole(@RequestBody AssignRoleDto assignRoleDto){
        return userService.changeUserRole(assignRoleDto);;
    }

4.4.5 效果图

image-20230813000523491

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

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

相关文章

十一、MySql的事务(上)

文章目录 一、引入&#xff08;一&#xff09;CURD不加控制&#xff0c;会有什么问题&#xff1f;&#xff08;二&#xff09;CURD满足什么属性&#xff0c;能解决上述问题&#xff1f; 二、什么是事务&#xff1f;三、事务的特性&#xff08;一&#xff09;原子性&#xff1a;…

经典算法-----约瑟夫问题(C语言)

目录 前言 故事背景 约瑟夫问题 环形链表解决 数组解决 前言 今天我们来玩一个有意思的题目&#xff0c;也就是约瑟夫问题&#xff0c;这个问题出自于欧洲中世纪的一个故事&#xff0c;下面我们就去通过编程的方式来解决这个有趣的问题&#xff0c;一起来看看吧&#xff01…

基于Java+SpringBoot+Vue+小程序实现前后端分离二手交易系统

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

Vmware通过VMware tools设置共享文件夹

步骤说明&#xff1a; 先安装VMware tools&#xff0c;再设置共享文件夹即可。 写在前面&#xff1a; 刚安装虚拟机时&#xff0c;窗口可能显得太小&#xff0c;这是窗口分辨率没有调整导致的。 点击设置->显示->分辨率调整即可 一、安装VMware tools 1.1 点击虚拟机…

机器人如何有效采摘苹果?

摘要&#xff1a;本文利用动捕数据构建拟人运动模型&#xff0c;对比观察两种苹果采摘模式&#xff0c;并对系统性能进行全面评估&#xff0c;为提高机器人采摘效率提供创新方法。 近期&#xff0c;一项关于苹果采摘机器人的有趣研究—— "Design and evaluation of a rob…

nokov设置教程

1软件安装 设置 屏幕分辨力 缩放问题 软件设置 以管理员身份运行 高DPI缩放行为 系统 软件界面 1 设置路径 全部数据存放于该文件夹下 右下角文件按钮 右键 选择目录 设置完后程序上面显示路径 2 电脑设置ip地址 以太网属性 版本4 查看以太网状态 是否千兆网 网速 …

前序遍历、后序遍历-morris

前序遍历 前序遍历&#xff1a;中 -> 左子树 -> 右子树 非递归的遍历-stack public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res new ArrayList<>();if (null root) {return res;}LinkedList<TreeNode> stack new…

基于 VSC 的 UPFC(统一潮流控制器)研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

EM算法和VAE的学习笔记

文章目录 摘要EM算法流程EM算法对GMM的参数估计EM算法的证明EM算法的另一种理解VAE参考文献 摘要 这是我学习EM算法&#xff08;Expectation-Maximization Algorithm&#xff09;和VAE&#xff08;Variational Auto-Encoder&#xff09;的学习笔记&#xff0c;首先总结了EM算法…

day5ARM

循环点亮三个led灯 方法1 ------------------led.h---------------- #ifndef __LED_H__ #define __LED_H__#define RCC (*(volatile unsigned int *)0x50000A28) #define GPIOE ((GPIO_t *)0x50006000) #define GPIOF ((GPIO_t *)0x50007000)//结构体封装 typedef struct {vo…

天空飞鸟 数据集

今天要介绍的数据集则是天空飞鸟 数据集&#xff1a; 数据集名称&#xff1a;天空飞鸟 数据集 数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;以文件包含图片…

alova.js快速入门教程

官网地址&#xff1a;Alova.JS - Lightweight request strategy library | Alova.JS 目录 一、alova 是什么&#xff1f; 二、 快速入门 1、安装依赖 &#xff08;1&#xff09;使用npm方式安装 &#xff08;2&#xff09;使用yarn方式安装 2、在静态 html 中使用 一、al…

CAD for JS:VectorDraw web library 10.1004.1 Crack

VectorDraw web library经过几年的研究&#xff0c;通过互联网展示或工作的可能性并拒绝了各种项目&#xff0c;我们最终得出的结论是&#xff0c;在 javascript 的帮助下&#xff0c;我们将能够在 Microsoft IE 以外的互联网浏览器中通过网络演示矢量图形&#xff08;支持 ocx…

NSSCTF之Misc篇刷题记录(17)

NSSCTF之Misc篇刷题记录&#xff08;17&#xff09; [闽盾杯 2021]DNS协议分析[GFCTF 2021]pikapikapika NSSCTF平台&#xff1a;https://www.nssctf.cn/ PS&#xff1a;所有FLAG改为NSSCTF [闽盾杯 2021]DNS协议分析 数据包提示给得是DNS数据包 直接过滤一下 发现 数据里面存…

分支和远程仓库

分支 查看分支 git branch -v 创建分支 git branch 分支名 切换分支 git checkout 分支名 合并分支 git merge 分支名 把指定的分支合并到当前分支上 查看当前所有远程地址别名&#xff1a; git remote -v 起别名&#xff1a; git remote add 别名 远程地址推送本地分支上的…

【已解决】qt死活不响应鼠标移动到按钮事件

本博文源于笔者正在研究的内容&#xff0c;这个问题大概捣鼓了一个下午&#xff0c;问题是这样子&#xff1a;我有一个按钮&#xff0c;我应用程序运行时&#xff0c;我鼠标放到按钮上&#xff0c;按钮就会被填充图标。怀揣着这样一个想法&#xff0c;我搜啊搜&#xff0c;整啊…

探讨基于IEC61499 的分布式 ISA Batch 控制系统

ISA SP88 是批次过程控制的标准&#xff0c;对应的IEC标准是IEC 61512。该标准中一个重要的部分是配方管理&#xff08;Recipe Management&#xff09;。 所谓配方&#xff0c;是根据批量产品的要求&#xff0c;材料设定加工工艺&#xff0c;加工流程和参数。类似于传统制造业的…

IntelliJ IDEA使用——Debug操作

文章目录 版本说明图标和快捷键查看变量计算表达式条件断点多线程调试 版本说明 当前的IntelliJ IDEA 的版本是2021.2.2&#xff08;下载IntelliJ IDEA&#xff09; ps&#xff1a;不同版本一些图标和设置位置可能会存在差异&#xff0c;但应该大部分都差不多。 图标和快捷键…

STM32单片机——看门狗(独立看门狗窗口看门狗)

STM32单片机——看门狗&#xff08;独立看门狗&窗口看门狗&#xff09; 独立看门狗&#xff08;IWDG&#xff09;独立看门狗本质相关概念独立看门狗实验CubeMX工程配置HAL库程序设计固件库程序设计 窗口看门狗&#xff08;WWDG&#xff09;独立看门狗本质相关概念窗口看门狗…

购物H5商城架构运维之路

一、引言 公司属于旅游行业&#xff0c;需要将旅游&#xff0c;酒店&#xff0c;购物&#xff0c;聚合到线上商城。通过对会员数据进行聚合&#xff0c;形成大会员系统&#xff0c;从而提供统一的对客窗口。 二、业务场景 围绕更加有效地获取用户&#xff0c;提升用户的LTV&a…