<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[csj41352的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/csj41352</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; csj41352]]></copyright><item><title><![CDATA[Content-Security-Policy (CSP) 配置指南：助力开发人员防御Web攻击]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/153197806</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/153197806</guid><author>csj41352</author><pubDate>Mon, 13 Oct 2025 15:34:52 +0800</pubDate><description><![CDATA[Content-Security-Policy（CSP，内容安全策略）是一种重要的Web安全机制，通过明确指定浏览器可加载资源的来源和类型，有效防御跨站脚本（XSS）、点击劫持、恶意插件加载等常见Web攻击。本指南提供一份可直接参考的CSP配置方案，包含详细注释和核心防御逻辑说明，帮助开发人员快速理解并应用CSP。]]></description><category></category></item><item><title><![CDATA[房贷echart图表化]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/129902401</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/129902401</guid><author>csj41352</author><pubDate>Sat, 01 Apr 2023 20:20:28 +0800</pubDate><description><![CDATA[房贷echart图表化。]]></description><category></category></item><item><title><![CDATA[vue开发笔记]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/107496080</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/107496080</guid><author>csj41352</author><pubDate>Tue, 21 Jul 2020 18:57:16 +0800</pubDate><description><![CDATA[在写style标签时注意事项

// 受外层css影响，但不影响内层css
&lt;style lang="less" scoped&gt;
&lt;/style&gt;


// 受外层css影响，同时影响内层css
&lt;style lang="less"&gt;
// csj-index是全局唯一的避免污染全局css
.csj-index{

    // 当前组件css
    .a{}

    .b{}

}
&lt;/style&gt;


...]]></description><category></category></item><item><title><![CDATA[轻松理解：异步与同步&&阻塞与非阻塞]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/106251683</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/106251683</guid><author>csj41352</author><pubDate>Thu, 21 May 2020 10:48:04 +0800</pubDate><description><![CDATA[异步与同步：针对一个语句，不管执行该语句多久，一定等待语句执行完再执行下一语句，叫做同步，否则叫做异步。

阻塞与非阻塞：针对多个顺序排列的语句，当前一个语句为同步执行时，该语句必须等待前一个语句执行完成才能执行，此时称为阻塞，否则为非阻塞。
...]]></description><category></category></item><item><title><![CDATA[搭建turn服务器]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/105756132</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/105756132</guid><author>csj41352</author><pubDate>Sat, 25 Apr 2020 20:55:25 +0800</pubDate><description><![CDATA[系统：CentOS 8.1 64位

步骤一：安装libevent最新版本

 libevent官网:https://libevent.org/


wget https://github.com/libevent/libevent/releases/download/release-2.1.11-stable/libevent-2.1.11-stable.tar.gz
tar zxvf lib...]]></description><category></category></item><item><title><![CDATA[egg-ts学习之路]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/105067971</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/105067971</guid><author>csj41352</author><pubDate>Tue, 24 Mar 2020 11:34:49 +0800</pubDate><description><![CDATA[自定义脚本命令：


  "scripts": {
    //打包完成后，复制到其他文件夹
    "publish": "vue-cli-service build &amp;&amp; xcopy .\\dist\\*.*  .\\..\\server\\app\\public\\ /s /e /y"
  }

复制命令参考：https://blog.youkuaiyun.com/mfkjq/artic...]]></description><category></category></item><item><title><![CDATA[egg-ts配置]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/105066746</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/105066746</guid><author>csj41352</author><pubDate>Tue, 24 Mar 2020 10:59:30 +0800</pubDate><description><![CDATA[plugin.ts配置


import { EggPlugin } from 'egg';

const plugin: EggPlugin = {
  // static: true,
  // nunjucks: {
  //   enable: true,
  //   package: 'egg-view-nunjucks',
  // },
  mongoose: {
    enab...]]></description><category></category></item><item><title><![CDATA[vscode之egg断点调试]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/104920106</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/104920106</guid><author>csj41352</author><pubDate>Tue, 17 Mar 2020 13:40:49 +0800</pubDate><description><![CDATA[上图：




{
    "name": "Launch Egg",
    "type": "node",
    "request": "launch",
    "cwd": "${workspaceRoot}",
    "runtimeExecutable": "npm",
    "windows": { "runtimeExecutable": "npm.cmd" },
    "...]]></description><category></category></item><item><title><![CDATA[Vue之使用函数式组件动态分配组件]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/104300753</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/104300753</guid><author>csj41352</author><pubDate>Thu, 12 Mar 2020 18:44:22 +0800</pubDate><description><![CDATA[创建c组件文件夹，




import c1 from './c1'
import c2 from './c2'

// 组件分配控制器
export default {
  // 表明当前组件为无状态函数式组件
  functional: true,
  // 动态构建组件
  render (createElement, context) {
    // context.data包含外层传...]]></description><category></category></item><item><title><![CDATA[VueX之state与getter的区别]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/104824158</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/104824158</guid><author>csj41352</author><pubDate>Thu, 12 Mar 2020 17:46:54 +0800</pubDate><description><![CDATA[state：VueX的数据中心，相当于vue中的data。

getter：返回对state数据的装饰，相当于vue中的computed。&lt;例：返回格式化后的时间、返回多个state数据的计算结果&gt;
...]]></description><category></category></item><item><title><![CDATA[VueX之actions与mutations的区别]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/104822949</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/104822949</guid><author>csj41352</author><pubDate>Thu, 12 Mar 2020 17:29:01 +0800</pubDate><description><![CDATA[actions

1、用于通过提交mutation改变数据

2、会默认将自身封装为一个Promise

3、可以包含任意的异步操作

mutations

1、通过提交commit改变数据

2、只是一个单纯的函数

3、不要使用异步操作，异步操作会导致变量不能追踪
...]]></description><category></category></item><item><title><![CDATA[git log与git reflog的区别]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/104807421</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/104807421</guid><author>csj41352</author><pubDate>Wed, 11 Mar 2020 22:15:21 +0800</pubDate><description><![CDATA[git reflog可以查看对仓库的任意操作包括历史修改，删除commit。注：只在个人本地存储，不与云端共享。

git log 只能查看历史提交commit                           注：云端共享。
...]]></description><category></category></item><item><title><![CDATA[git撤销commit]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/104798955</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/104798955</guid><author>csj41352</author><pubDate>Wed, 11 Mar 2020 16:30:42 +0800</pubDate><description><![CDATA[1. --soft

git reset --soft HEAD^

删除最后一次commit记录，将其代码恢复到暂存区

2. --mixed

git reset HEAD^ / git reset --mixed HEAD^

删除最后一次commit记录，将其代码恢复到工作区

3. --hard

git reset --hardHEAD^

删除最后一次commit记录，舍弃改动...]]></description><category></category></item><item><title><![CDATA[高级前端知识点]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/104283681</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/104283681</guid><author>csj41352</author><pubDate>Wed, 12 Feb 2020 21:57:52 +0800</pubDate><description><![CDATA[1.首屏加载优化

2.搜索引擎优化(SEO)

3.请求优化

4.Vue服务器端渲染 (SSR)

5.W3C标准
]]></description><category></category></item><item><title><![CDATA[js深度复制]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/102634990</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/102634990</guid><author>csj41352</author><pubDate>Wed, 12 Feb 2020 18:30:02 +0800</pubDate><description><![CDATA[//深度优先复制
function deepClone(obj){    //可深度复制所有原始类型、数组、Object对象、函数、Date、
  if(obj instanceof Object){
    let new_obj = null;
    switch(obj.constructor){
        case Array:
            new_obj = [];...]]></description><category></category></item><item><title><![CDATA[浏览器常用事件]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/102635209</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/102635209</guid><author>csj41352</author><pubDate>Wed, 12 Feb 2020 18:29:49 +0800</pubDate><description><![CDATA[Web浏览器常用事件
浏览器窗口事件
load
页面加载完成时触发
beforeunload
窗口关闭之前触发
unload
窗口关闭时触发
focus
窗口得到焦点时触发
blur
窗口失去焦点时触发
error
页面上有脚本报错时触发
resize
窗口大小改变时触发
contextmenu
弹出右键菜单时触发
鼠标事件
mousedown
当在元素上按下鼠标按钮时触发
mouseover
当...]]></description><category></category></item><item><title><![CDATA[git常用命令]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/102654090</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/102654090</guid><author>csj41352</author><pubDate>Wed, 12 Feb 2020 18:29:32 +0800</pubDate><description><![CDATA[1、列举工作中常用的几个git命令？

新增文件的命令：git add file或者git add .
提交文件的命令：git commit –m或者git commit –a
查看工作区状况：git status –s
拉取合并远程分支的操作：git fetch/git merge或者git pull
查看提交记录命令：git reflog

2、 提交时发生冲突，你能解释冲突是如何产生的吗？你...]]></description><category></category></item><item><title><![CDATA[git命令总结]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/104281520</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/104281520</guid><author>csj41352</author><pubDate>Wed, 12 Feb 2020 18:29:07 +0800</pubDate><description><![CDATA[基本命令图解：





1.克隆远程仓库代码

git clonehttps://gitee.com/tianyac/test.git



2.分支

2.1创建分支

git branch csj

2.2切换分支

git checkout csj

2.3新建并切换到新分支

git checkout -b csj



3.提交代码

git add . //提交
...]]></description><category></category></item><item><title><![CDATA[js中6个声明变量的关键字对比]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/103630293</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/103630293</guid><author>csj41352</author><pubDate>Fri, 20 Dec 2019 11:55:59 +0800</pubDate><description><![CDATA[js中6个声明变量的关键字对比
		
			
			
			
			
			
			
		
			var
			function
			let
			const
			class
			import
		全局变量是顶层对象的属性
			√
			√
			×
			×
			×
			×
		声明变量语句前是否可用(√变量提升/×暂时性死死区)
			√
			√
			...]]></description><category></category></item><item><title><![CDATA[js快速排序]]></title><link>https://blog.youkuaiyun.com/csj41352/article/details/102655759</link><guid>https://blog.youkuaiyun.com/csj41352/article/details/102655759</guid><author>csj41352</author><pubDate>Sun, 20 Oct 2019 23:41:51 +0800</pubDate><description><![CDATA[function quickSot(arr,left,right) {
  if(left&gt;=right) return;
  let l = left,r=right,flag=left;
  while(l&lt;r){
    let tmp = arr[flag];
    while (l&lt;r&amp;&amp;arr[r]&gt;=arr[flag])r--;
    a...]]></description><category></category></item></channel></rss>