博客文章效果

news2024/11/18 20:27:23

在这里插入图片描述
学习风`宇blog

  • md文档转html(markdown-it的使用)
  • 语法高亮、行号、一键复制
  • toc生成目录
  • sticky粘性定位
<style lang="scss">
@import url(//at.alicdn.com/t/c/font_4004562_9v94jccafmc.css);
@import url('https://fonts.font.im/css?family=Roboto');

* {
    font-family: 'Roboto';
}

a {
    text-decoration: none;
}

ul,
ol,
li {
    margin: 0;
    padding: 0;
    list-style: none;
}

h1,
h2,
h3,
h4,
h5,
h6 {
    margin: 0;
    margin-bottom: 10px;
}

/* 行号样式 */
.line-numbers-rows {
    position: absolute;
    pointer-events: none;
    top: 18px;
    font-size: 100%;
    left: 0.5em;
    width: 2.1em;
    letter-spacing: -1px;
    border-right: 1px solid #0e0f12;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
    background-color: #282c34;
}

pre {
    position: relative;
    padding-left: 2.6em;
    line-height: 1.3em;
}

.line-numbers-rows>span {
    display: block;
    counter-increment: linenumber;
}

pre {
    background-color: #282c34;
    border-radius: 8px;
}

pre code {
    border-radius: 8px;
}

.line-numbers-rows>span:before {
    content: counter(linenumber);
    color: #999;
    display: block;
    padding-right: 0.8em;
    text-align: right;
}

.language-name {
    position: absolute;
    top: 9px;
    color: #999999;
    right: 43px;
    font-size: 0.8em;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
}

.copy-btn {
    position: absolute;
    right: 8px;
    top: 8px;
    background-color: #525252;
    border: none;
    padding: 3px 6px;
    border-radius: 3px;
    color: #cccccc;
    cursor: pointer;
    display: none;
}

pre:hover .copy-btn {
    display: block;
}

.copy-textarea {
    position: absolute;
    left: -9999px;
    top: -9999px;
}

/* 封面图下移效果 */
@keyframes slidedown {
    0% {
        opacity: 0.3;
        transform: translateY(-60px);
    }

    100% {
        opacity: 1;
        transform: translateY(0px);
    }
}

.slidedown {
    animation: slidedown 1s;
}

/* 内容上移效果 */
@keyframes slideup {
    0% {
        opacity: 0.3;
        transform: translateY(60px);
    }

    100% {
        opacity: 1;
        transform: translateY(0px);
    }
}

.slideup {
    animation: slideup 1s;
}

/* 从小变大效果 */
@keyframes scaleup {
    0% {
        transform: scale(0.3);
    }

    100% {
        transform: scale(1);
    }
}

.scaleup {
    animation: scaleup 1s;
}

body {
    overflow-x: hidden;
    overflow-y: scroll;
    /* 背景渐变 */
    background: linear-gradient(90deg, rgba(247, 149, 51, .1), rgba(243, 112, 85, .1) 15%, rgba(239, 78, 123, .1) 30%, rgba(161, 102, 171, .1) 44%, rgba(80, 115, 184, .1) 58%, rgba(16, 152, 173, .1) 72%, rgba(7, 179, 155, .1) 86%, rgba(109, 186, 130, .1));
}

.verticle-line {
    margin: 10px;
}

* {
    box-sizing: border-box;
}

.toc-link {
    text-overflow: ellipsis;
            white-space: nowrap; /* white-space属性为nowrap时,不会因为超出容器宽度而发生换行 */
            overflow: hidden;
}

.banner {
    height: 400px;
    background-image: url(@/assets/bg3.jpg);
    background-size: cover;
    background-position: center;
    position: relative;
    color: #eee;

    .banner-content {
        position: absolute;
        bottom: 25%;
        width: 100%;
        text-align: center;
        text-shadow: 0.05rem 0.05rem 0.1rem rgb(0 0 0 / 30%);

        .post-title {
            font-size: 30px;
            margin-bottom: 20px;
        }

        .post-intro1,
        .post-intro2 {
            font-size: 14px;
            line-height: 1.5;

            i {
                margin-right: 5px;
            }
        }
    }
}

.post-wrapper {
    display: flex;
    // border: 1px solid red;
    max-width: 1200px;
    margin: 40px auto;

    .post-content-wrapper {
        // border: 1px solid red;
        width: 75%;
        padding: 10px;

        .post-content {
            padding: 40px;
            background-color: #fff;
            border-radius: 10px;
            box-shadow: 0 4px 8px 6px rgba(7, 17, 27, .06);

        }
    }

    .post-sider-wrapper {
        // border: 1px solid red;
        padding: 7.5px;
        width: 25%;
        padding: 12px;



        .post-sider {
            border-radius: 10px;
            position: sticky;
            top: 20px;

            .toc-wrapper {
                
                flex-basis: 25%;
                box-shadow: 0 4px 8px 6px rgba(7, 17, 27, .06);
                padding: 20px;
                border-radius: 10px;
                margin-bottom: 15px;
                background-color: #fff;

                // border: 1px solid red;


                .toc-header {
                    display: flex;
                    align-items: center;
                    margin-bottom: 5px;
                }

                #toc-content {
                    position: sticky;
                    top: 20px;
                    box-sizing: border-box;
                    // border: 1px solid red;

                    a {
                        transition: all 0.3s;
                        text-decoration: none;
                        display: block;
                        line-height: 1.6em;
                        padding-left: 10px;
                        border-left: 4px solid transparent;
                        color: #666261;

                        &::before {
                            display: none;
                        }

                        &.is-active-link {
                            font-weight: normal;
                            color: #fff;
                            background-color: #00c4b6;
                            border-left-color: #009d92;
                        }
                    }
                }
            }

            .latest-article {
                background-color: #fff;
                // border: 1px solid red;
                border-radius: 10px;
                padding: 20px;

                .latest-article-header {
                    margin-right: 5px;
                    margin-bottom: 8px;
                    color: #555555;

                    i {
                        font-weight: bold;
                        margin-right: 8px;
                    }
                }

                .latest-article-item {
                    display: flex;
                    margin-bottom: 10px;

                    .latest-post-cover {
                        width: 60px;
                        height: 60px;
                        flex-shrink: 0;
                        border-radius: 5px;
                        overflow: hidden;

                        img {
                            height: 100%;
                            width: 100%;
                            object-fit: cover;
                            transition: all 0.3s;

                            &:hover {
                                transform: scale(1.2);
                            }
                        }
                    }

                    .latest-post-info {
                        margin-left: 10px;
                        overflow: hidden;
                        flex: 1;
                        padding-top: 3px;
                        display: flex;
                        flex-direction: column;
                        justify-content: space-between;
                        line-height: 1.2;

                        .latest-post-title {
                            color: #53504f;
                            display: -webkit-box;
                            word-break: break-all;
                            -webkit-box-orient: vertical;
                            -webkit-line-clamp: 2;
                            overflow: hidden;
                            font-size: 16px;

                            &:hover {
                                color: #00c4b6;
                            }
                        }

                        .latest-post-desc {
                            color: #989898;
                            font-size: 13px;
                        }
                    }
                }
            }

        }


    }
}
</style>

<template>
    <div>
        <navbar />
        <div class="banner slidedown">
            <div class="banner-content">
                <div class="post-title">
                    Spring Security框架方法注解源码
                </div>
                <div class="post-intro1">
                    <i class="iconfont icon-rili"></i>
                    <span>发表于 2023-03-07</span>
                    <span class="verticle-line">|</span>
                    <i class="iconfont icon-gengxinshijian"></i>
                    <span>更新于 2023-03-07</span>
                    <span class="verticle-line">|</span>
                    <i class="iconfont icon-fenlei"></i>
                    <span>Java</span>
                </div>
                <div class="post-intro2">
                    <i class="iconfont icon-wenben"></i>
                    <span>字数统计: 2.4k</span>
                    <span class="verticle-line">|</span>
                    <i class="iconfont icon-shichang"></i>
                    <span>阅读时长: 6分钟</span>
                    <span class="verticle-line">|</span>
                    <i class="iconfont icon-liulan-2"></i>
                    <span>阅读量: 79</span>
                    <span class="verticle-line">|</span>
                    <i class="iconfont icon-wodepinglun"></i>
                    <span>评论数: 1</span>
                </div>
            </div>
        </div>
        <div class="post-wrapper slideup">
            <div class="post-content-wrapper">
                <div class="post-content">
                    <div v-html="htmlContent" id="article-content"></div>
                </div>
            </div>
            <div class="post-sider-wrapper">
                <div class="post-sider">
                    <div class="toc-wrapper scaleup">
                        <div class="toc-header">
                            <img src="@/assets/svg/menu.svg" style="margin-right: 8px;" width="16px" height="16px" alt="">
                            <span>目录</span>
                        </div>
                        <div id="toc-content"></div>
                    </div>

                    <div class="latest-article scaleup">
                        <div class="latest-article-header">
                            <i class="iconfont icon-gengxinshijian"></i>
                            <span>最新文章</span>
                        </div>
                        <a href="#" class="latest-article-item">
                            <div class="latest-post-cover">
                                <img src="@/assets/post4.jpg" alt="">
                            </div>
                            <div class="latest-post-info">
                                <div class="latest-post-title">
                                    mybatismybatismybatismybatismybatismybatismybatis复杂结果映射mybatis复杂结果映射mybatis复杂结果映射
                                </div>
                                <div class="latest-post-desc">
                                    2023-03-07
                                </div>
                            </div>
                        </a>
                        <a href="#" class="latest-article-item">
                            <div class="latest-post-cover">
                                <img src="@/assets/post2.jpg" alt="">
                            </div>
                            <div class="latest-post-info">
                                <div class="latest-post-title">
                                    mybatis
                                </div>
                                <div class="latest-post-desc">
                                    2023-03-07
                                </div>
                            </div>
                        </a>
                        <a href="#" class="latest-article-item">
                            <div class="latest-post-cover">
                                <img src="@/assets/post3.jpg" alt="">
                            </div>
                            <div class="latest-post-info">
                                <div class="latest-post-title">
                                    mybatimybatis复杂结果映射mybatis复杂结果映射mybatis复杂结果映射
                                </div>
                                <div class="latest-post-desc">
                                    2023-03-07
                                </div>
                            </div>
                        </a>
                    </div>
                </div>
            </div>
        </div>
        <div style="height: 500px;"></div>
    </div>
</template>

<script>
import Navbar from './Navbar.vue';
import { getArticle } from '@/api/articleApi'

import ClipboardJS from 'clipboard'
console.log(ClipboardJS);

import MarkdownIt from 'markdown-it'
const MarkdownIt2 = require('markdown-it')

import hljs from 'highlight.js'
import 'highlight.js/styles/atom-one-dark.css'
import tocbot from 'tocbot'
console.log('tocbot', tocbot);

let md1 = new MarkdownIt()
let md2 = new MarkdownIt2()
console.log(md1);
console.log(md2);

console.log(md1.render('# markdown-it rulezz!'));/* h1>markdown-it rulezz!</h1> */
console.log(md2.render('# markdown-it rulezz!'));/* h1>markdown-it rulezz!</h1> */


const md = new MarkdownIt({
    html: true,
    linkify: true,
    typographer: true,
    breaks: true,
    highlight: function (str, lang) {
        /* 
            str-> @Configuration
            @EnableWebMvc
            @EnableGlobalMethodSecurity(prePostEnabled = true) // 因为要控制controller中的方法访问,所以此注解要加到子容器中
            @ComponentScan(basePackages = "com.zzhua.controller",
                            excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,
                            classes = Service.class)})
            public class MyWebConfig implements WebMvcConfigurer {

                @Override
                public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
                    // 开启静态资源访问
                    configurer.enable();
                }

            }
            lang-> java {name: 'Java', aliases: Array(1), keywords: {…}, illegal: /<\/|#/, contains: Array(23), …}
    
        */
        console.log('str->', str, 'lang->', lang, hljs.getLanguage('java'));
        /* 
            <span class="hljs-meta">@Configuration</span>
            <span class="hljs-meta">@EnableWebMvc</span>
            <span class="hljs-meta">@EnableGlobalMethodSecurity(prePostEnabled = true)</span> <span class="hljs-comment">// 因为要控制controller中的方法访问,所以此注解要加到子容器中</span>
            <span class="hljs-meta">@ComponentScan(basePackages = &quot;com.zzhua.controller&quot;,
                            excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,
                            classes = Service.class)})</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">MyWebConfig</span> <span class="hljs-keyword">implements</span> <span class="hljs-title class_">WebMvcConfigurer</span> {

                <span class="hljs-meta">@Override</span>
                <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">configureDefaultServletHandling</span><span class="hljs-params">(DefaultServletHandlerConfigurer configurer)</span> {
                    <span class="hljs-comment">// 开启静态资源访问</span>
                    configurer.enable();
                }

            }
        */
        console.log(hljs.highlight(str, { language: lang }).value);

        if (lang && hljs.getLanguage(lang)) {
            try {
                let highlightedHtml = hljs.highlight(str, { language: lang }).value

                // 生成行号
                let lineNum = highlightedHtml.split('\n').length - 1
                let lineNumbersRowsStart = `<span aria-hidden="true" class="line-numbers-rows">`
                let lineNumbersRowsEnd = `</span>`
                for (let i = 0; i < lineNum; i++) {
                    lineNumbersRowsStart += `<span></span>`
                }
                const lineNumbersRows = lineNumbersRowsStart + lineNumbersRowsEnd

                let languageName = `<b class="language-name">${lang}</b>`

                // 当前时间加随机数生成唯一的id标识
                var d = new Date().getTime();
                if (window.performance && typeof window.performance.now === "function") {
                    d += performance.now();
                }
                const codeIndex = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
                    /[xy]/g,
                    function (c) {
                        var r = (d + Math.random() * 16) % 16 | 0;
                        d = Math.floor(d / 16);
                        return (c == "x" ? r : (r & 0x3) | 0x8).toString(16);
                    }
                );
                // 复制功能需要一个textarea(这个id需要前面加个字母啥的,不能以数字开头)
                let textAreaHtml = `<textarea class="copy-textarea" id="copy${codeIndex}">${str}</textarea>`

                let copyButton = `<button class="copy-btn iconfont icon-fuzhi"  data-clipboard-action="copy" data-clipboard-target="#copy${codeIndex}" type="button"></button>`

                /* 如果返回的不含pre code标签,它会自己加上;如果返回的含有pre code标签,它就不加了 */
                return `<pre><code class="language-${lang} hljs">${highlightedHtml}</code>${lineNumbersRows}${languageName}${copyButton}${textAreaHtml}</pre>`;
            } catch (__) { }
        }
        return ""
    }
}).use(require("markdown-it-sub"))
    .use(require("markdown-it-sup"))
    .use(require("markdown-it-mark"))
    .use(require("markdown-it-abbr"))
    .use(require("markdown-it-container"))
    .use(require("markdown-it-deflist"))
    .use(require("markdown-it-emoji"))
    .use(require("markdown-it-footnote"))
    .use(require("markdown-it-ins"))
    .use(require("markdown-it-katex-external"))
    .use(require("markdown-it-task-lists"));

console.log('未用markdown-it-sub时: ', md1.render('H~2~0')); /* 未用markdown-it-sub时: <p>H~2~0</p> */
const md3 = new MarkdownIt()
    .use(require('markdown-it-sub'))
console.log('使用markdown-it-sub时: ', md3.render('H~2~0')); /* 使用markdown-it-sub时: <p>H<sub>2</sub>0</p> */

console.log(md3.render('Hello from mars :satellite:'));
md3.use(require('markdown-it-emoji')) /* <p>Hello from mars :satellite:</p> */
console.log(md3.render('Hello from mars :satellite:'));/* <p>Hello from mars 📡</p> */

export default {
    name: 'Post',
    components: {
        Navbar
    },
    data() {
        return {
            mdContent: '',
            htmlContent: '',
        }
    },
    mounted() {
        getArticle(29).then(data => {
            this.mdContent = data.mdContent
        })
    },
    watch: {
        mdContent(newVal, oldVal) {
            let _this = this
            this.htmlContent = md.render(newVal)
            this.$nextTick(() => {
                var clipboard = new ClipboardJS('.copy-btn');


                clipboard.on('success', function (e) {
                    console.info('Action:', e.action);
                    console.info('Text:', e.text);
                    console.info('Trigger:', e.trigger);

                    _this.$toast('success', '复制成功了哦');
                    e.clearSelection();
                });

                clipboard.on('error', function (e) {
                    console.error('Action:', e.action);
                    console.error('Trigger:', e.trigger);
                });

                // console.log('$nextTick...');
                let articleContent = document.querySelector('#article-content')
                let headingTag = ['h1', 'h2', 'h3']
                let children = Array.from(articleContent.children)
                for (let i = 0; i < children.length; i++) {
                    const e = children[i];
                    e.id = `h-${i}`
                }

                hljs.highlightAll()

                tocbot.init({
                    // Where to render the table of contents.
                    tocSelector: '#toc-content',
                    // Where to grab the headings to build the table of contents.
                    contentSelector: '#article-content',
                    // Which headings to grab inside of the contentSelector element.
                    headingSelector: 'h1, h2, h3, h4, h5, h6',
                    // For headings inside relative or absolute positioned containers within content.
                    hasInnerContainers: true,
                });
            })
        }
    }
}
</script>

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

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

相关文章

DFIG控制8: 不平衡电网下的网侧变换器控制

DFIG控制8&#xff1a; 不平衡电网下的网侧变换器控制。主要是添加网侧变换器的负序分量控制器。 本文基于教程的第8部分&#xff1a;DFIM Tutorial 8 - Asymmetrical Voltage Dips Analysis in DFIG based WT: Grid Side Converter Control 控制策略简介 来自&#xff1a;G…

过滤器(Filter)与拦截器(Interceptor)区别

1 过滤器&#xff08;Filter&#xff09; Servlet 中的过滤器 Filter 实现了 javax.servlet.Filter 接口的服务器端程序&#xff0c;主要用途是设置字符集&#xff08;CharacterEncodingFilter&#xff09;、控制权限、控制转向、用户是否已经登陆、有没有权限访问该页面等。 …

springboot配置跨域问题

近期自己搭建项目时&#xff0c;遇到一个跨域问题。我们以前项目解决跨域是在controller上加一个跨域注解CrossOrigin(allowCredentials "true")&#xff0c;很方便。但是在我自己搭建的项目中&#xff0c;启动时竟然报错了&#xff0c;错误如下&#xff1a; When …

图的传递闭包

给定一个有向图,对于给定图中的所有顶点对(i, j),找出一个顶点j是否可从另一个顶点i到达。这里的可达性是指从顶点i到j有一条路径。可达性矩阵称为图的传递闭包。 例如,考虑下面的图表 上述图的传递闭包为 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 该图以邻接矩阵的形式给出,…

抛弃 TCP 和 QUIC 的 HTTP

下班路上发了一则朋友圈&#xff1a; 周四听了斯坦福老教授 John Ousterhout 关于 Homa 的分享&#xff0c;基本重复了此前那篇 It’s Time To Rep… 的格调&#xff0c;花了一多半时间喷 TCP… Ousterhout 关于 Homa 和 TCP 之间的论争和论证&#xff0c;诸多反复回执&…

DAY15|102.二叉树的层序遍历。。。。等层序遍历的十道题

102.二叉树的层序遍历 代码随想录中的这题java和c不太一样 class Solution {public List<List<Integer>> resList new ArrayList<List<Integer>>();public List<List<Integer>> levelOrder(TreeNode root) {checkFun01(root,0);return …

NVIDIA- cuSPARSE(四)

cuSPARSE logging 日志记录机制&#xff0c; 可以通过在启动目标应用程序之前设置一下环境变量来启动cuSPARSE日志记录机制&#xff1a; CUSPARSE_LOG_LEVEL<level> level的取值&#xff1a; 0 Off 日志记录关闭1 Error只有报错会被记录2Trace启动CUDA内核的API调用将记…

网络应用程序设计(idea版)——实验四:会话管理

目录 实验预习报告 一、实验目的 二、实验原理 三、实验预习内容 实验报告 一、实验目的 二、实验要求 三、实验内容与步骤 实验预习报告 一、实验目的 1. 了解Web服务器对客户会话跟踪的各种方法&#xff1b; 2. 重点掌握使用HttpSession对象跟踪会话的方法&#…

OCAF——数据结构机制 Sample2

Email:dev_as@163.com Another example is the application for designing table lamps. The first label is allocated to the lamp unit. The tree definition of Lamp The root label cannot have brother labels. :[Root : (0)],根节点没有兄弟节点 Consequently, var…

ch5_4程序查询方式_程序中断方式_DMA方式

程序查询方式的流程 程序查询方式的接口电路 1. 程序查询方式 程序查询方式&#xff0c;需要通过cpu中的寄存器&#xff0c;完成数据从io设备到内存之间的传输。 1.1 程序查询方式流程 保存寄存器的内容&#xff1a; 如果寄存器中的数据是有用的&#xff0c;需要对寄存器中…

剑指offer:关于二叉树的汇总(c++)

1、重建二叉树&#xff1a; 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建二叉树并返回。 2、树的…

可以顺畅使用不输Chatgpt的AI

一前言 虽然chatgpt不错&#xff0c;但是如果在咱们国家&#xff0c;想使用起来还是有一定的门槛的&#xff0c;又要科学上网&#xff0c;又要申请账号&#xff0c;申请账号还要申请虚拟手机号接收验证码&#xff0c;难道就没有适合普通人使用的AI了吗&#xff0c;直到我发现了…

数字化时代,企业如何做好数字营销

在数字化的影响下&#xff0c;市场竞争愈发激烈&#xff0c;产品和服务的研发生产也加快了节奏&#xff0c;各行业之间的边界也日渐模糊&#xff0c;跨领域、跨赛道也成为数字化转型企业的常态&#xff0c;就像那句话&#xff0c;打败你的不一定是对手&#xff0c;这就是数字化…

AI 时代,提示词便是生产力

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

AIGC技术周报|图灵测试不是AGI的智力标准;SegGPT:在上下文中分割一切;ChatGPT能玩好文字游戏吗?

AIGC通过借鉴现有的、人类创造的内容来快速完成内容创作。ChatGPT、Bard等AI聊天机器人以及DallE 2、Stable Diffusion等文生图模型都属于AIGC的典型案例。「AIGC技术周报」将为你带来最新的paper、博客等前瞻性研究。 牙科的未来&#xff1a;从多模态大型语言模型窥探 ChatGP…

Java基础教程之Object类是怎么回事?

前言 在前面的文章中&#xff0c;壹哥跟大家说过&#xff0c;Java是面向对象的编程语言&#xff0c;而在面向对象中&#xff0c;所有的Java类都有一个共同的祖先类&#xff0c;这就是Object。那么Object都有哪些特性呢&#xff1f;今天壹哥就简单跟大家分析一下。 -----------…

刷题记录|Day55● 392.判断子序列 ● 115.不同的子序列

● 392.判断子序列 题目描述 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"…

pure-admin九州权限系统地址简单读

分成页面权限(ex:权限管理page) & 标签节点权限(ex:下载按钮) 【九州地址娜娜手机&#x1d54d;找看看kwk3589提供】以下是范例&#xff1a; /*** admin &#xff1a; 管理员角色* common &#xff1a; 普通角色*/const permissionRouter {path: "/permission"…

C++之入门之缺省参数函数重载引用

文章目录前言一、缺省参数1.缺省参数的概念2.缺省函数的分类&#xff08;1&#xff09;全缺省参数&#xff08;2&#xff09;半缺省参数3.使用注意二、函数重载1.函数重载的概念3.函数重载的原理--名字修饰(name Mangling)三、引用1.引用的概念2.引用特性3.引用的使用前言 重新…

工地人员工装穿戴识别系统 opencv

工地人员工装穿戴识别系统通过pythonopencv网络模型AI视频智能分析技术&#xff0c;工地人员工装穿戴识别算法模型可对施工现场人员是否佩戴合规穿戴进行自动识别预警。OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个跨平台的计算机视觉处理开源软件库&…