普通视图

已接收 — 2024年9月6日 程志辉博客 - 一个伪文艺青年

重新开始做的100件事

序号待办完成
1手牵手压马路
2一起坐摩天轮
3一起去教堂
4一起养一条小狗
5一起看日出日落
6一起吃冰淇淋
7一起看烟火
8一起看电影
9一起做顿饭
10一起堆雪人
11送对方惊喜
12一起去捡贝壳
13一起喝醉
14一起种一种花
15吃完饭一起刷碗
16一起淋雨
17一起唱首歌
18一起看一次演唱会
19一起去天台看星星
20互相写信
21穿情侣装逛街
22一起喝咖啡
23一起爬山
24一起坐过山车
25一起滑冰
26一起放风筝
27一起进鬼屋
28一起买一张彩票
29比赛啃骨头
30教我一项你的特长
31整晚不睡觉打电话唠嗑
32一起去放生
33一起在河里放纸船
34一起放孔明灯
35一起去寺庙里祈福
36一起在树下埋下我们的约定
37一起陪“我们”过生日
39一起去一趟海南的“天涯海角”
39一起赏月
40一起去看樱花
41雨中漫步
42一起荡秋千
43念故事哄我入睡
44一起沿铁轨走
45在树上刻下我们的约定
46看你打一场篮球比赛
47一起露营一次
48为你做一次早餐
49为你做一个蛋糕
50为你系围脖
51一起吃好吃的吃到吐
52一起去看海
53唱歌给我听
54一起去你的小学,初中,高中
55一起去我的小学,初中,高中
56比赛吃西瓜,用勺吃的那种
57一起打雪仗
58一起去当义工一天
59看你打台球
60一起撮合成一对情侣
61背靠背听歌
62一起打扑克
63扶老人过马路
64看冰灯
65靠你肩膀睡觉
66比赛吹气球
67一起包一次饺子
68一起坐一辆从没做过的车,在不认识的地方下车到处逛
69一起去一次敬老院
70一起去看海豚
71把你打扮成女生一次
72和你玩捉迷藏
73以喝交杯酒的方式喝东西
74去拍一次婚纱照
75用沙子做堡垒
76背着我走一段路
77一起去划船
78帮你吹头发
79一起坐火车去一个当天就能回来的地方
80一起去吃自助餐,必须扶墙进去扶墙出来
81去所在城市的美丽景点玩
82用泥巴做两个小人,我们的形象
83为你刮胡子
84在冬天共用一副手套
85生病的时候要陪着我
86一起去捡落叶
87一起照相
88打气球游戏帮我赢东西
89一起去孤儿院一次
90比赛磕瓜子
91假装当陌生人一天
92为你织一件东西
93教我玩一个你会的游戏
94专心为我做一件事,哪怕很不起眼
95为我做一件你很不喜欢的事
96在公共场合下一起喝娃哈哈
97在你的父母面前保护我一次
98为我挡酒
99在朋友面前大方的介绍我
100白头偕老❤
已接收 — 2023年11月2日 程志辉博客 - 一个伪文艺青年

URL 安全的 Base64 编码/解码

19191-jrz2qkkadw.png

腾讯云COS数据万象,文字水印使用的是URL 安全的 Base64 编码

// base64解码
export const URLSafeBase64 = {
 encode: (str) => {
  // 将字符串转换为 UTF-8 编码的字节数组
  let utf8Bytes = new TextEncoder().encode(str);

  // 将字节数组转换为 Base64 编码的字符串
  let base64Str = btoa(String.fromCharCode(...utf8Bytes));

  // 按照 Base64 编码规则,它会被编码为 "SGVsbG8=". 注意末尾的 "=" 补位符。
  // 如果使用 URL 安全的 Base64 编码,它会被编码为 "SGVsbG8",没有补位符。在解码时,需要根据编码时使用的方式来添加或去掉补位符。
  // 替换不安全的字符并去掉补位符
  return base64Str.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
 },
 decode: (encodedStr) => {
  // 添加补位符并替换安全的字符
  encodedStr = encodedStr.replace(/-/g, "+").replace(/_/g, "/");
  // 在这里使用 while 循环的原因是为了确保添加的补位符数量正确。
  // 因为在某些情况下,需要添加多个 "=" 补位符,而使用 if 语句只能添加一个 "="。比如,如果编码后的字符串长度为 2,那么需要添加两个 "=" 补位符,才能使字符串长度变为 4。
  while (encodedStr.length % 4) {
   encodedStr += "=";
  }

  // 将 Base64 编码的字符串转换为字节数组
  let base64Bytes = Uint8Array.from(atob(encodedStr), (c) => c.charCodeAt(0));

  // 将字节数组转换为 UTF-8 编码的字符串
  return new TextDecoder().decode(base64Bytes);
 },
}

