家居网购项目(权限验证+事务管理)

news2024/12/23 5:45:40

文章目录

    • 1.过滤器权限认证
        • 1.程序框架图
        • 2.web.xml
        • 3.编写AdminAuthorization
        • 4.编写MemberAuthorization
        • 5.细节
        • 6.结果展示
          • 1.未登录可以任意浏览商品
          • 2.点击添加购物车提示登录
          • 3.点击后台管理,提示管理员登录
          • 4.也做了其余资源的访问验证
    • 2.事务管理
        • 1.思路分析
        • 2.重写JDBCUtilsByDruid
          • 1.getConnection()方法
          • 2.commit()方法
          • 3.rollback()方法
          • 4.删除BasicDao中的所有关闭数据库连接的语句
          • 5.编写过滤器TransactionFilter
          • 6.配置web.xml
          • 7.查看调用可能出现问题的方法是不是抛出了异常
        • 3.结果展示
          • 1.将OrderDaoImpl中的sql故意写错
          • 2.执行保存订单操作
          • 3.查看数据库信息(回滚了,没有生成记录)
    • 3.统一错误页面
        • 1.需求分析
        • 2.修改web.xml
        • 3.导入两个页面
        • 4.修改TransactionFilter,将异常抛给tomcat
        • 5.结果展示
    • 4.会员订单管理—分页查询
        • 需求分析
        • 1.编写dao层
          • 1.修改OrderDao
          • 2.修改OrderDaoImpl
          • 3.单元测试
        • 2.编写service层
          • 1.修改OrderService
          • 2.修改OrderServiceImpl
          • 3.单元测试
        • 3.编写web层
          • 1.修改OrderServlet
          • 2.修改order_manage.jsp
            • 1.显示信息
            • 2.分页导航条
        • 4.结果演示
          • 1.会员登录
          • 2.会员点击订单管理只会显示当前会员的历史订单
    • 5.管理员订单管理—分页查询
        • 需求分析
        • 1.编写dao层
          • 1.修改OrderDao
          • 2.修改OrderDaoImpl
        • 2.编写service层
          • 1.修改OrderService
          • 2.修改OrderServiceImpl
        • 3.编写web层
          • 1.修改OrderServlet
          • 2.修改order_manage.jsp
            • 1.显示信息
            • 2.分页导航条
        • 4.结果展示

1.过滤器权限认证

1.程序框架图

image-20240211092524610