使用场景

使用腾讯云COS数据万象图片水印功能,自定义给图片加水印

>>> URLSafeBase64.encode("我可以自定义去设置文字水印")
<<< '5oiR5Y-v5Lul6Ieq5a6a5LmJ5Y676K6-572u5paH5a2X5rC05Y2w'

http://examples-1251000004.cos.ap-shanghai.myqcloud.com/sample.jpeg?watermark/2/text/5oiR5Y-v5Lul6Ieq5a6a5LmJ5Y676K6-572u5paH5a2X5rC05Y2w/font/dGFob21hLnR0Zg/fontsize/30/fill/IzAwMDAwMA/dissolve/70/shadow/0/gravity/center/dx/0/dy/0

56469-j1nz5csrke.png

JavaScript 解构赋值 | 微信小程序函数参数传对象解构

尚硅谷分享的解构内容

解构赋值语法是一种 JavaScript 表达式,通过解构赋值, 可以将属性/值从对象/数组中取出,赋值给其他变量。这种语法是 ECMAscript 6 规范引入了一种新语法,可以更轻松地从数组和对象中获取值。

  1. 提取数据

先来看看如何在 JavaScript 中解构对象,可以从这个商品对象的简单示例开始。

const product = {
    id: 1,
    title: "Nike Air Zoom Pegasus 38",
    product_image: "/resources/products/01.jpeg",
    shown: "White/Pure Platinum/Midnight Navy/Wolf Grey",
    price: 120,
};
const { id, price, title } = product;

这样,就可以通过以下方式访问相应的属性:

console.log(id); // 1
console.log(price); // 120
console.log(title); // Nike Air Zoom Pegasus 38

解构,能够让代码更加清晰简洁。如果需要解构一个更复杂的对象呢?即对象中的对象。

现在假设需要从商品列表数据中获取其中一个商品的属性,如下:

const products = [
    {
        id: 1,
        title: "Nike Air Zoom Pegasus 38",
        price: 120,
    },
    {
        id: 2,
        title: "Nike Air Zoom Alphafly NEXT%",
        price: 275,
    },
    {
        id: 3,
        title: "Nike Zoom Fly 4",
        price: 89.0,
    },
];

在这里,产品列表嵌套了几层,需要访问商品的信息,可以解构尽可能多的级别以获取商品对象的属性。

const [tmp, { id, title, price }] = products;
console.log(id); // 2
console.log(title); // Nike Air Zoom Alphafly NEXT%
console.log(price); // 275

上面的代码仅用于展示其用法,项目开发中不建议再数组中这样获取对象信息。

通常,数据列表不一定非要数组,从获取效率来说,map 对象的访问比数组效率要高。可以将上面的数据改为 map 对象,如下:

const products = {
    1: {
        title: "Nike Air Zoom Pegasus 38",
        price: 120,
    },
    2: {
        title: "Nike Air Zoom Alphafly NEXT%",
        price: 275,
    },
    3: {
        title: "Nike Zoom Fly 4",
        price: 89.0,
    },
};
const {
    2: { id, title, price },
} = products;
console.log(id); // 2
console.log(title); // Nike Air Zoom Alphafly NEXT%
console.log(price); // 275

在 JavaScript 中,数据可以是变量和方法,因此解构赋值也适合用在函数参数的定义,如下:

const printArticle = ({ title, remark }) => {
    console.log(title);
    console.log(remark);
};
printArticle({
    title: "JavaScript 解构赋值",
    remark: "解构赋值的实用场景介绍",
});

在使用 React 或 Vue 等框架时,有很多解构赋值的地方,如方法的引入等等。

  1. 别名取值

如果想创建与属性名称不同的变量,那么可以使用对象解构的别名功能。

const { identifier: aliasIdentifier } = expression;

identifier 是要访问的属性的名称,aliasIdentifier 是变量名称。具体用法如下:

const products = {
    1: {
        title: "Nike Air Zoom Pegasus 38",
        price: 120,
    },
    2: {
        title: "Nike Air Zoom Alphafly NEXT%",
        price: 275,
    },
    3: {
        title: "Nike Zoom Fly 4",
        price: 89.0,
    },
};
const {
    2: { price: productPrice },
} = products;

console.log(productPrice); // 275
  1. 动态属性

可以使用动态名称提取到变量属性(属性名称在运行时已知):

const { [propName]: identifier } = expression;

propName 表达式应计算为属性名称(通常是字符串),标识符应指示解构后创建的变量名称,用法如下:

const products = {
    1: {
        title: "Nike Air Zoom Pegasus 38",
        price: 120,
    },
    2: {
        title: "Nike Air Zoom Alphafly NEXT%",
        price: 275,
    },
    3: {
        title: "Nike Zoom Fly 4",
        price: 89.0,
    },
};
const productKey = "1";
const { [productKey]: product } = products;
console.log(product); // { title: 'Nike Air Zoom Pegasus 38', price: 120 }

上面代码中,可以通过更新 productKey 的值进而使得 product 的值也跟随变化。

  1. 对象解构中的 Rest

将 rest 语法添加到解构中,Rest 属性收集那些尚未被解构模式拾取的剩余可枚举属性键。

const { identifier, ...rest } = expression;

解构后,变量标识符包含属性值。 rest 变量是一个具有其余属性的普通对象。

const product = {
    title: "Nike Air Zoom Pegasus 38",
    price: 120,
    quantity: 5,
    category_id: 1,
    reviews: 9830,
    total: 45,
};
const { title, ...others } = product;
console.log(others); // { price: 120, quantity: 5, category_id: 1, reviews: 9830, total: 45 }

对于数组,可以通过 Rest 的实现首尾值的获取:

const numbers = [1, 2, 3];
const [head, ...tail] = numbers;
console.log(head); // 1
console.log(tail); // [ 2, 3 ]
  1. 默认值

正如前面介绍的那样可以在解构数组时为其分配默认值:

const RGBA = [255, 34];
const [R, G, B = 0, A = 1] = RGBA;
console.log(R); // 255
console.log(G); // 34
console.log(B); // 0
console.log(A); // 1

这样,可以将确保在 B、A 未定义的情况下有一个默认值。

总结 解构是一个非常实用的特性,前端培训它被添加到了 JavaScript 的 ES6 版本中了。通过解构,可以快速方便地从对象和数组中提取属性或数据到单独的变量中。它适用于嵌套对象,可以使用 ... 运算符为数组分配赋值。

作者:尚硅谷
链接:https://juejin.cn/post/7037314654065917983
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


微信小程序实参传对象解构

传统方式使用dataset

<button bind:tap="sayHello" data-content="My name is SayHello">button</button>

sayHello(e){
    let content = e.target.dataset.content;
    console.log(content)
}

微信小程序官方文档dataset用法

函数参数对象解构

<button bind:tap="sayHello" data-content="My name is SayHello">button</button>

sayHello({ currentTarget: { dataset: { content } } }){
    console.log(content)
}

还没看懂的话 就这样看

let myObj = {
    currentTarget: {
        dataset: {
            content: "My name is SayHello"
        }
    }
}
const { currentTarget: { dataset: { content } } } = myObj
console.log(content)

Vue中给data中的对象属性添加一个新的属性

问题

在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向数组对象中添加新的属性,如果直接更新此属性的值,是不会更新视图的。

根据官方文档定义:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。

实现

HTML部分

<div id="app">
    <ul>
        <li v-for="value in obj" :key="value">
            {{value}}
        </li>
    </ul>

    <button @click="addObjB">添加obj.b</button>
</div>

JS部分

data() {
    return {
        obj: {
            a: "obj.a"
        }
    }
},
methods: {
    addObjB() {
        // 默认情况下
        // this.obj.b = "obj.b"

        // 第一种解决方法
        // let obj = {
        //     a: "obj.a",
        //     b: "obj.b"
        // };
        // this.obj = obj

        // 第二种解决方法
        // this.$set(this.obj,"b","obj.b")
    }
}

默认情况下点击button会发现, obj.b 已经成功添加,但是视图并未刷新

原因在于在Vue实例创建时, obj.b 并未声明,因此就没有被Vue转换为响应式的属性,自然就不会触发视图的更新,这时就需要使用Vue的全局api—— $set()

$set() 方法相当于手动的去把 obj.b 处理成一个响应式的属性,此时视图也会跟着改变了

开发过程中我用的是第一种方法解决的,但是不好的地方就是比较麻烦,很多场景实现起来非常不友好。

用vue官方提供的$set就好了Vue.set( target, propertyName/index, value )

参考:
1.Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决?
2.Vue--给data数据中对象新增属性/响应式数据(使用Vue.$set()),并触发视图更新

Linux 服务器 Nginx 禁止空主机头配置

功能

禁止IP直接访问、防止域名恶意解析

简单点:不设置这个通过IP可以直接访问,同时当别人的域名解析到你的域名时可以通过他的域名看到你服务器配置了网站的内容