2.web.xml
    <filter>
        <filter-name>AdminAuthorization</filter-name>
        <filter-class>com.sxs.furns.filter.AdminAuthorization</filter-class>
        <init-param>
            <!--设置排除的uri-->
            <param-name>excludeUrls</param-name>
            <param-value>/jiaju_mail/views/manage/manage_login.jsp</param-value>
        </init-param>
    </filter>

    <!--除了登录的管理员页面都要进行管理员验证-->
    <filter-mapping>
        <filter-name>AdminAuthorization</filter-name>
        <url-pattern>/views/manage/*</url-pattern>
    </filter-mapping>
    <!--家居管理-->
    <filter-mapping>
        <filter-name>AdminAuthorization</filter-name>
        <url-pattern>/manage/furnServlet/*</url-pattern>
    </filter-mapping>


    <filter>
        <filter-name>MemberAuthorization</filter-name>
        <filter-class>com.sxs.furns.filter.MemberAuthorization</filter-class>
    </filter>

    <!--登录成功的界面,需要普通权限验证-->
    <filter-mapping>
        <filter-name>MemberAuthorization</filter-name>
        <url-pattern>/views/member/login_ok.jsp</url-pattern>
    </filter-mapping>
    <!--所有的购物车界面,需要普通权限验证-->
    <filter-mapping>
        <filter-name>MemberAuthorization</filter-name>
        <url-pattern>/views/cart/*</url-pattern>
    </filter-mapping>
    <!--购物车和订单servlet,需要普通权限验证-->
    <filter-mapping>
        <filter-name>MemberAuthorization</filter-name>
        <url-pattern>/orderServlet/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>MemberAuthorization</filter-name>
        <url-pattern>/cartServlet/*</url-pattern>
    </filter-mapping>
3.编写AdminAuthorization
package com.sxs.furns.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class AdminAuthorization implements Filter {
    private List<String> excludeUrlsList = new ArrayList<>(); //排除的资源
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //读取配置文件中的信息
        String excludeUrls = filterConfig.getInitParameter("excludeUrls");
        //按照,分割,并添加到集合中
        String[] split = excludeUrls.split(",");
        for (String s : split) {
            excludeUrlsList.add(s);
        }
        //放到servletContext中
        ServletContext servletContext = filterConfig.getServletContext();
        servletContext.setAttribute("excludeUrls", excludeUrlsList);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //查看session中的admin是否为true
        HttpSession session = ((HttpServletRequest) servletRequest).getSession();
        Object admin = session.getAttribute("admin");
        //获取uri
        String requestURI = ((HttpServletRequest) servletRequest).getRequestURI();
        //获取排除的uri
        List<String> excludeUrls = (List<String>) servletRequest.getServletContext().getAttribute("excludeUrls");
        //遍历并匹配
        for (String excludeUrl : excludeUrls) {
            System.out.println(excludeUrl);
            //如果匹配直接放行
            if (excludeUrl.equals(requestURI)) {
                filterChain.doFilter(servletRequest, servletResponse);
                return;
            }
        }
        if (admin != null) {
            //放行
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            //重定向到管理员登录界面
            ((HttpServletResponse) servletResponse).sendRedirect("/jiaju_mail/views/manage/manage_login.jsp");
        }
    }

    @Override
    public void destroy() {

    }
}

4.编写MemberAuthorization
package com.sxs.furns.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 普通权限认证
 * @author 孙显圣
 * @version 1.0
 */
public class MemberAuthorization implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpSession session = ((HttpServletRequest) servletRequest).getSession();
        //进行普通权限认证
        Object username = session.getAttribute("username");
        Object admin = session.getAttribute("admin");
        if (username != null || admin != null) {
            System.out.println("普通权限验证成功!");
            //放行
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            //重定向到用户登录界面
            ((HttpServletResponse) servletResponse).sendRedirect("/jiaju_mail/views/member/login.jsp");
        }
    }

    @Override
    public void destroy() {

    }
}

5.细节

如果想要过滤一个文件夹下除了某个资源的其余资源,可以将排除的资源URI其放在init-param中,然后通过filter的init方法将其放到servletContext中,然后在doFilter中直接放行

6.结果展示
1.未登录可以任意浏览商品

image-20240211114953238

2.点击添加购物车提示登录

image-20240211115035714

image-20240211115041741

3.点击后台管理,提示管理员登录

image-20240211115128144

image-20240211115115218

4.也做了其余资源的访问验证

2.事务管理

1.思路分析

image-20240211142121222

image-20240211142140091