老早就知道这个问题,但是由于不是专业运维不大懂专业术语叫啥,最近公司碰到这个问题,能肯定是nginx配置问题,最后查阅后了解这个叫空主机头

实现

#关闭未绑定的域名-http
    server {
        listen 80 default_server;
        server_name _ ;
        return 301 https://www.qqzmly.com/;
    }

    #关闭未绑定的域名-https
    server {
        listen 443 default_server;
        server_name _ ;
        ssl on;
        ssl_certificate cert/1_www.qqzmly.com_bundle.crt;
        ssl_certificate_key cert/2_www.qqzmly.com.key;
        return 301 https://www.qqzmly.com/;
    }

实现过程中发现 443https这块配置 需要带上ssl上面代码演示的三条

Nginx下 return 和 rewrite在 301重定向上的区别

唯一区别:正则匹配的性能区别

rewrite ^/(.*)$ https://example.com/$1;
rewrite ^ https://example.com$request_uri? permanent;
return 301 https://example.com$request_uri;

第一种 rewrite 写法是抓取所有的 URI 再减去开头第一个 / (反斜线)。

第二种写法用了$request_uri 省去了减去开头第一个反斜线的过程,正则匹配上性能更优。但仍不如第三种写法,因为 rewrite 有很多写法和规则,执行到最后 nginx 才知道这是一个 301 永久重定向。

第三种则直接 return 301 + $request_uri,直接告诉 nginx 这是个 301重定向,直接抓取指定URI。

Nginx下 return 和 rewrite在 301重定向上的区别 301更优雅

引用: https://blog.csdn.net/lijun_work/article/details/108257956

Element UI 走马灯 根据屏幕宽高自适应(多图

展示效果

Element UI 走马灯 根据屏幕宽高自适应(多图

解决方法的原理:监听屏幕视口大小如果'resize',发生改变了,就获取图片的高度height,然后渲染到页面

ElementUI 地址: https://element.eleme.cn/#/zh-CN/component/carousel

16421344542457

方法解析

1.窗口第一次打开的时候加载执行 imgLoad()方法,第一次加载时获取图片在窗口中的高度,然后渲染到页面中去。

2.接着通过addEventListenner()方法监听视口是否发生改变,如果发生改变,重新调用imgLoad()方法渲染数据到页面,这样图片高度就可以随视口改变发生改变,适应各种大小屏幕。

20220114140523

完整代码


<!DOCTYPE html>
<html>
 
<head>
    <meta charset="UTF-8">
    <!-- 引入ElementUI  CDN -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <title>ElementUI 走马灯自适应</title>
</head>
<style type="text/css">
  
</style>
 
<body>
    <div id="app">
        <el-carousel :height="bannerHeight+'px'">
            <el-carousel-item v-for="item in banner" :key="item">
                <el-row :gutter="12">
                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" style="height:340px;margin-bottom: 20px;">
                            <img  ref="bannerHeight" :src="item" alt="" @load="imgLoad" style="width: 100%">
                    </el-col>
                </el-row>
            </el-carousel-item>
        </el-carousel>
 
        <div id="test-div" style="border: 5px solid red;background-color: antiquewhite;">当前宽度:{{bannerwidth}}<br/>当前高度:{{bannerHeight}}</div>
 
    </div>
 
</body>
<!-- 引入vue组件库 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js"></script>
<!-- 引入ElementUI组件库 -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script>
    //注册使用vue
    var Vue = window.Vue;
    var app = new Vue({
        el: '#app',
        data() {
            return {
                bannerHeight:"",
                bannerwidth:"",
                banner:[
                        "https://cdn1.qqzmly.com/usr/uploads/2022/01/2888890086.jpg",
                        "https://cdn1.qqzmly.com/usr/uploads/2022/01/1900941580.jpg",
                        "https://cdn1.qqzmly.com/usr/uploads/2022/01/1639849891.jpg"
                    ]
            }
        },
        mounted(){
            this.imgLoad();
            window.addEventListener('resize',() => {
                this.bannerHeight=this.$refs.bannerHeight[0].height;
                this.imgLoad();
            },false)
        },
        methods: {
            imgLoad(){
                this.$nextTick(()=>{
                    this.bannerHeight=this.$refs.bannerHeight[0].height;
                    console.log(this.$refs.bannerHeight[0].height);
                     // document.getElementsByClassName拿到的是数组并非某一个对象
                    var testH=document.getElementById("test-div");
                    testH.style.height= this.bannerHeight+"px";

                    this.bannerwidth = document.body.clientWidth
                })
            }
        }
 
    })
 
</script>
 
</html>

原文链接:https://blog.csdn.net/qq_40976321/article/details/104513316

❌