2.重写JDBCUtilsByDruid
1.getConnection()方法
    private static ThreadLocal<Connection> threadLocalConn = new ThreadLocal<>(); //用于存放本线程的连接

    //重写getConnection方法,使其每个线程获取的是同一个连接
    public static Connection getConnection() {
        try {
            Connection connection = threadLocalConn.get(); //从threadlocal中获取当前线程的连接
            //如果没有获取到,则放入一个连接
            if (connection == null) {
                connection = dataSource.getConnection();
                connection.setAutoCommit(false); //取消自动提交
                threadLocalConn.set(connection);
            }
            return connection;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
2.commit()方法
    //提交事务
    public static void commit() {
        //获取连接
        Connection connection = threadLocalConn.get();
        //如果连接有效则提交事务并关闭连接
        if (connection != null) {
            try {
                connection.commit();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            } finally {
                try {
                    connection.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        //清除threadlocal的连接
        threadLocalConn.remove();
    }
3.rollback()方法
    //回滚事务
    public static void rollback() {
        Connection connection = threadLocalConn.get();
        if (connection != null) {
            try {
                connection.rollback();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            } finally {
                try {
                    connection.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        threadLocalConn.remove();
    }
4.删除BasicDao中的所有关闭数据库连接的语句

原因:数据库连接的关闭,交给最后提交事务或者回滚事务的时候再执行

image-20240211152822089

5.编写过滤器TransactionFilter
package com.sxs.furns.filter;

import com.sxs.furns.utils.JDBCUtilsByDruid;

import javax.servlet.*;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class TransactionFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain){
        //首先放行
        try {
            filterChain.doFilter(servletRequest, servletResponse);
            JDBCUtilsByDruid.commit();
        } catch (Exception e) {
            //如果在这次线程中有异常发生,则回滚
            System.out.println("发现异常,事务回滚!");
            JDBCUtilsByDruid.rollback();
        }

    }

    @Override
    public void destroy() {

    }
}

6.配置web.xml
    <!--在权限验证之后再编写事务过滤器-->
    <filter>
        <filter-name>TransactionFilter</filter-name>
        <filter-class>com.sxs.furns.filter.TransactionFilter</filter-class>
    </filter>
    <!--对所有请求进行过滤-->
    <filter-mapping>
        <filter-name>TransactionFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
7.查看调用可能出现问题的方法是不是抛出了异常

所有的servlet都是basicservlet反射调用的,并且都抛出了异常,这个异常最后会经过过滤器,所以可以在过滤器中捕获到异常

image-20240211153711602

3.结果展示
1.将OrderDaoImpl中的sql故意写错

image-20240211154703922

2.执行保存订单操作

image-20240211165406002

image-20240211165420900

image-20240211165433434

3.查看数据库信息(回滚了,没有生成记录)

image-20240211165458599

image-20240211165508047

3.统一错误页面

1.需求分析

image-20240211170301996

2.修改web.xml
    <!--配置错误页面-->
    <error-page>
        <error-code>404</error-code>
        <location>/views/error/404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/views/error/500.jsp</location>
    </error-page>
3.导入两个页面

image-20240211171312340

4.修改TransactionFilter,将异常抛给tomcat

image-20240211171629237

5.结果展示

image-20240211171404475

image-20240211171743485

4.会员订单管理—分页查询

需求分析

可以返回已登录的会员的历史订单信息

1.编写dao层
1.修改OrderDao
    //3.获取当前页需要展示的数据
    public List<Order> getPageItems(int begin, int pageSize, String id);
    //4.获取一共的记录条数
    public Integer getTotalRow(String id);
2.修改OrderDaoImpl
    /**
     * 分页查询订单
     * @param begin
     * @param pageSize
     * @return
     */
    @Override
    public List<Order> getPageItems(int begin, int pageSize, String id) {

        String sql = "select id, create_time as createTime, price, status, member_id as memberId from `order` where id like ? limit ?, ?";
        return queryMulti(sql, Order.class, "%-" + id , begin, pageSize);
    }

    /**
     * 获取总记录条数
     * @return
     */
    @Override
    public Integer getTotalRow(String id) {
        String sql = "select count(*) from `order` where id like ?";
        return ((Number) queryScalar(sql,"%-" + id)).intValue();
    }
3.单元测试
    @Test
    public void getPageItems() {
        //查询id为1的会员的订单信息
        List<Order> pageItems = orderDao.getPageItems(0, 3, "1");
        for (Order pageItem : pageItems) {
            System.out.println(pageItem);
        }
    }

    @Test
    public void getTotalRow() {
        System.out.println("总的记录数为:" + orderDao.getTotalRow("1"));
    }

image-20240211193017269

image-20240211200733207

2.编写service层
1.修改OrderService
    //3.分页显示订单
    public Page<Order> getPageItems(int pageNo, int pageSize, String username);
2.修改OrderServiceImpl
    /**
     * 根据当前页号和分页的大小返回对应的page对象
     *
     * @param pageNo
     * @param pageSize
     * @return
     */
    @Override
    public Page<Order> getPageItems(int pageNo, int pageSize, String username) {
        //根据姓名获取用户id
        Member member = memberDao.queryMemberByUsername(username);
        //获取总记录数
        Integer totalRow = orderDao.getTotalRow(member.getId().toString());
        //计算总页数
        Integer pageTotalCount = totalRow / pageSize;
        if (totalRow % pageSize > 0) {
            pageTotalCount ++;
        }
        //计算begin
        int begin = (pageNo - 1) * pageSize;

        //获取当页的所有数据
        List<Order> pageItems = orderDao.getPageItems(begin, pageSize, member.getId().toString());
        //填充page
        Page<Order> orderPage = new Page<>();
        orderPage.setPageNo(pageNo);
        orderPage.setPageSize(pageSize);
        orderPage.setPageTotalCount(pageTotalCount);
        orderPage.setTotalRow(totalRow);
        orderPage.setItems(pageItems);
        return orderPage;
    }
3.单元测试
    OrderService orderService = new OrderServiceImpl();
    @Test
    public void getPageItems() {
        Page<Order> pageItems = orderService.getPageItems(1, 3, "admin");
        System.out.println(pageItems);
    }

image-20240211194809877

3.编写web层
1.修改OrderServlet
    //分页显示订单
    public void showPageItems(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取数据
        Integer pageNo = DataUtils.parseInt(req.getParameter("pageNo"), 1); //默认第一页
        Integer pageSize = DataUtils.parseInt(req.getParameter("pageSize"), 6); //默认六条记录
        String username = req.getParameter("username");
        //获取page对象
        Page<Order> page = orderService.getPageItems(pageNo, pageSize, username);
        //请求转发
        req.setAttribute("page", page);
        req.getRequestDispatcher("/views/order_manage/order_manage.jsp").forward(req, resp);
    }
2.修改order_manage.jsp
1.显示信息

image-20240211201128675

2.分页导航条

image-20240211201147642

4.结果演示
1.会员登录

image-20240211202317112

2.会员点击订单管理只会显示当前会员的历史订单

image-20240211202415806

5.管理员订单管理—分页查询

需求分析

管理员的订单管理,显示的是所有会员的订单

1.编写dao层
1.修改OrderDao
    //5.管理员获取总体的记录条数
    public Integer getTotalRow();
    //6.管理员获取当前页需要展示的数据
    public List<Order> getPageItems(int begin, int pageSize);
2.修改OrderDaoImpl
    @Override
    public Integer getTotalRow() {
        String sql = "select count(*) from `order`";
        return ((Number) queryScalar(sql)).intValue();
    }

    @Override
    public List<Order> getPageItems(int begin, int pageSize) {
        String sql = "select id, create_time as createTime, price, status, member_id as memberId from `order` limit ?, ?";
        return queryMulti(sql, Order.class, begin, pageSize);
    }
2.编写service层
1.修改OrderService
    //4.管理员分页显示订单
    public Page<Order> getPageItems(int pageNo, int pageSize);
2.修改OrderServiceImpl
    @Override
    public Page<Order> getPageItems(int pageNo, int pageSize) {

        //获取总记录数
        Integer totalRow = orderDao.getTotalRow();
        //计算总页数
        Integer pageTotalCount = totalRow / pageSize;
        if (totalRow % pageSize > 0) {
            pageTotalCount ++;
        }
        //计算begin
        int begin = (pageNo - 1) * pageSize;

        //获取当页的所有数据
        List<Order> pageItems = orderDao.getPageItems(begin, pageSize);
        //填充page
        Page<Order> orderPage = new Page<>();
        orderPage.setPageNo(pageNo);
        orderPage.setPageSize(pageSize);
        orderPage.setPageTotalCount(pageTotalCount);
        orderPage.setTotalRow(totalRow);
        orderPage.setItems(pageItems);
        return orderPage;
    }
3.编写web层
1.修改OrderServlet
    //管理员分页显示订单
    public void showAllPageItems(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取数据
        Integer pageNo = DataUtils.parseInt(req.getParameter("pageNo"), 1); //默认第一页
        Integer pageSize = DataUtils.parseInt(req.getParameter("pageSize"), 6); //默认六条记录
        //获取page对象
        Page<Order> page = orderService.getPageItems(pageNo, pageSize);
        //请求转发
        req.setAttribute("page", page);
        req.getRequestDispatcher("/views/manage/order_manage.jsp").forward(req, resp);
    }
2.修改order_manage.jsp
1.显示信息

image-20240211211148413

2.分页导航条

image-20240211211203728

4.结果展示

image-20240211211304583

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

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

相关文章

AI大模型日报#0415:贾佳亚团队新作王炸、马斯克首款多模态大模型、ChatGPT to B

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 融合ChatGPTDALLE3&#xff0c;贾佳亚团队新作开源&#xff1a;识图推理生图一站解决 摘要: 贾佳亚团队推出了多模态模型Mini-Gem…

Android11应用安装未知来源的权限改动

最近开发的App需要下载安装另一个App。这就涉及到了app的安装代码。关于App的安装代码&#xff0c;写了不少&#xff0c;所以这一块觉得不是问题&#xff1a; 判断版本&#xff0c;Android8.0判断是否有未知来源安装全选&#xff0c;没有则打开未知来源安装权限设置界面去开启…

pdf预览空白问题解决。第一次预览正常,再重新打开就空白的问题。是因为cmaps没有更新

文章目录 问题描述问题解决问题总结曾经参考过的文章&#xff08;也未能解决&#xff09; 问题描述 我用的是pdfjs作为PDF预览工具使用。 预览有电子签章的PDF后(如下图的水印、签章)&#xff0c;再重新预览没有电子签章的PDF&#xff0c;就会空白。 如上图&#xff0c;第一个…

【Linux】磁盘管理和文件系统

目录 一、硬盘 1.硬盘结构 2.结构类型 二、MBR与磁盘分区 1.MBR主引导记录 2.磁盘分区结构 三、文件系统类型 四、linux系统添加并使用新硬盘的步骤 1.添加新的硬盘 2.刷新识别 3.进行分区 4.格式化&#xff0c;创建文件系统 5.挂载使用 一、硬盘 1.硬盘结构…

什么是人力资源成本?人力资源成本有哪些?

人力资源成本是企业运营成本的重要组成部分&#xff0c;对企业的财务状况和经营效率有着直接影响&#xff0c;如今企业面临着持续的成本压力和效率挑战。人力资源成本不仅直接关联企业的运营效率&#xff0c;还影响着企业的长期战略发展。因此&#xff0c;如何优化人力资源成本…

二、变量和引用

目录 2.1 什么是变量 2.2变量的命名 2.3 变量的类型 2.3.1 根据数据类型分类 2.3.2 根据作用域分类 2.4 变量的定义 2.5 shell中的引用 在程序设计语言中&#xff0c;变量是一个非常重要的概念。也是初学者在进行Shell程序设计之前必须掌握的一个非常基础的概念。只有理…

D3-八数码

D3-八数码 题目描述解题思路代码如下 题目描述 解题思路 本题若直接在3*3网格中思考较为困难&#xff0c;可以转换为一维的字符串&#xff0c;在一维字符串中考虑较为简单&#xff0c;要注意本题中两个字符交换位置时只能是x和另外字符交换&#xff0c;本题另外一个难点在于如何…

借力社交裂变,Xinstall助你实现用户快速增长

在数字化时代&#xff0c;社交裂变已成为品牌获取新用户、扩大影响力的关键手段。然而&#xff0c;如何有效利用社交裂变&#xff0c;实现用户快速增长&#xff0c;却是许多品牌面临的挑战。今天&#xff0c;我们将为大家介绍一个强大的社交裂变引擎——Xinstall&#xff0c;它…

Cesium 无人机航线规划

鉴于大疆司空平台和大疆无人机app高度绑定&#xff0c;导致很多东西没办法定制化。 从去年的时候就打算仿大疆开发一套完整的平台&#xff0c;包括无人机app以及仿司空2的管理平台&#xff0c;集航线规划、任务派发、实时图像、无人机管理等功能的平台。 当前阶段主要实现了&…

包装类初识泛型

一.包装类 在Java中, 基本类型不继承于Object类. 所以为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型.(包装类型相当于引用类型) 1.基本类型对应的包装类 byte -- Byteshort -- Shortint -- Integerlong -- Longfloat -- Floatdouble -- Doublech…

20V/3A大电流线性稳压器替代MIC29302/MIC29300

概述(替代MIC29302/MIC29300) PCD3942 是一款低压差稳压器&#xff0c;专为快速瞬态响应而优化。该装置能够提供 3A 的输出电流&#xff0c;典型压降为 325mV。工作静态电流为 1mA&#xff0c;关机时降至 1μA 以下&#xff0c;同时压差模式下静态电流控制良好。除了快速瞬态响…

lua学习笔记20(lua中一些自带库的学习)

print("*****************************lua中一些自带库的学习*******************************") print("*************时间***************") --系统时间 print(os.time()) --自己传入参数得到时间 print(os.time({year2011,month4,day5})) --os.data(&qu…

《HF经理》:二认知误区

一、管理者掌握重要权力&#xff1a; 二、全力来自管理者的职位&#xff1a; 三、管理者必须控制自己的直接下属&#xff1a; 对策&#xff1a;展示自己的品质&#xff0c;能力和影响力 四、管理者必须建立良好的个人关系&#xff1a; 五、管理这必须确保一切运行正常&…

深度学习框架

深度学习框架 1 引言 在当今技术加速发展的时代&#xff0c;深度学习已经成为了人工智能领域内最为引人注目的子领域之一。其在图像识别、自然语言处理、自动驾驶等多个行业中的成功应用&#xff0c;已经证明了深度学习在解决复杂问题方面的巨大潜力。然而&#xff0c;深度学习…

31、链表-K个一组反转链表

思路&#xff1a; 首先知道如何反转链表&#xff0c;其次找出每组的开始节点和结束节点&#xff0c;然后对于不足与k个的链表保持原状。 代码如下&#xff1a; class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (headnull||k1){return head;}ListN…

一个小小逻辑符的错误使用,资损几万块?

分享是最有效的学习方式。 博客&#xff1a;https://blog.ktdaddy.com/ 故事 这是一个真实事件&#xff0c;三年前老猫负责公司的支付资产业务。为了响应上级号召&#xff0c;加强国央企之间的合作&#xff0c;公司新谈了一个支付对接的渠道&#xff08;当然这个支付渠道其实很…

IT精英的财富攻略:五大策略揭秘

IT精英的财富攻略&#xff1a;五大策略揭秘 &#x1f4b8; 数字化浪潮汹涌&#xff0c;IT技能成为职场的金钥匙&#x1f511;&#xff0c;更为智慧的IT人打开了赚钱的大门。如果你身怀网络维护与安全管理的绝技&#xff0c;那么这五大策略&#xff0c;正是你蓄势待发的赚钱法宝…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Push Button的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 按钮类控件Push Button的使用及说明 文章编号&#xff1…

09 - 镜像管理之:部署单点harbor

本次准备了3台机器&#xff1a;harbor-01、harbor-02、harbor-db&#xff0c;用于测试 单点模式、高可用模式 部署 harbor。 ip主机名规格操作系统说明192.168.217.136harbor-012c4gCentos7.9harbor 服务器&#xff0c;测试单点harbor192.168.217.135harbor-022c4gCentos7.9ha…

快速探索随机树-RRT

文章目录 简介原理算法运动规划的变体和改进简介 快速探索随机树(RRT)是一种算法,旨在通过随机构建空间填充树来有效搜索非凸高维空间。该树是从搜索空间随机抽取的样本中逐步构建的,并且本质上偏向于向问题的大型未搜索区域生长。RRT 由 Steven M. LaValle 和 James J. K…